123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485 |
- /* eslint no-template-curly-in-string: "off" */
- import escapeLatexLib from 'escape-latex';
- import { hasOwnProperty } from './object.js';
- export var latexSymbols = {
- // GREEK LETTERS
- Alpha: 'A',
- alpha: '\\alpha',
- Beta: 'B',
- beta: '\\beta',
- Gamma: '\\Gamma',
- gamma: '\\gamma',
- Delta: '\\Delta',
- delta: '\\delta',
- Epsilon: 'E',
- epsilon: '\\epsilon',
- varepsilon: '\\varepsilon',
- Zeta: 'Z',
- zeta: '\\zeta',
- Eta: 'H',
- eta: '\\eta',
- Theta: '\\Theta',
- theta: '\\theta',
- vartheta: '\\vartheta',
- Iota: 'I',
- iota: '\\iota',
- Kappa: 'K',
- kappa: '\\kappa',
- varkappa: '\\varkappa',
- Lambda: '\\Lambda',
- lambda: '\\lambda',
- Mu: 'M',
- mu: '\\mu',
- Nu: 'N',
- nu: '\\nu',
- Xi: '\\Xi',
- xi: '\\xi',
- Omicron: 'O',
- omicron: 'o',
- Pi: '\\Pi',
- pi: '\\pi',
- varpi: '\\varpi',
- Rho: 'P',
- rho: '\\rho',
- varrho: '\\varrho',
- Sigma: '\\Sigma',
- sigma: '\\sigma',
- varsigma: '\\varsigma',
- Tau: 'T',
- tau: '\\tau',
- Upsilon: '\\Upsilon',
- upsilon: '\\upsilon',
- Phi: '\\Phi',
- phi: '\\phi',
- varphi: '\\varphi',
- Chi: 'X',
- chi: '\\chi',
- Psi: '\\Psi',
- psi: '\\psi',
- Omega: '\\Omega',
- omega: '\\omega',
- // logic
- true: '\\mathrm{True}',
- false: '\\mathrm{False}',
- // other
- i: 'i',
- // TODO use \i ??
- inf: '\\infty',
- Inf: '\\infty',
- infinity: '\\infty',
- Infinity: '\\infty',
- oo: '\\infty',
- lim: '\\lim',
- undefined: '\\mathbf{?}'
- };
- export var latexOperators = {
- transpose: '^\\top',
- ctranspose: '^H',
- factorial: '!',
- pow: '^',
- dotPow: '.^\\wedge',
- // TODO find ideal solution
- unaryPlus: '+',
- unaryMinus: '-',
- bitNot: '\\~',
- // TODO find ideal solution
- not: '\\neg',
- multiply: '\\cdot',
- divide: '\\frac',
- // TODO how to handle that properly?
- dotMultiply: '.\\cdot',
- // TODO find ideal solution
- dotDivide: '.:',
- // TODO find ideal solution
- mod: '\\mod',
- add: '+',
- subtract: '-',
- to: '\\rightarrow',
- leftShift: '<<',
- rightArithShift: '>>',
- rightLogShift: '>>>',
- equal: '=',
- unequal: '\\neq',
- smaller: '<',
- larger: '>',
- smallerEq: '\\leq',
- largerEq: '\\geq',
- bitAnd: '\\&',
- bitXor: '\\underline{|}',
- bitOr: '|',
- and: '\\wedge',
- xor: '\\veebar',
- or: '\\vee'
- };
- export var latexFunctions = {
- // arithmetic
- abs: {
- 1: '\\left|${args[0]}\\right|'
- },
- add: {
- 2: "\\left(${args[0]}".concat(latexOperators.add, "${args[1]}\\right)")
- },
- cbrt: {
- 1: '\\sqrt[3]{${args[0]}}'
- },
- ceil: {
- 1: '\\left\\lceil${args[0]}\\right\\rceil'
- },
- cube: {
- 1: '\\left(${args[0]}\\right)^3'
- },
- divide: {
- 2: '\\frac{${args[0]}}{${args[1]}}'
- },
- dotDivide: {
- 2: "\\left(${args[0]}".concat(latexOperators.dotDivide, "${args[1]}\\right)")
- },
- dotMultiply: {
- 2: "\\left(${args[0]}".concat(latexOperators.dotMultiply, "${args[1]}\\right)")
- },
- dotPow: {
- 2: "\\left(${args[0]}".concat(latexOperators.dotPow, "${args[1]}\\right)")
- },
- exp: {
- 1: '\\exp\\left(${args[0]}\\right)'
- },
- expm1: "\\left(e".concat(latexOperators.pow, "{${args[0]}}-1\\right)"),
- fix: {
- 1: '\\mathrm{${name}}\\left(${args[0]}\\right)'
- },
- floor: {
- 1: '\\left\\lfloor${args[0]}\\right\\rfloor'
- },
- gcd: '\\gcd\\left(${args}\\right)',
- hypot: '\\hypot\\left(${args}\\right)',
- log: {
- 1: '\\ln\\left(${args[0]}\\right)',
- 2: '\\log_{${args[1]}}\\left(${args[0]}\\right)'
- },
- log10: {
- 1: '\\log_{10}\\left(${args[0]}\\right)'
- },
- log1p: {
- 1: '\\ln\\left(${args[0]}+1\\right)',
- 2: '\\log_{${args[1]}}\\left(${args[0]}+1\\right)'
- },
- log2: '\\log_{2}\\left(${args[0]}\\right)',
- mod: {
- 2: "\\left(${args[0]}".concat(latexOperators.mod, "${args[1]}\\right)")
- },
- multiply: {
- 2: "\\left(${args[0]}".concat(latexOperators.multiply, "${args[1]}\\right)")
- },
- norm: {
- 1: '\\left\\|${args[0]}\\right\\|',
- 2: undefined // use default template
- },
- nthRoot: {
- 2: '\\sqrt[${args[1]}]{${args[0]}}'
- },
- nthRoots: {
- 2: '\\{y : $y^{args[1]} = {${args[0]}}\\}'
- },
- pow: {
- 2: "\\left(${args[0]}\\right)".concat(latexOperators.pow, "{${args[1]}}")
- },
- round: {
- 1: '\\left\\lfloor${args[0]}\\right\\rceil',
- 2: undefined // use default template
- },
- sign: {
- 1: '\\mathrm{${name}}\\left(${args[0]}\\right)'
- },
- sqrt: {
- 1: '\\sqrt{${args[0]}}'
- },
- square: {
- 1: '\\left(${args[0]}\\right)^2'
- },
- subtract: {
- 2: "\\left(${args[0]}".concat(latexOperators.subtract, "${args[1]}\\right)")
- },
- unaryMinus: {
- 1: "".concat(latexOperators.unaryMinus, "\\left(${args[0]}\\right)")
- },
- unaryPlus: {
- 1: "".concat(latexOperators.unaryPlus, "\\left(${args[0]}\\right)")
- },
- // bitwise
- bitAnd: {
- 2: "\\left(${args[0]}".concat(latexOperators.bitAnd, "${args[1]}\\right)")
- },
- bitNot: {
- 1: latexOperators.bitNot + '\\left(${args[0]}\\right)'
- },
- bitOr: {
- 2: "\\left(${args[0]}".concat(latexOperators.bitOr, "${args[1]}\\right)")
- },
- bitXor: {
- 2: "\\left(${args[0]}".concat(latexOperators.bitXor, "${args[1]}\\right)")
- },
- leftShift: {
- 2: "\\left(${args[0]}".concat(latexOperators.leftShift, "${args[1]}\\right)")
- },
- rightArithShift: {
- 2: "\\left(${args[0]}".concat(latexOperators.rightArithShift, "${args[1]}\\right)")
- },
- rightLogShift: {
- 2: "\\left(${args[0]}".concat(latexOperators.rightLogShift, "${args[1]}\\right)")
- },
- // combinatorics
- bellNumbers: {
- 1: '\\mathrm{B}_{${args[0]}}'
- },
- catalan: {
- 1: '\\mathrm{C}_{${args[0]}}'
- },
- stirlingS2: {
- 2: '\\mathrm{S}\\left(${args}\\right)'
- },
- // complex
- arg: {
- 1: '\\arg\\left(${args[0]}\\right)'
- },
- conj: {
- 1: '\\left(${args[0]}\\right)^*'
- },
- im: {
- 1: '\\Im\\left\\lbrace${args[0]}\\right\\rbrace'
- },
- re: {
- 1: '\\Re\\left\\lbrace${args[0]}\\right\\rbrace'
- },
- // logical
- and: {
- 2: "\\left(${args[0]}".concat(latexOperators.and, "${args[1]}\\right)")
- },
- not: {
- 1: latexOperators.not + '\\left(${args[0]}\\right)'
- },
- or: {
- 2: "\\left(${args[0]}".concat(latexOperators.or, "${args[1]}\\right)")
- },
- xor: {
- 2: "\\left(${args[0]}".concat(latexOperators.xor, "${args[1]}\\right)")
- },
- // matrix
- cross: {
- 2: '\\left(${args[0]}\\right)\\times\\left(${args[1]}\\right)'
- },
- ctranspose: {
- 1: "\\left(${args[0]}\\right)".concat(latexOperators.ctranspose)
- },
- det: {
- 1: '\\det\\left(${args[0]}\\right)'
- },
- dot: {
- 2: '\\left(${args[0]}\\cdot${args[1]}\\right)'
- },
- expm: {
- 1: '\\exp\\left(${args[0]}\\right)'
- },
- inv: {
- 1: '\\left(${args[0]}\\right)^{-1}'
- },
- pinv: {
- 1: '\\left(${args[0]}\\right)^{+}'
- },
- sqrtm: {
- 1: "{${args[0]}}".concat(latexOperators.pow, "{\\frac{1}{2}}")
- },
- trace: {
- 1: '\\mathrm{tr}\\left(${args[0]}\\right)'
- },
- transpose: {
- 1: "\\left(${args[0]}\\right)".concat(latexOperators.transpose)
- },
- // probability
- combinations: {
- 2: '\\binom{${args[0]}}{${args[1]}}'
- },
- combinationsWithRep: {
- 2: '\\left(\\!\\!{\\binom{${args[0]}}{${args[1]}}}\\!\\!\\right)'
- },
- factorial: {
- 1: "\\left(${args[0]}\\right)".concat(latexOperators.factorial)
- },
- gamma: {
- 1: '\\Gamma\\left(${args[0]}\\right)'
- },
- lgamma: {
- 1: '\\ln\\Gamma\\left(${args[0]}\\right)'
- },
- // relational
- equal: {
- 2: "\\left(${args[0]}".concat(latexOperators.equal, "${args[1]}\\right)")
- },
- larger: {
- 2: "\\left(${args[0]}".concat(latexOperators.larger, "${args[1]}\\right)")
- },
- largerEq: {
- 2: "\\left(${args[0]}".concat(latexOperators.largerEq, "${args[1]}\\right)")
- },
- smaller: {
- 2: "\\left(${args[0]}".concat(latexOperators.smaller, "${args[1]}\\right)")
- },
- smallerEq: {
- 2: "\\left(${args[0]}".concat(latexOperators.smallerEq, "${args[1]}\\right)")
- },
- unequal: {
- 2: "\\left(${args[0]}".concat(latexOperators.unequal, "${args[1]}\\right)")
- },
- // special
- erf: {
- 1: 'erf\\left(${args[0]}\\right)'
- },
- // statistics
- max: '\\max\\left(${args}\\right)',
- min: '\\min\\left(${args}\\right)',
- variance: '\\mathrm{Var}\\left(${args}\\right)',
- // trigonometry
- acos: {
- 1: '\\cos^{-1}\\left(${args[0]}\\right)'
- },
- acosh: {
- 1: '\\cosh^{-1}\\left(${args[0]}\\right)'
- },
- acot: {
- 1: '\\cot^{-1}\\left(${args[0]}\\right)'
- },
- acoth: {
- 1: '\\coth^{-1}\\left(${args[0]}\\right)'
- },
- acsc: {
- 1: '\\csc^{-1}\\left(${args[0]}\\right)'
- },
- acsch: {
- 1: '\\mathrm{csch}^{-1}\\left(${args[0]}\\right)'
- },
- asec: {
- 1: '\\sec^{-1}\\left(${args[0]}\\right)'
- },
- asech: {
- 1: '\\mathrm{sech}^{-1}\\left(${args[0]}\\right)'
- },
- asin: {
- 1: '\\sin^{-1}\\left(${args[0]}\\right)'
- },
- asinh: {
- 1: '\\sinh^{-1}\\left(${args[0]}\\right)'
- },
- atan: {
- 1: '\\tan^{-1}\\left(${args[0]}\\right)'
- },
- atan2: {
- 2: '\\mathrm{atan2}\\left(${args}\\right)'
- },
- atanh: {
- 1: '\\tanh^{-1}\\left(${args[0]}\\right)'
- },
- cos: {
- 1: '\\cos\\left(${args[0]}\\right)'
- },
- cosh: {
- 1: '\\cosh\\left(${args[0]}\\right)'
- },
- cot: {
- 1: '\\cot\\left(${args[0]}\\right)'
- },
- coth: {
- 1: '\\coth\\left(${args[0]}\\right)'
- },
- csc: {
- 1: '\\csc\\left(${args[0]}\\right)'
- },
- csch: {
- 1: '\\mathrm{csch}\\left(${args[0]}\\right)'
- },
- sec: {
- 1: '\\sec\\left(${args[0]}\\right)'
- },
- sech: {
- 1: '\\mathrm{sech}\\left(${args[0]}\\right)'
- },
- sin: {
- 1: '\\sin\\left(${args[0]}\\right)'
- },
- sinh: {
- 1: '\\sinh\\left(${args[0]}\\right)'
- },
- tan: {
- 1: '\\tan\\left(${args[0]}\\right)'
- },
- tanh: {
- 1: '\\tanh\\left(${args[0]}\\right)'
- },
- // unit
- to: {
- 2: "\\left(${args[0]}".concat(latexOperators.to, "${args[1]}\\right)")
- },
- // utils
- numeric: function numeric(node, options) {
- // Not sure if this is strictly right but should work correctly for the vast majority of use cases.
- return node.args[0].toTex();
- },
- // type
- number: {
- 0: '0',
- 1: '\\left(${args[0]}\\right)',
- 2: '\\left(\\left(${args[0]}\\right)${args[1]}\\right)'
- },
- string: {
- 0: '\\mathtt{""}',
- 1: '\\mathrm{string}\\left(${args[0]}\\right)'
- },
- bignumber: {
- 0: '0',
- 1: '\\left(${args[0]}\\right)'
- },
- complex: {
- 0: '0',
- 1: '\\left(${args[0]}\\right)',
- 2: "\\left(\\left(${args[0]}\\right)+".concat(latexSymbols.i, "\\cdot\\left(${args[1]}\\right)\\right)")
- },
- matrix: {
- 0: '\\begin{bmatrix}\\end{bmatrix}',
- 1: '\\left(${args[0]}\\right)',
- 2: '\\left(${args[0]}\\right)'
- },
- sparse: {
- 0: '\\begin{bsparse}\\end{bsparse}',
- 1: '\\left(${args[0]}\\right)'
- },
- unit: {
- 1: '\\left(${args[0]}\\right)',
- 2: '\\left(\\left(${args[0]}\\right)${args[1]}\\right)'
- }
- };
- export var defaultTemplate = '\\mathrm{${name}}\\left(${args}\\right)';
- var latexUnits = {
- deg: '^\\circ'
- };
- export function escapeLatex(string) {
- return escapeLatexLib(string, {
- preserveFormatting: true
- });
- }
- // @param {string} name
- // @param {boolean} isUnit
- export function toSymbol(name, isUnit) {
- isUnit = typeof isUnit === 'undefined' ? false : isUnit;
- if (isUnit) {
- if (hasOwnProperty(latexUnits, name)) {
- return latexUnits[name];
- }
- return '\\mathrm{' + escapeLatex(name) + '}';
- }
- if (hasOwnProperty(latexSymbols, name)) {
- return latexSymbols[name];
- }
- return escapeLatex(name);
- }
|