temml 0.10.12 → 0.10.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -38,6 +38,10 @@ math {
38
38
  font-family: Asana Math, math;
39
39
  }
40
40
 
41
+ /* Next line is active in Firefox and Safari.
42
+ * Not in Chromium, which recognizes display: "block math" written inline. */
43
+ math.tml-display { display: block; }
44
+
41
45
  *.mathcal,
42
46
  mo.tml-prime {
43
47
  font-feature-settings: 'salt';
@@ -54,7 +58,7 @@ math > mrow {
54
58
  }
55
59
 
56
60
  /* Avoid flex-wrap in Firefox */
57
- @supports (-moz-appearance:meterbar) and (display:flex) {
61
+ @-moz-document url-prefix() {
58
62
  math { display: inline; }
59
63
  math > mrow { padding: 0 }
60
64
  }
@@ -179,7 +183,7 @@ mtr.tml-hline-dashed > mtd {
179
183
 
180
184
  /* MathML-Core does not support <menclose> attributes.
181
185
  * So Use background images for \cancel */
182
- menclose.cancel {
186
+ mrow.cancel {
183
187
  background:
184
188
  linear-gradient(to top left,
185
189
  rgba(0,0,0,0) 0%,
@@ -189,7 +193,7 @@ menclose.cancel {
189
193
  rgba(0,0,0,0) 100%);
190
194
  }
191
195
 
192
- menclose.bcancel {
196
+ mrow.bcancel {
193
197
  background:
194
198
  linear-gradient(to top right,
195
199
  rgba(0,0,0,0) 0%,
@@ -199,7 +203,7 @@ menclose.bcancel {
199
203
  rgba(0,0,0,0) 100%);
200
204
  }
201
205
 
202
- menclose.xcancel {
206
+ mrow.xcancel {
203
207
  background:
204
208
  linear-gradient(to top left,
205
209
  rgba(0,0,0,0) 0%,
@@ -44,6 +44,10 @@ math {
44
44
  font-family: "Latin Modern Math", "Times New Roman", math;
45
45
  }
46
46
 
47
+ /* Next line is active in Firefox and Safari.
48
+ * Not in Chromium, which recognizes display: "block math" written inline. */
49
+ math.tml-display { display: block; }
50
+
47
51
  *.mathscr {
48
52
  font-family: "Temml";
49
53
  }
@@ -63,7 +67,7 @@ math > mrow {
63
67
  }
64
68
 
65
69
  /* Avoid flex-wrap in Firefox */
66
- @supports (-moz-appearance:meterbar) and (display:flex) {
70
+ @-moz-document url-prefix() {
67
71
  math { display: inline; }
68
72
  math > mrow { padding: 0 }
69
73
  }
@@ -189,7 +193,7 @@ mtr.tml-hline-dashed > mtd {
189
193
 
190
194
  /* MathML-Core does not support <menclose> attributes.
191
195
  * So Use background images for \cancel */
192
- menclose.cancel {
196
+ mrow.cancel {
193
197
  background:
194
198
  linear-gradient(to top left,
195
199
  rgba(0,0,0,0) 0%,
@@ -199,7 +203,7 @@ menclose.cancel {
199
203
  rgba(0,0,0,0) 100%);
200
204
  }
201
205
 
202
- menclose.bcancel {
206
+ mrow.bcancel {
203
207
  background:
204
208
  linear-gradient(to top right,
205
209
  rgba(0,0,0,0) 0%,
@@ -209,7 +213,7 @@ menclose.bcancel {
209
213
  rgba(0,0,0,0) 100%);
210
214
  }
211
215
 
212
- menclose.xcancel {
216
+ mrow.xcancel {
213
217
  background:
214
218
  linear-gradient(to top left,
215
219
  rgba(0,0,0,0) 0%,
@@ -42,6 +42,10 @@ math {
42
42
  font-family: Libertinus Math, math;
43
43
  }
44
44
 
45
+ /* Next line is active in Firefox and Safari.
46
+ * Not in Chromium, which recognizes display: "block math" written inline. */
47
+ math.tml-display { display: block; }
48
+
45
49
  *.mathcal {
46
50
  font-family: "Cambria Math", 'STIXTwoMath-Regular', "Times New Roman", math;
47
51
  }
@@ -61,7 +65,7 @@ math > mrow {
61
65
  }
62
66
 
63
67
  /* Avoid flex-wrap in Firefox */
64
- @supports (-moz-appearance:meterbar) and (display:flex) {
68
+ @-moz-document url-prefix() {
65
69
  math { display: inline; }
66
70
  math > mrow { padding: 0 }
67
71
  }
@@ -187,7 +191,7 @@ mtr.tml-hline-dashed > mtd {
187
191
 
188
192
  /* MathML-Core does not support <menclose> attributes.
189
193
  * So Use background images for \cancel */
190
- menclose.cancel {
194
+ mrow.cancel {
191
195
  background:
192
196
  linear-gradient(to top left,
193
197
  rgba(0,0,0,0) 0%,
@@ -197,7 +201,7 @@ menclose.cancel {
197
201
  rgba(0,0,0,0) 100%);
198
202
  }
199
203
 
200
- menclose.bcancel {
204
+ mrow.bcancel {
201
205
  background:
202
206
  linear-gradient(to top right,
203
207
  rgba(0,0,0,0) 0%,
@@ -207,7 +211,7 @@ menclose.bcancel {
207
211
  rgba(0,0,0,0) 100%);
208
212
  }
209
213
 
210
- menclose.xcancel {
214
+ mrow.xcancel {
211
215
  background:
212
216
  linear-gradient(to top left,
213
217
  rgba(0,0,0,0) 0%,
@@ -28,6 +28,10 @@ math * {
28
28
  border-color: currentColor;
29
29
  }
30
30
 
31
+ /* Next line is active in Firefox and Safari.
32
+ * Not in Chromium, which recognizes display: "block math" written inline. */
33
+ math.tml-display { display: block; }
34
+
31
35
  math .mathscr {
32
36
  font-family: "Temml";
33
37
  }
@@ -47,7 +51,7 @@ math > mrow {
47
51
  }
48
52
 
49
53
  /* Avoid flex-wrap in Firefox */
50
- @supports (-moz-appearance:meterbar) and (display:flex) {
54
+ @-moz-document url-prefix() {
51
55
  math { display: inline; }
52
56
  math > mrow { padding: 0 }
53
57
  }
@@ -172,7 +176,7 @@ mtr.tml-hline-dashed > mtd {
172
176
 
173
177
  /* MathML-Core does not support <menclose> attributes.
174
178
  * So Use background images for \cancel */
175
- menclose.cancel {
179
+ mrow.cancel {
176
180
  background:
177
181
  linear-gradient(to top left,
178
182
  rgba(0,0,0,0) 0%,
@@ -182,7 +186,7 @@ menclose.cancel {
182
186
  rgba(0,0,0,0) 100%);
183
187
  }
184
188
 
185
- menclose.bcancel {
189
+ mrow.bcancel {
186
190
  background:
187
191
  linear-gradient(to top right,
188
192
  rgba(0,0,0,0) 0%,
@@ -192,7 +196,7 @@ menclose.bcancel {
192
196
  rgba(0,0,0,0) 100%);
193
197
  }
194
198
 
195
- menclose.xcancel {
199
+ mrow.xcancel {
196
200
  background:
197
201
  linear-gradient(to top left,
198
202
  rgba(0,0,0,0) 0%,
@@ -28,6 +28,10 @@ math * {
28
28
  border-color: currentColor;
29
29
  }
30
30
 
31
+ /* Next line is active in Firefox and Safari.
32
+ * Not in Chromium, which recognizes display: "block math" written inline. */
33
+ math.tml-display { display: block; }
34
+
31
35
  mtext {
32
36
  font-family: STIX2;
33
37
  }
@@ -55,7 +59,7 @@ math > mrow {
55
59
  }
56
60
 
57
61
  /* Avoid flex-wrap in Firefox */
58
- @supports (-moz-appearance:meterbar) and (display:flex) {
62
+ @-moz-document url-prefix() {
59
63
  math { display: inline; }
60
64
  math > mrow { padding: 0 }
61
65
  }
@@ -180,7 +184,7 @@ mtr.tml-hline-dashed > mtd {
180
184
 
181
185
  /* MathML-Core does not support <menclose> attributes.
182
186
  * So Use background images for \cancel */
183
- menclose.cancel {
187
+ mrow.cancel {
184
188
  background:
185
189
  linear-gradient(to top left,
186
190
  rgba(0,0,0,0) 0%,
@@ -190,7 +194,7 @@ menclose.cancel {
190
194
  rgba(0,0,0,0) 100%);
191
195
  }
192
196
 
193
- menclose.bcancel {
197
+ mrow.bcancel {
194
198
  background:
195
199
  linear-gradient(to top right,
196
200
  rgba(0,0,0,0) 0%,
@@ -200,7 +204,7 @@ menclose.bcancel {
200
204
  rgba(0,0,0,0) 100%);
201
205
  }
202
206
 
203
- menclose.xcancel {
207
+ mrow.xcancel {
204
208
  background:
205
209
  linear-gradient(to top left,
206
210
  rgba(0,0,0,0) 0%,
package/dist/temml.cjs CHANGED
@@ -970,6 +970,7 @@ defineSymbol(math, rel, "\u21c1", "\\rightharpoondown", true);
970
970
  defineSymbol(math, rel, "\u2196", "\\nwarrow", true);
971
971
  defineSymbol(math, rel, "\u21cc", "\\rightleftharpoons", true);
972
972
  defineSymbol(math, mathord, "\u21af", "\\lightning", true);
973
+ defineSymbol(math, mathord, "\u220E", "\\QED", true);
973
974
  defineSymbol(math, mathord, "\u2030", "\\permil", true);
974
975
  defineSymbol(text, textord, "\u2030", "\\permil");
975
976
 
@@ -1116,6 +1117,7 @@ defineSymbol(math, rel, "\u2ab7", "\\precapprox", true);
1116
1117
  defineSymbol(math, rel, "\u22b2", "\\vartriangleleft");
1117
1118
  defineSymbol(math, rel, "\u22b4", "\\trianglelefteq");
1118
1119
  defineSymbol(math, rel, "\u22a8", "\\vDash", true);
1120
+ defineSymbol(math, rel, "\u22ab", "\\VDash", true);
1119
1121
  defineSymbol(math, rel, "\u22aa", "\\Vvdash", true);
1120
1122
  defineSymbol(math, rel, "\u2323", "\\smallsmile");
1121
1123
  defineSymbol(math, rel, "\u2322", "\\smallfrown");
@@ -1765,13 +1767,16 @@ for (let i = 0; i < 10; i++) {
1765
1767
  * much of this module.
1766
1768
  */
1767
1769
 
1770
+ const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃";
1771
+ const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄";
1772
+
1768
1773
  function setLineBreaks(expression, wrapMode, isDisplayMode) {
1769
1774
  const mtrs = [];
1770
1775
  let mrows = [];
1771
1776
  let block = [];
1772
1777
  let numTopLevelEquals = 0;
1773
- let canBeBIN = false; // The first node cannot be an infix binary operator.
1774
1778
  let i = 0;
1779
+ let level = 0;
1775
1780
  while (i < expression.length) {
1776
1781
  while (expression[i] instanceof DocumentFragment) {
1777
1782
  expression.splice(i, 1, ...expression[i].children); // Expand the fragment.
@@ -1794,7 +1799,12 @@ function setLineBreaks(expression, wrapMode, isDisplayMode) {
1794
1799
  }
1795
1800
  block.push(node);
1796
1801
  if (node.type && node.type === "mo" && node.children.length === 1) {
1797
- if (wrapMode === "=" && node.children[0].text === "=") {
1802
+ const ch = node.children[0].text;
1803
+ if (openDelims.indexOf(ch) > -1) {
1804
+ level += 1;
1805
+ } else if (closeDelims.indexOf(ch) > -1) {
1806
+ level -= 1;
1807
+ } else if (level === 0 && wrapMode === "=" && ch === "=") {
1798
1808
  numTopLevelEquals += 1;
1799
1809
  if (numTopLevelEquals > 1) {
1800
1810
  block.pop();
@@ -1803,59 +1813,48 @@ function setLineBreaks(expression, wrapMode, isDisplayMode) {
1803
1813
  mrows.push(element);
1804
1814
  block = [node];
1805
1815
  }
1806
- } else if (wrapMode === "tex") {
1807
- // This may be a place for a soft line break.
1808
- if (canBeBIN && !node.attributes.form) {
1809
- // Check if the following node is a \nobreak text node, e.g. "~""
1810
- const next = i < expression.length - 1 ? expression[i + 1] : null;
1811
- let glueIsFreeOfNobreak = true;
1812
- if (
1813
- !(
1814
- next &&
1815
- next.type === "mtext" &&
1816
- next.attributes.linebreak &&
1817
- next.attributes.linebreak === "nobreak"
1818
- )
1819
- ) {
1820
- // We may need to start a new block.
1821
- // First, put any post-operator glue on same line as operator.
1822
- for (let j = i + 1; j < expression.length; j++) {
1823
- const nd = expression[j];
1816
+ } else if (level === 0 && wrapMode === "tex") {
1817
+ // Check if the following node is a \nobreak text node, e.g. "~""
1818
+ const next = i < expression.length - 1 ? expression[i + 1] : null;
1819
+ let glueIsFreeOfNobreak = true;
1820
+ if (
1821
+ !(
1822
+ next &&
1823
+ next.type === "mtext" &&
1824
+ next.attributes.linebreak &&
1825
+ next.attributes.linebreak === "nobreak"
1826
+ )
1827
+ ) {
1828
+ // We may need to start a new block.
1829
+ // First, put any post-operator glue on same line as operator.
1830
+ for (let j = i + 1; j < expression.length; j++) {
1831
+ const nd = expression[j];
1832
+ if (
1833
+ nd.type &&
1834
+ nd.type === "mspace" &&
1835
+ !(nd.attributes.linebreak && nd.attributes.linebreak === "newline")
1836
+ ) {
1837
+ block.push(nd);
1838
+ i += 1;
1824
1839
  if (
1825
- nd.type &&
1826
- nd.type === "mspace" &&
1827
- !(nd.attributes.linebreak && nd.attributes.linebreak === "newline")
1840
+ nd.attributes &&
1841
+ nd.attributes.linebreak &&
1842
+ nd.attributes.linebreak === "nobreak"
1828
1843
  ) {
1829
- block.push(nd);
1830
- i += 1;
1831
- if (
1832
- nd.attributes &&
1833
- nd.attributes.linebreak &&
1834
- nd.attributes.linebreak === "nobreak"
1835
- ) {
1836
- glueIsFreeOfNobreak = false;
1837
- }
1838
- } else {
1839
- break;
1844
+ glueIsFreeOfNobreak = false;
1840
1845
  }
1846
+ } else {
1847
+ break;
1841
1848
  }
1842
1849
  }
1843
- if (glueIsFreeOfNobreak) {
1844
- // Start a new block. (Insert a soft linebreak.)
1845
- const element = new mathMLTree.MathNode("mrow", block);
1846
- mrows.push(element);
1847
- block = [];
1848
- }
1849
- canBeBIN = false;
1850
1850
  }
1851
- const isOpenDelimiter = node.attributes.form && node.attributes.form === "prefix";
1852
- // Any operator that follows an open delimiter is unary.
1853
- canBeBIN = !(node.attributes.separator || isOpenDelimiter);
1854
- } else {
1855
- canBeBIN = true;
1851
+ if (glueIsFreeOfNobreak) {
1852
+ // Start a new block. (Insert a soft linebreak.)
1853
+ const element = new mathMLTree.MathNode("mrow", block);
1854
+ mrows.push(element);
1855
+ block = [];
1856
+ }
1856
1857
  }
1857
- } else {
1858
- canBeBIN = true;
1859
1858
  }
1860
1859
  i += 1;
1861
1860
  }
@@ -2134,7 +2133,10 @@ function buildMathML(tree, texExpression, style, settings) {
2134
2133
  math.setAttribute("display", "block");
2135
2134
  math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
2136
2135
  ? "inline"
2137
- : "block math";
2136
+ : "block math"; // necessary in Chromium.
2137
+ // Firefox and Safari do not recognize display: "block math".
2138
+ // Set a class so that the CSS file can set display: block.
2139
+ math.classes = ["tml-display"];
2138
2140
  }
2139
2141
  return math;
2140
2142
  }
@@ -2418,43 +2420,69 @@ const paddedNode = (group, lspace = 0.3, rspace = 0) => {
2418
2420
  return new mathMLTree.MathNode("mrow", row)
2419
2421
  };
2420
2422
 
2421
- const labelSize = (size, scriptLevel) => (size / emScale(scriptLevel)).toFixed(4);
2423
+ const labelSize = (size, scriptLevel) => Number(size) / emScale(scriptLevel);
2422
2424
 
2423
- const munderoverNode = (name, body, below, style) => {
2424
- const arrowNode = stretchy.mathMLnode(name);
2425
+ const munderoverNode = (fName, body, below, style) => {
2426
+ const arrowNode = stretchy.mathMLnode(fName);
2425
2427
  // Is this the short part of a mhchem equilibrium arrow?
2426
- const isEq = name.slice(1, 3) === "eq";
2427
- const minWidth = name.charAt(1) === "x"
2428
- ? "1.75" // mathtools extensible arrows are 1.75em long
2429
- : name.slice(2, 4) === "cd"
2428
+ const isEq = fName.slice(1, 3) === "eq";
2429
+ const minWidth = fName.charAt(1) === "x"
2430
+ ? "1.75" // mathtools extensible arrows are 1.75em long
2431
+ : fName.slice(2, 4) === "cd"
2430
2432
  ? "3.0" // cd package arrows
2431
2433
  : isEq
2432
2434
  ? "1.0" // The shorter harpoon of a mhchem equilibrium arrow
2433
2435
  : "2.0"; // other mhchem arrows
2434
- arrowNode.setAttribute("minsize", String(minWidth) + "em");
2436
+ // TODO: When Firefox supports minsize, use the next line.
2437
+ //arrowNode.setAttribute("minsize", String(minWidth) + "em")
2435
2438
  arrowNode.setAttribute("lspace", "0");
2436
2439
  arrowNode.setAttribute("rspace", (isEq ? "0.5em" : "0"));
2437
2440
 
2438
2441
  // <munderover> upper and lower labels are set to scriptlevel by MathML
2439
- // So we have to adjust our dimensions accordingly.
2442
+ // So we have to adjust our label dimensions accordingly.
2440
2443
  const labelStyle = style.withLevel(style.level < 2 ? 2 : 3);
2441
- const emptyLabelWidth = labelSize(minWidth, labelStyle.level);
2442
- const lspace = labelSize((isEq ? 0 : 0.3), labelStyle.level);
2443
- const rspace = labelSize((isEq ? 0 : 0.3), labelStyle.level);
2444
-
2445
- const upperNode = (body && body.body &&
2444
+ const minArrowWidth = labelSize(minWidth, labelStyle.level);
2445
+ // The dummyNode will be inside a <mover> inside a <mover>
2446
+ // So it will be at scriptlevel 3
2447
+ const dummyWidth = labelSize(minWidth, 3);
2448
+ const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0);
2449
+ const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0);
2450
+ // The arrow is a little longer than the label. Set a spacer length.
2451
+ const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4);
2452
+ let upperNode;
2453
+ let lowerNode;
2454
+
2455
+ const gotUpper = (body && body.body &&
2446
2456
  // \hphantom visible content
2447
- (body.body.body || body.body.length > 0))
2448
- ? paddedNode(buildGroup$1(body, labelStyle), lspace, rspace)
2449
- // Since Firefox does not recognize minsize set on the arrow,
2450
- // create an upper node w/correct width.
2451
- : paddedNode(null, emptyLabelWidth, 0);
2452
- const lowerNode = (below && below.body &&
2453
- (below.body.body || below.body.length > 0))
2454
- ? paddedNode(buildGroup$1(below, labelStyle), lspace, rspace)
2455
- : paddedNode(null, emptyLabelWidth, 0);
2456
- const node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]);
2457
- if (minWidth === "3.0") { node.style.height = "1em"; }
2457
+ (body.body.body || body.body.length > 0));
2458
+ if (gotUpper) {
2459
+ let label = buildGroup$1(body, labelStyle);
2460
+ label = paddedNode(label, space, space);
2461
+ // Since Firefox does not support minsize, stack a invisible node
2462
+ // on top of the label. Its width will serve as a min-width.
2463
+ // TODO: Refactor this after Firefox supports minsize.
2464
+ upperNode = new mathMLTree.MathNode("mover", [label, dummyNode]);
2465
+ }
2466
+ const gotLower = (below && below.body &&
2467
+ (below.body.body || below.body.length > 0));
2468
+ if (gotLower) {
2469
+ let label = buildGroup$1(below, labelStyle);
2470
+ label = paddedNode(label, space, space);
2471
+ lowerNode = new mathMLTree.MathNode("munder", [label, dummyNode]);
2472
+ }
2473
+
2474
+ let node;
2475
+ if (!gotUpper && !gotLower) {
2476
+ node = new mathMLTree.MathNode("mover", [arrowNode, emptyLabel]);
2477
+ } else if (gotUpper && gotLower) {
2478
+ node = new mathMLTree.MathNode("munderover", [arrowNode, lowerNode, upperNode]);
2479
+ } else if (gotUpper) {
2480
+ node = new mathMLTree.MathNode("mover", [arrowNode, upperNode]);
2481
+ } else {
2482
+ node = new mathMLTree.MathNode("munder", [arrowNode, lowerNode]);
2483
+ }
2484
+ if (minWidth === "3.0") { node.style.height = "1em"; } // CD environment
2485
+ node.setAttribute("accent", "false"); // Necessary for MS Word
2458
2486
  return node
2459
2487
  };
2460
2488
 
@@ -2533,7 +2561,7 @@ defineFunction({
2533
2561
  "\\xleftrightharpoons", // mathtools
2534
2562
  "\\xrightleftharpoons", // mathtools
2535
2563
  "\\yieldsLeftRight", // mhchem
2536
- "\\equilibrium", // mhchem
2564
+ "\\equilibrium", // mhchem
2537
2565
  "\\equilibriumRight",
2538
2566
  "\\equilibriumLeft"
2539
2567
  ],
@@ -3637,10 +3665,9 @@ defineFunction({
3637
3665
  // so we have to explicitly set stretchy to true.
3638
3666
  node.setAttribute("stretchy", "true");
3639
3667
  }
3640
-
3641
3668
  node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox.
3642
3669
  node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em");
3643
- // Don't set the maxsize attribute. It's broken in Chromium.
3670
+ node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em");
3644
3671
  return node;
3645
3672
  }
3646
3673
  });
@@ -3775,33 +3802,31 @@ const padding$1 = _ => {
3775
3802
 
3776
3803
  const mathmlBuilder$8 = (group, style) => {
3777
3804
  let node;
3778
- if (group.label.indexOf("colorbox") > -1) {
3779
- // Chrome mpadded +width attribute is broken. Insert <mspace>
3780
- node = new mathMLTree.MathNode("mpadded", [
3805
+ if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") {
3806
+ // MathML core does not support +width attribute in <mpadded>.
3807
+ // Firefox does not reliably add side padding.
3808
+ // Insert <mspace>
3809
+ node = new mathMLTree.MathNode("mrow", [
3781
3810
  padding$1(),
3782
3811
  buildGroup$1(group.body, style),
3783
3812
  padding$1()
3784
3813
  ]);
3785
3814
  } else {
3786
- node = new mathMLTree.MathNode("menclose", [buildGroup$1(group.body, style)]);
3815
+ node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]);
3787
3816
  }
3788
3817
  switch (group.label) {
3789
3818
  case "\\overline":
3790
- node.setAttribute("notation", "top");
3791
3819
  node.style.padding = "0.1em 0 0 0";
3792
3820
  node.style.borderTop = "0.065em solid";
3793
3821
  break
3794
3822
  case "\\underline":
3795
- node.setAttribute("notation", "bottom");
3796
3823
  node.style.padding = "0 0 0.1em 0";
3797
3824
  node.style.borderBottom = "0.065em solid";
3798
3825
  break
3799
3826
  case "\\cancel":
3800
- node.setAttribute("notation", "updiagonalstrike");
3801
3827
  node.classes.push("cancel");
3802
3828
  break
3803
3829
  case "\\bcancel":
3804
- node.setAttribute("notation", "downdiagonalstrike");
3805
3830
  node.classes.push("bcancel");
3806
3831
  break
3807
3832
  /*
@@ -3812,18 +3837,21 @@ const mathmlBuilder$8 = (group, style) => {
3812
3837
  node.setAttribute("notation", "phasorangle");
3813
3838
  break */
3814
3839
  case "\\angl":
3815
- node.setAttribute("notation", "actuarial");
3816
3840
  node.style.padding = "0.03889em 0.03889em 0 0.03889em";
3817
3841
  node.style.borderTop = "0.049em solid";
3818
3842
  node.style.borderRight = "0.049em solid";
3819
3843
  node.style.marginRight = "0.03889em";
3820
3844
  break
3821
3845
  case "\\sout":
3822
- node.setAttribute("notation", "horizontalstrike");
3823
3846
  node.style["text-decoration"] = "line-through 0.08em solid";
3824
3847
  break
3848
+ case "\\boxed":
3849
+ // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty
3850
+ node.style = { padding: "3pt 0 3pt 0", border: "1px solid" };
3851
+ node.setAttribute("scriptlevel", "0");
3852
+ node.setAttribute("displaystyle", "true");
3853
+ break
3825
3854
  case "\\fbox":
3826
- node.setAttribute("notation", "box");
3827
3855
  node.style = { padding: "3pt", border: "1px solid" };
3828
3856
  break
3829
3857
  case "\\fcolorbox":
@@ -3843,7 +3871,6 @@ const mathmlBuilder$8 = (group, style) => {
3843
3871
  break
3844
3872
  }
3845
3873
  case "\\xcancel":
3846
- node.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
3847
3874
  node.classes.push("xcancel");
3848
3875
  break
3849
3876
  }
@@ -3938,7 +3965,7 @@ defineFunction({
3938
3965
 
3939
3966
  defineFunction({
3940
3967
  type: "enclose",
3941
- names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline"],
3968
+ names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"],
3942
3969
  // , "\\phase", "\\longdiv"
3943
3970
  props: {
3944
3971
  numArgs: 1
@@ -6804,8 +6831,6 @@ defineFunction({
6804
6831
  }
6805
6832
  });
6806
6833
 
6807
- const sign = num => num >= 0 ? "+" : "-";
6808
-
6809
6834
  // \raise, \lower, and \raisebox
6810
6835
 
6811
6836
  const mathmlBuilder = (group, style) => {
@@ -6813,11 +6838,13 @@ const mathmlBuilder = (group, style) => {
6813
6838
  const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]);
6814
6839
  const dy = calculateSize(group.dy, style);
6815
6840
  node.setAttribute("voffset", dy.number + dy.unit);
6816
- const dyAbs = Math.abs(dy.number);
6817
- // The next two lines do not work in Chromium.
6818
- // TODO: Find some other way to adjust height and depth.
6819
- node.setAttribute("height", sign(dy.number) + dyAbs + dy.unit);
6820
- node.setAttribute("depth", sign(-dy.number) + dyAbs + dy.unit);
6841
+ // Add padding, which acts to increase height in Chromium.
6842
+ // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.
6843
+ if (dy.number > 0) {
6844
+ node.style.padding = dy.number + dy.unit + " 0 0 0";
6845
+ } else {
6846
+ node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0";
6847
+ }
6821
6848
  return node
6822
6849
  };
6823
6850
 
@@ -8446,9 +8473,6 @@ defineMacro("\u22ee", "\\vdots");
8446
8473
  //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
8447
8474
  defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}");
8448
8475
 
8449
- // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
8450
- defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}");
8451
-
8452
8476
  // \def\iff{\DOTSB\;\Longleftrightarrow\;}
8453
8477
  // \def\implies{\DOTSB\;\Longrightarrow\;}
8454
8478
  // \def\impliedby{\DOTSB\;\Longleftarrow\;}
@@ -8697,7 +8721,7 @@ defineMacro(
8697
8721
  defineMacro(
8698
8722
  "\\Temml",
8699
8723
  // eslint-disable-next-line max-len
8700
- "\\textrm{T}\\kern-0.2em\\lower{0.2em}\\textrm{E}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}"
8724
+ "\\textrm{T}\\kern-0.2em\\lower{0.2em}{\\textrm{E}}\\kern-0.08em{\\textrm{M}\\kern-0.08em\\raise{0.2em}\\textrm{M}\\kern-0.08em\\textrm{L}}"
8701
8725
  );
8702
8726
 
8703
8727
  // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
@@ -12877,7 +12901,7 @@ class Style {
12877
12901
  * https://mit-license.org/
12878
12902
  */
12879
12903
 
12880
- const version = "0.10.12";
12904
+ const version = "0.10.14";
12881
12905
 
12882
12906
  function postProcess(block) {
12883
12907
  const labelMap = {};