@cortex-js/compute-engine 0.55.0 → 0.55.3

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 (257) hide show
  1. package/dist/compile.esm.js +2498 -2108
  2. package/dist/compile.min.esm.js +48 -48
  3. package/dist/compile.min.umd.cjs +49 -49
  4. package/dist/compile.umd.cjs +2498 -2108
  5. package/dist/compute-engine.esm.js +1219 -719
  6. package/dist/compute-engine.min.esm.js +73 -73
  7. package/dist/compute-engine.min.umd.cjs +73 -73
  8. package/dist/compute-engine.umd.cjs +1219 -719
  9. package/dist/core.esm.js +1223 -715
  10. package/dist/core.min.esm.js +72 -72
  11. package/dist/core.min.umd.cjs +72 -72
  12. package/dist/core.umd.cjs +1223 -715
  13. package/dist/interval.esm.js +1564 -1412
  14. package/dist/interval.min.esm.js +6 -6
  15. package/dist/interval.min.umd.cjs +6 -6
  16. package/dist/interval.umd.cjs +1564 -1412
  17. package/dist/latex-syntax.esm.js +673 -492
  18. package/dist/latex-syntax.min.esm.js +6 -6
  19. package/dist/latex-syntax.min.umd.cjs +6 -6
  20. package/dist/latex-syntax.umd.cjs +673 -492
  21. package/dist/math-json.esm.js +2 -2
  22. package/dist/math-json.min.esm.js +2 -2
  23. package/dist/math-json.min.umd.cjs +2 -2
  24. package/dist/math-json.umd.cjs +2 -2
  25. package/dist/numerics.esm.js +2 -2
  26. package/dist/numerics.min.esm.js +2 -2
  27. package/dist/numerics.min.umd.cjs +2 -2
  28. package/dist/numerics.umd.cjs +2 -2
  29. package/dist/types/big-decimal/big-decimal.d.ts +1 -1
  30. package/dist/types/big-decimal/index.d.ts +1 -1
  31. package/dist/types/big-decimal/transcendentals.d.ts +1 -1
  32. package/dist/types/big-decimal/utils.d.ts +1 -1
  33. package/dist/types/common/ansi-codes.d.ts +1 -1
  34. package/dist/types/common/configuration-change.d.ts +1 -1
  35. package/dist/types/common/fuzzy-string-match.d.ts +1 -1
  36. package/dist/types/common/grapheme-splitter.d.ts +1 -1
  37. package/dist/types/common/interruptible.d.ts +1 -1
  38. package/dist/types/common/one-of.d.ts +1 -1
  39. package/dist/types/common/signals.d.ts +1 -1
  40. package/dist/types/common/type/ast-nodes.d.ts +1 -1
  41. package/dist/types/common/type/boxed-type.d.ts +1 -1
  42. package/dist/types/common/type/lexer.d.ts +1 -1
  43. package/dist/types/common/type/parse.d.ts +1 -1
  44. package/dist/types/common/type/parser.d.ts +1 -1
  45. package/dist/types/common/type/primitive.d.ts +1 -1
  46. package/dist/types/common/type/reduce.d.ts +1 -1
  47. package/dist/types/common/type/serialize.d.ts +1 -1
  48. package/dist/types/common/type/subtype.d.ts +1 -1
  49. package/dist/types/common/type/type-builder.d.ts +1 -1
  50. package/dist/types/common/type/types.d.ts +1 -1
  51. package/dist/types/common/type/utils.d.ts +1 -1
  52. package/dist/types/common/utils.d.ts +1 -1
  53. package/dist/types/compile.d.ts +1 -1
  54. package/dist/types/compute-engine/assume.d.ts +1 -1
  55. package/dist/types/compute-engine/boxed-expression/abstract-boxed-expression.d.ts +1 -1
  56. package/dist/types/compute-engine/boxed-expression/apply.d.ts +1 -1
  57. package/dist/types/compute-engine/boxed-expression/arithmetic-add.d.ts +1 -1
  58. package/dist/types/compute-engine/boxed-expression/arithmetic-mul-div.d.ts +1 -1
  59. package/dist/types/compute-engine/boxed-expression/arithmetic-power.d.ts +1 -1
  60. package/dist/types/compute-engine/boxed-expression/ascii-math.d.ts +1 -1
  61. package/dist/types/compute-engine/boxed-expression/box.d.ts +1 -1
  62. package/dist/types/compute-engine/boxed-expression/boxed-dictionary.d.ts +1 -1
  63. package/dist/types/compute-engine/boxed-expression/boxed-function.d.ts +1 -1
  64. package/dist/types/compute-engine/boxed-expression/boxed-number.d.ts +1 -1
  65. package/dist/types/compute-engine/boxed-expression/boxed-operator-definition.d.ts +1 -1
  66. package/dist/types/compute-engine/boxed-expression/boxed-patterns.d.ts +1 -1
  67. package/dist/types/compute-engine/boxed-expression/boxed-string.d.ts +1 -1
  68. package/dist/types/compute-engine/boxed-expression/boxed-symbol.d.ts +1 -1
  69. package/dist/types/compute-engine/boxed-expression/boxed-tensor.d.ts +1 -1
  70. package/dist/types/compute-engine/boxed-expression/boxed-value-definition.d.ts +1 -1
  71. package/dist/types/compute-engine/boxed-expression/cache.d.ts +1 -1
  72. package/dist/types/compute-engine/boxed-expression/canonical-utils.d.ts +1 -1
  73. package/dist/types/compute-engine/boxed-expression/canonical.d.ts +1 -1
  74. package/dist/types/compute-engine/boxed-expression/compare.d.ts +1 -1
  75. package/dist/types/compute-engine/boxed-expression/constants.d.ts +1 -1
  76. package/dist/types/compute-engine/boxed-expression/expand.d.ts +1 -1
  77. package/dist/types/compute-engine/boxed-expression/expression-map.d.ts +1 -1
  78. package/dist/types/compute-engine/boxed-expression/factor.d.ts +1 -1
  79. package/dist/types/compute-engine/boxed-expression/flatten.d.ts +1 -1
  80. package/dist/types/compute-engine/boxed-expression/hold.d.ts +1 -1
  81. package/dist/types/compute-engine/boxed-expression/inequality-bounds.d.ts +1 -1
  82. package/dist/types/compute-engine/boxed-expression/init-lazy-refs.d.ts +1 -1
  83. package/dist/types/compute-engine/boxed-expression/invisible-operator.d.ts +1 -1
  84. package/dist/types/compute-engine/boxed-expression/match.d.ts +1 -1
  85. package/dist/types/compute-engine/boxed-expression/negate.d.ts +1 -1
  86. package/dist/types/compute-engine/boxed-expression/numerics.d.ts +1 -1
  87. package/dist/types/compute-engine/boxed-expression/order.d.ts +1 -1
  88. package/dist/types/compute-engine/boxed-expression/pattern-utils.d.ts +1 -1
  89. package/dist/types/compute-engine/boxed-expression/polynomial-degree.d.ts +1 -1
  90. package/dist/types/compute-engine/boxed-expression/polynomials.d.ts +1 -1
  91. package/dist/types/compute-engine/boxed-expression/predicates.d.ts +1 -1
  92. package/dist/types/compute-engine/boxed-expression/rules.d.ts +1 -1
  93. package/dist/types/compute-engine/boxed-expression/serialize.d.ts +1 -1
  94. package/dist/types/compute-engine/boxed-expression/sgn.d.ts +1 -1
  95. package/dist/types/compute-engine/boxed-expression/simplify.d.ts +1 -1
  96. package/dist/types/compute-engine/boxed-expression/solve-linear-system.d.ts +1 -1
  97. package/dist/types/compute-engine/boxed-expression/solve.d.ts +1 -1
  98. package/dist/types/compute-engine/boxed-expression/stochastic-equal.d.ts +1 -1
  99. package/dist/types/compute-engine/boxed-expression/trigonometry.d.ts +1 -1
  100. package/dist/types/compute-engine/boxed-expression/type-guards.d.ts +1 -1
  101. package/dist/types/compute-engine/boxed-expression/utils.d.ts +1 -1
  102. package/dist/types/compute-engine/boxed-expression/validate.d.ts +1 -1
  103. package/dist/types/compute-engine/collection-utils.d.ts +1 -1
  104. package/dist/types/compute-engine/compilation/base-compiler.d.ts +8 -7
  105. package/dist/types/compute-engine/compilation/compile-expression.d.ts +1 -1
  106. package/dist/types/compute-engine/compilation/constant-folding.d.ts +50 -0
  107. package/dist/types/compute-engine/compilation/glsl-target.d.ts +1 -1
  108. package/dist/types/compute-engine/compilation/gpu-target.d.ts +1 -1
  109. package/dist/types/compute-engine/compilation/interval-javascript-target.d.ts +1 -1
  110. package/dist/types/compute-engine/compilation/javascript-target.d.ts +23 -1
  111. package/dist/types/compute-engine/compilation/python-target.d.ts +1 -1
  112. package/dist/types/compute-engine/compilation/types.d.ts +1 -1
  113. package/dist/types/compute-engine/compilation/wgsl-target.d.ts +1 -1
  114. package/dist/types/compute-engine/cost-function.d.ts +1 -1
  115. package/dist/types/compute-engine/engine-assumptions.d.ts +1 -1
  116. package/dist/types/compute-engine/engine-cache.d.ts +1 -1
  117. package/dist/types/compute-engine/engine-common-symbols.d.ts +1 -1
  118. package/dist/types/compute-engine/engine-compilation-targets.d.ts +1 -1
  119. package/dist/types/compute-engine/engine-configuration-lifecycle.d.ts +1 -1
  120. package/dist/types/compute-engine/engine-declarations.d.ts +1 -1
  121. package/dist/types/compute-engine/engine-expression-entrypoints.d.ts +1 -1
  122. package/dist/types/compute-engine/engine-extension-contracts.d.ts +1 -1
  123. package/dist/types/compute-engine/engine-library-bootstrap.d.ts +1 -1
  124. package/dist/types/compute-engine/engine-numeric-configuration.d.ts +1 -1
  125. package/dist/types/compute-engine/engine-runtime-state.d.ts +1 -1
  126. package/dist/types/compute-engine/engine-scope.d.ts +1 -1
  127. package/dist/types/compute-engine/engine-sequences.d.ts +1 -1
  128. package/dist/types/compute-engine/engine-simplification-rules.d.ts +1 -1
  129. package/dist/types/compute-engine/engine-startup-coordinator.d.ts +1 -1
  130. package/dist/types/compute-engine/engine-type-resolver.d.ts +1 -1
  131. package/dist/types/compute-engine/engine-validation-entrypoints.d.ts +1 -1
  132. package/dist/types/compute-engine/free-functions.d.ts +1 -1
  133. package/dist/types/compute-engine/function-utils.d.ts +1 -1
  134. package/dist/types/compute-engine/global-types.d.ts +1 -1
  135. package/dist/types/compute-engine/index.d.ts +1 -1
  136. package/dist/types/compute-engine/interval/arithmetic.d.ts +1 -1
  137. package/dist/types/compute-engine/interval/comparison.d.ts +1 -1
  138. package/dist/types/compute-engine/interval/elementary.d.ts +1 -1
  139. package/dist/types/compute-engine/interval/index.d.ts +1 -1
  140. package/dist/types/compute-engine/interval/trigonometric.d.ts +1 -1
  141. package/dist/types/compute-engine/interval/types.d.ts +1 -1
  142. package/dist/types/compute-engine/interval/util.d.ts +1 -1
  143. package/dist/types/compute-engine/latex-syntax/dictionary/default-dictionary.d.ts +1 -1
  144. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-algebra.d.ts +1 -1
  145. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-arithmetic.d.ts +1 -1
  146. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-calculus.d.ts +1 -1
  147. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-complex.d.ts +1 -1
  148. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-core.d.ts +1 -1
  149. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-linear-algebra.d.ts +1 -1
  150. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-logic.d.ts +3 -1
  151. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-other.d.ts +1 -1
  152. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-relational-operators.d.ts +1 -1
  153. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-sets.d.ts +1 -1
  154. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-statistics.d.ts +1 -1
  155. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-symbols.d.ts +1 -1
  156. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-trigonometry.d.ts +1 -1
  157. package/dist/types/compute-engine/latex-syntax/dictionary/definitions-units.d.ts +1 -1
  158. package/dist/types/compute-engine/latex-syntax/dictionary/definitions.d.ts +1 -1
  159. package/dist/types/compute-engine/latex-syntax/dictionary/indexed-types.d.ts +1 -1
  160. package/dist/types/compute-engine/latex-syntax/latex-syntax.d.ts +1 -1
  161. package/dist/types/compute-engine/latex-syntax/parse-number.d.ts +1 -1
  162. package/dist/types/compute-engine/latex-syntax/parse-symbol.d.ts +1 -1
  163. package/dist/types/compute-engine/latex-syntax/parse.d.ts +11 -1
  164. package/dist/types/compute-engine/latex-syntax/serialize-dms.d.ts +1 -1
  165. package/dist/types/compute-engine/latex-syntax/serialize-number.d.ts +1 -1
  166. package/dist/types/compute-engine/latex-syntax/serializer-style.d.ts +1 -1
  167. package/dist/types/compute-engine/latex-syntax/serializer.d.ts +1 -1
  168. package/dist/types/compute-engine/latex-syntax/tokenizer.d.ts +1 -1
  169. package/dist/types/compute-engine/latex-syntax/types.d.ts +1 -1
  170. package/dist/types/compute-engine/latex-syntax/utils.d.ts +1 -1
  171. package/dist/types/compute-engine/library/arithmetic.d.ts +1 -1
  172. package/dist/types/compute-engine/library/calculus.d.ts +1 -1
  173. package/dist/types/compute-engine/library/collections.d.ts +1 -1
  174. package/dist/types/compute-engine/library/colors.d.ts +1 -1
  175. package/dist/types/compute-engine/library/combinatorics.d.ts +1 -1
  176. package/dist/types/compute-engine/library/complex.d.ts +1 -1
  177. package/dist/types/compute-engine/library/control-structures.d.ts +1 -1
  178. package/dist/types/compute-engine/library/core.d.ts +1 -1
  179. package/dist/types/compute-engine/library/fractals.d.ts +1 -1
  180. package/dist/types/compute-engine/library/library.d.ts +1 -1
  181. package/dist/types/compute-engine/library/linear-algebra.d.ts +1 -1
  182. package/dist/types/compute-engine/library/logic-analysis.d.ts +1 -1
  183. package/dist/types/compute-engine/library/logic.d.ts +1 -1
  184. package/dist/types/compute-engine/library/number-theory.d.ts +1 -1
  185. package/dist/types/compute-engine/library/polynomials.d.ts +1 -1
  186. package/dist/types/compute-engine/library/quantity-arithmetic.d.ts +1 -1
  187. package/dist/types/compute-engine/library/random-expression.d.ts +1 -1
  188. package/dist/types/compute-engine/library/relational-operator.d.ts +1 -1
  189. package/dist/types/compute-engine/library/sets.d.ts +1 -1
  190. package/dist/types/compute-engine/library/statistics.d.ts +1 -1
  191. package/dist/types/compute-engine/library/trigonometry.d.ts +1 -1
  192. package/dist/types/compute-engine/library/type-handlers.d.ts +1 -1
  193. package/dist/types/compute-engine/library/unit-data.d.ts +1 -1
  194. package/dist/types/compute-engine/library/units.d.ts +1 -1
  195. package/dist/types/compute-engine/library/utils.d.ts +1 -1
  196. package/dist/types/compute-engine/numeric-value/big-numeric-value.d.ts +1 -1
  197. package/dist/types/compute-engine/numeric-value/exact-numeric-value.d.ts +1 -1
  198. package/dist/types/compute-engine/numeric-value/machine-numeric-value.d.ts +1 -1
  199. package/dist/types/compute-engine/numeric-value/types.d.ts +1 -1
  200. package/dist/types/compute-engine/numerics/bigint.d.ts +1 -1
  201. package/dist/types/compute-engine/numerics/expression.d.ts +1 -1
  202. package/dist/types/compute-engine/numerics/interval.d.ts +1 -1
  203. package/dist/types/compute-engine/numerics/linear-algebra.d.ts +1 -1
  204. package/dist/types/compute-engine/numerics/monte-carlo.d.ts +1 -1
  205. package/dist/types/compute-engine/numerics/numeric-bigint.d.ts +1 -1
  206. package/dist/types/compute-engine/numerics/numeric-bignum.d.ts +1 -1
  207. package/dist/types/compute-engine/numerics/numeric-complex.d.ts +1 -1
  208. package/dist/types/compute-engine/numerics/numeric.d.ts +1 -1
  209. package/dist/types/compute-engine/numerics/primes.d.ts +1 -1
  210. package/dist/types/compute-engine/numerics/rationals.d.ts +1 -1
  211. package/dist/types/compute-engine/numerics/richardson.d.ts +1 -1
  212. package/dist/types/compute-engine/numerics/special-functions.d.ts +1 -1
  213. package/dist/types/compute-engine/numerics/statistics.d.ts +1 -1
  214. package/dist/types/compute-engine/numerics/strings.d.ts +1 -1
  215. package/dist/types/compute-engine/numerics/types.d.ts +1 -1
  216. package/dist/types/compute-engine/numerics/unit-data.d.ts +1 -1
  217. package/dist/types/compute-engine/oeis.d.ts +1 -1
  218. package/dist/types/compute-engine/sequence.d.ts +1 -1
  219. package/dist/types/compute-engine/symbolic/antiderivative.d.ts +1 -1
  220. package/dist/types/compute-engine/symbolic/derivative.d.ts +1 -1
  221. package/dist/types/compute-engine/symbolic/distribute.d.ts +1 -1
  222. package/dist/types/compute-engine/symbolic/fu-cost.d.ts +1 -1
  223. package/dist/types/compute-engine/symbolic/fu-transforms.d.ts +1 -1
  224. package/dist/types/compute-engine/symbolic/fu.d.ts +1 -1
  225. package/dist/types/compute-engine/symbolic/logic-utils.d.ts +1 -1
  226. package/dist/types/compute-engine/symbolic/simplify-abs.d.ts +1 -1
  227. package/dist/types/compute-engine/symbolic/simplify-divide.d.ts +1 -1
  228. package/dist/types/compute-engine/symbolic/simplify-factorial.d.ts +1 -1
  229. package/dist/types/compute-engine/symbolic/simplify-hyperbolic.d.ts +1 -1
  230. package/dist/types/compute-engine/symbolic/simplify-infinity.d.ts +1 -1
  231. package/dist/types/compute-engine/symbolic/simplify-log.d.ts +1 -1
  232. package/dist/types/compute-engine/symbolic/simplify-logic.d.ts +1 -1
  233. package/dist/types/compute-engine/symbolic/simplify-power.d.ts +1 -1
  234. package/dist/types/compute-engine/symbolic/simplify-product.d.ts +1 -1
  235. package/dist/types/compute-engine/symbolic/simplify-rules.d.ts +1 -1
  236. package/dist/types/compute-engine/symbolic/simplify-sum.d.ts +1 -1
  237. package/dist/types/compute-engine/symbolic/simplify-trig.d.ts +1 -1
  238. package/dist/types/compute-engine/tensor/tensor-fields.d.ts +1 -1
  239. package/dist/types/compute-engine/tensor/tensors.d.ts +1 -1
  240. package/dist/types/compute-engine/types-definitions.d.ts +1 -1
  241. package/dist/types/compute-engine/types-engine.d.ts +1 -1
  242. package/dist/types/compute-engine/types-evaluation.d.ts +1 -1
  243. package/dist/types/compute-engine/types-expression.d.ts +1 -1
  244. package/dist/types/compute-engine/types-kernel-evaluation.d.ts +1 -1
  245. package/dist/types/compute-engine/types-kernel-serialization.d.ts +1 -1
  246. package/dist/types/compute-engine/types-serialization.d.ts +1 -1
  247. package/dist/types/compute-engine/types.d.ts +1 -1
  248. package/dist/types/compute-engine.d.ts +1 -1
  249. package/dist/types/core.d.ts +1 -1
  250. package/dist/types/interval.d.ts +1 -1
  251. package/dist/types/latex-syntax.d.ts +2 -2
  252. package/dist/types/math-json/symbols.d.ts +1 -1
  253. package/dist/types/math-json/types.d.ts +1 -1
  254. package/dist/types/math-json/utils.d.ts +1 -1
  255. package/dist/types/math-json.d.ts +2 -2
  256. package/dist/types/numerics.d.ts +1 -1
  257. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /** LatexSyntax 0.55.0 */
