latex.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.defaultTemplate = void 0;
  7. exports.escapeLatex = escapeLatex;
  8. exports.latexSymbols = exports.latexOperators = exports.latexFunctions = void 0;
  9. exports.toSymbol = toSymbol;
  10. var _escapeLatex = _interopRequireDefault(require("escape-latex"));
  11. var _object = require("./object.js");
  12. /* eslint no-template-curly-in-string: "off" */
  13. var latexSymbols = {
  14. // GREEK LETTERS
  15. Alpha: 'A',
  16. alpha: '\\alpha',
  17. Beta: 'B',
  18. beta: '\\beta',
  19. Gamma: '\\Gamma',
  20. gamma: '\\gamma',
  21. Delta: '\\Delta',
  22. delta: '\\delta',
  23. Epsilon: 'E',
  24. epsilon: '\\epsilon',
  25. varepsilon: '\\varepsilon',
  26. Zeta: 'Z',
  27. zeta: '\\zeta',
  28. Eta: 'H',
  29. eta: '\\eta',
  30. Theta: '\\Theta',
  31. theta: '\\theta',
  32. vartheta: '\\vartheta',
  33. Iota: 'I',
  34. iota: '\\iota',
  35. Kappa: 'K',
  36. kappa: '\\kappa',
  37. varkappa: '\\varkappa',
  38. Lambda: '\\Lambda',
  39. lambda: '\\lambda',
  40. Mu: 'M',
  41. mu: '\\mu',
  42. Nu: 'N',
  43. nu: '\\nu',
  44. Xi: '\\Xi',
  45. xi: '\\xi',
  46. Omicron: 'O',
  47. omicron: 'o',
  48. Pi: '\\Pi',
  49. pi: '\\pi',
  50. varpi: '\\varpi',
  51. Rho: 'P',
  52. rho: '\\rho',
  53. varrho: '\\varrho',
  54. Sigma: '\\Sigma',
  55. sigma: '\\sigma',
  56. varsigma: '\\varsigma',
  57. Tau: 'T',
  58. tau: '\\tau',
  59. Upsilon: "\\Upsilon",
  60. upsilon: "\\upsilon",
  61. Phi: '\\Phi',
  62. phi: '\\phi',
  63. varphi: '\\varphi',
  64. Chi: 'X',
  65. chi: '\\chi',
  66. Psi: '\\Psi',
  67. psi: '\\psi',
  68. Omega: '\\Omega',
  69. omega: '\\omega',
  70. // logic
  71. "true": '\\mathrm{True}',
  72. "false": '\\mathrm{False}',
  73. // other
  74. i: 'i',
  75. // TODO use \i ??
  76. inf: '\\infty',
  77. Inf: '\\infty',
  78. infinity: '\\infty',
  79. Infinity: '\\infty',
  80. oo: '\\infty',
  81. lim: '\\lim',
  82. undefined: '\\mathbf{?}'
  83. };
  84. exports.latexSymbols = latexSymbols;
  85. var latexOperators = {
  86. transpose: '^\\top',
  87. ctranspose: '^H',
  88. factorial: '!',
  89. pow: '^',
  90. dotPow: '.^\\wedge',
  91. // TODO find ideal solution
  92. unaryPlus: '+',
  93. unaryMinus: '-',
  94. bitNot: '\\~',
  95. // TODO find ideal solution
  96. not: '\\neg',
  97. multiply: '\\cdot',
  98. divide: '\\frac',
  99. // TODO how to handle that properly?
  100. dotMultiply: '.\\cdot',
  101. // TODO find ideal solution
  102. dotDivide: '.:',
  103. // TODO find ideal solution
  104. mod: '\\mod',
  105. add: '+',
  106. subtract: '-',
  107. to: '\\rightarrow',
  108. leftShift: '<<',
  109. rightArithShift: '>>',
  110. rightLogShift: '>>>',
  111. equal: '=',
  112. unequal: '\\neq',
  113. smaller: '<',
  114. larger: '>',
  115. smallerEq: '\\leq',
  116. largerEq: '\\geq',
  117. bitAnd: '\\&',
  118. bitXor: "\\underline{|}",
  119. bitOr: '|',
  120. and: '\\wedge',
  121. xor: '\\veebar',
  122. or: '\\vee'
  123. };
  124. exports.latexOperators = latexOperators;
  125. var latexFunctions = {
  126. // arithmetic
  127. abs: {
  128. 1: '\\left|${args[0]}\\right|'
  129. },
  130. add: {
  131. 2: "\\left(${args[0]}".concat(latexOperators.add, "${args[1]}\\right)")
  132. },
  133. cbrt: {
  134. 1: '\\sqrt[3]{${args[0]}}'
  135. },
  136. ceil: {
  137. 1: '\\left\\lceil${args[0]}\\right\\rceil'
  138. },
  139. cube: {
  140. 1: '\\left(${args[0]}\\right)^3'
  141. },
  142. divide: {
  143. 2: '\\frac{${args[0]}}{${args[1]}}'
  144. },
  145. dotDivide: {
  146. 2: "\\left(${args[0]}".concat(latexOperators.dotDivide, "${args[1]}\\right)")
  147. },
  148. dotMultiply: {
  149. 2: "\\left(${args[0]}".concat(latexOperators.dotMultiply, "${args[1]}\\right)")
  150. },
  151. dotPow: {
  152. 2: "\\left(${args[0]}".concat(latexOperators.dotPow, "${args[1]}\\right)")
  153. },
  154. exp: {
  155. 1: '\\exp\\left(${args[0]}\\right)'
  156. },
  157. expm1: "\\left(e".concat(latexOperators.pow, "{${args[0]}}-1\\right)"),
  158. fix: {
  159. 1: '\\mathrm{${name}}\\left(${args[0]}\\right)'
  160. },
  161. floor: {
  162. 1: '\\left\\lfloor${args[0]}\\right\\rfloor'
  163. },
  164. gcd: '\\gcd\\left(${args}\\right)',
  165. hypot: '\\hypot\\left(${args}\\right)',
  166. log: {
  167. 1: '\\ln\\left(${args[0]}\\right)',
  168. 2: '\\log_{${args[1]}}\\left(${args[0]}\\right)'
  169. },
  170. log10: {
  171. 1: '\\log_{10}\\left(${args[0]}\\right)'
  172. },
  173. log1p: {
  174. 1: '\\ln\\left(${args[0]}+1\\right)',
  175. 2: '\\log_{${args[1]}}\\left(${args[0]}+1\\right)'
  176. },
  177. log2: '\\log_{2}\\left(${args[0]}\\right)',
  178. mod: {
  179. 2: "\\left(${args[0]}".concat(latexOperators.mod, "${args[1]}\\right)")
  180. },
  181. multiply: {
  182. 2: "\\left(${args[0]}".concat(latexOperators.multiply, "${args[1]}\\right)")
  183. },
  184. norm: {
  185. 1: '\\left\\|${args[0]}\\right\\|',
  186. 2: undefined // use default template
  187. },
  188. nthRoot: {
  189. 2: '\\sqrt[${args[1]}]{${args[0]}}'
  190. },
  191. nthRoots: {
  192. 2: '\\{y : $y^{args[1]} = {${args[0]}}\\}'
  193. },
  194. pow: {
  195. 2: "\\left(${args[0]}\\right)".concat(latexOperators.pow, "{${args[1]}}")
  196. },
  197. round: {
  198. 1: '\\left\\lfloor${args[0]}\\right\\rceil',
  199. 2: undefined // use default template
  200. },
  201. sign: {
  202. 1: '\\mathrm{${name}}\\left(${args[0]}\\right)'
  203. },
  204. sqrt: {
  205. 1: '\\sqrt{${args[0]}}'
  206. },
  207. square: {
  208. 1: '\\left(${args[0]}\\right)^2'
  209. },
  210. subtract: {
  211. 2: "\\left(${args[0]}".concat(latexOperators.subtract, "${args[1]}\\right)")
  212. },
  213. unaryMinus: {
  214. 1: "".concat(latexOperators.unaryMinus, "\\left(${args[0]}\\right)")
  215. },
  216. unaryPlus: {
  217. 1: "".concat(latexOperators.unaryPlus, "\\left(${args[0]}\\right)")
  218. },
  219. // bitwise
  220. bitAnd: {
  221. 2: "\\left(${args[0]}".concat(latexOperators.bitAnd, "${args[1]}\\right)")
  222. },
  223. bitNot: {
  224. 1: latexOperators.bitNot + '\\left(${args[0]}\\right)'
  225. },
  226. bitOr: {
  227. 2: "\\left(${args[0]}".concat(latexOperators.bitOr, "${args[1]}\\right)")
  228. },
  229. bitXor: {
  230. 2: "\\left(${args[0]}".concat(latexOperators.bitXor, "${args[1]}\\right)")
  231. },
  232. leftShift: {
  233. 2: "\\left(${args[0]}".concat(latexOperators.leftShift, "${args[1]}\\right)")
  234. },
  235. rightArithShift: {
  236. 2: "\\left(${args[0]}".concat(latexOperators.rightArithShift, "${args[1]}\\right)")
  237. },
  238. rightLogShift: {
  239. 2: "\\left(${args[0]}".concat(latexOperators.rightLogShift, "${args[1]}\\right)")
  240. },
  241. // combinatorics
  242. bellNumbers: {
  243. 1: '\\mathrm{B}_{${args[0]}}'
  244. },
  245. catalan: {
  246. 1: '\\mathrm{C}_{${args[0]}}'
  247. },
  248. stirlingS2: {
  249. 2: '\\mathrm{S}\\left(${args}\\right)'
  250. },
  251. // complex
  252. arg: {
  253. 1: '\\arg\\left(${args[0]}\\right)'
  254. },
  255. conj: {
  256. 1: '\\left(${args[0]}\\right)^*'
  257. },
  258. im: {
  259. 1: '\\Im\\left\\lbrace${args[0]}\\right\\rbrace'
  260. },
  261. re: {
  262. 1: '\\Re\\left\\lbrace${args[0]}\\right\\rbrace'
  263. },
  264. // logical
  265. and: {
  266. 2: "\\left(${args[0]}".concat(latexOperators.and, "${args[1]}\\right)")
  267. },
  268. not: {
  269. 1: latexOperators.not + '\\left(${args[0]}\\right)'
  270. },
  271. or: {
  272. 2: "\\left(${args[0]}".concat(latexOperators.or, "${args[1]}\\right)")
  273. },
  274. xor: {
  275. 2: "\\left(${args[0]}".concat(latexOperators.xor, "${args[1]}\\right)")
  276. },
  277. // matrix
  278. cross: {
  279. 2: '\\left(${args[0]}\\right)\\times\\left(${args[1]}\\right)'
  280. },
  281. ctranspose: {
  282. 1: "\\left(${args[0]}\\right)".concat(latexOperators.ctranspose)
  283. },
  284. det: {
  285. 1: '\\det\\left(${args[0]}\\right)'
  286. },
  287. dot: {
  288. 2: '\\left(${args[0]}\\cdot${args[1]}\\right)'
  289. },
  290. expm: {
  291. 1: '\\exp\\left(${args[0]}\\right)'
  292. },
  293. inv: {
  294. 1: '\\left(${args[0]}\\right)^{-1}'
  295. },
  296. pinv: {
  297. 1: '\\left(${args[0]}\\right)^{+}'
  298. },
  299. sqrtm: {
  300. 1: "{${args[0]}}".concat(latexOperators.pow, "{\\frac{1}{2}}")
  301. },
  302. trace: {
  303. 1: '\\mathrm{tr}\\left(${args[0]}\\right)'
  304. },
  305. transpose: {
  306. 1: "\\left(${args[0]}\\right)".concat(latexOperators.transpose)
  307. },
  308. // probability
  309. combinations: {
  310. 2: '\\binom{${args[0]}}{${args[1]}}'
  311. },
  312. combinationsWithRep: {
  313. 2: '\\left(\\!\\!{\\binom{${args[0]}}{${args[1]}}}\\!\\!\\right)'
  314. },
  315. factorial: {
  316. 1: "\\left(${args[0]}\\right)".concat(latexOperators.factorial)
  317. },
  318. gamma: {
  319. 1: '\\Gamma\\left(${args[0]}\\right)'
  320. },
  321. lgamma: {
  322. 1: '\\ln\\Gamma\\left(${args[0]}\\right)'
  323. },
  324. // relational
  325. equal: {
  326. 2: "\\left(${args[0]}".concat(latexOperators.equal, "${args[1]}\\right)")
  327. },
  328. larger: {
  329. 2: "\\left(${args[0]}".concat(latexOperators.larger, "${args[1]}\\right)")
  330. },
  331. largerEq: {
  332. 2: "\\left(${args[0]}".concat(latexOperators.largerEq, "${args[1]}\\right)")
  333. },
  334. smaller: {
  335. 2: "\\left(${args[0]}".concat(latexOperators.smaller, "${args[1]}\\right)")
  336. },
  337. smallerEq: {
  338. 2: "\\left(${args[0]}".concat(latexOperators.smallerEq, "${args[1]}\\right)")
  339. },
  340. unequal: {
  341. 2: "\\left(${args[0]}".concat(latexOperators.unequal, "${args[1]}\\right)")
  342. },
  343. // special
  344. erf: {
  345. 1: 'erf\\left(${args[0]}\\right)'
  346. },
  347. // statistics
  348. max: '\\max\\left(${args}\\right)',
  349. min: '\\min\\left(${args}\\right)',
  350. variance: '\\mathrm{Var}\\left(${args}\\right)',
  351. // trigonometry
  352. acos: {
  353. 1: '\\cos^{-1}\\left(${args[0]}\\right)'
  354. },
  355. acosh: {
  356. 1: '\\cosh^{-1}\\left(${args[0]}\\right)'
  357. },
  358. acot: {
  359. 1: '\\cot^{-1}\\left(${args[0]}\\right)'
  360. },
  361. acoth: {
  362. 1: '\\coth^{-1}\\left(${args[0]}\\right)'
  363. },
  364. acsc: {
  365. 1: '\\csc^{-1}\\left(${args[0]}\\right)'
  366. },
  367. acsch: {
  368. 1: '\\mathrm{csch}^{-1}\\left(${args[0]}\\right)'
  369. },
  370. asec: {
  371. 1: '\\sec^{-1}\\left(${args[0]}\\right)'
  372. },
  373. asech: {
  374. 1: '\\mathrm{sech}^{-1}\\left(${args[0]}\\right)'
  375. },
  376. asin: {
  377. 1: '\\sin^{-1}\\left(${args[0]}\\right)'
  378. },
  379. asinh: {
  380. 1: '\\sinh^{-1}\\left(${args[0]}\\right)'
  381. },
  382. atan: {
  383. 1: '\\tan^{-1}\\left(${args[0]}\\right)'
  384. },
  385. atan2: {
  386. 2: '\\mathrm{atan2}\\left(${args}\\right)'
  387. },
  388. atanh: {
  389. 1: '\\tanh^{-1}\\left(${args[0]}\\right)'
  390. },
  391. cos: {
  392. 1: '\\cos\\left(${args[0]}\\right)'
  393. },
  394. cosh: {
  395. 1: '\\cosh\\left(${args[0]}\\right)'
  396. },
  397. cot: {
  398. 1: '\\cot\\left(${args[0]}\\right)'
  399. },
  400. coth: {
  401. 1: '\\coth\\left(${args[0]}\\right)'
  402. },
  403. csc: {
  404. 1: '\\csc\\left(${args[0]}\\right)'
  405. },
  406. csch: {
  407. 1: '\\mathrm{csch}\\left(${args[0]}\\right)'
  408. },
  409. sec: {
  410. 1: '\\sec\\left(${args[0]}\\right)'
  411. },
  412. sech: {
  413. 1: '\\mathrm{sech}\\left(${args[0]}\\right)'
  414. },
  415. sin: {
  416. 1: '\\sin\\left(${args[0]}\\right)'
  417. },
  418. sinh: {
  419. 1: '\\sinh\\left(${args[0]}\\right)'
  420. },
  421. tan: {
  422. 1: '\\tan\\left(${args[0]}\\right)'
  423. },
  424. tanh: {
  425. 1: '\\tanh\\left(${args[0]}\\right)'
  426. },
  427. // unit
  428. to: {
  429. 2: "\\left(${args[0]}".concat(latexOperators.to, "${args[1]}\\right)")
  430. },
  431. // utils
  432. numeric: function numeric(node, options) {
  433. // Not sure if this is strictly right but should work correctly for the vast majority of use cases.
  434. return node.args[0].toTex();
  435. },
  436. // type
  437. number: {
  438. 0: '0',
  439. 1: '\\left(${args[0]}\\right)',
  440. 2: '\\left(\\left(${args[0]}\\right)${args[1]}\\right)'
  441. },
  442. string: {
  443. 0: '\\mathtt{""}',
  444. 1: '\\mathrm{string}\\left(${args[0]}\\right)'
  445. },
  446. bignumber: {
  447. 0: '0',
  448. 1: '\\left(${args[0]}\\right)'
  449. },
  450. complex: {
  451. 0: '0',
  452. 1: '\\left(${args[0]}\\right)',
  453. 2: "\\left(\\left(${args[0]}\\right)+".concat(latexSymbols.i, "\\cdot\\left(${args[1]}\\right)\\right)")
  454. },
  455. matrix: {
  456. 0: '\\begin{bmatrix}\\end{bmatrix}',
  457. 1: '\\left(${args[0]}\\right)',
  458. 2: '\\left(${args[0]}\\right)'
  459. },
  460. sparse: {
  461. 0: '\\begin{bsparse}\\end{bsparse}',
  462. 1: '\\left(${args[0]}\\right)'
  463. },
  464. unit: {
  465. 1: '\\left(${args[0]}\\right)',
  466. 2: '\\left(\\left(${args[0]}\\right)${args[1]}\\right)'
  467. }
  468. };
  469. exports.latexFunctions = latexFunctions;
  470. var defaultTemplate = '\\mathrm{${name}}\\left(${args}\\right)';
  471. exports.defaultTemplate = defaultTemplate;
  472. var latexUnits = {
  473. deg: '^\\circ'
  474. };
  475. function escapeLatex(string) {
  476. return (0, _escapeLatex["default"])(string, {
  477. preserveFormatting: true
  478. });
  479. }
  480. // @param {string} name
  481. // @param {boolean} isUnit
  482. function toSymbol(name, isUnit) {
  483. isUnit = typeof isUnit === 'undefined' ? false : isUnit;
  484. if (isUnit) {
  485. if ((0, _object.hasOwnProperty)(latexUnits, name)) {
  486. return latexUnits[name];
  487. }
  488. return '\\mathrm{' + escapeLatex(name) + '}';
  489. }
  490. if ((0, _object.hasOwnProperty)(latexSymbols, name)) {
  491. return latexSymbols[name];
  492. }
  493. return escapeLatex(name);
  494. }