simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

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 }