temml 0.10.21 → 0.10.23

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.
package/dist/temml.js CHANGED
@@ -937,7 +937,8 @@ var temml = (function () {
937
937
  defineSymbol(math, textord, "\u2200", "\\forall", true);
938
938
  defineSymbol(math, textord, "\u210f", "\\hbar", true);
939
939
  defineSymbol(math, textord, "\u2203", "\\exists", true);
940
- defineSymbol(math, textord, "\u2207", "\\nabla", true);
940
+ // is actually a unary operator, not binary. But this works.
941
+ defineSymbol(math, bin, "\u2207", "\\nabla", true);
941
942
  defineSymbol(math, textord, "\u266d", "\\flat", true);
942
943
  defineSymbol(math, textord, "\u2113", "\\ell", true);
943
944
  defineSymbol(math, textord, "\u266e", "\\natural", true);
@@ -991,6 +992,7 @@ var temml = (function () {
991
992
  defineSymbol(math, bin, "\u2240", "\\wr", true);
992
993
  defineSymbol(math, bin, "\u2a3f", "\\amalg");
993
994
  defineSymbol(math, bin, "\u0026", "\\And"); // from amsmath
995
+ defineSymbol(math, bin, "\u2AFD", "\\sslash", true); // from stmaryrd
994
996
 
995
997
  // Arrow Symbols
996
998
  defineSymbol(math, rel, "\u27f5", "\\longleftarrow", true);
@@ -1025,6 +1027,7 @@ var temml = (function () {
1025
1027
  defineSymbol(math, mathord, "\u263c", "\\sun", true);
1026
1028
  defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
1027
1029
  defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
1030
+ defineSymbol(math, mathord, "\u2295", "\\Earth");
1028
1031
 
1029
1032
  // AMS Negated Binary Relations
1030
1033
  defineSymbol(math, rel, "\u226e", "\\nless", true);
@@ -1252,6 +1255,8 @@ var temml = (function () {
1252
1255
  defineSymbol(math, bin, "\u27d6", "\\rightouterjoin", true);
1253
1256
  defineSymbol(math, bin, "\u27d7", "\\fullouterjoin", true);
1254
1257
 
1258
+ defineSymbol(math, bin, "\u2238", "\\dotminus", true); // stix
1259
+
1255
1260
  // AMS Arrows
1256
1261
  // Note: unicode-math maps \u21e2 to their own function \rightdasharrow.
1257
1262
  // We'll map it to AMS function \dashrightarrow. It produces the same atom.
@@ -1409,6 +1414,7 @@ var temml = (function () {
1409
1414
  defineSymbol(math, bin, "\u2217", "\u2217", true);
1410
1415
  defineSymbol(math, bin, "+", "+");
1411
1416
  defineSymbol(math, bin, "*", "*");
1417
+ defineSymbol(math, bin, "\u2044", "/", true);
1412
1418
  defineSymbol(math, bin, "\u2044", "\u2044");
1413
1419
  defineSymbol(math, bin, "\u2212", "-", true);
1414
1420
  defineSymbol(math, bin, "\u22c5", "\\cdot", true);
@@ -1865,7 +1871,8 @@ var temml = (function () {
1865
1871
  continue
1866
1872
  }
1867
1873
  block.push(node);
1868
- if (node.type && node.type === "mo" && node.children.length === 1) {
1874
+ if (node.type && node.type === "mo" && node.children.length === 1 &&
1875
+ !Object.hasOwn(node.attributes, "movablelimits")) {
1869
1876
  const ch = node.children[0].text;
1870
1877
  if (openDelims.indexOf(ch) > -1) {
1871
1878
  level += 1;
@@ -1880,7 +1887,7 @@ var temml = (function () {
1880
1887
  mrows.push(element);
1881
1888
  block = [node];
1882
1889
  }
1883
- } else if (level === 0 && wrapMode === "tex") {
1890
+ } else if (level === 0 && wrapMode === "tex" && ch !== "∇") {
1884
1891
  // Check if the following node is a \nobreak text node, e.g. "~""
1885
1892
  const next = i < expression.length - 1 ? expression[i + 1] : null;
1886
1893
  let glueIsFreeOfNobreak = true;
@@ -2018,9 +2025,11 @@ var temml = (function () {
2018
2025
  };
2019
2026
 
2020
2027
  const numberRegEx$1 = /^[0-9]$/;
2021
- const isCommaOrDot = node => {
2022
- return (node.type === "atom" && node.text === ",") ||
2023
- (node.type === "textord" && node.text === ".")
2028
+ const isDotOrComma = (node, followingNode) => {
2029
+ return ((node.type === "textord" && node.text === ".") ||
2030
+ (node.type === "atom" && node.text === ",")) &&
2031
+ // Don't consolidate if there is a space after the comma.
2032
+ node.loc && followingNode.loc && node.loc.end === followingNode.loc.start
2024
2033
  };
2025
2034
  const consolidateNumbers = expression => {
2026
2035
  // Consolidate adjacent numbers. We want to return <mn>1,506.3</mn>,
@@ -2043,7 +2052,8 @@ var temml = (function () {
2043
2052
 
2044
2053
  // Determine if numeral groups are separated by a comma or dot.
2045
2054
  for (let i = nums.length - 1; i > 0; i--) {
2046
- if (nums[i - 1].end === nums[i].start - 2 && isCommaOrDot(expression[nums[i].start - 1])) {
2055
+ if (nums[i - 1].end === nums[i].start - 2 &&
2056
+ isDotOrComma(expression[nums[i].start - 1], expression[nums[i].start])) {
2047
2057
  // Merge the two groups.
2048
2058
  nums[i - 1].end = nums[i].end;
2049
2059
  nums.splice(i, 1);
@@ -3259,7 +3269,7 @@ var temml = (function () {
3259
3269
  }
3260
3270
 
3261
3271
  // Parse out the implicit body that should be colored.
3262
- const body = parser.parseExpression(true, breakOnTokenText);
3272
+ const body = parser.parseExpression(true, breakOnTokenText, true);
3263
3273
 
3264
3274
  return {
3265
3275
  type: "color",
@@ -3701,17 +3711,13 @@ var temml = (function () {
3701
3711
 
3702
3712
  // Delimiter functions
3703
3713
  function checkDelimiter(delim, context) {
3704
- if (delim.type === "ordgroup" && delim.body.length === 1 && delim.body[0].text === "\u2044") {
3705
- // Recover "/" from the zero spacing group. (See macros.js)
3706
- delim = { type: "textord", text: "/", mode: "math" };
3707
- }
3708
3714
  const symDelim = checkSymbolNodeType(delim);
3709
3715
  if (symDelim && delimiters.includes(symDelim.text)) {
3710
3716
  // If a character is not in the MathML operator dictionary, it will not stretch.
3711
3717
  // Replace such characters w/characters that will stretch.
3718
+ if (["/", "\u2044"].includes(symDelim.text)) { symDelim.text = "\u2215"; }
3712
3719
  if (["<", "\\lt"].includes(symDelim.text)) { symDelim.text = "⟨"; }
3713
3720
  if ([">", "\\gt"].includes(symDelim.text)) { symDelim.text = "⟩"; }
3714
- if (symDelim.text === "/") { symDelim.text = "\u2215"; }
3715
3721
  if (symDelim.text === "\\backslash") { symDelim.text = "\u2216"; }
3716
3722
  return symDelim;
3717
3723
  } else if (symDelim) {
@@ -3820,8 +3826,26 @@ var temml = (function () {
3820
3826
  const parser = context.parser;
3821
3827
  // Parse out the implicit body
3822
3828
  ++parser.leftrightDepth;
3823
- // parseExpression stops before '\\right'
3824
- const body = parser.parseExpression(false);
3829
+ // parseExpression stops before '\\right' or `\\middle`
3830
+ let body = parser.parseExpression(false, null, true);
3831
+ let nextToken = parser.fetch();
3832
+ while (nextToken.text === "\\middle") {
3833
+ // `\middle`, from the ε-TeX package, ends one group and starts another group.
3834
+ // We had to parse this expression with `breakOnMiddle` enabled in order
3835
+ // to get TeX-compliant parsing of \over.
3836
+ // But we do not want, at this point, to end on \middle, so continue
3837
+ // to parse until we fetch a `\right`.
3838
+ parser.consume();
3839
+ const middle = parser.fetch().text;
3840
+ if (!symbols.math[middle]) {
3841
+ throw new ParseError(`Invalid delimiter '${middle}' after '\\middle'`);
3842
+ }
3843
+ checkDelimiter({ type: "atom", mode: "math", text: middle }, { funcName: "\\middle" });
3844
+ body.push({ type: "middle", mode: "math", delim: middle });
3845
+ parser.consume();
3846
+ body = body.concat(parser.parseExpression(false, null, true));
3847
+ nextToken = parser.fetch();
3848
+ }
3825
3849
  --parser.leftrightDepth;
3826
3850
  // Check the next token
3827
3851
  parser.expect("\\right", false);
@@ -5095,6 +5119,21 @@ var temml = (function () {
5095
5119
  }
5096
5120
  });
5097
5121
 
5122
+ const isLongVariableName = (group, font) => {
5123
+ if (font !== "mathrm" || group.body.type !== "ordgroup" || group.body.body.length === 1) {
5124
+ return false
5125
+ }
5126
+ if (group.body.body[0].type !== "mathord") { return false }
5127
+ for (let i = 1; i < group.body.body.length; i++) {
5128
+ const parseNodeType = group.body.body[i].type;
5129
+ if (!(parseNodeType === "mathord" ||
5130
+ (parseNodeType === "textord" && !isNaN(group.body.body[i].text)))) {
5131
+ return false
5132
+ }
5133
+ }
5134
+ return true
5135
+ };
5136
+
5098
5137
  const mathmlBuilder$6 = (group, style) => {
5099
5138
  const font = group.font;
5100
5139
  const newStyle = style.withFont(font);
@@ -5106,6 +5145,20 @@ var temml = (function () {
5106
5145
  return mathGroup
5107
5146
  }
5108
5147
  // Check if it is possible to consolidate elements into a single <mi> element.
5148
+ if (isLongVariableName(group, font)) {
5149
+ // This is a \mathrm{…} group. It gets special treatment because symbolsOrd.js
5150
+ // wraps <mi> elements with <mrow>s to work around a Firefox bug.
5151
+ const mi = mathGroup.children[0].children[0];
5152
+ delete mi.attributes.mathvariant;
5153
+ for (let i = 1; i < mathGroup.children.length; i++) {
5154
+ mi.children[0].text += mathGroup.children[i].type === "mn"
5155
+ ? mathGroup.children[i].children[0].text
5156
+ : mathGroup.children[i].children[0].children[0].text;
5157
+ }
5158
+ // Wrap in a <mrow> to prevent the same Firefox bug.
5159
+ const bogus = new mathMLTree.MathNode("mtext", new mathMLTree.TextNode("\u200b"));
5160
+ return new mathMLTree.MathNode("mrow", [bogus, mi])
5161
+ }
5109
5162
  let canConsolidate = mathGroup.children[0].type === "mo";
5110
5163
  for (let i = 1; i < mathGroup.children.length; i++) {
5111
5164
  if (mathGroup.children[i].type === "mo" && font === "boldsymbol") {
@@ -5196,7 +5249,7 @@ var temml = (function () {
5196
5249
  },
5197
5250
  handler: ({ parser, funcName, breakOnTokenText }, args) => {
5198
5251
  const { mode } = parser;
5199
- const body = parser.parseExpression(true, breakOnTokenText);
5252
+ const body = parser.parseExpression(true, breakOnTokenText, true);
5200
5253
  const fontStyle = `math${funcName.slice(1)}`;
5201
5254
 
5202
5255
  return {
@@ -6157,6 +6210,9 @@ var temml = (function () {
6157
6210
  if (group.isCharacterBox || inner[0].type === "mathord") {
6158
6211
  node = inner[0];
6159
6212
  node.type = "mi";
6213
+ if (node.children.length === 1 && node.children[0].text && node.children[0].text === "∇") {
6214
+ node.setAttribute("mathvariant", "normal");
6215
+ }
6160
6216
  } else {
6161
6217
  node = new mathMLTree.MathNode("mi", inner);
6162
6218
  }
@@ -7144,6 +7200,28 @@ var temml = (function () {
7144
7200
  }
7145
7201
  });
7146
7202
 
7203
+ defineFunction({
7204
+ type: "reflect",
7205
+ names: ["\\reflectbox"],
7206
+ props: {
7207
+ numArgs: 1,
7208
+ argTypes: ["hbox"],
7209
+ allowedInText: true
7210
+ },
7211
+ handler({ parser }, args) {
7212
+ return {
7213
+ type: "reflect",
7214
+ mode: parser.mode,
7215
+ body: args[0]
7216
+ };
7217
+ },
7218
+ mathmlBuilder(group, style) {
7219
+ const node = buildGroup$1(group.body, style);
7220
+ node.style.transform = "scaleX(-1)";
7221
+ return node
7222
+ }
7223
+ });
7224
+
7147
7225
  defineFunction({
7148
7226
  type: "internal",
7149
7227
  names: ["\\relax"],
@@ -7249,7 +7327,7 @@ var temml = (function () {
7249
7327
  // eslint-disable-next-line no-console
7250
7328
  console.log(`Temml strict-mode warning: Command ${funcName} is invalid in math mode.`);
7251
7329
  }
7252
- const body = parser.parseExpression(false, breakOnTokenText);
7330
+ const body = parser.parseExpression(false, breakOnTokenText, true);
7253
7331
  return {
7254
7332
  type: "sizing",
7255
7333
  mode: parser.mode,
@@ -7382,7 +7460,7 @@ var temml = (function () {
7382
7460
  },
7383
7461
  handler({ breakOnTokenText, funcName, parser }, args) {
7384
7462
  // parse out the implicit body
7385
- const body = parser.parseExpression(true, breakOnTokenText);
7463
+ const body = parser.parseExpression(true, breakOnTokenText, true);
7386
7464
 
7387
7465
  const scriptLevel = funcName.slice(1, funcName.length - 5);
7388
7466
  return {
@@ -7813,22 +7891,22 @@ var temml = (function () {
7813
7891
  "sans-serif-bold-italic": ch => { return 0x1D5F5 },
7814
7892
  "monospace": ch => { return 0x1D629 }
7815
7893
  },
7816
- upperCaseGreek: { // A-Ω
7894
+ upperCaseGreek: { // A-Ω
7817
7895
  "normal": ch => { return 0 },
7818
- "bold": ch => { return ch === "∇" ? 0x1B4BA : 0x1D317 },
7819
- "italic": ch => { return ch === "∇" ? 0x1B4F4 : 0x1D351 },
7896
+ "bold": ch => { return 0x1D317 },
7897
+ "italic": ch => { return 0x1D351 },
7820
7898
  // \boldsymbol actually returns upright bold for upperCaseGreek
7821
- "bold-italic": ch => { return ch === "∇" ? 0x1B4BA : 0x1D317 },
7899
+ "bold-italic": ch => { return 0x1D317 },
7822
7900
  "script": ch => { return 0 },
7823
7901
  "script-bold": ch => { return 0 },
7824
7902
  "fraktur": ch => { return 0 },
7825
7903
  "fraktur-bold": ch => { return 0 },
7826
7904
  "double-struck": ch => { return 0 },
7827
7905
  // Unicode has no code points for regular-weight san-serif Greek. Use bold.
7828
- "sans-serif": ch => { return ch === "∇" ? 0x1B568 : 0x1D3C5 },
7829
- "sans-serif-bold": ch => { return ch === "∇" ? 0x1B568 : 0x1D3C5 },
7906
+ "sans-serif": ch => { return 0x1D3C5 },
7907
+ "sans-serif-bold": ch => { return 0x1D3C5 },
7830
7908
  "sans-serif-italic": ch => { return 0 },
7831
- "sans-serif-bold-italic": ch => { return ch === "∇" ? 0x1B5A2 : 0x1D3FF },
7909
+ "sans-serif-bold-italic": ch => { return 0x1D3FF },
7832
7910
  "monospace": ch => { return 0 }
7833
7911
  },
7834
7912
  lowerCaseGreek: { // α-ω
@@ -7888,7 +7966,7 @@ var temml = (function () {
7888
7966
  ? "upperCaseLatin"
7889
7967
  : 0x60 < codePoint && codePoint < 0x7b
7890
7968
  ? "lowerCaseLatin"
7891
- : (0x390 < codePoint && codePoint < 0x3AA) || ch === "∇"
7969
+ : (0x390 < codePoint && codePoint < 0x3AA)
7892
7970
  ? "upperCaseGreek"
7893
7971
  : 0x3B0 < codePoint && codePoint < 0x3CA || ch === "\u03d5"
7894
7972
  ? "lowerCaseGreek"
@@ -8017,8 +8095,6 @@ var temml = (function () {
8017
8095
  node = new mathMLTree.MathNode("mi", [text]);
8018
8096
  if (text.text === origText && latinRegEx.test(origText)) {
8019
8097
  node.setAttribute("mathvariant", "italic");
8020
- } else if (text.text === "∇" && variant === "normal") {
8021
- node.setAttribute("mathvariant", "normal");
8022
8098
  }
8023
8099
  }
8024
8100
  return node
@@ -8655,6 +8731,24 @@ var temml = (function () {
8655
8731
  return `\\@char{${number}}`;
8656
8732
  });
8657
8733
 
8734
+ function recreateArgStr(context) {
8735
+ // Recreate the macro's original argument string from the array of parse tokens.
8736
+ const tokens = context.consumeArgs(1)[0];
8737
+ let str = "";
8738
+ let expectedLoc = tokens[tokens.length - 1].loc.start;
8739
+ for (let i = tokens.length - 1; i >= 0; i--) {
8740
+ const actualLoc = tokens[i].loc.start;
8741
+ if (actualLoc > expectedLoc) {
8742
+ // context.consumeArgs has eaten a space.
8743
+ str += " ";
8744
+ expectedLoc = actualLoc;
8745
+ }
8746
+ str += tokens[i].text;
8747
+ expectedLoc += tokens[i].text.length;
8748
+ }
8749
+ return str
8750
+ }
8751
+
8658
8752
  // The Latin Modern font renders <mi>√</mi> at the wrong vertical alignment.
8659
8753
  // This macro provides a better rendering.
8660
8754
  defineMacro("\\surd", '\\sqrt{\\vphantom{|}}');
@@ -8662,10 +8756,6 @@ var temml = (function () {
8662
8756
  // See comment for \oplus in symbols.js.
8663
8757
  defineMacro("\u2295", "\\oplus");
8664
8758
 
8665
- // Per TeXbook p.122, "/" gets zero operator spacing.
8666
- // And MDN recommends using U+2044 instead of / for inline
8667
- defineMacro("/", "{\u2044}");
8668
-
8669
8759
  // Since Temml has no \par, ignore \long.
8670
8760
  defineMacro("\\long", "");
8671
8761
 
@@ -9043,6 +9133,11 @@ var temml = (function () {
9043
9133
  defineMacro("\\argmax", "\\DOTSB\\operatorname*{arg\\,max}");
9044
9134
  defineMacro("\\plim", "\\DOTSB\\operatorname*{plim}");
9045
9135
 
9136
+ //////////////////////////////////////////////////////////////////////
9137
+ // MnSymbol.sty
9138
+
9139
+ defineMacro("\\leftmodels", "\\mathop{\\reflectbox{$\\models$}}");
9140
+
9046
9141
  //////////////////////////////////////////////////////////////////////
9047
9142
  // braket.sty
9048
9143
  // http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf
@@ -9052,56 +9147,33 @@ var temml = (function () {
9052
9147
  defineMacro("\\braket", "\\mathinner{\\langle{#1}\\rangle}");
9053
9148
  defineMacro("\\Bra", "\\left\\langle#1\\right|");
9054
9149
  defineMacro("\\Ket", "\\left|#1\\right\\rangle");
9055
- const braketHelper = (one) => (context) => {
9056
- const left = context.consumeArg().tokens;
9057
- const middle = context.consumeArg().tokens;
9058
- const middleDouble = context.consumeArg().tokens;
9059
- const right = context.consumeArg().tokens;
9060
- const oldMiddle = context.macros.get("|");
9061
- const oldMiddleDouble = context.macros.get("\\|");
9062
- context.macros.beginGroup();
9063
- const midMacro = (double) => (context) => {
9064
- if (one) {
9065
- // Only modify the first instance of | or \|
9066
- context.macros.set("|", oldMiddle);
9067
- if (middleDouble.length) {
9068
- context.macros.set("\\|", oldMiddleDouble);
9069
- }
9070
- }
9071
- let doubled = double;
9072
- if (!double && middleDouble.length) {
9073
- // Mimic \@ifnextchar
9074
- const nextToken = context.future();
9075
- if (nextToken.text === "|") {
9076
- context.popToken();
9077
- doubled = true;
9078
- }
9079
- }
9080
- return {
9081
- tokens: doubled ? middleDouble : middle,
9082
- numArgs: 0
9083
- };
9084
- };
9085
- context.macros.set("|", midMacro(false));
9086
- if (middleDouble.length) {
9087
- context.macros.set("\\|", midMacro(true));
9088
- }
9089
- const arg = context.consumeArg().tokens;
9090
- const expanded = context.expandTokens([...right, ...arg, ...left]); // reversed
9091
- context.macros.endGroup();
9092
- return {
9093
- tokens: expanded.reverse(),
9094
- numArgs: 0
9095
- };
9150
+ // A helper for \Braket and \Set
9151
+ const replaceVert = (argStr, match) => {
9152
+ const ch = match[0] === "|" ? "\\vert" : "\\Vert";
9153
+ const replaceStr = `}\\,\\middle${ch}\\,{`;
9154
+ return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length)
9096
9155
  };
9097
- defineMacro("\\bra@ket", braketHelper(false));
9098
- defineMacro("\\bra@set", braketHelper(true));
9099
- defineMacro("\\Braket", "\\bra@ket{\\left\\langle}" +
9100
- "{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}");
9101
- defineMacro("\\Set", "\\bra@set{\\left\\{\\:}" +
9102
- "{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}");
9103
- defineMacro("\\set", "\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}");
9104
- // has no support for special || or \|
9156
+ defineMacro("\\Braket", function(context) {
9157
+ let argStr = recreateArgStr(context);
9158
+ const regEx = /\|\||\||\\\|/g;
9159
+ let match;
9160
+ while ((match = regEx.exec(argStr)) !== null) {
9161
+ argStr = replaceVert(argStr, match);
9162
+ }
9163
+ return "\\left\\langle{" + argStr + "}\\right\\rangle"
9164
+ });
9165
+ defineMacro("\\Set", function(context) {
9166
+ let argStr = recreateArgStr(context);
9167
+ const match = /\|\||\||\\\|/.exec(argStr);
9168
+ if (match) {
9169
+ argStr = replaceVert(argStr, match);
9170
+ }
9171
+ return "\\left\\{\\:{" + argStr + "}\\:\\right\\}"
9172
+ });
9173
+ defineMacro("\\set", function(context) {
9174
+ const argStr = recreateArgStr(context);
9175
+ return "\\{{" + argStr.replace(/\|/, "}\\mid{") + "}\\}"
9176
+ });
9105
9177
 
9106
9178
  //////////////////////////////////////////////////////////////////////
9107
9179
  // actuarialangle.dtx
@@ -10250,8 +10322,12 @@ var temml = (function () {
10250
10322
  * `breakOnTokenText`: The text of the token that the expression should end
10251
10323
  * with, or `null` if something else should end the
10252
10324
  * expression.
10325
+ *
10326
+ * `breakOnMiddle`: \color, \over, and old styling functions work on an implicit group.
10327
+ * These groups end just before the usual tokens, but they also
10328
+ * end just before `\middle`.
10253
10329
  */
10254
- parseExpression(breakOnInfix, breakOnTokenText) {
10330
+ parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) {
10255
10331
  const body = [];
10256
10332
  // Keep adding atoms to the body until we can't parse any more atoms (either
10257
10333
  // we reached the end, a }, or a \right)
@@ -10267,6 +10343,9 @@ var temml = (function () {
10267
10343
  if (breakOnTokenText && lex.text === breakOnTokenText) {
10268
10344
  break;
10269
10345
  }
10346
+ if (breakOnMiddle && lex.text === "\\middle") {
10347
+ break
10348
+ }
10270
10349
  if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {
10271
10350
  break;
10272
10351
  }
@@ -11245,7 +11324,7 @@ var temml = (function () {
11245
11324
  * https://mit-license.org/
11246
11325
  */
11247
11326
 
11248
- const version = "0.10.21";
11327
+ const version = "0.10.23";
11249
11328
 
11250
11329
  function postProcess(block) {
11251
11330
  const labelMap = {};