@cortex-js/compute-engine 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/dist/compute-engine.esm.js +1304 -987
  2. package/dist/compute-engine.js +1304 -987
  3. package/dist/compute-engine.min.esm.js +1304 -987
  4. package/dist/compute-engine.min.js +1304 -987
  5. package/dist/math-json.esm.js +2 -2
  6. package/dist/math-json.js +2 -2
  7. package/dist/math-json.min.esm.js +2 -2
  8. package/dist/math-json.min.js +2 -2
  9. package/dist/types/common/grapheme-splitter.d.ts +1 -1
  10. package/dist/types/common/signals.d.ts +1 -1
  11. package/dist/types/common/utils.d.ts +1 -1
  12. package/dist/types/compute-engine/assume.d.ts +1 -1
  13. package/dist/types/compute-engine/boxed-expression/abstract-boxed-expression.d.ts +4 -2
  14. package/dist/types/compute-engine/boxed-expression/box.d.ts +1 -1
  15. package/dist/types/compute-engine/boxed-expression/boxed-dictionary.d.ts +1 -1
  16. package/dist/types/compute-engine/boxed-expression/boxed-domain.d.ts +1 -1
  17. package/dist/types/compute-engine/boxed-expression/boxed-function-definition.d.ts +1 -1
  18. package/dist/types/compute-engine/boxed-expression/boxed-function.d.ts +1 -1
  19. package/dist/types/compute-engine/boxed-expression/boxed-number.d.ts +1 -1
  20. package/dist/types/compute-engine/boxed-expression/boxed-patterns.d.ts +1 -1
  21. package/dist/types/compute-engine/boxed-expression/boxed-string.d.ts +1 -1
  22. package/dist/types/compute-engine/boxed-expression/boxed-symbol-definition.d.ts +1 -1
  23. package/dist/types/compute-engine/boxed-expression/boxed-symbol.d.ts +1 -1
  24. package/dist/types/compute-engine/boxed-expression/expression-map.d.ts +1 -1
  25. package/dist/types/compute-engine/boxed-expression/order.d.ts +1 -1
  26. package/dist/types/compute-engine/boxed-expression/serialize.d.ts +1 -1
  27. package/dist/types/compute-engine/boxed-expression/utils.d.ts +1 -1
  28. package/dist/types/compute-engine/boxed-expression/validate.d.ts +1 -1
  29. package/dist/types/compute-engine/compile.d.ts +9 -2
  30. package/dist/types/compute-engine/compute-engine.d.ts +8 -7
  31. package/dist/types/compute-engine/cost-function.d.ts +1 -1
  32. package/dist/types/compute-engine/domain-utils.d.ts +1 -1
  33. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-algebra.d.ts +1 -1
  34. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-arithmetic.d.ts +1 -1
  35. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-calculus.d.ts +1 -1
  36. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
  37. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-inequalities.d.ts +1 -1
  38. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +1 -1
  39. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
  40. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
  41. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
  42. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
  43. package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +32 -17
  44. package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
  45. package/dist/types/compute-engine/latex-syntax/parse-identifier.d.ts +12 -6
  46. package/dist/types/compute-engine/latex-syntax/parse.d.ts +30 -20
  47. package/dist/types/compute-engine/latex-syntax/public.d.ts +90 -47
  48. package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -1
  49. package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
  50. package/dist/types/compute-engine/latex-syntax/serializer.d.ts +4 -9
  51. package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
  52. package/dist/types/compute-engine/library/arithmetic-add.d.ts +1 -2
  53. package/dist/types/compute-engine/library/arithmetic-divide.d.ts +1 -1
  54. package/dist/types/compute-engine/library/arithmetic-multiply.d.ts +1 -1
  55. package/dist/types/compute-engine/library/arithmetic-power.d.ts +1 -1
  56. package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
  57. package/dist/types/compute-engine/library/calculus.d.ts +1 -1
  58. package/dist/types/compute-engine/library/collections.d.ts +1 -1
  59. package/dist/types/compute-engine/library/core.d.ts +1 -1
  60. package/dist/types/compute-engine/library/domains.d.ts +1 -1
  61. package/dist/types/compute-engine/library/library.d.ts +1 -1
  62. package/dist/types/compute-engine/library/logic.d.ts +1 -1
  63. package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
  64. package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
  65. package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
  66. package/dist/types/compute-engine/library/sets.d.ts +1 -1
  67. package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
  68. package/dist/types/compute-engine/library/utils.d.ts +2 -1
  69. package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
  70. package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
  71. package/dist/types/compute-engine/numerics/numeric-complex.d.ts +1 -1
  72. package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
  73. package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
  74. package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
  75. package/dist/types/compute-engine/public.d.ts +4 -1
  76. package/dist/types/compute-engine/rules.d.ts +1 -1
  77. package/dist/types/compute-engine/simplify-rules.d.ts +1 -1
  78. package/dist/types/compute-engine/solve.d.ts +1 -1
  79. package/dist/types/compute-engine/symbolic/expand.d.ts +1 -1
  80. package/dist/types/compute-engine/symbolic/flatten.d.ts +1 -1
  81. package/dist/types/compute-engine/symbolic/negate.d.ts +1 -1
  82. package/dist/types/compute-engine/symbolic/polynomials.d.ts +1 -1
  83. package/dist/types/compute-engine/symbolic/product.d.ts +1 -1
  84. package/dist/types/compute-engine/symbolic/sum.d.ts +1 -1
  85. package/dist/types/compute-engine/symbolic/utils.d.ts +1 -1
  86. package/dist/types/compute-engine.d.ts +2 -2
  87. package/dist/types/math-json/math-json-format.d.ts +1 -1
  88. package/dist/types/math-json/utils.d.ts +5 -1
  89. package/dist/types/math-json.d.ts +2 -2
  90. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** CortexJS Compute Engine 0.13.0 */
