diff --git a/d2parser/parse.go b/d2parser/parse.go index 5d385f210..3eb500484 100644 --- a/d2parser/parse.go +++ b/d2parser/parse.go @@ -1480,12 +1480,6 @@ func (p *parser) parseBlockString() *d2ast.BlockString { } if r != endHint { - if (bs.Tag == "latex" || bs.Tag == "tex") && r == '\\' { - // For LaTeX, where single backslash is common, we escape it so that users don't have to write double the backslashes - sb.WriteRune('\\') - sb.WriteRune('\\') - continue - } sb.WriteRune(r) continue } diff --git a/d2renderers/d2latex/latex.go b/d2renderers/d2latex/latex.go index 2431a2f0c..640c712b8 100644 --- a/d2renderers/d2latex/latex.go +++ b/d2renderers/d2latex/latex.go @@ -6,6 +6,7 @@ import ( "math" "regexp" "strconv" + "strings" "oss.terrastruct.com/d2/lib/jsrunner" "oss.terrastruct.com/util-go/xdefer" @@ -28,6 +29,7 @@ var svgRe = regexp.MustCompile(`]+width="([0-9\.]+)ex" height="([0-9\.]+) func Render(s string) (_ string, err error) { defer xdefer.Errorf(&err, "latex failed to parse") + s = doubleBackslashes(s) runner := jsrunner.NewJSRunner() if _, err := runner.RunString(polyfillsJS); err != nil { @@ -82,3 +84,15 @@ func Measure(s string) (width, height int, err error) { return int(math.Ceil(wf * float64(pxPerEx))), int(math.Ceil(hf * float64(pxPerEx))), nil } + +func doubleBackslashes(s string) string { + var result strings.Builder + for i := 0; i < len(s); i++ { + if s[i] == '\\' { + result.WriteString("\\\\") + } else { + result.WriteByte(s[i]) + } + } + return result.String() +} diff --git a/e2etests/testdata/txtar/single-backslash-latex/dagre/board.exp.json b/e2etests/testdata/txtar/single-backslash-latex/dagre/board.exp.json index 209ca0af6..ca9c31076 100644 --- a/e2etests/testdata/txtar/single-backslash-latex/dagre/board.exp.json +++ b/e2etests/testdata/txtar/single-backslash-latex/dagre/board.exp.json @@ -81,7 +81,7 @@ "fields": null, "methods": null, "columns": null, - "label": "\\\\begin{equation} \\\\label{eq1}\n\\\\begin{split}\nA & = \\\\frac{\\\\\\\\pi r^2}{2} \\\\\\\\\n & = \\\\frac{1}{2} \\\\pi r^2\n\\\\end{split}\n\\\\end{equation}", + "label": "\\begin{equation} \\label{eq1}\n\\begin{split}\nA & = \\frac{\\\\pi r^2}{2} \\\\\n & = \\frac{1}{2} \\pi r^2\n\\end{split}\n\\end{equation}", "fontSize": 16, "fontFamily": "DEFAULT", "language": "latex", diff --git a/e2etests/testdata/txtar/single-backslash-latex/dagre/sketch.exp.svg b/e2etests/testdata/txtar/single-backslash-latex/dagre/sketch.exp.svg index a7b300871..fceeba7c5 100644 --- a/e2etests/testdata/txtar/single-backslash-latex/dagre/sketch.exp.svg +++ b/e2etests/testdata/txtar/single-backslash-latex/dagre/sketch.exp.svg @@ -1,9 +1,9 @@ -formula +formula diff --git a/e2etests/testdata/txtar/single-backslash-latex/elk/board.exp.json b/e2etests/testdata/txtar/single-backslash-latex/elk/board.exp.json index 6ae60e7aa..56951790c 100644 --- a/e2etests/testdata/txtar/single-backslash-latex/elk/board.exp.json +++ b/e2etests/testdata/txtar/single-backslash-latex/elk/board.exp.json @@ -81,7 +81,7 @@ "fields": null, "methods": null, "columns": null, - "label": "\\\\begin{equation} \\\\label{eq1}\n\\\\begin{split}\nA & = \\\\frac{\\\\\\\\pi r^2}{2} \\\\\\\\\n & = \\\\frac{1}{2} \\\\pi r^2\n\\\\end{split}\n\\\\end{equation}", + "label": "\\begin{equation} \\label{eq1}\n\\begin{split}\nA & = \\frac{\\\\pi r^2}{2} \\\\\n & = \\frac{1}{2} \\pi r^2\n\\end{split}\n\\end{equation}", "fontSize": 16, "fontFamily": "DEFAULT", "language": "latex", diff --git a/e2etests/testdata/txtar/single-backslash-latex/elk/sketch.exp.svg b/e2etests/testdata/txtar/single-backslash-latex/elk/sketch.exp.svg index e753ca5c4..d14630906 100644 --- a/e2etests/testdata/txtar/single-backslash-latex/elk/sketch.exp.svg +++ b/e2etests/testdata/txtar/single-backslash-latex/elk/sketch.exp.svg @@ -1,9 +1,9 @@ -formula +formula