1
+ /** LatexSyntax 0.55.3 */
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.LatexSyntax = {}));})(this, (function (exports) { 'use strict';
3
3
  var LatexSyntax = (() => {
4
4
  var __defProp = Object.defineProperty;
@@ -3276,6 +3276,452 @@ var LatexSyntax = (() => {
3276
3276
  }
3277
3277
  };
3278
3278
 
3279
+ // src/compute-engine/latex-syntax/dictionary/definitions-logic.ts
3280
+ var DEFINITIONS_LOGIC = [
3281
+ // Constants
3282
+ {
3283
+ name: "True",
3284
+ kind: "symbol",
3285
+ latexTrigger: ["\\top"]
3286
+ // ⊤ U+22A4
3287
+ },
3288
+ {
3289
+ kind: "symbol",
3290
+ latexTrigger: "\\mathrm{True}",
3291
+ parse: "True"
3292
+ },
3293
+ {
3294
+ kind: "symbol",
3295
+ latexTrigger: "\\operatorname{True}",
3296
+ parse: "True"
3297
+ },
3298
+ {
3299
+ kind: "symbol",
3300
+ latexTrigger: "\\mathsf{T}",
3301
+ parse: "True"
3302
+ },
3303
+ {
3304
+ name: "False",
3305
+ kind: "symbol",
3306
+ latexTrigger: ["\\bot"]
3307
+ // ⊥ U+22A5
3308
+ },
3309
+ {
3310
+ kind: "symbol",
3311
+ latexTrigger: "\\operatorname{False}",
3312
+ parse: "False"
3313
+ },
3314
+ {
3315
+ kind: "symbol",
3316
+ latexTrigger: "\\mathsf{F}",
3317
+ parse: "False"
3318
+ },
3319
+ // Operators
3320
+ // Logic operators have lower precedence than comparisons (245)
3321
+ // so that `x = 1 \lor x = 2` parses as `(x = 1) \lor (x = 2)`
3322
+ // See https://github.com/cortex-js/compute-engine/issues/243
3323
+ {
3324
+ name: "And",
3325
+ kind: "infix",
3326
+ latexTrigger: ["\\land"],
3327
+ precedence: 235
3328
+ // serialize: '\\land',
3329
+ },
3330
+ { kind: "infix", latexTrigger: ["\\wedge"], parse: "And", precedence: 235 },
3331
+ { kind: "infix", latexTrigger: "\\&", parse: "And", precedence: 235 },
3332
+ {
3333
+ kind: "infix",
3334
+ latexTrigger: "\\operatorname{and}",
3335
+ parse: "And",
3336
+ precedence: 235
3337
+ },
3338
+ {
3339
+ name: "Or",
3340
+ kind: "infix",
3341
+ latexTrigger: ["\\lor"],
3342
+ precedence: 230
3343
+ },
3344
+ { kind: "infix", latexTrigger: ["\\vee"], parse: "Or", precedence: 230 },
3345
+ { kind: "infix", latexTrigger: "\\parallel", parse: "Or", precedence: 230 },
3346
+ {
3347
+ kind: "infix",
3348
+ latexTrigger: "\\operatorname{or}",
3349
+ parse: "Or",
3350
+ precedence: 230
3351
+ },
3352
+ {
3353
+ name: "Xor",
3354
+ kind: "infix",
3355
+ latexTrigger: ["\\veebar"],
3356
+ precedence: 232
3357
+ },
3358
+ // Possible alt: \oplus ⊕ U+2295
3359
+ {
3360
+ name: "Not",
3361
+ kind: "prefix",
3362
+ latexTrigger: ["\\lnot"],
3363
+ precedence: 880
3364
+ },
3365
+ {
3366
+ kind: "prefix",
3367
+ latexTrigger: ["\\neg"],
3368
+ parse: "Not",
3369
+ precedence: 880
3370
+ },
3371
+ {
3372
+ name: "Nand",
3373
+ kind: "infix",
3374
+ latexTrigger: ["\\barwedge"],
3375
+ precedence: 232
3376
+ // serialize: '\\mid',
3377
+ },
3378
+ {
3379
+ name: "Nor",
3380
+ kind: "infix",
3381
+ latexTrigger: ["\u22BD"],
3382
+ // bar vee
3383
+ precedence: 232
3384
+ // serialize: '\\downarrow',
3385
+ },
3386
+ // Functions
3387
+ {
3388
+ kind: "function",
3389
+ symbolTrigger: "and",
3390
+ parse: "And"
3391
+ },
3392
+ {
3393
+ kind: "function",
3394
+ symbolTrigger: "or",
3395
+ parse: "Or"
3396
+ },
3397
+ {
3398
+ kind: "function",
3399
+ symbolTrigger: "not",
3400
+ parse: "Not"
3401
+ },
3402
+ // Relations
3403
+ {
3404
+ name: "Implies",
3405
+ kind: "infix",
3406
+ precedence: 220,
3407
+ associativity: "right",
3408
+ latexTrigger: ["\\implies"],
3409
+ serialize: "\\implies"
3410
+ },
3411
+ {
3412
+ latexTrigger: ["\\Rightarrow"],
3413
+ kind: "infix",
3414
+ precedence: 220,
3415
+ associativity: "right",
3416
+ parse: "Implies"
3417
+ },
3418
+ {
3419
+ latexTrigger: ["\\rightarrow"],
3420
+ kind: "infix",
3421
+ precedence: 220,
3422
+ associativity: "right",
3423
+ parse: "Implies"
3424
+ },
3425
+ {
3426
+ latexTrigger: ["\\Longrightarrow"],
3427
+ kind: "infix",
3428
+ precedence: 220,
3429
+ associativity: "right",
3430
+ parse: "Implies"
3431
+ },
3432
+ {
3433
+ latexTrigger: ["\\longrightarrow"],
3434
+ kind: "infix",
3435
+ precedence: 220,
3436
+ associativity: "right",
3437
+ parse: "Implies"
3438
+ },
3439
+ {
3440
+ // Non-strict mode: => for implies
3441
+ latexTrigger: ["=", ">"],
3442
+ kind: "infix",
3443
+ precedence: 220,
3444
+ associativity: "right",
3445
+ parse: (parser, lhs, until) => {
3446
+ if (parser.options.strict !== false) return null;
3447
+ const rhs = parser.parseExpression({ ...until, minPrec: 220 });
3448
+ if (rhs === null) return null;
3449
+ return ["Implies", lhs, rhs];
3450
+ }
3451
+ },
3452
+ {
3453
+ name: "Equivalent",
3454
+ // MathML: identical to, Mathematica: Congruent
3455
+ latexTrigger: ["\\iff"],
3456
+ kind: "infix",
3457
+ associativity: "right",
3458
+ precedence: 219
3459
+ },
3460
+ {
3461
+ latexTrigger: ["\\Leftrightarrow"],
3462
+ kind: "infix",
3463
+ associativity: "right",
3464
+ precedence: 219,
3465
+ parse: "Equivalent"
3466
+ },
3467
+ {
3468
+ latexTrigger: ["\\leftrightarrow"],
3469
+ kind: "infix",
3470
+ associativity: "right",
3471
+ precedence: 219,
3472
+ parse: "Equivalent"
3473
+ },
3474
+ {
3475
+ latexTrigger: ["\\Longleftrightarrow"],
3476
+ kind: "infix",
3477
+ associativity: "right",
3478
+ precedence: 219,
3479
+ parse: "Equivalent"
3480
+ },
3481
+ {
3482
+ latexTrigger: ["\\longleftrightarrow"],
3483
+ kind: "infix",
3484
+ associativity: "right",
3485
+ precedence: 219,
3486
+ parse: "Equivalent"
3487
+ },
3488
+ {
3489
+ // Non-strict mode: <=> for equivalence
3490
+ latexTrigger: ["<", "=", ">"],
3491
+ kind: "infix",
3492
+ precedence: 219,
3493
+ associativity: "right",
3494
+ parse: (parser, lhs, until) => {
3495
+ if (parser.options.strict !== false) return null;
3496
+ const rhs = parser.parseExpression({ ...until, minPrec: 219 });
3497
+ if (rhs === null) return null;
3498
+ return ["Equivalent", lhs, rhs];
3499
+ }
3500
+ },
3501
+ {
3502
+ latexTrigger: ["\\equiv"],
3503
+ kind: "infix",
3504
+ associativity: "right",
3505
+ precedence: 219,
3506
+ parse: (parser, lhs, terminator) => {
3507
+ const rhs = parser.parseExpression({ ...terminator, minPrec: 219 });
3508
+ const index = parser.index;
3509
+ const modulus = parser.parseExpression({ ...terminator, minPrec: 219 });
3510
+ if (modulus !== null && operator(modulus) === "Mod")
3511
+ return ["Congruent", lhs, rhs, missingIfEmpty(operand(modulus, 1))];
3512
+ parser.index = index;
3513
+ return ["Equivalent", lhs, missingIfEmpty(rhs)];
3514
+ }
3515
+ },
3516
+ {
3517
+ name: "Proves",
3518
+ kind: "infix",
3519
+ latexTrigger: ["\\vdash"],
3520
+ precedence: 220,
3521
+ associativity: "right",
3522
+ serialize: "\\vdash"
3523
+ },
3524
+ {
3525
+ name: "Entails",
3526
+ kind: "infix",
3527
+ latexTrigger: ["\\vDash"],
3528
+ precedence: 220,
3529
+ associativity: "right",
3530
+ serialize: "\\vDash"
3531
+ },
3532
+ {
3533
+ name: "Satisfies",
3534
+ kind: "infix",
3535
+ latexTrigger: ["\\models"],
3536
+ precedence: 220,
3537
+ associativity: "right",
3538
+ serialize: "\\models"
3539
+ },
3540
+ // Quantifiers: for all, exists
3541
+ {
3542
+ name: "ForAll",
3543
+ kind: "prefix",
3544
+ latexTrigger: ["\\forall"],
3545
+ precedence: 200,
3546
+ // Has to be lower than COMPARISON_PRECEDENCE
3547
+ serialize: serializeQuantifier("\\forall"),
3548
+ parse: parseQuantifier("ForAll")
3549
+ },
3550
+ {
3551
+ name: "Exists",
3552
+ kind: "prefix",
3553
+ latexTrigger: ["\\exists"],
3554
+ precedence: 200,
3555
+ // Has to be lower than COMPARISON_PRECEDENCE,
3556
+ serialize: serializeQuantifier("\\exists"),
3557
+ parse: parseQuantifier("Exists")
3558
+ },
3559
+ {
3560
+ name: "ExistsUnique",
3561
+ kind: "prefix",
3562
+ latexTrigger: ["\\exists", "!"],
3563
+ precedence: 200,
3564
+ // Has to be lower than COMPARISON_PRECEDENCE,
3565
+ serialize: serializeQuantifier("\\exists!"),
3566
+ parse: parseQuantifier("ExistsUnique")
3567
+ },
3568
+ {
3569
+ name: "NotForAll",
3570
+ kind: "prefix",
3571
+ latexTrigger: ["\\lnot", "\\forall"],
3572
+ precedence: 200,
3573
+ // Has to be lower than COMPARISON_PRECEDENCE
3574
+ serialize: serializeQuantifier("\\lnot\\forall"),
3575
+ parse: parseQuantifier("NotForAll")
3576
+ },
3577
+ {
3578
+ name: "NotExists",
3579
+ kind: "prefix",
3580
+ latexTrigger: ["\\lnot", "\\exists"],
3581
+ precedence: 200,
3582
+ // Has to be lower than COMPARISON_PRECEDENCE,
3583
+ serialize: serializeQuantifier("\\lnot\\exists"),
3584
+ parse: parseQuantifier("NotExists")
3585
+ },
3586
+ {
3587
+ name: "KroneckerDelta",
3588
+ kind: "prefix",
3589
+ latexTrigger: ["\\delta", "_"],
3590
+ precedence: 200,
3591
+ serialize: (serializer, expr) => {
3592
+ const args = operands(expr);
3593
+ if (args.length === 0) return "\\delta";
3594
+ if (args.every((x) => symbol(x)))
3595
+ return `\\delta_{${args.map((arg) => serializer.serialize(arg)).join("")}}`;
3596
+ return `\\delta_{${args.map((arg) => serializer.serialize(arg)).join(", ")}}`;
3597
+ },
3598
+ parse: (parser) => {
3599
+ const group = parser.parseGroup();
3600
+ if (group === null) {
3601
+ const token = parser.parseToken();
3602
+ if (!token) return null;
3603
+ return ["KroneckerDelta", token];
3604
+ }
3605
+ const seq = getSequence(group);
3606
+ if (seq && seq.length <= 2) return ["KroneckerDelta", ...seq];
3607
+ if (operator(group) === "InvisibleOperator")
3608
+ return ["KroneckerDelta", ...operands(group)];
3609
+ if (group !== null) return ["KroneckerDelta", group];
3610
+ return null;
3611
+ }
3612
+ },
3613
+ // Iverson brackets. Also called the "indicator function"
3614
+ // Must have a single argument, a relational expression, i.e.
3615
+ // `[ a = b ]` or `[ x \leq 0 ]`
3616
+ // Otherwise, it gets rejected, it could be something else, like a list or
3617
+ // tuple.
3618
+ {
3619
+ name: "Boole",
3620
+ kind: "matchfix",
3621
+ openTrigger: "[",
3622
+ closeTrigger: "]",
3623
+ // serialize: (serializer: Serializer, expr: MathJsonExpression) => {
3624
+ // const args = ops(expr);
3625
+ // return `[${serializer.serialize(arg)}]`;
3626
+ // },
3627
+ parse: (_parser, body) => {
3628
+ const h = operator(body);
3629
+ if (!h) return null;
3630
+ if (!DEFINITIONS_INEQUALITIES.some((x) => x.name === h)) return null;
3631
+ return ["Boole", body];
3632
+ }
3633
+ },
3634
+ {
3635
+ kind: "matchfix",
3636
+ openTrigger: "\\llbracket",
3637
+ closeTrigger: "\\rrbracket",
3638
+ parse: (_parser, body) => {
3639
+ const h = operator(body);
3640
+ if (!h) return null;
3641
+ if (!DEFINITIONS_INEQUALITIES.some((x) => x.name === h)) return null;
3642
+ return ["Boole", body];
3643
+ }
3644
+ },
3645
+ // Predicate application in First-Order Logic.
3646
+ // ["Predicate", "P", "x", "y"] serializes to "P(x, y)"
3647
+ {
3648
+ name: "Predicate",
3649
+ serialize: (serializer, expr) => {
3650
+ const args = operands(expr);
3651
+ if (args.length === 0) return "";
3652
+ const pred = args[0];
3653
+ const predStr = typeof pred === "string" ? pred : serializer.serialize(pred);
3654
+ if (args.length === 1) return predStr;
3655
+ const argStrs = args.slice(1).map((arg) => serializer.serialize(arg));
3656
+ return `${predStr}(${argStrs.join(", ")})`;
3657
+ }
3658
+ }
3659
+ ];
3660
+ function serializeQuantifier(quantifierSymbol) {
3661
+ return (serializer, expr) => {
3662
+ const args = operands(expr);
3663
+ if (args.length === 0) return quantifierSymbol;
3664
+ if (args.length === 1)
3665
+ return `${quantifierSymbol} ${serializer.serialize(args[0])}`;
3666
+ const boundVar = serializer.serialize(args[0]);
3667
+ const body = serializer.serialize(args[1]);
3668
+ return `${quantifierSymbol} ${boundVar}, ${body}`;
3669
+ };
3670
+ }
3671
+ function tightBindingCondition(p, terminator) {
3672
+ return p.peek === "\\to" || p.peek === "\\rightarrow" || p.peek === "\\implies" || p.peek === "\\Rightarrow" || p.peek === "\\iff" || p.peek === "\\Leftrightarrow" || p.peek === "\\land" || p.peek === "\\wedge" || p.peek === "\\lor" || p.peek === "\\vee" || (terminator.condition?.(p) ?? false);
3673
+ }
3674
+ function parseQuantifier(kind) {
3675
+ return (parser, terminator) => {
3676
+ const index = parser.index;
3677
+ const useTightBinding = parser.options.quantifierScope !== "loose";
3678
+ const symbol2 = parser.parseSymbol(terminator);
3679
+ if (symbol2) {
3680
+ parser.skipSpace();
3681
+ if (parser.match(",") || parser.match("\\mid") || parser.match(".") || parser.match(":") || parser.match("\\colon")) {
3682
+ const bodyTerminator = useTightBinding ? {
3683
+ ...terminator,
3684
+ condition: (p) => tightBindingCondition(p, terminator)
3685
+ } : terminator;
3686
+ parser.enterQuantifierScope();
3687
+ const body2 = parser.parseExpression(bodyTerminator);
3688
+ parser.exitQuantifierScope();
3689
+ return [kind, symbol2, missingIfEmpty(body2)];
3690
+ }
3691
+ parser.enterQuantifierScope();
3692
+ const body = parser.parseEnclosure();
3693
+ parser.exitQuantifierScope();
3694
+ if (body) return [kind, symbol2, missingIfEmpty(body)];
3695
+ }
3696
+ parser.index = index;
3697
+ const condTerminator = {
3698
+ ...terminator,
3699
+ condition: (p) => p.peek === ":" || p.peek === "\\colon" || (terminator.condition?.(p) ?? false)
3700
+ };
3701
+ const condition = parser.parseExpression(condTerminator);
3702
+ if (condition === null) return null;
3703
+ parser.skipSpace();
3704
+ if (parser.matchAny([",", "\\mid", ":", "\\colon"])) {
3705
+ const bodyTerminator = useTightBinding ? {
3706
+ ...terminator,
3707
+ condition: (p) => tightBindingCondition(p, terminator)
3708
+ } : terminator;
3709
+ parser.enterQuantifierScope();
3710
+ const body = parser.parseExpression(bodyTerminator);
3711
+ parser.exitQuantifierScope();
3712
+ return [kind, condition, missingIfEmpty(body)];
3713
+ }
3714
+ if (parser.match("(")) {
3715
+ parser.enterQuantifierScope();
3716
+ const body = parser.parseExpression(terminator);
3717
+ parser.exitQuantifierScope();
3718
+ if (!parser.match(")")) return null;
3719
+ return [kind, condition, missingIfEmpty(body)];
3720
+ }
3721
+ return null;
3722
+ };
3723
+ }
3724
+
3279
3725
  // src/compute-engine/latex-syntax/dictionary/definitions-core.ts
3280
3726
  function parseSequence(parser, terminator, lhs, prec, sep) {
3281
3727
  if (terminator && terminator.minPrec >= prec) return null;
@@ -3886,6 +4332,120 @@ var LatexSyntax = (() => {
3886
4332
  precedence: 21,
3887
4333
  parse: (parser, lhs, until) => parseWhereExpression(parser, lhs, until)
3888
4334
  },
4335
+ // \text{and} — logical conjunction infix
4336
+ {
4337
+ latexTrigger: ["\\text"],
4338
+ kind: "infix",
4339
+ associativity: "right",
4340
+ precedence: 235,
4341
+ // Same as \land
4342
+ parse: (parser, lhs, until) => {
4343
+ const start = parser.index;
4344
+ if (!matchTextKeyword(parser, "and")) {
4345
+ parser.index = start;
4346
+ return null;
4347
+ }
4348
+ const rhs = parser.parseExpression({ ...until, minPrec: 235 });
4349
+ return ["And", lhs, rhs ?? "Nothing"];
4350
+ }
4351
+ },
4352
+ // \text{or} — logical disjunction infix
4353
+ {
4354
+ latexTrigger: ["\\text"],
4355
+ kind: "infix",
4356
+ associativity: "right",
4357
+ precedence: 230,
4358
+ // Same as \lor
4359
+ parse: (parser, lhs, until) => {
4360
+ const start = parser.index;
4361
+ if (!matchTextKeyword(parser, "or")) {
4362
+ parser.index = start;
4363
+ return null;
4364
+ }
4365
+ const rhs = parser.parseExpression({ ...until, minPrec: 230 });
4366
+ return ["Or", lhs, rhs ?? "Nothing"];
4367
+ }
4368
+ },
4369
+ // \text{iff} — biconditional (if and only if)
4370
+ {
4371
+ latexTrigger: ["\\text"],
4372
+ kind: "infix",
4373
+ associativity: "right",
4374
+ precedence: 219,
4375
+ // Same as \iff
4376
+ parse: (parser, lhs, until) => {
4377
+ const start = parser.index;
4378
+ if (!matchTextKeyword(parser, "iff")) {
4379
+ parser.index = start;
4380
+ return null;
4381
+ }
4382
+ const rhs = parser.parseExpression({ ...until, minPrec: 219 });
4383
+ return ["Equivalent", lhs, rhs ?? "Nothing"];
4384
+ }
4385
+ },
4386
+ // \text{if and only if} — verbose biconditional
4387
+ {
4388
+ latexTrigger: ["\\text"],
4389
+ kind: "infix",
4390
+ associativity: "right",
4391
+ precedence: 219,
4392
+ parse: (parser, lhs, until) => {
4393
+ const start = parser.index;
4394
+ if (!matchTextKeyword(parser, "if and only if")) {
4395
+ parser.index = start;
4396
+ return null;
4397
+ }
4398
+ const rhs = parser.parseExpression({ ...until, minPrec: 219 });
4399
+ return ["Equivalent", lhs, rhs ?? "Nothing"];
4400
+ }
4401
+ },
4402
+ // \text{such that} — constraint separator (like : in set-builder notation)
4403
+ {
4404
+ latexTrigger: ["\\text"],
4405
+ kind: "infix",
4406
+ associativity: "right",
4407
+ precedence: 21,
4408
+ // Low precedence to capture full condition (same as 'where')
4409
+ parse: (parser, lhs, until) => {
4410
+ const start = parser.index;
4411
+ if (!matchTextKeyword(parser, "such that")) {
4412
+ parser.index = start;
4413
+ return null;
4414
+ }
4415
+ const rhs = parser.parseExpression({ ...until, minPrec: 21 });
4416
+ return ["Colon", lhs, rhs ?? "Nothing"];
4417
+ }
4418
+ },
4419
+ // \text{for all} — universal quantifier
4420
+ {
4421
+ latexTrigger: ["\\text"],
4422
+ kind: "prefix",
4423
+ precedence: 200,
4424
+ // Same as \forall
4425
+ parse: (parser, until) => {
4426
+ const start = parser.index;
4427
+ if (!matchTextKeyword(parser, "for all")) {
4428
+ parser.index = start;
4429
+ return null;
4430
+ }
4431
+ return parseQuantifier("ForAll")(parser, until);
4432
+ }
4433
+ },
4434
+ // \text{there exists} — existential quantifier
4435
+ {
4436
+ latexTrigger: ["\\text"],
4437
+ kind: "prefix",
4438
+ precedence: 200,
4439
+ // Same as \exists
4440
+ parse: (parser, until) => {
4441
+ const start = parser.index;
4442
+ if (!matchTextKeyword(parser, "there exists")) {
4443
+ parser.index = start;
4444
+ return null;
4445
+ }
4446
+ return parseQuantifier("Exists")(parser, until);
4447
+ }
4448
+ },
3889
4449
  // Block serializer — used by both `where` and semicolon blocks
3890
4450
  {
3891
4451
  name: "Block",
@@ -4001,6 +4561,39 @@ var LatexSyntax = (() => {
4001
4561
  parser.parseExpression(until) ?? "Nothing"
4002
4562
  ]
4003
4563
  },
4564
+ // Text serializer — reconstructs \text{...} with inline $...$ for math
4565
+ {
4566
+ name: "Text",
4567
+ serialize: (serializer, expr) => {
4568
+ const args = operands(expr);
4569
+ if (args.length === 0) return "";
4570
+ let firstStr = -1;
4571
+ let lastStr = -1;
4572
+ for (let i = 0; i < args.length; i++) {
4573
+ if (stringValue(args[i]) !== null) {
4574
+ if (firstStr < 0) firstStr = i;
4575
+ lastStr = i;
4576
+ }
4577
+ }
4578
+ if (firstStr < 0)
4579
+ return joinLatex(args.map((a) => serializer.serialize(a)));
4580
+ const parts = [];
4581
+ for (let i = 0; i < firstStr; i++)
4582
+ parts.push(serializer.serialize(args[i]));
4583
+ let textContent = "";
4584
+ for (let i = firstStr; i <= lastStr; i++) {
4585
+ const s = stringValue(args[i]);
4586
+ if (s !== null) textContent += sanitizeLatex(s);
4587
+ else if (operator(args[i]) === "Annotated" || operator(args[i]) === "Text")
4588
+ textContent += serializer.serialize(args[i]);
4589
+ else textContent += "$" + serializer.serialize(args[i]) + "$";
4590
+ }
4591
+ parts.push("\\text{" + textContent + "}");
4592
+ for (let i = lastStr + 1; i < args.length; i++)
4593
+ parts.push(serializer.serialize(args[i]));
4594
+ return joinLatex(parts);
4595
+ }
4596
+ },
4004
4597
  {
4005
4598
  name: "String",
4006
4599
  latexTrigger: ["\\text"],
@@ -4391,9 +4984,10 @@ var LatexSyntax = (() => {
4391
4984
  } else if (parser.match("\\textcolor")) {
4392
4985
  const pos = parser.index;
4393
4986
  const color = parser.parseStringGroup();
4394
- const body2 = parser.parseExpression();
4395
- if (color !== null && body2 !== null) {
4396
- runs.push(["Annotated", body2, { dict: { color } }]);
4987
+ if (color !== null) {
4988
+ flush();
4989
+ const body2 = parseTextRun(parser);
4990
+ runs.push(["Annotated", body2, dictionaryFromEntries({ color })]);
4397
4991
  } else {
4398
4992
  parser.index = pos;
4399
4993
  text += "\\textcolor";
@@ -4411,6 +5005,7 @@ var LatexSyntax = (() => {
4411
5005
  const expr = parser.parseExpression() ?? "Nothing";
4412
5006
  parser.skipSpace();
4413
5007
  if (parser.match("<$>")) {
5008
+ flush();
4414
5009
  runs.push(expr);
4415
5010
  } else {
4416
5011
  text += "$";
@@ -4421,6 +5016,7 @@ var LatexSyntax = (() => {
4421
5016
  const expr = parser.parseExpression() ?? "Nothing";
4422
5017
  parser.skipSpace();
4423
5018
  if (parser.match("<$$>")) {
5019
+ flush();
4424
5020
  runs.push(expr);
4425
5021
  } else {
4426
5022
  text += "$$";
@@ -4771,14 +5367,20 @@ var LatexSyntax = (() => {
4771
5367
  }
4772
5368
  while (parser.match("<space>")) {
4773
5369
  }
4774
- let text = "";
4775
- while (!parser.atEnd && parser.peek !== "<}>" && parser.peek !== "<space>") {
4776
- const tok = parser.peek;
4777
- if (/^[a-zA-Z]$/.test(tok)) {
4778
- text += tok;
4779
- parser.nextToken();
5370
+ for (let i = 0; i < keyword.length; i++) {
5371
+ if (keyword[i] === " ") {
5372
+ if (!parser.match("<space>")) {
5373
+ parser.index = start;
5374
+ return false;
5375
+ }
5376
+ while (parser.match("<space>")) {
5377
+ }
4780
5378
  } else {
4781
- break;
5379
+ if (parser.peek !== keyword[i]) {
5380
+ parser.index = start;
5381
+ return false;
5382
+ }
5383
+ parser.nextToken();
4782
5384
  }
4783
5385
  }
4784
5386
  while (parser.match("<space>")) {
@@ -4787,10 +5389,6 @@ var LatexSyntax = (() => {
4787
5389
  parser.index = start;
4788
5390
  return false;
4789
5391
  }
4790
- if (text !== keyword) {
4791
- parser.index = start;
4792
- return false;
4793
- }
4794
5392
  return true;
4795
5393
  }
4796
5394
  function matchKeyword(parser, keyword) {
@@ -5046,473 +5644,27 @@ var LatexSyntax = (() => {
5046
5644
  ];
5047
5645
 
5048
5646
  // src/compute-engine/latex-syntax/dictionary/definitions-algebra.ts
5049
- var DEFINITIONS_ALGEBRA = [
5050
- {
5051
- name: "To",
5052
- latexTrigger: ["\\to"],
5053
- kind: "infix",
5054
- precedence: 270
5055
- // MathML rightwards arrow
5056
- },
5057
- {
5058
- // Non-strict mode: -> for maps-to arrow
5059
- latexTrigger: ["-", ">"],
5060
- kind: "infix",
5061
- precedence: 270,
5062
- parse: (parser, lhs, until) => {
5063
- if (parser.options.strict !== false) return null;
5064
- const rhs = parser.parseExpression({ ...until, minPrec: 270 });
5065
- if (rhs === null) return null;
5066
- return ["To", lhs, rhs];
5067
- }
5068
- }
5069
- ];
5070
-
5071
- // src/compute-engine/latex-syntax/dictionary/definitions-logic.ts
5072
- var DEFINITIONS_LOGIC = [
5073
- // Constants
5074
- {
5075
- name: "True",
5076
- kind: "symbol",
5077
- latexTrigger: ["\\top"]
5078
- // ⊤ U+22A4
5079
- },
5080
- {
5081
- kind: "symbol",
5082
- latexTrigger: "\\mathrm{True}",
5083
- parse: "True"
5084
- },
5085
- {
5086
- kind: "symbol",
5087
- latexTrigger: "\\operatorname{True}",
5088
- parse: "True"
5089
- },
5090
- {
5091
- kind: "symbol",
5092
- latexTrigger: "\\mathsf{T}",
5093
- parse: "True"
5094
- },
5095
- {
5096
- name: "False",
5097
- kind: "symbol",
5098
- latexTrigger: ["\\bot"]
5099
- // ⊥ U+22A5
5100
- },
5101
- {
5102
- kind: "symbol",
5103
- latexTrigger: "\\operatorname{False}",
5104
- parse: "False"
5105
- },
5106
- {
5107
- kind: "symbol",
5108
- latexTrigger: "\\mathsf{F}",
5109
- parse: "False"
5110
- },
5111
- // Operators
5112
- // Logic operators have lower precedence than comparisons (245)
5113
- // so that `x = 1 \lor x = 2` parses as `(x = 1) \lor (x = 2)`
5114
- // See https://github.com/cortex-js/compute-engine/issues/243
5115
- {
5116
- name: "And",
5117
- kind: "infix",
5118
- latexTrigger: ["\\land"],
5119
- precedence: 235
5120
- // serialize: '\\land',
5121
- },
5122
- { kind: "infix", latexTrigger: ["\\wedge"], parse: "And", precedence: 235 },
5123
- { kind: "infix", latexTrigger: "\\&", parse: "And", precedence: 235 },
5124
- {
5125
- kind: "infix",
5126
- latexTrigger: "\\operatorname{and}",
5127
- parse: "And",
5128
- precedence: 235
5129
- },
5130
- {
5131
- name: "Or",
5132
- kind: "infix",
5133
- latexTrigger: ["\\lor"],
5134
- precedence: 230
5135
- },
5136
- { kind: "infix", latexTrigger: ["\\vee"], parse: "Or", precedence: 230 },
5137
- { kind: "infix", latexTrigger: "\\parallel", parse: "Or", precedence: 230 },
5138
- {
5139
- kind: "infix",
5140
- latexTrigger: "\\operatorname{or}",
5141
- parse: "Or",
5142
- precedence: 230
5143
- },
5144
- {
5145
- name: "Xor",
5146
- kind: "infix",
5147
- latexTrigger: ["\\veebar"],
5148
- precedence: 232
5149
- },
5150
- // Possible alt: \oplus ⊕ U+2295
5151
- {
5152
- name: "Not",
5153
- kind: "prefix",
5154
- latexTrigger: ["\\lnot"],
5155
- precedence: 880
5156
- },
5157
- {
5158
- kind: "prefix",
5159
- latexTrigger: ["\\neg"],
5160
- parse: "Not",
5161
- precedence: 880
5162
- },
5163
- {
5164
- name: "Nand",
5165
- kind: "infix",
5166
- latexTrigger: ["\\barwedge"],
5167
- precedence: 232
5168
- // serialize: '\\mid',
5169
- },
5170
- {
5171
- name: "Nor",
5172
- kind: "infix",
5173
- latexTrigger: ["\u22BD"],
5174
- // bar vee
5175
- precedence: 232
5176
- // serialize: '\\downarrow',
5177
- },
5178
- // Functions
5179
- {
5180
- kind: "function",
5181
- symbolTrigger: "and",
5182
- parse: "And"
5183
- },
5184
- {
5185
- kind: "function",
5186
- symbolTrigger: "or",
5187
- parse: "Or"
5188
- },
5189
- {
5190
- kind: "function",
5191
- symbolTrigger: "not",
5192
- parse: "Not"
5193
- },
5194
- // Relations
5195
- {
5196
- name: "Implies",
5197
- kind: "infix",
5198
- precedence: 220,
5199
- associativity: "right",
5200
- latexTrigger: ["\\implies"],
5201
- serialize: "\\implies"
5202
- },
5203
- {
5204
- latexTrigger: ["\\Rightarrow"],
5205
- kind: "infix",
5206
- precedence: 220,
5207
- associativity: "right",
5208
- parse: "Implies"
5209
- },
5210
- {
5211
- latexTrigger: ["\\rightarrow"],
5212
- kind: "infix",
5213
- precedence: 220,
5214
- associativity: "right",
5215
- parse: "Implies"
5216
- },
5217
- {
5218
- latexTrigger: ["\\Longrightarrow"],
5219
- kind: "infix",
5220
- precedence: 220,
5221
- associativity: "right",
5222
- parse: "Implies"
5223
- },
5224
- {
5225
- latexTrigger: ["\\longrightarrow"],
5226
- kind: "infix",
5227
- precedence: 220,
5228
- associativity: "right",
5229
- parse: "Implies"
5230
- },
5231
- {
5232
- // Non-strict mode: => for implies
5233
- latexTrigger: ["=", ">"],
5234
- kind: "infix",
5235
- precedence: 220,
5236
- associativity: "right",
5237
- parse: (parser, lhs, until) => {
5238
- if (parser.options.strict !== false) return null;
5239
- const rhs = parser.parseExpression({ ...until, minPrec: 220 });
5240
- if (rhs === null) return null;
5241
- return ["Implies", lhs, rhs];
5242
- }
5243
- },
5244
- {
5245
- name: "Equivalent",
5246
- // MathML: identical to, Mathematica: Congruent
5247
- latexTrigger: ["\\iff"],
5248
- kind: "infix",
5249
- associativity: "right",
5250
- precedence: 219
5251
- },
5252
- {
5253
- latexTrigger: ["\\Leftrightarrow"],
5254
- kind: "infix",
5255
- associativity: "right",
5256
- precedence: 219,
5257
- parse: "Equivalent"
5258
- },
5259
- {
5260
- latexTrigger: ["\\leftrightarrow"],
5261
- kind: "infix",
5262
- associativity: "right",
5263
- precedence: 219,
5264
- parse: "Equivalent"
5265
- },
5266
- {
5267
- latexTrigger: ["\\Longleftrightarrow"],
5268
- kind: "infix",
5269
- associativity: "right",
5270
- precedence: 219,
5271
- parse: "Equivalent"
5272
- },
5647
+ var DEFINITIONS_ALGEBRA = [
5273
5648
  {
5274
- latexTrigger: ["\\longleftrightarrow"],
5649
+ name: "To",
5650
+ latexTrigger: ["\\to"],
5275
5651
  kind: "infix",
5276
- associativity: "right",
5277
- precedence: 219,
5278
- parse: "Equivalent"
5652
+ precedence: 270
5653
+ // MathML rightwards arrow
5279
5654
  },
5280
5655
  {
5281
- // Non-strict mode: <=> for equivalence
5282
- latexTrigger: ["<", "=", ">"],
5656
+ // Non-strict mode: -> for maps-to arrow
5657
+ latexTrigger: ["-", ">"],
5283
5658
  kind: "infix",
5284
- precedence: 219,
5285
- associativity: "right",
5659
+ precedence: 270,
5286
5660
  parse: (parser, lhs, until) => {
5287
5661
  if (parser.options.strict !== false) return null;
5288
- const rhs = parser.parseExpression({ ...until, minPrec: 219 });
5662
+ const rhs = parser.parseExpression({ ...until, minPrec: 270 });
5289
5663
  if (rhs === null) return null;
5290
- return ["Equivalent", lhs, rhs];
5291
- }
5292
- },
5293
- {
5294
- latexTrigger: ["\\equiv"],
5295
- kind: "infix",
5296
- associativity: "right",
5297
- precedence: 219,
5298
- parse: (parser, lhs, terminator) => {
5299
- const rhs = parser.parseExpression({ ...terminator, minPrec: 219 });
5300
- const index = parser.index;
5301
- const modulus = parser.parseExpression({ ...terminator, minPrec: 219 });
5302
- if (modulus !== null && operator(modulus) === "Mod")
5303
- return ["Congruent", lhs, rhs, missingIfEmpty(operand(modulus, 1))];
5304
- parser.index = index;
5305
- return ["Equivalent", lhs, missingIfEmpty(rhs)];
5306
- }
5307
- },
5308
- {
5309
- name: "Proves",
5310
- kind: "infix",
5311
- latexTrigger: ["\\vdash"],
5312
- precedence: 220,
5313
- associativity: "right",
5314
- serialize: "\\vdash"
5315
- },
5316
- {
5317
- name: "Entails",
5318
- kind: "infix",
5319
- latexTrigger: ["\\vDash"],
5320
- precedence: 220,
5321
- associativity: "right",
5322
- serialize: "\\vDash"
5323
- },
5324
- {
5325
- name: "Satisfies",
5326
- kind: "infix",
5327
- latexTrigger: ["\\models"],
5328
- precedence: 220,
5329
- associativity: "right",
5330
- serialize: "\\models"
5331
- },
5332
- // Quantifiers: for all, exists
5333
- {
5334
- name: "ForAll",
5335
- kind: "prefix",
5336
- latexTrigger: ["\\forall"],
5337
- precedence: 200,
5338
- // Has to be lower than COMPARISON_PRECEDENCE
5339
- serialize: serializeQuantifier("\\forall"),
5340
- parse: parseQuantifier("ForAll")
5341
- },
5342
- {
5343
- name: "Exists",
5344
- kind: "prefix",
5345
- latexTrigger: ["\\exists"],
5346
- precedence: 200,
5347
- // Has to be lower than COMPARISON_PRECEDENCE,
5348
- serialize: serializeQuantifier("\\exists"),
5349
- parse: parseQuantifier("Exists")
5350
- },
5351
- {
5352
- name: "ExistsUnique",
5353
- kind: "prefix",
5354
- latexTrigger: ["\\exists", "!"],
5355
- precedence: 200,
5356
- // Has to be lower than COMPARISON_PRECEDENCE,
5357
- serialize: serializeQuantifier("\\exists!"),
5358
- parse: parseQuantifier("ExistsUnique")
5359
- },
5360
- {
5361
- name: "NotForAll",
5362
- kind: "prefix",
5363
- latexTrigger: ["\\lnot", "\\forall"],
5364
- precedence: 200,
5365
- // Has to be lower than COMPARISON_PRECEDENCE
5366
- serialize: serializeQuantifier("\\lnot\\forall"),
5367
- parse: parseQuantifier("NotForAll")
5368
- },
5369
- {
5370
- name: "NotExists",
5371
- kind: "prefix",
5372
- latexTrigger: ["\\lnot", "\\exists"],
5373
- precedence: 200,
5374
- // Has to be lower than COMPARISON_PRECEDENCE,
5375
- serialize: serializeQuantifier("\\lnot\\exists"),
5376
- parse: parseQuantifier("NotExists")
5377
- },
5378
- {
5379
- name: "KroneckerDelta",
5380
- kind: "prefix",
5381
- latexTrigger: ["\\delta", "_"],
5382
- precedence: 200,
5383
- serialize: (serializer, expr) => {
5384
- const args = operands(expr);
5385
- if (args.length === 0) return "\\delta";
5386
- if (args.every((x) => symbol(x)))
5387
- return `\\delta_{${args.map((arg) => serializer.serialize(arg)).join("")}}`;
5388
- return `\\delta_{${args.map((arg) => serializer.serialize(arg)).join(", ")}}`;
5389
- },
5390
- parse: (parser) => {
5391
- const group = parser.parseGroup();
5392
- if (group === null) {
5393
- const token = parser.parseToken();
5394
- if (!token) return null;
5395
- return ["KroneckerDelta", token];
5396
- }
5397
- const seq = getSequence(group);
5398
- if (seq && seq.length <= 2) return ["KroneckerDelta", ...seq];
5399
- if (operator(group) === "InvisibleOperator")
5400
- return ["KroneckerDelta", ...operands(group)];
5401
- if (group !== null) return ["KroneckerDelta", group];
5402
- return null;
5403
- }
5404
- },
5405
- // Iverson brackets. Also called the "indicator function"
5406
- // Must have a single argument, a relational expression, i.e.
5407
- // `[ a = b ]` or `[ x \leq 0 ]`
5408
- // Otherwise, it gets rejected, it could be something else, like a list or
5409
- // tuple.
5410
- {
5411
- name: "Boole",
5412
- kind: "matchfix",
5413
- openTrigger: "[",
5414
- closeTrigger: "]",
5415
- // serialize: (serializer: Serializer, expr: MathJsonExpression) => {
5416
- // const args = ops(expr);
5417
- // return `[${serializer.serialize(arg)}]`;
5418
- // },
5419
- parse: (_parser, body) => {
5420
- const h = operator(body);
5421
- if (!h) return null;
5422
- if (!DEFINITIONS_INEQUALITIES.some((x) => x.name === h)) return null;
5423
- return ["Boole", body];
5424
- }
5425
- },
5426
- {
5427
- kind: "matchfix",
5428
- openTrigger: "\\llbracket",
5429
- closeTrigger: "\\rrbracket",
5430
- parse: (_parser, body) => {
5431
- const h = operator(body);
5432
- if (!h) return null;
5433
- if (!DEFINITIONS_INEQUALITIES.some((x) => x.name === h)) return null;
5434
- return ["Boole", body];
5435
- }
5436
- },
5437
- // Predicate application in First-Order Logic.
5438
- // ["Predicate", "P", "x", "y"] serializes to "P(x, y)"
5439
- {
5440
- name: "Predicate",
5441
- serialize: (serializer, expr) => {
5442
- const args = operands(expr);
5443
- if (args.length === 0) return "";
5444
- const pred = args[0];
5445
- const predStr = typeof pred === "string" ? pred : serializer.serialize(pred);
5446
- if (args.length === 1) return predStr;
5447
- const argStrs = args.slice(1).map((arg) => serializer.serialize(arg));
5448
- return `${predStr}(${argStrs.join(", ")})`;
5664
+ return ["To", lhs, rhs];
5449
5665
  }
5450
5666
  }
5451
5667
  ];
5452
- function serializeQuantifier(quantifierSymbol) {
5453
- return (serializer, expr) => {
5454
- const args = operands(expr);
5455
- if (args.length === 0) return quantifierSymbol;
5456
- if (args.length === 1)
5457
- return `${quantifierSymbol} ${serializer.serialize(args[0])}`;
5458
- const boundVar = serializer.serialize(args[0]);
5459
- const body = serializer.serialize(args[1]);
5460
- return `${quantifierSymbol} ${boundVar}, ${body}`;
5461
- };
5462
- }
5463
- function tightBindingCondition(p, terminator) {
5464
- return p.peek === "\\to" || p.peek === "\\rightarrow" || p.peek === "\\implies" || p.peek === "\\Rightarrow" || p.peek === "\\iff" || p.peek === "\\Leftrightarrow" || p.peek === "\\land" || p.peek === "\\wedge" || p.peek === "\\lor" || p.peek === "\\vee" || (terminator.condition?.(p) ?? false);
5465
- }
5466
- function parseQuantifier(kind) {
5467
- return (parser, terminator) => {
5468
- const index = parser.index;
5469
- const useTightBinding = parser.options.quantifierScope !== "loose";
5470
- const symbol2 = parser.parseSymbol(terminator);
5471
- if (symbol2) {
5472
- parser.skipSpace();
5473
- if (parser.match(",") || parser.match("\\mid") || parser.match(".") || parser.match(":") || parser.match("\\colon")) {
5474
- const bodyTerminator = useTightBinding ? {
5475
- ...terminator,
5476
- condition: (p) => tightBindingCondition(p, terminator)
5477
- } : terminator;
5478
- parser.enterQuantifierScope();
5479
- const body2 = parser.parseExpression(bodyTerminator);
5480
- parser.exitQuantifierScope();
5481
- return [kind, symbol2, missingIfEmpty(body2)];
5482
- }
5483
- parser.enterQuantifierScope();
5484
- const body = parser.parseEnclosure();
5485
- parser.exitQuantifierScope();
5486
- if (body) return [kind, symbol2, missingIfEmpty(body)];
5487
- }
5488
- parser.index = index;
5489
- const condTerminator = {
5490
- ...terminator,
5491
- condition: (p) => p.peek === ":" || p.peek === "\\colon" || (terminator.condition?.(p) ?? false)
5492
- };
5493
- const condition = parser.parseExpression(condTerminator);
5494
- if (condition === null) return null;
5495
- parser.skipSpace();
5496
- if (parser.matchAny([",", "\\mid", ":", "\\colon"])) {
5497
- const bodyTerminator = useTightBinding ? {
5498
- ...terminator,
5499
- condition: (p) => tightBindingCondition(p, terminator)
5500
- } : terminator;
5501
- parser.enterQuantifierScope();
5502
- const body = parser.parseExpression(bodyTerminator);
5503
- parser.exitQuantifierScope();
5504
- return [kind, condition, missingIfEmpty(body)];
5505
- }
5506
- if (parser.match("(")) {
5507
- parser.enterQuantifierScope();
5508
- const body = parser.parseExpression(terminator);
5509
- parser.exitQuantifierScope();
5510
- if (!parser.match(")")) return null;
5511
- return [kind, condition, missingIfEmpty(body)];
5512
- }
5513
- return null;
5514
- };
5515
- }
5516
5668
 
5517
5669
  // src/compute-engine/latex-syntax/dictionary/definitions-sets.ts
5518
5670
  function parseIntervalBody(body, openLeft, openRight) {
@@ -9925,7 +10077,7 @@ var LatexSyntax = (() => {
9925
10077
  var FLAG_SEQUENCE = "\\p{RI}\\p{RI}";
9926
10078
  var TAG_MOD = `(?:[\\u{E0020}-\\u{E007E}]+\\u{E007F})`;
9927
10079
  var EMOJI_MOD = `(?:\\p{EMod}|${VS16}${KEYCAP}?|${TAG_MOD})`;
9928
- var EMOJI_NOT_SYMBOL = `(?:(?=\\P{XIDC})\\p{Emoji})`;
10080
+ var EMOJI_NOT_SYMBOL = `(?:(?=\\P{XIDC})(?=[^\\x23\\x2a\\x30-\\x39])\\p{Emoji})`;
9929
10081
  var ZWJ_ELEMENT = `(?:${EMOJI_NOT_SYMBOL}${EMOJI_MOD}*|\\p{Emoji}${EMOJI_MOD}+|${FLAG_SEQUENCE})`;
9930
10082
  var POSSIBLE_EMOJI = `(?:${ZWJ_ELEMENT})(${ZWJ2}${ZWJ_ELEMENT})*`;
9931
10083
  var SOME_EMOJI = new RegExp(`(?:${POSSIBLE_EMOJI})+`, "u");
@@ -10634,7 +10786,9 @@ var LatexSyntax = (() => {
10634
10786
  }
10635
10787
  return c;
10636
10788
  }
10637
- return parser.nextToken();
10789
+ const raw = parser.peek;
10790
+ if (raw && /^[\p{XIDC}\p{M}]/u.test(raw)) return parser.nextToken();
10791
+ return null;
10638
10792
  }
10639
10793
  function parseSymbolBody(parser) {
10640
10794
  let id = matchPrefixedSymbol(parser);
@@ -13302,6 +13456,29 @@ var LatexSyntax = (() => {
13302
13456
  this.index = start;
13303
13457
  return null;
13304
13458
  }
13459
+ /**
13460
+ * Speculatively check if any \text infix entry (e.g. "and", "or", "where")
13461
+ * would match the upcoming tokens. This is used to prevent InvisibleOperator
13462
+ * from consuming \text{keyword} as a text run when the keyword is actually
13463
+ * an infix operator that was skipped due to precedence constraints.
13464
+ *
13465
+ * Returns true if any entry's parse function would succeed (non-null result).
13466
+ * The parser index is always restored to its original position.
13467
+ */
13468
+ wouldMatchTextInfix(opDefs) {
13469
+ const start = this.index;
13470
+ for (const [def, n] of opDefs) {
13471
+ if (def.kind !== "infix") continue;
13472
+ this.index = start + n;
13473
+ const result = def.parse(this, "Nothing", { minPrec: 0 });
13474
+ if (result !== null) {
13475
+ this.index = start;
13476
+ return true;
13477
+ }
13478
+ }
13479
+ this.index = start;
13480
+ return false;
13481
+ }
13305
13482
  /**
13306
13483
  * This returns an array of arguments (as in a function application),
13307
13484
  * or null if there is no match.
@@ -13927,6 +14104,7 @@ var LatexSyntax = (() => {
13927
14104
  if (isDelimiterCommand(this))
13928
14105
  return this.error("unexpected-delimiter", start);
13929
14106
  if (command[0] !== "\\") {
14107
+ this.nextToken();
13930
14108
  return this.error(
13931
14109
  ["unexpected-token", { str: tokensToString(command) }],
13932
14110
  start
@@ -14055,25 +14233,28 @@ var LatexSyntax = (() => {
14055
14233
  if (result === null && until.minPrec <= INVISIBLE_OP_PRECEDENCE) {
14056
14234
  const opDefs = this.peekDefinitions("operator");
14057
14235
  if (opDefs.length === 0 || opDefs.every(([def]) => def.latexTrigger === "\\text")) {
14058
- const rhs = this.parseExpression({
14059
- ...until,
14060
- minPrec: INVISIBLE_OP_PRECEDENCE + 1
14061
- });
14062
- if (rhs !== null) {
14063
- if (operator(lhs) === "InvisibleOperator") {
14064
- if (operator(rhs) === "InvisibleOperator")
14065
- result = [
14066
- "InvisibleOperator",
14067
- ...operands(lhs),
14068
- ...operands(rhs)
14069
- ];
14070
- else result = ["InvisibleOperator", ...operands(lhs), rhs];
14071
- } else if (operator(rhs) === "InvisibleOperator") {
14072
- result = ["InvisibleOperator", lhs, ...operands(rhs)];
14073
- } else result = ["InvisibleOperator", lhs, rhs];
14236
+ if (opDefs.length > 0 && this.wouldMatchTextInfix(opDefs)) {
14074
14237
  } else {
14075
- if (result === null) {
14076
- result = this.options.parseUnexpectedToken?.(lhs, this) ?? null;
14238
+ const rhs = this.parseExpression({
14239
+ ...until,
14240
+ minPrec: INVISIBLE_OP_PRECEDENCE + 1
14241
+ });
14242
+ if (rhs !== null) {
14243
+ if (operator(lhs) === "InvisibleOperator") {
14244
+ if (operator(rhs) === "InvisibleOperator")
14245
+ result = [
14246
+ "InvisibleOperator",
14247
+ ...operands(lhs),
14248
+ ...operands(rhs)
14249
+ ];
14250
+ else result = ["InvisibleOperator", ...operands(lhs), rhs];
14251
+ } else if (operator(rhs) === "InvisibleOperator") {
14252
+ result = ["InvisibleOperator", lhs, ...operands(rhs)];
14253
+ } else result = ["InvisibleOperator", lhs, rhs];
14254
+ } else {
14255
+ if (result === null) {
14256
+ result = this.options.parseUnexpectedToken?.(lhs, this) ?? null;
14257
+ }
14077
14258
  }
14078
14259
  }
14079
14260
  }
@@ -14996,7 +15177,7 @@ var LatexSyntax = (() => {
14996
15177
  }
14997
15178
 
14998
15179
  // src/latex-syntax.ts
14999
- var version = "0.55.0";
15180
+ var version = "0.55.3";
15000
15181
  return __toCommonJS(latex_syntax_exports);
15001
15182
  })();
15002
15183
  Object.assign(exports, LatexSyntax); Object.defineProperty(exports, '__esModule', { value: true });}));