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