export_katex.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. // SiYuan - Refactor your thinking
  2. // Copyright (c) 2020-present, b3log.org
  3. //
  4. // This program is free software: you can redistribute it and/or modify
  5. // it under the terms of the GNU Affero General Public License as published by
  6. // the Free Software Foundation, either version 3 of the License, or
  7. // (at your option) any later version.
  8. //
  9. // This program is distributed in the hope that it will be useful,
  10. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. // GNU Affero General Public License for more details.
  13. //
  14. // You should have received a copy of the GNU Affero General Public License
  15. // along with this program. If not, see <https://www.gnu.org/licenses/>.
  16. package model
  17. import (
  18. "sort"
  19. "strings"
  20. )
  21. func extractUsedMacros(mathContent string, macrosKeys *[]string) (ret []string) {
  22. Next:
  23. for {
  24. for _, k := range *macrosKeys {
  25. if idx := strings.Index(mathContent, k); -1 < idx {
  26. mathContent = strings.Replace(mathContent, k, "__@"+k[1:]+"@__", 1)
  27. ret = append(ret, k)
  28. goto Next
  29. }
  30. }
  31. break
  32. }
  33. return
  34. }
  35. var katexSupportedFunctions = []string{ // https://katex.org/docs/supported.html
  36. "\\!",
  37. "\\\"",
  38. "\\#",
  39. "\\$",
  40. "\\%",
  41. "\\&",
  42. "\\'",
  43. "\\,",
  44. "\\.",
  45. "\\:",
  46. "\\;",
  47. "\\=",
  48. "\\>",
  49. "\\Alpha",
  50. "\\And",
  51. "\\Bbb",
  52. "\\Bbbk",
  53. "\\Beta",
  54. "\\Big",
  55. "\\Bigg",
  56. "\\Biggl",
  57. "\\Biggm",
  58. "\\Biggr",
  59. "\\Bigl",
  60. "\\Bigm",
  61. "\\Bigr",
  62. "\\Box",
  63. "\\Bra",
  64. "\\Braket",
  65. "\\Bumpeq",
  66. "\\Cap",
  67. "\\Chi",
  68. "\\Colonapprox",
  69. "\\Coloneq",
  70. "\\Coloneqq",
  71. "\\Colonsim",
  72. "\\Complex",
  73. "\\Cup",
  74. "\\Dagger",
  75. "\\Darr",
  76. "\\Delta",
  77. "\\Diamond",
  78. "\\Doteq",
  79. "\\Downarrow",
  80. "\\Epsilon",
  81. "\\Eqcolon",
  82. "\\Eqqcolon",
  83. "\\Eta",
  84. "\\Finv",
  85. "\\Game",
  86. "\\Gamma",
  87. "\\H",
  88. "\\Harr",
  89. "\\Huge AB",
  90. "\\Im",
  91. "\\Iota",
  92. "\\Join",
  93. "\\KaTeX",
  94. "\\Kappa",
  95. "\\Ket",
  96. "\\LARGE AB",
  97. "\\LaTeX",
  98. "\\Lambda",
  99. "\\Large AB",
  100. "\\Larr",
  101. "\\Leftarrow",
  102. "\\Leftrightarrow",
  103. "\\Lleftarrow",
  104. "\\Longleftarrow",
  105. "\\Longleftrightarrow",
  106. "\\Longrightarrow",
  107. "\\Lrarr",
  108. "\\Lsh",
  109. "\\Mu",
  110. "\\N",
  111. "\\Nu",
  112. "\\Omega",
  113. "\\Omicron",
  114. "\\Overrightarrow",
  115. "\\P",
  116. "\\Phi",
  117. "\\Pi",
  118. "\\Pr",
  119. "\\Psi",
  120. "\\R",
  121. "\\Rarr",
  122. "\\Re",
  123. "\\Reals",
  124. "\\Rho",
  125. "\\Rightarrow",
  126. "\\Rrightarrow",
  127. "\\Rsh",
  128. "\\S",
  129. "\\Set",
  130. "\\Sigma",
  131. "\\Subset",
  132. "\\Supset",
  133. "\\Tau",
  134. "\\TeX",
  135. "\\Theta",
  136. "\\Uarr",
  137. "\\Uparrow",
  138. "\\Updownarrow",
  139. "\\Upsilon",
  140. "\\Vdash",
  141. "\\Vert",
  142. "\\Vvdash",
  143. "\\Xi",
  144. "\\Z",
  145. "\\Zeta",
  146. "\\^",
  147. "\\_",
  148. "\\`",
  149. "\\acute",
  150. "\\alef",
  151. "\\alefsym",
  152. "\\aleph",
  153. "\\alpha",
  154. "\\amalg",
  155. "\\angle",
  156. "\\approx",
  157. "\\approxcolon",
  158. "\\approxcoloncolon",
  159. "\\approxeq",
  160. "\\arccos",
  161. "\\arcctg",
  162. "\\arcsin",
  163. "\\arctan",
  164. "\\arctg",
  165. "\\arg",
  166. "\\argmax",
  167. "\\argmin",
  168. "\\ast",
  169. "\\asymp",
  170. "\\backepsilon",
  171. "\\backprime",
  172. "\\backsim",
  173. "\\backsimeq",
  174. "\\backslash",
  175. "\\bar",
  176. "\\barwedge",
  177. "\\bcancel",
  178. "\\because",
  179. "\\begin",
  180. "\\beta",
  181. "\\beth",
  182. "\\between",
  183. "\\bf Ab0",
  184. "\\big",
  185. "\\bigcap",
  186. "\\bigcirc",
  187. "\\bigcup",
  188. "\\bigg",
  189. "\\biggl",
  190. "\\biggm",
  191. "\\biggr",
  192. "\\bigl",
  193. "\\bigm",
  194. "\\bigodot",
  195. "\\bigoplus",
  196. "\\bigotimes",
  197. "\\bigr",
  198. "\\bigsqcup",
  199. "\\bigstar",
  200. "\\bigtriangledown",
  201. "\\bigtriangleup",
  202. "\\biguplus",
  203. "\\bigvee",
  204. "\\bigwedge",
  205. "\\binom",
  206. "\\blacklozenge",
  207. "\\blacksquare",
  208. "\\blacktriangle",
  209. "\\blacktriangledown",
  210. "\\blacktriangleleft",
  211. "\\blacktriangleright",
  212. "\\bm",
  213. "\\bmod",
  214. "\\bold",
  215. "\\boldsymbol",
  216. "\\bot",
  217. "\\bowtie",
  218. "\\boxdot",
  219. "\\boxed",
  220. "\\boxminus",
  221. "\\boxplus",
  222. "\\boxtimes",
  223. "\\bra",
  224. "\\braket",
  225. "\\breve",
  226. "\\bullet",
  227. "\\bumpeq",
  228. "\\cal AB0",
  229. "\\cancel",
  230. "\\cap",
  231. "\\cdot",
  232. "\\cdotp",
  233. "\\cdots",
  234. "\\centerdot",
  235. "\\cfrac",
  236. "\\ch",
  237. "\\check",
  238. "\\checkmark",
  239. "\\chi",
  240. "\\circ",
  241. "\\circeq",
  242. "\\circlearrowleft",
  243. "\\circlearrowright",
  244. "\\circledR",
  245. "\\circledS",
  246. "\\circledast",
  247. "\\circledcirc",
  248. "\\circleddash",
  249. "\\clubs",
  250. "\\clubsuit",
  251. "\\cnums",
  252. "\\colon",
  253. "\\colonapprox",
  254. "\\coloncolon",
  255. "\\coloncolonapprox",
  256. "\\coloncolonequals",
  257. "\\coloncolonminus",
  258. "\\coloncolonsim",
  259. "\\coloneq",
  260. "\\coloneqq",
  261. "\\colonequals",
  262. "\\colonminus",
  263. "\\colonsim",
  264. "\\complement",
  265. "\\cong",
  266. "\\coprod",
  267. "\\copyright",
  268. "\\cos",
  269. "\\cosec",
  270. "\\cosh",
  271. "\\cot",
  272. "\\cotg",
  273. "\\coth",
  274. "\\csc",
  275. "\\ctg",
  276. "\\cth",
  277. "\\cup",
  278. "\\curlyeqprec",
  279. "\\curlyeqsucc",
  280. "\\curlyvee",
  281. "\\curlywedge",
  282. "\\curvearrowleft",
  283. "\\curvearrowright",
  284. "\\dArr",
  285. "\\dag",
  286. "\\dagger",
  287. "\\daleth",
  288. "\\darr",
  289. "\\dashleftarrow",
  290. "\\dashrightarrow",
  291. "\\dashv",
  292. "\\dbinom",
  293. "\\dblcolon",
  294. "\\ddag",
  295. "\\ddagger",
  296. "\\ddot",
  297. "\\ddots",
  298. "\\def\\arraystretch",
  299. "\\def\\foo",
  300. "\\deg",
  301. "\\degree",
  302. "\\delta",
  303. "\\det",
  304. "\\dfrac",
  305. "\\diagdown",
  306. "\\diagup",
  307. "\\diamond",
  308. "\\diamonds",
  309. "\\diamondsuit",
  310. "\\digamma",
  311. "\\dim",
  312. "\\displaystyle\\sum_",
  313. "\\div",
  314. "\\divideontimes",
  315. "\\dot",
  316. "\\doteq",
  317. "\\doteqdot",
  318. "\\dotplus",
  319. "\\dots",
  320. "\\dotsb",
  321. "\\dotsc",
  322. "\\dotsi",
  323. "\\dotsm",
  324. "\\dotso",
  325. "\\doublebarwedge",
  326. "\\doublecap",
  327. "\\doublecup",
  328. "\\downarrow",
  329. "\\downdownarrows",
  330. "\\downharpoonleft",
  331. "\\downharpoonright",
  332. "\\edef\\macroname#1#2…",
  333. "\\ell",
  334. "\\empty",
  335. "\\emptyset",
  336. "\\end",
  337. "\\enspace",
  338. "\\epsilon",
  339. "\\eqcirc",
  340. "\\eqcolon",
  341. "\\eqqcolon",
  342. "\\eqsim",
  343. "\\eqslantgtr",
  344. "\\eqslantless",
  345. "\\equalscolon",
  346. "\\equalscoloncolon",
  347. "\\equiv",
  348. "\\eta",
  349. "\\eth",
  350. "\\exist",
  351. "\\exists",
  352. "\\exp",
  353. "\\fallingdotseq",
  354. "\\flat",
  355. "\\footnotesize AB",
  356. "\\forall",
  357. "\\frac",
  358. "\\frak",
  359. "\\frown",
  360. "\\futurelet\\foo\\bar x",
  361. "\\gamma",
  362. "\\gcd",
  363. "\\gdef\\bar#1",
  364. "\\ge",
  365. "\\genfrac ( ] ",
  366. "\\geq",
  367. "\\geqq",
  368. "\\geqslant",
  369. "\\gets",
  370. "\\gg",
  371. "\\ggg",
  372. "\\gggtr",
  373. "\\gimel",
  374. "\\global\\def\\macroname#1#2…",
  375. "\\gnapprox",
  376. "\\gneq",
  377. "\\gneqq",
  378. "\\gnsim",
  379. "\\grave",
  380. "\\gt",
  381. "\\gtrapprox",
  382. "\\gtrdot",
  383. "\\gtreqless",
  384. "\\gtreqqless",
  385. "\\gtrless",
  386. "\\gtrsim",
  387. "\\gvertneqq",
  388. "\\hArr",
  389. "\\harr",
  390. "\\hat",
  391. "\\hbar",
  392. "\\hdashline",
  393. "\\hearts",
  394. "\\heartsuit",
  395. "\\hom",
  396. "\\hookleftarrow",
  397. "\\hookrightarrow",
  398. "\\hphantom",
  399. "\\href",
  400. "\\hskip",
  401. "\\hslash",
  402. "\\hspace",
  403. "\\hspace*",
  404. "\\htmlClass",
  405. "\\htmlData",
  406. "\\htmlId",
  407. "\\htmlStyle",
  408. "\\huge AB",
  409. "\\iff",
  410. "\\iiint",
  411. "\\iint",
  412. "\\image",
  413. "\\imageof",
  414. "\\imath",
  415. "\\impliedby",
  416. "\\implies",
  417. "\\in",
  418. "\\includegraphics[height=0.8em, totalheight=0.9em, width=0.9em, alt=KA logo]",
  419. "\\inf",
  420. "\\infin",
  421. "\\infty",
  422. "\\injlim",
  423. "\\int",
  424. "\\intercal",
  425. "\\intop",
  426. "\\iota",
  427. "\\isin",
  428. "\\it Ab0",
  429. "\\jmath",
  430. "\\kappa",
  431. "\\ker",
  432. "\\kern",
  433. "\\ket",
  434. "\\lArr",
  435. "\\lBrace \\rBrace",
  436. "\\lVert",
  437. "\\lambda",
  438. "\\land",
  439. "\\lang",
  440. "\\langle",
  441. "\\large AB",
  442. "\\larr",
  443. "\\lbrace",
  444. "\\lbrack",
  445. "\\lceil",
  446. "\\ldotp",
  447. "\\ldots",
  448. "\\le",
  449. "\\leadsto",
  450. "\\left",
  451. "\\left(x^",
  452. "\\left.",
  453. "\\leftarrow",
  454. "\\leftarrowtail",
  455. "\\leftharpoondown",
  456. "\\leftharpoonup",
  457. "\\leftleftarrows",
  458. "\\leftrightarrow",
  459. "\\leftrightarrows",
  460. "\\leftrightharpoons",
  461. "\\leftrightsquigarrow",
  462. "\\leftthreetimes",
  463. "\\leq",
  464. "\\leqq",
  465. "\\leqslant",
  466. "\\lessapprox",
  467. "\\lessdot",
  468. "\\lesseqgtr",
  469. "\\lesseqqgtr",
  470. "\\lessgtr",
  471. "\\lesssim",
  472. "\\let\\foo=\\bar",
  473. "\\lfloor",
  474. "\\lg",
  475. "\\lgroup",
  476. "\\lhd",
  477. "\\lim",
  478. "\\lim\\limits_x",
  479. "\\lim\\nolimits_x",
  480. "\\liminf",
  481. "\\limsup",
  482. "\\ll",
  483. "\\llbracket",
  484. "\\llcorner",
  485. "\\lll",
  486. "\\llless",
  487. "\\lmoustache",
  488. "\\ln",
  489. "\\lnapprox",
  490. "\\lneq",
  491. "\\lneqq",
  492. "\\lnot",
  493. "\\lnsim",
  494. "\\log",
  495. "\\longleftarrow",
  496. "\\longleftrightarrow",
  497. "\\longmapsto",
  498. "\\longrightarrow",
  499. "\\looparrowleft",
  500. "\\looparrowright",
  501. "\\lor",
  502. "\\lozenge",
  503. "\\lparen",
  504. "\\lq",
  505. "\\lrArr",
  506. "\\lrarr",
  507. "\\lrcorner",
  508. "\\lt",
  509. "\\lt \\gt",
  510. "\\ltimes",
  511. "\\lvert",
  512. "\\lvertneqq",
  513. "\\maltese",
  514. "\\mapsto",
  515. "\\mathbb",
  516. "\\mathbf",
  517. "\\mathcal",
  518. "\\mathellipsis",
  519. "\\mathfrak",
  520. "\\mathit",
  521. "\\mathnormal",
  522. "\\mathring",
  523. "\\mathrlap",
  524. "\\mathrm",
  525. "\\mathscr",
  526. "\\mathsf",
  527. "\\mathsterling",
  528. "\\mathstrut",
  529. "\\mathtt",
  530. "\\max",
  531. "\\measuredangle",
  532. "\\medspace",
  533. "\\mho",
  534. "\\mid",
  535. "\\middle",
  536. "\\min",
  537. "\\minuscolon",
  538. "\\minuscoloncolon",
  539. "\\minuso",
  540. "\\mkern",
  541. "\\models",
  542. "\\mp",
  543. "\\mskip",
  544. "\\mu",
  545. "\\multimap",
  546. "\\nLeftarrow",
  547. "\\nLeftrightarrow",
  548. "\\nRightarrow",
  549. "\\nVDash",
  550. "\\nVdash",
  551. "\\nabla",
  552. "\\natnums",
  553. "\\natural",
  554. "\\ncong",
  555. "\\ne",
  556. "\\nearrow",
  557. "\\neg",
  558. "\\negmedspace",
  559. "\\negthickspace",
  560. "\\negthinspace",
  561. "\\neq",
  562. "\\newcommand\\macroname[numargs]",
  563. "\\nexists",
  564. "\\ngeq",
  565. "\\ngeqq",
  566. "\\ngeqslant",
  567. "\\ngtr",
  568. "\\ni",
  569. "\\nleftarrow",
  570. "\\nleftrightarrow",
  571. "\\nleq",
  572. "\\nleqq",
  573. "\\nleqslant",
  574. "\\nless",
  575. "\\nmid",
  576. "\\nobreakspace",
  577. "\\nonumber",
  578. "\\normalsize AB",
  579. "\\not =",
  580. "\\notag",
  581. "\\notin",
  582. "\\notni",
  583. "\\nparallel",
  584. "\\nprec",
  585. "\\npreceq",
  586. "\\nrightarrow",
  587. "\\nshortmid",
  588. "\\nshortparallel",
  589. "\\nsim",
  590. "\\nsubseteq",
  591. "\\nsubseteqq",
  592. "\\nsucc",
  593. "\\nsucceq",
  594. "\\nsupseteq",
  595. "\\nsupseteqq",
  596. "\\ntriangleleft",
  597. "\\ntrianglelefteq",
  598. "\\ntriangleright",
  599. "\\ntrianglerighteq",
  600. "\\nu",
  601. "\\nvDash",
  602. "\\nvdash",
  603. "\\nwarrow",
  604. "\\odot",
  605. "\\oiiint",
  606. "\\oiint",
  607. "\\oint",
  608. "\\omega",
  609. "\\omicron",
  610. "\\ominus",
  611. "\\operatorname",
  612. "\\operatorname*",
  613. "\\operatornamewithlimits",
  614. "\\oplus",
  615. "\\origof",
  616. "\\oslash",
  617. "\\otimes",
  618. "\\overbrace",
  619. "\\overgroup",
  620. "\\overleftarrow",
  621. "\\overleftharpoon",
  622. "\\overleftrightarrow",
  623. "\\overline",
  624. "\\overlinesegment",
  625. "\\overrightarrow",
  626. "\\overrightharpoon",
  627. "\\overset",
  628. "\\owns",
  629. "\\parallel",
  630. "\\partial",
  631. "\\perp",
  632. "\\phantom",
  633. "\\phase",
  634. "\\phi",
  635. "\\pi",
  636. "\\pitchfork",
  637. "\\plim",
  638. "\\plusmn",
  639. "\\pm",
  640. "\\pounds",
  641. "\\prec",
  642. "\\precapprox",
  643. "\\preccurlyeq",
  644. "\\preceq",
  645. "\\precnapprox",
  646. "\\precneqq",
  647. "\\precnsim",
  648. "\\precsim",
  649. "\\prime",
  650. "\\prod",
  651. "\\projlim",
  652. "\\propto",
  653. "\\providecommand\\macroname[numargs]",
  654. "\\psi",
  655. "\\qquad",
  656. "\\quad",
  657. "\\r",
  658. "\\rArr",
  659. "\\rVert",
  660. "\\rang",
  661. "\\rangle",
  662. "\\rarr",
  663. "\\ratio",
  664. "\\rbrace",
  665. "\\rbrack",
  666. "\\rceil",
  667. "\\real",
  668. "\\reals",
  669. "\\renewcommand\\macroname[numargs]",
  670. "\\restriction",
  671. "\\rfloor",
  672. "\\rgroup",
  673. "\\rhd",
  674. "\\rho",
  675. "\\right",
  676. "\\right.",
  677. "\\rightarrow",
  678. "\\rightarrowtail",
  679. "\\rightharpoondown",
  680. "\\rightharpoonup",
  681. "\\rightleftarrows",
  682. "\\rightleftharpoons",
  683. "\\rightrightarrows",
  684. "\\rightsquigarrow",
  685. "\\rightthreetimes",
  686. "\\risingdotseq",
  687. "\\rm Ab0",
  688. "\\rmoustache",
  689. "\\rparen",
  690. "\\rq",
  691. "\\rrbracket",
  692. "\\rtimes",
  693. "\\rvert",
  694. "\\scriptscriptstyle x",
  695. "\\scriptsize AB",
  696. "\\scriptstyle x",
  697. "\\sdot",
  698. "\\searrow",
  699. "\\sec",
  700. "\\set",
  701. "\\setminus",
  702. "\\sf Ab0",
  703. "\\sh",
  704. "\\sharp",
  705. "\\shortmid",
  706. "\\shortparallel",
  707. "\\sigma",
  708. "\\sim",
  709. "\\simcolon",
  710. "\\simcoloncolon",
  711. "\\simeq",
  712. "\\sin",
  713. "\\sinh",
  714. "\\small AB",
  715. "\\smallfrown",
  716. "\\smallint",
  717. "\\smallsetminus",
  718. "\\smallsmile",
  719. "\\smile",
  720. "\\sout",
  721. "\\space",
  722. "\\spades",
  723. "\\spadesuit",
  724. "\\sphericalangle",
  725. "\\sqcap",
  726. "\\sqcup",
  727. "\\sqrt",
  728. "\\sqsubset",
  729. "\\sqsubseteq",
  730. "\\sqsupset",
  731. "\\sqsupseteq",
  732. "\\square",
  733. "\\stackrel",
  734. "\\star",
  735. "\\sub",
  736. "\\sube",
  737. "\\subset",
  738. "\\subseteq",
  739. "\\subseteqq",
  740. "\\subsetneq",
  741. "\\subsetneqq",
  742. "\\succ",
  743. "\\succapprox",
  744. "\\succcurlyeq",
  745. "\\succeq",
  746. "\\succnapprox",
  747. "\\succneqq",
  748. "\\succnsim",
  749. "\\succsim",
  750. "\\sum",
  751. "\\sum_",
  752. "\\sup",
  753. "\\supe",
  754. "\\supset",
  755. "\\supseteq",
  756. "\\supseteqq",
  757. "\\supsetneq",
  758. "\\supsetneqq",
  759. "\\surd",
  760. "\\swarrow",
  761. "\\tan",
  762. "\\tanh",
  763. "\\tau",
  764. "\\tbinom",
  765. "\\text",
  766. "\\textbf",
  767. "\\textit",
  768. "\\textmd",
  769. "\\textnormal",
  770. "\\textrm",
  771. "\\textsf",
  772. "\\textstyle\\sum_",
  773. "\\texttt",
  774. "\\textup",
  775. "\\tfrac",
  776. "\\tg",
  777. "\\th",
  778. "\\therefore",
  779. "\\theta",
  780. "\\thetasym",
  781. "\\thickapprox",
  782. "\\thicksim",
  783. "\\thickspace",
  784. "\\thinspace",
  785. "\\tilde",
  786. "\\times",
  787. "\\tiny AB",
  788. "\\to",
  789. "\\top",
  790. "\\triangle",
  791. "\\triangledown",
  792. "\\triangleleft",
  793. "\\trianglelefteq",
  794. "\\triangleq",
  795. "\\triangleright",
  796. "\\trianglerighteq",
  797. "\\tt Ab0",
  798. "\\twoheadleftarrow",
  799. "\\twoheadrightarrow",
  800. "\\u",
  801. "\\uArr",
  802. "\\uarr",
  803. "\\ulcorner",
  804. "\\underbar",
  805. "\\underbrace",
  806. "\\undergroup",
  807. "\\underleftarrow",
  808. "\\underleftrightarrow",
  809. "\\underline",
  810. "\\underlinesegment",
  811. "\\underrightarrow",
  812. "\\underset",
  813. "\\unlhd",
  814. "\\unrhd",
  815. "\\uparrow",
  816. "\\updownarrow",
  817. "\\upharpoonleft",
  818. "\\upharpoonright",
  819. "\\uplus",
  820. "\\upsilon",
  821. "\\upuparrows",
  822. "\\urcorner",
  823. "\\url",
  824. "\\utilde",
  825. "\\v",
  826. "\\vDash",
  827. "\\varDelta",
  828. "\\varGamma",
  829. "\\varLambda",
  830. "\\varOmega",
  831. "\\varPhi",
  832. "\\varPi",
  833. "\\varPsi",
  834. "\\varSigma",
  835. "\\varTheta",
  836. "\\varUpsilon",
  837. "\\varXi",
  838. "\\varepsilon",
  839. "\\varinjlim",
  840. "\\varkappa",
  841. "\\varliminf",
  842. "\\varlimsup",
  843. "\\varnothing",
  844. "\\varphi",
  845. "\\varpi",
  846. "\\varprojlim",
  847. "\\varpropto",
  848. "\\varrho",
  849. "\\varsigma",
  850. "\\varsubsetneq",
  851. "\\varsubsetneqq",
  852. "\\varsupsetneq",
  853. "\\varsupsetneqq",
  854. "\\vartheta",
  855. "\\vartriangle",
  856. "\\vartriangleleft",
  857. "\\vartriangleright",
  858. "\\vcentcolon",
  859. "\\vdash",
  860. "\\vdots",
  861. "\\vec",
  862. "\\vee",
  863. "\\veebar",
  864. "\\verb!x^2!",
  865. "\\vert",
  866. "\\vphantom",
  867. "\\wedge",
  868. "\\weierp",
  869. "\\widecheck",
  870. "\\widehat",
  871. "\\widetilde",
  872. "\\wp",
  873. "\\wr",
  874. "\\xLeftarrow",
  875. "\\xLeftrightarrow",
  876. "\\xRightarrow",
  877. "\\xcancel",
  878. "\\xdef\\macroname#1#2…",
  879. "\\xhookleftarrow",
  880. "\\xhookrightarrow",
  881. "\\xi",
  882. "\\xleftarrow",
  883. "\\xleftharpoondown",
  884. "\\xleftharpoonup",
  885. "\\xleftrightarrow",
  886. "\\xleftrightharpoons",
  887. "\\xlongequal",
  888. "\\xmapsto",
  889. "\\xrightarrow[under]",
  890. "\\xrightharpoondown",
  891. "\\xrightharpoonup",
  892. "\\xrightleftharpoons",
  893. "\\xtofrom",
  894. "\\xtwoheadleftarrow",
  895. "\\xtwoheadrightarrow",
  896. "\\yen",
  897. "\\zeta",
  898. "\\|",
  899. "\\~",
  900. }
  901. func init() {
  902. sort.Slice(katexSupportedFunctions, func(i, j int) bool { return len(katexSupportedFunctions[i]) > len(katexSupportedFunctions[j]) })
  903. }
  904. func resolveKaTexMacro(macroName string, macros *map[string]string, keys *[]string) string {
  905. v := (*macros)[macroName]
  906. sort.Slice(*keys, func(i, j int) bool { return len((*keys)[i]) > len((*keys)[j]) })
  907. for _, k := range *keys {
  908. escaped := escapeKaTexSupportedFunctions(v)
  909. if strings.Contains(escaped, k) {
  910. escaped = strings.ReplaceAll(escaped, k, resolveKaTexMacro(k, macros, keys))
  911. v = unescapeKaTexSupportedFunctions(escaped)
  912. (*macros)[macroName] = v
  913. }
  914. }
  915. return v
  916. }
  917. func escapeKaTexSupportedFunctions(macroVal string) string {
  918. Next:
  919. for {
  920. for _, f := range katexSupportedFunctions {
  921. if idx := strings.Index(macroVal, f); -1 < idx {
  922. macroVal = strings.Replace(macroVal, f, "__@"+f[1:]+"@__", 1)
  923. goto Next
  924. }
  925. }
  926. break
  927. }
  928. return macroVal
  929. }
  930. func unescapeKaTexSupportedFunctions(macroVal string) string {
  931. if !strings.Contains(macroVal, "__@") {
  932. return macroVal
  933. }
  934. for _, f := range katexSupportedFunctions {
  935. macroVal = strings.ReplaceAll(macroVal, "__@"+f[1:]+"@__", f)
  936. }
  937. return macroVal
  938. }