temml 0.10.12 → 0.10.14

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.
@@ -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 = {};