tex2typst 0.3.20 → 0.3.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1668,7 +1668,8 @@ var TEX_UNARY_COMMANDS = [
1668
1668
  "widetilde",
1669
1669
  "overleftarrow",
1670
1670
  "overrightarrow",
1671
- "hspace"
1671
+ "hspace",
1672
+ "substack"
1672
1673
  ];
1673
1674
  var TEX_BINARY_COMMANDS = [
1674
1675
  "frac",
@@ -2838,6 +2839,13 @@ function convert_tex_node_to_typst(node, options = {}) {
2838
2839
  [new TypstNode("symbol", text)]
2839
2840
  );
2840
2841
  }
2842
+ if (node.content === "\\substack") {
2843
+ return new TypstNode(
2844
+ "group",
2845
+ "",
2846
+ [arg0]
2847
+ );
2848
+ }
2841
2849
  if (options.optimize) {
2842
2850
  if (node.content === "\\mathbb" && arg0.type === "atom" && /^[A-Z]$/.test(arg0.content)) {
2843
2851
  return new TypstNode("symbol", arg0.content + arg0.content);
@@ -2861,6 +2869,20 @@ function convert_tex_node_to_typst(node, options = {}) {
2861
2869
  if (node.content === "cases") {
2862
2870
  return new TypstNode("cases", "", [], data);
2863
2871
  }
2872
+ if (node.content === "subarray") {
2873
+ const align_node = node.args[0];
2874
+ if (align_node.content == "r") {
2875
+ data.forEach((row) => row[0].args.push(new TypstNode("symbol", "&")));
2876
+ }
2877
+ if (align_node.content == "l") {
2878
+ data.forEach((row) => row[0].args.unshift(new TypstNode("symbol", "&")));
2879
+ }
2880
+ return new TypstNode(
2881
+ "group",
2882
+ "",
2883
+ [new TypstNode("align", "", [], data)]
2884
+ );
2885
+ }
2864
2886
  if (node.content === "array") {
2865
2887
  const res = new TypstNode("matrix", "", [], data);
2866
2888
  const options2 = { "delim": TYPST_NONE };
@@ -3007,18 +3029,20 @@ function convert_typst_node_to_tex(node) {
3007
3029
  return new TexNode("whitespace", node.content);
3008
3030
  case "atom":
3009
3031
  return new TexNode("element", node.content);
3010
- case "symbol":
3011
- switch (node.content) {
3012
- // special hook for comma
3013
- case "comma":
3014
- return new TexNode("element", ",");
3015
- // special hook for hyph and hyph.minus
3016
- case "hyph":
3017
- case "hyph.minus":
3018
- return new TexNode("text", "-");
3019
- default:
3020
- return new TexNode("symbol", typst_token_to_tex(node.content));
3032
+ case "symbol": {
3033
+ if (node.content === "comma") {
3034
+ return new TexNode("element", ",");
3021
3035
  }
3036
+ if (node.content === "hyph" || node.content === "hyph.minus") {
3037
+ return new TexNode("text", "-");
3038
+ }
3039
+ if (/^([A-Z])\1$/.test(node.content)) {
3040
+ return new TexNode("unaryFunc", "\\mathbb", [
3041
+ new TexNode("element", node.content[0])
3042
+ ]);
3043
+ }
3044
+ return new TexNode("symbol", typst_token_to_tex(node.content));
3045
+ }
3022
3046
  case "text":
3023
3047
  return new TexNode("text", node.content);
3024
3048
  case "comment":
@@ -1,13 +1,13 @@
1
- "use strict";(()=>{var E=new Map([["displaystyle","display"],["|","bar.v.double"],["!","#h(-math.thin.amount)"],[",","thin"],[":","med"],[";","thick"],["ln","ln"],["log","log"],["cos","cos"],["sin","sin"],["tan","tan"],["cot","cot"],["sec","sec"],["csc","csc"],["mod","mod"],["omicron","omicron"],["Xi","Xi"],["Upsilon","Upsilon"],["lim","lim"],["nonumber",""],["vec","arrow"],["neq","eq.not"],["dot","dot"],["ddot","dot.double"],["doteq","dot(eq)"],["dots","dots.h"],["vdots","dots.v"],["ddots","dots.down"],["widehat","hat"],["widetilde","tilde"],["quad","quad"],["qquad","wide"],["overbrace","overbrace"],["underbrace","underbrace"],["overline","overline"],["underline","underline"],["bar","macron"],["dbinom","binom"],["tbinom","binom"],["dfrac","frac"],["tfrac","frac"],["operatorname","op"],["boldsymbol","bold"],["mathbb","bb"],["mathbf","bold"],["mathcal","cal"],["mathit","italic"],["mathfrak","frak"],["mathrm","upright"],["mathsf","sans"],["mathtt","mono"],["rm","upright"],["pmb","bold"],["leadsto","arrow.r.squiggly"],["P","pilcrow"],["S","section"],["aleph","alef"],["infin","infinity"],["Delta","Delta"],["Gamma","Gamma"],["Lambda","Lambda"],["Omega","Omega"],["Phi","Phi"],["Pi","Pi"],["Psi","Psi"],["Sigma","Sigma"],["Theta","Theta"],["alpha","alpha"],["beta","beta"],["bigcirc","circle.big"],["bullet","bullet"],["cdot","dot.op"],["cdots","dots.c"],["checkmark","checkmark"],["chi","chi"],["circ","circle.small"],["colon","colon"],["cong","tilde.equiv"],["coprod","product.co"],["copyright","copyright"],["cup","union"],["curlyvee","or.curly"],["curlywedge","and.curly"],["dagger","dagger"],["dashv","tack.l"],["ddagger","dagger.double"],["delta","delta"],["ddots","dots.down"],["diamond","diamond"],["div","div"],["divideontimes","times.div"],["dotplus","plus.dot"],["ell","ell"],["emptyset","nothing"],["epsilon","epsilon.alt"],["equiv","equiv"],["eta","eta"],["exists","exists"],["forall","forall"],["gamma","gamma"],["ge","gt.eq"],["geq","gt.eq"],["geqslant","gt.eq.slant"],["gg","gt.double"],["hbar","planck.reduce"],["imath","dotless.i"],["iiiint","integral.quad"],["iiint","integral.triple"],["iint","integral.double"],["in","in"],["infty","infinity"],["int","integral"],["intercal","top"],["iota","iota"],["jmath","dotless.j"],["kappa","kappa"],["lambda","lambda"],["land","and"],["langle","angle.l"],["lbrace","brace.l"],["lbrack","bracket.l"],["ldots","dots.h"],["le","lt.eq"],["leftthreetimes","times.three.l"],["leftrightarrow","arrow.l.r"],["leq","lt.eq"],["leqslant","lt.eq.slant"],["lhd","triangle.l"],["ll","lt.double"],["lor","or"],["ltimes","times.l"],["measuredangle","angle.arc"],["mid","divides"],["models","models"],["mp","minus.plus"],["mu","mu"],["nabla","nabla"],["ncong","tilde.equiv.not"],["ne","eq.not"],["neg","not"],["neq","eq.not"],["nexists","exists.not"],["ni","in.rev"],["nleftarrow","arrow.l.not"],["nleq","lt.eq.not"],["nparallel","parallel.not"],["ngeq","gt.eq.not"],["nmid","divides.not"],["notin","in.not"],["nsim","tilde.not"],["nsubseteq","subset.eq.not"],["nu","nu"],["ntriangleleft","lt.tri.not"],["ntriangleright","gt.tri.not"],["odot","dot.circle"],["oint","integral.cont"],["oiint","integral.surf"],["oiiint","integral.vol"],["omega","omega"],["ominus","minus.circle"],["otimes","times.circle"],["parallel","parallel"],["partial","diff"],["perp","perp"],["phi","phi.alt"],["pi","pi"],["pm","plus.minus"],["pounds","pound"],["prec","prec"],["preceq","prec.eq"],["prime","prime"],["prod","product"],["propto","prop"],["psi","psi"],["rangle","angle.r"],["rbrace","brace.r"],["rbrack","bracket.r"],["rhd","triangle"],["rho","rho"],["rightarrow","arrow.r"],["rightthreetimes","times.three.r"],["rtimes","times.r"],["setminus","without"],["sigma","sigma"],["sim","tilde.op"],["simeq","tilde.eq"],["slash","slash"],["smallsetminus","without"],["spadesuit","suit.spade"],["sqsubseteq","subset.eq.sq"],["sqsupseteq","supset.eq.sq"],["subset","subset"],["subseteq","subset.eq"],["subsetneq","subset.neq"],["succ","succ"],["succeq","succ.eq"],["sum","sum"],["supset","supset"],["supseteq","supset.eq"],["supsetneq","supset.neq"],["tau","tau"],["theta","theta"],["times","times"],["to","arrow.r"],["top","top"],["triangle","triangle.t"],["twoheadrightarrow","arrow.r.twohead"],["upharpoonright","harpoon.tr"],["uplus","union.plus"],["upsilon","upsilon"],["varepsilon","epsilon"],["varnothing","diameter"],["varphi","phi"],["varpi","pi.alt"],["varrho","rho.alt"],["varsigma","sigma.alt"],["vartheta","theta.alt"],["vdash","tack.r"],["vdots","dots.v"],["vee","or"],["wedge","and"],["wr","wreath"],["xi","xi"],["yen","yen"],["zeta","zeta"],["mathscr","scr"],["LaTeX","#LaTeX"],["TeX","#TeX"]]),We=new Map([["acwopencirclearrow","arrow.ccw"],["adots","dots.up"],["angdnr","angle.acute"],["angle","angle"],["angles","angle.s"],["approx","approx"],["approxeq","approx.eq"],["approxident","tilde.triple"],["assert","tack.r.short"],["ast","ast.op"],["asymp","asymp"],["awint","integral.ccw"],["backcong","tilde.rev.equiv"],["backdprime","prime.double.rev"],["backprime","prime.rev"],["backsim","tilde.rev"],["backsimeq","tilde.eq.rev"],["backslash","backslash"],["backtrprime","prime.triple.rev"],["bardownharpoonleft","harpoon.bl.bar"],["bardownharpoonright","harpoon.br.bar"],["barleftarrow","arrow.l.stop"],["barleftarrowrightarrowbar","arrows.lr.stop"],["barleftharpoondown","harpoon.lb.stop"],["barleftharpoonup","harpoon.lt.stop"],["barrightharpoondown","harpoon.rb.bar"],["barrightharpoonup","harpoon.rt.bar"],["baruparrow","arrow.t.stop"],["barupharpoonleft","harpoon.tl.stop"],["barupharpoonright","harpoon.tr.stop"],["barV","tack.b.double"],["BbbA","AA"],["BbbB","BB"],["BbbC","CC"],["BbbD","DD"],["BbbE","EE"],["BbbF","FF"],["BbbG","GG"],["BbbH","HH"],["BbbI","II"],["BbbJ","JJ"],["BbbK","KK"],["BbbL","LL"],["BbbM","MM"],["BbbN","NN"],["BbbO","OO"],["BbbP","PP"],["BbbQ","QQ"],["BbbR","RR"],["BbbS","SS"],["BbbT","TT"],["BbbU","UU"],["BbbV","VV"],["BbbW","WW"],["BbbX","XX"],["BbbY","YY"],["BbbZ","ZZ"],["because","because"],["bigblacktriangledown","triangle.filled.b"],["bigblacktriangleup","triangle.filled.t"],["bigbot","tack.t.big"],["bigcap","inter.big"],["bigcup","union.big"],["bigcupdot","union.dot.big"],["biginterleave","interleave.big"],["bigodot","dot.circle.big"],["bigoplus","plus.circle.big"],["bigotimes","times.circle.big"],["bigsqcap","inter.sq.big"],["bigsqcup","union.sq.big"],["bigstar","star.filled"],["bigtimes","times.big"],["bigtop","tack.b.big"],["bigtriangledown","triangle.stroked.b"],["bigtriangleup","triangle.stroked.t"],["biguplus","union.plus.big"],["bigvee","or.big"],["bigwedge","and.big"],["bigwhitestar","star.stroked"],["blackhourglass","hourglass.filled"],["blacktriangle","triangle.filled.small.t"],["blacktriangledown","triangle.filled.small.b"],["blacktriangleleft","triangle.filled.l"],["blacktriangleright","triangle.filled.r"],["blkhorzoval","ellipse.filled.h"],["blkvertoval","ellipse.filled.v"],["bot","bot"],["boxast","ast.square"],["boxdot","dot.square"],["boxminus","minus.square"],["boxplus","plus.square"],["boxtimes","times.square"],["cap","inter"],["Cap","inter.double"],["capdot","inter.dot"],["capwedge","inter.and"],["caretinsert","caret"],["cdot","dot.op"],["cdotp","dot.c"],["checkmark","checkmark"],["circledast","ast.circle"],["circledcirc","circle.nested"],["circleddash","dash.circle"],["circledequal","eq.circle"],["circledparallel","parallel.circle"],["circledvert","bar.v.circle"],["clubsuit","suit.club.filled"],["Colon","colon.double"],["coloneq","colon.eq"],["Coloneq","colon.double.eq"],["complement","complement"],["cong","tilde.equiv"],["coprod","product.co"],["cup","union"],["Cup","union.double"],["cupdot","union.dot"],["cupleftarrow","union.arrow"],["cupvee","union.or"],["curlyeqprec","eq.prec"],["curlyeqsucc","eq.succ"],["curlyvee","or.curly"],["curlywedge","and.curly"],["curvearrowleft","arrow.ccw.half"],["curvearrowright","arrow.cw.half"],["cwopencirclearrow","arrow.cw"],["dagger","dagger"],["dashcolon","dash.colon"],["dashv","tack.l"],["Dashv","tack.l.double"],["dashVdash","tack.l.r"],["ddagger","dagger.double"],["ddddot","dot.quad"],["dddot","dot.triple"],["ddots","dots.down"],["DDownarrow","arrow.b.quad"],["Ddownarrow","arrow.b.triple"],["diameter","diameter"],["diamondcdot","diamond.stroked.dot"],["diamondsuit","suit.diamond.stroked"],["dicei","die.one"],["diceii","die.two"],["diceiii","die.three"],["diceiv","die.four"],["dicev","die.five"],["dicevi","die.six"],["div","div"],["divideontimes","times.div"],["Doteq","eq.dots"],["dotminus","minus.dot"],["dotplus","plus.dot"],["dotsim","tilde.dot"],["dottedcircle","circle.dotted"],["dottedsquare","square.stroked.dotted"],["doubleplus","plus.double"],["downarrow","arrow.b"],["Downarrow","arrow.b.double"],["downarrowbar","arrow.b.stop"],["downdasharrow","arrow.b.dashed"],["downdownarrows","arrows.bb"],["downharpoonleft","harpoon.bl"],["downharpoonleftbar","harpoon.bl.stop"],["downharpoonright","harpoon.br"],["downharpoonrightbar","harpoon.br.stop"],["downharpoonsleftright","harpoons.blbr"],["downrightcurvedarrow","arrow.b.curve"],["downuparrows","arrows.bt"],["downupharpoonsleftright","harpoons.bltr"],["downwhitearrow","arrow.b.stroked"],["downzigzagarrow","arrow.zigzag"],["dprime","prime.double"],["dualmap","multimap.double"],["eighthnote","note.eighth.alt"],["ell","ell"],["emptysetoarr","emptyset.arrow.r"],["emptysetoarrl","emptyset.arrow.l"],["emptysetobar","emptyset.bar"],["emptysetocirc","emptyset.circle"],["eparsl","parallel.slanted.eq"],["eqcolon","eq.colon"],["eqdef","eq.def"],["eqgtr","eq.gt"],["eqless","eq.lt"],["eqsim","minus.tilde"],["equal","eq"],["equalparallel","parallel.eq"],["equiv","eq.triple"],["Equiv","eq.quad"],["equivVert","parallel.equiv"],["eqvparsl","parallel.slanted.equiv"],["errbarblackcircle","errorbar.circle.filled"],["errbarblackdiamond","errorbar.diamond.filled"],["errbarblacksquare","errorbar.square.filled"],["errbarcircle","errorbar.circle.stroked"],["errbardiamond","errorbar.diamond.stroked"],["errbarsquare","errorbar.square.stroked"],["euro","euro"],["Exclam","excl.double"],["exists","exists"],["fallingdotseq","eq.dots.down"],["fint","integral.slash"],["flat","flat"],["forall","forall"],["fourvdots","fence.dotted"],["fullouterjoin","join.l.r"],["geq","gt.eq"],["geqq","gt.equiv"],["geqslant","gt.eq.slant"],["gg","gt.double"],["ggg","gt.triple"],["gggnest","gt.triple.nested"],["gnapprox","gt.napprox"],["gneq","gt.neq"],["gneqq","gt.nequiv"],["gnsim","gt.ntilde"],["greater","gt"],["gtlpar","angle.spheric.rev"],["gtrapprox","gt.approx"],["gtrdot","gt.dot"],["gtreqless","gt.eq.lt"],["gtrless","gt.lt"],["gtrsim","gt.tilde"],["heartsuit","suit.heart.stroked"],["hknearrow","arrow.tr.hook"],["hknwarrow","arrow.tl.hook"],["hksearrow","arrow.br.hook"],["hkswarrow","arrow.bl.hook"],["hookleftarrow","arrow.l.hook"],["hookrightarrow","arrow.r.hook"],["horizbar","bar.h"],["hourglass","hourglass.stroked"],["hrectangle","rect.stroked.h"],["hrectangleblack","rect.filled.h"],["hslash","planck.reduce"],["hzigzag","dash.wave.double"],["iiiint","integral.quad"],["iiint","integral.triple"],["iinfin","infinity.incomplete"],["iint","integral.double"],["Im","Im"],["imageof","image"],["in","in"],["increment","laplace"],["infty","infinity"],["int","integral"],["intbar","integral.dash"],["intBar","integral.dash.double"],["intcap","integral.inter"],["intclockwise","integral.cw"],["intcup","integral.union"],["interleave","interleave"],["intlarhk","integral.arrow.hook"],["intx","integral.times"],["Join","join"],["langle","angle.l"],["lAngle","angle.l.double"],["langledot","angle.l.dot"],["lat","lat"],["late","lat.eq"],["lbrace","brace.l"],["lBrace","brace.l.double"],["lbrack","bracket.l"],["lBrack","bracket.l.double"],["lbrbrak","shell.l"],["Lbrbrak","shell.l.double"],["lceil","ceil.l"],["lcurvyangle","angle.l.curly"],["leftarrow","arrow.l"],["Leftarrow","arrow.l.double"],["leftarrowtail","arrow.l.tail"],["leftdasharrow","arrow.l.dashed"],["leftdotarrow","arrow.l.dotted"],["leftdowncurvedarrow","arrow.l.curve"],["leftharpoondown","harpoon.lb"],["leftharpoondownbar","harpoon.lb.bar"],["leftharpoonsupdown","harpoons.ltlb"],["leftharpoonup","harpoon.lt"],["leftharpoonupbar","harpoon.lt.bar"],["leftleftarrows","arrows.ll"],["leftouterjoin","join.l"],["leftrightarrow","arrow.l.r"],["Leftrightarrow","arrow.l.r.double"],["leftrightarrows","arrows.lr"],["leftrightharpoondowndown","harpoon.lb.rb"],["leftrightharpoondownup","harpoon.lb.rt"],["leftrightharpoons","harpoons.ltrb"],["leftrightharpoonsdown","harpoons.lbrb"],["leftrightharpoonsup","harpoons.ltrt"],["leftrightharpoonupdown","harpoon.lt.rb"],["leftrightharpoonupup","harpoon.lt.rt"],["leftrightsquigarrow","arrow.l.r.wave"],["leftsquigarrow","arrow.l.squiggly"],["leftthreearrows","arrows.lll"],["leftthreetimes","times.three.l"],["leftwavearrow","arrow.l.wave"],["leftwhitearrow","arrow.l.stroked"],["leq","lt.eq"],["leqq","lt.equiv"],["leqslant","lt.eq.slant"],["less","lt"],["lessapprox","lt.approx"],["lessdot","lt.dot"],["lesseqgtr","lt.eq.gt"],["lessgtr","lt.gt"],["lesssim","lt.tilde"],["lfloor","floor.l"],["lgblkcircle","circle.filled.big"],["lgblksquare","square.filled.big"],["lgwhtcircle","circle.stroked.big"],["lgwhtsquare","square.stroked.big"],["ll","lt.double"],["llblacktriangle","triangle.filled.bl"],["LLeftarrow","arrow.l.quad"],["Lleftarrow","arrow.l.triple"],["lll","lt.triple"],["lllnest","lt.triple.nested"],["lltriangle","triangle.stroked.bl"],["lnapprox","lt.napprox"],["lneq","lt.neq"],["lneqq","lt.nequiv"],["lnsim","lt.ntilde"],["longdashv","tack.l.long"],["Longleftarrow","arrow.l.double.long"],["longleftarrow","arrow.l.long"],["Longleftrightarrow","arrow.l.r.double.long"],["longleftrightarrow","arrow.l.r.long"],["longleftsquigarrow","arrow.l.long.squiggly"],["Longmapsfrom","arrow.l.double.long.bar"],["longmapsfrom","arrow.l.long.bar"],["longmapsto","arrow.r.long.bar"],["Longmapsto","arrow.r.double.long.bar"],["Longrightarrow","arrow.r.double.long"],["longrightarrow","arrow.r.long"],["longrightsquigarrow","arrow.r.long.squiggly"],["looparrowleft","arrow.l.loop"],["looparrowright","arrow.r.loop"],["lparen","paren.l"],["lParen","paren.l.double"],["lrblacktriangle","triangle.filled.br"],["lrtriangle","triangle.stroked.br"],["ltimes","times.l"],["lvzigzag","fence.l"],["Lvzigzag","fence.l.double"],["maltese","maltese"],["mapsdown","arrow.b.bar"],["mapsfrom","arrow.l.bar"],["Mapsfrom","arrow.l.double.bar"],["mapsto","arrow.r.bar"],["Mapsto","arrow.r.double.bar"],["mapsup","arrow.t.bar"],["mathampersand","amp"],["mathatsign","at"],["mathcolon","colon"],["mathcomma","comma"],["mathdollar","dollar"],["mathexclam","excl"],["mathoctothorpe","hash"],["mathparagraph","pilcrow"],["mathpercent","percent"],["mathperiod","dot.basic"],["mathplus","plus"],["mathquestion","quest"],["mathratio","ratio"],["mathsection","section"],["mathsemicolon","semi"],["mathslash","slash"],["mathsterling","pound"],["mathyen","yen"],["mdblkdiamond","diamond.filled.medium"],["mdblklozenge","lozenge.filled.medium"],["mdblksquare","square.filled.medium"],["mdlgblkcircle","circle.filled"],["mdlgblkdiamond","diamond.filled"],["mdlgblklozenge","lozenge.filled"],["mdlgblksquare","square.filled"],["mdlgwhtcircle","circle.stroked"],["mdlgwhtdiamond","diamond.stroked"],["mdlgwhtlozenge","lozenge.stroked"],["mdlgwhtsquare","square.stroked"],["mdsmblkcircle","circle.filled.tiny"],["mdsmblksquare","square.filled.small"],["mdsmwhtcircle","circle.stroked.small"],["mdsmwhtsquare","square.stroked.small"],["mdwhtdiamond","diamond.stroked.medium"],["mdwhtlozenge","lozenge.stroked.medium"],["mdwhtsquare","square.stroked.medium"],["measeq","eq.m"],["measuredangle","angle.arc"],["measuredangleleft","angle.arc.rev"],["measuredrightangle","angle.right.arc"],["mho","Omega.inv"],["mid","divides"],["minus","minus"],["models","models"],["mp","minus.plus"],["multimap","multimap"],["nabla","gradient"],["napprox","approx.not"],["nasymp","asymp.not"],["natural","natural"],["ncong","tilde.equiv.not"],["ne","eq.not"],["nearrow","arrow.tr"],["Nearrow","arrow.tr.double"],["neg","not"],["nequiv","equiv.not"],["neswarrow","arrow.tr.bl"],["nexists","exists.not"],["ngeq","gt.eq.not"],["ngtr","gt.not"],["ngtrless","gt.lt.not"],["ngtrsim","gt.tilde.not"],["nhpar","parallel.struck"],["nhVvert","interleave.struck"],["ni","in.rev"],["nLeftarrow","arrow.l.double.not"],["nleftarrow","arrow.l.not"],["nLeftrightarrow","arrow.l.r.double.not"],["nleftrightarrow","arrow.l.r.not"],["nleq","lt.eq.not"],["nless","lt.not"],["nlessgtr","lt.gt.not"],["nlesssim","lt.tilde.not"],["nmid","divides.not"],["nni","in.rev.not"],["notin","in.not"],["nparallel","parallel.not"],["nprec","prec.not"],["npreccurlyeq","prec.curly.eq.not"],["nRightarrow","arrow.r.double.not"],["nrightarrow","arrow.r.not"],["nsim","tilde.not"],["nsimeq","tilde.eq.not"],["nsqsubseteq","subset.eq.sq.not"],["nsqsupseteq","supset.eq.sq.not"],["nsubset","subset.not"],["nsubseteq","subset.eq.not"],["nsucc","succ.not"],["nsucccurlyeq","succ.curly.eq.not"],["nsupset","supset.not"],["nsupseteq","supset.eq.not"],["ntrianglelefteq","lt.tri.eq.not"],["ntrianglerighteq","gt.tri.eq.not"],["nvartriangleleft","lt.tri.not"],["nvartriangleright","gt.tri.not"],["nVdash","forces.not"],["nvdash","tack.r.not"],["nvDash","tack.r.double.not"],["nvinfty","infinity.bar"],["nwarrow","arrow.tl"],["Nwarrow","arrow.tl.double"],["nwsearrow","arrow.tl.br"],["obrbrak","shell.t"],["obslash","backslash.circle"],["odiv","div.circle"],["odot","dot.circle"],["ogreaterthan","gt.circle"],["oiiint","integral.vol"],["oiint","integral.surf"],["oint","integral.cont"],["ointctrclockwise","integral.cont.ccw"],["olessthan","lt.circle"],["ominus","minus.circle"],["operp","perp.circle"],["oplus","plus.circle"],["origof","original"],["otimes","times.circle"],["overbracket","bracket.t"],["overparen","paren.t"],["parallel","parallel"],["parallelogram","parallelogram.stroked"],["parallelogramblack","parallelogram.filled"],["parsim","parallel.tilde"],["partial","diff"],["pentagon","penta.stroked"],["pentagonblack","penta.filled"],["perp","perp"],["Planckconst","planck"],["pm","plus.minus"],["prec","prec"],["Prec","prec.double"],["precapprox","prec.approx"],["preccurlyeq","prec.curly.eq"],["preceq","prec.eq"],["preceqq","prec.equiv"],["precnapprox","prec.napprox"],["precneq","prec.neq"],["precneqq","prec.nequiv"],["precnsim","prec.ntilde"],["precsim","prec.tilde"],["prime","prime"],["prod","product"],["propto","prop"],["QED","qed"],["qprime","prime.quad"],["quarternote","note.quarter.alt"],["questeq","eq.quest"],["Question","quest.double"],["rangle","angle.r"],["rAngle","angle.r.double"],["rangledot","angle.r.dot"],["rbrace","brace.r"],["rBrace","brace.r.double"],["rbrack","bracket.r"],["rBrack","bracket.r.double"],["rbrbrak","shell.r"],["Rbrbrak","shell.r.double"],["rceil","ceil.r"],["rcurvyangle","angle.r.curly"],["Re","Re"],["revangle","angle.rev"],["revemptyset","emptyset.rev"],["revnmid","divides.not.rev"],["rfloor","floor.r"],["rightangle","angle.right"],["rightanglemdot","angle.right.dot"],["rightanglesqr","angle.right.sq"],["rightarrow","arrow.r"],["Rightarrow","arrow.r.double"],["rightarrowbar","arrow.r.stop"],["rightarrowonoplus","plus.circle.arrow"],["rightarrowtail","arrow.r.tail"],["rightdasharrow","arrow.r.dashed"],["rightdotarrow","arrow.r.dotted"],["rightdowncurvedarrow","arrow.r.curve"],["rightharpoondown","harpoon.rb"],["rightharpoondownbar","harpoon.rb.stop"],["rightharpoonsupdown","harpoons.rtrb"],["rightharpoonup","harpoon.rt"],["rightharpoonupbar","harpoon.rt.stop"],["rightleftarrows","arrows.rl"],["rightleftharpoons","harpoons.rtlb"],["rightleftharpoonsdown","harpoons.rblb"],["rightleftharpoonsup","harpoons.rtlt"],["rightouterjoin","join.r"],["rightrightarrows","arrows.rr"],["rightsquigarrow","arrow.r.squiggly"],["rightthreearrows","arrows.rrr"],["rightthreetimes","times.three.r"],["rightwavearrow","arrow.r.wave"],["rightwhitearrow","arrow.r.stroked"],["risingdotseq","eq.dots.up"],["rparen","paren.r"],["rParen","paren.r.double"],["RRightarrow","arrow.r.quad"],["Rrightarrow","arrow.r.triple"],["rsolbar","backslash.not"],["rtimes","times.r"],["rvzigzag","fence.r"],["Rvzigzag","fence.r.double"],["searrow","arrow.br"],["Searrow","arrow.br.double"],["setminus","without"],["sharp","sharp"],["shortdowntack","tack.b.short"],["shortlefttack","tack.l.short"],["shortuptack","tack.t.short"],["sim","tilde.op"],["sime","tilde.eq"],["similarleftarrow","arrow.l.tilde"],["similarrightarrow","arrow.r.tilde"],["simneqq","tilde.nequiv"],["smallblacktriangleleft","triangle.filled.small.l"],["smallblacktriangleright","triangle.filled.small.r"],["smallin","in.small"],["smallni","in.rev.small"],["smalltriangleleft","triangle.stroked.small.l"],["smalltriangleright","triangle.stroked.small.r"],["smashtimes","smash"],["smblkcircle","bullet"],["smblkdiamond","diamond.filled.small"],["smblklozenge","lozenge.filled.small"],["smblksquare","square.filled.tiny"],["smeparsl","parallel.slanted.eq.tilde"],["smt","smt"],["smte","smt.eq"],["smwhtdiamond","diamond.stroked.small"],["smwhtlozenge","lozenge.stroked.small"],["smwhtsquare","square.stroked.tiny"],["spadesuit","suit.spade.filled"],["sphericalangle","angle.spheric"],["sphericalangleup","angle.spheric.top"],["sqcap","inter.sq"],["Sqcap","inter.sq.double"],["sqcup","union.sq"],["Sqcup","union.sq.double"],["sqint","integral.square"],["sqsubset","subset.sq"],["sqsubseteq","subset.eq.sq"],["sqsubsetneq","subset.sq.neq"],["sqsupset","supset.sq"],["sqsupseteq","supset.eq.sq"],["sqsupsetneq","supset.sq.neq"],["squoval","square.stroked.rounded"],["sslash","slash.double"],["star","star.op"],["stareq","eq.star"],["subset","subset"],["Subset","subset.double"],["subsetdot","subset.dot"],["subseteq","subset.eq"],["subsetneq","subset.neq"],["succ","succ"],["Succ","succ.double"],["succapprox","succ.approx"],["succcurlyeq","succ.curly.eq"],["succeq","succ.eq"],["succeqq","succ.equiv"],["succnapprox","succ.napprox"],["succneq","succ.neq"],["succneqq","succ.nequiv"],["succnsim","succ.ntilde"],["succsim","succ.tilde"],["sum","sum"],["sumint","sum.integral"],["supset","supset"],["Supset","supset.double"],["supsetdot","supset.dot"],["supseteq","supset.eq"],["supsetneq","supset.neq"],["swarrow","arrow.bl"],["Swarrow","arrow.bl.double"],["therefore","therefore"],["threedangle","angle.spatial"],["threedotcolon","colon.tri.op"],["tieinfty","infinity.tie"],["times","times"],["tminus","miny"],["top","tack.b"],["tplus","tiny"],["trianglecdot","triangle.stroked.dot"],["triangledown","triangle.stroked.small.b"],["triangleleft","triangle.stroked.l"],["trianglelefteq","lt.tri.eq"],["triangleminus","minus.triangle"],["triangleplus","plus.triangle"],["triangleq","eq.delta"],["triangleright","triangle.stroked.r"],["trianglerighteq","gt.tri.eq"],["triangletimes","times.triangle"],["tripleplus","plus.triple"],["trprime","prime.triple"],["trslash","slash.triple"],["twoheaddownarrow","arrow.b.twohead"],["twoheadleftarrow","arrow.l.twohead"],["twoheadmapsfrom","arrow.l.twohead.bar"],["twoheadmapsto","arrow.r.twohead.bar"],["twoheadrightarrow","arrow.r.twohead"],["twoheaduparrow","arrow.t.twohead"],["twonotes","note.eighth.beamed"],["ubrbrak","shell.b"],["ulblacktriangle","triangle.filled.tl"],["ultriangle","triangle.stroked.tl"],["uminus","union.minus"],["underbrace","brace.b"],["underbracket","bracket.b"],["underparen","paren.b"],["unicodecdots","dots.h.c"],["unicodeellipsis","dots.h"],["upand","amp.inv"],["uparrow","arrow.t"],["Uparrow","arrow.t.double"],["updasharrow","arrow.t.dashed"],["updownarrow","arrow.t.b"],["Updownarrow","arrow.t.b.double"],["updownarrows","arrows.tb"],["updownharpoonleftleft","harpoon.tl.bl"],["updownharpoonleftright","harpoon.tl.br"],["updownharpoonrightleft","harpoon.tr.bl"],["updownharpoonrightright","harpoon.tr.br"],["updownharpoonsleftright","harpoons.tlbr"],["upharpoonleft","harpoon.tl"],["upharpoonleftbar","harpoon.tl.bar"],["upharpoonright","harpoon.tr"],["upharpoonrightbar","harpoon.tr.bar"],["upharpoonsleftright","harpoons.tltr"],["uplus","union.plus"],["uprightcurvearrow","arrow.t.curve"],["upuparrows","arrows.tt"],["upwhitearrow","arrow.t.stroked"],["urblacktriangle","triangle.filled.tr"],["urtriangle","triangle.stroked.tr"],["UUparrow","arrow.t.quad"],["Uuparrow","arrow.t.triple"],["varclubsuit","suit.club.stroked"],["vardiamondsuit","suit.diamond.filled"],["varheartsuit","suit.heart.filled"],["varhexagon","hexa.stroked"],["varhexagonblack","hexa.filled"],["varnothing","emptyset"],["varointclockwise","integral.cont.cw"],["varspadesuit","suit.spade.stroked"],["vartriangle","triangle.stroked.small.t"],["vartriangleleft","lt.tri"],["vartriangleright","gt.tri"],["Vbar","tack.t.double"],["Vdash","forces"],["vdash","tack.r"],["vDash","tack.r.double"],["vdots","dots.v"],["vee","or"],["Vee","or.double"],["veedot","or.dot"],["veeeq","eq.equi"],["vert","bar.v"],["Vert","bar.v.double"],["vlongdash","tack.r.long"],["vrectangle","rect.stroked.v"],["vrectangleblack","rect.filled.v"],["Vvert","bar.v.triple"],["vysmblkcircle","circle.filled.small"],["vysmwhtcircle","circle.stroked.tiny"],["wedge","and"],["Wedge","and.double"],["wedgedot","and.dot"],["wedgeq","eq.est"],["whiteinwhitetriangle","triangle.stroked.nested"],["whthorzoval","ellipse.stroked.h"],["whtvertoval","ellipse.stroked.v"],["wideangledown","angle.oblique"],["wr","wreath"],["xsol","slash.big"]]),Ue=new Map([["gets","leftarrow"],["iff","Longleftrightarrow"],["implies","Longrightarrow"]]);for(let[r,e]of We)E.has(r)||E.set(r,e);var v=new Map;for(let[r,e]of Array.from(E.entries()).reverse())v.set(e,r);v.set("dif","mathrm{d}");v.set("oo","infty");var Fe=new Map([["top","top"],["frac","frac"],["tilde","tilde"],["hat","hat"],["upright","mathrm"],["bold","boldsymbol"],["infinity","infty"],["hyph.minus","\\text{-}"]]);for(let[r,e]of Fe)v.set(r,e);for(let[r,e]of Ue)E.has(r)||E.set(r,E.get(e));function R(r,e,t=0){for(let n=t;n<r.length;n++)if(r[n].eq(e))return n;return-1}function Y(r,e){for(let t of r)if(t.eq(e))return!0;return!1}function Q(r,e){let t=[],n=[];for(let s of r)s.eq(e)?(t.push(n),n=[]):n.push(s);return t.push(n),t}function me(r,e){let t=[];for(let n=0;n<r.length;n++)t.push(r[n]),n!=r.length-1&&t.push(e);return t}var c=class{constructor(e,t){this.type=e,this.value=t}eq(e){return this.type===e.type&&this.value===e.value}toString(){switch(this.type){case 2:return`\\text{${this.value}}`;case 3:return`%${this.value}`;default:return this.value}}};function Ye(r){return["{","}","%"].includes(r)?"\\"+r:r}var l=class{constructor(e,t,n,s){this.type=e,this.content=t,this.args=n,this.data=s}eq(e){return this.type===e.type&&this.content===e.content}toString(){switch(this.type){case"text":return`\\text{${this.content}}`;default:throw new Error(`toString() is not implemented for type ${this.type}`)}}serialize(){switch(this.type){case"empty":return[];case"element":{let t=this.content;return t=Ye(t),[new c(0,t)]}case"symbol":return[new c(1,this.content)];case"text":return[new c(2,this.content)];case"comment":return[new c(3,this.content)];case"whitespace":{let t=[];for(let n of this.content){let s=n===" "?4:5;t.push(new c(s,n))}return t}case"ordgroup":return this.args.map(t=>t.serialize()).flat();case"leftright":{let t=this.args.map(n=>n.serialize()).flat();return t.splice(0,0,new c(1,"\\left")),t.splice(t.length-1,0,new c(1,"\\right")),t}case"unaryFunc":{let t=[];if(t.push(new c(1,this.content)),this.content==="\\sqrt"&&this.data&&(t.push(new c(0,"[")),t=t.concat(this.data.serialize()),t.push(new c(0,"]"))),this.content==="\\operatorname"&&this.args.length===1&&this.args[0].type==="text"){let n=this.args[0].content;return t.push(new c(0,"{")),t.push(new c(1,n)),t.push(new c(0,"}")),t}return t.push(new c(0,"{")),t=t.concat(this.args[0].serialize()),t.push(new c(0,"}")),t}case"binaryFunc":{let t=[];return t.push(new c(1,this.content)),t.push(new c(0,"{")),t=t.concat(this.args[0].serialize()),t.push(new c(0,"}")),t.push(new c(0,"{")),t=t.concat(this.args[1].serialize()),t.push(new c(0,"}")),t}case"supsub":{let o=function(i){return i.type==="ordgroup"||i.type==="supsub"||i.type==="empty"?!0:!!(i.type==="element"&&/\d+(\.\d+)?/.test(i.content)&&i.content.length>1)};var e=o;let t=[],{base:n,sup:s,sub:a}=this.data;return t=t.concat(n.serialize()),a&&(t.push(new c(6,"_")),o(a)?(t.push(new c(0,"{")),t=t.concat(a.serialize()),t.push(new c(0,"}"))):t=t.concat(a.serialize())),s&&(t.push(new c(6,"^")),o(s)?(t.push(new c(0,"{")),t=t.concat(s.serialize()),t.push(new c(0,"}"))):t=t.concat(s.serialize())),t}case"control":return[new c(6,this.content)];case"beginend":{let t=[],n=this.data;t.push(new c(1,`\\begin{${this.content}}`)),t.push(new c(5,`
1
+ "use strict";(()=>{var E=new Map([["displaystyle","display"],["|","bar.v.double"],["!","#h(-math.thin.amount)"],[",","thin"],[":","med"],[";","thick"],["ln","ln"],["log","log"],["cos","cos"],["sin","sin"],["tan","tan"],["cot","cot"],["sec","sec"],["csc","csc"],["mod","mod"],["omicron","omicron"],["Xi","Xi"],["Upsilon","Upsilon"],["lim","lim"],["nonumber",""],["vec","arrow"],["neq","eq.not"],["dot","dot"],["ddot","dot.double"],["doteq","dot(eq)"],["dots","dots.h"],["vdots","dots.v"],["ddots","dots.down"],["widehat","hat"],["widetilde","tilde"],["quad","quad"],["qquad","wide"],["overbrace","overbrace"],["underbrace","underbrace"],["overline","overline"],["underline","underline"],["bar","macron"],["dbinom","binom"],["tbinom","binom"],["dfrac","frac"],["tfrac","frac"],["operatorname","op"],["boldsymbol","bold"],["mathbb","bb"],["mathbf","bold"],["mathcal","cal"],["mathit","italic"],["mathfrak","frak"],["mathrm","upright"],["mathsf","sans"],["mathtt","mono"],["rm","upright"],["pmb","bold"],["leadsto","arrow.r.squiggly"],["P","pilcrow"],["S","section"],["aleph","alef"],["infin","infinity"],["Delta","Delta"],["Gamma","Gamma"],["Lambda","Lambda"],["Omega","Omega"],["Phi","Phi"],["Pi","Pi"],["Psi","Psi"],["Sigma","Sigma"],["Theta","Theta"],["alpha","alpha"],["beta","beta"],["bigcirc","circle.big"],["bullet","bullet"],["cdot","dot.op"],["cdots","dots.c"],["checkmark","checkmark"],["chi","chi"],["circ","circle.small"],["colon","colon"],["cong","tilde.equiv"],["coprod","product.co"],["copyright","copyright"],["cup","union"],["curlyvee","or.curly"],["curlywedge","and.curly"],["dagger","dagger"],["dashv","tack.l"],["ddagger","dagger.double"],["delta","delta"],["ddots","dots.down"],["diamond","diamond"],["div","div"],["divideontimes","times.div"],["dotplus","plus.dot"],["ell","ell"],["emptyset","nothing"],["epsilon","epsilon.alt"],["equiv","equiv"],["eta","eta"],["exists","exists"],["forall","forall"],["gamma","gamma"],["ge","gt.eq"],["geq","gt.eq"],["geqslant","gt.eq.slant"],["gg","gt.double"],["hbar","planck.reduce"],["imath","dotless.i"],["iiiint","integral.quad"],["iiint","integral.triple"],["iint","integral.double"],["in","in"],["infty","infinity"],["int","integral"],["intercal","top"],["iota","iota"],["jmath","dotless.j"],["kappa","kappa"],["lambda","lambda"],["land","and"],["langle","angle.l"],["lbrace","brace.l"],["lbrack","bracket.l"],["ldots","dots.h"],["le","lt.eq"],["leftthreetimes","times.three.l"],["leftrightarrow","arrow.l.r"],["leq","lt.eq"],["leqslant","lt.eq.slant"],["lhd","triangle.l"],["ll","lt.double"],["lor","or"],["ltimes","times.l"],["measuredangle","angle.arc"],["mid","divides"],["models","models"],["mp","minus.plus"],["mu","mu"],["nabla","nabla"],["ncong","tilde.equiv.not"],["ne","eq.not"],["neg","not"],["neq","eq.not"],["nexists","exists.not"],["ni","in.rev"],["nleftarrow","arrow.l.not"],["nleq","lt.eq.not"],["nparallel","parallel.not"],["ngeq","gt.eq.not"],["nmid","divides.not"],["notin","in.not"],["nsim","tilde.not"],["nsubseteq","subset.eq.not"],["nu","nu"],["ntriangleleft","lt.tri.not"],["ntriangleright","gt.tri.not"],["odot","dot.circle"],["oint","integral.cont"],["oiint","integral.surf"],["oiiint","integral.vol"],["omega","omega"],["ominus","minus.circle"],["otimes","times.circle"],["parallel","parallel"],["partial","diff"],["perp","perp"],["phi","phi.alt"],["pi","pi"],["pm","plus.minus"],["pounds","pound"],["prec","prec"],["preceq","prec.eq"],["prime","prime"],["prod","product"],["propto","prop"],["psi","psi"],["rangle","angle.r"],["rbrace","brace.r"],["rbrack","bracket.r"],["rhd","triangle"],["rho","rho"],["rightarrow","arrow.r"],["rightthreetimes","times.three.r"],["rtimes","times.r"],["setminus","without"],["sigma","sigma"],["sim","tilde.op"],["simeq","tilde.eq"],["slash","slash"],["smallsetminus","without"],["spadesuit","suit.spade"],["sqsubseteq","subset.eq.sq"],["sqsupseteq","supset.eq.sq"],["subset","subset"],["subseteq","subset.eq"],["subsetneq","subset.neq"],["succ","succ"],["succeq","succ.eq"],["sum","sum"],["supset","supset"],["supseteq","supset.eq"],["supsetneq","supset.neq"],["tau","tau"],["theta","theta"],["times","times"],["to","arrow.r"],["top","top"],["triangle","triangle.t"],["twoheadrightarrow","arrow.r.twohead"],["upharpoonright","harpoon.tr"],["uplus","union.plus"],["upsilon","upsilon"],["varepsilon","epsilon"],["varnothing","diameter"],["varphi","phi"],["varpi","pi.alt"],["varrho","rho.alt"],["varsigma","sigma.alt"],["vartheta","theta.alt"],["vdash","tack.r"],["vdots","dots.v"],["vee","or"],["wedge","and"],["wr","wreath"],["xi","xi"],["yen","yen"],["zeta","zeta"],["mathscr","scr"],["LaTeX","#LaTeX"],["TeX","#TeX"]]),We=new Map([["acwopencirclearrow","arrow.ccw"],["adots","dots.up"],["angdnr","angle.acute"],["angle","angle"],["angles","angle.s"],["approx","approx"],["approxeq","approx.eq"],["approxident","tilde.triple"],["assert","tack.r.short"],["ast","ast.op"],["asymp","asymp"],["awint","integral.ccw"],["backcong","tilde.rev.equiv"],["backdprime","prime.double.rev"],["backprime","prime.rev"],["backsim","tilde.rev"],["backsimeq","tilde.eq.rev"],["backslash","backslash"],["backtrprime","prime.triple.rev"],["bardownharpoonleft","harpoon.bl.bar"],["bardownharpoonright","harpoon.br.bar"],["barleftarrow","arrow.l.stop"],["barleftarrowrightarrowbar","arrows.lr.stop"],["barleftharpoondown","harpoon.lb.stop"],["barleftharpoonup","harpoon.lt.stop"],["barrightharpoondown","harpoon.rb.bar"],["barrightharpoonup","harpoon.rt.bar"],["baruparrow","arrow.t.stop"],["barupharpoonleft","harpoon.tl.stop"],["barupharpoonright","harpoon.tr.stop"],["barV","tack.b.double"],["BbbA","AA"],["BbbB","BB"],["BbbC","CC"],["BbbD","DD"],["BbbE","EE"],["BbbF","FF"],["BbbG","GG"],["BbbH","HH"],["BbbI","II"],["BbbJ","JJ"],["BbbK","KK"],["BbbL","LL"],["BbbM","MM"],["BbbN","NN"],["BbbO","OO"],["BbbP","PP"],["BbbQ","QQ"],["BbbR","RR"],["BbbS","SS"],["BbbT","TT"],["BbbU","UU"],["BbbV","VV"],["BbbW","WW"],["BbbX","XX"],["BbbY","YY"],["BbbZ","ZZ"],["because","because"],["bigblacktriangledown","triangle.filled.b"],["bigblacktriangleup","triangle.filled.t"],["bigbot","tack.t.big"],["bigcap","inter.big"],["bigcup","union.big"],["bigcupdot","union.dot.big"],["biginterleave","interleave.big"],["bigodot","dot.circle.big"],["bigoplus","plus.circle.big"],["bigotimes","times.circle.big"],["bigsqcap","inter.sq.big"],["bigsqcup","union.sq.big"],["bigstar","star.filled"],["bigtimes","times.big"],["bigtop","tack.b.big"],["bigtriangledown","triangle.stroked.b"],["bigtriangleup","triangle.stroked.t"],["biguplus","union.plus.big"],["bigvee","or.big"],["bigwedge","and.big"],["bigwhitestar","star.stroked"],["blackhourglass","hourglass.filled"],["blacktriangle","triangle.filled.small.t"],["blacktriangledown","triangle.filled.small.b"],["blacktriangleleft","triangle.filled.l"],["blacktriangleright","triangle.filled.r"],["blkhorzoval","ellipse.filled.h"],["blkvertoval","ellipse.filled.v"],["bot","bot"],["boxast","ast.square"],["boxdot","dot.square"],["boxminus","minus.square"],["boxplus","plus.square"],["boxtimes","times.square"],["cap","inter"],["Cap","inter.double"],["capdot","inter.dot"],["capwedge","inter.and"],["caretinsert","caret"],["cdot","dot.op"],["cdotp","dot.c"],["checkmark","checkmark"],["circledast","ast.circle"],["circledcirc","circle.nested"],["circleddash","dash.circle"],["circledequal","eq.circle"],["circledparallel","parallel.circle"],["circledvert","bar.v.circle"],["clubsuit","suit.club.filled"],["Colon","colon.double"],["coloneq","colon.eq"],["Coloneq","colon.double.eq"],["complement","complement"],["cong","tilde.equiv"],["coprod","product.co"],["cup","union"],["Cup","union.double"],["cupdot","union.dot"],["cupleftarrow","union.arrow"],["cupvee","union.or"],["curlyeqprec","eq.prec"],["curlyeqsucc","eq.succ"],["curlyvee","or.curly"],["curlywedge","and.curly"],["curvearrowleft","arrow.ccw.half"],["curvearrowright","arrow.cw.half"],["cwopencirclearrow","arrow.cw"],["dagger","dagger"],["dashcolon","dash.colon"],["dashv","tack.l"],["Dashv","tack.l.double"],["dashVdash","tack.l.r"],["ddagger","dagger.double"],["ddddot","dot.quad"],["dddot","dot.triple"],["ddots","dots.down"],["DDownarrow","arrow.b.quad"],["Ddownarrow","arrow.b.triple"],["diameter","diameter"],["diamondcdot","diamond.stroked.dot"],["diamondsuit","suit.diamond.stroked"],["dicei","die.one"],["diceii","die.two"],["diceiii","die.three"],["diceiv","die.four"],["dicev","die.five"],["dicevi","die.six"],["div","div"],["divideontimes","times.div"],["Doteq","eq.dots"],["dotminus","minus.dot"],["dotplus","plus.dot"],["dotsim","tilde.dot"],["dottedcircle","circle.dotted"],["dottedsquare","square.stroked.dotted"],["doubleplus","plus.double"],["downarrow","arrow.b"],["Downarrow","arrow.b.double"],["downarrowbar","arrow.b.stop"],["downdasharrow","arrow.b.dashed"],["downdownarrows","arrows.bb"],["downharpoonleft","harpoon.bl"],["downharpoonleftbar","harpoon.bl.stop"],["downharpoonright","harpoon.br"],["downharpoonrightbar","harpoon.br.stop"],["downharpoonsleftright","harpoons.blbr"],["downrightcurvedarrow","arrow.b.curve"],["downuparrows","arrows.bt"],["downupharpoonsleftright","harpoons.bltr"],["downwhitearrow","arrow.b.stroked"],["downzigzagarrow","arrow.zigzag"],["dprime","prime.double"],["dualmap","multimap.double"],["eighthnote","note.eighth.alt"],["ell","ell"],["emptysetoarr","emptyset.arrow.r"],["emptysetoarrl","emptyset.arrow.l"],["emptysetobar","emptyset.bar"],["emptysetocirc","emptyset.circle"],["eparsl","parallel.slanted.eq"],["eqcolon","eq.colon"],["eqdef","eq.def"],["eqgtr","eq.gt"],["eqless","eq.lt"],["eqsim","minus.tilde"],["equal","eq"],["equalparallel","parallel.eq"],["equiv","eq.triple"],["Equiv","eq.quad"],["equivVert","parallel.equiv"],["eqvparsl","parallel.slanted.equiv"],["errbarblackcircle","errorbar.circle.filled"],["errbarblackdiamond","errorbar.diamond.filled"],["errbarblacksquare","errorbar.square.filled"],["errbarcircle","errorbar.circle.stroked"],["errbardiamond","errorbar.diamond.stroked"],["errbarsquare","errorbar.square.stroked"],["euro","euro"],["Exclam","excl.double"],["exists","exists"],["fallingdotseq","eq.dots.down"],["fint","integral.slash"],["flat","flat"],["forall","forall"],["fourvdots","fence.dotted"],["fullouterjoin","join.l.r"],["geq","gt.eq"],["geqq","gt.equiv"],["geqslant","gt.eq.slant"],["gg","gt.double"],["ggg","gt.triple"],["gggnest","gt.triple.nested"],["gnapprox","gt.napprox"],["gneq","gt.neq"],["gneqq","gt.nequiv"],["gnsim","gt.ntilde"],["greater","gt"],["gtlpar","angle.spheric.rev"],["gtrapprox","gt.approx"],["gtrdot","gt.dot"],["gtreqless","gt.eq.lt"],["gtrless","gt.lt"],["gtrsim","gt.tilde"],["heartsuit","suit.heart.stroked"],["hknearrow","arrow.tr.hook"],["hknwarrow","arrow.tl.hook"],["hksearrow","arrow.br.hook"],["hkswarrow","arrow.bl.hook"],["hookleftarrow","arrow.l.hook"],["hookrightarrow","arrow.r.hook"],["horizbar","bar.h"],["hourglass","hourglass.stroked"],["hrectangle","rect.stroked.h"],["hrectangleblack","rect.filled.h"],["hslash","planck.reduce"],["hzigzag","dash.wave.double"],["iiiint","integral.quad"],["iiint","integral.triple"],["iinfin","infinity.incomplete"],["iint","integral.double"],["Im","Im"],["imageof","image"],["in","in"],["increment","laplace"],["infty","infinity"],["int","integral"],["intbar","integral.dash"],["intBar","integral.dash.double"],["intcap","integral.inter"],["intclockwise","integral.cw"],["intcup","integral.union"],["interleave","interleave"],["intlarhk","integral.arrow.hook"],["intx","integral.times"],["Join","join"],["langle","angle.l"],["lAngle","angle.l.double"],["langledot","angle.l.dot"],["lat","lat"],["late","lat.eq"],["lbrace","brace.l"],["lBrace","brace.l.double"],["lbrack","bracket.l"],["lBrack","bracket.l.double"],["lbrbrak","shell.l"],["Lbrbrak","shell.l.double"],["lceil","ceil.l"],["lcurvyangle","angle.l.curly"],["leftarrow","arrow.l"],["Leftarrow","arrow.l.double"],["leftarrowtail","arrow.l.tail"],["leftdasharrow","arrow.l.dashed"],["leftdotarrow","arrow.l.dotted"],["leftdowncurvedarrow","arrow.l.curve"],["leftharpoondown","harpoon.lb"],["leftharpoondownbar","harpoon.lb.bar"],["leftharpoonsupdown","harpoons.ltlb"],["leftharpoonup","harpoon.lt"],["leftharpoonupbar","harpoon.lt.bar"],["leftleftarrows","arrows.ll"],["leftouterjoin","join.l"],["leftrightarrow","arrow.l.r"],["Leftrightarrow","arrow.l.r.double"],["leftrightarrows","arrows.lr"],["leftrightharpoondowndown","harpoon.lb.rb"],["leftrightharpoondownup","harpoon.lb.rt"],["leftrightharpoons","harpoons.ltrb"],["leftrightharpoonsdown","harpoons.lbrb"],["leftrightharpoonsup","harpoons.ltrt"],["leftrightharpoonupdown","harpoon.lt.rb"],["leftrightharpoonupup","harpoon.lt.rt"],["leftrightsquigarrow","arrow.l.r.wave"],["leftsquigarrow","arrow.l.squiggly"],["leftthreearrows","arrows.lll"],["leftthreetimes","times.three.l"],["leftwavearrow","arrow.l.wave"],["leftwhitearrow","arrow.l.stroked"],["leq","lt.eq"],["leqq","lt.equiv"],["leqslant","lt.eq.slant"],["less","lt"],["lessapprox","lt.approx"],["lessdot","lt.dot"],["lesseqgtr","lt.eq.gt"],["lessgtr","lt.gt"],["lesssim","lt.tilde"],["lfloor","floor.l"],["lgblkcircle","circle.filled.big"],["lgblksquare","square.filled.big"],["lgwhtcircle","circle.stroked.big"],["lgwhtsquare","square.stroked.big"],["ll","lt.double"],["llblacktriangle","triangle.filled.bl"],["LLeftarrow","arrow.l.quad"],["Lleftarrow","arrow.l.triple"],["lll","lt.triple"],["lllnest","lt.triple.nested"],["lltriangle","triangle.stroked.bl"],["lnapprox","lt.napprox"],["lneq","lt.neq"],["lneqq","lt.nequiv"],["lnsim","lt.ntilde"],["longdashv","tack.l.long"],["Longleftarrow","arrow.l.double.long"],["longleftarrow","arrow.l.long"],["Longleftrightarrow","arrow.l.r.double.long"],["longleftrightarrow","arrow.l.r.long"],["longleftsquigarrow","arrow.l.long.squiggly"],["Longmapsfrom","arrow.l.double.long.bar"],["longmapsfrom","arrow.l.long.bar"],["longmapsto","arrow.r.long.bar"],["Longmapsto","arrow.r.double.long.bar"],["Longrightarrow","arrow.r.double.long"],["longrightarrow","arrow.r.long"],["longrightsquigarrow","arrow.r.long.squiggly"],["looparrowleft","arrow.l.loop"],["looparrowright","arrow.r.loop"],["lparen","paren.l"],["lParen","paren.l.double"],["lrblacktriangle","triangle.filled.br"],["lrtriangle","triangle.stroked.br"],["ltimes","times.l"],["lvzigzag","fence.l"],["Lvzigzag","fence.l.double"],["maltese","maltese"],["mapsdown","arrow.b.bar"],["mapsfrom","arrow.l.bar"],["Mapsfrom","arrow.l.double.bar"],["mapsto","arrow.r.bar"],["Mapsto","arrow.r.double.bar"],["mapsup","arrow.t.bar"],["mathampersand","amp"],["mathatsign","at"],["mathcolon","colon"],["mathcomma","comma"],["mathdollar","dollar"],["mathexclam","excl"],["mathoctothorpe","hash"],["mathparagraph","pilcrow"],["mathpercent","percent"],["mathperiod","dot.basic"],["mathplus","plus"],["mathquestion","quest"],["mathratio","ratio"],["mathsection","section"],["mathsemicolon","semi"],["mathslash","slash"],["mathsterling","pound"],["mathyen","yen"],["mdblkdiamond","diamond.filled.medium"],["mdblklozenge","lozenge.filled.medium"],["mdblksquare","square.filled.medium"],["mdlgblkcircle","circle.filled"],["mdlgblkdiamond","diamond.filled"],["mdlgblklozenge","lozenge.filled"],["mdlgblksquare","square.filled"],["mdlgwhtcircle","circle.stroked"],["mdlgwhtdiamond","diamond.stroked"],["mdlgwhtlozenge","lozenge.stroked"],["mdlgwhtsquare","square.stroked"],["mdsmblkcircle","circle.filled.tiny"],["mdsmblksquare","square.filled.small"],["mdsmwhtcircle","circle.stroked.small"],["mdsmwhtsquare","square.stroked.small"],["mdwhtdiamond","diamond.stroked.medium"],["mdwhtlozenge","lozenge.stroked.medium"],["mdwhtsquare","square.stroked.medium"],["measeq","eq.m"],["measuredangle","angle.arc"],["measuredangleleft","angle.arc.rev"],["measuredrightangle","angle.right.arc"],["mho","Omega.inv"],["mid","divides"],["minus","minus"],["models","models"],["mp","minus.plus"],["multimap","multimap"],["nabla","gradient"],["napprox","approx.not"],["nasymp","asymp.not"],["natural","natural"],["ncong","tilde.equiv.not"],["ne","eq.not"],["nearrow","arrow.tr"],["Nearrow","arrow.tr.double"],["neg","not"],["nequiv","equiv.not"],["neswarrow","arrow.tr.bl"],["nexists","exists.not"],["ngeq","gt.eq.not"],["ngtr","gt.not"],["ngtrless","gt.lt.not"],["ngtrsim","gt.tilde.not"],["nhpar","parallel.struck"],["nhVvert","interleave.struck"],["ni","in.rev"],["nLeftarrow","arrow.l.double.not"],["nleftarrow","arrow.l.not"],["nLeftrightarrow","arrow.l.r.double.not"],["nleftrightarrow","arrow.l.r.not"],["nleq","lt.eq.not"],["nless","lt.not"],["nlessgtr","lt.gt.not"],["nlesssim","lt.tilde.not"],["nmid","divides.not"],["nni","in.rev.not"],["notin","in.not"],["nparallel","parallel.not"],["nprec","prec.not"],["npreccurlyeq","prec.curly.eq.not"],["nRightarrow","arrow.r.double.not"],["nrightarrow","arrow.r.not"],["nsim","tilde.not"],["nsimeq","tilde.eq.not"],["nsqsubseteq","subset.eq.sq.not"],["nsqsupseteq","supset.eq.sq.not"],["nsubset","subset.not"],["nsubseteq","subset.eq.not"],["nsucc","succ.not"],["nsucccurlyeq","succ.curly.eq.not"],["nsupset","supset.not"],["nsupseteq","supset.eq.not"],["ntrianglelefteq","lt.tri.eq.not"],["ntrianglerighteq","gt.tri.eq.not"],["nvartriangleleft","lt.tri.not"],["nvartriangleright","gt.tri.not"],["nVdash","forces.not"],["nvdash","tack.r.not"],["nvDash","tack.r.double.not"],["nvinfty","infinity.bar"],["nwarrow","arrow.tl"],["Nwarrow","arrow.tl.double"],["nwsearrow","arrow.tl.br"],["obrbrak","shell.t"],["obslash","backslash.circle"],["odiv","div.circle"],["odot","dot.circle"],["ogreaterthan","gt.circle"],["oiiint","integral.vol"],["oiint","integral.surf"],["oint","integral.cont"],["ointctrclockwise","integral.cont.ccw"],["olessthan","lt.circle"],["ominus","minus.circle"],["operp","perp.circle"],["oplus","plus.circle"],["origof","original"],["otimes","times.circle"],["overbracket","bracket.t"],["overparen","paren.t"],["parallel","parallel"],["parallelogram","parallelogram.stroked"],["parallelogramblack","parallelogram.filled"],["parsim","parallel.tilde"],["partial","diff"],["pentagon","penta.stroked"],["pentagonblack","penta.filled"],["perp","perp"],["Planckconst","planck"],["pm","plus.minus"],["prec","prec"],["Prec","prec.double"],["precapprox","prec.approx"],["preccurlyeq","prec.curly.eq"],["preceq","prec.eq"],["preceqq","prec.equiv"],["precnapprox","prec.napprox"],["precneq","prec.neq"],["precneqq","prec.nequiv"],["precnsim","prec.ntilde"],["precsim","prec.tilde"],["prime","prime"],["prod","product"],["propto","prop"],["QED","qed"],["qprime","prime.quad"],["quarternote","note.quarter.alt"],["questeq","eq.quest"],["Question","quest.double"],["rangle","angle.r"],["rAngle","angle.r.double"],["rangledot","angle.r.dot"],["rbrace","brace.r"],["rBrace","brace.r.double"],["rbrack","bracket.r"],["rBrack","bracket.r.double"],["rbrbrak","shell.r"],["Rbrbrak","shell.r.double"],["rceil","ceil.r"],["rcurvyangle","angle.r.curly"],["Re","Re"],["revangle","angle.rev"],["revemptyset","emptyset.rev"],["revnmid","divides.not.rev"],["rfloor","floor.r"],["rightangle","angle.right"],["rightanglemdot","angle.right.dot"],["rightanglesqr","angle.right.sq"],["rightarrow","arrow.r"],["Rightarrow","arrow.r.double"],["rightarrowbar","arrow.r.stop"],["rightarrowonoplus","plus.circle.arrow"],["rightarrowtail","arrow.r.tail"],["rightdasharrow","arrow.r.dashed"],["rightdotarrow","arrow.r.dotted"],["rightdowncurvedarrow","arrow.r.curve"],["rightharpoondown","harpoon.rb"],["rightharpoondownbar","harpoon.rb.stop"],["rightharpoonsupdown","harpoons.rtrb"],["rightharpoonup","harpoon.rt"],["rightharpoonupbar","harpoon.rt.stop"],["rightleftarrows","arrows.rl"],["rightleftharpoons","harpoons.rtlb"],["rightleftharpoonsdown","harpoons.rblb"],["rightleftharpoonsup","harpoons.rtlt"],["rightouterjoin","join.r"],["rightrightarrows","arrows.rr"],["rightsquigarrow","arrow.r.squiggly"],["rightthreearrows","arrows.rrr"],["rightthreetimes","times.three.r"],["rightwavearrow","arrow.r.wave"],["rightwhitearrow","arrow.r.stroked"],["risingdotseq","eq.dots.up"],["rparen","paren.r"],["rParen","paren.r.double"],["RRightarrow","arrow.r.quad"],["Rrightarrow","arrow.r.triple"],["rsolbar","backslash.not"],["rtimes","times.r"],["rvzigzag","fence.r"],["Rvzigzag","fence.r.double"],["searrow","arrow.br"],["Searrow","arrow.br.double"],["setminus","without"],["sharp","sharp"],["shortdowntack","tack.b.short"],["shortlefttack","tack.l.short"],["shortuptack","tack.t.short"],["sim","tilde.op"],["sime","tilde.eq"],["similarleftarrow","arrow.l.tilde"],["similarrightarrow","arrow.r.tilde"],["simneqq","tilde.nequiv"],["smallblacktriangleleft","triangle.filled.small.l"],["smallblacktriangleright","triangle.filled.small.r"],["smallin","in.small"],["smallni","in.rev.small"],["smalltriangleleft","triangle.stroked.small.l"],["smalltriangleright","triangle.stroked.small.r"],["smashtimes","smash"],["smblkcircle","bullet"],["smblkdiamond","diamond.filled.small"],["smblklozenge","lozenge.filled.small"],["smblksquare","square.filled.tiny"],["smeparsl","parallel.slanted.eq.tilde"],["smt","smt"],["smte","smt.eq"],["smwhtdiamond","diamond.stroked.small"],["smwhtlozenge","lozenge.stroked.small"],["smwhtsquare","square.stroked.tiny"],["spadesuit","suit.spade.filled"],["sphericalangle","angle.spheric"],["sphericalangleup","angle.spheric.top"],["sqcap","inter.sq"],["Sqcap","inter.sq.double"],["sqcup","union.sq"],["Sqcup","union.sq.double"],["sqint","integral.square"],["sqsubset","subset.sq"],["sqsubseteq","subset.eq.sq"],["sqsubsetneq","subset.sq.neq"],["sqsupset","supset.sq"],["sqsupseteq","supset.eq.sq"],["sqsupsetneq","supset.sq.neq"],["squoval","square.stroked.rounded"],["sslash","slash.double"],["star","star.op"],["stareq","eq.star"],["subset","subset"],["Subset","subset.double"],["subsetdot","subset.dot"],["subseteq","subset.eq"],["subsetneq","subset.neq"],["succ","succ"],["Succ","succ.double"],["succapprox","succ.approx"],["succcurlyeq","succ.curly.eq"],["succeq","succ.eq"],["succeqq","succ.equiv"],["succnapprox","succ.napprox"],["succneq","succ.neq"],["succneqq","succ.nequiv"],["succnsim","succ.ntilde"],["succsim","succ.tilde"],["sum","sum"],["sumint","sum.integral"],["supset","supset"],["Supset","supset.double"],["supsetdot","supset.dot"],["supseteq","supset.eq"],["supsetneq","supset.neq"],["swarrow","arrow.bl"],["Swarrow","arrow.bl.double"],["therefore","therefore"],["threedangle","angle.spatial"],["threedotcolon","colon.tri.op"],["tieinfty","infinity.tie"],["times","times"],["tminus","miny"],["top","tack.b"],["tplus","tiny"],["trianglecdot","triangle.stroked.dot"],["triangledown","triangle.stroked.small.b"],["triangleleft","triangle.stroked.l"],["trianglelefteq","lt.tri.eq"],["triangleminus","minus.triangle"],["triangleplus","plus.triangle"],["triangleq","eq.delta"],["triangleright","triangle.stroked.r"],["trianglerighteq","gt.tri.eq"],["triangletimes","times.triangle"],["tripleplus","plus.triple"],["trprime","prime.triple"],["trslash","slash.triple"],["twoheaddownarrow","arrow.b.twohead"],["twoheadleftarrow","arrow.l.twohead"],["twoheadmapsfrom","arrow.l.twohead.bar"],["twoheadmapsto","arrow.r.twohead.bar"],["twoheadrightarrow","arrow.r.twohead"],["twoheaduparrow","arrow.t.twohead"],["twonotes","note.eighth.beamed"],["ubrbrak","shell.b"],["ulblacktriangle","triangle.filled.tl"],["ultriangle","triangle.stroked.tl"],["uminus","union.minus"],["underbrace","brace.b"],["underbracket","bracket.b"],["underparen","paren.b"],["unicodecdots","dots.h.c"],["unicodeellipsis","dots.h"],["upand","amp.inv"],["uparrow","arrow.t"],["Uparrow","arrow.t.double"],["updasharrow","arrow.t.dashed"],["updownarrow","arrow.t.b"],["Updownarrow","arrow.t.b.double"],["updownarrows","arrows.tb"],["updownharpoonleftleft","harpoon.tl.bl"],["updownharpoonleftright","harpoon.tl.br"],["updownharpoonrightleft","harpoon.tr.bl"],["updownharpoonrightright","harpoon.tr.br"],["updownharpoonsleftright","harpoons.tlbr"],["upharpoonleft","harpoon.tl"],["upharpoonleftbar","harpoon.tl.bar"],["upharpoonright","harpoon.tr"],["upharpoonrightbar","harpoon.tr.bar"],["upharpoonsleftright","harpoons.tltr"],["uplus","union.plus"],["uprightcurvearrow","arrow.t.curve"],["upuparrows","arrows.tt"],["upwhitearrow","arrow.t.stroked"],["urblacktriangle","triangle.filled.tr"],["urtriangle","triangle.stroked.tr"],["UUparrow","arrow.t.quad"],["Uuparrow","arrow.t.triple"],["varclubsuit","suit.club.stroked"],["vardiamondsuit","suit.diamond.filled"],["varheartsuit","suit.heart.filled"],["varhexagon","hexa.stroked"],["varhexagonblack","hexa.filled"],["varnothing","emptyset"],["varointclockwise","integral.cont.cw"],["varspadesuit","suit.spade.stroked"],["vartriangle","triangle.stroked.small.t"],["vartriangleleft","lt.tri"],["vartriangleright","gt.tri"],["Vbar","tack.t.double"],["Vdash","forces"],["vdash","tack.r"],["vDash","tack.r.double"],["vdots","dots.v"],["vee","or"],["Vee","or.double"],["veedot","or.dot"],["veeeq","eq.equi"],["vert","bar.v"],["Vert","bar.v.double"],["vlongdash","tack.r.long"],["vrectangle","rect.stroked.v"],["vrectangleblack","rect.filled.v"],["Vvert","bar.v.triple"],["vysmblkcircle","circle.filled.small"],["vysmwhtcircle","circle.stroked.tiny"],["wedge","and"],["Wedge","and.double"],["wedgedot","and.dot"],["wedgeq","eq.est"],["whiteinwhitetriangle","triangle.stroked.nested"],["whthorzoval","ellipse.stroked.h"],["whtvertoval","ellipse.stroked.v"],["wideangledown","angle.oblique"],["wr","wreath"],["xsol","slash.big"]]),Ue=new Map([["gets","leftarrow"],["iff","Longleftrightarrow"],["implies","Longrightarrow"]]);for(let[r,e]of We)E.has(r)||E.set(r,e);var v=new Map;for(let[r,e]of Array.from(E.entries()).reverse())v.set(e,r);v.set("dif","mathrm{d}");v.set("oo","infty");var Fe=new Map([["top","top"],["frac","frac"],["tilde","tilde"],["hat","hat"],["upright","mathrm"],["bold","boldsymbol"],["infinity","infty"],["hyph.minus","\\text{-}"]]);for(let[r,e]of Fe)v.set(r,e);for(let[r,e]of Ue)E.has(r)||E.set(r,E.get(e));function R(r,e,t=0){for(let n=t;n<r.length;n++)if(r[n].eq(e))return n;return-1}function $(r,e){for(let t of r)if(t.eq(e))return!0;return!1}function Q(r,e){let t=[],n=[];for(let s of r)s.eq(e)?(t.push(n),n=[]):n.push(s);return t.push(n),t}function me(r,e){let t=[];for(let n=0;n<r.length;n++)t.push(r[n]),n!=r.length-1&&t.push(e);return t}var c=class{constructor(e,t){this.type=e,this.value=t}eq(e){return this.type===e.type&&this.value===e.value}toString(){switch(this.type){case 2:return`\\text{${this.value}}`;case 3:return`%${this.value}`;default:return this.value}}};function $e(r){return["{","}","%"].includes(r)?"\\"+r:r}var u=class{constructor(e,t,n,s){this.type=e,this.content=t,this.args=n,this.data=s}eq(e){return this.type===e.type&&this.content===e.content}toString(){switch(this.type){case"text":return`\\text{${this.content}}`;default:throw new Error(`toString() is not implemented for type ${this.type}`)}}serialize(){switch(this.type){case"empty":return[];case"element":{let t=this.content;return t=$e(t),[new c(0,t)]}case"symbol":return[new c(1,this.content)];case"text":return[new c(2,this.content)];case"comment":return[new c(3,this.content)];case"whitespace":{let t=[];for(let n of this.content){let s=n===" "?4:5;t.push(new c(s,n))}return t}case"ordgroup":return this.args.map(t=>t.serialize()).flat();case"leftright":{let t=this.args.map(n=>n.serialize()).flat();return t.splice(0,0,new c(1,"\\left")),t.splice(t.length-1,0,new c(1,"\\right")),t}case"unaryFunc":{let t=[];if(t.push(new c(1,this.content)),this.content==="\\sqrt"&&this.data&&(t.push(new c(0,"[")),t=t.concat(this.data.serialize()),t.push(new c(0,"]"))),this.content==="\\operatorname"&&this.args.length===1&&this.args[0].type==="text"){let n=this.args[0].content;return t.push(new c(0,"{")),t.push(new c(1,n)),t.push(new c(0,"}")),t}return t.push(new c(0,"{")),t=t.concat(this.args[0].serialize()),t.push(new c(0,"}")),t}case"binaryFunc":{let t=[];return t.push(new c(1,this.content)),t.push(new c(0,"{")),t=t.concat(this.args[0].serialize()),t.push(new c(0,"}")),t.push(new c(0,"{")),t=t.concat(this.args[1].serialize()),t.push(new c(0,"}")),t}case"supsub":{let o=function(i){return i.type==="ordgroup"||i.type==="supsub"||i.type==="empty"?!0:!!(i.type==="element"&&/\d+(\.\d+)?/.test(i.content)&&i.content.length>1)};var e=o;let t=[],{base:n,sup:s,sub:a}=this.data;return t=t.concat(n.serialize()),a&&(t.push(new c(6,"_")),o(a)?(t.push(new c(0,"{")),t=t.concat(a.serialize()),t.push(new c(0,"}"))):t=t.concat(a.serialize())),s&&(t.push(new c(6,"^")),o(s)?(t.push(new c(0,"{")),t=t.concat(s.serialize()),t.push(new c(0,"}"))):t=t.concat(s.serialize())),t}case"control":return[new c(6,this.content)];case"beginend":{let t=[],n=this.data;t.push(new c(1,`\\begin{${this.content}}`)),t.push(new c(5,`
2
2
  `));for(let s=0;s<n.length;s++){let a=n[s];for(let o=0;o<a.length;o++){let i=a[o];t=t.concat(i.serialize()),o!==a.length-1&&t.push(new c(6,"&"))}s!==n.length-1&&t.push(new c(6,"\\\\"))}return t.push(new c(5,`
3
- `)),t.push(new c(1,`\\end{${this.content}}`)),t}default:throw new Error("[TexNode.serialize] Unimplemented type: "+this.type)}}};var p=class{constructor(e,t){this.type=e,this.value=t}eq(e){return this.type===e.type&&this.value===e.value}isOneOf(e){return Y(e,this)}toNode(){switch(this.type){case 0:return new u("none","#none");case 3:return new u("text",this.value);case 4:return new u("comment",this.value);case 5:case 7:return new u("whitespace",this.value);case 2:return new u("atom",this.value);case 1:return new u("symbol",this.value);case 6:{let e=this.value;switch(e){case"":case"_":case"^":throw new Error(`Should not convert ${e} to a node`);case"&":return new u("control","&");case"\\":return new u("control","\\");default:throw new Error(`Unexpected control character ${e}`)}}default:throw new Error(`Unexpected token type ${this.type}`)}}toString(){switch(this.type){case 3:return`"${this.value}"`;case 4:return`//${this.value}`;default:return this.value}}},u=class{constructor(e,t,n,s){this.type=e,this.content=t,this.args=n,this.data=s}setOptions(e){this.options=e}eq(e){return this.type===e.type&&this.content===e.content}isOverHigh(){switch(this.type){case"fraction":return!0;case"funcCall":return this.content==="frac"?!0:this.args.some(e=>e.isOverHigh());case"group":return this.args.some(e=>e.isOverHigh());case"supsub":return this.data.base.isOverHigh();case"align":case"cases":case"matrix":return!0;default:return!1}}},L=new u("none","#none");function we(r){return"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".includes(r)}function w(r,e=""){if(!r)throw new Error(e)}var be={};function $e(r,e){return e.len!==r.len?e.len-r.len:r.index-e.index}var J=class{constructor(e,t){this._pos=0;this._line=0;this._col=0;this._offset=0;this._less=null;this._go=!1;this._newstate=null;this._text=null;this._leng=null;this._input=e,this._lexer=t,this._state=t.states[0]}text(){return this._text}leng(){return this._leng}pos(){return this._pos}line(){return this._line}column(){return this._col}input(){return this._input.charAt(this._pos+this._leng+this._offset++)}unput(){return this._offset=this._offset>0?this._offset--:0}less(e){return this._less=e,this._offset=0,this._text=this._text.substring(0,e),this._leng=this._text.length}pushback(e){return this.less(this._leng-e)}reject(){this._go=!0}begin(e){if(this._lexer.specification[e])return this._newstate=e;let t=this._lexer.states[parseInt(e)];if(t)return this._newstate=t;throw"Unknown state '"+e+"' requested"}state(){return this._state}scan(){if(this._pos>=this._input.length)return be;let e=this._input.substring(this._pos),t=this._lexer.specification[this._state],n=[];for(let g=0;g<t.length;g++){let d=t[g],m=e.match(d.re);m!==null&&m[0].length>0&&n.push({index:g,text:m[0],len:m[0].length,rule:d})}if(n.length===0)throw new Error("No match found for input '"+e+"'");n.sort($e),this._go=!0;let s,a;for(let g=0,d=n.length;g<d&&this._go;g++)if(this._offset=0,this._less=null,this._go=!1,this._newstate=null,a=n[g],this._text=a.text,this._leng=a.len,s=a.rule.action(this),this._newstate&&this._newstate!=this._state){this._state=this._newstate;break}let o=this._less===null?a.text:a.text.substring(0,this._less),i=o.length;this._pos+=i+this._offset;let h=o.match(/\n/g);return h!==null?(this._line+=h.length,this._col=i-o.lastIndexOf(`
4
- `)-1):this._col+=i,s}},C=class{constructor(e){this.states=Object.keys(e),this.specification={};for(let t of this.states){let n=e[t];if(t in this.specification)throw"Duplicate state declaration encountered for state '"+t+"'";this.specification[t]=[];for(let[s,a]of n.entries()){let o;try{o=new RegExp("^"+s)}catch(i){throw"Invalid regexp '"+s+"' in state '"+t+"' ("+i.message+")"}this.specification[t].push({re:o,action:a})}}}scanner(e){return new J(e,this)}lex(e,t){let n=this.scanner(e);for(;;){let s=n.scan();if(s===be)return;s!==void 0&&t(s)}}collect(e){let t=[],n=function(s){Array.isArray(s)?t.push(...s):t.push(s)};return this.lex(e,n),t}};var ee=["sqrt","text","bar","bold","boldsymbol","ddot","dot","hat","mathbb","mathbf","mathcal","mathfrak","mathit","mathrm","mathscr","mathsf","mathtt","operatorname","overbrace","overline","pmb","rm","tilde","underbrace","underline","vec","widehat","widetilde","overleftarrow","overrightarrow","hspace"],te=["frac","tfrac","binom","dbinom","dfrac","tbinom","overset","underset"];function Ge(r){let e=["{","}","\\","$","&","#","_","%"];for(let t of e)r=r.replaceAll("\\"+t,t);return r}var Xe=new Map([[String.raw`\\(text|operatorname|begin|end|hspace){.+?}`,r=>{let e=r.text(),t=e.substring(0,e.indexOf("{")),n=e.substring(e.indexOf("{")+1,e.lastIndexOf("}"));return[new c(1,t),new c(6,"{"),new c(2,Ge(n)),new c(6,"}")]}],[String.raw`%[^\n]*`,r=>new c(3,r.text().substring(1))],[String.raw`[{}_^&]`,r=>new c(6,r.text())],[String.raw`\\[\\,:;! ]`,r=>new c(6,r.text())],[String.raw`\r?\n`,r=>new c(5,`
5
- `)],[String.raw`\s+`,r=>new c(4,r.text())],[String.raw`\\[{}%$&#_|]`,r=>new c(0,r.text())],[String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`,r=>{let e=r.text(),t=RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`),n=e.match(t);w(n!==null);let s=n[1];if(te.includes(s.substring(1))){let a=n[2].trimStart(),o=n[3];return[new c(1,s),new c(0,a),new c(0,o)]}else return r.reject(),[]}],[String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`,r=>{let e=r.text(),t=RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`),n=e.match(t);w(n!==null);let s=n[1];if(ee.includes(s.substring(1))){let a=n[2].trimStart();return[new c(1,s),new c(0,a)]}else return r.reject(),[]}],[String.raw`\\[a-zA-Z]+`,r=>{let e=r.text();return[new c(1,e)]}],[String.raw`[0-9]+(\.[0-9]+)?`,r=>new c(0,r.text())],[String.raw`[a-zA-Z]`,r=>new c(0,r.text())],[String.raw`[+\-*/='<>!.,;:?()\[\]|]`,r=>new c(0,r.text())],[String.raw`[^\x00-\x7F]`,r=>new c(0,r.text())],[String.raw`.`,r=>new c(7,r.text())]]),He={start:Xe};function re(r){return new C(He).collect(r)}var Ve=["bigl","bigr","biggl","biggr","Bigl","Bigr","Biggl","Biggr"],Te=new l("empty","");function je(r){return ee.includes(r)?1:te.includes(r)?2:0}var P=new c(6,"{"),$=new c(6,"}"),ye=new c(0,"["),Ze=new c(0,"]");function ne(r,e){let t=e;for(;t<r.length&&[4,5].includes(r[t].type);)t++;return r.slice(e,t)}function xe(r,e){let t=r[e];return t.type===0&&["(",")","[","]","|","\\{","\\}",".","\\|"].includes(t.value)||t.type===1&&["lfloor","rfloor","lceil","rceil","langle","rangle"].includes(t.value.slice(1))?t:null}function B(r,e){let t=e;for(;t<r.length&&r[t].eq(new c(0,"'"));)t+=1;return t-e}function G(r,e,t,n){w(r[e].eq(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)return-1;r[a].eq(t)?s+=1:r[a].eq(n)&&(s-=1),a+=1}return a-1}var se=new c(1,"\\left"),Ke=new c(1,"\\right");function Qe(r,e){return G(r,e,se,Ke)}var ae=new c(1,"\\begin"),Je=new c(1,"\\end");function et(r,e){return G(r,e,ae,Je)}var f=class extends Error{constructor(e){super(e),this.name="LatexParserError"}},oe=new c(6,"_"),ie=new c(6,"^"),le=class{constructor(e=!1,t=!0){this.space_sensitive=e,this.newline_sensitive=t}parse(e){let t=R(e,new c(1,"\\displaystyle"));if(t===-1){let[n,s]=this.parseGroup(e,0,e.length);return n}else if(t===0){let[n,s]=this.parseGroup(e,1,e.length);return new l("unaryFunc","\\displaystyle",[n])}else{let[n,s]=this.parseGroup(e,0,t),[a,o]=this.parseGroup(e,t+1,e.length),i=new l("unaryFunc","\\displaystyle",[a]);return new l("ordgroup","",[n,i])}}parseGroup(e,t,n){let s=[],a=t;for(;a<n;){let[i,h]=this.parseNextExpr(e,a);if(a=h,!(i.type==="whitespace"&&(!this.space_sensitive&&i.content.replace(/ /g,"").length===0||!this.newline_sensitive&&i.content===`
6
- `))){if(i.type==="control"&&i.content==="&")throw new f("Unexpected & outside of an alignment");s.push(i)}}let o;return s.length===1?o=s[0]:o=new l("ordgroup","",s),[o,n+1]}parseNextExpr(e,t){let[n,s]=this.parseNextExprWithoutSupSub(e,t),a=null,o=null,i=0;if(i+=B(e,s),s+=i,s<e.length&&e[s].eq(oe)){if([a,s]=this.parseNextExprWithoutSupSub(e,s+1),i+=B(e,s),s+=i,s<e.length&&e[s].eq(ie)&&([o,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0))throw new f("Double superscript")}else if(s<e.length&&e[s].eq(ie)){if([o,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0)throw new f("Double superscript");if(s<e.length&&e[s].eq(oe)&&([a,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0))throw new f("Double superscript")}if(a!==null||o!==null||i>0){let h={base:n};if(a&&(h.sub=a),i>0){h.sup=new l("ordgroup","",[]);for(let g=0;g<i;g++)h.sup.args.push(new l("element","'"));o&&h.sup.args.push(o),h.sup.args.length===1&&(h.sup=h.sup.args[0])}else o&&(h.sup=o);return[new l("supsub","",[],h),s]}else return[n,s]}parseNextExprWithoutSupSub(e,t){if(t>=e.length)return[Te,t];let n=e[t];switch(n.type){case 0:return[new l("element",n.value),t+1];case 2:return[new l("text",n.value),t+1];case 3:return[new l("comment",n.value),t+1];case 4:case 5:return[new l("whitespace",n.value),t+1];case 1:let s=n.value.slice(1);return Ve.includes(s)?this.parseNextExprWithoutSupSub(e,t+1):n.eq(ae)?this.parseBeginEndExpr(e,t):n.eq(se)?this.parseLeftRightExpr(e,t):this.parseCommandExpr(e,t);case 6:let a=n.value;switch(a){case"{":let o=G(e,t,P,$);if(o===-1)throw new f("Unmatched '{'");return this.parseGroup(e,t+1,o);case"}":throw new f("Unmatched '}'");case"\\\\":case"\\!":case"\\,":case"\\:":case"\\;":return[new l("control",a),t+1];case"\\ ":return[new l("control","\\:"),t+1];case"_":case"^":return[Te,t];case"&":return[new l("control","&"),t+1];default:throw new f("Unknown control sequence")}default:throw new f("Unknown token type")}}parseCommandExpr(e,t){w(e[t].type===1);let n=e[t].value,s=t+1;if(["left","right","begin","end"].includes(n.slice(1)))throw new f("Unexpected command: "+n);switch(je(n.slice(1))){case 0:return E.has(n.slice(1))?[new l("symbol",n),s]:[new l("unknownMacro",n),s];case 1:{if(s>=e.length)throw new f("Expecting argument for "+n);if(n==="\\sqrt"&&s<e.length&&e[s].eq(ye)){let h=s,g=G(e,s,ye,Ze);if(g===-1)throw new f("No matching right square bracket for [");let[d,m]=this.parseGroup(e,h+1,g),[y,x]=this.parseNextArg(e,g+1);return[new l("unaryFunc",n,[y],d),x]}else if(n==="\\text"){if(s+2>=e.length)throw new f("Expecting content for \\text command");w(e[s].eq(P)),w(e[s+1].type===2),w(e[s+2].eq($));let h=e[s+1].value;return[new l("text",h),s+3]}let[o,i]=this.parseNextArg(e,s);return[new l("unaryFunc",n,[o]),i]}case 2:{let[o,i]=this.parseNextArg(e,s),[h,g]=this.parseNextArg(e,i);return[new l("binaryFunc",n,[o,h]),g]}default:throw new Error("Invalid number of parameters")}}parseNextArg(e,t){let n=t,s=null;for(;n<e.length;){let a;if([a,n]=this.parseNextExprWithoutSupSub(e,n),a.type!=="whitespace"){s=a;break}}if(s===null)throw new f("Expecting argument but token stream ended");return[s,n]}parseLeftRightExpr(e,t){w(e[t].eq(se));let n=t+1;if(n+=ne(e,n).length,n>=e.length)throw new f("Expecting delimiter after \\left");let s=xe(e,n);if(s===null)throw new f("Invalid delimiter after \\left");n++;let a=n,o=Qe(e,t);if(o===-1)throw new f("No matching \\right");let i=o;if(n=o+1,n+=ne(e,n).length,n>=e.length)throw new f("Expecting \\right after \\left");let h=xe(e,n);if(h===null)throw new f("Invalid delimiter after \\right");n++;let[g,d]=this.parseGroup(e,a,i),m=[new l("element",s.value),g,new l("element",h.value)];return[new l("leftright","",m),n]}parseBeginEndExpr(e,t){w(e[t].eq(ae));let n=t+1;w(e[n].eq(P)),w(e[n+1].type===2),w(e[n+2].eq($));let s=e[n+1].value;n+=3;let a=[];for(;n<e.length;){let y=ne(e,n).length;if(n+=y,n>=e.length||!e[n].eq(P))break;let[x,q]=this.parseNextArg(e,n);a.push(x),n=q}let o=n,i=et(e,t);if(i===-1)throw new f("No matching \\end");let h=i;if(n=i+1,w(e[n].eq(P)),w(e[n+1].type===2),w(e[n+2].eq($)),e[n+1].value!==s)throw new f("Mismatched \\begin and \\end environments");n+=3;let g=e.slice(o,h);for(;g.length>0&&[4,5].includes(g[g.length-1].type);)g.pop();let d=this.parseAligned(g);return[new l("beginend",s,a,d),n]}parseAligned(e){let t=0,n=[],s=[];n.push(s);let a=new l("ordgroup","",[]);for(s.push(a);t<e.length;){let[o,i]=this.parseNextExpr(e,t);t=i,!(o.type==="whitespace"&&(!this.space_sensitive&&o.content.replace(/ /g,"").length===0||!this.newline_sensitive&&o.content===`
7
- `))&&(o.type==="control"&&o.content==="\\\\"?(s=[],a=new l("ordgroup","",[]),s.push(a),n.push(s)):o.type==="control"&&o.content==="&"?(a=new l("ordgroup","",[]),s.push(a)):a.args.push(o))}return n}};function tt(r){let e=n=>n.eq(oe)||n.eq(ie),t=[];for(let n=0;n<r.length;n++)r[n].type===4&&n+1<r.length&&e(r[n+1])||r[n].type===4&&n-1>=0&&e(r[n-1])||t.push(r[n]);return t}function rt(r,e){let t=[];for(let n of r)if(n.type===1&&e[n.value]){let s=re(e[n.value]);t=t.concat(s)}else t.push(n);return t}function qe(r,e){let t=new le,n=re(r);return n=tt(n),n=rt(n,e),t.parse(n)}var z=new Map([["arrow.l.r.double.long","<==>"],["arrow.l.r.long","<-->"],["arrow.r.bar","|->"],["arrow.r.double.bar","|=>"],["arrow.r.double.long","==>"],["arrow.r.long","-->"],["arrow.r.long.squiggly","~~>"],["arrow.r.tail",">->"],["arrow.r.twohead","->>"],["arrow.l.double.long","<=="],["arrow.l.long","<--"],["arrow.l.long.squiggly","<~~"],["arrow.l.tail","<-<"],["arrow.l.twohead","<<-"],["arrow.l.r","<->"],["arrow.l.r.double","<=>"],["colon.double.eq","::="],["dots.h","..."],["gt.triple",">>>"],["lt.triple","<<<"],["arrow.r","->"],["arrow.r.double","=>"],["arrow.r.squiggly","~>"],["arrow.l","<-"],["arrow.l.squiggly","<~"],["bar.v.double","||"],["bracket.l.double","[|"],["bracket.r.double","|]"],["colon.eq",":="],["eq.colon","=:"],["eq.not","!="],["gt.double",">>"],["gt.eq",">="],["lt.double","<<"],["lt.eq","<="],["ast.op","*"],["minus","-"],["tilde.op","~"]]),X=new Map;for(let[r,e]of z.entries())e.length>1&&X.set(e,r);function Ee(r){return r.type==="atom"&&["(",")","[","]","{","}","|","\u230A","\u230B","\u2308","\u2309"].includes(r.content)}var I=new p(2,"("),W=new p(2,")"),nt=new p(2,","),Ne=new p(1,`
8
- `),ue=new p(6," ");function ce(r){switch(typeof r){case"string":return`"${r}"`;case"number":return r.toString();case"boolean":return r?"#true":"#false";default:return w(r instanceof u,"Not a valid primitive value"),r.content}}var N=class extends Error{constructor(e,t){super(e),this.name="TypstWriterError",this.node=t}},H=class{constructor(e){this.buffer="";this.queue=[];this.insideFunctionDepth=0;this.nonStrict=e.nonStrict,this.preferShorthands=e.preferShorthands,this.keepSpaces=e.keepSpaces,this.inftyToOo=e.inftyToOo,this.optimize=e.optimize}writeBuffer(e){let t=e.toString();if(t==="")return;let n=!1;n||=/[\(\[\|]$/.test(this.buffer)&&/^\w/.test(t),n||=/^[})\]\|]$/.test(t),n||=/[^=]$/.test(this.buffer)&&t==="(",n||=/^[_^,;!]$/.test(t),n||=t==="'",n||=/[\(\[{]\s*(-|\+)$/.test(this.buffer)||this.buffer==="-"||this.buffer==="+",n||=t.startsWith(`
3
+ `)),t.push(new c(1,`\\end{${this.content}}`)),t}default:throw new Error("[TexNode.serialize] Unimplemented type: "+this.type)}}};var p=class{constructor(e,t){this.type=e,this.value=t}eq(e){return this.type===e.type&&this.value===e.value}isOneOf(e){return $(e,this)}toNode(){switch(this.type){case 0:return new l("none","#none");case 3:return new l("text",this.value);case 4:return new l("comment",this.value);case 5:case 7:return new l("whitespace",this.value);case 2:return new l("atom",this.value);case 1:return new l("symbol",this.value);case 6:{let e=this.value;switch(e){case"":case"_":case"^":throw new Error(`Should not convert ${e} to a node`);case"&":return new l("control","&");case"\\":return new l("control","\\");default:throw new Error(`Unexpected control character ${e}`)}}default:throw new Error(`Unexpected token type ${this.type}`)}}toString(){switch(this.type){case 3:return`"${this.value}"`;case 4:return`//${this.value}`;default:return this.value}}},l=class{constructor(e,t,n,s){this.type=e,this.content=t,this.args=n,this.data=s}setOptions(e){this.options=e}eq(e){return this.type===e.type&&this.content===e.content}isOverHigh(){switch(this.type){case"fraction":return!0;case"funcCall":return this.content==="frac"?!0:this.args.some(e=>e.isOverHigh());case"group":return this.args.some(e=>e.isOverHigh());case"supsub":return this.data.base.isOverHigh();case"align":case"cases":case"matrix":return!0;default:return!1}}},L=new l("none","#none");function we(r){return"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".includes(r)}function w(r,e=""){if(!r)throw new Error(e)}var be={};function Ye(r,e){return e.len!==r.len?e.len-r.len:r.index-e.index}var J=class{constructor(e,t){this._pos=0;this._line=0;this._col=0;this._offset=0;this._less=null;this._go=!1;this._newstate=null;this._text=null;this._leng=null;this._input=e,this._lexer=t,this._state=t.states[0]}text(){return this._text}leng(){return this._leng}pos(){return this._pos}line(){return this._line}column(){return this._col}input(){return this._input.charAt(this._pos+this._leng+this._offset++)}unput(){return this._offset=this._offset>0?this._offset--:0}less(e){return this._less=e,this._offset=0,this._text=this._text.substring(0,e),this._leng=this._text.length}pushback(e){return this.less(this._leng-e)}reject(){this._go=!0}begin(e){if(this._lexer.specification[e])return this._newstate=e;let t=this._lexer.states[parseInt(e)];if(t)return this._newstate=t;throw"Unknown state '"+e+"' requested"}state(){return this._state}scan(){if(this._pos>=this._input.length)return be;let e=this._input.substring(this._pos),t=this._lexer.specification[this._state],n=[];for(let g=0;g<t.length;g++){let d=t[g],m=e.match(d.re);m!==null&&m[0].length>0&&n.push({index:g,text:m[0],len:m[0].length,rule:d})}if(n.length===0)throw new Error("No match found for input '"+e+"'");n.sort(Ye),this._go=!0;let s,a;for(let g=0,d=n.length;g<d&&this._go;g++)if(this._offset=0,this._less=null,this._go=!1,this._newstate=null,a=n[g],this._text=a.text,this._leng=a.len,s=a.rule.action(this),this._newstate&&this._newstate!=this._state){this._state=this._newstate;break}let o=this._less===null?a.text:a.text.substring(0,this._less),i=o.length;this._pos+=i+this._offset;let h=o.match(/\n/g);return h!==null?(this._line+=h.length,this._col=i-o.lastIndexOf(`
4
+ `)-1):this._col+=i,s}},A=class{constructor(e){this.states=Object.keys(e),this.specification={};for(let t of this.states){let n=e[t];if(t in this.specification)throw"Duplicate state declaration encountered for state '"+t+"'";this.specification[t]=[];for(let[s,a]of n.entries()){let o;try{o=new RegExp("^"+s)}catch(i){throw"Invalid regexp '"+s+"' in state '"+t+"' ("+i.message+")"}this.specification[t].push({re:o,action:a})}}}scanner(e){return new J(e,this)}lex(e,t){let n=this.scanner(e);for(;;){let s=n.scan();if(s===be)return;s!==void 0&&t(s)}}collect(e){let t=[],n=function(s){Array.isArray(s)?t.push(...s):t.push(s)};return this.lex(e,n),t}};var ee=["sqrt","text","bar","bold","boldsymbol","ddot","dot","hat","mathbb","mathbf","mathcal","mathfrak","mathit","mathrm","mathscr","mathsf","mathtt","operatorname","overbrace","overline","pmb","rm","tilde","underbrace","underline","vec","widehat","widetilde","overleftarrow","overrightarrow","hspace","substack"],te=["frac","tfrac","binom","dbinom","dfrac","tbinom","overset","underset"];function Ge(r){let e=["{","}","\\","$","&","#","_","%"];for(let t of e)r=r.replaceAll("\\"+t,t);return r}var Xe=new Map([[String.raw`\\(text|operatorname|begin|end|hspace){.+?}`,r=>{let e=r.text(),t=e.substring(0,e.indexOf("{")),n=e.substring(e.indexOf("{")+1,e.lastIndexOf("}"));return[new c(1,t),new c(6,"{"),new c(2,Ge(n)),new c(6,"}")]}],[String.raw`%[^\n]*`,r=>new c(3,r.text().substring(1))],[String.raw`[{}_^&]`,r=>new c(6,r.text())],[String.raw`\\[\\,:;! ]`,r=>new c(6,r.text())],[String.raw`\r?\n`,r=>new c(5,`
5
+ `)],[String.raw`\s+`,r=>new c(4,r.text())],[String.raw`\\[{}%$&#_|]`,r=>new c(0,r.text())],[String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`,r=>{let e=r.text(),t=RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`),n=e.match(t);w(n!==null);let s=n[1];if(te.includes(s.substring(1))){let a=n[2].trimStart(),o=n[3];return[new c(1,s),new c(0,a),new c(0,o)]}else return r.reject(),[]}],[String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`,r=>{let e=r.text(),t=RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`),n=e.match(t);w(n!==null);let s=n[1];if(ee.includes(s.substring(1))){let a=n[2].trimStart();return[new c(1,s),new c(0,a)]}else return r.reject(),[]}],[String.raw`\\[a-zA-Z]+`,r=>{let e=r.text();return[new c(1,e)]}],[String.raw`[0-9]+(\.[0-9]+)?`,r=>new c(0,r.text())],[String.raw`[a-zA-Z]`,r=>new c(0,r.text())],[String.raw`[+\-*/='<>!.,;:?()\[\]|]`,r=>new c(0,r.text())],[String.raw`[^\x00-\x7F]`,r=>new c(0,r.text())],[String.raw`.`,r=>new c(7,r.text())]]),He={start:Xe};function re(r){return new A(He).collect(r)}var Ve=["bigl","bigr","biggl","biggr","Bigl","Bigr","Biggl","Biggr"],Te=new u("empty","");function je(r){return ee.includes(r)?1:te.includes(r)?2:0}var P=new c(6,"{"),Y=new c(6,"}"),ye=new c(0,"["),Ze=new c(0,"]");function ne(r,e){let t=e;for(;t<r.length&&[4,5].includes(r[t].type);)t++;return r.slice(e,t)}function xe(r,e){let t=r[e];return t.type===0&&["(",")","[","]","|","\\{","\\}",".","\\|"].includes(t.value)||t.type===1&&["lfloor","rfloor","lceil","rceil","langle","rangle"].includes(t.value.slice(1))?t:null}function B(r,e){let t=e;for(;t<r.length&&r[t].eq(new c(0,"'"));)t+=1;return t-e}function G(r,e,t,n){w(r[e].eq(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)return-1;r[a].eq(t)?s+=1:r[a].eq(n)&&(s-=1),a+=1}return a-1}var se=new c(1,"\\left"),Ke=new c(1,"\\right");function Qe(r,e){return G(r,e,se,Ke)}var ae=new c(1,"\\begin"),Je=new c(1,"\\end");function et(r,e){return G(r,e,ae,Je)}var f=class extends Error{constructor(e){super(e),this.name="LatexParserError"}},oe=new c(6,"_"),ie=new c(6,"^"),le=class{constructor(e=!1,t=!0){this.space_sensitive=e,this.newline_sensitive=t}parse(e){let t=R(e,new c(1,"\\displaystyle"));if(t===-1){let[n,s]=this.parseGroup(e,0,e.length);return n}else if(t===0){let[n,s]=this.parseGroup(e,1,e.length);return new u("unaryFunc","\\displaystyle",[n])}else{let[n,s]=this.parseGroup(e,0,t),[a,o]=this.parseGroup(e,t+1,e.length),i=new u("unaryFunc","\\displaystyle",[a]);return new u("ordgroup","",[n,i])}}parseGroup(e,t,n){let s=[],a=t;for(;a<n;){let[i,h]=this.parseNextExpr(e,a);if(a=h,!(i.type==="whitespace"&&(!this.space_sensitive&&i.content.replace(/ /g,"").length===0||!this.newline_sensitive&&i.content===`
6
+ `))){if(i.type==="control"&&i.content==="&")throw new f("Unexpected & outside of an alignment");s.push(i)}}let o;return s.length===1?o=s[0]:o=new u("ordgroup","",s),[o,n+1]}parseNextExpr(e,t){let[n,s]=this.parseNextExprWithoutSupSub(e,t),a=null,o=null,i=0;if(i+=B(e,s),s+=i,s<e.length&&e[s].eq(oe)){if([a,s]=this.parseNextExprWithoutSupSub(e,s+1),i+=B(e,s),s+=i,s<e.length&&e[s].eq(ie)&&([o,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0))throw new f("Double superscript")}else if(s<e.length&&e[s].eq(ie)){if([o,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0)throw new f("Double superscript");if(s<e.length&&e[s].eq(oe)&&([a,s]=this.parseNextExprWithoutSupSub(e,s+1),B(e,s)>0))throw new f("Double superscript")}if(a!==null||o!==null||i>0){let h={base:n};if(a&&(h.sub=a),i>0){h.sup=new u("ordgroup","",[]);for(let g=0;g<i;g++)h.sup.args.push(new u("element","'"));o&&h.sup.args.push(o),h.sup.args.length===1&&(h.sup=h.sup.args[0])}else o&&(h.sup=o);return[new u("supsub","",[],h),s]}else return[n,s]}parseNextExprWithoutSupSub(e,t){if(t>=e.length)return[Te,t];let n=e[t];switch(n.type){case 0:return[new u("element",n.value),t+1];case 2:return[new u("text",n.value),t+1];case 3:return[new u("comment",n.value),t+1];case 4:case 5:return[new u("whitespace",n.value),t+1];case 1:let s=n.value.slice(1);return Ve.includes(s)?this.parseNextExprWithoutSupSub(e,t+1):n.eq(ae)?this.parseBeginEndExpr(e,t):n.eq(se)?this.parseLeftRightExpr(e,t):this.parseCommandExpr(e,t);case 6:let a=n.value;switch(a){case"{":let o=G(e,t,P,Y);if(o===-1)throw new f("Unmatched '{'");return this.parseGroup(e,t+1,o);case"}":throw new f("Unmatched '}'");case"\\\\":case"\\!":case"\\,":case"\\:":case"\\;":return[new u("control",a),t+1];case"\\ ":return[new u("control","\\:"),t+1];case"_":case"^":return[Te,t];case"&":return[new u("control","&"),t+1];default:throw new f("Unknown control sequence")}default:throw new f("Unknown token type")}}parseCommandExpr(e,t){w(e[t].type===1);let n=e[t].value,s=t+1;if(["left","right","begin","end"].includes(n.slice(1)))throw new f("Unexpected command: "+n);switch(je(n.slice(1))){case 0:return E.has(n.slice(1))?[new u("symbol",n),s]:[new u("unknownMacro",n),s];case 1:{if(s>=e.length)throw new f("Expecting argument for "+n);if(n==="\\sqrt"&&s<e.length&&e[s].eq(ye)){let h=s,g=G(e,s,ye,Ze);if(g===-1)throw new f("No matching right square bracket for [");let[d,m]=this.parseGroup(e,h+1,g),[y,x]=this.parseNextArg(e,g+1);return[new u("unaryFunc",n,[y],d),x]}else if(n==="\\text"){if(s+2>=e.length)throw new f("Expecting content for \\text command");w(e[s].eq(P)),w(e[s+1].type===2),w(e[s+2].eq(Y));let h=e[s+1].value;return[new u("text",h),s+3]}let[o,i]=this.parseNextArg(e,s);return[new u("unaryFunc",n,[o]),i]}case 2:{let[o,i]=this.parseNextArg(e,s),[h,g]=this.parseNextArg(e,i);return[new u("binaryFunc",n,[o,h]),g]}default:throw new Error("Invalid number of parameters")}}parseNextArg(e,t){let n=t,s=null;for(;n<e.length;){let a;if([a,n]=this.parseNextExprWithoutSupSub(e,n),a.type!=="whitespace"){s=a;break}}if(s===null)throw new f("Expecting argument but token stream ended");return[s,n]}parseLeftRightExpr(e,t){w(e[t].eq(se));let n=t+1;if(n+=ne(e,n).length,n>=e.length)throw new f("Expecting delimiter after \\left");let s=xe(e,n);if(s===null)throw new f("Invalid delimiter after \\left");n++;let a=n,o=Qe(e,t);if(o===-1)throw new f("No matching \\right");let i=o;if(n=o+1,n+=ne(e,n).length,n>=e.length)throw new f("Expecting \\right after \\left");let h=xe(e,n);if(h===null)throw new f("Invalid delimiter after \\right");n++;let[g,d]=this.parseGroup(e,a,i),m=[new u("element",s.value),g,new u("element",h.value)];return[new u("leftright","",m),n]}parseBeginEndExpr(e,t){w(e[t].eq(ae));let n=t+1;w(e[n].eq(P)),w(e[n+1].type===2),w(e[n+2].eq(Y));let s=e[n+1].value;n+=3;let a=[];for(;n<e.length;){let y=ne(e,n).length;if(n+=y,n>=e.length||!e[n].eq(P))break;let[x,q]=this.parseNextArg(e,n);a.push(x),n=q}let o=n,i=et(e,t);if(i===-1)throw new f("No matching \\end");let h=i;if(n=i+1,w(e[n].eq(P)),w(e[n+1].type===2),w(e[n+2].eq(Y)),e[n+1].value!==s)throw new f("Mismatched \\begin and \\end environments");n+=3;let g=e.slice(o,h);for(;g.length>0&&[4,5].includes(g[g.length-1].type);)g.pop();let d=this.parseAligned(g);return[new u("beginend",s,a,d),n]}parseAligned(e){let t=0,n=[],s=[];n.push(s);let a=new u("ordgroup","",[]);for(s.push(a);t<e.length;){let[o,i]=this.parseNextExpr(e,t);t=i,!(o.type==="whitespace"&&(!this.space_sensitive&&o.content.replace(/ /g,"").length===0||!this.newline_sensitive&&o.content===`
7
+ `))&&(o.type==="control"&&o.content==="\\\\"?(s=[],a=new u("ordgroup","",[]),s.push(a),n.push(s)):o.type==="control"&&o.content==="&"?(a=new u("ordgroup","",[]),s.push(a)):a.args.push(o))}return n}};function tt(r){let e=n=>n.eq(oe)||n.eq(ie),t=[];for(let n=0;n<r.length;n++)r[n].type===4&&n+1<r.length&&e(r[n+1])||r[n].type===4&&n-1>=0&&e(r[n-1])||t.push(r[n]);return t}function rt(r,e){let t=[];for(let n of r)if(n.type===1&&e[n.value]){let s=re(e[n.value]);t=t.concat(s)}else t.push(n);return t}function qe(r,e){let t=new le,n=re(r);return n=tt(n),n=rt(n,e),t.parse(n)}var z=new Map([["arrow.l.r.double.long","<==>"],["arrow.l.r.long","<-->"],["arrow.r.bar","|->"],["arrow.r.double.bar","|=>"],["arrow.r.double.long","==>"],["arrow.r.long","-->"],["arrow.r.long.squiggly","~~>"],["arrow.r.tail",">->"],["arrow.r.twohead","->>"],["arrow.l.double.long","<=="],["arrow.l.long","<--"],["arrow.l.long.squiggly","<~~"],["arrow.l.tail","<-<"],["arrow.l.twohead","<<-"],["arrow.l.r","<->"],["arrow.l.r.double","<=>"],["colon.double.eq","::="],["dots.h","..."],["gt.triple",">>>"],["lt.triple","<<<"],["arrow.r","->"],["arrow.r.double","=>"],["arrow.r.squiggly","~>"],["arrow.l","<-"],["arrow.l.squiggly","<~"],["bar.v.double","||"],["bracket.l.double","[|"],["bracket.r.double","|]"],["colon.eq",":="],["eq.colon","=:"],["eq.not","!="],["gt.double",">>"],["gt.eq",">="],["lt.double","<<"],["lt.eq","<="],["ast.op","*"],["minus","-"],["tilde.op","~"]]),X=new Map;for(let[r,e]of z.entries())e.length>1&&X.set(e,r);function Ee(r){return r.type==="atom"&&["(",")","[","]","{","}","|","\u230A","\u230B","\u2308","\u2309"].includes(r.content)}var I=new p(2,"("),W=new p(2,")"),nt=new p(2,","),_e=new p(1,`
8
+ `),ue=new p(6," ");function ce(r){switch(typeof r){case"string":return`"${r}"`;case"number":return r.toString();case"boolean":return r?"#true":"#false";default:return w(r instanceof l,"Not a valid primitive value"),r.content}}var _=class extends Error{constructor(e,t){super(e),this.name="TypstWriterError",this.node=t}},H=class{constructor(e){this.buffer="";this.queue=[];this.insideFunctionDepth=0;this.nonStrict=e.nonStrict,this.preferShorthands=e.preferShorthands,this.keepSpaces=e.keepSpaces,this.inftyToOo=e.inftyToOo,this.optimize=e.optimize}writeBuffer(e){let t=e.toString();if(t==="")return;let n=!1;n||=/[\(\[\|]$/.test(this.buffer)&&/^\w/.test(t),n||=/^[})\]\|]$/.test(t),n||=/[^=]$/.test(this.buffer)&&t==="(",n||=/^[_^,;!]$/.test(t),n||=t==="'",n||=/[\(\[{]\s*(-|\+)$/.test(this.buffer)||this.buffer==="-"||this.buffer==="+",n||=t.startsWith(`
9
9
  `),n||=this.buffer==="",n||=/^\s/.test(t),n||=this.buffer.endsWith("&")&&t==="=",n||=this.buffer.endsWith("/")||t==="/",n||=/[\s_^{\(]$/.test(this.buffer),n||(this.buffer+=" "),this.buffer+=t}serialize(e){switch(e.type){case"none":this.queue.push(new p(0,"#none"));break;case"atom":{e.content===","&&this.insideFunctionDepth>0?this.queue.push(new p(1,"comma")):this.queue.push(new p(2,e.content));break}case"symbol":{let t=e.content;this.preferShorthands&&z.has(t)&&(t=z.get(t)),this.inftyToOo&&t==="infinity"&&(t="oo"),this.queue.push(new p(1,t));break}case"text":this.queue.push(new p(3,e.content));break;case"comment":this.queue.push(new p(4,e.content));break;case"whitespace":for(let t of e.content)if(t===" ")this.keepSpaces&&this.queue.push(new p(5,t));else if(t===`
10
- `)this.queue.push(new p(1,t));else throw new N(`Unexpected whitespace character: ${t}`,e);break;case"group":for(let t of e.args)this.serialize(t);break;case"supsub":{let{base:t,sup:n,sub:s}=e.data;this.appendWithBracketsIfNeeded(t);let a=!1,o=n&&n.type==="atom"&&n.content==="'";o&&(this.queue.push(new p(2,"'")),a=!1),s&&(this.queue.push(new p(2,"_")),a=this.appendWithBracketsIfNeeded(s)),n&&!o&&(this.queue.push(new p(2,"^")),a=this.appendWithBracketsIfNeeded(n)),a&&this.queue.push(ue);break}case"funcCall":{let t=new p(1,e.content);this.queue.push(t),e.content!=="lr"&&this.insideFunctionDepth++,this.queue.push(I);for(let n=0;n<e.args.length;n++)this.serialize(e.args[n]),n<e.args.length-1&&this.queue.push(new p(2,","));if(e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`, ${n}: ${a}`))}this.queue.push(W),e.content!=="lr"&&this.insideFunctionDepth--;break}case"fraction":{let[t,n]=e.args,s=this.queue.length;!this.appendWithBracketsIfNeeded(t)&&this.queue.splice(s,0,ue),this.queue.push(new p(2,"/")),this.appendWithBracketsIfNeeded(n);break}case"align":{let t=e.data;t.forEach((n,s)=>{n.forEach((a,o)=>{o>0&&this.queue.push(new p(2,"&")),this.serialize(a)}),s<t.length-1&&this.queue.push(new p(1,"\\"))});break}case"matrix":{let t=e.data;if(this.queue.push(new p(1,"mat")),this.insideFunctionDepth++,this.queue.push(I),e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`${n}: ${a}, `))}t.forEach((n,s)=>{n.forEach((a,o)=>{this.serialize(a),o<n.length-1?this.queue.push(new p(2,",")):s<t.length-1&&this.queue.push(new p(2,";"))})}),this.queue.push(W),this.insideFunctionDepth--;break}case"cases":{let t=e.data;if(this.queue.push(new p(1,"cases")),this.insideFunctionDepth++,this.queue.push(I),e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`${n}: ${a}, `))}t.forEach((n,s)=>{n.forEach((a,o)=>{this.serialize(a),o<n.length-1?this.queue.push(new p(2,"&")):s<t.length-1&&this.queue.push(new p(2,","))})}),this.queue.push(W),this.insideFunctionDepth--;break}case"unknown":{if(this.nonStrict)this.queue.push(new p(1,e.content));else throw new N(`Unknown macro: ${e.content}`,e);break}default:throw new N(`Unimplemented node type to append: ${e.type}`,e)}}appendWithBracketsIfNeeded(e){let t=["group","supsub","fraction","empty"].includes(e.type);if(e.type==="group")if(e.args.length===0)t=!0;else{let n=e.args[0],s=e.args[e.args.length-1];Ee(n)&&Ee(s)&&(t=!1)}return t?(this.queue.push(I),this.serialize(e),this.queue.push(W)):this.serialize(e),!t}flushQueue(){let e=new p(1,"");for(let t=0;t<this.queue.length;t++)this.queue[t].eq(ue)&&(t===0||t===this.queue.length-1||this.queue[t-1].type===5||this.queue[t-1].isOneOf([I,Ne])||this.queue[t+1].isOneOf([W,nt,Ne]))&&(this.queue[t]=e);this.queue=this.queue.filter(t=>!t.eq(e)),this.queue.forEach(t=>{this.writeBuffer(t)}),this.queue=[]}finalize(){this.flushQueue();let e=function(s){let a=s.replace(/floor\.l\s*(.*?)\s*floor\.r/g,"floor($1)");return a=a.replace(/floor\(\)/g,'floor("")'),a},t=function(s){let a=s.replace(/ceil\.l\s*(.*?)\s*ceil\.r/g,"ceil($1)");return a=a.replace(/ceil\(\)/g,'ceil("")'),a},n=function(s){let a=s.replace(/floor\.l\s*(.*?)\s*ceil\.r/g,"round($1)");return a=a.replace(/round\(\)/g,'round("")'),a};if(this.optimize){let s=[e,t,n];for(let a of s)this.buffer=a(this.buffer)}return this.buffer}};var st=["dim","id","im","mod","Pr","sech","csch"];function U(r){if(/^[a-zA-Z0-9]$/.test(r))return r;if(r==="/")return"\\/";if(r==="\\\\")return"\\";if(["\\$","\\#","\\&","\\_"].includes(r))return r;if(r.startsWith("\\")){let e=r.slice(1);return E.has(e)?E.get(e):e}return r}function at(r,e){let[t,n]=r.args;if(e.optimize){let a=i=>{if(i.eq(new l("text","def")))return!0;if(i.type==="ordgroup"&&i.args.length===3){let[h,g,d]=i.args,m=new l("element","d"),y=new l("element","e"),x=new l("element","f");if(h.eq(m)&&g.eq(y)&&d.eq(x))return!0}return!1},o=i=>i.eq(new l("element","="));if(a(t)&&o(n))return new u("symbol","eq.def")}let s=new u("funcCall","limits",[T(n,e)]);return new u("supsub","",[],{base:s,sup:T(t,e)})}function ot(r,e){let[t,n]=r.args,s=new u("funcCall","limits",[T(n,e)]);return new u("supsub","",[],{base:s,sub:T(t,e)})}function T(r,e={}){switch(r.type){case"empty":return L;case"whitespace":return new u("whitespace",r.content);case"ordgroup":return new u("group","",r.args.map(t=>T(t,e)));case"element":return new u("atom",U(r.content));case"symbol":return new u("symbol",U(r.content));case"text":return/[^\x00-\x7F]+/.test(r.content)&&e.nonAsciiWrapper!==""?new u("funcCall",e.nonAsciiWrapper,[new u("text",r.content)]):new u("text",r.content);case"comment":return new u("comment",r.content);case"supsub":{let{base:t,sup:n,sub:s}=r.data;if(t&&t.type==="unaryFunc"&&t.content==="\\overbrace"&&n)return new u("funcCall","overbrace",[T(t.args[0],e),T(n,e)]);if(t&&t.type==="unaryFunc"&&t.content==="\\underbrace"&&s)return new u("funcCall","underbrace",[T(t.args[0],e),T(s,e)]);let a={base:T(t,e)};return a.base.type==="none"&&(a.base=new u("none","")),n&&(a.sup=T(n,e)),s&&(a.sub=T(s,e)),new u("supsub","",[],a)}case"leftright":{let[t,n,s]=r.args,[a,o,i]=r.args.map(d=>T(d,e));if(e.optimize){if(t.content==="\\|"&&s.content==="\\|")return new u("funcCall","norm",[o]);if(["[]","()","\\{\\}","\\lfloor\\rfloor","\\lceil\\rceil","\\lfloor\\rceil"].includes(t.content+s.content))return new u("group","",[a,o,i])}let h=new u("group","",[a,o,i]),g=function(d){return["(",")","{","["].includes(d)?"\\"+d:d};return s.content==="."?(a.content=g(a.content),h.args=[a,o]):t.content==="."&&(i.content=g(i.content),h.args=[o,i]),new u("funcCall","lr",[h])}case"binaryFunc":return r.content==="\\overset"?at(r,e):r.content==="\\underset"?ot(r,e):r.content==="\\frac"&&e.fracToSlash?new u("fraction","",r.args.map(t=>T(t,e))):new u("funcCall",U(r.content),r.args.map(t=>T(t,e)));case"unaryFunc":{let t=T(r.args[0],e);if(r.content==="\\sqrt"&&r.data){let n=T(r.data,e);return new u("funcCall","root",[n,t])}if(r.content==="\\mathbf"){let n=new u("funcCall","bold",[t]);return new u("funcCall","upright",[n])}if(r.content==="\\overrightarrow")return new u("funcCall","arrow",[t]);if(r.content==="\\overleftarrow")return new u("funcCall","accent",[t,new u("symbol","arrow.l")]);if(r.content==="\\operatorname")return e.optimize&&st.includes(t.content)?new u("symbol",t.content):new u("funcCall","op",[t]);if(r.content==="\\hspace"){let n=t.content;return new u("funcCall","#h",[new u("symbol",n)])}if(e.optimize){if(r.content==="\\mathbb"&&t.type==="atom"&&/^[A-Z]$/.test(t.content))return new u("symbol",t.content+t.content);if(r.content==="\\mathrm"&&t.eq(new u("atom","d")))return new u("symbol","dif")}return new u("funcCall",U(r.content),r.args.map(n=>T(n,e)))}case"beginend":{let n=r.data.map(s=>s.map(a=>T(a,e)));if(r.content.startsWith("align"))return new u("align","",[],n);if(r.content==="cases")return new u("cases","",[],n);if(r.content==="array"){let s=new u("matrix","",[],n),a={delim:L},o=r.args;if(o.length>0){let i=o[0],h=i.type==="element"?i.content:i.type==="ordgroup"?i.args.map(g=>g.type==="element"?g.content:"").join(""):"";if(h){let g={l:"#left",c:"#center",r:"#right"},d=Array.from(h),m=d.map(q=>g[q]).filter(Boolean).map(q=>new u("symbol",q)),y=[],x=0;for(let q of d)q==="|"?y.push(x):(q==="l"||q==="c"||q==="r")&&x++;if(y.length>0&&(y.length===1?a.augment=new u("symbol",`#${y[0]}`):a.augment=new u("symbol",`#(vline: (${y.join(", ")}))`)),m.length>0){let q=m[0].content,S=m.every(D=>D.content===q);a.align=S?m[0]:new u("symbol","#center")}}}return s.setOptions(a),s}if(r.content.endsWith("matrix")){let s;switch(r.content){case"matrix":s=L;break;case"pmatrix":s="(";break;case"bmatrix":s="[";break;case"Bmatrix":s="{";break;case"vmatrix":s="|";break;case"Vmatrix":{s=new u("symbol","bar.v.double");break}default:throw new N(`Unimplemented beginend: ${r.content}`,r)}let a=new u("matrix","",[],n);return a.setOptions({delim:s}),a}throw new N(`Unimplemented beginend: ${r.content}`,r)}case"unknownMacro":return new u("unknown",U(r.content));case"control":if(r.content==="\\\\")return new u("symbol","\\");if(E.has(r.content.substring(1))){let t=E.get(r.content.substring(1));return new u("symbol",t)}else throw new N(`Unknown control sequence: ${r.content}`,r);default:throw new N(`Unimplemented node type: ${r.type}`,r)}}var it=["sqrt","bold","arrow","upright","lr","op","macron","dot","dot.double","hat","tilde","overline","underline","bb","cal","frak","floor","ceil","norm","limits"],lt=["frac","root","overbrace","underbrace"];function ve(r){return["{","}","%"].includes(r)?"\\"+r:r}function V(r){return/^[a-zA-Z0-9]$/.test(r)?r:v.has(r)?"\\"+v.get(r):"\\"+r}var ut=new l("element",",");function b(r){if(r.eq(new u("symbol","eq.def")))return new l("binaryFunc","\\overset",[new l("text","def"),new l("element","=")]);switch(r.type){case"none":return new l("empty","");case"whitespace":return new l("whitespace",r.content);case"atom":return new l("element",r.content);case"symbol":switch(r.content){case"comma":return new l("element",",");case"hyph":case"hyph.minus":return new l("text","-");default:return new l("symbol",V(r.content))}case"text":return new l("text",r.content);case"comment":return new l("comment",r.content);case"group":{let e=r.args.map(b);if(r.content==="parenthesis"){let t=r.isOverHigh(),n=t?"\\left(":"(",s=t?"\\right)":")";e.unshift(new l("element",n)),e.push(new l("element",s))}return new l("ordgroup",r.content,e)}case"funcCall":if(it.includes(r.content)){if(r.content==="lr"){let t=r.data;if(t.leftDelim!==null){let n=ve(t.leftDelim);w(t.rightDelim!==null,"leftDelim has value but rightDelim not");let s=ve(t.rightDelim);return new l("ordgroup","",[new l("element","\\left"+n),...r.args.map(b),new l("element","\\right"+s)])}else return new l("ordgroup","",r.args.map(b))}if(r.content==="norm"){let t=r.args[0],n=r.isOverHigh()?"leftright":"ordgroup";return new l(n,"",[new l("symbol","\\|"),b(t),new l("symbol","\\|")])}if(r.content==="floor"||r.content==="ceil"){let t="\\l"+r.content,n="\\r"+r.content,s=r.args[0],a=r.isOverHigh()?"leftright":"ordgroup";return new l(a,"",[new l("symbol",t),b(s),new l("symbol",n)])}let e=V(r.content);return new l("unaryFunc",e,r.args.map(b))}else if(lt.includes(r.content)){if(r.content==="root"){let[t,n]=r.args,s=b(t);return new l("unaryFunc","\\sqrt",[b(n)],s)}if(r.content==="overbrace"||r.content==="underbrace"){let[t,n]=r.args,s=new l("unaryFunc","\\"+r.content,[b(t)]),a=b(n),o=r.content==="overbrace"?{base:s,sup:a}:{base:s,sub:a};return new l("supsub","",[],o)}let e=V(r.content);return new l("binaryFunc",e,r.args.map(b))}else{if(r.content==="vec"){let e=r.args.map(b).map(t=>[t]);return new l("beginend","pmatrix",[],e)}return new l("ordgroup","",[new l("symbol",V(r.content)),new l("element","("),...me(r.args.map(b),ut),new l("element",")")])}case"supsub":{let{base:e,sup:t,sub:n}=r.data,s,a;if(t&&(s=b(t)),n&&(a=b(n)),e.eq(new u("funcCall","limits"))){let h=b(e.args[0]);if(s!==void 0&&a===void 0)return new l("binaryFunc","\\overset",[s,h]);if(s===void 0&&a!==void 0)return new l("binaryFunc","\\underset",[a,h]);{let g=new l("binaryFunc","\\underset",[a,h]);return new l("binaryFunc","\\overset",[s,g])}}let o=b(e);return new l("supsub","",[],{base:o,sup:s,sub:a})}case"matrix":{let t=r.data.map(s=>s.map(b)),n="pmatrix";if(r.options&&"delim"in r.options){let s=r.options.delim;if(s instanceof u)switch(s.content){case"#none":n="matrix";break;case"bar.v.double":n="Vmatrix";break;case"bar":case"bar.v":n="vmatrix";break;default:throw new Error(`Unexpected delimiter ${s.content}`)}else switch(s){case"[":n="bmatrix";break;case"]":n="bmatrix";break;case"{":n="Bmatrix";break;case"}":n="Bmatrix";break;case"|":n="vmatrix";break;case")":case"(":default:n="pmatrix"}}return new l("beginend",n,[],t)}case"cases":{let t=r.data.map(n=>n.map(b));return new l("beginend","cases",[],t)}case"control":switch(r.content){case"\\":return new l("control","\\\\");case"&":return new l("control","&");default:throw new Error("[convert_typst_node_to_tex] Unimplemented control: "+r.content)}case"fraction":{let[e,t]=r.args,n=b(e),s=b(t);return new l("binaryFunc","\\frac",[n,s])}default:throw new Error("[convert_typst_node_to_tex] Unimplemented type: "+r.type)}}var ct=Array.from(X.keys());function pt(){return`(${ct.map(e=>(e=e.replaceAll("|","\\|"),e=e.replaceAll(".","\\."),e=e.replaceAll("[","\\["),e=e.replaceAll("]","\\]"),e)).join("|")})`}var ht=pt(),gt=new Map([[String.raw`//[^\n]*`,r=>new p(4,r.text().substring(2))],[String.raw`/`,r=>new p(2,r.text())],[String.raw`[_^&]`,r=>new p(6,r.text())],[String.raw`\r?\n`,r=>new p(7,`
10
+ `)this.queue.push(new p(1,t));else throw new _(`Unexpected whitespace character: ${t}`,e);break;case"group":for(let t of e.args)this.serialize(t);break;case"supsub":{let{base:t,sup:n,sub:s}=e.data;this.appendWithBracketsIfNeeded(t);let a=!1,o=n&&n.type==="atom"&&n.content==="'";o&&(this.queue.push(new p(2,"'")),a=!1),s&&(this.queue.push(new p(2,"_")),a=this.appendWithBracketsIfNeeded(s)),n&&!o&&(this.queue.push(new p(2,"^")),a=this.appendWithBracketsIfNeeded(n)),a&&this.queue.push(ue);break}case"funcCall":{let t=new p(1,e.content);this.queue.push(t),e.content!=="lr"&&this.insideFunctionDepth++,this.queue.push(I);for(let n=0;n<e.args.length;n++)this.serialize(e.args[n]),n<e.args.length-1&&this.queue.push(new p(2,","));if(e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`, ${n}: ${a}`))}this.queue.push(W),e.content!=="lr"&&this.insideFunctionDepth--;break}case"fraction":{let[t,n]=e.args,s=this.queue.length;!this.appendWithBracketsIfNeeded(t)&&this.queue.splice(s,0,ue),this.queue.push(new p(2,"/")),this.appendWithBracketsIfNeeded(n);break}case"align":{let t=e.data;t.forEach((n,s)=>{n.forEach((a,o)=>{o>0&&this.queue.push(new p(2,"&")),this.serialize(a)}),s<t.length-1&&this.queue.push(new p(1,"\\"))});break}case"matrix":{let t=e.data;if(this.queue.push(new p(1,"mat")),this.insideFunctionDepth++,this.queue.push(I),e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`${n}: ${a}, `))}t.forEach((n,s)=>{n.forEach((a,o)=>{this.serialize(a),o<n.length-1?this.queue.push(new p(2,",")):s<t.length-1&&this.queue.push(new p(2,";"))})}),this.queue.push(W),this.insideFunctionDepth--;break}case"cases":{let t=e.data;if(this.queue.push(new p(1,"cases")),this.insideFunctionDepth++,this.queue.push(I),e.options)for(let[n,s]of Object.entries(e.options)){let a=ce(s);this.queue.push(new p(1,`${n}: ${a}, `))}t.forEach((n,s)=>{n.forEach((a,o)=>{this.serialize(a),o<n.length-1?this.queue.push(new p(2,"&")):s<t.length-1&&this.queue.push(new p(2,","))})}),this.queue.push(W),this.insideFunctionDepth--;break}case"unknown":{if(this.nonStrict)this.queue.push(new p(1,e.content));else throw new _(`Unknown macro: ${e.content}`,e);break}default:throw new _(`Unimplemented node type to append: ${e.type}`,e)}}appendWithBracketsIfNeeded(e){let t=["group","supsub","fraction","empty"].includes(e.type);if(e.type==="group")if(e.args.length===0)t=!0;else{let n=e.args[0],s=e.args[e.args.length-1];Ee(n)&&Ee(s)&&(t=!1)}return t?(this.queue.push(I),this.serialize(e),this.queue.push(W)):this.serialize(e),!t}flushQueue(){let e=new p(1,"");for(let t=0;t<this.queue.length;t++)this.queue[t].eq(ue)&&(t===0||t===this.queue.length-1||this.queue[t-1].type===5||this.queue[t-1].isOneOf([I,_e])||this.queue[t+1].isOneOf([W,nt,_e]))&&(this.queue[t]=e);this.queue=this.queue.filter(t=>!t.eq(e)),this.queue.forEach(t=>{this.writeBuffer(t)}),this.queue=[]}finalize(){this.flushQueue();let e=function(s){let a=s.replace(/floor\.l\s*(.*?)\s*floor\.r/g,"floor($1)");return a=a.replace(/floor\(\)/g,'floor("")'),a},t=function(s){let a=s.replace(/ceil\.l\s*(.*?)\s*ceil\.r/g,"ceil($1)");return a=a.replace(/ceil\(\)/g,'ceil("")'),a},n=function(s){let a=s.replace(/floor\.l\s*(.*?)\s*ceil\.r/g,"round($1)");return a=a.replace(/round\(\)/g,'round("")'),a};if(this.optimize){let s=[e,t,n];for(let a of s)this.buffer=a(this.buffer)}return this.buffer}};var st=["dim","id","im","mod","Pr","sech","csch"];function U(r){if(/^[a-zA-Z0-9]$/.test(r))return r;if(r==="/")return"\\/";if(r==="\\\\")return"\\";if(["\\$","\\#","\\&","\\_"].includes(r))return r;if(r.startsWith("\\")){let e=r.slice(1);return E.has(e)?E.get(e):e}return r}function at(r,e){let[t,n]=r.args;if(e.optimize){let a=i=>{if(i.eq(new u("text","def")))return!0;if(i.type==="ordgroup"&&i.args.length===3){let[h,g,d]=i.args,m=new u("element","d"),y=new u("element","e"),x=new u("element","f");if(h.eq(m)&&g.eq(y)&&d.eq(x))return!0}return!1},o=i=>i.eq(new u("element","="));if(a(t)&&o(n))return new l("symbol","eq.def")}let s=new l("funcCall","limits",[T(n,e)]);return new l("supsub","",[],{base:s,sup:T(t,e)})}function ot(r,e){let[t,n]=r.args,s=new l("funcCall","limits",[T(n,e)]);return new l("supsub","",[],{base:s,sub:T(t,e)})}function T(r,e={}){switch(r.type){case"empty":return L;case"whitespace":return new l("whitespace",r.content);case"ordgroup":return new l("group","",r.args.map(t=>T(t,e)));case"element":return new l("atom",U(r.content));case"symbol":return new l("symbol",U(r.content));case"text":return/[^\x00-\x7F]+/.test(r.content)&&e.nonAsciiWrapper!==""?new l("funcCall",e.nonAsciiWrapper,[new l("text",r.content)]):new l("text",r.content);case"comment":return new l("comment",r.content);case"supsub":{let{base:t,sup:n,sub:s}=r.data;if(t&&t.type==="unaryFunc"&&t.content==="\\overbrace"&&n)return new l("funcCall","overbrace",[T(t.args[0],e),T(n,e)]);if(t&&t.type==="unaryFunc"&&t.content==="\\underbrace"&&s)return new l("funcCall","underbrace",[T(t.args[0],e),T(s,e)]);let a={base:T(t,e)};return a.base.type==="none"&&(a.base=new l("none","")),n&&(a.sup=T(n,e)),s&&(a.sub=T(s,e)),new l("supsub","",[],a)}case"leftright":{let[t,n,s]=r.args,[a,o,i]=r.args.map(d=>T(d,e));if(e.optimize){if(t.content==="\\|"&&s.content==="\\|")return new l("funcCall","norm",[o]);if(["[]","()","\\{\\}","\\lfloor\\rfloor","\\lceil\\rceil","\\lfloor\\rceil"].includes(t.content+s.content))return new l("group","",[a,o,i])}let h=new l("group","",[a,o,i]),g=function(d){return["(",")","{","["].includes(d)?"\\"+d:d};return s.content==="."?(a.content=g(a.content),h.args=[a,o]):t.content==="."&&(i.content=g(i.content),h.args=[o,i]),new l("funcCall","lr",[h])}case"binaryFunc":return r.content==="\\overset"?at(r,e):r.content==="\\underset"?ot(r,e):r.content==="\\frac"&&e.fracToSlash?new l("fraction","",r.args.map(t=>T(t,e))):new l("funcCall",U(r.content),r.args.map(t=>T(t,e)));case"unaryFunc":{let t=T(r.args[0],e);if(r.content==="\\sqrt"&&r.data){let n=T(r.data,e);return new l("funcCall","root",[n,t])}if(r.content==="\\mathbf"){let n=new l("funcCall","bold",[t]);return new l("funcCall","upright",[n])}if(r.content==="\\overrightarrow")return new l("funcCall","arrow",[t]);if(r.content==="\\overleftarrow")return new l("funcCall","accent",[t,new l("symbol","arrow.l")]);if(r.content==="\\operatorname")return e.optimize&&st.includes(t.content)?new l("symbol",t.content):new l("funcCall","op",[t]);if(r.content==="\\hspace"){let n=t.content;return new l("funcCall","#h",[new l("symbol",n)])}if(r.content==="\\substack")return new l("group","",[t]);if(e.optimize){if(r.content==="\\mathbb"&&t.type==="atom"&&/^[A-Z]$/.test(t.content))return new l("symbol",t.content+t.content);if(r.content==="\\mathrm"&&t.eq(new l("atom","d")))return new l("symbol","dif")}return new l("funcCall",U(r.content),r.args.map(n=>T(n,e)))}case"beginend":{let n=r.data.map(s=>s.map(a=>T(a,e)));if(r.content.startsWith("align"))return new l("align","",[],n);if(r.content==="cases")return new l("cases","",[],n);if(r.content==="subarray"){let s=r.args[0];return s.content=="r"&&n.forEach(a=>a[0].args.push(new l("symbol","&"))),s.content=="l"&&n.forEach(a=>a[0].args.unshift(new l("symbol","&"))),new l("group","",[new l("align","",[],n)])}if(r.content==="array"){let s=new l("matrix","",[],n),a={delim:L},o=r.args;if(o.length>0){let i=o[0],h=i.type==="element"?i.content:i.type==="ordgroup"?i.args.map(g=>g.type==="element"?g.content:"").join(""):"";if(h){let g={l:"#left",c:"#center",r:"#right"},d=Array.from(h),m=d.map(q=>g[q]).filter(Boolean).map(q=>new l("symbol",q)),y=[],x=0;for(let q of d)q==="|"?y.push(x):(q==="l"||q==="c"||q==="r")&&x++;if(y.length>0&&(y.length===1?a.augment=new l("symbol",`#${y[0]}`):a.augment=new l("symbol",`#(vline: (${y.join(", ")}))`)),m.length>0){let q=m[0].content,S=m.every(D=>D.content===q);a.align=S?m[0]:new l("symbol","#center")}}}return s.setOptions(a),s}if(r.content.endsWith("matrix")){let s;switch(r.content){case"matrix":s=L;break;case"pmatrix":s="(";break;case"bmatrix":s="[";break;case"Bmatrix":s="{";break;case"vmatrix":s="|";break;case"Vmatrix":{s=new l("symbol","bar.v.double");break}default:throw new _(`Unimplemented beginend: ${r.content}`,r)}let a=new l("matrix","",[],n);return a.setOptions({delim:s}),a}throw new _(`Unimplemented beginend: ${r.content}`,r)}case"unknownMacro":return new l("unknown",U(r.content));case"control":if(r.content==="\\\\")return new l("symbol","\\");if(E.has(r.content.substring(1))){let t=E.get(r.content.substring(1));return new l("symbol",t)}else throw new _(`Unknown control sequence: ${r.content}`,r);default:throw new _(`Unimplemented node type: ${r.type}`,r)}}var it=["sqrt","bold","arrow","upright","lr","op","macron","dot","dot.double","hat","tilde","overline","underline","bb","cal","frak","floor","ceil","norm","limits"],lt=["frac","root","overbrace","underbrace"];function ve(r){return["{","}","%"].includes(r)?"\\"+r:r}function V(r){return/^[a-zA-Z0-9]$/.test(r)?r:v.has(r)?"\\"+v.get(r):"\\"+r}var ut=new u("element",",");function b(r){if(r.eq(new l("symbol","eq.def")))return new u("binaryFunc","\\overset",[new u("text","def"),new u("element","=")]);switch(r.type){case"none":return new u("empty","");case"whitespace":return new u("whitespace",r.content);case"atom":return new u("element",r.content);case"symbol":return r.content==="comma"?new u("element",","):r.content==="hyph"||r.content==="hyph.minus"?new u("text","-"):/^([A-Z])\1$/.test(r.content)?new u("unaryFunc","\\mathbb",[new u("element",r.content[0])]):new u("symbol",V(r.content));case"text":return new u("text",r.content);case"comment":return new u("comment",r.content);case"group":{let e=r.args.map(b);if(r.content==="parenthesis"){let t=r.isOverHigh(),n=t?"\\left(":"(",s=t?"\\right)":")";e.unshift(new u("element",n)),e.push(new u("element",s))}return new u("ordgroup",r.content,e)}case"funcCall":if(it.includes(r.content)){if(r.content==="lr"){let t=r.data;if(t.leftDelim!==null){let n=ve(t.leftDelim);w(t.rightDelim!==null,"leftDelim has value but rightDelim not");let s=ve(t.rightDelim);return new u("ordgroup","",[new u("element","\\left"+n),...r.args.map(b),new u("element","\\right"+s)])}else return new u("ordgroup","",r.args.map(b))}if(r.content==="norm"){let t=r.args[0],n=r.isOverHigh()?"leftright":"ordgroup";return new u(n,"",[new u("symbol","\\|"),b(t),new u("symbol","\\|")])}if(r.content==="floor"||r.content==="ceil"){let t="\\l"+r.content,n="\\r"+r.content,s=r.args[0],a=r.isOverHigh()?"leftright":"ordgroup";return new u(a,"",[new u("symbol",t),b(s),new u("symbol",n)])}let e=V(r.content);return new u("unaryFunc",e,r.args.map(b))}else if(lt.includes(r.content)){if(r.content==="root"){let[t,n]=r.args,s=b(t);return new u("unaryFunc","\\sqrt",[b(n)],s)}if(r.content==="overbrace"||r.content==="underbrace"){let[t,n]=r.args,s=new u("unaryFunc","\\"+r.content,[b(t)]),a=b(n),o=r.content==="overbrace"?{base:s,sup:a}:{base:s,sub:a};return new u("supsub","",[],o)}let e=V(r.content);return new u("binaryFunc",e,r.args.map(b))}else{if(r.content==="vec"){let e=r.args.map(b).map(t=>[t]);return new u("beginend","pmatrix",[],e)}return new u("ordgroup","",[new u("symbol",V(r.content)),new u("element","("),...me(r.args.map(b),ut),new u("element",")")])}case"supsub":{let{base:e,sup:t,sub:n}=r.data,s,a;if(t&&(s=b(t)),n&&(a=b(n)),e.eq(new l("funcCall","limits"))){let h=b(e.args[0]);if(s!==void 0&&a===void 0)return new u("binaryFunc","\\overset",[s,h]);if(s===void 0&&a!==void 0)return new u("binaryFunc","\\underset",[a,h]);{let g=new u("binaryFunc","\\underset",[a,h]);return new u("binaryFunc","\\overset",[s,g])}}let o=b(e);return new u("supsub","",[],{base:o,sup:s,sub:a})}case"matrix":{let t=r.data.map(s=>s.map(b)),n="pmatrix";if(r.options&&"delim"in r.options){let s=r.options.delim;if(s instanceof l)switch(s.content){case"#none":n="matrix";break;case"bar.v.double":n="Vmatrix";break;case"bar":case"bar.v":n="vmatrix";break;default:throw new Error(`Unexpected delimiter ${s.content}`)}else switch(s){case"[":n="bmatrix";break;case"]":n="bmatrix";break;case"{":n="Bmatrix";break;case"}":n="Bmatrix";break;case"|":n="vmatrix";break;case")":case"(":default:n="pmatrix"}}return new u("beginend",n,[],t)}case"cases":{let t=r.data.map(n=>n.map(b));return new u("beginend","cases",[],t)}case"control":switch(r.content){case"\\":return new u("control","\\\\");case"&":return new u("control","&");default:throw new Error("[convert_typst_node_to_tex] Unimplemented control: "+r.content)}case"fraction":{let[e,t]=r.args,n=b(e),s=b(t);return new u("binaryFunc","\\frac",[n,s])}default:throw new Error("[convert_typst_node_to_tex] Unimplemented type: "+r.type)}}var ct=Array.from(X.keys());function pt(){return`(${ct.map(e=>(e=e.replaceAll("|","\\|"),e=e.replaceAll(".","\\."),e=e.replaceAll("[","\\["),e=e.replaceAll("]","\\]"),e)).join("|")})`}var ht=pt(),gt=new Map([[String.raw`//[^\n]*`,r=>new p(4,r.text().substring(2))],[String.raw`/`,r=>new p(2,r.text())],[String.raw`[_^&]`,r=>new p(6,r.text())],[String.raw`\r?\n`,r=>new p(7,`
11
11
  `)],[String.raw`\s+`,r=>new p(5,r.text())],[String.raw`\\[$&#_]`,r=>new p(2,r.text())],[String.raw`\\\n`,r=>[new p(6,"\\"),new p(7,`
12
- `)]],[String.raw`\\\s`,r=>[new p(6,"\\"),new p(5," ")]],[String.raw`\\\S`,r=>new p(6,"")],[String.raw`"([^"]|(\\"))*"`,r=>{let e=r.text().substring(1,r.text().length-1);return e.replaceAll('\\"','"'),new p(3,e)}],[ht,r=>{let e=r.text(),t=X.get(e);return new p(1,t)}],[String.raw`[0-9]+(\.[0-9]+)?`,r=>new p(2,r.text())],[String.raw`[+\-*/=\'<>!.,;?()\[\]|]`,r=>new p(2,r.text())],[String.raw`[a-zA-Z\.]+`,r=>new p(r.text().length===1?2:1,r.text())],[String.raw`#none`,r=>new p(0,r.text())],[String.raw`.`,r=>new p(2,r.text())]]),dt={start:gt};function ke(r){return new C(dt).collect(r)}function Se(r,e){let t=e;for(;t<r.length&&r[t].eq(new p(2,"'"));)t+=1;return t-e}function Ae(r,e,t,n){w(r[e].isOneOf(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)throw new Error("Unmatched brackets");r[a].isOneOf(n)?s-=1:r[a].isOneOf(t)&&(s+=1),a+=1}return a-1}function F(r,e){return Ae(r,e,[A,ge,de],[De,Re,Pe])}function mt(r,e){return Ae(r,e,[A,ge,de,pe],[De,Re,Pe,pe])}function wt(r,e){let t=new u("atom","("),n=new u("atom",")");w(r[e].eq(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)throw new Error("Unmatched brackets");r[a].eq(t)?s+=1:r[a].eq(n)&&(s-=1),a+=1}return a-1}function Me(r){let e=[];for(let t=0;t<r;t++)e.push(new u("atom","'"));return e}var Z=new u("atom","/");function bt(r,e){let t=e;for(;t<r.length&&r[t].type==="whitespace";)t++;return t===r.length?null:r[t]}function ft(r){let e=!1,t=[];for(let n=0;n<r.length;n++){let s=r[n];s.type==="whitespace"&&(e||bt(r,n+1)?.eq(Z))||(s.eq(Z)?e=!0:e=!1,t.push(s))}return t}function j(r,e=!1){r=ft(r);let t=new u("atom","("),n=new u("atom",")"),s=[],a=[],o=0;for(;o<r.length;){let i=r[o];if(i.eq(n))throw new k("Unexpected ')'");if(i.eq(Z))s.push(i),o++;else{let h;if(i.eq(t)){let g=wt(r,o);h=j(r.slice(o+1,g),!0),o=g+1}else h=i,o++;if(s.length>0&&s[s.length-1].eq(Z)){let g=h;if(a.length===0)throw new k("Unexpected '/' operator, no numerator before it");let d=a.pop();g.type==="group"&&g.content==="parenthesis"&&(g.content=""),d.type==="group"&&d.content==="parenthesis"&&(d.content=""),a.push(new u("fraction","",[d,g])),s.pop()}else a.push(h)}}return e?new u("group","parenthesis",a):a.length===1?a[0]:new u("group","",a)}var k=class extends Error{constructor(e){super(e),this.name="TypstParserError"}},Oe=new p(6,"_"),Le=new p(6,"^"),A=new p(2,"("),De=new p(2,")"),ge=new p(2,"["),Re=new p(2,"]"),de=new p(2,"{"),Pe=new p(2,"}"),pe=new p(2,"|"),Ce=new p(2,","),Tt=new p(2,";"),yt=new p(5," "),he=class{constructor(e=!0,t=!0){this.space_sensitive=e,this.newline_sensitive=t}parse(e){let[t,n]=this.parseGroup(e,0,e.length);return t}parseGroup(e,t,n,s=!1){let a=[],o=t;for(;o<n;){let[h,g]=this.parseNextExpr(e,o);o=g,!(h.type==="whitespace"&&(!this.space_sensitive&&h.content.replace(/ /g,"").length===0||!this.newline_sensitive&&h.content===`
13
- `))&&a.push(h)}let i;return s?i=j(a,!0):a.length===1?i=a[0]:i=j(a),[i,n+1]}parseNextExpr(e,t){let[n,s]=this.parseNextExprWithoutSupSub(e,t),a=null,o=null,i=Se(e,s);if(i>0&&(n=new u("group","",[n].concat(Me(i))),s+=i),s<e.length&&e[s].eq(Oe)?([a,s]=this.parseSupOrSub(e,s+1),s<e.length&&e[s].eq(Le)&&([o,s]=this.parseSupOrSub(e,s+1))):s<e.length&&e[s].eq(Le)&&([o,s]=this.parseSupOrSub(e,s+1),s<e.length&&e[s].eq(Oe)&&([a,s]=this.parseSupOrSub(e,s+1))),a!==null||o!==null){let h={base:n};return a&&(h.sub=a),o&&(h.sup=o),[new u("supsub","",[],h),s]}else return[n,s]}parseSupOrSub(e,t){let n,s;if(e[t].eq(A)){let o=F(e,t);[n,s]=this.parseGroup(e,t+1,o)}else[n,s]=this.parseNextExprWithoutSupSub(e,t);let a=Se(e,s);return a>0&&(n=new u("group","",[n].concat(Me(a))),s+=a),[n,s]}parseNextExprWithoutSupSub(e,t){let n=e[t],s=n.toNode();if(n.eq(A)){let a=F(e,t);return this.parseGroup(e,t+1,a,!0)}if(n.type===2&&!we(n.value[0]))return[s,t+1];if([2,1].includes(n.type)&&t+1<e.length&&e[t+1].eq(A)){if(n.value==="mat"){let[h,g,d]=this.parseGroupsOfArguments(e,t+1),m=new u("matrix","",[],h);return m.setOptions(g),[m,d]}if(n.value==="cases"){let[h,g,d]=this.parseGroupsOfArguments(e,t+1,Ce),m=new u("cases","",[],h);return m.setOptions(g),[m,d]}if(n.value==="lr"){let[h,g,d]=this.parseLrArguments(e,t+1);return[new u("funcCall",n.value,h,d),g]}let[a,o]=this.parseArguments(e,t+1);return[new u("funcCall",n.value,a),o]}return[s,t+1]}parseArguments(e,t){let n=F(e,t);return[this.parseCommaSeparatedArguments(e,t+1,n),n+1]}parseLrArguments(e,t){if(e[t+1].isOneOf([A,ge,de,pe])){let n=F(e,t),s=t+1,a=mt(e,s);return[this.parseCommaSeparatedArguments(e,s+1,a),n+1,{leftDelim:e[s].value,rightDelim:e[a].value}]}else{let[n,s]=this.parseArguments(e,t);return[n,s,{leftDelim:null,rightDelim:null}]}}parseGroupsOfArguments(e,t,n=Tt){let s=F(e,t);e=e.slice(0,s);let a=[],o={},i=t+1;for(;i<s;)for(;i<s;){let y=function(x){let q=new u("atom",":"),S={},D=[];for(let _=0;_<x.length;_++){if(x[_].type!=="group")continue;let M=x[_],O=R(M.args,q);if(O===-1||O===0)continue;if(D.push(_),M.args[O-1].eq(new u("symbol","delim"))){if(M.args.length!==3)throw new k("Invalid number of arguments for delim");switch(M.args[O+1].type){case"text":{S.delim=M.args[O+1].content;break}case"none":{S.delim=L;break}case"symbol":{S.delim=M.args[O+1];break}default:throw new k("Not implemented for other types of delim")}}else throw new k("Not implemented for other named parameters")}for(let _=D.length-1;_>=0;_--)x.splice(D[_],1);return[x,S]};var h=y;let g=R(e,n,i);g===-1&&(g=s);let d=this.parseCommaSeparatedArguments(e,i,g),m={};[d,m]=y(d),a.push(d),Object.assign(o,m),i=g+1}return[a,o,s+1]}parseCommaSeparatedArguments(e,t,n){let s=[],a=t;for(;a<n;){let o=[];for(;a<n;){if(e[a].eq(Ce)){a+=1;break}else if(e[a].eq(yt)){a+=1;continue}let[h,g]=this.parseNextExpr(e,a);a=g,o.push(h)}let i;o.length===1?i=o[0]:i=j(o),s.push(i)}return s}};function Be(r){let e=new he,t=ke(r);return e.parse(t)}var K=class{constructor(){this.buffer="";this.queue=[]}writeBuffer(e){let t=e.toString(),n=!1;e.type===4?n=!0:(n||=/[{\(\[\|]$/.test(this.buffer),n||=/\\\w+$/.test(this.buffer)&&t==="[",n||=/^[\.,;:!\?\(\)\]{}_^]$/.test(t),n||=["\\{","\\}"].includes(t),n||=t==="'",n||=this.buffer.endsWith("_")||this.buffer.endsWith("^"),n||=/\s$/.test(this.buffer),n||=/^\s/.test(t),n||=this.buffer==="",n||=/[\(\[{]\s*(-|\+)$/.test(this.buffer)||this.buffer==="-"||this.buffer==="+",n||=this.buffer.endsWith("&")&&t==="="),n||(this.buffer+=" "),this.buffer+=t}append(e){let t=new l("control","&"),n=new l("control","\\\\");if(e.type==="ordgroup"&&Y(e.args,t)){let s=Q(e.args,n),a=[];for(let o of s){let i=Q(o,t);a.push(i.map(h=>new l("ordgroup","",h)))}e=new l("beginend","aligned",[],a)}this.queue=this.queue.concat(e.serialize())}flushQueue(){for(let e=0;e<this.queue.length;e++)this.writeBuffer(this.queue[e]);this.queue=[]}finalize(){return this.flushQueue(),this.buffer}};function ze(r,e){let t={nonStrict:!0,preferShorthands:!0,keepSpaces:!1,fracToSlash:!0,inftyToOo:!1,optimize:!0,nonAsciiWrapper:"",customTexMacros:{}};if(e!==void 0)for(let o in t)e[o]!==void 0&&(t[o]=e[o]);let n=qe(r,t.customTexMacros),s=T(n,t),a=new H(t);return a.serialize(s),a.finalize()}function Ie(r){let e=Be(r),t=b(e),n=new K;return n.append(t),n.finalize()}typeof window<"u"&&(window.tex2typst=ze,window.typst2tex=Ie);})();
12
+ `)]],[String.raw`\\\s`,r=>[new p(6,"\\"),new p(5," ")]],[String.raw`\\\S`,r=>new p(6,"")],[String.raw`"([^"]|(\\"))*"`,r=>{let e=r.text().substring(1,r.text().length-1);return e.replaceAll('\\"','"'),new p(3,e)}],[ht,r=>{let e=r.text(),t=X.get(e);return new p(1,t)}],[String.raw`[0-9]+(\.[0-9]+)?`,r=>new p(2,r.text())],[String.raw`[+\-*/=\'<>!.,;?()\[\]|]`,r=>new p(2,r.text())],[String.raw`[a-zA-Z\.]+`,r=>new p(r.text().length===1?2:1,r.text())],[String.raw`#none`,r=>new p(0,r.text())],[String.raw`.`,r=>new p(2,r.text())]]),dt={start:gt};function ke(r){return new A(dt).collect(r)}function Se(r,e){let t=e;for(;t<r.length&&r[t].eq(new p(2,"'"));)t+=1;return t-e}function Ce(r,e,t,n){w(r[e].isOneOf(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)throw new Error("Unmatched brackets");r[a].isOneOf(n)?s-=1:r[a].isOneOf(t)&&(s+=1),a+=1}return a-1}function F(r,e){return Ce(r,e,[C,ge,de],[De,Re,Pe])}function mt(r,e){return Ce(r,e,[C,ge,de,pe],[De,Re,Pe,pe])}function wt(r,e){let t=new l("atom","("),n=new l("atom",")");w(r[e].eq(t));let s=1,a=e+1;for(;s>0;){if(a>=r.length)throw new Error("Unmatched brackets");r[a].eq(t)?s+=1:r[a].eq(n)&&(s-=1),a+=1}return a-1}function Me(r){let e=[];for(let t=0;t<r;t++)e.push(new l("atom","'"));return e}var Z=new l("atom","/");function bt(r,e){let t=e;for(;t<r.length&&r[t].type==="whitespace";)t++;return t===r.length?null:r[t]}function ft(r){let e=!1,t=[];for(let n=0;n<r.length;n++){let s=r[n];s.type==="whitespace"&&(e||bt(r,n+1)?.eq(Z))||(s.eq(Z)?e=!0:e=!1,t.push(s))}return t}function j(r,e=!1){r=ft(r);let t=new l("atom","("),n=new l("atom",")"),s=[],a=[],o=0;for(;o<r.length;){let i=r[o];if(i.eq(n))throw new k("Unexpected ')'");if(i.eq(Z))s.push(i),o++;else{let h;if(i.eq(t)){let g=wt(r,o);h=j(r.slice(o+1,g),!0),o=g+1}else h=i,o++;if(s.length>0&&s[s.length-1].eq(Z)){let g=h;if(a.length===0)throw new k("Unexpected '/' operator, no numerator before it");let d=a.pop();g.type==="group"&&g.content==="parenthesis"&&(g.content=""),d.type==="group"&&d.content==="parenthesis"&&(d.content=""),a.push(new l("fraction","",[d,g])),s.pop()}else a.push(h)}}return e?new l("group","parenthesis",a):a.length===1?a[0]:new l("group","",a)}var k=class extends Error{constructor(e){super(e),this.name="TypstParserError"}},Oe=new p(6,"_"),Le=new p(6,"^"),C=new p(2,"("),De=new p(2,")"),ge=new p(2,"["),Re=new p(2,"]"),de=new p(2,"{"),Pe=new p(2,"}"),pe=new p(2,"|"),Ae=new p(2,","),Tt=new p(2,";"),yt=new p(5," "),he=class{constructor(e=!0,t=!0){this.space_sensitive=e,this.newline_sensitive=t}parse(e){let[t,n]=this.parseGroup(e,0,e.length);return t}parseGroup(e,t,n,s=!1){let a=[],o=t;for(;o<n;){let[h,g]=this.parseNextExpr(e,o);o=g,!(h.type==="whitespace"&&(!this.space_sensitive&&h.content.replace(/ /g,"").length===0||!this.newline_sensitive&&h.content===`
13
+ `))&&a.push(h)}let i;return s?i=j(a,!0):a.length===1?i=a[0]:i=j(a),[i,n+1]}parseNextExpr(e,t){let[n,s]=this.parseNextExprWithoutSupSub(e,t),a=null,o=null,i=Se(e,s);if(i>0&&(n=new l("group","",[n].concat(Me(i))),s+=i),s<e.length&&e[s].eq(Oe)?([a,s]=this.parseSupOrSub(e,s+1),s<e.length&&e[s].eq(Le)&&([o,s]=this.parseSupOrSub(e,s+1))):s<e.length&&e[s].eq(Le)&&([o,s]=this.parseSupOrSub(e,s+1),s<e.length&&e[s].eq(Oe)&&([a,s]=this.parseSupOrSub(e,s+1))),a!==null||o!==null){let h={base:n};return a&&(h.sub=a),o&&(h.sup=o),[new l("supsub","",[],h),s]}else return[n,s]}parseSupOrSub(e,t){let n,s;if(e[t].eq(C)){let o=F(e,t);[n,s]=this.parseGroup(e,t+1,o)}else[n,s]=this.parseNextExprWithoutSupSub(e,t);let a=Se(e,s);return a>0&&(n=new l("group","",[n].concat(Me(a))),s+=a),[n,s]}parseNextExprWithoutSupSub(e,t){let n=e[t],s=n.toNode();if(n.eq(C)){let a=F(e,t);return this.parseGroup(e,t+1,a,!0)}if(n.type===2&&!we(n.value[0]))return[s,t+1];if([2,1].includes(n.type)&&t+1<e.length&&e[t+1].eq(C)){if(n.value==="mat"){let[h,g,d]=this.parseGroupsOfArguments(e,t+1),m=new l("matrix","",[],h);return m.setOptions(g),[m,d]}if(n.value==="cases"){let[h,g,d]=this.parseGroupsOfArguments(e,t+1,Ae),m=new l("cases","",[],h);return m.setOptions(g),[m,d]}if(n.value==="lr"){let[h,g,d]=this.parseLrArguments(e,t+1);return[new l("funcCall",n.value,h,d),g]}let[a,o]=this.parseArguments(e,t+1);return[new l("funcCall",n.value,a),o]}return[s,t+1]}parseArguments(e,t){let n=F(e,t);return[this.parseCommaSeparatedArguments(e,t+1,n),n+1]}parseLrArguments(e,t){if(e[t+1].isOneOf([C,ge,de,pe])){let n=F(e,t),s=t+1,a=mt(e,s);return[this.parseCommaSeparatedArguments(e,s+1,a),n+1,{leftDelim:e[s].value,rightDelim:e[a].value}]}else{let[n,s]=this.parseArguments(e,t);return[n,s,{leftDelim:null,rightDelim:null}]}}parseGroupsOfArguments(e,t,n=Tt){let s=F(e,t);e=e.slice(0,s);let a=[],o={},i=t+1;for(;i<s;)for(;i<s;){let y=function(x){let q=new l("atom",":"),S={},D=[];for(let N=0;N<x.length;N++){if(x[N].type!=="group")continue;let M=x[N],O=R(M.args,q);if(O===-1||O===0)continue;if(D.push(N),M.args[O-1].eq(new l("symbol","delim"))){if(M.args.length!==3)throw new k("Invalid number of arguments for delim");switch(M.args[O+1].type){case"text":{S.delim=M.args[O+1].content;break}case"none":{S.delim=L;break}case"symbol":{S.delim=M.args[O+1];break}default:throw new k("Not implemented for other types of delim")}}else throw new k("Not implemented for other named parameters")}for(let N=D.length-1;N>=0;N--)x.splice(D[N],1);return[x,S]};var h=y;let g=R(e,n,i);g===-1&&(g=s);let d=this.parseCommaSeparatedArguments(e,i,g),m={};[d,m]=y(d),a.push(d),Object.assign(o,m),i=g+1}return[a,o,s+1]}parseCommaSeparatedArguments(e,t,n){let s=[],a=t;for(;a<n;){let o=[];for(;a<n;){if(e[a].eq(Ae)){a+=1;break}else if(e[a].eq(yt)){a+=1;continue}let[h,g]=this.parseNextExpr(e,a);a=g,o.push(h)}let i;o.length===1?i=o[0]:i=j(o),s.push(i)}return s}};function Be(r){let e=new he,t=ke(r);return e.parse(t)}var K=class{constructor(){this.buffer="";this.queue=[]}writeBuffer(e){let t=e.toString(),n=!1;e.type===4?n=!0:(n||=/[{\(\[\|]$/.test(this.buffer),n||=/\\\w+$/.test(this.buffer)&&t==="[",n||=/^[\.,;:!\?\(\)\]{}_^]$/.test(t),n||=["\\{","\\}"].includes(t),n||=t==="'",n||=this.buffer.endsWith("_")||this.buffer.endsWith("^"),n||=/\s$/.test(this.buffer),n||=/^\s/.test(t),n||=this.buffer==="",n||=/[\(\[{]\s*(-|\+)$/.test(this.buffer)||this.buffer==="-"||this.buffer==="+",n||=this.buffer.endsWith("&")&&t==="="),n||(this.buffer+=" "),this.buffer+=t}append(e){let t=new u("control","&"),n=new u("control","\\\\");if(e.type==="ordgroup"&&$(e.args,t)){let s=Q(e.args,n),a=[];for(let o of s){let i=Q(o,t);a.push(i.map(h=>new u("ordgroup","",h)))}e=new u("beginend","aligned",[],a)}this.queue=this.queue.concat(e.serialize())}flushQueue(){for(let e=0;e<this.queue.length;e++)this.writeBuffer(this.queue[e]);this.queue=[]}finalize(){return this.flushQueue(),this.buffer}};function ze(r,e){let t={nonStrict:!0,preferShorthands:!0,keepSpaces:!1,fracToSlash:!0,inftyToOo:!1,optimize:!0,nonAsciiWrapper:"",customTexMacros:{}};if(e!==void 0)for(let o in t)e[o]!==void 0&&(t[o]=e[o]);let n=qe(r,t.customTexMacros),s=T(n,t),a=new H(t);return a.serialize(s),a.finalize()}function Ie(r){let e=Be(r),t=b(e),n=new K;return n.append(t),n.finalize()}typeof window<"u"&&(window.tex2typst=ze,window.typst2tex=Ie);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tex2typst",
3
- "version": "0.3.20",
3
+ "version": "0.3.22",
4
4
  "description": "JavaScript library for converting TeX code to Typst",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/convert.ts CHANGED
@@ -290,6 +290,15 @@ export function convert_tex_node_to_typst(node: TexNode, options: Tex2TypstOptio
290
290
  );
291
291
  }
292
292
 
293
+ if (node.content === '\\substack') {
294
+ // \sum_{\substack{a \\ b}} -> sum_(a \ b)
295
+ return new TypstNode(
296
+ 'group',
297
+ '',
298
+ [arg0]
299
+ );
300
+ }
301
+
293
302
  if(options.optimize) {
294
303
  // \mathbb{R} -> RR
295
304
  if (node.content === '\\mathbb' && arg0.type === 'atom' && /^[A-Z]$/.test(arg0.content)) {
@@ -319,6 +328,20 @@ export function convert_tex_node_to_typst(node: TexNode, options: Tex2TypstOptio
319
328
  if (node.content! === 'cases') {
320
329
  return new TypstNode('cases', '', [], data);
321
330
  }
331
+ if (node.content! === 'subarray') {
332
+ const align_node = node.args![0];
333
+ if (align_node.content == 'r') {
334
+ data.forEach(row => row[0].args!.push(new TypstNode('symbol', '&')));
335
+ }
336
+ if (align_node.content == 'l') {
337
+ data.forEach(row => row[0].args!.unshift(new TypstNode('symbol', '&')));
338
+ }
339
+ return new TypstNode(
340
+ 'group',
341
+ '',
342
+ [new TypstNode('align', '', [], data)]
343
+ );
344
+ }
322
345
  if (node.content! === 'array') {
323
346
  const res = new TypstNode('matrix', '', [], data);
324
347
  const options: TypstNamedParams = { 'delim': TYPST_NONE };
@@ -487,18 +510,23 @@ export function convert_typst_node_to_tex(node: TypstNode): TexNode {
487
510
  return new TexNode('whitespace', node.content);
488
511
  case 'atom':
489
512
  return new TexNode('element', node.content);
490
- case 'symbol':
491
- switch (node.content) {
492
- // special hook for comma
493
- case 'comma':
494
- return new TexNode('element', ',');
495
- // special hook for hyph and hyph.minus
496
- case 'hyph':
497
- case 'hyph.minus':
498
- return new TexNode('text', '-');
499
- default:
500
- return new TexNode('symbol', typst_token_to_tex(node.content));
513
+ case 'symbol': {
514
+ // special hook for comma
515
+ if(node.content === 'comma') {
516
+ return new TexNode('element', ',');
517
+ }
518
+ // special hook for hyph and hyph.minus
519
+ if(node.content === 'hyph' || node.content === 'hyph.minus') {
520
+ return new TexNode('text', '-');
521
+ }
522
+ // special hook for mathbb{R} <-- RR
523
+ if(/^([A-Z])\1$/.test(node.content)) {
524
+ return new TexNode('unaryFunc', '\\mathbb', [
525
+ new TexNode('element', node.content[0])
526
+ ]);
501
527
  }
528
+ return new TexNode('symbol', typst_token_to_tex(node.content));
529
+ }
502
530
  case 'text':
503
531
  return new TexNode('text', node.content);
504
532
  case 'comment':
@@ -1,138 +1,139 @@
1
- import { TexToken, TexTokenType } from "./types";
2
- import { assert } from "./util";
3
- import { JSLex, Scanner } from "./jslex";
4
-
5
- export const TEX_UNARY_COMMANDS = [
6
- 'sqrt',
7
- 'text',
8
-
9
- 'bar',
10
- 'bold',
11
- 'boldsymbol',
12
- 'ddot',
13
- 'dot',
14
- 'hat',
15
- 'mathbb',
16
- 'mathbf',
17
- 'mathcal',
18
- 'mathfrak',
19
- 'mathit',
20
- 'mathrm',
21
- 'mathscr',
22
- 'mathsf',
23
- 'mathtt',
24
- 'operatorname',
25
- 'overbrace',
26
- 'overline',
27
- 'pmb',
28
- 'rm',
29
- 'tilde',
30
- 'underbrace',
31
- 'underline',
32
- 'vec',
33
- 'widehat',
34
- 'widetilde',
35
- 'overleftarrow',
36
- 'overrightarrow',
37
- 'hspace',
38
- ]
39
-
40
- export const TEX_BINARY_COMMANDS = [
41
- 'frac',
42
- 'tfrac',
43
- 'binom',
44
- 'dbinom',
45
- 'dfrac',
46
- 'tbinom',
47
- 'overset',
48
- 'underset',
49
- ]
50
-
51
-
52
- function unescape(str: string): string {
53
- const chars = ['{', '}', '\\', '$', '&', '#', '_', '%'];
54
- for (const char of chars) {
55
- str = str.replaceAll('\\' + char, char);
56
- }
57
- return str;
58
- }
59
-
60
- const rules_map = new Map<string, (a: Scanner<TexToken>) => TexToken | TexToken[]>([
61
- [
62
- String.raw`\\(text|operatorname|begin|end|hspace){.+?}`, (s) => {
63
- const text = s.text()!;
64
- const command = text.substring(0, text.indexOf('{'));
65
- const text_inside = text.substring(text.indexOf('{') + 1, text.lastIndexOf('}'));
66
- return [
67
- new TexToken(TexTokenType.COMMAND, command),
68
- new TexToken(TexTokenType.CONTROL, '{'),
69
- new TexToken(TexTokenType.TEXT, unescape(text_inside)),
70
- new TexToken(TexTokenType.CONTROL, '}')
71
- ]
72
- }
73
- ],
74
- [String.raw`%[^\n]*`, (s) => new TexToken(TexTokenType.COMMENT, s.text()!.substring(1))],
75
- [String.raw`[{}_^&]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
76
- [String.raw`\\[\\,:;! ]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
77
- [String.raw`\r?\n`, (_s) => new TexToken(TexTokenType.NEWLINE, "\n")],
78
- [String.raw`\s+`, (s) => new TexToken(TexTokenType.SPACE, s.text()!)],
79
- [String.raw`\\[{}%$&#_|]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
80
- // e.g. match `\frac13`, `\frac1 b`, `\frac a b`
81
- [String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`, (s) => {
82
- const text = s.text()!;
83
- const regex = RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`);
84
- const match = text.match(regex);
85
- assert(match !== null);
86
- const command = match![1];
87
- if (TEX_BINARY_COMMANDS.includes(command.substring(1))) {
88
- const arg1 = match![2].trimStart();
89
- const arg2 = match![3];
90
- return [
91
- new TexToken(TexTokenType.COMMAND, command),
92
- new TexToken(TexTokenType.ELEMENT, arg1),
93
- new TexToken(TexTokenType.ELEMENT, arg2),
94
- ];
95
- } else {
96
- s.reject();
97
- return [];
98
- }
99
- }],
100
- // e.g. match `\sqrt3`, `\sqrt a`
101
- [String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`, (s) => {
102
- const text = s.text()!;
103
- const regex = RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`);
104
- const match = text.match(regex);
105
- assert(match !== null);
106
- const command = match![1];
107
- if (TEX_UNARY_COMMANDS.includes(command.substring(1))) {
108
- const arg1 = match![2].trimStart();
109
- return [
110
- new TexToken(TexTokenType.COMMAND, command),
111
- new TexToken(TexTokenType.ELEMENT, arg1),
112
- ];
113
- } else {
114
- s.reject();
115
- return [];
116
- }
117
- }],
118
- [String.raw`\\[a-zA-Z]+`, (s) => {
119
- const command = s.text()!;
120
- return [ new TexToken(TexTokenType.COMMAND, command), ];
121
- }],
122
- // Numbers like "123", "3.14"
123
- [String.raw`[0-9]+(\.[0-9]+)?`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
124
- [String.raw`[a-zA-Z]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
125
- [String.raw`[+\-*/='<>!.,;:?()\[\]|]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
126
- // non-ASCII characters
127
- [String.raw`[^\x00-\x7F]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
128
- [String.raw`.`, (s) => new TexToken(TexTokenType.UNKNOWN, s.text()!)],
129
- ]);
130
-
131
- const spec = {
132
- "start": rules_map
133
- };
134
-
135
- export function tokenize_tex(input: string): TexToken[] {
136
- const lexer = new JSLex<TexToken>(spec);
137
- return lexer.collect(input);
138
- }
1
+ import { TexToken, TexTokenType } from "./types";
2
+ import { assert } from "./util";
3
+ import { JSLex, Scanner } from "./jslex";
4
+
5
+ export const TEX_UNARY_COMMANDS = [
6
+ 'sqrt',
7
+ 'text',
8
+
9
+ 'bar',
10
+ 'bold',
11
+ 'boldsymbol',
12
+ 'ddot',
13
+ 'dot',
14
+ 'hat',
15
+ 'mathbb',
16
+ 'mathbf',
17
+ 'mathcal',
18
+ 'mathfrak',
19
+ 'mathit',
20
+ 'mathrm',
21
+ 'mathscr',
22
+ 'mathsf',
23
+ 'mathtt',
24
+ 'operatorname',
25
+ 'overbrace',
26
+ 'overline',
27
+ 'pmb',
28
+ 'rm',
29
+ 'tilde',
30
+ 'underbrace',
31
+ 'underline',
32
+ 'vec',
33
+ 'widehat',
34
+ 'widetilde',
35
+ 'overleftarrow',
36
+ 'overrightarrow',
37
+ 'hspace',
38
+ 'substack',
39
+ ]
40
+
41
+ export const TEX_BINARY_COMMANDS = [
42
+ 'frac',
43
+ 'tfrac',
44
+ 'binom',
45
+ 'dbinom',
46
+ 'dfrac',
47
+ 'tbinom',
48
+ 'overset',
49
+ 'underset',
50
+ ]
51
+
52
+
53
+ function unescape(str: string): string {
54
+ const chars = ['{', '}', '\\', '$', '&', '#', '_', '%'];
55
+ for (const char of chars) {
56
+ str = str.replaceAll('\\' + char, char);
57
+ }
58
+ return str;
59
+ }
60
+
61
+ const rules_map = new Map<string, (a: Scanner<TexToken>) => TexToken | TexToken[]>([
62
+ [
63
+ String.raw`\\(text|operatorname|begin|end|hspace){.+?}`, (s) => {
64
+ const text = s.text()!;
65
+ const command = text.substring(0, text.indexOf('{'));
66
+ const text_inside = text.substring(text.indexOf('{') + 1, text.lastIndexOf('}'));
67
+ return [
68
+ new TexToken(TexTokenType.COMMAND, command),
69
+ new TexToken(TexTokenType.CONTROL, '{'),
70
+ new TexToken(TexTokenType.TEXT, unescape(text_inside)),
71
+ new TexToken(TexTokenType.CONTROL, '}')
72
+ ]
73
+ }
74
+ ],
75
+ [String.raw`%[^\n]*`, (s) => new TexToken(TexTokenType.COMMENT, s.text()!.substring(1))],
76
+ [String.raw`[{}_^&]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
77
+ [String.raw`\\[\\,:;! ]`, (s) => new TexToken(TexTokenType.CONTROL, s.text()!)],
78
+ [String.raw`\r?\n`, (_s) => new TexToken(TexTokenType.NEWLINE, "\n")],
79
+ [String.raw`\s+`, (s) => new TexToken(TexTokenType.SPACE, s.text()!)],
80
+ [String.raw`\\[{}%$&#_|]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
81
+ // e.g. match `\frac13`, `\frac1 b`, `\frac a b`
82
+ [String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`, (s) => {
83
+ const text = s.text()!;
84
+ const regex = RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])\s*([0-9a-zA-Z])`);
85
+ const match = text.match(regex);
86
+ assert(match !== null);
87
+ const command = match![1];
88
+ if (TEX_BINARY_COMMANDS.includes(command.substring(1))) {
89
+ const arg1 = match![2].trimStart();
90
+ const arg2 = match![3];
91
+ return [
92
+ new TexToken(TexTokenType.COMMAND, command),
93
+ new TexToken(TexTokenType.ELEMENT, arg1),
94
+ new TexToken(TexTokenType.ELEMENT, arg2),
95
+ ];
96
+ } else {
97
+ s.reject();
98
+ return [];
99
+ }
100
+ }],
101
+ // e.g. match `\sqrt3`, `\sqrt a`
102
+ [String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`, (s) => {
103
+ const text = s.text()!;
104
+ const regex = RegExp(String.raw`(\\[a-zA-Z]+)(\s*\d|\s+[a-zA-Z])`);
105
+ const match = text.match(regex);
106
+ assert(match !== null);
107
+ const command = match![1];
108
+ if (TEX_UNARY_COMMANDS.includes(command.substring(1))) {
109
+ const arg1 = match![2].trimStart();
110
+ return [
111
+ new TexToken(TexTokenType.COMMAND, command),
112
+ new TexToken(TexTokenType.ELEMENT, arg1),
113
+ ];
114
+ } else {
115
+ s.reject();
116
+ return [];
117
+ }
118
+ }],
119
+ [String.raw`\\[a-zA-Z]+`, (s) => {
120
+ const command = s.text()!;
121
+ return [ new TexToken(TexTokenType.COMMAND, command), ];
122
+ }],
123
+ // Numbers like "123", "3.14"
124
+ [String.raw`[0-9]+(\.[0-9]+)?`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
125
+ [String.raw`[a-zA-Z]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
126
+ [String.raw`[+\-*/='<>!.,;:?()\[\]|]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
127
+ // non-ASCII characters
128
+ [String.raw`[^\x00-\x7F]`, (s) => new TexToken(TexTokenType.ELEMENT, s.text()!)],
129
+ [String.raw`.`, (s) => new TexToken(TexTokenType.UNKNOWN, s.text()!)],
130
+ ]);
131
+
132
+ const spec = {
133
+ "start": rules_map
134
+ };
135
+
136
+ export function tokenize_tex(input: string): TexToken[] {
137
+ const lexer = new JSLex<TexToken>(spec);
138
+ return lexer.collect(input);
139
+ }