1
+ /** CortexJS Compute Engine 0.14.0 */
2
2
  (function(global,factory){typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'],factory):(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ComputeEngine = {}));})(this, (function (exports) { 'use strict';
3
3
  var ComputeEngine = (() => {
4
4
  var __create = Object.create;
@@ -3766,7 +3766,7 @@ var ComputeEngine = (() => {
3766
3766
  var DEFINITIONS_ALGEBRA = [
3767
3767
  {
3768
3768
  name: "To",
3769
- trigger: ["\\to"],
3769
+ latexTrigger: ["\\to"],
3770
3770
  kind: "infix",
3771
3771
  precedence: 270
3772
3772
  // MathML rightwards arrow
@@ -4028,10 +4028,10 @@ var ComputeEngine = (() => {
4028
4028
  return null;
4029
4029
  if (typeof expr === "number")
4030
4030
  return expr;
4031
- if (isNumberObject(expr))
4032
- return machineValueOfString(expr.num);
4033
4031
  if (typeof expr === "string")
4034
4032
  return machineValueOfString(expr);
4033
+ if (isNumberObject(expr))
4034
+ return machineValue(expr.num);
4035
4035
  return null;
4036
4036
  }
4037
4037
  function rationalValue(expr) {
@@ -4556,7 +4556,7 @@ var ComputeEngine = (() => {
4556
4556
  { name: "EulerGamma", serialize: "\\gamma" },
4557
4557
  {
4558
4558
  name: "Degrees",
4559
- trigger: ["\\degree"],
4559
+ latexTrigger: ["\\degree"],
4560
4560
  kind: "postfix",
4561
4561
  precedence: 880,
4562
4562
  parse: (_parser, lhs) => ["Degrees", lhs],
@@ -4565,74 +4565,82 @@ var ComputeEngine = (() => {
4565
4565
  }
4566
4566
  },
4567
4567
  {
4568
- trigger: ["\\degree"],
4568
+ latexTrigger: ["\\degree"],
4569
4569
  kind: "postfix",
4570
4570
  precedence: 880,
4571
4571
  parse: (_parser, lhs) => ["Degrees", lhs]
4572
4572
  },
4573
4573
  {
4574
- trigger: ["^", "<{>", "\\circ", "<}>"],
4574
+ latexTrigger: ["^", "<{>", "\\circ", "<}>"],
4575
4575
  kind: "postfix",
4576
4576
  parse: (_parser, lhs) => ["Degrees", lhs]
4577
4577
  },
4578
4578
  {
4579
- trigger: ["^", "\\circ"],
4579
+ latexTrigger: ["^", "\\circ"],
4580
4580
  kind: "postfix",
4581
4581
  parse: (_parser, lhs) => ["Degrees", lhs]
4582
4582
  },
4583
4583
  {
4584
- trigger: ["\xB0"],
4584
+ latexTrigger: ["\xB0"],
4585
4585
  kind: "postfix",
4586
4586
  precedence: 880,
4587
4587
  parse: (_parser, lhs) => ["Degrees", lhs]
4588
4588
  },
4589
4589
  {
4590
- trigger: ["\\ang"],
4590
+ latexTrigger: ["\\ang"],
4591
4591
  parse: (parser) => {
4592
4592
  const arg = parser.parseGroup();
4593
4593
  return arg === null ? ["Degrees"] : ["Degrees", arg];
4594
4594
  }
4595
4595
  },
4596
4596
  {
4597
- trigger: ["\\infty"],
4597
+ latexTrigger: ["\\infty"],
4598
4598
  parse: { num: "+Infinity" }
4599
4599
  },
4600
4600
  {
4601
4601
  name: "ComplexInfinity",
4602
- trigger: ["\\tilde", "\\infty"],
4602
+ latexTrigger: ["\\tilde", "\\infty"],
4603
4603
  serialize: "\\tilde\\infty"
4604
4604
  },
4605
4605
  {
4606
- trigger: ["\\tilde", "<{>", "\\infty", "<}>"],
4606
+ latexTrigger: ["\\tilde", "<{>", "\\infty", "<}>"],
4607
4607
  parse: "ComplexInfinity"
4608
4608
  },
4609
- { name: "Pi", kind: "symbol", trigger: ["\\pi"] },
4610
- { trigger: ["\u03C0"], parse: "Pi" },
4609
+ { name: "Pi", kind: "symbol", latexTrigger: ["\\pi"] },
4610
+ { latexTrigger: ["\u03C0"], parse: "Pi" },
4611
4611
  {
4612
4612
  name: "ExponentialE",
4613
- trigger: ["\\exponentialE"],
4613
+ latexTrigger: ["\\exponentialE"],
4614
4614
  parse: "ExponentialE",
4615
4615
  serialize: "\\exponentialE"
4616
4616
  },
4617
4617
  {
4618
- trigger: "\\mathrm{e}",
4618
+ latexTrigger: "\\operatorname{e}",
4619
+ parse: "ExponentialE"
4620
+ },
4621
+ {
4622
+ latexTrigger: "\\mathrm{e}",
4619
4623
  parse: "ExponentialE"
4620
4624
  },
4621
4625
  {
4622
4626
  kind: "function",
4623
- trigger: "exp",
4627
+ identifierTrigger: "exp",
4624
4628
  parse: "Exp"
4625
4629
  },
4626
4630
  {
4627
- trigger: "\\exp",
4631
+ latexTrigger: "\\exp",
4628
4632
  parse: "Exp"
4629
4633
  },
4630
4634
  {
4631
4635
  name: "ImaginaryUnit",
4632
- trigger: ["\\imaginaryI"]
4636
+ latexTrigger: ["\\imaginaryI"]
4633
4637
  },
4634
4638
  {
4635
- trigger: "\\mathrm{i}",
4639
+ latexTrigger: "\\operatorname{i}",
4640
+ parse: "ImaginaryUnit"
4641
+ },
4642
+ {
4643
+ latexTrigger: "\\mathrm{i}",
4636
4644
  parse: "ImaginaryUnit"
4637
4645
  },
4638
4646
  // Operations
@@ -4643,18 +4651,18 @@ var ComputeEngine = (() => {
4643
4651
  * replaced with bars */
4644
4652
  name: "Abs",
4645
4653
  kind: "matchfix",
4646
- openDelimiter: "|",
4647
- closeDelimiter: "|",
4648
- parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Abs", expr]
4654
+ openTrigger: "|",
4655
+ closeTrigger: "|",
4656
+ parse: (_parser, body) => isEmptySequence(body) ? null : ["Abs", body]
4649
4657
  },
4650
4658
  {
4651
- trigger: "abs",
4659
+ identifierTrigger: "abs",
4652
4660
  kind: "function",
4653
4661
  parse: "Abs"
4654
4662
  },
4655
4663
  {
4656
4664
  name: "Add",
4657
- trigger: ["+"],
4665
+ latexTrigger: ["+"],
4658
4666
  kind: "infix",
4659
4667
  associativity: "both",
4660
4668
  precedence: 275,
@@ -4670,7 +4678,7 @@ var ComputeEngine = (() => {
4670
4678
  },
4671
4679
  {
4672
4680
  kind: "prefix",
4673
- trigger: ["+"],
4681
+ latexTrigger: ["+"],
4674
4682
  precedence: 275,
4675
4683
  parse: (parser, until) => {
4676
4684
  if (until && 275 < until.minPrec)
@@ -4681,20 +4689,22 @@ var ComputeEngine = (() => {
4681
4689
  {
4682
4690
  name: "Ceil",
4683
4691
  kind: "matchfix",
4684
- openDelimiter: "\\lceil",
4685
- closeDelimiter: "\\rceil"
4692
+ openTrigger: "\\lceil",
4693
+ closeTrigger: "\\rceil",
4694
+ parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body]
4686
4695
  },
4687
4696
  {
4688
4697
  kind: "matchfix",
4689
- openDelimiter: ["\u2308"],
4690
- closeDelimiter: ["\u2309"],
4691
- parse: (_, body) => ["Ceil", body]
4698
+ openTrigger: ["\u2308"],
4699
+ closeTrigger: ["\u2309"],
4700
+ parse: (_parser, body) => isEmptySequence(body) ? null : ["Ceil", body]
4692
4701
  },
4693
4702
  {
4694
- trigger: "ceil",
4703
+ identifierTrigger: "ceil",
4695
4704
  kind: "function",
4696
4705
  parse: "Ceil"
4697
4706
  },
4707
+ { name: "Chop", identifierTrigger: "chop", kind: "function", parse: "Chop" },
4698
4708
  {
4699
4709
  name: "Complex",
4700
4710
  precedence: 274,
@@ -4714,7 +4724,7 @@ var ComputeEngine = (() => {
4714
4724
  },
4715
4725
  {
4716
4726
  name: "Divide",
4717
- trigger: "\\frac",
4727
+ latexTrigger: "\\frac",
4718
4728
  precedence: 660,
4719
4729
  // For \frac specifically, not for \div, etc..
4720
4730
  // handles Leibnitz notation for partial derivatives
@@ -4723,12 +4733,12 @@ var ComputeEngine = (() => {
4723
4733
  },
4724
4734
  {
4725
4735
  kind: "infix",
4726
- trigger: "\\over",
4736
+ latexTrigger: "\\over",
4727
4737
  precedence: 660,
4728
4738
  parse: "Divide"
4729
4739
  },
4730
4740
  {
4731
- trigger: ["\\/"],
4741
+ latexTrigger: ["\\/"],
4732
4742
  kind: "infix",
4733
4743
  associativity: "non",
4734
4744
  precedence: 660,
@@ -4738,14 +4748,14 @@ var ComputeEngine = (() => {
4738
4748
  parse: "Divide"
4739
4749
  },
4740
4750
  {
4741
- trigger: ["/"],
4751
+ latexTrigger: ["/"],
4742
4752
  kind: "infix",
4743
4753
  associativity: "non",
4744
4754
  precedence: 660,
4745
4755
  parse: "Divide"
4746
4756
  },
4747
4757
  {
4748
- trigger: ["\\div"],
4758
+ latexTrigger: ["\\div"],
4749
4759
  kind: "infix",
4750
4760
  associativity: "non",
4751
4761
  precedence: 660,
@@ -4763,36 +4773,41 @@ var ComputeEngine = (() => {
4763
4773
  },
4764
4774
  {
4765
4775
  name: "Factorial",
4766
- trigger: ["!"],
4776
+ latexTrigger: ["!"],
4767
4777
  kind: "postfix",
4768
4778
  precedence: 810
4769
4779
  },
4770
4780
  {
4771
4781
  name: "Factorial2",
4772
- trigger: ["!", "!"],
4782
+ latexTrigger: ["!", "!"],
4773
4783
  kind: "postfix",
4774
4784
  precedence: 810
4775
4785
  },
4776
4786
  {
4777
4787
  name: "Floor",
4778
4788
  kind: "matchfix",
4779
- openDelimiter: "\\lfloor",
4780
- closeDelimiter: "\\rfloor"
4789
+ openTrigger: "\\lfloor",
4790
+ closeTrigger: "\\rfloor",
4791
+ parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body]
4781
4792
  },
4782
4793
  {
4783
4794
  kind: "matchfix",
4784
- openDelimiter: ["\u230A"],
4785
- closeDelimiter: ["\u230B"],
4786
- parse: (_, body) => ["Floor", body]
4795
+ openTrigger: ["\u230A"],
4796
+ closeTrigger: ["\u230B"],
4797
+ parse: (_parser, body) => isEmptySequence(body) ? null : ["Floor", body]
4787
4798
  },
4788
4799
  {
4789
- trigger: "floor",
4800
+ identifierTrigger: "floor",
4790
4801
  kind: "function",
4791
4802
  parse: "Floor"
4792
4803
  },
4804
+ {
4805
+ latexTrigger: ["\\Gamma"],
4806
+ parse: "Gamma"
4807
+ },
4793
4808
  {
4794
4809
  name: "Gcd",
4795
- trigger: "gcd",
4810
+ identifierTrigger: "gcd",
4796
4811
  kind: "function"
4797
4812
  },
4798
4813
  {
@@ -4801,34 +4816,34 @@ var ComputeEngine = (() => {
4801
4816
  },
4802
4817
  {
4803
4818
  name: "Lg",
4804
- trigger: ["\\lg"],
4819
+ latexTrigger: ["\\lg"],
4805
4820
  serialize: (serializer, expr) => "\\log_{10}" + serializer.wrapArguments(expr),
4806
4821
  parse: (parser) => {
4807
- const arg = parser.parseArguments("implicit");
4808
- if (arg === null)
4822
+ const args = parser.parseArguments("implicit");
4823
+ if (args === null)
4809
4824
  return "Lg";
4810
- return ["Log", ...arg, 10];
4825
+ return ["Log", ...args, 10];
4811
4826
  }
4812
4827
  },
4813
4828
  {
4814
4829
  name: "Lb",
4815
- trigger: "\\lb",
4830
+ latexTrigger: "\\lb",
4816
4831
  parse: (parser) => {
4817
- const arg = parser.parseArguments("implicit");
4818
- if (arg === null)
4832
+ const args = parser.parseArguments("implicit");
4833
+ if (args === null)
4819
4834
  return "Log";
4820
- return ["Log", ...arg, 2];
4835
+ return ["Log", ...args, 2];
4821
4836
  }
4822
4837
  },
4823
4838
  {
4824
4839
  name: "Ln",
4825
- trigger: ["\\ln"],
4840
+ latexTrigger: ["\\ln"],
4826
4841
  serialize: (serializer, expr) => "\\ln" + serializer.wrapArguments(expr),
4827
4842
  parse: (parser) => parseLog("Ln", parser)
4828
4843
  },
4829
4844
  {
4830
4845
  name: "Log",
4831
- trigger: ["\\log"],
4846
+ latexTrigger: ["\\log"],
4832
4847
  parse: (parser) => parseLog("Log", parser),
4833
4848
  serialize: (serializer, expr) => {
4834
4849
  const base = op2(expr);
@@ -4844,32 +4859,32 @@ var ComputeEngine = (() => {
4844
4859
  },
4845
4860
  {
4846
4861
  name: "Lcm",
4847
- trigger: "lcm",
4862
+ identifierTrigger: "lcm",
4848
4863
  kind: "function"
4849
4864
  },
4865
+ { name: "Max", identifierTrigger: "max", kind: "function" },
4866
+ { name: "Min", identifierTrigger: "min", kind: "function" },
4850
4867
  {
4851
4868
  name: "MinusPlus",
4852
- trigger: ["\\mp"],
4869
+ latexTrigger: ["\\mp"],
4853
4870
  kind: "infix",
4854
4871
  associativity: "both",
4855
4872
  precedence: 270
4856
4873
  },
4857
4874
  {
4858
4875
  name: "Multiply",
4859
- trigger: ["\\times"],
4876
+ latexTrigger: ["\\times"],
4860
4877
  kind: "infix",
4861
4878
  associativity: "both",
4862
4879
  precedence: 390,
4863
4880
  serialize: serializeMultiply
4864
4881
  },
4865
4882
  {
4866
- trigger: ["\\cdot"],
4883
+ latexTrigger: ["\\cdot"],
4867
4884
  kind: "infix",
4868
4885
  associativity: "both",
4869
4886
  precedence: 390,
4870
4887
  parse: (parser, lhs, terminator) => {
4871
- if (terminator && 391 < terminator.minPrec)
4872
- return null;
4873
4888
  const rhs = parser.parseExpression({ ...terminator, minPrec: 392 });
4874
4889
  if (rhs === null)
4875
4890
  return ["Multiply", lhs, MISSING];
@@ -4877,13 +4892,11 @@ var ComputeEngine = (() => {
4877
4892
  }
4878
4893
  },
4879
4894
  {
4880
- trigger: ["*"],
4895
+ latexTrigger: ["*"],
4881
4896
  kind: "infix",
4882
4897
  associativity: "both",
4883
4898
  precedence: 390,
4884
4899
  parse: (parser, lhs, terminator) => {
4885
- if (terminator && 391 < terminator.minPrec)
4886
- return null;
4887
4900
  const rhs = parser.parseExpression({ ...terminator, minPrec: 392 });
4888
4901
  if (rhs === null)
4889
4902
  return ["Multiply", lhs, MISSING];
@@ -4892,11 +4905,9 @@ var ComputeEngine = (() => {
4892
4905
  },
4893
4906
  {
4894
4907
  name: "Negate",
4895
- trigger: ["-"],
4908
+ latexTrigger: ["-"],
4896
4909
  kind: "prefix",
4897
4910
  parse: (parser, terminator) => {
4898
- if (terminator && 276 < terminator.minPrec)
4899
- return null;
4900
4911
  const rhs = parser.parseExpression({ ...terminator, minPrec: 400 });
4901
4912
  return ["Negate", missingIfEmpty(rhs)];
4902
4913
  },
@@ -4922,8 +4933,8 @@ var ComputeEngine = (() => {
4922
4933
  // /** If the argument is a vector */
4923
4934
  /** @todo: domain check */
4924
4935
  kind: "matchfix",
4925
- openDelimiter: "||",
4926
- closeDelimiter: "||",
4936
+ openTrigger: "||",
4937
+ closeTrigger: "||",
4927
4938
  parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr]
4928
4939
  },
4929
4940
  {
@@ -4931,12 +4942,13 @@ var ComputeEngine = (() => {
4931
4942
  /** @todo: domain check */
4932
4943
  name: "Norm",
4933
4944
  kind: "matchfix",
4934
- openDelimiter: ["\\left", "\\Vert"],
4935
- closeDelimiter: ["\\right", "\\Vert"]
4945
+ openTrigger: ["\\left", "\\Vert"],
4946
+ closeTrigger: ["\\right", "\\Vert"],
4947
+ parse: (_parser, expr) => isEmptySequence(expr) ? null : ["Norm", expr]
4936
4948
  },
4937
4949
  {
4938
4950
  name: "PlusMinus",
4939
- trigger: ["\\pm"],
4951
+ latexTrigger: ["\\pm"],
4940
4952
  kind: "infix",
4941
4953
  associativity: "both",
4942
4954
  precedence: 270,
@@ -4955,47 +4967,41 @@ var ComputeEngine = (() => {
4955
4967
  }
4956
4968
  },
4957
4969
  {
4958
- trigger: ["\\pm"],
4970
+ latexTrigger: ["\\pm"],
4959
4971
  kind: "prefix",
4960
4972
  precedence: 270,
4961
4973
  parse: (parser, terminator) => {
4962
- if (terminator && 270 < terminator.minPrec)
4963
- return null;
4964
4974
  const rhs = parser.parseExpression({ ...terminator, minPrec: 400 });
4965
4975
  return ["PlusMinus", missingIfEmpty(rhs)];
4966
4976
  }
4967
4977
  },
4968
4978
  {
4969
- trigger: ["\\plusmn"],
4979
+ latexTrigger: ["\\plusmn"],
4970
4980
  kind: "infix",
4971
4981
  associativity: "both",
4972
4982
  precedence: 270,
4973
4983
  parse: (parser, lhs, terminator) => {
4974
- if (270 < terminator.minPrec)
4975
- return null;
4976
4984
  const rhs = parser.parseExpression({ ...terminator, minPrec: 400 });
4977
4985
  return ["PlusMinus", lhs, missingIfEmpty(rhs)];
4978
4986
  }
4979
4987
  },
4980
4988
  {
4981
- trigger: ["\\plusmn"],
4989
+ latexTrigger: ["\\plusmn"],
4982
4990
  kind: "prefix",
4983
4991
  precedence: 270,
4984
4992
  parse: (parser, terminator) => {
4985
- if (terminator && 270 < terminator.minPrec)
4986
- return null;
4987
4993
  const rhs = parser.parseExpression({ ...terminator, minPrec: 400 });
4988
4994
  return ["PlusMinus", missingIfEmpty(rhs)];
4989
4995
  }
4990
4996
  },
4991
4997
  {
4992
4998
  name: "Power",
4993
- trigger: ["^"],
4999
+ latexTrigger: ["^"],
4994
5000
  kind: "infix",
4995
5001
  serialize: serializePower
4996
5002
  },
4997
5003
  {
4998
- trigger: "\\prod",
5004
+ latexTrigger: "\\prod",
4999
5005
  precedence: 390,
5000
5006
  name: "Product",
5001
5007
  parse: parseBigOp("Product", 390),
@@ -5012,7 +5018,7 @@ var ComputeEngine = (() => {
5012
5018
  precedence: 660,
5013
5019
  serialize: (serializer, expr) => {
5014
5020
  if (expr && nops(expr) === 1)
5015
- return "\\mathrm{Rational}" + serializer.wrapArguments(expr);
5021
+ return "\\operatorname{Rational}" + serializer.wrapArguments(expr);
5016
5022
  return serializeFraction(serializer, expr);
5017
5023
  }
5018
5024
  },
@@ -5022,7 +5028,7 @@ var ComputeEngine = (() => {
5022
5028
  },
5023
5029
  {
5024
5030
  name: "Round",
5025
- trigger: "round",
5031
+ identifierTrigger: "round",
5026
5032
  kind: "function"
5027
5033
  },
5028
5034
  {
@@ -5031,7 +5037,7 @@ var ComputeEngine = (() => {
5031
5037
  serialize: (serializer, expr) => serializer.wrapShort(op(expr, 1)) + "^2"
5032
5038
  },
5033
5039
  {
5034
- trigger: "\\sum",
5040
+ latexTrigger: ["\\sum"],
5035
5041
  precedence: 275,
5036
5042
  name: "Sum",
5037
5043
  parse: parseBigOp("Sum", 275),
@@ -5040,24 +5046,22 @@ var ComputeEngine = (() => {
5040
5046
  {
5041
5047
  name: "Sign",
5042
5048
  // As per ISO 80000-2, "signum" is 'sgn'
5043
- trigger: "sgn",
5049
+ identifierTrigger: "sgn",
5044
5050
  kind: "function"
5045
5051
  },
5046
5052
  {
5047
5053
  name: "Sqrt",
5048
- trigger: ["\\sqrt"],
5054
+ latexTrigger: ["\\sqrt"],
5049
5055
  parse: parseRoot,
5050
5056
  serialize: serializePower
5051
5057
  },
5052
5058
  {
5053
5059
  name: "Subtract",
5054
- trigger: ["-"],
5060
+ latexTrigger: ["-"],
5055
5061
  kind: "infix",
5056
5062
  associativity: "both",
5057
5063
  precedence: 275,
5058
5064
  parse: (parser, lhs, terminator) => {
5059
- if (276 < terminator.minPrec)
5060
- return null;
5061
5065
  const rhs = parser.parseExpression({ ...terminator, minPrec: 277 });
5062
5066
  return ["Subtract", lhs, missingIfEmpty(rhs)];
5063
5067
  }
@@ -5154,16 +5158,16 @@ var ComputeEngine = (() => {
5154
5158
  sub2 = parser.parseStringGroup()?.trim() ?? parser.nextToken();
5155
5159
  base = Number.parseFloat(sub2 ?? "10");
5156
5160
  }
5157
- const arg = parser.parseArguments("implicit");
5158
- if (arg === null)
5161
+ const args = parser.parseArguments("implicit");
5162
+ if (args === null)
5159
5163
  return [command];
5160
5164
  if (base === 10)
5161
- return ["Log", arg[0]];
5165
+ return ["Log", args[0]];
5162
5166
  if (base === 2)
5163
- return ["Lb", ...arg];
5167
+ return ["Lb", ...args];
5164
5168
  if (sub2 === null)
5165
- return [command, ...arg];
5166
- return ["Log", ...arg, sub2];
5169
+ return [command, ...args];
5170
+ return ["Log", ...args, sub2];
5167
5171
  }
5168
5172
 
5169
5173
  // src/compute-engine/latex-syntax/dictionary/definitions-core.ts
@@ -5202,7 +5206,7 @@ var ComputeEngine = (() => {
5202
5206
  // Constants
5203
5207
  //
5204
5208
  {
5205
- trigger: ["\\placeholder"],
5209
+ latexTrigger: ["\\placeholder"],
5206
5210
  kind: "symbol",
5207
5211
  parse: (parser) => {
5208
5212
  while (parser.match("<space>")) {
@@ -5221,6 +5225,27 @@ var ComputeEngine = (() => {
5221
5225
  //
5222
5226
  // Functions
5223
5227
  //
5228
+ {
5229
+ name: "Apply",
5230
+ kind: "function",
5231
+ identifierTrigger: "apply",
5232
+ serialize: (serializer, expr) => serializer.serializeFunction(ops(expr))
5233
+ },
5234
+ {
5235
+ latexTrigger: "\\rhd",
5236
+ kind: "infix",
5237
+ precedence: 20,
5238
+ parse: "Apply"
5239
+ },
5240
+ {
5241
+ latexTrigger: "\\lhd",
5242
+ kind: "infix",
5243
+ precedence: 20,
5244
+ parse: (parser, lhs) => {
5245
+ const rhs = parser.parseExpression({ minPrec: 20 }) ?? "Nothing";
5246
+ return ["Apply", rhs, lhs];
5247
+ }
5248
+ },
5224
5249
  {
5225
5250
  name: "BaseForm",
5226
5251
  serialize: (serializer, expr) => {
@@ -5286,7 +5311,7 @@ var ComputeEngine = (() => {
5286
5311
  }
5287
5312
  },
5288
5313
  {
5289
- trigger: ["\\mathtip"],
5314
+ latexTrigger: ["\\mathtip"],
5290
5315
  parse: (parser) => {
5291
5316
  const op12 = parser.parseGroup();
5292
5317
  const op22 = parser.parseGroup();
@@ -5294,7 +5319,7 @@ var ComputeEngine = (() => {
5294
5319
  }
5295
5320
  },
5296
5321
  {
5297
- trigger: ["\\texttip"],
5322
+ latexTrigger: ["\\texttip"],
5298
5323
  parse: (parser) => {
5299
5324
  const op12 = parser.parseGroup();
5300
5325
  const op22 = parser.parseGroup();
@@ -5302,8 +5327,8 @@ var ComputeEngine = (() => {
5302
5327
  }
5303
5328
  },
5304
5329
  {
5305
- trigger: ["\\error"],
5306
- parse: (parser) => parser.parseGroup()
5330
+ latexTrigger: ["\\error"],
5331
+ parse: (parser) => ["Error", parser.parseGroup()]
5307
5332
  },
5308
5333
  {
5309
5334
  name: "Error",
@@ -5363,10 +5388,10 @@ var ComputeEngine = (() => {
5363
5388
  {
5364
5389
  name: "List",
5365
5390
  kind: "matchfix",
5366
- openDelimiter: "[",
5367
- closeDelimiter: "]",
5391
+ openTrigger: "[",
5392
+ closeTrigger: "]",
5368
5393
  parse: (_parser, body) => {
5369
- if (body === null)
5394
+ if (body === null || isEmptySequence(body))
5370
5395
  return ["List"];
5371
5396
  if (head(body) !== "Sequence" && head(body) !== "List")
5372
5397
  return ["List", body];
@@ -5382,11 +5407,11 @@ var ComputeEngine = (() => {
5382
5407
  },
5383
5408
  {
5384
5409
  kind: "matchfix",
5385
- openDelimiter: "(",
5386
- closeDelimiter: ")",
5410
+ openTrigger: "(",
5411
+ closeTrigger: ")",
5387
5412
  parse: (_parser, body) => {
5388
- if (body === null)
5389
- return null;
5413
+ if (body === null || isEmptySequence(body))
5414
+ return ["Sequence"];
5390
5415
  if (head(body) === "Sequence" || head(body) === "List") {
5391
5416
  if (nops(body) === 0)
5392
5417
  return ["Delimiter"];
@@ -5396,7 +5421,7 @@ var ComputeEngine = (() => {
5396
5421
  }
5397
5422
  },
5398
5423
  {
5399
- trigger: [","],
5424
+ latexTrigger: [","],
5400
5425
  kind: "infix",
5401
5426
  precedence: 20,
5402
5427
  // Unlike the matchfix version of List,
@@ -5416,7 +5441,7 @@ var ComputeEngine = (() => {
5416
5441
  serialize: serializeOps("")
5417
5442
  },
5418
5443
  {
5419
- trigger: [";"],
5444
+ latexTrigger: [";"],
5420
5445
  kind: "infix",
5421
5446
  precedence: 19,
5422
5447
  parse: (parser, lhs, terminator) => {
@@ -5433,7 +5458,7 @@ var ComputeEngine = (() => {
5433
5458
  },
5434
5459
  {
5435
5460
  name: "String",
5436
- trigger: ["\\text"],
5461
+ latexTrigger: ["\\text"],
5437
5462
  parse: (scanner) => parseTextRun(scanner),
5438
5463
  serialize: (serializer, expr) => {
5439
5464
  const args = ops(expr);
@@ -5448,7 +5473,7 @@ var ComputeEngine = (() => {
5448
5473
  },
5449
5474
  {
5450
5475
  name: "Subscript",
5451
- trigger: ["_"],
5476
+ latexTrigger: ["_"],
5452
5477
  kind: "infix",
5453
5478
  serialize: (serializer, expr) => {
5454
5479
  if (nops(expr) === 2) {
@@ -5457,53 +5482,121 @@ var ComputeEngine = (() => {
5457
5482
  return "_{" + serializer.serialize(op(expr, 1)) + "}";
5458
5483
  }
5459
5484
  },
5460
- { name: "Superplus", trigger: ["^", "+"], kind: "postfix" },
5461
- { name: "Subplus", trigger: ["_", "+"], kind: "postfix" },
5462
- { name: "Superminus", trigger: ["^", "-"], kind: "postfix" },
5463
- { name: "Subminus", trigger: ["_", "-"], kind: "postfix" },
5485
+ { name: "Superplus", latexTrigger: ["^", "+"], kind: "postfix" },
5486
+ { name: "Subplus", latexTrigger: ["_", "+"], kind: "postfix" },
5487
+ { name: "Superminus", latexTrigger: ["^", "-"], kind: "postfix" },
5488
+ { name: "Subminus", latexTrigger: ["_", "-"], kind: "postfix" },
5464
5489
  {
5465
- trigger: ["^", "*"],
5490
+ latexTrigger: ["^", "*"],
5466
5491
  kind: "postfix",
5467
5492
  parse: (_parser, lhs) => ["Superstar", lhs]
5468
5493
  },
5469
5494
  // @todo: when lhs is a complex number, 'Conjugate'
5470
5495
  // { name: 'Conjugate', trigger: ['\\star'], kind: 'infix' },
5471
- { name: "Superstar", trigger: ["^", "\\star"], kind: "postfix" },
5496
+ { name: "Superstar", latexTrigger: ["^", "\\star"], kind: "postfix" },
5472
5497
  {
5473
- trigger: ["_", "*"],
5498
+ latexTrigger: ["_", "*"],
5474
5499
  kind: "postfix",
5475
5500
  parse: (_parser, lhs) => ["Substar", lhs]
5476
5501
  },
5477
- { name: "Substar", trigger: ["_", "\\star"], kind: "postfix" },
5478
- { name: "Superdagger", trigger: ["^", "\\dagger"], kind: "postfix" },
5502
+ { name: "Substar", latexTrigger: ["_", "\\star"], kind: "postfix" },
5503
+ { name: "Superdagger", latexTrigger: ["^", "\\dagger"], kind: "postfix" },
5479
5504
  {
5480
- trigger: ["^", "\\dag"],
5505
+ latexTrigger: ["^", "\\dag"],
5481
5506
  kind: "postfix",
5482
5507
  parse: (_parser, lhs) => ["Superdagger", lhs]
5483
5508
  },
5484
5509
  {
5485
5510
  name: "Prime",
5486
- trigger: ["^", "\\prime"],
5487
- kind: "postfix"
5511
+ latexTrigger: ["^", "\\prime"],
5512
+ // Note: we don't need a precedence because the trigger is '^'
5513
+ // and '^' (and '_') are treated specially by the parser.
5514
+ kind: "postfix",
5515
+ parse: (parser, lhs) => parsePrime(parser, lhs, 1),
5516
+ serialize: (serializer, expr) => {
5517
+ const n2 = machineValue(op(expr, 2)) ?? 1;
5518
+ const base = serializer.serialize(op(expr, 1));
5519
+ if (n2 === 1)
5520
+ return base + "^\\prime";
5521
+ if (n2 === 2)
5522
+ return base + "^\\doubleprime";
5523
+ if (n2 === 3)
5524
+ return base + "^\\tripleprime";
5525
+ return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}";
5526
+ }
5527
+ },
5528
+ {
5529
+ latexTrigger: "^{\\prime\\prime}",
5530
+ kind: "postfix",
5531
+ parse: (parser, lhs) => parsePrime(parser, lhs, 2)
5532
+ },
5533
+ {
5534
+ latexTrigger: "^{\\prime\\prime\\prime}",
5535
+ kind: "postfix",
5536
+ parse: (parser, lhs) => parsePrime(parser, lhs, 3)
5537
+ },
5538
+ {
5539
+ latexTrigger: ["^", "\\doubleprime"],
5540
+ kind: "postfix",
5541
+ parse: (parser, lhs) => parsePrime(parser, lhs, 2)
5542
+ },
5543
+ {
5544
+ latexTrigger: ["^", "\\tripleprime"],
5545
+ kind: "postfix",
5546
+ parse: (parser, lhs) => parsePrime(parser, lhs, 3)
5547
+ },
5548
+ {
5549
+ latexTrigger: "'",
5550
+ kind: "postfix",
5551
+ precedence: 810,
5552
+ parse: (parser, lhs) => parsePrime(parser, lhs, 1)
5488
5553
  },
5489
5554
  {
5490
- trigger: ["^", "\\doubleprime"],
5555
+ latexTrigger: "\\prime",
5491
5556
  kind: "postfix",
5492
- parse: (_parser, lhs) => ["Prime", missingIfEmpty(lhs), 2]
5557
+ precedence: 810,
5558
+ parse: (parser, lhs) => parsePrime(parser, lhs, 1)
5493
5559
  },
5494
5560
  {
5495
- trigger: ["^", "\\tripleprime"],
5561
+ latexTrigger: "\\doubleprime",
5496
5562
  kind: "postfix",
5497
- parse: (_parser, lhs) => ["Prime", missingIfEmpty(lhs), 3]
5563
+ precedence: 810,
5564
+ parse: (parser, lhs) => parsePrime(parser, lhs, 2)
5565
+ },
5566
+ {
5567
+ latexTrigger: "\\tripleprime",
5568
+ kind: "postfix",
5569
+ precedence: 810,
5570
+ parse: (parser, lhs) => parsePrime(parser, lhs, 3)
5571
+ },
5572
+ {
5573
+ latexTrigger: ["^", "<{>", "("],
5574
+ kind: "postfix",
5575
+ parse: (parser, lhs) => {
5576
+ if (!parser.computeEngine?.box(lhs)?.domain.isFunction)
5577
+ return null;
5578
+ const start = parser.index;
5579
+ parser.addBoundary([")"]);
5580
+ const expr = parser.parseExpression();
5581
+ if (!parser.matchBoundary()) {
5582
+ parser.index = start;
5583
+ return null;
5584
+ }
5585
+ if (!parser.match("<}>")) {
5586
+ parser.index = start;
5587
+ return null;
5588
+ }
5589
+ return ["Derivative", lhs, expr];
5590
+ }
5498
5591
  },
5499
5592
  {
5500
5593
  name: "InverseFunction",
5501
- trigger: "^{-1}",
5594
+ latexTrigger: "^{-1}",
5502
5595
  kind: "postfix",
5503
5596
  parse: (parser, lhs) => {
5504
5597
  if (parser.computeEngine?.box(lhs)?.domain.isFunction)
5505
5598
  return ["InverseFunction", lhs];
5506
- return null;
5599
+ return ["Power", missingIfEmpty(lhs), -1];
5507
5600
  },
5508
5601
  serialize: (serializer, expr) => serializer.serialize(op(expr, 1)) + "^{-1}"
5509
5602
  },
@@ -5518,13 +5611,13 @@ var ComputeEngine = (() => {
5518
5611
  return base + "^{\\doubleprime}";
5519
5612
  if (degree === 3)
5520
5613
  return base + "^{\\tripleprime}";
5521
- return base + "^{(" + Number(degree).toString() + ")}";
5614
+ return base + "^{(" + serializer.serialize(op(expr, 2)) + ")}";
5522
5615
  }
5523
5616
  },
5524
5617
  {
5525
- name: "Which",
5526
- trigger: "cases",
5527
5618
  kind: "environment",
5619
+ name: "Which",
5620
+ identifierTrigger: "cases",
5528
5621
  parse: (parser) => {
5529
5622
  const tabular = parser.parseTabular();
5530
5623
  if (!tabular)
@@ -5667,11 +5760,26 @@ var ComputeEngine = (() => {
5667
5760
  return serializer.serialize(op(arg, 1));
5668
5761
  return serializer.serialize(arg);
5669
5762
  }
5763
+ function parsePrime(parser, lhs, order2) {
5764
+ const lhsh = head(lhs);
5765
+ if (lhsh === "Derivative" || lhsh === "Prime") {
5766
+ const n = machineValue(op(lhs, 2)) ?? 1;
5767
+ return [lhsh, missingIfEmpty(op(lhs, 1)), n + order2];
5768
+ }
5769
+ if (parser.computeEngine?.box(lhs)?.domain.isFunction) {
5770
+ if (order2 === 1)
5771
+ return ["Derivative", lhs];
5772
+ return ["Derivative", lhs, order2];
5773
+ }
5774
+ if (order2 === 1)
5775
+ return ["Prime", missingIfEmpty(lhs)];
5776
+ return ["Prime", missingIfEmpty(lhs), order2];
5777
+ }
5670
5778
 
5671
5779
  // src/compute-engine/latex-syntax/dictionary/definitions-inequalities.ts
5672
5780
  var DEFINITIONS_INEQUALITIES = [
5673
5781
  {
5674
- trigger: ["\\not", "<"],
5782
+ latexTrigger: ["\\not", "<"],
5675
5783
  kind: "infix",
5676
5784
  associativity: "right",
5677
5785
  precedence: 246,
@@ -5679,13 +5787,13 @@ var ComputeEngine = (() => {
5679
5787
  },
5680
5788
  {
5681
5789
  name: "NotLess",
5682
- trigger: ["\\nless"],
5790
+ latexTrigger: ["\\nless"],
5683
5791
  kind: "infix",
5684
5792
  associativity: "right",
5685
5793
  precedence: 246
5686
5794
  },
5687
5795
  {
5688
- trigger: ["<"],
5796
+ latexTrigger: ["<"],
5689
5797
  kind: "infix",
5690
5798
  associativity: "right",
5691
5799
  precedence: 245,
@@ -5693,13 +5801,13 @@ var ComputeEngine = (() => {
5693
5801
  },
5694
5802
  {
5695
5803
  name: "Less",
5696
- trigger: ["\\lt"],
5804
+ latexTrigger: ["\\lt"],
5697
5805
  kind: "infix",
5698
5806
  associativity: "right",
5699
5807
  precedence: 245
5700
5808
  },
5701
5809
  {
5702
- trigger: ["<", "="],
5810
+ latexTrigger: ["<", "="],
5703
5811
  kind: "infix",
5704
5812
  associativity: "right",
5705
5813
  precedence: 241,
@@ -5707,20 +5815,20 @@ var ComputeEngine = (() => {
5707
5815
  },
5708
5816
  {
5709
5817
  name: "LessEqual",
5710
- trigger: ["\\le"],
5818
+ latexTrigger: ["\\le"],
5711
5819
  kind: "infix",
5712
5820
  associativity: "right",
5713
5821
  precedence: 241
5714
5822
  },
5715
5823
  {
5716
- trigger: ["\\leq"],
5824
+ latexTrigger: ["\\leq"],
5717
5825
  kind: "infix",
5718
5826
  associativity: "right",
5719
5827
  precedence: 241,
5720
5828
  parse: "LessEqual"
5721
5829
  },
5722
5830
  {
5723
- trigger: ["\\leqslant"],
5831
+ latexTrigger: ["\\leqslant"],
5724
5832
  kind: "infix",
5725
5833
  associativity: "right",
5726
5834
  precedence: 265,
@@ -5729,28 +5837,28 @@ var ComputeEngine = (() => {
5729
5837
  },
5730
5838
  {
5731
5839
  name: "LessNotEqual",
5732
- trigger: ["\\lneqq"],
5840
+ latexTrigger: ["\\lneqq"],
5733
5841
  kind: "infix",
5734
5842
  associativity: "right",
5735
5843
  precedence: 260
5736
5844
  },
5737
5845
  {
5738
5846
  name: "NotLessNotEqual",
5739
- trigger: ["\\nleqq"],
5847
+ latexTrigger: ["\\nleqq"],
5740
5848
  kind: "infix",
5741
5849
  associativity: "right",
5742
5850
  precedence: 260
5743
5851
  },
5744
5852
  {
5745
5853
  name: "LessOverEqual",
5746
- trigger: ["\\leqq"],
5854
+ latexTrigger: ["\\leqq"],
5747
5855
  kind: "infix",
5748
5856
  associativity: "right",
5749
5857
  precedence: 265
5750
5858
  },
5751
5859
  {
5752
5860
  name: "GreaterOverEqual",
5753
- trigger: ["\\geqq"],
5861
+ latexTrigger: ["\\geqq"],
5754
5862
  kind: "infix",
5755
5863
  associativity: "right",
5756
5864
  precedence: 265,
@@ -5758,13 +5866,13 @@ var ComputeEngine = (() => {
5758
5866
  },
5759
5867
  {
5760
5868
  name: "Equal",
5761
- trigger: ["="],
5869
+ latexTrigger: ["="],
5762
5870
  kind: "infix",
5763
5871
  associativity: "right",
5764
5872
  precedence: 260
5765
5873
  },
5766
5874
  {
5767
- trigger: ["*", "="],
5875
+ latexTrigger: ["*", "="],
5768
5876
  kind: "infix",
5769
5877
  associativity: "right",
5770
5878
  precedence: 260,
@@ -5772,42 +5880,42 @@ var ComputeEngine = (() => {
5772
5880
  },
5773
5881
  {
5774
5882
  name: "StarEqual",
5775
- trigger: ["\\star", "="],
5883
+ latexTrigger: ["\\star", "="],
5776
5884
  kind: "infix",
5777
5885
  associativity: "right",
5778
5886
  precedence: 260
5779
5887
  },
5780
5888
  {
5781
5889
  name: "PlusEqual",
5782
- trigger: ["+", "="],
5890
+ latexTrigger: ["+", "="],
5783
5891
  kind: "infix",
5784
5892
  associativity: "right",
5785
5893
  precedence: 260
5786
5894
  },
5787
5895
  {
5788
5896
  name: "MinusEqual",
5789
- trigger: ["-", "="],
5897
+ latexTrigger: ["-", "="],
5790
5898
  kind: "infix",
5791
5899
  associativity: "right",
5792
5900
  precedence: 260
5793
5901
  },
5794
5902
  {
5795
5903
  name: "SlashEqual",
5796
- trigger: ["/", "="],
5904
+ latexTrigger: ["/", "="],
5797
5905
  kind: "infix",
5798
5906
  associativity: "right",
5799
5907
  precedence: 260
5800
5908
  },
5801
5909
  {
5802
5910
  name: "EqualEqual",
5803
- trigger: ["=", "="],
5911
+ latexTrigger: ["=", "="],
5804
5912
  kind: "infix",
5805
5913
  associativity: "right",
5806
5914
  precedence: 260
5807
5915
  },
5808
5916
  {
5809
5917
  name: "EqualEqualEqual",
5810
- trigger: ["=", "=", "="],
5918
+ latexTrigger: ["=", "=", "="],
5811
5919
  kind: "infix",
5812
5920
  associativity: "right",
5813
5921
  precedence: 265
@@ -5815,7 +5923,7 @@ var ComputeEngine = (() => {
5815
5923
  {
5816
5924
  name: "TildeFullEqual",
5817
5925
  // MathML: approximately equal to
5818
- trigger: ["\\cong"],
5926
+ latexTrigger: ["\\cong"],
5819
5927
  kind: "infix",
5820
5928
  associativity: "right",
5821
5929
  precedence: 260
@@ -5823,13 +5931,13 @@ var ComputeEngine = (() => {
5823
5931
  {
5824
5932
  name: "NotTildeFullEqual",
5825
5933
  // MathML: approximately but not actually equal to
5826
- trigger: ["\\ncong"],
5934
+ latexTrigger: ["\\ncong"],
5827
5935
  kind: "infix",
5828
5936
  associativity: "right",
5829
5937
  precedence: 260
5830
5938
  },
5831
5939
  {
5832
- trigger: [":", "="],
5940
+ latexTrigger: [":", "="],
5833
5941
  kind: "infix",
5834
5942
  associativity: "right",
5835
5943
  precedence: 260,
@@ -5837,7 +5945,7 @@ var ComputeEngine = (() => {
5837
5945
  },
5838
5946
  {
5839
5947
  name: "Assign",
5840
- trigger: ["\\coloneq"],
5948
+ latexTrigger: ["\\coloneq"],
5841
5949
  kind: "infix",
5842
5950
  associativity: "right",
5843
5951
  precedence: 260
@@ -5845,7 +5953,7 @@ var ComputeEngine = (() => {
5845
5953
  {
5846
5954
  name: "Approx",
5847
5955
  // Note: Mathematica TildeTilde
5848
- trigger: ["\\approx"],
5956
+ latexTrigger: ["\\approx"],
5849
5957
  kind: "infix",
5850
5958
  associativity: "right",
5851
5959
  precedence: 247
@@ -5853,7 +5961,7 @@ var ComputeEngine = (() => {
5853
5961
  {
5854
5962
  name: "NotApprox",
5855
5963
  // Note: Mathematica TildeTilde
5856
- trigger: ["\\not", "\\approx"],
5964
+ latexTrigger: ["\\not", "\\approx"],
5857
5965
  kind: "infix",
5858
5966
  associativity: "right",
5859
5967
  precedence: 247
@@ -5861,7 +5969,7 @@ var ComputeEngine = (() => {
5861
5969
  {
5862
5970
  name: "ApproxEqual",
5863
5971
  // Note: Mathematica TildeEqual, MathML: `asymptotically equal to`
5864
- trigger: ["\\approxeq"],
5972
+ latexTrigger: ["\\approxeq"],
5865
5973
  kind: "infix",
5866
5974
  associativity: "right",
5867
5975
  precedence: 260
@@ -5869,7 +5977,7 @@ var ComputeEngine = (() => {
5869
5977
  {
5870
5978
  name: "NotApproxEqual",
5871
5979
  // Note: Mathematica NotTildeEqual
5872
- trigger: ["\\not", "\\approxeq"],
5980
+ latexTrigger: ["\\not", "\\approxeq"],
5873
5981
  kind: "infix",
5874
5982
  // Note: no LaTeX symbol for char U+2249
5875
5983
  associativity: "right",
@@ -5877,14 +5985,14 @@ var ComputeEngine = (() => {
5877
5985
  },
5878
5986
  {
5879
5987
  name: "NotEqual",
5880
- trigger: ["\\ne"],
5988
+ latexTrigger: ["\\ne"],
5881
5989
  kind: "infix",
5882
5990
  associativity: "right",
5883
5991
  precedence: 255
5884
5992
  },
5885
5993
  {
5886
5994
  name: "Unequal",
5887
- trigger: ["!", "="],
5995
+ latexTrigger: ["!", "="],
5888
5996
  kind: "infix",
5889
5997
  associativity: "right",
5890
5998
  precedence: 260
@@ -5892,14 +6000,14 @@ var ComputeEngine = (() => {
5892
6000
  },
5893
6001
  {
5894
6002
  name: "GreaterEqual",
5895
- trigger: ["\\ge"],
6003
+ latexTrigger: ["\\ge"],
5896
6004
  kind: "infix",
5897
6005
  associativity: "right",
5898
6006
  precedence: 242
5899
6007
  // Note: different precendence than `>=` as per MathML
5900
6008
  },
5901
6009
  {
5902
- trigger: ["\\geq"],
6010
+ latexTrigger: ["\\geq"],
5903
6011
  kind: "infix",
5904
6012
  associativity: "right",
5905
6013
  precedence: 242,
@@ -5907,14 +6015,14 @@ var ComputeEngine = (() => {
5907
6015
  parse: "GreaterEqual"
5908
6016
  },
5909
6017
  {
5910
- trigger: [">", "="],
6018
+ latexTrigger: [">", "="],
5911
6019
  kind: "infix",
5912
6020
  associativity: "right",
5913
6021
  precedence: 243,
5914
6022
  parse: "GreaterEqual"
5915
6023
  },
5916
6024
  {
5917
- trigger: ["\\geqslant"],
6025
+ latexTrigger: ["\\geqslant"],
5918
6026
  kind: "infix",
5919
6027
  associativity: "right",
5920
6028
  precedence: 265,
@@ -5923,20 +6031,20 @@ var ComputeEngine = (() => {
5923
6031
  },
5924
6032
  {
5925
6033
  name: "GreaterNotEqual",
5926
- trigger: ["\\gneqq"],
6034
+ latexTrigger: ["\\gneqq"],
5927
6035
  kind: "infix",
5928
6036
  associativity: "right",
5929
6037
  precedence: 260
5930
6038
  },
5931
6039
  {
5932
6040
  name: "NotGreaterNotEqual",
5933
- trigger: ["\\ngeqq"],
6041
+ latexTrigger: ["\\ngeqq"],
5934
6042
  kind: "infix",
5935
6043
  associativity: "right",
5936
6044
  precedence: 260
5937
6045
  },
5938
6046
  {
5939
- trigger: [">"],
6047
+ latexTrigger: [">"],
5940
6048
  kind: "infix",
5941
6049
  associativity: "right",
5942
6050
  precedence: 245,
@@ -5944,20 +6052,20 @@ var ComputeEngine = (() => {
5944
6052
  },
5945
6053
  {
5946
6054
  name: "Greater",
5947
- trigger: ["\\gt"],
6055
+ latexTrigger: ["\\gt"],
5948
6056
  kind: "infix",
5949
6057
  associativity: "right",
5950
6058
  precedence: 245
5951
6059
  },
5952
6060
  {
5953
6061
  name: "NotGreater",
5954
- trigger: ["\\ngtr"],
6062
+ latexTrigger: ["\\ngtr"],
5955
6063
  kind: "infix",
5956
6064
  associativity: "right",
5957
6065
  precedence: 244
5958
6066
  },
5959
6067
  {
5960
- trigger: ["\\not", ">"],
6068
+ latexTrigger: ["\\not", ">"],
5961
6069
  kind: "infix",
5962
6070
  associativity: "right",
5963
6071
  precedence: 244,
@@ -5965,7 +6073,7 @@ var ComputeEngine = (() => {
5965
6073
  },
5966
6074
  {
5967
6075
  name: "RingEqual",
5968
- trigger: ["\\circeq"],
6076
+ latexTrigger: ["\\circeq"],
5969
6077
  kind: "infix",
5970
6078
  associativity: "right",
5971
6079
  precedence: 260
@@ -5973,7 +6081,7 @@ var ComputeEngine = (() => {
5973
6081
  {
5974
6082
  name: "TriangleEqual",
5975
6083
  // MathML: delta equal to
5976
- trigger: ["\\triangleq"],
6084
+ latexTrigger: ["\\triangleq"],
5977
6085
  kind: "infix",
5978
6086
  associativity: "right",
5979
6087
  precedence: 260
@@ -5981,7 +6089,7 @@ var ComputeEngine = (() => {
5981
6089
  {
5982
6090
  name: "DotEqual",
5983
6091
  // MathML: approaches the limit
5984
- trigger: ["\\doteq"],
6092
+ latexTrigger: ["\\doteq"],
5985
6093
  kind: "infix",
5986
6094
  associativity: "right",
5987
6095
  precedence: 265
@@ -5989,7 +6097,7 @@ var ComputeEngine = (() => {
5989
6097
  {
5990
6098
  name: "DotEqualDot",
5991
6099
  // MathML: Geometrically equal
5992
- trigger: ["\\doteqdot"],
6100
+ latexTrigger: ["\\doteqdot"],
5993
6101
  kind: "infix",
5994
6102
  associativity: "right",
5995
6103
  precedence: 265
@@ -5997,7 +6105,7 @@ var ComputeEngine = (() => {
5997
6105
  {
5998
6106
  name: "FallingDotEqual",
5999
6107
  // MathML: approximately equal to or the image of
6000
- trigger: ["\\fallingdotseq"],
6108
+ latexTrigger: ["\\fallingdotseq"],
6001
6109
  kind: "infix",
6002
6110
  associativity: "right",
6003
6111
  precedence: 265
@@ -6005,92 +6113,77 @@ var ComputeEngine = (() => {
6005
6113
  {
6006
6114
  name: "RisingDotEqual",
6007
6115
  // MathML: image of or approximately equal to
6008
- trigger: ["\\fallingdotseq"],
6116
+ latexTrigger: ["\\fallingdotseq"],
6009
6117
  kind: "infix",
6010
6118
  associativity: "right",
6011
6119
  precedence: 265
6012
6120
  },
6013
6121
  {
6014
6122
  name: "QuestionEqual",
6015
- trigger: ["\\questeq"],
6016
- kind: "infix",
6017
- associativity: "right",
6018
- precedence: 260
6019
- },
6020
- {
6021
- name: "Equivalent",
6022
- // MathML: identical to, Mathematica: Congruent
6023
- trigger: ["\\equiv"],
6123
+ latexTrigger: ["\\questeq"],
6024
6124
  kind: "infix",
6025
6125
  associativity: "right",
6026
6126
  precedence: 260
6027
6127
  },
6028
- {
6029
- trigger: ["\\iff"],
6030
- kind: "infix",
6031
- parse: "Equivalent",
6032
- associativity: "right",
6033
- precedence: 260
6034
- },
6035
6128
  {
6036
6129
  name: "MuchLess",
6037
- trigger: ["\\ll"],
6130
+ latexTrigger: ["\\ll"],
6038
6131
  kind: "infix",
6039
6132
  associativity: "right",
6040
6133
  precedence: 260
6041
6134
  },
6042
6135
  {
6043
6136
  name: "MuchGreater",
6044
- trigger: ["\\gg"],
6137
+ latexTrigger: ["\\gg"],
6045
6138
  kind: "infix",
6046
6139
  associativity: "right",
6047
6140
  precedence: 260
6048
6141
  },
6049
6142
  {
6050
6143
  name: "Precedes",
6051
- trigger: ["\\prec"],
6144
+ latexTrigger: ["\\prec"],
6052
6145
  kind: "infix",
6053
6146
  associativity: "right",
6054
6147
  precedence: 260
6055
6148
  },
6056
6149
  {
6057
6150
  name: "Succeeds",
6058
- trigger: ["\\succ"],
6151
+ latexTrigger: ["\\succ"],
6059
6152
  kind: "infix",
6060
6153
  associativity: "right",
6061
6154
  precedence: 260
6062
6155
  },
6063
6156
  {
6064
6157
  name: "PrecedesEqual",
6065
- trigger: ["\\preccurlyeq"],
6158
+ latexTrigger: ["\\preccurlyeq"],
6066
6159
  kind: "infix",
6067
6160
  associativity: "right",
6068
6161
  precedence: 260
6069
6162
  },
6070
6163
  {
6071
6164
  name: "SucceedsEqual",
6072
- trigger: ["\\curlyeqprec"],
6165
+ latexTrigger: ["\\curlyeqprec"],
6073
6166
  kind: "infix",
6074
6167
  associativity: "right",
6075
6168
  precedence: 260
6076
6169
  },
6077
6170
  {
6078
6171
  name: "NotPrecedes",
6079
- trigger: ["\\nprec"],
6172
+ latexTrigger: ["\\nprec"],
6080
6173
  kind: "infix",
6081
6174
  associativity: "right",
6082
6175
  precedence: 260
6083
6176
  },
6084
6177
  {
6085
6178
  name: "NotSucceeds",
6086
- trigger: ["\\nsucc"],
6179
+ latexTrigger: ["\\nsucc"],
6087
6180
  kind: "infix",
6088
6181
  associativity: "right",
6089
6182
  precedence: 260
6090
6183
  },
6091
6184
  {
6092
6185
  name: "Between",
6093
- trigger: ["\\between"],
6186
+ latexTrigger: ["\\between"],
6094
6187
  kind: "infix",
6095
6188
  associativity: "right",
6096
6189
  precedence: 265
@@ -6102,18 +6195,187 @@ var ComputeEngine = (() => {
6102
6195
  // Constants
6103
6196
  {
6104
6197
  name: "True",
6105
- trigger: ["\\mathrm", "<{>", "T", "r", "u", "e", "<}>"],
6106
- serialize: "\\mathrm{True}"
6198
+ kind: "symbol",
6199
+ latexTrigger: ["\\top"]
6200
+ // ⊤ U+22A4
6201
+ },
6202
+ {
6203
+ kind: "symbol",
6204
+ latexTrigger: "\\mathrm{True}",
6205
+ parse: "True"
6206
+ },
6207
+ {
6208
+ kind: "symbol",
6209
+ latexTrigger: "\\operator{True}",
6210
+ parse: "True"
6211
+ },
6212
+ {
6213
+ kind: "symbol",
6214
+ latexTrigger: "\\mathsf{T}",
6215
+ parse: "True"
6107
6216
  },
6108
6217
  {
6109
6218
  name: "False",
6110
- trigger: ["\\mathrm", "<{>", "F", "a", "l", "s", "e", "<}>"],
6111
- serialize: "\\mathrm{False}"
6219
+ kind: "symbol",
6220
+ latexTrigger: ["\\bot"]
6221
+ // ⊥ U+22A5
6222
+ },
6223
+ {
6224
+ kind: "symbol",
6225
+ latexTrigger: "\\operator{False}",
6226
+ parse: "True"
6227
+ },
6228
+ {
6229
+ kind: "symbol",
6230
+ latexTrigger: "\\mathsf{F}",
6231
+ parse: "True"
6112
6232
  },
6113
6233
  {
6114
6234
  name: "Maybe",
6115
- trigger: ["\\mathrm", "<{>", "M", "a", "y", "b", "e", "<}>"],
6116
- serialize: "\\mathrm{Maybe}"
6235
+ kind: "symbol",
6236
+ latexTrigger: "\\operatorname{Maybe}",
6237
+ serialize: "\\operatorname{Maybe}"
6238
+ },
6239
+ {
6240
+ kind: "symbol",
6241
+ latexTrigger: "\\mathrm{Maybe}",
6242
+ parse: "Maybe"
6243
+ },
6244
+ // Operators
6245
+ {
6246
+ name: "And",
6247
+ kind: "infix",
6248
+ latexTrigger: ["\\land"],
6249
+ precedence: 317
6250
+ // serialize: '\\land',
6251
+ },
6252
+ { kind: "infix", latexTrigger: ["\\wedge"], parse: "And", precedence: 317 },
6253
+ { kind: "infix", latexTrigger: "\\&", parse: "And", precedence: 317 },
6254
+ {
6255
+ kind: "infix",
6256
+ latexTrigger: "\\operatorname{and}",
6257
+ parse: "And",
6258
+ precedence: 317
6259
+ },
6260
+ {
6261
+ name: "Or",
6262
+ kind: "infix",
6263
+ latexTrigger: ["\\lor"],
6264
+ precedence: 310
6265
+ },
6266
+ { kind: "infix", latexTrigger: ["\\vee"], parse: "Or", precedence: 310 },
6267
+ { kind: "infix", latexTrigger: "\\parallel", parse: "Or", precedence: 310 },
6268
+ {
6269
+ kind: "infix",
6270
+ latexTrigger: "\\operatorname{or}",
6271
+ parse: "And",
6272
+ precedence: 310
6273
+ },
6274
+ {
6275
+ name: "Xor",
6276
+ kind: "infix",
6277
+ latexTrigger: ["\\veebar"],
6278
+ precedence: 315
6279
+ },
6280
+ // Possible alt: \oplus ⊕ U+2295
6281
+ {
6282
+ name: "Not",
6283
+ kind: "prefix",
6284
+ latexTrigger: ["\\lnot"],
6285
+ precedence: 880
6286
+ },
6287
+ {
6288
+ name: "Nand",
6289
+ kind: "infix",
6290
+ latexTrigger: ["\\barwedge"],
6291
+ precedence: 315
6292
+ // serialize: '\\mid',
6293
+ },
6294
+ {
6295
+ name: "Nor",
6296
+ kind: "infix",
6297
+ latexTrigger: ["\u22BD"],
6298
+ // bar vee
6299
+ precedence: 315
6300
+ // serialize: '\\downarrow',
6301
+ },
6302
+ // Functions
6303
+ {
6304
+ kind: "function",
6305
+ identifierTrigger: "and",
6306
+ parse: "And"
6307
+ },
6308
+ {
6309
+ kind: "function",
6310
+ identifierTrigger: "or",
6311
+ parse: "Or"
6312
+ },
6313
+ {
6314
+ kind: "function",
6315
+ identifierTrigger: "not",
6316
+ parse: "Not"
6317
+ },
6318
+ // Relations
6319
+ {
6320
+ name: "Implies",
6321
+ kind: "infix",
6322
+ precedence: 220,
6323
+ associativity: "right",
6324
+ latexTrigger: ["\\implies"],
6325
+ serialize: "\\implies"
6326
+ },
6327
+ {
6328
+ latexTrigger: ["\\Rightarrow"],
6329
+ kind: "infix",
6330
+ precedence: 220,
6331
+ associativity: "right",
6332
+ parse: "Implies"
6333
+ },
6334
+ {
6335
+ name: "Equivalent",
6336
+ // MathML: identical to, Mathematica: Congruent
6337
+ latexTrigger: ["\\iff"],
6338
+ kind: "infix",
6339
+ associativity: "right",
6340
+ precedence: 219
6341
+ },
6342
+ {
6343
+ latexTrigger: ["\\Leftrightarrow"],
6344
+ kind: "infix",
6345
+ associativity: "right",
6346
+ precedence: 219,
6347
+ parse: "Equivalent"
6348
+ },
6349
+ {
6350
+ latexTrigger: ["\\equiv"],
6351
+ kind: "infix",
6352
+ associativity: "right",
6353
+ precedence: 219,
6354
+ parse: "Equivalent"
6355
+ },
6356
+ {
6357
+ name: "Proves",
6358
+ kind: "infix",
6359
+ latexTrigger: ["\\vdash"],
6360
+ precedence: 220,
6361
+ associativity: "right",
6362
+ serialize: "\\vdash"
6363
+ },
6364
+ {
6365
+ name: "Entails",
6366
+ kind: "infix",
6367
+ latexTrigger: ["\\vDash"],
6368
+ precedence: 220,
6369
+ associativity: "right",
6370
+ serialize: "\\vDash"
6371
+ },
6372
+ {
6373
+ name: "Satisfies",
6374
+ kind: "infix",
6375
+ latexTrigger: ["\\models"],
6376
+ precedence: 220,
6377
+ associativity: "right",
6378
+ serialize: "\\models"
6117
6379
  }
6118
6380
  ];
6119
6381
 
@@ -6127,72 +6389,73 @@ var ComputeEngine = (() => {
6127
6389
  var DEFINITIONS_OTHERS = [
6128
6390
  {
6129
6391
  name: "Overscript",
6130
- trigger: ["\\overset"],
6392
+ latexTrigger: ["\\overset"],
6131
6393
  kind: "infix",
6132
6394
  precedence: 700
6133
6395
  // @todo: not in MathML
6134
6396
  },
6135
6397
  {
6136
6398
  name: "Underscript",
6137
- trigger: ["\\underset"],
6399
+ latexTrigger: ["\\underset"],
6138
6400
  kind: "infix",
6139
6401
  precedence: 700
6140
6402
  // @todo: not in MathML
6141
6403
  },
6142
6404
  {
6143
6405
  name: "Increment",
6144
- trigger: ["+", "+"],
6406
+ latexTrigger: ["+", "+"],
6145
6407
  kind: "postfix",
6146
6408
  precedence: 880
6147
6409
  },
6148
6410
  {
6149
6411
  name: "Decrement",
6150
- trigger: ["-", "-"],
6412
+ latexTrigger: ["-", "-"],
6151
6413
  kind: "postfix",
6152
6414
  precedence: 880
6153
6415
  },
6154
6416
  {
6155
6417
  name: "PreIncrement",
6156
- trigger: ["+", "+"],
6418
+ latexTrigger: ["+", "+"],
6157
6419
  kind: "prefix",
6158
6420
  precedence: 880
6159
6421
  },
6160
6422
  {
6161
6423
  name: "PreDecrement",
6162
- trigger: ["-", "-"],
6424
+ latexTrigger: ["-", "-"],
6163
6425
  kind: "prefix",
6164
6426
  precedence: 880
6165
6427
  },
6166
6428
  {
6167
6429
  name: "Ring",
6168
6430
  // Aka 'Composition', i.e. function composition
6169
- trigger: ["\\circ"],
6431
+ latexTrigger: ["\\circ"],
6170
6432
  kind: "infix",
6171
6433
  precedence: 265
6434
+ // @todo: MathML is 950
6172
6435
  // @todo: check lhs and rhs are functions
6173
6436
  },
6174
6437
  {
6175
6438
  name: "Transpose",
6176
- trigger: ["^", "T"],
6439
+ latexTrigger: ["^", "T"],
6177
6440
  kind: "postfix"
6178
6441
  // @todo: if lhs is a list/tensor
6179
6442
  },
6180
6443
  {
6181
6444
  // @todo: if lhs is a list/tensor
6182
6445
  name: "ConjugateTranspose",
6183
- trigger: ["^", "H"],
6446
+ latexTrigger: ["^", "H"],
6184
6447
  kind: "postfix"
6185
6448
  },
6186
6449
  {
6187
6450
  name: "StringJoin",
6188
6451
  // @todo From Mathematica...?
6189
- trigger: ["\\lt", "\\gt"],
6452
+ latexTrigger: ["\\lt", "\\gt"],
6190
6453
  kind: "infix",
6191
6454
  precedence: 780
6192
6455
  },
6193
6456
  {
6194
6457
  name: "Starstar",
6195
- trigger: ["\\star", "\\star"],
6458
+ latexTrigger: ["\\star", "\\star"],
6196
6459
  kind: "infix",
6197
6460
  precedence: 780
6198
6461
  },
@@ -6202,7 +6465,7 @@ var ComputeEngine = (() => {
6202
6465
  // For the Leibniz notation see 'Divide' that handles `∂f/∂x`
6203
6466
  name: "PartialDerivative",
6204
6467
  // PartialDerivative(expr, {lists of vars}, degree)
6205
- trigger: ["\\partial"],
6468
+ latexTrigger: ["\\partial"],
6206
6469
  kind: "prefix",
6207
6470
  parse: (parser) => {
6208
6471
  let done = false;
@@ -6225,8 +6488,8 @@ var ComputeEngine = (() => {
6225
6488
  return null;
6226
6489
  let rhs = parser.parseGroup() ?? "Nothing";
6227
6490
  if (rhs !== "Nothing" && !isEmptySequence(rhs)) {
6228
- const arg = parser.parseArguments() ?? ["Nothing"];
6229
- rhs = [rhs, ...arg];
6491
+ const args = parser.parseArguments() ?? ["Nothing"];
6492
+ rhs = [rhs, ...args];
6230
6493
  }
6231
6494
  return ["PartialDerivative", rhs, sub2, sup];
6232
6495
  },
@@ -6252,128 +6515,128 @@ var ComputeEngine = (() => {
6252
6515
  },
6253
6516
  {
6254
6517
  name: "OverBar",
6255
- trigger: ["\\overline"],
6518
+ latexTrigger: ["\\overline"],
6256
6519
  parse: parseSingleArg("OverBar")
6257
6520
  },
6258
6521
  {
6259
6522
  name: "UnderBar",
6260
- trigger: ["\\underline"],
6523
+ latexTrigger: ["\\underline"],
6261
6524
  parse: parseSingleArg("UnderBar")
6262
6525
  },
6263
6526
  {
6264
6527
  name: "OverVector",
6265
- trigger: ["\\vec"],
6528
+ latexTrigger: ["\\vec"],
6266
6529
  parse: parseSingleArg("OverVector")
6267
6530
  },
6268
6531
  {
6269
6532
  name: "OverTilde",
6270
- trigger: ["\\tilde"],
6533
+ latexTrigger: ["\\tilde"],
6271
6534
  parse: parseSingleArg("OverTilde")
6272
6535
  },
6273
6536
  {
6274
6537
  name: "OverHat",
6275
- trigger: ["\\hat"],
6538
+ latexTrigger: ["\\hat"],
6276
6539
  parse: parseSingleArg("OverHat")
6277
6540
  },
6278
6541
  {
6279
6542
  name: "OverRightArrow",
6280
- trigger: ["\\overrightarrow"],
6543
+ latexTrigger: ["\\overrightarrow"],
6281
6544
  parse: parseSingleArg("OverRightArrow")
6282
6545
  },
6283
6546
  {
6284
6547
  name: "OverLeftArrow",
6285
- trigger: ["\\overleftarrow"],
6548
+ latexTrigger: ["\\overleftarrow"],
6286
6549
  parse: parseSingleArg("OverLeftArrow")
6287
6550
  },
6288
6551
  {
6289
6552
  name: "OverRightDoubleArrow",
6290
- trigger: ["\\Overrightarrow"],
6553
+ latexTrigger: ["\\Overrightarrow"],
6291
6554
  parse: parseSingleArg("OverRightDoubleArrow")
6292
6555
  },
6293
6556
  {
6294
6557
  name: "OverLeftHarpoon",
6295
- trigger: ["\\overleftharpoon"],
6558
+ latexTrigger: ["\\overleftharpoon"],
6296
6559
  parse: parseSingleArg("OverLeftHarpoon")
6297
6560
  },
6298
6561
  {
6299
6562
  name: "OverRightHarpoon",
6300
- trigger: ["\\overrightharpoon"],
6563
+ latexTrigger: ["\\overrightharpoon"],
6301
6564
  parse: parseSingleArg("OverRightHarpoon")
6302
6565
  },
6303
6566
  {
6304
6567
  name: "OverLeftRightArrow",
6305
- trigger: ["\\overleftrightarrow"],
6568
+ latexTrigger: ["\\overleftrightarrow"],
6306
6569
  parse: parseSingleArg("OverLeftRightArrow")
6307
6570
  },
6308
6571
  {
6309
6572
  name: "OverBrace",
6310
- trigger: ["\\overbrace"],
6573
+ latexTrigger: ["\\overbrace"],
6311
6574
  parse: parseSingleArg("OverBrace")
6312
6575
  },
6313
6576
  {
6314
6577
  name: "OverLineSegment",
6315
- trigger: ["\\overlinesegment"],
6578
+ latexTrigger: ["\\overlinesegment"],
6316
6579
  parse: parseSingleArg("OverLineSegment")
6317
6580
  },
6318
6581
  {
6319
6582
  name: "OverGroup",
6320
- trigger: ["\\overgroup"],
6583
+ latexTrigger: ["\\overgroup"],
6321
6584
  parse: parseSingleArg("OverGroup")
6322
6585
  },
6323
6586
  {
6324
- trigger: ["\\displaystyle"],
6587
+ latexTrigger: ["\\displaystyle"],
6325
6588
  parse: () => ["Sequence"]
6326
6589
  },
6327
6590
  {
6328
- trigger: ["\\textstyle"],
6591
+ latexTrigger: ["\\textstyle"],
6329
6592
  parse: () => ["Sequence"]
6330
6593
  },
6331
6594
  {
6332
- trigger: ["\\scriptstyle"],
6595
+ latexTrigger: ["\\scriptstyle"],
6333
6596
  parse: () => ["Sequence"]
6334
6597
  },
6335
6598
  {
6336
- trigger: ["\\scriptscriptstyle"],
6599
+ latexTrigger: ["\\scriptscriptstyle"],
6337
6600
  parse: () => ["Sequence"]
6338
6601
  },
6339
6602
  {
6340
- trigger: ["\\tiny"],
6603
+ latexTrigger: ["\\tiny"],
6341
6604
  parse: () => ["Sequence"]
6342
6605
  },
6343
6606
  {
6344
- trigger: ["\\scriptsize"],
6607
+ latexTrigger: ["\\scriptsize"],
6345
6608
  parse: () => ["Sequence"]
6346
6609
  },
6347
6610
  {
6348
- trigger: ["\\footnotesize"],
6611
+ latexTrigger: ["\\footnotesize"],
6349
6612
  parse: () => ["Sequence"]
6350
6613
  },
6351
6614
  {
6352
- trigger: ["\\small"],
6615
+ latexTrigger: ["\\small"],
6353
6616
  parse: () => ["Sequence"]
6354
6617
  },
6355
6618
  {
6356
- trigger: ["\\normalsize"],
6619
+ latexTrigger: ["\\normalsize"],
6357
6620
  parse: () => ["Sequence"]
6358
6621
  },
6359
6622
  {
6360
- trigger: ["\\large"],
6623
+ latexTrigger: ["\\large"],
6361
6624
  parse: () => ["Sequence"]
6362
6625
  },
6363
6626
  {
6364
- trigger: ["\\Large"],
6627
+ latexTrigger: ["\\Large"],
6365
6628
  parse: () => ["Sequence"]
6366
6629
  },
6367
6630
  {
6368
- trigger: ["\\LARGE"],
6631
+ latexTrigger: ["\\LARGE"],
6369
6632
  parse: () => ["Sequence"]
6370
6633
  },
6371
6634
  {
6372
- trigger: ["\\huge"],
6635
+ latexTrigger: ["\\huge"],
6373
6636
  parse: () => ["Sequence"]
6374
6637
  },
6375
6638
  {
6376
- trigger: ["\\Huge"],
6639
+ latexTrigger: ["\\Huge"],
6377
6640
  parse: () => ["Sequence"]
6378
6641
  },
6379
6642
  {
@@ -6415,39 +6678,39 @@ var ComputeEngine = (() => {
6415
6678
  }
6416
6679
  },
6417
6680
  {
6418
- trigger: ["\\!"],
6681
+ latexTrigger: ["\\!"],
6419
6682
  parse: () => ["HorizontalSpacing", -3]
6420
6683
  },
6421
6684
  {
6422
- trigger: ["\\ "],
6685
+ latexTrigger: ["\\ "],
6423
6686
  parse: () => ["HorizontalSpacing", 6]
6424
6687
  },
6425
6688
  {
6426
- trigger: ["\\:"],
6689
+ latexTrigger: ["\\:"],
6427
6690
  parse: () => ["HorizontalSpacing", 4]
6428
6691
  },
6429
6692
  {
6430
- trigger: ["\\enskip"],
6693
+ latexTrigger: ["\\enskip"],
6431
6694
  parse: () => ["HorizontalSpacing", 9]
6432
6695
  },
6433
6696
  {
6434
- trigger: ["\\quad"],
6697
+ latexTrigger: ["\\quad"],
6435
6698
  parse: () => ["HorizontalSpacing", 18]
6436
6699
  },
6437
6700
  {
6438
- trigger: ["\\qquad"],
6701
+ latexTrigger: ["\\qquad"],
6439
6702
  parse: () => ["HorizontalSpacing", 36]
6440
6703
  },
6441
6704
  {
6442
- trigger: ["\\,"],
6705
+ latexTrigger: ["\\,"],
6443
6706
  parse: () => ["HorizontalSpacing", 3]
6444
6707
  },
6445
6708
  {
6446
- trigger: ["\\;"],
6709
+ latexTrigger: ["\\;"],
6447
6710
  parse: () => ["HorizontalSpacing", 5]
6448
6711
  },
6449
6712
  {
6450
- trigger: ["\\enspace"],
6713
+ latexTrigger: ["\\enspace"],
6451
6714
  parse: () => ["HorizontalSpacing", 9]
6452
6715
  },
6453
6716
  {
@@ -6547,146 +6810,146 @@ var ComputeEngine = (() => {
6547
6810
  var DEFINITIONS_TRIGONOMETRY = [
6548
6811
  {
6549
6812
  name: "Arcsin",
6550
- trigger: ["\\arcsin"],
6813
+ latexTrigger: ["\\arcsin"],
6551
6814
  parse: parseTrig("Arcsin")
6552
6815
  },
6553
6816
  {
6554
6817
  name: "Arccos",
6555
- trigger: ["\\arccos"],
6818
+ latexTrigger: ["\\arccos"],
6556
6819
  parse: parseTrig("Arccos")
6557
6820
  },
6558
6821
  {
6559
6822
  name: "Arctan",
6560
- trigger: ["\\arctan"],
6823
+ latexTrigger: ["\\arctan"],
6561
6824
  parse: parseTrig("Arctan")
6562
6825
  },
6563
6826
  {
6564
- trigger: ["\\arctg"],
6827
+ latexTrigger: ["\\arctg"],
6565
6828
  parse: parseTrig("Arctan")
6566
6829
  },
6567
6830
  {
6568
6831
  name: "Arccot",
6569
- trigger: ["\\arcctg"],
6832
+ latexTrigger: ["\\arcctg"],
6570
6833
  parse: parseTrig("Arccot")
6571
6834
  },
6572
6835
  {
6573
6836
  name: "Arcsec",
6574
- trigger: "arcsec",
6837
+ latexTrigger: "arcsec",
6575
6838
  parse: parseTrig("Arcsec")
6576
6839
  },
6577
6840
  {
6578
6841
  name: "Arccsc",
6579
- trigger: ["\\arccsc"],
6842
+ latexTrigger: ["\\arccsc"],
6580
6843
  parse: parseTrig("Arccsc")
6581
6844
  },
6582
6845
  {
6583
6846
  name: "Arsinh",
6584
- trigger: ["\\arsinh"],
6847
+ latexTrigger: ["\\arsinh"],
6585
6848
  parse: parseTrig("Arsinh")
6586
6849
  },
6587
6850
  {
6588
6851
  name: "Arcosh",
6589
- trigger: ["\\arcosh"],
6852
+ latexTrigger: ["\\arcosh"],
6590
6853
  parse: parseTrig("Arcosh")
6591
6854
  },
6592
6855
  {
6593
6856
  name: "Artanh",
6594
- trigger: ["\\artanh"],
6857
+ latexTrigger: ["\\artanh"],
6595
6858
  parse: parseTrig("Artanh")
6596
6859
  },
6597
6860
  {
6598
6861
  name: "Arsech",
6599
- trigger: ["\\arsech"],
6862
+ latexTrigger: ["\\arsech"],
6600
6863
  parse: parseTrig("Arsech")
6601
6864
  },
6602
6865
  {
6603
6866
  name: "Arcsch",
6604
- trigger: ["\\arcsch"],
6867
+ latexTrigger: ["\\arcsch"],
6605
6868
  parse: parseTrig("Arcsch")
6606
6869
  },
6607
6870
  {
6608
6871
  // Rusian hyperbolic cosine
6609
- trigger: ["\\ch"],
6872
+ latexTrigger: ["\\ch"],
6610
6873
  parse: parseTrig("Cosh")
6611
6874
  },
6612
6875
  {
6613
6876
  name: "Cosec",
6614
- trigger: ["\\cosec"],
6877
+ latexTrigger: ["\\cosec"],
6615
6878
  parse: parseTrig("Cosec")
6616
6879
  },
6617
6880
  {
6618
6881
  name: "Cosh",
6619
- trigger: ["\\cosh"],
6882
+ latexTrigger: ["\\cosh"],
6620
6883
  parse: parseTrig("Cosh")
6621
6884
  },
6622
6885
  {
6623
6886
  name: "Cot",
6624
- trigger: ["\\cot"],
6887
+ latexTrigger: ["\\cot"],
6625
6888
  parse: parseTrig("Cot")
6626
6889
  },
6627
6890
  {
6628
- trigger: ["\\cotg"],
6891
+ latexTrigger: ["\\cotg"],
6629
6892
  parse: parseTrig("Cot")
6630
6893
  },
6631
6894
  {
6632
6895
  name: "Coth",
6633
- trigger: ["\\coth"],
6896
+ latexTrigger: ["\\coth"],
6634
6897
  parse: parseTrig("Coth")
6635
6898
  },
6636
6899
  {
6637
6900
  name: "Csc",
6638
- trigger: ["\\csc"],
6901
+ latexTrigger: ["\\csc"],
6639
6902
  parse: parseTrig("Csc")
6640
6903
  },
6641
6904
  {
6642
6905
  // Rusian cotangent
6643
- trigger: ["\\ctg"],
6906
+ latexTrigger: ["\\ctg"],
6644
6907
  parse: parseTrig("Cot")
6645
6908
  },
6646
6909
  {
6647
- trigger: ["\\cth"],
6910
+ latexTrigger: ["\\cth"],
6648
6911
  parse: parseTrig("Cotanh")
6649
6912
  },
6650
6913
  {
6651
6914
  name: "Sec",
6652
- trigger: ["\\sec"],
6915
+ latexTrigger: ["\\sec"],
6653
6916
  parse: parseTrig("Sec")
6654
6917
  },
6655
6918
  {
6656
6919
  name: "Sinh",
6657
- trigger: ["\\sinh"],
6920
+ latexTrigger: ["\\sinh"],
6658
6921
  parse: parseTrig("Sinh")
6659
6922
  },
6660
6923
  {
6661
- trigger: ["\\sh"],
6924
+ latexTrigger: ["\\sh"],
6662
6925
  parse: parseTrig("Sinh")
6663
6926
  },
6664
6927
  {
6665
6928
  name: "Tan",
6666
- trigger: ["\\tan"],
6929
+ latexTrigger: ["\\tan"],
6667
6930
  parse: parseTrig("Tan")
6668
6931
  },
6669
6932
  {
6670
- trigger: ["\\tg"],
6933
+ latexTrigger: ["\\tg"],
6671
6934
  parse: parseTrig("Tan")
6672
6935
  },
6673
6936
  {
6674
6937
  name: "Tanh",
6675
- trigger: ["\\tanh"],
6938
+ latexTrigger: ["\\tanh"],
6676
6939
  parse: parseTrig("Tanh")
6677
6940
  },
6678
6941
  {
6679
- trigger: ["\\th"],
6942
+ latexTrigger: ["\\th"],
6680
6943
  parse: parseTrig("Tanh")
6681
6944
  },
6682
6945
  {
6683
6946
  name: "Cos",
6684
- trigger: ["\\cos"],
6947
+ latexTrigger: ["\\cos"],
6685
6948
  parse: parseTrig("Cos")
6686
6949
  },
6687
6950
  {
6688
6951
  name: "Sin",
6689
- trigger: ["\\sin"],
6952
+ latexTrigger: ["\\sin"],
6690
6953
  parse: parseTrig("Sin")
6691
6954
  }
6692
6955
  ];
@@ -6694,77 +6957,77 @@ var ComputeEngine = (() => {
6694
6957
  // src/compute-engine/latex-syntax/dictionary/definitions-sets.ts
6695
6958
  var DEFINITIONS_SETS = [
6696
6959
  // Constants
6697
- { name: "AlgebraicNumber", trigger: "\\bar\\Q" },
6698
- { name: "ComplexNumber", trigger: ["\\C"] },
6699
- { trigger: "\\mathbb{C}", parse: "ComplexNumber" },
6700
- { name: "ImaginaryNumber", trigger: ["\\imaginaryI\\R"] },
6701
- { name: "ExtendedComplexNumber", trigger: ["\\bar\\C"] },
6702
- { name: "EmptySet", trigger: ["\\emptyset"] },
6703
- { trigger: ["\\varnothing"], parse: "EmptySet" },
6960
+ { name: "AlgebraicNumber", latexTrigger: "\\bar\\Q" },
6961
+ { name: "ComplexNumber", latexTrigger: ["\\C"] },
6962
+ { latexTrigger: "\\mathbb{C}", parse: "ComplexNumber" },
6963
+ { name: "ImaginaryNumber", latexTrigger: ["\\imaginaryI", "\\R"] },
6964
+ { name: "ExtendedComplexNumber", latexTrigger: ["\\bar", "\\C"] },
6965
+ { name: "EmptySet", latexTrigger: ["\\emptyset"] },
6966
+ { latexTrigger: ["\\varnothing"], parse: "EmptySet" },
6704
6967
  // Parsing only
6705
- { name: "Integer", trigger: ["\\Z"] },
6706
- { trigger: "\\mathbb{Z}", parse: "Integer" },
6707
- { name: "RationalNumber", trigger: ["\\Q"] },
6708
- { name: "RealNumber", trigger: ["\\R"] },
6709
- { trigger: "\\mathbb{R}", parse: "RealNumber" },
6710
- { name: "ExtendedRealNumber", trigger: ["\\bar\\R"] },
6711
- { name: "TranscendentalNumber", trigger: "\\R-\\bar\\Q" },
6712
- { trigger: "\\R\\backslash\\bar\\Q", parse: "TranscendentalNumber" },
6968
+ { name: "Integer", latexTrigger: ["\\Z"] },
6969
+ { latexTrigger: "\\mathbb{Z}", parse: "Integer" },
6970
+ { name: "RationalNumber", latexTrigger: ["\\Q"] },
6971
+ { name: "RealNumber", latexTrigger: ["\\R"] },
6972
+ { latexTrigger: "\\mathbb{R}", parse: "RealNumber" },
6973
+ { name: "ExtendedRealNumber", latexTrigger: ["\\bar", "\\R"] },
6974
+ { name: "TranscendentalNumber", latexTrigger: "\\R-\\bar\\Q" },
6975
+ { latexTrigger: "\\R\\backslash\\bar\\Q", parse: "TranscendentalNumber" },
6713
6976
  // Real numbers < 0
6714
- { name: "NegativeNumber", trigger: "\\R^-" },
6715
- { trigger: "\\R^{-}", parse: "NegativeNumber" },
6716
- { trigger: "\\R_-", parse: "NegativeNumber" },
6717
- { trigger: "\\R_{-}", parse: "NegativeNumber" },
6718
- { trigger: "\\R^{\\lt}", parse: "NegativeNumber" },
6977
+ { name: "NegativeNumber", latexTrigger: "\\R^-" },
6978
+ { latexTrigger: "\\R^{-}", parse: "NegativeNumber" },
6979
+ { latexTrigger: "\\R_-", parse: "NegativeNumber" },
6980
+ { latexTrigger: "\\R_{-}", parse: "NegativeNumber" },
6981
+ { latexTrigger: "\\R^{\\lt}", parse: "NegativeNumber" },
6719
6982
  // Real numbers > 0
6720
- { name: "PositiveNumber", trigger: "\\R^+" },
6721
- { trigger: "\\R^{+}", parse: "PositiveNumber" },
6722
- { trigger: "\\R_+", parse: "PositiveNumber" },
6723
- { trigger: "\\R_{+}", parse: "PositiveNumber" },
6724
- { trigger: "\\R^{\\gt}", parse: "PositiveNumber" },
6983
+ { name: "PositiveNumber", latexTrigger: "\\R^+" },
6984
+ { latexTrigger: "\\R^{+}", parse: "PositiveNumber" },
6985
+ { latexTrigger: "\\R_+", parse: "PositiveNumber" },
6986
+ { latexTrigger: "\\R_{+}", parse: "PositiveNumber" },
6987
+ { latexTrigger: "\\R^{\\gt}", parse: "PositiveNumber" },
6725
6988
  // Real numbers <= 0
6726
- { name: "NonPositiveNumber", trigger: "\\R^{0-}" },
6727
- { trigger: "\\R^{-0}", parse: "NonPositiveNumber" },
6728
- { trigger: "\\R^{\\leq}", parse: "NonPositiveNumber" },
6989
+ { name: "NonPositiveNumber", latexTrigger: "\\R^{0-}" },
6990
+ { latexTrigger: "\\R^{-0}", parse: "NonPositiveNumber" },
6991
+ { latexTrigger: "\\R^{\\leq}", parse: "NonPositiveNumber" },
6729
6992
  // Integers < 0
6730
- { name: "NegativeInteger", trigger: "\\Z^-" },
6731
- { trigger: "\\Z^-", parse: "NegativeInteger" },
6732
- { trigger: "\\Z^{-}", parse: "NegativeInteger" },
6733
- { trigger: "\\Z_-", parse: "NegativeInteger" },
6734
- { trigger: "\\Z_{-}", parse: "NegativeInteger" },
6735
- { trigger: "\\Z^{\\lt}", parse: "NegativeInteger" },
6993
+ { name: "NegativeInteger", latexTrigger: "\\Z^-" },
6994
+ { latexTrigger: "\\Z^-", parse: "NegativeInteger" },
6995
+ { latexTrigger: "\\Z^{-}", parse: "NegativeInteger" },
6996
+ { latexTrigger: "\\Z_-", parse: "NegativeInteger" },
6997
+ { latexTrigger: "\\Z_{-}", parse: "NegativeInteger" },
6998
+ { latexTrigger: "\\Z^{\\lt}", parse: "NegativeInteger" },
6736
6999
  // Integers > 0
6737
- { name: "PositiveInteger", trigger: "\\Z^+" },
6738
- { trigger: "\\Z^{+}", parse: "PositiveInteger" },
6739
- { trigger: "\\Z_+", parse: "PositiveInteger" },
6740
- { trigger: "\\Z_{+}", parse: "PositiveInteger" },
6741
- { trigger: "\\Z^{\\gt}", parse: "PositiveInteger" },
6742
- { trigger: "\\Z^{\\gt0}", parse: "PositiveInteger" },
6743
- { trigger: "\\N^+", parse: "PositiveInteger" },
6744
- { trigger: "\\N^{+}", parse: "PositiveInteger" },
6745
- { trigger: "\\N^*", parse: "PositiveInteger" },
6746
- { trigger: "\\N^{*}", parse: "PositiveInteger" },
6747
- { trigger: "\\N^\\star", parse: "PositiveInteger" },
6748
- { trigger: "\\N^{\\star}", parse: "PositiveInteger" },
6749
- { trigger: "\\N_1", parse: "PositiveInteger" },
6750
- { trigger: "\\N_{1}", parse: "PositiveInteger" },
7000
+ { name: "PositiveInteger", latexTrigger: "\\Z^+" },
7001
+ { latexTrigger: "\\Z^{+}", parse: "PositiveInteger" },
7002
+ { latexTrigger: "\\Z_+", parse: "PositiveInteger" },
7003
+ { latexTrigger: "\\Z_{+}", parse: "PositiveInteger" },
7004
+ { latexTrigger: "\\Z^{\\gt}", parse: "PositiveInteger" },
7005
+ { latexTrigger: "\\Z^{\\gt0}", parse: "PositiveInteger" },
7006
+ { latexTrigger: "\\N^+", parse: "PositiveInteger" },
7007
+ { latexTrigger: "\\N^{+}", parse: "PositiveInteger" },
7008
+ { latexTrigger: "\\N^*", parse: "PositiveInteger" },
7009
+ { latexTrigger: "\\N^{*}", parse: "PositiveInteger" },
7010
+ { latexTrigger: "\\N^\\star", parse: "PositiveInteger" },
7011
+ { latexTrigger: "\\N^{\\star}", parse: "PositiveInteger" },
7012
+ { latexTrigger: "\\N_1", parse: "PositiveInteger" },
7013
+ { latexTrigger: "\\N_{1}", parse: "PositiveInteger" },
6751
7014
  // https://mathvault.ca/hub/higher-math/math-symbols/algebra-symbols/
6752
7015
  // Integers >= 0
6753
- { name: "NonNegativeInteger", trigger: ["\\N"] },
6754
- { trigger: "\\Z^{+0}", parse: "NonNegativeInteger" },
6755
- { trigger: "\\Z^{\\geq}", parse: "NonNegativeInteger" },
6756
- { trigger: "\\Z^{\\geq0}", parse: "NonNegativeInteger" },
6757
- { trigger: "\\Z^{0+}", parse: "NonNegativeInteger" },
6758
- { trigger: "\\mathbb{N}", parse: "NonNegativeInteger" },
6759
- { trigger: "\\N_0", parse: "NonNegativeInteger" },
6760
- { trigger: "\\N_{0}", parse: "NonNegativeInteger" },
7016
+ { name: "NonNegativeInteger", latexTrigger: ["\\N"] },
7017
+ { latexTrigger: "\\Z^{+0}", parse: "NonNegativeInteger" },
7018
+ { latexTrigger: "\\Z^{\\geq}", parse: "NonNegativeInteger" },
7019
+ { latexTrigger: "\\Z^{\\geq0}", parse: "NonNegativeInteger" },
7020
+ { latexTrigger: "\\Z^{0+}", parse: "NonNegativeInteger" },
7021
+ { latexTrigger: "\\mathbb{N}", parse: "NonNegativeInteger" },
7022
+ { latexTrigger: "\\N_0", parse: "NonNegativeInteger" },
7023
+ { latexTrigger: "\\N_{0}", parse: "NonNegativeInteger" },
6761
7024
  //
6762
7025
  // Set Expressions
6763
7026
  //
6764
7027
  // @todo: could also have a `CartesianPower` function with a number `rhs`
6765
7028
  {
6766
7029
  name: "CartesianProduct",
6767
- trigger: ["\\times"],
7030
+ latexTrigger: ["\\times"],
6768
7031
  kind: "infix",
6769
7032
  associativity: "right",
6770
7033
  // Caution: cartesian product is not associative
@@ -6786,7 +7049,7 @@ var ComputeEngine = (() => {
6786
7049
  }
6787
7050
  },
6788
7051
  {
6789
- trigger: ["^", "\\complement"],
7052
+ latexTrigger: ["^", "\\complement"],
6790
7053
  kind: "postfix",
6791
7054
  parse: (_parser, lhs) => {
6792
7055
  return ["Complement", lhs];
@@ -6796,14 +7059,14 @@ var ComputeEngine = (() => {
6796
7059
  },
6797
7060
  {
6798
7061
  name: "Complement",
6799
- trigger: ["^", "<{>", "\\complement", "<}>"],
7062
+ latexTrigger: ["^", "<{>", "\\complement", "<}>"],
6800
7063
  kind: "postfix"
6801
7064
  // precedence: 240,
6802
7065
  // @todo: serialize for the multiple argument case
6803
7066
  },
6804
7067
  {
6805
7068
  name: "Intersection",
6806
- trigger: ["\\cap"],
7069
+ latexTrigger: ["\\cap"],
6807
7070
  kind: "infix",
6808
7071
  precedence: 350
6809
7072
  },
@@ -6819,7 +7082,7 @@ var ComputeEngine = (() => {
6819
7082
  },
6820
7083
  {
6821
7084
  name: "Union",
6822
- trigger: ["\\cup"],
7085
+ latexTrigger: ["\\cup"],
6823
7086
  kind: "infix",
6824
7087
  precedence: 350
6825
7088
  },
@@ -6838,13 +7101,13 @@ var ComputeEngine = (() => {
6838
7101
  // },
6839
7102
  {
6840
7103
  name: "SetMinus",
6841
- trigger: ["\\setminus"],
7104
+ latexTrigger: ["\\setminus"],
6842
7105
  kind: "infix",
6843
7106
  precedence: 650
6844
7107
  },
6845
7108
  {
6846
7109
  name: "SymmetricDifference",
6847
- trigger: ["\\triangle"],
7110
+ latexTrigger: ["\\triangle"],
6848
7111
  // or \\ominus
6849
7112
  kind: "infix",
6850
7113
  // @todo: parser could check that lhs and rhs are sets
@@ -6852,7 +7115,7 @@ var ComputeEngine = (() => {
6852
7115
  },
6853
7116
  // Predicates/Relations
6854
7117
  {
6855
- trigger: ["\\ni"],
7118
+ latexTrigger: ["\\ni"],
6856
7119
  kind: "infix",
6857
7120
  associativity: "right",
6858
7121
  precedence: 160,
@@ -6864,40 +7127,40 @@ var ComputeEngine = (() => {
6864
7127
  },
6865
7128
  {
6866
7129
  name: "Element",
6867
- trigger: ["\\in"],
7130
+ latexTrigger: ["\\in"],
6868
7131
  kind: "infix",
6869
7132
  precedence: 240
6870
7133
  },
6871
7134
  {
6872
7135
  name: "NotElement",
6873
- trigger: ["\\notin"],
7136
+ latexTrigger: ["\\notin"],
6874
7137
  kind: "infix",
6875
7138
  precedence: 240
6876
7139
  },
6877
7140
  {
6878
7141
  name: "NotSubset",
6879
- trigger: ["\\nsubset"],
7142
+ latexTrigger: ["\\nsubset"],
6880
7143
  kind: "infix",
6881
7144
  associativity: "right",
6882
7145
  precedence: 240
6883
7146
  },
6884
7147
  {
6885
7148
  name: "NotSuperset",
6886
- trigger: ["\\nsupset"],
7149
+ latexTrigger: ["\\nsupset"],
6887
7150
  kind: "infix",
6888
7151
  associativity: "right",
6889
7152
  precedence: 240
6890
7153
  },
6891
7154
  {
6892
7155
  name: "NotSubsetNotEqual",
6893
- trigger: ["\\nsubseteq"],
7156
+ latexTrigger: ["\\nsubseteq"],
6894
7157
  kind: "infix",
6895
7158
  associativity: "right",
6896
7159
  precedence: 240
6897
7160
  },
6898
7161
  {
6899
7162
  name: "NotSupersetNotEqual",
6900
- trigger: ["\\nsupseteq"],
7163
+ latexTrigger: ["\\nsupseteq"],
6901
7164
  kind: "infix",
6902
7165
  associativity: "right",
6903
7166
  precedence: 240
@@ -6905,7 +7168,7 @@ var ComputeEngine = (() => {
6905
7168
  {
6906
7169
  name: "SquareSubset",
6907
7170
  // MathML: square image of
6908
- trigger: ["\\sqsubset"],
7171
+ latexTrigger: ["\\sqsubset"],
6909
7172
  kind: "infix",
6910
7173
  associativity: "right",
6911
7174
  precedence: 265
@@ -6913,7 +7176,7 @@ var ComputeEngine = (() => {
6913
7176
  {
6914
7177
  name: "SquareSubsetEqual",
6915
7178
  // MathML: square image of or equal to
6916
- trigger: ["\\sqsubseteq"],
7179
+ latexTrigger: ["\\sqsubseteq"],
6917
7180
  kind: "infix",
6918
7181
  associativity: "right",
6919
7182
  precedence: 265
@@ -6921,7 +7184,7 @@ var ComputeEngine = (() => {
6921
7184
  {
6922
7185
  name: "SquareSuperset",
6923
7186
  // MathML: square original of
6924
- trigger: ["\\sqsupset"],
7187
+ latexTrigger: ["\\sqsupset"],
6925
7188
  kind: "infix",
6926
7189
  associativity: "right",
6927
7190
  precedence: 265
@@ -6929,27 +7192,27 @@ var ComputeEngine = (() => {
6929
7192
  {
6930
7193
  name: "SquareSupersetEqual",
6931
7194
  // MathML: square original of or equal
6932
- trigger: ["\\sqsupseteq"],
7195
+ latexTrigger: ["\\sqsupseteq"],
6933
7196
  kind: "infix",
6934
7197
  associativity: "right",
6935
7198
  precedence: 265
6936
7199
  },
6937
7200
  {
6938
7201
  name: "Subset",
6939
- trigger: ["\\subset"],
7202
+ latexTrigger: ["\\subset"],
6940
7203
  kind: "infix",
6941
7204
  associativity: "right",
6942
7205
  precedence: 240
6943
7206
  },
6944
7207
  {
6945
- trigger: ["\\subsetneq"],
7208
+ latexTrigger: ["\\subsetneq"],
6946
7209
  kind: "infix",
6947
7210
  associativity: "right",
6948
7211
  precedence: 240,
6949
7212
  parse: "Subset"
6950
7213
  },
6951
7214
  {
6952
- trigger: ["\\varsubsetneqq"],
7215
+ latexTrigger: ["\\varsubsetneqq"],
6953
7216
  kind: "infix",
6954
7217
  associativity: "right",
6955
7218
  precedence: 240,
@@ -6957,26 +7220,26 @@ var ComputeEngine = (() => {
6957
7220
  },
6958
7221
  {
6959
7222
  name: "SubsetEqual",
6960
- trigger: ["\\subseteq"],
7223
+ latexTrigger: ["\\subseteq"],
6961
7224
  kind: "infix",
6962
7225
  precedence: 240
6963
7226
  },
6964
7227
  {
6965
7228
  name: "Superset",
6966
- trigger: ["\\supset"],
7229
+ latexTrigger: ["\\supset"],
6967
7230
  kind: "infix",
6968
7231
  associativity: "right",
6969
7232
  precedence: 240
6970
7233
  },
6971
7234
  {
6972
- trigger: ["\\supsetneq"],
7235
+ latexTrigger: ["\\supsetneq"],
6973
7236
  kind: "infix",
6974
7237
  associativity: "right",
6975
7238
  precedence: 240,
6976
7239
  parse: "Superset"
6977
7240
  },
6978
7241
  {
6979
- trigger: ["\\varsupsetneq"],
7242
+ latexTrigger: ["\\varsupsetneq"],
6980
7243
  kind: "infix",
6981
7244
  associativity: "right",
6982
7245
  precedence: 240,
@@ -6984,7 +7247,7 @@ var ComputeEngine = (() => {
6984
7247
  },
6985
7248
  {
6986
7249
  name: "SupersetEqual",
6987
- trigger: ["\\supseteq"],
7250
+ latexTrigger: ["\\supseteq"],
6988
7251
  kind: "infix",
6989
7252
  associativity: "right",
6990
7253
  precedence: 240
@@ -7147,6 +7410,8 @@ var ComputeEngine = (() => {
7147
7410
  condition: () => {
7148
7411
  if (parser.matchAll(["\\mathrm", "<{>", "d", "<}>"]))
7149
7412
  found = true;
7413
+ else if (parser.matchAll(["\\operatorname", "<{>", "d", "<}>"]))
7414
+ found = true;
7150
7415
  return found;
7151
7416
  }
7152
7417
  });
@@ -7264,7 +7529,7 @@ var ComputeEngine = (() => {
7264
7529
  command,
7265
7530
  "\\!",
7266
7531
  serializer.serialize(fn),
7267
- "\\,\\mathrm{d}",
7532
+ "\\,\\operatorname{d}",
7268
7533
  serializer.serialize(index)
7269
7534
  ]);
7270
7535
  }
@@ -7282,7 +7547,7 @@ var ComputeEngine = (() => {
7282
7547
  sub2,
7283
7548
  "\\!",
7284
7549
  serializer.serialize(fn),
7285
- ...index && symbol(index) !== "Nothing" ? ["\\,\\mathrm{d}", serializer.serialize(index)] : []
7550
+ ...index && symbol(index) !== "Nothing" ? ["\\,\\operatorname{d}", serializer.serialize(index)] : []
7286
7551
  ]);
7287
7552
  };
7288
7553
  }
@@ -7290,35 +7555,35 @@ var ComputeEngine = (() => {
7290
7555
  {
7291
7556
  kind: "expression",
7292
7557
  name: "Integrate",
7293
- trigger: ["\\int"],
7558
+ latexTrigger: ["\\int"],
7294
7559
  parse: parseIntegral("Integrate"),
7295
7560
  serialize: serializeIntegral("\\int")
7296
7561
  },
7297
7562
  {
7298
7563
  kind: "expression",
7299
- trigger: ["\\iint"],
7564
+ latexTrigger: ["\\iint"],
7300
7565
  parse: parseIntegral("Integrate", 2)
7301
7566
  },
7302
7567
  {
7303
7568
  kind: "expression",
7304
- trigger: ["\\iiint"],
7569
+ latexTrigger: ["\\iiint"],
7305
7570
  parse: parseIntegral("Integrate", 3)
7306
7571
  },
7307
7572
  {
7308
7573
  kind: "expression",
7309
7574
  name: "CircularIntegrate",
7310
- trigger: ["\\oint"],
7575
+ latexTrigger: ["\\oint"],
7311
7576
  parse: parseIntegral("CircularIntegrate"),
7312
7577
  serialize: serializeIntegral("\\oint")
7313
7578
  },
7314
7579
  {
7315
7580
  kind: "expression",
7316
- trigger: ["\\oiint"],
7581
+ latexTrigger: ["\\oiint"],
7317
7582
  parse: parseIntegral("CircularIntegrate", 2)
7318
7583
  },
7319
7584
  {
7320
7585
  kind: "expression",
7321
- trigger: ["\\oiiint"],
7586
+ latexTrigger: ["\\oiiint"],
7322
7587
  parse: parseIntegral("CircularIntegrate", 3)
7323
7588
  }
7324
7589
  ];
@@ -7425,14 +7690,14 @@ var ComputeEngine = (() => {
7425
7690
  return {
7426
7691
  kind: "symbol",
7427
7692
  name: symbol2,
7428
- trigger: [latex],
7693
+ latexTrigger: [latex],
7429
7694
  parse: symbol2
7430
7695
  };
7431
7696
  }),
7432
7697
  ...SYMBOLS.map(([symbol2, _latex, codepoint]) => {
7433
7698
  return {
7434
7699
  kind: "symbol",
7435
- trigger: [String.fromCodePoint(codepoint)],
7700
+ latexTrigger: [String.fromCodePoint(codepoint)],
7436
7701
  parse: symbol2
7437
7702
  };
7438
7703
  })
@@ -7456,294 +7721,349 @@ var ComputeEngine = (() => {
7456
7721
  "\\rfloor": "\\rfloor"
7457
7722
  };
7458
7723
  function addEntry(result, entry, onError) {
7459
- const [trigger, indexedEntry] = makeIndexedEntry(entry, onError);
7724
+ const indexedEntry = makeIndexedEntry(entry, onError);
7460
7725
  if (indexedEntry === null)
7461
7726
  return;
7462
7727
  const kind = "kind" in entry ? entry.kind : "expression";
7463
- if (trigger && trigger.length === 2 && /[_^]/.test(trigger[0]) && trigger[1] !== "<{>" && kind !== "function" && entry.name) {
7728
+ const latexTrigger = indexedEntry.latexTrigger;
7729
+ if (typeof latexTrigger === "string")
7730
+ result.lookahead = Math.max(result.lookahead, countTokens(latexTrigger));
7731
+ const tokensTrigger = tokenize(latexTrigger ?? "", []);
7732
+ if (latexTrigger?.[1] === "\\prime")
7733
+ debugger;
7734
+ if (tokensTrigger.length === 2 && /[_^]/.test(tokensTrigger[0]) && tokensTrigger[1] !== "<{>" && kind !== "function" && kind !== "environment" && kind !== "matchfix") {
7464
7735
  let parse = entry.parse;
7465
- if (parse === void 0) {
7466
- if (kind === "symbol")
7467
- parse = entry.name;
7736
+ if (!parse && entry.name) {
7468
7737
  if (kind === "postfix" || kind === "prefix")
7469
7738
  parse = (_parser, expr) => [entry.name, expr];
7739
+ else
7740
+ parse = entry.name;
7470
7741
  }
7471
7742
  addEntry(
7472
7743
  result,
7473
7744
  {
7474
7745
  ...entry,
7475
7746
  kind,
7476
- parse,
7477
7747
  name: void 0,
7478
- trigger: [trigger[0], "<{>", trigger[1], "<}>"]
7748
+ serialize: void 0,
7749
+ parse,
7750
+ latexTrigger: [tokensTrigger[0], "<{>", tokensTrigger[1], "<}>"]
7479
7751
  },
7480
7752
  onError
7481
7753
  );
7482
7754
  }
7755
+ result.defs.push(indexedEntry);
7483
7756
  if (indexedEntry.name !== void 0) {
7484
- if (result.name.has(indexedEntry.name)) {
7757
+ if (result.ids.has(indexedEntry.name)) {
7485
7758
  onError({
7486
7759
  severity: "warning",
7487
7760
  message: [
7488
7761
  "invalid-dictionary-entry",
7489
7762
  indexedEntry.name,
7490
- "Duplicate definition. The name must be unique, but a trigger can be used by multiple definitions."
7491
- ]
7492
- });
7493
- }
7494
- result.name.set(indexedEntry.name, indexedEntry);
7495
- }
7496
- if (indexedEntry.kind === "matchfix") {
7497
- result.matchfix.push(indexedEntry);
7498
- } else if (indexedEntry.kind === "environment") {
7499
- const triggerString = tokensToString(entry.trigger ?? []);
7500
- if (result.environment.has(triggerString)) {
7501
- onError({
7502
- severity: "warning",
7503
- message: [
7504
- "invalid-dictionary-entry",
7505
- triggerString,
7506
- "Duplicate environment definition"
7763
+ "Duplicate definition. The name (MathJSON identifier) must be unique, but triggers can be shared by multiple definitions."
7507
7764
  ]
7508
7765
  });
7509
7766
  }
7510
- result.environment.set(triggerString, indexedEntry);
7511
- } else if (trigger) {
7512
- console.assert(entry.trigger);
7513
- if (indexedEntry.kind === "function") {
7514
- console.assert(typeof entry.trigger === "string");
7515
- const fnName = entry.trigger;
7516
- if (!result.function.has(fnName))
7517
- result.function.set(fnName, [indexedEntry]);
7518
- else
7519
- result.function.set(fnName, [
7520
- ...result.function.get(fnName),
7521
- indexedEntry
7522
- ]);
7523
- } else {
7524
- let triggerString;
7525
- let tokenCount;
7526
- if (typeof entry.trigger === "string") {
7527
- triggerString = entry.trigger;
7528
- tokenCount = countTokens(triggerString);
7529
- } else {
7530
- triggerString = tokensToString(entry.trigger ?? []);
7531
- tokenCount = entry.trigger.length;
7532
- }
7533
- result.lookahead = Math.max(result.lookahead, tokenCount);
7534
- const kind2 = indexedEntry.kind;
7535
- if (result[kind2][tokenCount] === void 0)
7536
- result[kind2][tokenCount] = /* @__PURE__ */ new Map();
7537
- const list = result[kind2][tokenCount];
7538
- if (list.has(triggerString))
7539
- list.get(triggerString).push(indexedEntry);
7540
- else
7541
- list.set(triggerString, [indexedEntry]);
7542
- }
7767
+ result.ids.set(indexedEntry.name, indexedEntry);
7543
7768
  }
7544
7769
  }
7545
7770
  function indexLatexDictionary(dic, onError) {
7546
7771
  const result = {
7547
7772
  lookahead: 1,
7548
- name: /* @__PURE__ */ new Map(),
7549
- expression: [],
7550
- symbol: [],
7551
- infix: [],
7552
- prefix: [],
7553
- postfix: [],
7554
- function: /* @__PURE__ */ new Map(),
7555
- environment: /* @__PURE__ */ new Map(),
7556
- matchfix: []
7773
+ ids: /* @__PURE__ */ new Map(),
7774
+ defs: []
7557
7775
  };
7558
7776
  for (const entry of dic)
7559
7777
  addEntry(result, entry, onError);
7560
7778
  return result;
7561
7779
  }
7562
7780
  function makeIndexedEntry(entry, onError) {
7563
- if (!entryIsValid(entry, onError))
7564
- return [null, null];
7781
+ if (!isValidEntry(entry, onError))
7782
+ return null;
7565
7783
  const result = {
7566
- name: entry.name,
7567
7784
  kind: "kind" in entry ? entry.kind : "expression"
7568
7785
  };
7786
+ let tokensTrigger = null;
7787
+ if ("latexTrigger" in entry) {
7788
+ if (typeof entry.latexTrigger === "string")
7789
+ tokensTrigger = tokenize(entry.latexTrigger, []);
7790
+ else
7791
+ tokensTrigger = entry.latexTrigger;
7792
+ }
7793
+ let idTrigger = null;
7794
+ if ("identifierTrigger" in entry) {
7795
+ idTrigger = entry.identifierTrigger;
7796
+ }
7797
+ if (tokensTrigger !== null)
7798
+ result.latexTrigger = tokensToString(tokensTrigger);
7799
+ if (idTrigger !== null)
7800
+ result.identifierTrigger = idTrigger;
7801
+ if (entry.name) {
7802
+ result.name = entry.name;
7803
+ result.serialize = makeSerializeHandler(entry, tokensTrigger, idTrigger);
7804
+ }
7569
7805
  if (result.kind === "matchfix" && isMatchfixEntry(entry)) {
7570
- result.openDelimiter = entry.openDelimiter;
7571
- result.closeDelimiter = entry.closeDelimiter;
7572
- if (typeof entry.serialize === "function")
7573
- result.serialize = entry.serialize;
7574
- else {
7575
- const openDelim = typeof result.openDelimiter === "string" ? DEFAULT_DELIMITER[result.openDelimiter] : tokensToString(result.openDelimiter);
7576
- const closeDelim = typeof result.closeDelimiter === "string" ? DEFAULT_DELIMITER[result.closeDelimiter] : tokensToString(result.closeDelimiter);
7577
- result.serialize = (serializer, expr) => joinLatex([openDelim, serializer.serialize(op(expr, 1)), closeDelim]);
7578
- }
7579
- if (typeof entry.parse === "function")
7580
- result.parse = entry.parse;
7581
- else {
7582
- console.assert(entry.parse || entry.name);
7583
- const head2 = entry.parse ?? entry.name;
7584
- result.parse = (_parser, expr) => [head2, expr];
7585
- }
7586
- return [null, result];
7587
- }
7588
- if (result.kind === "environment" && isEnvironmentEntry(entry)) {
7589
- const envName = entry.trigger;
7590
- result.serialize = entry.serialize ?? ((serializer, expr) => `\\begin{${envName}}${serializer.serialize(
7591
- op(expr, 1)
7592
- )}\\end{${envName}}`);
7593
- result.parse = entry.parse ?? (() => null);
7594
- return [envName, result];
7595
- }
7596
- const trigger = typeof entry.trigger === "string" ? tokenize(entry.trigger, []) : entry.trigger;
7597
- const triggerString = trigger ? tokensToString(trigger) : "";
7598
- if (result.kind === "function" && isFunctionEntry(entry)) {
7599
- result.serialize = entry.serialize;
7600
- if (triggerString && !entry.serialize) {
7601
- if (triggerString.startsWith("\\")) {
7602
- result.serialize = (serializer, expr) => `${triggerString}${serializer.wrapArguments(expr)}`;
7603
- } else
7604
- result.serialize = (serializer, expr) => `\\mathrm{${triggerString}}${serializer.wrapArguments(expr)}`;
7605
- }
7606
- if (typeof entry.parse === "function")
7607
- result.parse = entry.parse;
7608
- else if (typeof entry.parse === "string")
7609
- result.parse = () => entry.parse;
7610
- else if (entry.name)
7611
- result.parse = () => entry.name;
7612
- return [triggerString, result];
7613
- }
7614
- if (result.kind === "expression" && isExpressionEntry(entry)) {
7615
- result.serialize = entry.serialize ?? triggerString;
7616
- if (typeof result.serialize === "string") {
7617
- const serializeStr = result.serialize;
7618
- result.serialize = (serializer, expr) => {
7619
- if (!head(expr))
7620
- return serializeStr;
7621
- return `${serializeStr}${serializer.wrapArguments(expr)}`;
7622
- };
7623
- }
7624
- {
7625
- if (typeof entry.parse === "function") {
7626
- result.parse = entry.parse;
7627
- } else {
7628
- const parseResult = entry.parse ?? entry.name;
7629
- result.parse = () => parseResult;
7630
- }
7631
- }
7632
- return [triggerString, result];
7806
+ result.openDelimiter = entry.openTrigger;
7807
+ result.closeDelimiter = entry.closeTrigger;
7633
7808
  }
7634
- console.assert(
7635
- typeof entry.trigger !== "string" || entry.parse || trigger.length > 1 || "kind" in entry && entry.kind === "function",
7636
- `Trigger shortcuts should produce more than one token. Otherwise, not worth using them. (${triggerString})`
7637
- );
7638
7809
  if (result.kind === "symbol" && isSymbolEntry(entry)) {
7639
7810
  result.precedence = entry.precedence ?? 1e4;
7640
7811
  }
7641
- if ((result.kind === "infix" || result.kind === "prefix" || result.kind === "postfix") && (isInfixEntry(entry) || isPrefixEntry(entry) || isPostfixEntry(entry))) {
7642
- if (trigger && (trigger[0] === "^" || trigger[0] === "_")) {
7812
+ if ((result.kind === "prefix" || result.kind === "postfix") && (isPrefixEntry(entry) || isPostfixEntry(entry))) {
7813
+ if (tokensTrigger && (tokensTrigger[0] === "^" || tokensTrigger[0] === "_")) {
7643
7814
  result.precedence = 720;
7644
7815
  console.assert(
7645
7816
  entry.precedence === void 0,
7646
- "'precedence' not allowed with ^ and _ triggers"
7817
+ "'precedence' is fixed and cannot be modified with ^ and _ triggers"
7647
7818
  );
7648
7819
  } else
7649
7820
  result.precedence = entry.precedence ?? 1e4;
7650
7821
  }
7651
7822
  if (result.kind === "infix" && isInfixEntry(entry)) {
7652
7823
  console.assert(
7653
- !trigger || trigger[0] !== "^" && trigger[0] !== "_" || !entry.associativity || entry.associativity === "non"
7824
+ !tokensTrigger || tokensTrigger[0] !== "^" && tokensTrigger[0] !== "_" || !entry.associativity || entry.associativity === "non"
7654
7825
  );
7655
7826
  result.associativity = entry.associativity ?? "non";
7656
- if (typeof entry.parse === "function") {
7657
- result.parse = entry.parse;
7658
- } else if (trigger && (trigger[0] === "^" || trigger[0] === "_")) {
7659
- console.assert(!entry.parse);
7660
- const name = entry.parse ?? entry.name;
7661
- result.parse = (_scanner, arg, _terminator) => [
7662
- name,
7827
+ result.precedence = entry.precedence ?? 1e4;
7828
+ }
7829
+ const parse = makeParseHandler(entry, tokensTrigger, idTrigger);
7830
+ if (parse)
7831
+ result.parse = parse;
7832
+ return result;
7833
+ }
7834
+ function makeSerializeHandler(entry, latexTrigger, idTrigger) {
7835
+ if (typeof entry.serialize === "function")
7836
+ return entry.serialize;
7837
+ const kind = entry["kind"] ?? "expression";
7838
+ if (kind === "environment") {
7839
+ const envName = entry["identifierTrigger"] ?? entry.name ?? "unknown";
7840
+ return (serializer, expr) => joinLatex([
7841
+ `\\begin{${envName}}`,
7842
+ serializer.serialize(op(expr, 1)),
7843
+ `\\end{${envName}}`
7844
+ ]);
7845
+ }
7846
+ if (isMatchfixEntry(entry)) {
7847
+ const openDelim = typeof entry.openTrigger === "string" ? DEFAULT_DELIMITER[entry.openTrigger] : tokensToString(entry["openDelimiter"]);
7848
+ const closeDelim = typeof entry.closeTrigger === "string" ? DEFAULT_DELIMITER[entry.closeTrigger] : tokensToString(entry["closeDelimiter"]);
7849
+ return (serializer, expr) => joinLatex([openDelim, serializer.serialize(op(expr, 1)), closeDelim]);
7850
+ }
7851
+ let latex = entry.serialize;
7852
+ if (latex === void 0 && latexTrigger)
7853
+ latex = tokensToString(latexTrigger);
7854
+ if (latex) {
7855
+ if (kind === "postfix")
7856
+ return (serializer, expr) => joinLatex([serializer.serialize(op(expr, 1)), latex]);
7857
+ if (kind === "prefix")
7858
+ return (serializer, expr) => joinLatex([latex, serializer.serialize(op(expr, 1))]);
7859
+ if (kind === "infix") {
7860
+ return (serializer, expr) => joinLatex(
7861
+ (ops(expr) ?? []).flatMap(
7862
+ (val, i) => i < nops(expr) - 1 ? [serializer.serialize(val), latex] : [serializer.serialize(val)]
7863
+ )
7864
+ );
7865
+ }
7866
+ return (serializer, expr) => head(expr) ? joinLatex([latex, serializer.wrapArguments(expr)]) : latex;
7867
+ }
7868
+ const id = idTrigger ?? entry.name ?? "unknown";
7869
+ if (kind === "postfix")
7870
+ return (serializer, expr) => joinLatex([
7871
+ serializer.serialize(op(expr, 1)),
7872
+ serializer.serializeSymbol(id)
7873
+ ]);
7874
+ if (kind === "prefix")
7875
+ return (serializer, expr) => joinLatex([
7876
+ serializer.serializeSymbol(id),
7877
+ serializer.serialize(op(expr, 1))
7878
+ ]);
7879
+ if (kind === "infix")
7880
+ return (serializer, expr) => joinLatex([
7881
+ serializer.serialize(op(expr, 1)),
7882
+ serializer.serializeSymbol(id),
7883
+ serializer.serialize(op(expr, 2))
7884
+ ]);
7885
+ return (serializer, expr) => head(expr) ? joinLatex([
7886
+ serializer.serializeSymbol(id),
7887
+ serializer.wrapArguments(expr)
7888
+ ]) : serializer.serializeSymbol(id);
7889
+ }
7890
+ function makeParseHandler(entry, latexTrigger, idTrigger) {
7891
+ if ("parse" in entry && typeof entry.parse === "function")
7892
+ return entry.parse;
7893
+ const kind = "kind" in entry ? entry.kind : "expression";
7894
+ if (kind === "environment") {
7895
+ const envName = entry.parse ?? idTrigger ?? entry.name;
7896
+ if (envName)
7897
+ return (parser, _until) => {
7898
+ const array = parser.parseTabular();
7899
+ if (array === null)
7900
+ return null;
7901
+ return [envName, ["List", array.map((row) => ["List", ...row])]];
7902
+ };
7903
+ }
7904
+ if (kind === "function") {
7905
+ const fnName = entry.parse ?? idTrigger ?? entry.name;
7906
+ if (fnName)
7907
+ return (parser, until) => {
7908
+ const args = parser.parseArguments("enclosure", until);
7909
+ return args === null ? fnName : [fnName, ...args];
7910
+ };
7911
+ }
7912
+ if (kind === "symbol") {
7913
+ const symName = entry.parse ?? idTrigger ?? entry.name;
7914
+ if (symName)
7915
+ return (_parser, _terminator) => symName;
7916
+ }
7917
+ if (kind === "prefix") {
7918
+ const h = entry.parse ?? idTrigger ?? entry.name;
7919
+ if (h) {
7920
+ const prec = entry["precedence"] ?? 1e4;
7921
+ return (parser, until) => {
7922
+ const rhs = parser.parseExpression({
7923
+ ...until ?? [],
7924
+ minPrec: prec
7925
+ });
7926
+ return rhs === null ? null : [h, rhs];
7927
+ };
7928
+ }
7929
+ }
7930
+ if (kind === "postfix") {
7931
+ const h = entry.parse ?? entry.name;
7932
+ if (h)
7933
+ return (_parser, lhs) => lhs === null ? null : [h, lhs];
7934
+ }
7935
+ if (kind === "infix") {
7936
+ if (/[_^]/.test(latexTrigger?.[0] ?? "")) {
7937
+ const h2 = entry.name ?? entry.parse;
7938
+ return (_parser, arg) => [
7939
+ h2,
7663
7940
  missingIfEmpty(op(arg, 1)),
7664
7941
  missingIfEmpty(op(arg, 2))
7665
7942
  ];
7666
- } else {
7667
- const head2 = entry.parse ?? entry.name;
7668
- const prec = result.precedence;
7669
- const associativity = result.associativity;
7670
- result.parse = (scanner, lhs, terminator) => {
7671
- if (prec < terminator.minPrec)
7943
+ }
7944
+ const h = entry.parse ?? idTrigger ?? entry.name;
7945
+ const prec = entry["precedence"] ?? 1e4;
7946
+ const associativity = entry["associativity"] ?? "non";
7947
+ if (h)
7948
+ return (parser, lhs, until) => {
7949
+ if (lhs === null)
7950
+ return null;
7951
+ if (prec < until.minPrec)
7672
7952
  return null;
7673
7953
  const rhs = missingIfEmpty(
7674
- scanner.parseExpression({
7675
- ...terminator,
7676
- minPrec: prec
7677
- })
7954
+ parser.parseExpression({ ...until, minPrec: prec })
7678
7955
  );
7679
- return typeof head2 === "string" ? applyAssociativeOperator(head2, lhs, rhs, associativity) : [head2, lhs, rhs];
7956
+ return typeof h === "string" ? applyAssociativeOperator(h, lhs, rhs, associativity) : [h, lhs, rhs];
7957
+ };
7958
+ }
7959
+ if (kind === "matchfix") {
7960
+ const h = entry.parse ?? entry.name;
7961
+ if (h)
7962
+ return (_parser, body) => {
7963
+ if (body === null || isEmptySequence(body))
7964
+ return null;
7965
+ return [h, body];
7680
7966
  };
7681
- }
7682
- } else {
7683
- if (typeof entry.parse === "function") {
7684
- result.parse = entry.parse;
7685
- } else if (entry.parse !== void 0) {
7686
- console.assert(result.kind === "symbol" || result.kind === "expression");
7687
- result.parse = () => entry.parse;
7688
- } else if (entry.parse === void 0 && entry.name !== void 0) {
7689
- if (result.kind === "postfix") {
7690
- result.parse = (_parser, lhs) => lhs ? [entry.name, lhs] : null;
7691
- } else if (result.kind === "prefix") {
7692
- const prec = result.precedence;
7693
- console.assert(entry.name);
7694
- const head2 = entry.name;
7695
- result.parse = (parser, terminator) => {
7696
- if (terminator && prec < terminator.minPrec)
7697
- return null;
7698
- const rhs = parser.parseExpression({ ...terminator, minPrec: prec });
7699
- return rhs === null ? null : [head2, rhs];
7700
- };
7701
- }
7702
- }
7703
- }
7704
- if (typeof entry.serialize === "function" || typeof entry.serialize === "string") {
7705
- result.serialize = entry.serialize;
7706
- } else if (trigger) {
7707
- if (result.kind === "postfix") {
7708
- result.serialize = "#1" + triggerString;
7709
- } else if (result.kind === "prefix") {
7710
- result.serialize = triggerString + "#1";
7711
- } else if (result.kind === "infix") {
7712
- result.serialize = "#1" + triggerString + "#2";
7713
- } else if (result.kind === "symbol") {
7714
- result.serialize = triggerString;
7715
- } else {
7716
- result.serialize = "";
7717
- }
7718
7967
  }
7719
- return [trigger ?? null, result];
7968
+ if (kind === "expression") {
7969
+ const parseResult = entry.parse ?? idTrigger ?? entry.name;
7970
+ if (parseResult)
7971
+ return () => parseResult;
7972
+ }
7973
+ if ("parse" in entry) {
7974
+ const parseResult = entry.parse;
7975
+ return () => parseResult;
7976
+ }
7977
+ return void 0;
7720
7978
  }
7721
- function entryIsValid(entry, onError) {
7722
- const subject = entry.name ?? entry.trigger ?? entry["openDelimiter"];
7979
+ function isValidEntry(entry, onError) {
7980
+ let subject = entry.name ?? entry["latexTrigger"] ?? entry["identifierTrigger"] ?? entry["openDelimiter"];
7981
+ if (!subject) {
7982
+ try {
7983
+ subject = JSON.stringify(entry);
7984
+ } catch (e) {
7985
+ subject = "???";
7986
+ }
7987
+ }
7988
+ if (Array.isArray(subject))
7989
+ subject = tokensToString(subject);
7990
+ if ("kind" in entry && ![
7991
+ "expression",
7992
+ "symbol",
7993
+ "function",
7994
+ "infix",
7995
+ "postfix",
7996
+ "prefix",
7997
+ "matchfix",
7998
+ "environment"
7999
+ ].includes(entry.kind)) {
8000
+ onError({
8001
+ severity: "warning",
8002
+ message: [
8003
+ "invalid-dictionary-entry",
8004
+ subject,
8005
+ `The 'kind' property must be one of 'expression', 'symbol', 'function', 'infix', 'postfix', 'prefix', 'matchfix', 'environment'`
8006
+ ]
8007
+ });
8008
+ }
7723
8009
  if (entry.serialize !== void 0 && !entry.name) {
7724
8010
  onError({
7725
8011
  severity: "warning",
7726
8012
  message: [
7727
8013
  "invalid-dictionary-entry",
7728
8014
  subject,
7729
- `Unexpected serialize property without a name property`
8015
+ `A 'name' property must be provided if a 'serialize' handler is provided`
7730
8016
  ]
7731
8017
  });
7732
8018
  return false;
7733
8019
  }
8020
+ if ("identifierTrigger" in entry) {
8021
+ if (typeof entry.identifierTrigger !== "string" || !isValidIdentifier(entry.identifierTrigger)) {
8022
+ onError({
8023
+ severity: "warning",
8024
+ message: [
8025
+ "invalid-dictionary-entry",
8026
+ subject,
8027
+ `The 'identifierTrigger' property must be a valid identifier`
8028
+ ]
8029
+ });
8030
+ }
8031
+ }
8032
+ if ("name" in entry) {
8033
+ if (typeof entry.name !== "string") {
8034
+ if (entry.name !== void 0)
8035
+ onError({
8036
+ severity: "warning",
8037
+ message: [
8038
+ "invalid-dictionary-entry",
8039
+ subject,
8040
+ `The 'name' property must be a string`
8041
+ ]
8042
+ });
8043
+ } else if (!isValidIdentifier(entry.name)) {
8044
+ onError({
8045
+ severity: "warning",
8046
+ message: [
8047
+ "invalid-dictionary-entry",
8048
+ entry.name,
8049
+ `The 'name' property must be a valid identifier`
8050
+ ]
8051
+ });
8052
+ }
8053
+ }
7734
8054
  if (isMatchfixEntry(entry)) {
7735
- if (entry.trigger) {
8055
+ if ("latexTrigger" in entry || "identifierTrigger" in isPrefixEntry) {
7736
8056
  onError({
7737
8057
  severity: "warning",
7738
8058
  message: [
7739
8059
  "invalid-dictionary-entry",
7740
8060
  subject,
7741
- `Unexpected 'trigger' "${entry.trigger}". 'matchfix' operators use a 'openDelimiter' and 'closeDelimiter' instead of a trigger. `
8061
+ `'matchfix' operators use a 'openDelimiter' and 'closeDelimiter' instead of a 'latexTrigger' or 'identifierTrigger'. `
7742
8062
  ]
7743
8063
  });
7744
8064
  return false;
7745
8065
  }
7746
- if (!entry.openDelimiter || !entry.closeDelimiter) {
8066
+ if (!entry.openTrigger || !entry.closeTrigger) {
7747
8067
  onError({
7748
8068
  severity: "warning",
7749
8069
  message: [
@@ -7754,7 +8074,7 @@ var ComputeEngine = (() => {
7754
8074
  });
7755
8075
  return false;
7756
8076
  }
7757
- if (typeof entry.openDelimiter !== typeof entry.closeDelimiter) {
8077
+ if (typeof entry.openTrigger !== typeof entry.closeTrigger) {
7758
8078
  onError({
7759
8079
  severity: "warning",
7760
8080
  message: [
@@ -7767,7 +8087,7 @@ var ComputeEngine = (() => {
7767
8087
  }
7768
8088
  }
7769
8089
  if (isInfixEntry(entry) || isPostfixEntry(entry) || isPrefixEntry(entry)) {
7770
- if (Array.isArray(entry.trigger) && (entry.trigger[0] === "_" || entry.trigger[0] === "^") || typeof entry.trigger === "string" && (entry.trigger.startsWith("^") || entry.trigger.startsWith("_"))) {
8090
+ if (Array.isArray(entry.latexTrigger) && (entry.latexTrigger[0] === "_" || entry.latexTrigger[0] === "^") || typeof entry.latexTrigger === "string" && (entry.latexTrigger.startsWith("^") || entry.latexTrigger.startsWith("_"))) {
7771
8091
  if (entry.precedence !== void 0 || entry["associativity"] !== void 0) {
7772
8092
  onError({
7773
8093
  severity: "warning",
@@ -7803,14 +8123,14 @@ var ComputeEngine = (() => {
7803
8123
  return false;
7804
8124
  }
7805
8125
  }
7806
- if (!isMatchfixEntry(entry)) {
7807
- if (!entry.trigger && !entry.name) {
8126
+ if (!isMatchfixEntry(entry) && !isEnvironmentEntry(entry)) {
8127
+ if (!entry.latexTrigger && !entry.identifierTrigger && !entry.name) {
7808
8128
  onError({
7809
8129
  severity: "warning",
7810
8130
  message: [
7811
8131
  "invalid-dictionary-entry",
7812
8132
  subject,
7813
- `Expected at least a 'trigger' or a 'name'`
8133
+ `Expected a 'name', a 'latexTrigger' or a 'identifierTrigger'`
7814
8134
  ]
7815
8135
  });
7816
8136
  return false;
@@ -7841,7 +8161,7 @@ var ComputeEngine = (() => {
7841
8161
  {
7842
8162
  name: "mu0",
7843
8163
  kind: "symbol",
7844
- trigger: "\\mu_0"
8164
+ latexTrigger: "\\mu_0"
7845
8165
  }
7846
8166
  ],
7847
8167
  sets: DEFINITIONS_SETS,
@@ -7851,7 +8171,24 @@ var ComputeEngine = (() => {
7851
8171
 
7852
8172
  // src/compute-engine/latex-syntax/parse-identifier.ts
7853
8173
  var IDENTIFIER_PREFIX = {
7854
- "\\operatorname": "_operator",
8174
+ // Those are "grouping" prefix that also specify spacing
8175
+ // around the symbol. We ignore the spacing, though.
8176
+ "\\mathord": "",
8177
+ "\\mathop": "",
8178
+ "\\mathbin": "",
8179
+ "\\mathrel": "",
8180
+ "\\mathopen": "",
8181
+ "\\mathclose": "",
8182
+ "\\mathpunct": "",
8183
+ "\\mathinner": "",
8184
+ // This is the preferred way to specify an identifier
8185
+ // it defines both spacing and font. By default, identifiers
8186
+ // are wrapper with `\\operatorname{}`.
8187
+ "\\operatorname": "",
8188
+ // These styling commands are used to change the font of an identifier
8189
+ // They may be problematic, as adjacent identifiers may be merged
8190
+ // into a single identifier when used in editors, such a MathLive.
8191
+ // For example `\mathrm{speed}\mathrm{sound}` can be confused with `\mathrm{speedsound}`
7855
8192
  "\\mathrm": "_upright",
7856
8193
  "\\mathit": "_italic",
7857
8194
  "\\mathbf": "_bold",
@@ -7878,7 +8215,7 @@ var ComputeEngine = (() => {
7878
8215
  "\\breve": "_breve",
7879
8216
  "\\check": "_check"
7880
8217
  };
7881
- function matchIdentifierToken(parser, options) {
8218
+ function parseIdentifierToken(parser, options) {
7882
8219
  if (parser.atEnd)
7883
8220
  return null;
7884
8221
  const token = parser.peek;
@@ -7916,7 +8253,7 @@ var ComputeEngine = (() => {
7916
8253
  }
7917
8254
  return parser.matchChar() ?? parser.nextToken();
7918
8255
  }
7919
- function matchIdentifierBody(parser) {
8256
+ function parseIdentifierBody(parser) {
7920
8257
  let id = matchPrefixedIdentifier(parser);
7921
8258
  const start = parser.index;
7922
8259
  const prefix = IDENTIFIER_MODIFIER[parser.peek] ?? null;
@@ -7926,7 +8263,7 @@ var ComputeEngine = (() => {
7926
8263
  parser.index = start;
7927
8264
  return null;
7928
8265
  }
7929
- const body = matchIdentifierBody(parser);
8266
+ const body = parseIdentifierBody(parser);
7930
8267
  if (body === null || !parser.match("<}>")) {
7931
8268
  parser.index = start;
7932
8269
  return null;
@@ -7939,7 +8276,7 @@ var ComputeEngine = (() => {
7939
8276
  const token = parser.peek;
7940
8277
  if (token === "<}>" || token === "_" || token === "^")
7941
8278
  break;
7942
- const next = matchIdentifierToken(parser, { toplevel: false });
8279
+ const next = parseIdentifierToken(parser, { toplevel: false });
7943
8280
  if (next === null) {
7944
8281
  parser.index = start;
7945
8282
  return null;
@@ -7968,7 +8305,7 @@ var ComputeEngine = (() => {
7968
8305
  while (!parser.atEnd) {
7969
8306
  if (parser.match("_")) {
7970
8307
  const hasBrace = parser.match("<{>");
7971
- const sub2 = matchIdentifierBody(parser);
8308
+ const sub2 = parseIdentifierBody(parser);
7972
8309
  if (hasBrace && !parser.match("<}>") || sub2 === null) {
7973
8310
  parser.index = start;
7974
8311
  return null;
@@ -7976,7 +8313,7 @@ var ComputeEngine = (() => {
7976
8313
  subs2.push(sub2);
7977
8314
  } else if (parser.match("^")) {
7978
8315
  const hasBrace = parser.match("<{>");
7979
- const sup = matchIdentifierBody(parser);
8316
+ const sup = parseIdentifierBody(parser);
7980
8317
  if (hasBrace && !parser.match("<}>") || sup === null) {
7981
8318
  parser.index = start;
7982
8319
  return null;
@@ -8015,7 +8352,7 @@ var ComputeEngine = (() => {
8015
8352
  body = digit;
8016
8353
  parser.nextToken();
8017
8354
  }
8018
- body += matchIdentifierBody(parser);
8355
+ body += parseIdentifierBody(parser);
8019
8356
  if (body === null || !parser.match("<}>")) {
8020
8357
  parser.index = start;
8021
8358
  return null;
@@ -8039,7 +8376,7 @@ var ComputeEngine = (() => {
8039
8376
  start
8040
8377
  );
8041
8378
  }
8042
- function matchIdentifier(parser) {
8379
+ function parseIdentifier(parser) {
8043
8380
  if (/^[a-zA-Z]$/.test(parser.peek) || /^\p{XIDS}$/u.test(parser.peek))
8044
8381
  return parser.nextToken();
8045
8382
  const start = parser.index;
@@ -8048,19 +8385,14 @@ var ComputeEngine = (() => {
8048
8385
  id = "";
8049
8386
  while (!parser.atEnd && ONLY_EMOJIS.test(id + parser.peek))
8050
8387
  id += parser.nextToken();
8388
+ if (!id)
8389
+ id = null;
8051
8390
  }
8391
+ id ?? (id = parseIdentifierToken(parser, { toplevel: true }));
8052
8392
  if (id) {
8053
8393
  id = id.normalize();
8054
8394
  if (isValidIdentifier(id))
8055
- return id;
8056
- parser.index = start;
8057
- return null;
8058
- }
8059
- let next = matchIdentifierToken(parser, { toplevel: true });
8060
- if (next) {
8061
- next = next.normalize();
8062
- if (isValidIdentifier(next))
8063
- return next;
8395
+ return id;
8064
8396
  }
8065
8397
  parser.index = start;
8066
8398
  return null;
@@ -8129,7 +8461,7 @@ var ComputeEngine = (() => {
8129
8461
  // with machine numbers, up to 15 assuming 2^53 bits floating points
8130
8462
  positiveInfinity: "\\infty",
8131
8463
  negativeInfinity: "-\\infty",
8132
- notANumber: "\\mathrm{NaN}",
8464
+ notANumber: "\\operatorname{NaN}",
8133
8465
  decimalMarker: ".",
8134
8466
  // Use `{,}` for comma as a decimal marker
8135
8467
  groupSeparator: "\\,",
@@ -8269,13 +8601,12 @@ var ComputeEngine = (() => {
8269
8601
  * Note: the `minPrec` condition is not checked. It should be checked separately.
8270
8602
  */
8271
8603
  atTerminator(t) {
8272
- if (this.atBoundary)
8273
- return true;
8274
- if (t?.condition && t.condition(this))
8275
- return true;
8276
- return false;
8604
+ return this.atBoundary || ((t?.condition && t.condition(this)) ?? false);
8277
8605
  }
8278
- /** True if the current token matches any of the boundaries we are waiting for */
8606
+ /**
8607
+ * True if the current token matches any of the boundaries we are
8608
+ * waiting for.
8609
+ */
8279
8610
  get atBoundary() {
8280
8611
  if (this.atEnd)
8281
8612
  return true;
@@ -8337,42 +8668,32 @@ var ComputeEngine = (() => {
8337
8668
  this._dictionary.lookahead,
8338
8669
  this._tokens.length - this.index
8339
8670
  );
8340
- if (n < 0)
8671
+ if (n <= 0)
8341
8672
  return [];
8342
- const result = Array(n + 1);
8673
+ const result = [];
8343
8674
  while (n > 0)
8344
- result[n] = this.latexAhead(n--);
8675
+ result.push([n, this.latexAhead(n--)]);
8345
8676
  return result;
8346
8677
  }
8347
8678
  peekDefinitions(kind) {
8348
- let defs;
8349
- if (kind === "function") {
8350
- const start = this.index;
8351
- if (this.match("\\operatorname") || this.match("\\mathrm") || this.match("\\mathit")) {
8352
- const fn = this.parseStringGroup()?.trim();
8353
- const n = this.index - start;
8354
- this.index = start;
8355
- if (!fn || !this._dictionary.function.has(fn))
8356
- return null;
8357
- return this._dictionary.function.get(fn).map((x) => [x, n]);
8358
- }
8359
- return null;
8360
- } else if (kind === "operator") {
8361
- defs = this.lookAhead().map(
8362
- (x, n) => this._dictionary.infix[n]?.get(x) ?? this._dictionary.postfix[n]?.get(x) ?? this._dictionary.prefix[n]?.get(x)
8363
- );
8364
- } else {
8365
- defs = this.lookAhead().map((x, n) => this._dictionary[kind][n]?.get(x));
8366
- }
8367
8679
  const result = [];
8368
- for (let i = defs.length - 1; i > 0; i--) {
8369
- if (defs[i] !== void 0) {
8370
- console.assert(Array.isArray(defs[i]));
8371
- for (const def of defs[i])
8372
- result.push([def, i]);
8680
+ const defs = [...this.getDefs(kind)];
8681
+ for (const def of defs)
8682
+ if (def.latexTrigger === "")
8683
+ result.push([def, 0]);
8684
+ for (const [n, tokens] of this.lookAhead()) {
8685
+ for (const def of defs)
8686
+ if (def.latexTrigger === tokens)
8687
+ result.push([def, n]);
8688
+ }
8689
+ for (const def of defs) {
8690
+ if (def.identifierTrigger) {
8691
+ const n = peekComplexId(this, def.identifierTrigger);
8692
+ if (n > 0)
8693
+ result.push([def, n]);
8373
8694
  }
8374
8695
  }
8375
- return result.length === 0 ? null : result;
8696
+ return result;
8376
8697
  }
8377
8698
  /** Skip strictly `<space>` tokens.
8378
8699
  * To also skip `{}` see `skipSpace()`.
@@ -8486,9 +8807,8 @@ var ComputeEngine = (() => {
8486
8807
  digits += digit;
8487
8808
  n += 1;
8488
8809
  }
8489
- if (digits.length === caretCount) {
8810
+ if (digits.length === caretCount)
8490
8811
  return String.fromCodePoint(Number.parseInt(digits, 16));
8491
- }
8492
8812
  } else if (this.match("\\char")) {
8493
8813
  let codepoint = Math.floor(this.matchLatexNumber() ?? Number.NaN);
8494
8814
  if (!Number.isFinite(codepoint) || codepoint < 0 || codepoint > 1114111) {
@@ -8497,17 +8817,15 @@ var ComputeEngine = (() => {
8497
8817
  return String.fromCodePoint(codepoint);
8498
8818
  } else if (this.match("\\unicode")) {
8499
8819
  this.skipSpaceTokens();
8500
- if (this.peek === "<{>") {
8501
- this.nextToken();
8820
+ if (this.match("<{>")) {
8502
8821
  const codepoint = this.matchLatexNumber();
8503
8822
  if (this.match("<}>") && codepoint !== null && codepoint >= 0 && codepoint <= 1114111) {
8504
8823
  return String.fromCodePoint(codepoint);
8505
8824
  }
8506
8825
  } else {
8507
8826
  const codepoint = this.matchLatexNumber();
8508
- if (codepoint !== null && codepoint >= 0 && codepoint <= 1114111) {
8827
+ if (codepoint !== null && codepoint >= 0 && codepoint <= 1114111)
8509
8828
  return String.fromCodePoint(codepoint);
8510
- }
8511
8829
  }
8512
8830
  }
8513
8831
  this.index = index;
@@ -8534,7 +8852,7 @@ var ComputeEngine = (() => {
8534
8852
  // Some LaTeX commands (but not all) can accept an argument without braces,
8535
8853
  // for example `^` , `\sqrt` or `\frac`.
8536
8854
  // This argument will usually be a single token, but can be a sequence of
8537
- // tokens (e.g. `\sqrt\frac12` or `\sqrt\mathrm{speed}`).
8855
+ // tokens (e.g. `\sqrt\frac12` or `\sqrt\operatorname{speed}`).
8538
8856
  parseToken() {
8539
8857
  const excluding = [
8540
8858
  ...'!"#$%&(),/;:?@[]\\`|~'.split(""),
@@ -8593,6 +8911,7 @@ var ComputeEngine = (() => {
8593
8911
  let peek = this.peek;
8594
8912
  while (peek !== "&" && peek !== "\\\\" && peek !== "\\cr" && !this.atBoundary) {
8595
8913
  expr = this.parseExpression({
8914
+ minPrec: 0,
8596
8915
  condition: (p) => {
8597
8916
  const peek2 = p.peek;
8598
8917
  return peek2 === "&" || peek2 === "\\\\" || peek2 === "\\cr";
@@ -8636,7 +8955,7 @@ var ComputeEngine = (() => {
8636
8955
  }
8637
8956
  /** Parse an environment: `\begin{env}...\end{end}`
8638
8957
  */
8639
- parseEnvironment() {
8958
+ parseEnvironment(until) {
8640
8959
  const index = this.index;
8641
8960
  if (!this.match("\\begin"))
8642
8961
  return null;
@@ -8644,22 +8963,22 @@ var ComputeEngine = (() => {
8644
8963
  if (!name)
8645
8964
  return this.error("expected-environment-name", index);
8646
8965
  this.addBoundary(["\\end", "<{>", ...name.split(""), "<}>"]);
8647
- const def = this._dictionary.environment.get(name);
8648
- if (!def) {
8649
- this.parseTabular();
8650
- this.skipSpace();
8651
- if (!this.matchBoundary())
8652
- return this.boundaryError("unbalanced-environment");
8653
- return this.error(["unknown-environment", { str: name }], index);
8654
- }
8655
- const expr = def.parse(this, [], []);
8966
+ for (const def of this.getDefs("environment"))
8967
+ if (def.identifierTrigger === name) {
8968
+ const expr = def.parse(this, until);
8969
+ this.skipSpace();
8970
+ if (!this.matchBoundary())
8971
+ return this.boundaryError("unbalanced-environment");
8972
+ if (expr !== null)
8973
+ return this.decorate(expr, index);
8974
+ this.index = index;
8975
+ return null;
8976
+ }
8977
+ this.parseTabular();
8656
8978
  this.skipSpace();
8657
8979
  if (!this.matchBoundary())
8658
8980
  return this.boundaryError("unbalanced-environment");
8659
- if (expr !== null)
8660
- return this.decorate(expr, index);
8661
- this.index = index;
8662
- return null;
8981
+ return this.error(["unknown-environment", { str: name }], index);
8663
8982
  }
8664
8983
  /** If the next token matches a `+` or `-` sign, return it and advance the index.
8665
8984
  * Otherwise return `''` and do not advance */
@@ -8903,11 +9222,8 @@ var ComputeEngine = (() => {
8903
9222
  until = { minPrec: 0 };
8904
9223
  if (!until.minPrec)
8905
9224
  until = { ...until, minPrec: 0 };
8906
- const defs = this.peekDefinitions("prefix");
8907
- if (defs === null)
8908
- return null;
8909
9225
  const start = this.index;
8910
- for (const [def, n] of defs) {
9226
+ for (const [def, n] of this.peekDefinitions("prefix")) {
8911
9227
  this.index = start + n;
8912
9228
  const rhs = def.parse(this, until);
8913
9229
  if (rhs)
@@ -8918,13 +9234,11 @@ var ComputeEngine = (() => {
8918
9234
  }
8919
9235
  parseInfixOperator(lhs, until) {
8920
9236
  until ?? (until = { minPrec: 0 });
9237
+ console.assert(until.minPrec !== void 0);
8921
9238
  if (until.minPrec === void 0)
8922
9239
  until = { ...until, minPrec: 0 };
8923
- const defs = this.peekDefinitions("infix");
8924
- if (defs === null)
8925
- return null;
8926
9240
  const start = this.index;
8927
- for (const [def, n] of defs) {
9241
+ for (const [def, n] of this.peekDefinitions("infix")) {
8928
9242
  if (def.precedence >= until.minPrec) {
8929
9243
  this.index = start + n;
8930
9244
  const rhs = def.parse(this, lhs, until);
@@ -8966,44 +9280,6 @@ var ComputeEngine = (() => {
8966
9280
  this.index = savedIndex;
8967
9281
  return null;
8968
9282
  }
8969
- /** A prime suffix is a sequence of `'`, `\prime` or `\doubleprime`
8970
- * after a function or in a superscript.
8971
- */
8972
- // matchPrimeSuffix(): number {
8973
- // this.skipSpace();
8974
- // const start = this.index;
8975
- // let count = 0;
8976
- // if (this.match('^')) {
8977
- // if (this.match('<{>')) {
8978
- // if (this.match('(')) {
8979
- // const n = this.parseNumber();
8980
- // if (n && this.match(')')) return parseInt(n);
8981
- // this.index = start;
8982
- // return 0;
8983
- // }
8984
- // do {
8985
- // const c = countPrimeLevel(this);
8986
- // if (c === 0) break;
8987
- // count += c;
8988
- // } while (true);
8989
- // if (count !== 0 && this.match('<}>')) return count;
8990
- // this.index = start;
8991
- // return 0;
8992
- // }
8993
- // count = countPrimeLevel(this);
8994
- // if (count !== 0) return count;
8995
- // this.index = start;
8996
- // return 0;
8997
- // }
8998
- // do {
8999
- // const c = countPrimeLevel(this);
9000
- // if (c === 0) break;
9001
- // count += c;
9002
- // } while (true);
9003
- // if (count !== 0) return count;
9004
- // this.index = start;
9005
- // return 0;
9006
- // }
9007
9283
  /** If matches the normalized open delimiter, return the
9008
9284
  * expected closing delimiter.
9009
9285
  *
@@ -9059,9 +9335,7 @@ var ComputeEngine = (() => {
9059
9335
  * @internal
9060
9336
  */
9061
9337
  matchEnclosureOpen() {
9062
- const defs = this._dictionary.matchfix;
9063
- if (defs.length === 0)
9064
- return null;
9338
+ const defs = this.getDefs("matchfix");
9065
9339
  const start = this.index;
9066
9340
  for (const def of defs) {
9067
9341
  this.index = start;
@@ -9084,9 +9358,7 @@ var ComputeEngine = (() => {
9084
9358
  * Used for error handling
9085
9359
  * @internal */
9086
9360
  matchEnclosureClose() {
9087
- const defs = this._dictionary.matchfix;
9088
- if (defs.length === 0)
9089
- return null;
9361
+ const defs = this.getDefs("matchfix");
9090
9362
  const start = this.index;
9091
9363
  for (const def of defs) {
9092
9364
  this.index = start;
@@ -9125,9 +9397,7 @@ var ComputeEngine = (() => {
9125
9397
  * and finally a closing matching operator.
9126
9398
  */
9127
9399
  parseEnclosure() {
9128
- const defs = this._dictionary.matchfix;
9129
- if (defs.length === 0)
9130
- return null;
9400
+ const defs = this.getDefs("matchfix");
9131
9401
  const start = this.index;
9132
9402
  for (const def of defs) {
9133
9403
  this.index = start;
@@ -9214,8 +9484,7 @@ var ComputeEngine = (() => {
9214
9484
  return null;
9215
9485
  const start = this.index;
9216
9486
  let fn = null;
9217
- const fnDefs = this.peekDefinitions("function") ?? [];
9218
- for (const [def, tokenCount] of fnDefs) {
9487
+ for (const [def, tokenCount] of this.peekDefinitions("function")) {
9219
9488
  this.index = start + tokenCount;
9220
9489
  if (typeof def.parse === "function") {
9221
9490
  fn = def.parse(this, until);
@@ -9228,7 +9497,7 @@ var ComputeEngine = (() => {
9228
9497
  }
9229
9498
  if (fn === null) {
9230
9499
  this.index = start;
9231
- fn = matchIdentifier(this);
9500
+ fn = parseIdentifier(this);
9232
9501
  if (!this.isFunctionHead(fn)) {
9233
9502
  this.index = start;
9234
9503
  return null;
@@ -9247,20 +9516,17 @@ var ComputeEngine = (() => {
9247
9516
  if (this.atTerminator(until))
9248
9517
  return null;
9249
9518
  const start = this.index;
9250
- const defs = this.peekDefinitions("symbol");
9251
- if (defs) {
9252
- for (const [def, tokenCount] of defs) {
9253
- this.index = start + tokenCount;
9254
- if (typeof def.parse === "function") {
9255
- const result = def.parse(this, until);
9256
- if (result)
9257
- return result;
9258
- } else
9259
- return def.name;
9260
- }
9519
+ for (const [def, tokenCount] of this.peekDefinitions("symbol")) {
9520
+ this.index = start + tokenCount;
9521
+ if (typeof def.parse === "function") {
9522
+ const result = def.parse(this, until);
9523
+ if (result)
9524
+ return result;
9525
+ } else
9526
+ return def.name;
9261
9527
  }
9262
9528
  this.index = start;
9263
- const id = matchIdentifier(this);
9529
+ const id = parseIdentifier(this);
9264
9530
  if (id === null)
9265
9531
  return null;
9266
9532
  if (this.options.parseUnknownIdentifier?.(id, this) === "symbol")
@@ -9317,7 +9583,9 @@ var ComputeEngine = (() => {
9317
9583
  }
9318
9584
  let result = lhs;
9319
9585
  if (subscripts.length > 0) {
9320
- const defs = this._dictionary.infix[1]?.get("_");
9586
+ const defs = [...this.getDefs("infix")].filter(
9587
+ (x) => x.latexTrigger === "_"
9588
+ );
9321
9589
  if (defs) {
9322
9590
  const arg = [
9323
9591
  "Subscript",
@@ -9335,7 +9603,9 @@ var ComputeEngine = (() => {
9335
9603
  }
9336
9604
  }
9337
9605
  if (superscripts.length > 0) {
9338
- const defs = this._dictionary.infix[1]?.get("^");
9606
+ const defs = [...this.getDefs("infix")].filter(
9607
+ (x) => x.latexTrigger === "^"
9608
+ );
9339
9609
  if (defs) {
9340
9610
  const arg = [
9341
9611
  "Superscript",
@@ -9360,11 +9630,8 @@ var ComputeEngine = (() => {
9360
9630
  console.assert(lhs !== null);
9361
9631
  if (lhs === null)
9362
9632
  return null;
9363
- const defs = this.peekDefinitions("postfix");
9364
- if (defs === null)
9365
- return null;
9366
9633
  const start = this.index;
9367
- for (const [def, n] of defs) {
9634
+ for (const [def, n] of this.peekDefinitions("postfix")) {
9368
9635
  this.index = start + n;
9369
9636
  const result = def.parse(this, lhs, until);
9370
9637
  if (result !== null)
@@ -9428,14 +9695,14 @@ var ComputeEngine = (() => {
9428
9695
  applyInvisibleOperator(until, lhs) {
9429
9696
  if (lhs === null || this.options.applyInvisibleOperator === null || head(lhs) === "Error" || symbol(lhs) === "Nothing" || isEmptySequence(lhs) || this.atTerminator(until))
9430
9697
  return null;
9698
+ if (this.peekDefinitions("operator").length > 0)
9699
+ return null;
9431
9700
  if (this.isFunctionHead(lhs)) {
9432
- const args = this.parseArguments("enclosure", until);
9701
+ const args = this.parseArguments("enclosure", { ...until, minPrec: 0 });
9433
9702
  if (args === null)
9434
9703
  return null;
9435
9704
  return [lhs, ...args];
9436
9705
  }
9437
- if (this.peekDefinitions("operator") !== null)
9438
- return null;
9439
9706
  const start = this.index;
9440
9707
  const rhs = this.parseExpression({ ...until, minPrec: 390 });
9441
9708
  if (rhs === null || symbol(rhs) === "Nothing" || isEmptySequence(rhs)) {
@@ -9482,9 +9749,9 @@ var ComputeEngine = (() => {
9482
9749
  parseUnexpectedLatexCommand() {
9483
9750
  const start = this.index;
9484
9751
  let opDefs = this.peekDefinitions("operator");
9485
- if (opDefs) {
9752
+ if (opDefs.length > 0) {
9486
9753
  opDefs = this.peekDefinitions("postfix");
9487
- if (opDefs) {
9754
+ if (opDefs.length > 0) {
9488
9755
  const [def, n] = opDefs[0];
9489
9756
  this.index += n;
9490
9757
  if (typeof def.parse === "function") {
@@ -9497,7 +9764,7 @@ var ComputeEngine = (() => {
9497
9764
  return this.error("unexpected-operator", start);
9498
9765
  }
9499
9766
  opDefs = this.peekDefinitions("prefix");
9500
- if (opDefs) {
9767
+ if (opDefs.length > 0) {
9501
9768
  const [def, n] = opDefs[0];
9502
9769
  this.index += n;
9503
9770
  if (typeof def.parse === "function") {
@@ -9508,12 +9775,13 @@ var ComputeEngine = (() => {
9508
9775
  if (def.name)
9509
9776
  return [
9510
9777
  def.name,
9778
+ // @todo: pass a precedence?
9511
9779
  this.parseExpression() ?? this.error("missing", start)
9512
9780
  ];
9513
9781
  return this.error("unexpected-operator", start);
9514
9782
  }
9515
9783
  opDefs = this.peekDefinitions("infix");
9516
- if (opDefs) {
9784
+ if (opDefs.length > 0) {
9517
9785
  const [def, n] = opDefs[0];
9518
9786
  this.index += n;
9519
9787
  if (typeof def.parse === "function") {
@@ -9607,7 +9875,10 @@ var ComputeEngine = (() => {
9607
9875
  if (this.match("<}>"))
9608
9876
  return this.error("unexpected-closing-delimiter", start);
9609
9877
  if (this.match("<{>")) {
9610
- result = this.parseExpression({ condition: (p) => p.peek === "<}>" });
9878
+ result = this.parseExpression({
9879
+ minPrec: 0,
9880
+ condition: (p) => p.peek === "<}>"
9881
+ });
9611
9882
  if (result === null)
9612
9883
  return this.error("expected-expression", start);
9613
9884
  if (!this.match("<}>")) {
@@ -9623,7 +9894,7 @@ var ComputeEngine = (() => {
9623
9894
  result = { num };
9624
9895
  }
9625
9896
  result ?? (result = this.parseEnclosure());
9626
- result ?? (result = this.parseEnvironment());
9897
+ result ?? (result = this.parseEnvironment(until));
9627
9898
  if (result === null && this.matchAll(this._positiveInfinityTokens))
9628
9899
  result = { num: "+Infinity" };
9629
9900
  if (result === null && this.matchAll(this._negativeInfinityTokens))
@@ -9668,8 +9939,9 @@ var ComputeEngine = (() => {
9668
9939
  return null;
9669
9940
  }
9670
9941
  until ?? (until = { minPrec: 0 });
9942
+ console.assert(until.minPrec !== void 0);
9671
9943
  if (until.minPrec === void 0)
9672
- until.minPrec = 0;
9944
+ until = { ...until, minPrec: 0 };
9673
9945
  let lhs = this.parsePrefixOperator({ ...until, minPrec: 0 });
9674
9946
  if (lhs === null) {
9675
9947
  lhs = this.parsePrimary(until);
@@ -9738,7 +10010,28 @@ var ComputeEngine = (() => {
9738
10010
  return true;
9739
10011
  return false;
9740
10012
  }
10013
+ /** Return all defs of the specified kind */
10014
+ *getDefs(kind) {
10015
+ if (kind === "operator") {
10016
+ for (const def of this._dictionary.defs)
10017
+ if (/^prefix|infix|postfix/.test(def.kind))
10018
+ yield def;
10019
+ } else {
10020
+ for (const def of this._dictionary.defs)
10021
+ if (def.kind === kind)
10022
+ yield def;
10023
+ }
10024
+ }
9741
10025
  };
10026
+ function peekComplexId(parser, id) {
10027
+ const start = parser.index;
10028
+ const candidate = parseIdentifier(parser)?.trim();
10029
+ if (candidate === null)
10030
+ return 0;
10031
+ const result = candidate !== id ? 0 : parser.index - start;
10032
+ parser.index = start;
10033
+ return result;
10034
+ }
9742
10035
 
9743
10036
  // src/compute-engine/latex-syntax/serialize-number.ts
9744
10037
  function formatFractionalPart(m, options) {
@@ -9978,68 +10271,11 @@ var ComputeEngine = (() => {
9978
10271
  // Unicode uses 'double-struck' for 'blackboard'
9979
10272
  // Supplemental
9980
10273
  blackboard: (s) => `\\mathbb{${s}}`,
9981
- // boldItalic: (s) => `\\mathbf{\\mathit{${s}}}`,
9982
10274
  calligraphic: (s) => `\\mathcal{${s}}`,
9983
- // scriptBold: (s) => `\\mathbf{\\mathscr{${s}}}`,
9984
- // calligraphicBold: (s) => `\\mathbf{\\mathcal{${s}}}`,
9985
10275
  gothic: (s) => `\\mathfrak{${s}}`,
9986
- // gothicBold: (s) => `\\mathbf{\\mathfrak{${s}}}`,
9987
- // frakturBold: (s) => `\\mathbf{\\mathfrak{${s}}}`,
9988
- sansSerif: (s) => `\\mathsf{${s}}`,
9989
- // sansSerifBold: (s) => `\\mathbf{\\mathsf{${s}}}`,
9990
- // sansSerifItalic: (s) => `\\mathit{\\mathsf{${s}}}`,
10276
+ sansserif: (s) => `\\mathsf{${s}}`,
9991
10277
  monospace: (s) => `\\mathtt{${s}}`
9992
10278
  };
9993
- function serializeOperator(serializer, expr, def) {
9994
- let result = "";
9995
- const count = nops(expr);
9996
- const name = headName(expr);
9997
- if (def.kind === "postfix") {
9998
- if (count !== 1) {
9999
- serializer.onError([
10000
- {
10001
- severity: "warning",
10002
- message: [
10003
- "postfix-operator-requires-one-operand",
10004
- serializer.serializeSymbol(name)
10005
- ]
10006
- }
10007
- ]);
10008
- }
10009
- return replaceLatex(def.serialize, [
10010
- serializer.wrap(op(expr, 1), def.precedence)
10011
- ]);
10012
- }
10013
- if (def.kind === "prefix") {
10014
- if (count !== 1) {
10015
- serializer.onError([
10016
- {
10017
- severity: "warning",
10018
- message: [
10019
- "prefix-operator-requires-one-operand",
10020
- serializer.serializeSymbol(name)
10021
- ]
10022
- }
10023
- ]);
10024
- }
10025
- return replaceLatex(def.serialize, [
10026
- serializer.wrap(op(expr, 1), def.precedence + 1)
10027
- ]);
10028
- }
10029
- if (def.kind === "infix") {
10030
- result = serializer.wrap(op(expr, 1), def.precedence);
10031
- for (let i = 2; i < count + 1; i++) {
10032
- const arg = op(expr, i);
10033
- if (arg !== null) {
10034
- result = replaceLatex(def.serialize, [
10035
- result,
10036
- serializer.wrap(arg, def.precedence)
10037
- ]);
10038
- }
10039
- }
10040
- }
10041
- return result;
10042
- }
10043
10279
  var Serializer = class {
10044
10280
  constructor(options, dictionary2, onError) {
10045
10281
  this.level = -1;
@@ -10081,7 +10317,7 @@ var ComputeEngine = (() => {
10081
10317
  }
10082
10318
  const name = head(expr);
10083
10319
  if (typeof name === "string" && name !== "Delimiter" && name !== "Subscript") {
10084
- const def = this.dictionary.name.get(name);
10320
+ const def = this.dictionary.ids.get(name);
10085
10321
  if (def && (def.kind === "symbol" || def.kind === "prefix" || def.kind === "infix" || def.kind === "postfix") && def.precedence < prec)
10086
10322
  return this.wrapString(
10087
10323
  this.serialize(expr),
@@ -10138,42 +10374,37 @@ var ComputeEngine = (() => {
10138
10374
  );
10139
10375
  }
10140
10376
  serializeSymbol(expr, def) {
10141
- const h = head(expr);
10142
- if (h)
10143
- return this.serializeFunction(expr, def);
10144
10377
  console.assert(typeof expr === "string" || isSymbolObject(expr));
10145
- if (typeof def?.serialize === "string")
10146
- return def.serialize;
10147
- else if (typeof def?.serialize === "function")
10148
- return def.serialize(this, expr);
10149
- return serializeIdentifier(symbol(expr)) ?? "";
10378
+ if (def?.kind === "function") {
10379
+ return serializeIdentifier(symbol(expr) ?? "") ?? "";
10380
+ }
10381
+ return def?.serialize?.(this, expr) ?? serializeIdentifier(symbol(expr)) ?? "";
10150
10382
  }
10151
10383
  serializeFunction(expr, def) {
10384
+ if (def?.serialize)
10385
+ return def.serialize(this, expr);
10152
10386
  const h = head(expr);
10153
- if (!h)
10154
- return this.serializeSymbol(expr, def);
10387
+ if (typeof h === "string")
10388
+ return serializeIdentifier(h, "auto") + this.wrapArguments(expr);
10155
10389
  const args = ops(expr) ?? [];
10156
- if (def) {
10157
- if (typeof def.serialize === "function")
10158
- return def.serialize(this, expr);
10390
+ if (args.length === 1) {
10159
10391
  return joinLatex([
10160
- def.serialize ?? h,
10161
- this.wrapArguments(expr)
10392
+ this.serialize(args[0]),
10393
+ "\\rhd",
10394
+ this.wrapString(
10395
+ this.serialize(h),
10396
+ this.options.applyFunctionStyle(expr, this.level)
10397
+ )
10162
10398
  ]);
10163
10399
  }
10164
- if (typeof h === "string" && h.length > 0 && h[0] === "\\") {
10165
- return joinLatex([h, ...args.map((x) => `{${this.serialize(x)}}`)]);
10166
- }
10167
- if (typeof h === "string") {
10168
- if (h.length === 1)
10169
- return serializeIdentifier(h) + this.wrapArguments(expr);
10170
- return serializeIdentifier(h, "upright") + this.wrapArguments(expr);
10171
- }
10172
10400
  const style = this.options.applyFunctionStyle(expr, this.level);
10173
- return "\\mathrm{Apply}" + this.wrapString(
10174
- this.serialize(h) + ", " + this.serialize(["List", ...args]),
10175
- style
10176
- );
10401
+ return joinLatex([
10402
+ "\\operatorname{apply}",
10403
+ this.wrapString(
10404
+ this.serialize(h) + ", " + this.serialize(["List", ...args]),
10405
+ style
10406
+ )
10407
+ ]);
10177
10408
  }
10178
10409
  serializeDictionary(dict) {
10179
10410
  return `\\left\\lbrack\\begin{array}{lll}${Object.keys(dict).map((x) => {
@@ -10192,37 +10423,22 @@ var ComputeEngine = (() => {
10192
10423
  const s = stringValue(expr);
10193
10424
  if (s !== null)
10194
10425
  return `\\text{${s}}`;
10195
- const symbolName = symbol(expr);
10196
- if (symbolName !== null) {
10197
- const def = this.dictionary.name.get(symbolName);
10198
- if (def?.kind === "symbol")
10199
- return this.serializeSymbol(expr, def);
10200
- if (def?.kind === "function")
10201
- return this.serializeFunction(expr, def);
10202
- if (typeof def?.serialize === "function")
10203
- return def.serialize(this, expr);
10204
- }
10205
10426
  const dict = dictionary(expr);
10206
10427
  if (dict !== null)
10207
10428
  return this.serializeDictionary(dict);
10429
+ const symbolName = symbol(expr);
10430
+ if (symbolName !== null) {
10431
+ return this.serializeSymbol(
10432
+ expr,
10433
+ this.dictionary.ids.get(symbolName)
10434
+ );
10435
+ }
10208
10436
  const fnName = headName(expr);
10209
10437
  if (fnName) {
10210
- const def = this.dictionary.name.get(fnName);
10211
- if (def) {
10212
- if (typeof def.serialize === "function")
10213
- return def.serialize(this, expr);
10214
- if (def.kind === "infix" || def.kind === "postfix" || def.kind === "prefix")
10215
- return serializeOperator(this, expr, def);
10216
- if (def.kind === "symbol")
10217
- return this.serializeSymbol(expr, def);
10218
- if (def.kind === "function")
10219
- return this.serializeFunction(expr, def);
10220
- return "";
10221
- }
10222
- }
10223
- if (symbolName !== null || Array.isArray(expr) || isFunctionObject(expr)) {
10224
- return this.serializeSymbol(expr);
10438
+ return this.serializeFunction(expr, this.dictionary.ids.get(fnName));
10225
10439
  }
10440
+ if (head(expr) !== null)
10441
+ return this.serializeFunction(expr);
10226
10442
  this.onError([
10227
10443
  {
10228
10444
  severity: "warning",
@@ -10262,22 +10478,6 @@ var ComputeEngine = (() => {
10262
10478
  return this.options.numericSetStyle(expr, level);
10263
10479
  }
10264
10480
  };
10265
- function replaceLatex(template, replacement) {
10266
- console.assert(typeof template === "string");
10267
- console.assert(template.length > 0);
10268
- let result = template;
10269
- for (let i = 0; i < replacement.length; i++) {
10270
- let s = replacement[i] ?? "";
10271
- if (/[a-zA-Z*]/.test(s[0])) {
10272
- const m = result.match(new RegExp("(.*)#" + Number(i + 1).toString()));
10273
- if (m && /\\[a-zA-Z*]+/.test(m[1])) {
10274
- s = " " + s;
10275
- }
10276
- }
10277
- result = result.replace("#" + Number(i + 1).toString(), s);
10278
- }
10279
- return result;
10280
- }
10281
10481
  function specialName(s) {
10282
10482
  const prefix = s.match(/^([^_]+)/)?.[1] ?? "";
10283
10483
  let i = SYMBOLS.findIndex((x) => prefix === x[0]);
@@ -10353,7 +10553,7 @@ var ComputeEngine = (() => {
10353
10553
  }
10354
10554
  return [body, accent, styles, rest];
10355
10555
  }
10356
- function parseIdentifierBody(s, topLevel = true, style = "auto") {
10556
+ function parseIdentifierBody2(s, topLevel = true, style = "auto") {
10357
10557
  let [body, accents, styles, rest] = parseModifiers(s);
10358
10558
  for (const accent of accents) {
10359
10559
  if (ACCENT_MODIFIERS[accent])
@@ -10369,7 +10569,7 @@ var ComputeEngine = (() => {
10369
10569
  }
10370
10570
  while (rest.length > 0) {
10371
10571
  if (rest.startsWith("__")) {
10372
- const [sup, rest2] = parseIdentifierBody(
10572
+ const [sup, rest2] = parseIdentifierBody2(
10373
10573
  rest.substring(2),
10374
10574
  false,
10375
10575
  "none"
@@ -10377,7 +10577,7 @@ var ComputeEngine = (() => {
10377
10577
  sups.push(sup);
10378
10578
  rest = rest2;
10379
10579
  } else if (rest.startsWith("_")) {
10380
- const [sub2, rest2] = parseIdentifierBody(
10580
+ const [sub2, rest2] = parseIdentifierBody2(
10381
10581
  rest.substring(1),
10382
10582
  false,
10383
10583
  "none"
@@ -10416,19 +10616,19 @@ var ComputeEngine = (() => {
10416
10616
  }
10417
10617
  return [body, rest];
10418
10618
  }
10419
- function serializeIdentifier(s, defaultMulticharStyle = "auto") {
10619
+ function serializeIdentifier(s, style = "auto") {
10420
10620
  if (s === null)
10421
10621
  return null;
10422
10622
  if (ONLY_EMOJIS.test(s))
10423
10623
  return s;
10424
10624
  const m = s.match(/^(_+)(.*)/);
10425
10625
  if (m) {
10426
- const [body2, rest2] = parseIdentifierBody(m[2], true, "none");
10427
- return `\\mathrm{${"\\_".repeat(m[1].length) + body2 + rest2}}`;
10626
+ const [body2, rest2] = parseIdentifierBody2(m[2], true, "none");
10627
+ return `\\operatorname{${"\\_".repeat(m[1].length) + body2 + rest2}}`;
10428
10628
  }
10429
- const [body, rest] = parseIdentifierBody(s, true, defaultMulticharStyle);
10629
+ const [body, rest] = parseIdentifierBody2(s, true, style);
10430
10630
  if (rest.length > 0)
10431
- return `\\mathrm{${s}}`;
10631
+ return `\\operatorname{${s}}`;
10432
10632
  return body;
10433
10633
  }
10434
10634
 
@@ -10518,7 +10718,7 @@ var ComputeEngine = (() => {
10518
10718
  let expr = parser.parseExpression();
10519
10719
  if (!parser.atEnd) {
10520
10720
  const opDefs = parser.peekDefinitions("infix");
10521
- if (opDefs) {
10721
+ if (opDefs.length > 0) {
10522
10722
  const start = parser.index;
10523
10723
  const [def, n] = opDefs[0];
10524
10724
  parser.index += n;
@@ -10539,20 +10739,23 @@ var ComputeEngine = (() => {
10539
10739
  parser.index = start;
10540
10740
  }
10541
10741
  const index = parser.index;
10542
- const id = matchIdentifier(parser);
10742
+ const id = parseIdentifier(parser);
10543
10743
  if (id) {
10544
10744
  const idError = parser.error(["unexpected-identifier", id], index);
10545
10745
  return expr ? ["Sequence", expr, idError] : idError;
10546
10746
  }
10747
+ let openDelimiter = parser.peek;
10547
10748
  const closeDelimiter = parser.matchEnclosureOpen();
10548
10749
  if (closeDelimiter) {
10750
+ parser.parseExpression();
10751
+ parser.match(closeDelimiter);
10549
10752
  const enclosureError = parser.error(
10550
- ["expected-close-delimiter", { str: closeDelimiter }],
10753
+ ["unexpected-open-delimiter", { str: openDelimiter }],
10551
10754
  index
10552
10755
  );
10553
10756
  return expr ? ["Sequence", expr, enclosureError] : enclosureError;
10554
10757
  }
10555
- const openDelimiter = parser.matchEnclosureClose();
10758
+ openDelimiter = parser.matchEnclosureClose();
10556
10759
  if (openDelimiter) {
10557
10760
  const enclosureError = parser.error(
10558
10761
  ["expected-open-delimiter", { str: openDelimiter }],
@@ -11700,6 +11903,9 @@ var ComputeEngine = (() => {
11700
11903
  [a, b] = [b, a % b];
11701
11904
  return a < 0 ? -a : a;
11702
11905
  }
11906
+ function lcm(a, b) {
11907
+ return a * b / gcd(a, b);
11908
+ }
11703
11909
  function factorial(n) {
11704
11910
  if (!Number.isInteger(n) || n < 0)
11705
11911
  return NaN;
@@ -13182,11 +13388,79 @@ var ComputeEngine = (() => {
13182
13388
  // src/compute-engine/boxed-expression/abstract-boxed-expression.ts
13183
13389
  var import_complex6 = __toESM(require_complex());
13184
13390
 
13391
+ // src/compute-engine/library/utils.ts
13392
+ function isSymbolDefinition(def) {
13393
+ return !!def && typeof def === "object" && ("domain" in def || "value" in def || "constant" in def);
13394
+ }
13395
+ function isFunctionDefinition(def) {
13396
+ if (def === void 0 || def === null)
13397
+ return false;
13398
+ if (typeof def !== "object")
13399
+ return false;
13400
+ if ("complexity" in def || "numeric" in def || "signature" in def)
13401
+ return true;
13402
+ if (!("domain" in def))
13403
+ return false;
13404
+ if (def.domain === void 0)
13405
+ return false;
13406
+ if (typeof def.domain === "string")
13407
+ return def.domain === "Function";
13408
+ return def.domain.isFunction;
13409
+ }
13410
+ function normalizeLimits(range) {
13411
+ let lower = 1;
13412
+ let upper = lower + MAX_ITERATION;
13413
+ let index = "Nothing";
13414
+ let isFinite2 = true;
13415
+ if (range.head === "Tuple" || range.head === "Triple" || range.head === "Pair" || range.head === "Single") {
13416
+ index = (range.op1.head === "Hold" ? range.op1.op1.symbol : range.op1.symbol) ?? "Nothing";
13417
+ lower = asSmallInteger(range.op2) ?? 1;
13418
+ if (!Number.isFinite(lower))
13419
+ isFinite2 = false;
13420
+ if (range.op3.isNothing || range.op3.isInfinity) {
13421
+ isFinite2 = false;
13422
+ } else {
13423
+ const u = asSmallInteger(range.op3);
13424
+ if (u === null)
13425
+ isFinite2 = false;
13426
+ else {
13427
+ upper = u;
13428
+ if (!Number.isFinite(upper))
13429
+ isFinite2 = false;
13430
+ }
13431
+ }
13432
+ if (!isFinite2 && Number.isFinite(lower))
13433
+ upper = lower + MAX_ITERATION;
13434
+ }
13435
+ return [index, lower, upper, isFinite2];
13436
+ }
13437
+
13185
13438
  // src/compute-engine/compile.ts
13439
+ var ComputeEngineFunction = class extends Function {
13440
+ constructor(body) {
13441
+ super("_SYS", "_", `return ${body}`);
13442
+ this.sys = {
13443
+ factorial,
13444
+ gamma,
13445
+ lngamma,
13446
+ gcd,
13447
+ lcm,
13448
+ chop
13449
+ };
13450
+ return new Proxy(this, {
13451
+ apply: (target, thisArg, argumentsList) => super.apply(thisArg, [this.sys, ...argumentsList]),
13452
+ get: (target, prop) => {
13453
+ if (prop === "toString")
13454
+ return () => body;
13455
+ return target[prop];
13456
+ }
13457
+ });
13458
+ }
13459
+ };
13186
13460
  function compileToJavascript(expr) {
13187
13461
  const js = compile(expr, expr.freeVars);
13188
13462
  try {
13189
- return new Function("_", `return ${js}`);
13463
+ return new ComputeEngineFunction(js);
13190
13464
  } catch (e) {
13191
13465
  console.error(`${e}
13192
13466
  ${expr.latex}
@@ -13207,7 +13481,12 @@ ${js}`);
13207
13481
  ExponentialE: "Math.E",
13208
13482
  I: "Math.I",
13209
13483
  NaN: "Number.NaN",
13210
- ImaginaryUnit: "NaN"
13484
+ ImaginaryUnit: "NaN",
13485
+ Half: "0.5",
13486
+ MachineEpsilon: "Number.EPSILON",
13487
+ GoldenRatio: "((1 + Math.sqrt(5)) / 2)",
13488
+ CatalanConstant: "0.91596559417721901",
13489
+ EulerGamma: "0.57721566490153286"
13211
13490
  }[s];
13212
13491
  if (result !== void 0)
13213
13492
  return result;
@@ -13236,9 +13515,8 @@ ${js}`);
13236
13515
  return "";
13237
13516
  return `-${compile(arg, freeVars, 3)}`;
13238
13517
  }
13239
- if (h === "Error") {
13240
- return "NaN";
13241
- }
13518
+ if (h === "Error")
13519
+ throw new Error("Error");
13242
13520
  if (h === "Sum")
13243
13521
  return compileLoop(expr, "+");
13244
13522
  if (h === "Product")
@@ -13246,7 +13524,7 @@ ${js}`);
13246
13524
  if (h === "Root") {
13247
13525
  const arg = expr.op1;
13248
13526
  if (arg === null)
13249
- return "";
13527
+ throw new Error("Root: no argument");
13250
13528
  const exp2 = expr.op2;
13251
13529
  if (exp2 === null)
13252
13530
  return `Math.sqrt(${compile(arg, freeVars, 0)})`;
@@ -13255,24 +13533,63 @@ ${js}`);
13255
13533
  if (h === "Factorial") {
13256
13534
  const arg = expr.op1;
13257
13535
  if (arg === null)
13258
- return "";
13259
- return `${compile(arg, freeVars, 3)}!`;
13536
+ throw new Error("Factorial: no argument");
13537
+ return `_SYS.factorial(${compile(arg, freeVars)})`;
13538
+ }
13539
+ if (h === "Power") {
13540
+ const arg = expr.op1;
13541
+ if (arg === null)
13542
+ throw new Error("Power: no argument");
13543
+ const exp2 = asFloat(expr.op2);
13544
+ if (exp2 === 0.5)
13545
+ return `Math.sqrt(${compile(arg, freeVars)})`;
13546
+ if (exp2 === 1 / 3)
13547
+ return `Math.cbrt(${compile(arg, freeVars)})`;
13548
+ if (exp2 === 1)
13549
+ return compile(arg, freeVars);
13550
+ if (exp2 === -1)
13551
+ return `1 / ${compile(arg, freeVars)}`;
13552
+ if (exp2 === -0.5)
13553
+ return `1 / Math.sqrt(${compile(arg, freeVars)})`;
13554
+ }
13555
+ if (h === "Square") {
13556
+ const arg = expr.op1;
13557
+ if (arg === null)
13558
+ throw new Error("Square: no argument");
13559
+ return `Math.pow(${compile(arg, freeVars)}, 2)`;
13260
13560
  }
13261
13561
  const OPS = {
13262
- Add: ["+", 1],
13263
- Subtract: ["-", 1],
13264
- Multiply: ["*", 2],
13265
- Divide: ["/", 3]
13562
+ Add: ["+", 11],
13563
+ Negate: ["-", 14],
13564
+ // Unary operator
13565
+ Subtract: ["-", 11],
13566
+ Multiply: ["*", 12],
13567
+ Divide: ["/", 13],
13568
+ Equal: ["===", 8],
13569
+ NotEqual: ["!==", 8],
13570
+ LessEqual: ["<=", 9],
13571
+ GreaterEqual: [">=", 9],
13572
+ Less: ["<", 9],
13573
+ Greater: [">", 9],
13574
+ And: ["&&", 4],
13575
+ Or: ["||", 3],
13576
+ Not: ["!", 14]
13577
+ // Unary operator
13578
+ // Xor: ['^', 6], // That's bitwise XOR, not logical XOR
13579
+ // Possible solution is to use `a ? !b : b` instead of `a ^ b`
13266
13580
  };
13267
13581
  const op3 = OPS[h];
13268
13582
  if (op3 !== void 0) {
13269
13583
  const args2 = expr.ops;
13270
13584
  if (args2 === null)
13271
13585
  return "";
13272
- const result = [];
13273
- for (const arg of args2)
13274
- result.push(compile(arg, freeVars, op3[1]));
13275
- return op3[1] < prec ? `(${result.join(op3[0])})` : result.join(op3[0]);
13586
+ let resultStr;
13587
+ if (args2.length === 1) {
13588
+ resultStr = `${op3[0]}${compile(args2[0], freeVars, op3[1])}`;
13589
+ } else {
13590
+ resultStr = args2.map((arg) => compile(arg, freeVars, op3[1])).join(` ${op3[0]} `);
13591
+ }
13592
+ return op3[1] < prec ? `(${resultStr})` : resultStr;
13276
13593
  }
13277
13594
  const fn = {
13278
13595
  Abs: "Math.abs",
@@ -13284,13 +13601,18 @@ ${js}`);
13284
13601
  Artanh: "Math.atanh",
13285
13602
  // Math.cbrt
13286
13603
  Ceiling: "Math.ceil",
13604
+ Chop: "_SYS.chop",
13287
13605
  Cos: "Math.cos",
13288
13606
  Cosh: "Math.cosh",
13289
13607
  Exp: "Math.exp",
13290
13608
  Floor: "Math.floor",
13609
+ Gamma: "_SYS.gamma",
13610
+ Gcd: "_SYS.gcd",
13291
13611
  // Math.hypot
13612
+ Lcm: "_SYS.lcm",
13292
13613
  Ln: "Math.log",
13293
13614
  Log: "Math.log10",
13615
+ LogGamma: "_SYS.lngamma",
13294
13616
  Lb: "Math.log2",
13295
13617
  Max: "Math.max",
13296
13618
  Min: "Math.min",
@@ -13324,7 +13646,7 @@ ${js}`);
13324
13646
  // Erfi: 'Math.erfi',
13325
13647
  // Zeta: 'Math.zeta',
13326
13648
  // PolyGamma: 'Math.polygamma',
13327
- // HurwitzZeta: 'Math.hurwitzZeta',
13649
+ // HurwitzZeta: 'Math.hurwitzZeta', $$\zeta (s,a)=\sum _{n=0}^{\infty }{\frac {1}{(n+a)^{s}}}$$
13328
13650
  // DirichletEta: 'Math.dirichletEta',
13329
13651
  // Beta: 'Math.beta',
13330
13652
  // Binomial: 'Math.binomial',
@@ -13397,7 +13719,7 @@ ${js}`);
13397
13719
  if (args !== null) {
13398
13720
  const result = [];
13399
13721
  for (const arg of args)
13400
- result.push(compile(arg, freeVars, 0));
13722
+ result.push(compile(arg, freeVars));
13401
13723
  return `${fn}(${result.join(", ")})`;
13402
13724
  }
13403
13725
  }
@@ -13406,18 +13728,18 @@ ${js}`);
13406
13728
  function compileLoop(expr, op3) {
13407
13729
  const args = expr.ops;
13408
13730
  if (args === null)
13409
- return "NaN";
13731
+ throw new Error("Sum: no arguments");
13410
13732
  if (!expr.op1 || !expr.op2)
13411
- return "NaN";
13733
+ throw new Error("Sum: no limits");
13412
13734
  const [index, lower, upper, isFinite2] = normalizeLimits(expr.op2);
13413
13735
  const fn = compile(expr.op1, [...expr.op1.freeVars, index], 0);
13414
- return `((_) => {
13415
- let acc = ${op3 === "+" ? "0" : "1"};
13416
- const fn = (_) => ${fn};
13417
- for (let i = ${lower}; i < ${upper}; i++)
13418
- acc ${op3}= fn({ ..._, ${index}: i });
13419
- return acc;
13420
- })()`;
13736
+ return `(() => {
13737
+ let acc = ${op3 === "+" ? "0" : "1"};
13738
+ const fn = (_) => ${fn};
13739
+ for (let i = ${lower}; i <= ${upper}; i++)
13740
+ acc ${op3}= fn({ ..._, ${index}: i });
13741
+ return acc;
13742
+ })()`;
13421
13743
  }
13422
13744
 
13423
13745
  // src/compute-engine/boxed-expression/abstract-boxed-expression.ts
@@ -13745,8 +14067,20 @@ ${js}`);
13745
14067
  N(_options) {
13746
14068
  return this.evaluate();
13747
14069
  }
13748
- compile() {
13749
- return compileToJavascript(this);
14070
+ compile(to = "javascript", options) {
14071
+ if (to !== "javascript")
14072
+ return void 0;
14073
+ options ?? (options = { optimize: ["simplify", "evaluate"] });
14074
+ let expr = this;
14075
+ if (options.optimize.includes("simplify"))
14076
+ expr = expr.simplify();
14077
+ if (options.optimize.includes("evaluate"))
14078
+ expr = expr.evaluate();
14079
+ try {
14080
+ return compileToJavascript(expr);
14081
+ } catch (e) {
14082
+ }
14083
+ return void 0;
13750
14084
  }
13751
14085
  };
13752
14086
 
@@ -15579,33 +15913,6 @@ ${js}`);
15579
15913
  ce.context = savedContext;
15580
15914
  return result ?? void 0;
15581
15915
  }
15582
- function normalizeLimits(range) {
15583
- let lower = 1;
15584
- let upper = lower + MAX_ITERATION;
15585
- let index = "Nothing";
15586
- let isFinite2 = true;
15587
- if (range.head === "Tuple" || range.head === "Triple" || range.head === "Pair" || range.head === "Single") {
15588
- index = (range.op1.head === "Hold" ? range.op1.op1.symbol : range.op1.symbol) ?? "Nothing";
15589
- lower = asSmallInteger(range.op2) ?? 1;
15590
- if (!Number.isFinite(lower))
15591
- isFinite2 = false;
15592
- if (range.op3.isNothing || range.op3.isInfinity) {
15593
- isFinite2 = false;
15594
- } else {
15595
- const u = asSmallInteger(range.op3);
15596
- if (u === null)
15597
- isFinite2 = false;
15598
- else {
15599
- upper = u;
15600
- if (!Number.isFinite(upper))
15601
- isFinite2 = false;
15602
- }
15603
- }
15604
- if (!isFinite2 && Number.isFinite(lower))
15605
- upper = lower + MAX_ITERATION;
15606
- }
15607
- return [index, lower, upper, isFinite2];
15608
- }
15609
15916
 
15610
15917
  // src/compute-engine/symbolic/negate.ts
15611
15918
  var import_complex9 = __toESM(require_complex());
@@ -19061,7 +19368,7 @@ ${js}`);
19061
19368
  }
19062
19369
  },
19063
19370
  Erf: {
19064
- description: "Complementary Error Function",
19371
+ description: "Error Function",
19065
19372
  complexity: 7500
19066
19373
  },
19067
19374
  Erfc: {
@@ -19069,7 +19376,7 @@ ${js}`);
19069
19376
  complexity: 7500
19070
19377
  },
19071
19378
  Factorial: {
19072
- description: "The factorial function",
19379
+ description: "Factorial Function",
19073
19380
  wikidata: "Q120976",
19074
19381
  complexity: 9e3,
19075
19382
  signature: {
@@ -19108,7 +19415,7 @@ ${js}`);
19108
19415
  wikidata: "Q190573",
19109
19416
  complexity: 8e3,
19110
19417
  signature: {
19111
- domain: ["Function", "Number", "Number", "Number"],
19418
+ domain: ["Function", "Number", "Number"],
19112
19419
  N: (ce, ops2) => applyN(
19113
19420
  ops2[0],
19114
19421
  (x) => gamma(x),
@@ -19120,7 +19427,7 @@ ${js}`);
19120
19427
  LogGamma: {
19121
19428
  complexity: 8e3,
19122
19429
  signature: {
19123
- domain: ["Function", "Number", "Number", "Number"],
19430
+ domain: ["Function", "Number", "Number"],
19124
19431
  N: (ce, ops2) => applyN(
19125
19432
  ops2[0],
19126
19433
  (x) => lngamma(x),
@@ -20163,7 +20470,7 @@ ${js}`);
20163
20470
  Apply: {
20164
20471
  signature: {
20165
20472
  domain: "Function",
20166
- evaluate: (ce, ops2) => apply(ops2[0], ops2.slice(1))
20473
+ evaluate: (_ce, ops2) => apply(ops2[0], ops2.slice(1))
20167
20474
  }
20168
20475
  },
20169
20476
  About: { signature: { domain: "Function" } },
@@ -20175,6 +20482,11 @@ ${js}`);
20175
20482
  */
20176
20483
  signature: { domain: "Function" }
20177
20484
  },
20485
+ Derivative: {
20486
+ signature: {
20487
+ domain: ["Function", "Function", ["Maybe", "Number"], "Function"]
20488
+ }
20489
+ },
20178
20490
  Domain: {
20179
20491
  /** Return the domain of an expression */
20180
20492
  signature: {
@@ -20550,7 +20862,7 @@ ${js}`);
20550
20862
  // expressions into CNF (Conjunctive Normal Form)
20551
20863
  // https://en.wikipedia.org/wiki/Conjunctive_normal_form
20552
20864
  // using rules (with a rule set that's kinda the inverse of the
20553
- // logic rules for simplify
20865
+ // logic rules for simplify)
20554
20866
  And: {
20555
20867
  wikidata: "Q191081",
20556
20868
  threadable: true,
@@ -20624,6 +20936,10 @@ ${js}`);
20624
20936
  return ops2[1] ? ops2[1].evaluate() : ce.box("Nothing");
20625
20937
  return ops2[2] ? ops2[2].evaluate() : ce.box("Nothing");
20626
20938
  },
20939
+ // @todo: probably don't need a N() handler. Doesn't make a difference
20940
+ // for the evaluation of booleans. Also, don't need to call N() on the
20941
+ // arguments, the caller should have done that. Same for evaluate()
20942
+ // and simplify() above
20627
20943
  N: (ce, ops2) => {
20628
20944
  const cond = ops2[0];
20629
20945
  if (cond && cond.symbol === "True")
@@ -22796,26 +23112,6 @@ ${js}`);
22796
23112
  );
22797
23113
  }
22798
23114
 
22799
- // src/compute-engine/library/utils.ts
22800
- function isSymbolDefinition(def) {
22801
- return !!def && typeof def === "object" && ("domain" in def || "value" in def || "constant" in def);
22802
- }
22803
- function isFunctionDefinition(def) {
22804
- if (def === void 0 || def === null)
22805
- return false;
22806
- if (typeof def !== "object")
22807
- return false;
22808
- if ("complexity" in def || "numeric" in def || "signature" in def)
22809
- return true;
22810
- if (!("domain" in def))
22811
- return false;
22812
- if (def.domain === void 0)
22813
- return false;
22814
- if (typeof def.domain === "string")
22815
- return def.domain === "Function";
22816
- return def.domain.isFunction;
22817
- }
22818
-
22819
23115
  // src/compute-engine/library/library.ts
22820
23116
  function getStandardLibrary(categories) {
22821
23117
  if (categories === "all") {
@@ -23846,14 +24142,15 @@ ${JSON.stringify(entry)}`
23846
24142
  * perform calculations using arbitrary precision floating point numbers.
23847
24143
  * Use `"auto"` or `"complex"` to allow calculations on complex numbers.
23848
24144
  *
23849
- * @param options.numericPrecision Specific how many digits of precision for the
23850
- * numeric calculations. Default is 100.
24145
+ * @param options.numericPrecision Specific how many digits of precision
24146
+ * for the numeric calculations. Default is 100.
23851
24147
  *
23852
- * @param options.tolerance If the absolute value of the difference of two numbers
23853
- * is less than `tolerance`, they are considered equal. Used by `chop()` as well.
24148
+ * @param options.tolerance If the absolute value of the difference of two
24149
+ * numbers is less than `tolerance`, they are considered equal. Used by
24150
+ * `chop()` as well.
23854
24151
  *
23855
- * @param options.defaultDomain If an unknown symbol is encountered, assume it should
23856
- * be a variable in this domain. **Default** `ExtendedRealNumber`
24152
+ * @param options.defaultDomain If an unknown symbol is encountered, assume
24153
+ * this is its domain. **Default** `ExtendedRealNumber`
23857
24154
  */
23858
24155
  constructor(options) {
23859
24156
  /** @internal */
@@ -24795,9 +25092,29 @@ ${JSON.stringify(entry)}`
24795
25092
  this.latexSyntax.updateOptions(opts);
24796
25093
  }
24797
25094
  get jsonSerializationOptions() {
24798
- if (this._useRawJsonSerializationOptions)
24799
- return this._rawJsonSerializationOptions;
24800
- return this._jsonSerializationOptions;
25095
+ if (this._useRawJsonSerializationOptions) {
25096
+ return new Proxy(this._rawJsonSerializationOptions, {
25097
+ get(options, prop) {
25098
+ if (!(prop in options))
25099
+ return void 0;
25100
+ return options[prop];
25101
+ }
25102
+ });
25103
+ }
25104
+ const self = this;
25105
+ return new Proxy(this._jsonSerializationOptions, {
25106
+ get(options, prop) {
25107
+ if (!(prop in options))
25108
+ return void 0;
25109
+ return options[prop];
25110
+ },
25111
+ set(options, prop, value) {
25112
+ if (!(prop in options))
25113
+ return false;
25114
+ self.jsonSerializationOptions = { [prop]: value };
25115
+ return true;
25116
+ }
25117
+ });
24801
25118
  }
24802
25119
  set jsonSerializationOptions(val) {
24803
25120
  if (val.exclude)
@@ -24913,10 +25230,10 @@ ${JSON.stringify(entry)}`
24913
25230
  };
24914
25231
 
24915
25232
  // src/compute-engine.ts
24916
- var version = "0.13.0";
25233
+ var version = "0.14.0";
24917
25234
  globalThis[Symbol.for("io.cortexjs.compute-engine")] = {
24918
25235
  ComputeEngine: ComputeEngine.prototype.constructor,
24919
- version: "0.13.0"
25236
+ version: "0.14.0"
24920
25237
  };
24921
25238
  return __toCommonJS(compute_engine_exports);
24922
25239
  })();