temml 0.10.15 → 0.10.16

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.
@@ -47,6 +47,24 @@ mo.tml-prime {
47
47
  font-feature-settings: 'salt';
48
48
  }
49
49
 
50
+ /* Prevent f' from overlapping in Chromium */
51
+ mo.prime-pad {
52
+ padding-left: 0.08em;
53
+ }
54
+
55
+ /* Stretch \widetilde in Chromium */
56
+ @supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
57
+ .tml-crooked-2 {
58
+ transform: scale(2.0, 1.1)
59
+ }
60
+ .tml-crooked-3 {
61
+ transform: scale(3.0, 1.1)
62
+ }
63
+ .tml-crooked-4 {
64
+ transform: scale(4.0, 1.1)
65
+ }
66
+ }
67
+
50
68
  /* flex-wrap for line-breaking in Chromium */
51
69
  math {
52
70
  display: inline-flex;
@@ -41,7 +41,7 @@ math * {
41
41
  }
42
42
 
43
43
  math {
44
- font-family: "Latin Modern Math", "Times New Roman", math;
44
+ font-family: "Latin Modern Math", math;
45
45
  }
46
46
 
47
47
  /* Next line is active in Firefox and Safari.
@@ -52,10 +52,29 @@ math.tml-display { display: block; }
52
52
  font-family: "Temml";
53
53
  }
54
54
 
55
+ /* Chromium prime alignment */
55
56
  mo.tml-prime {
56
57
  font-family: Temml;
57
58
  }
58
59
 
60
+ /* Prevent f' from overlapping in Chromium */
61
+ mo.prime-pad {
62
+ padding-left: 0.08em;
63
+ }
64
+
65
+ /* Stretch \widetilde in Chromium */
66
+ @supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
67
+ .tml-crooked-2 {
68
+ transform: scale(2.0, 1.1)
69
+ }
70
+ .tml-crooked-3 {
71
+ transform: scale(3.0, 1.3)
72
+ }
73
+ .tml-crooked-4 {
74
+ transform: scale(4.0, 1.4)
75
+ }
76
+ }
77
+
59
78
  /* flex-wrap for line-breaking in Chromium */
60
79
  math {
61
80
  display: inline-flex;
@@ -54,6 +54,24 @@ mo.tml-prime {
54
54
  font-feature-settings: 'ssty';
55
55
  }
56
56
 
57
+ /* Prevent f' from overlapping in Chromium */
58
+ mo.prime-pad {
59
+ padding-left: 0.08em;
60
+ }
61
+
62
+ /* Stretch \widetilde in Chromium */
63
+ @supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
64
+ .tml-crooked-2 {
65
+ transform: scale(2.0, 1.1)
66
+ }
67
+ .tml-crooked-3 {
68
+ transform: scale(3.0, 1.1)
69
+ }
70
+ .tml-crooked-4 {
71
+ transform: scale(4.0, 1.2)
72
+ }
73
+ }
74
+
57
75
  /* flex-wrap for line-breaking in Chromium */
58
76
  math {
59
77
  display: inline-flex;
@@ -12,7 +12,7 @@ Unicode range 1D49C to 1D4B5.
12
12
  }
13
13
 
14
14
  math {
15
- font-family: "Cambria Math", 'STIXTwoMath-Regular', "Times New Roman", math;
15
+ font-family: "Cambria Math", 'STIXTwoMath-Regular', math;
16
16
  font-style: normal;
17
17
  font-weight: normal;
18
18
  line-height: normal;
@@ -40,6 +40,24 @@ mo.tml-prime {
40
40
  font-family: Temml;
41
41
  }
42
42
 
43
+ /* Prevent f' from overlapping in Chromium */
44
+ mo.prime-pad {
45
+ padding-left: 0.08em;
46
+ }
47
+
48
+ /* Stretch \widetilde in Chromium */
49
+ @supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
50
+ .tml-crooked-2 {
51
+ transform: scale(2.0, 1.1)
52
+ }
53
+ .tml-crooked-3 {
54
+ transform: scale(3.0, 1.1)
55
+ }
56
+ .tml-crooked-4 {
57
+ transform: scale(4.0, 1.1)
58
+ }
59
+ }
60
+
43
61
  /* flex-wrap for line-breaking in Chromium */
44
62
  math {
45
63
  display: inline-flex;
@@ -48,6 +48,24 @@ mo.tml-prime {
48
48
  font-feature-settings: 'ss04';
49
49
  }
50
50
 
51
+ /* Prevent f' from overlapping in Chromium */
52
+ mo.prime-pad {
53
+ padding-left: 0.08em;
54
+ }
55
+
56
+ /* Stretch \widetilde in Chromium */
57
+ @supports (not (-webkit-backdrop-filter: blur(1px))) and (not (-moz-appearance: none)) {
58
+ .tml-crooked-2 {
59
+ transform: scale(2.0, 1.1)
60
+ }
61
+ .tml-crooked-3 {
62
+ transform: scale(3.0, 1.3)
63
+ }
64
+ .tml-crooked-4 {
65
+ transform: scale(4.0, 1.4)
66
+ }
67
+ }
68
+
51
69
  /* flex-wrap for line-breaking in Chromium */
52
70
  math {
53
71
  display: inline-flex;
package/dist/Temml.woff2 CHANGED
Binary file
package/dist/temml.cjs CHANGED
@@ -478,7 +478,7 @@ class TextNode$1 {
478
478
  }
479
479
  }
480
480
 
481
- /**
481
+ /*
482
482
  * This node represents an image embed (<img>) element.
483
483
  */
484
484
  class Img {
@@ -523,7 +523,7 @@ class Img {
523
523
  markup += ` style="${utils.escape(styles)}"`;
524
524
  }
525
525
 
526
- markup += "/>";
526
+ markup += ">";
527
527
  return markup;
528
528
  }
529
529
  }
@@ -699,6 +699,34 @@ var mathMLTree = {
699
699
  * This file provides support for building horizontal stretchy elements.
700
700
  */
701
701
 
702
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
703
+ const estimatedWidth = node => {
704
+ let width = 0;
705
+ if (node.body) {
706
+ for (const item of node.body) {
707
+ width += estimatedWidth(item);
708
+ }
709
+ } else if (node.type === "supsub") {
710
+ width += estimatedWidth(node.base);
711
+ if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }
712
+ if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }
713
+ } else if (node.type === "mathord" || node.type === "textord") {
714
+ for (const ch of node.text.split('')) {
715
+ const codePoint = ch.codePointAt(0);
716
+ if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {
717
+ width += 0.56; // lower case latin or greek. Use advance width of letter n
718
+ } else if (0x2F < codePoint && codePoint < 0x3A) {
719
+ width += 0.50; // numerals.
720
+ } else {
721
+ width += 0.92; // advance width of letter M
722
+ }
723
+ }
724
+ } else {
725
+ width += 1.0;
726
+ }
727
+ return width
728
+ };
729
+
702
730
  const stretchyCodePoint = {
703
731
  widehat: "^",
704
732
  widecheck: "ˇ",
@@ -756,8 +784,27 @@ const mathMLnode = function(label) {
756
784
  return node
757
785
  };
758
786
 
787
+ const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"];
788
+
789
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
790
+ const accentNode = (group) => {
791
+ const mo = mathMLnode(group.label);
792
+ if (crookedWides.includes(group.label)) {
793
+ const width = estimatedWidth(group.base);
794
+ if (1 < width && width < 1.6) {
795
+ mo.classes.push("tml-crooked-2");
796
+ } else if (1.6 <= width && width < 2.5) {
797
+ mo.classes.push("tml-crooked-3");
798
+ } else if (2.5 <= width) {
799
+ mo.classes.push("tml-crooked-4");
800
+ }
801
+ }
802
+ return mo
803
+ };
804
+
759
805
  var stretchy = {
760
- mathMLnode
806
+ mathMLnode,
807
+ accentNode
761
808
  };
762
809
 
763
810
  /**
@@ -1055,6 +1102,8 @@ defineSymbol(math, textord, "\u2127", "\\mho");
1055
1102
  defineSymbol(math, textord, "\u2132", "\\Finv", true);
1056
1103
  defineSymbol(math, textord, "\u2141", "\\Game", true);
1057
1104
  defineSymbol(math, textord, "\u2035", "\\backprime");
1105
+ defineSymbol(math, textord, "\u2036", "\\backdprime");
1106
+ defineSymbol(math, textord, "\u2037", "\\backtrprime");
1058
1107
  defineSymbol(math, textord, "\u25b2", "\\blacktriangle");
1059
1108
  defineSymbol(math, textord, "\u25bc", "\\blacktriangledown");
1060
1109
  defineSymbol(math, textord, "\u25a0", "\\blacksquare");
@@ -1258,6 +1307,9 @@ defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true);
1258
1307
  defineSymbol(math, textord, "\u2220", "\\angle", true);
1259
1308
  defineSymbol(math, textord, "\u221e", "\\infty", true);
1260
1309
  defineSymbol(math, textord, "\u2032", "\\prime");
1310
+ defineSymbol(math, textord, "\u2033", "\\dprime");
1311
+ defineSymbol(math, textord, "\u2034", "\\trprime");
1312
+ defineSymbol(math, textord, "\u2057", "\\qprime");
1261
1313
  defineSymbol(math, textord, "\u25b3", "\\triangle");
1262
1314
  defineSymbol(text, textord, "\u0391", "\\Alpha", true);
1263
1315
  defineSymbol(text, textord, "\u0392", "\\Beta", true);
@@ -1437,7 +1489,8 @@ defineSymbol(math, punct, ";", ";");
1437
1489
  defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
1438
1490
  defineSymbol(math, bin, "\u22bb", "\\veebar", true);
1439
1491
  defineSymbol(math, bin, "\u2299", "\\odot", true);
1440
- defineSymbol(math, bin, "\u2295", "\\oplus", true);
1492
+ // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
1493
+ defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
1441
1494
  defineSymbol(math, bin, "\u2297", "\\otimes", true);
1442
1495
  defineSymbol(math, textord, "\u2202", "\\partial", true);
1443
1496
  defineSymbol(math, bin, "\u2298", "\\oslash", true);
@@ -1668,6 +1721,8 @@ for (let i = 0; i < letters.length; i++) {
1668
1721
  defineSymbol(math, mathord, ch, ch);
1669
1722
  defineSymbol(text, textord, ch, ch);
1670
1723
  }
1724
+ // Prevent Firefox from using a dotless i.
1725
+ defineSymbol(text, textord, "i\uFE0E", "i");
1671
1726
 
1672
1727
  // Some more letters in Unicode Basic Multilingual Plane.
1673
1728
  const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ";
@@ -2145,7 +2200,7 @@ function buildMathML(tree, texExpression, style, settings) {
2145
2200
 
2146
2201
  const mathmlBuilder$a = (group, style) => {
2147
2202
  const accentNode = group.isStretchy
2148
- ? stretchy.mathMLnode(group.label)
2203
+ ? stretchy.accentNode(group)
2149
2204
  : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]);
2150
2205
 
2151
2206
  if (group.label === "\\vec") {
@@ -2165,25 +2220,21 @@ const mathmlBuilder$a = (group, style) => {
2165
2220
  return node;
2166
2221
  };
2167
2222
 
2168
- const NON_STRETCHY_ACCENT_REGEX = new RegExp(
2169
- [
2170
- "\\acute",
2171
- "\\grave",
2172
- "\\ddot",
2173
- "\\dddot",
2174
- "\\ddddot",
2175
- "\\tilde",
2176
- "\\bar",
2177
- "\\breve",
2178
- "\\check",
2179
- "\\hat",
2180
- "\\vec",
2181
- "\\dot",
2182
- "\\mathring"
2183
- ]
2184
- .map((accent) => `\\${accent}`)
2185
- .join("|")
2186
- );
2223
+ const nonStretchyAccents = new Set([
2224
+ "\\acute",
2225
+ "\\grave",
2226
+ "\\ddot",
2227
+ "\\dddot",
2228
+ "\\ddddot",
2229
+ "\\tilde",
2230
+ "\\bar",
2231
+ "\\breve",
2232
+ "\\check",
2233
+ "\\hat",
2234
+ "\\vec",
2235
+ "\\dot",
2236
+ "\\mathring"
2237
+ ]);
2187
2238
 
2188
2239
  // Accents
2189
2240
  defineFunction({
@@ -2221,7 +2272,7 @@ defineFunction({
2221
2272
  handler: (context, args) => {
2222
2273
  const base = normalizeArgument(args[0]);
2223
2274
 
2224
- const isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
2275
+ const isStretchy = !nonStretchyAccents.has(context.funcName);
2225
2276
 
2226
2277
  return {
2227
2278
  type: "accent",
@@ -2259,7 +2310,6 @@ defineFunction({
2259
2310
  mode: mode,
2260
2311
  label: context.funcName,
2261
2312
  isStretchy: false,
2262
- isShifty: true,
2263
2313
  base: base
2264
2314
  };
2265
2315
  },
@@ -2289,7 +2339,7 @@ defineFunction({
2289
2339
  };
2290
2340
  },
2291
2341
  mathmlBuilder: (group, style) => {
2292
- const accentNode = stretchy.mathMLnode(group.label);
2342
+ const accentNode = stretchy.accentNode(group);
2293
2343
  accentNode.style["math-depth"] = 0;
2294
2344
  const node = new mathMLTree.MathNode("munder", [
2295
2345
  buildGroup$1(group.base, style),
@@ -4391,6 +4441,10 @@ const mathmlBuilder$7 = function(group, style) {
4391
4441
  // TODO: Remove -webkit- when Chromium no longer needs it.
4392
4442
  row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
4393
4443
  }
4444
+ if (group.addEqnNum) {
4445
+ const k = group.leqno ? 0 : row.children.length - 1;
4446
+ row.children[k].style.textAlign = "-webkit-" + (group.leqno ? "left" : "right");
4447
+ }
4394
4448
  }
4395
4449
  if (row.children.length > 1 && group.envClasses.includes("cases")) {
4396
4450
  row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
@@ -7331,7 +7385,14 @@ defineFunctionBuilders({
7331
7385
  }
7332
7386
 
7333
7387
  if (group.sup) {
7334
- children.push(buildGroup$1(group.sup, childStyle));
7388
+ const sup = buildGroup$1(group.sup, childStyle);
7389
+ const testNode = sup.type === "mrow" ? sup.children[0] : sup;
7390
+ if ((testNode.type === "mo" && testNode.classes.includes("tml-prime"))
7391
+ && group.base && group.base.text && group.base.text === "f") {
7392
+ // Chromium does not address italic correction on prime. Prevent f′ from overlapping.
7393
+ testNode.classes.push("prime-pad");
7394
+ }
7395
+ children.push(sup);
7335
7396
  }
7336
7397
 
7337
7398
  let nodeType;
@@ -7797,6 +7858,8 @@ const smallCaps = Object.freeze({
7797
7858
 
7798
7859
  const numberRegEx = /^\d(?:[\d,.]*\d)?$/;
7799
7860
  const latinRegEx = /[A-Ba-z]/;
7861
+ const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime",
7862
+ "\\backprime", "\\backdprime", "\\backtrprime"]);
7800
7863
 
7801
7864
  const italicNumber = (text, variant, tag) => {
7802
7865
  const mn = new mathMLTree.MathNode(tag, [text]);
@@ -7864,7 +7927,7 @@ defineFunctionBuilders({
7864
7927
  text.text = variantChar(text.text, variant);
7865
7928
  }
7866
7929
  node = new mathMLTree.MathNode("mtext", [text]);
7867
- } else if (group.text === "\\prime") {
7930
+ } else if (primes.has(group.text)) {
7868
7931
  node = new mathMLTree.MathNode("mo", [text]);
7869
7932
  // TODO: If/when Chromium uses ssty variant for prime, remove the next line.
7870
7933
  node.classes.push("tml-prime");
@@ -8518,6 +8581,9 @@ defineMacro("\\char", function(context) {
8518
8581
  // This macro provides a better rendering.
8519
8582
  defineMacro("\\surd", '\\sqrt{\\vphantom{|}}');
8520
8583
 
8584
+ // See comment for \oplus in symbols.js.
8585
+ defineMacro("\u2295", "\\oplus");
8586
+
8521
8587
  defineMacro("\\hbox", "\\text{#1}");
8522
8588
 
8523
8589
  // Per TeXbook p.122, "/" gets zero operator spacing.
@@ -12798,7 +12864,6 @@ class Parser {
12798
12864
  loc: SourceLocation.range(nucleus),
12799
12865
  label: command,
12800
12866
  isStretchy: false,
12801
- isShifty: true,
12802
12867
  base: symbol
12803
12868
  };
12804
12869
  }
@@ -12996,7 +13061,7 @@ class Style {
12996
13061
  * https://mit-license.org/
12997
13062
  */
12998
13063
 
12999
- const version = "0.10.15";
13064
+ const version = "0.10.16";
13000
13065
 
13001
13066
  function postProcess(block) {
13002
13067
  const labelMap = {};
package/dist/temml.js CHANGED
@@ -479,7 +479,7 @@ var temml = (function () {
479
479
  }
480
480
  }
481
481
 
482
- /**
482
+ /*
483
483
  * This node represents an image embed (<img>) element.
484
484
  */
485
485
  class Img {
@@ -524,7 +524,7 @@ var temml = (function () {
524
524
  markup += ` style="${utils.escape(styles)}"`;
525
525
  }
526
526
 
527
- markup += "/>";
527
+ markup += ">";
528
528
  return markup;
529
529
  }
530
530
  }
@@ -700,6 +700,34 @@ var temml = (function () {
700
700
  * This file provides support for building horizontal stretchy elements.
701
701
  */
702
702
 
703
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
704
+ const estimatedWidth = node => {
705
+ let width = 0;
706
+ if (node.body) {
707
+ for (const item of node.body) {
708
+ width += estimatedWidth(item);
709
+ }
710
+ } else if (node.type === "supsub") {
711
+ width += estimatedWidth(node.base);
712
+ if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }
713
+ if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }
714
+ } else if (node.type === "mathord" || node.type === "textord") {
715
+ for (const ch of node.text.split('')) {
716
+ const codePoint = ch.codePointAt(0);
717
+ if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {
718
+ width += 0.56; // lower case latin or greek. Use advance width of letter n
719
+ } else if (0x2F < codePoint && codePoint < 0x3A) {
720
+ width += 0.50; // numerals.
721
+ } else {
722
+ width += 0.92; // advance width of letter M
723
+ }
724
+ }
725
+ } else {
726
+ width += 1.0;
727
+ }
728
+ return width
729
+ };
730
+
703
731
  const stretchyCodePoint = {
704
732
  widehat: "^",
705
733
  widecheck: "ˇ",
@@ -757,8 +785,27 @@ var temml = (function () {
757
785
  return node
758
786
  };
759
787
 
788
+ const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"];
789
+
790
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
791
+ const accentNode = (group) => {
792
+ const mo = mathMLnode(group.label);
793
+ if (crookedWides.includes(group.label)) {
794
+ const width = estimatedWidth(group.base);
795
+ if (1 < width && width < 1.6) {
796
+ mo.classes.push("tml-crooked-2");
797
+ } else if (1.6 <= width && width < 2.5) {
798
+ mo.classes.push("tml-crooked-3");
799
+ } else if (2.5 <= width) {
800
+ mo.classes.push("tml-crooked-4");
801
+ }
802
+ }
803
+ return mo
804
+ };
805
+
760
806
  var stretchy = {
761
- mathMLnode
807
+ mathMLnode,
808
+ accentNode
762
809
  };
763
810
 
764
811
  /**
@@ -1056,6 +1103,8 @@ var temml = (function () {
1056
1103
  defineSymbol(math, textord, "\u2132", "\\Finv", true);
1057
1104
  defineSymbol(math, textord, "\u2141", "\\Game", true);
1058
1105
  defineSymbol(math, textord, "\u2035", "\\backprime");
1106
+ defineSymbol(math, textord, "\u2036", "\\backdprime");
1107
+ defineSymbol(math, textord, "\u2037", "\\backtrprime");
1059
1108
  defineSymbol(math, textord, "\u25b2", "\\blacktriangle");
1060
1109
  defineSymbol(math, textord, "\u25bc", "\\blacktriangledown");
1061
1110
  defineSymbol(math, textord, "\u25a0", "\\blacksquare");
@@ -1259,6 +1308,9 @@ var temml = (function () {
1259
1308
  defineSymbol(math, textord, "\u2220", "\\angle", true);
1260
1309
  defineSymbol(math, textord, "\u221e", "\\infty", true);
1261
1310
  defineSymbol(math, textord, "\u2032", "\\prime");
1311
+ defineSymbol(math, textord, "\u2033", "\\dprime");
1312
+ defineSymbol(math, textord, "\u2034", "\\trprime");
1313
+ defineSymbol(math, textord, "\u2057", "\\qprime");
1262
1314
  defineSymbol(math, textord, "\u25b3", "\\triangle");
1263
1315
  defineSymbol(text, textord, "\u0391", "\\Alpha", true);
1264
1316
  defineSymbol(text, textord, "\u0392", "\\Beta", true);
@@ -1438,7 +1490,8 @@ var temml = (function () {
1438
1490
  defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
1439
1491
  defineSymbol(math, bin, "\u22bb", "\\veebar", true);
1440
1492
  defineSymbol(math, bin, "\u2299", "\\odot", true);
1441
- defineSymbol(math, bin, "\u2295", "\\oplus", true);
1493
+ // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
1494
+ defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
1442
1495
  defineSymbol(math, bin, "\u2297", "\\otimes", true);
1443
1496
  defineSymbol(math, textord, "\u2202", "\\partial", true);
1444
1497
  defineSymbol(math, bin, "\u2298", "\\oslash", true);
@@ -1669,6 +1722,8 @@ var temml = (function () {
1669
1722
  defineSymbol(math, mathord, ch, ch);
1670
1723
  defineSymbol(text, textord, ch, ch);
1671
1724
  }
1725
+ // Prevent Firefox from using a dotless i.
1726
+ defineSymbol(text, textord, "i\uFE0E", "i");
1672
1727
 
1673
1728
  // Some more letters in Unicode Basic Multilingual Plane.
1674
1729
  const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ";
@@ -2146,7 +2201,7 @@ var temml = (function () {
2146
2201
 
2147
2202
  const mathmlBuilder$a = (group, style) => {
2148
2203
  const accentNode = group.isStretchy
2149
- ? stretchy.mathMLnode(group.label)
2204
+ ? stretchy.accentNode(group)
2150
2205
  : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]);
2151
2206
 
2152
2207
  if (group.label === "\\vec") {
@@ -2166,25 +2221,21 @@ var temml = (function () {
2166
2221
  return node;
2167
2222
  };
2168
2223
 
2169
- const NON_STRETCHY_ACCENT_REGEX = new RegExp(
2170
- [
2171
- "\\acute",
2172
- "\\grave",
2173
- "\\ddot",
2174
- "\\dddot",
2175
- "\\ddddot",
2176
- "\\tilde",
2177
- "\\bar",
2178
- "\\breve",
2179
- "\\check",
2180
- "\\hat",
2181
- "\\vec",
2182
- "\\dot",
2183
- "\\mathring"
2184
- ]
2185
- .map((accent) => `\\${accent}`)
2186
- .join("|")
2187
- );
2224
+ const nonStretchyAccents = new Set([
2225
+ "\\acute",
2226
+ "\\grave",
2227
+ "\\ddot",
2228
+ "\\dddot",
2229
+ "\\ddddot",
2230
+ "\\tilde",
2231
+ "\\bar",
2232
+ "\\breve",
2233
+ "\\check",
2234
+ "\\hat",
2235
+ "\\vec",
2236
+ "\\dot",
2237
+ "\\mathring"
2238
+ ]);
2188
2239
 
2189
2240
  // Accents
2190
2241
  defineFunction({
@@ -2222,7 +2273,7 @@ var temml = (function () {
2222
2273
  handler: (context, args) => {
2223
2274
  const base = normalizeArgument(args[0]);
2224
2275
 
2225
- const isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
2276
+ const isStretchy = !nonStretchyAccents.has(context.funcName);
2226
2277
 
2227
2278
  return {
2228
2279
  type: "accent",
@@ -2260,7 +2311,6 @@ var temml = (function () {
2260
2311
  mode: mode,
2261
2312
  label: context.funcName,
2262
2313
  isStretchy: false,
2263
- isShifty: true,
2264
2314
  base: base
2265
2315
  };
2266
2316
  },
@@ -2290,7 +2340,7 @@ var temml = (function () {
2290
2340
  };
2291
2341
  },
2292
2342
  mathmlBuilder: (group, style) => {
2293
- const accentNode = stretchy.mathMLnode(group.label);
2343
+ const accentNode = stretchy.accentNode(group);
2294
2344
  accentNode.style["math-depth"] = 0;
2295
2345
  const node = new mathMLTree.MathNode("munder", [
2296
2346
  buildGroup$1(group.base, style),
@@ -4392,6 +4442,10 @@ rgba(0,0,0,0) 100%);`;
4392
4442
  // TODO: Remove -webkit- when Chromium no longer needs it.
4393
4443
  row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
4394
4444
  }
4445
+ if (group.addEqnNum) {
4446
+ const k = group.leqno ? 0 : row.children.length - 1;
4447
+ row.children[k].style.textAlign = "-webkit-" + (group.leqno ? "left" : "right");
4448
+ }
4395
4449
  }
4396
4450
  if (row.children.length > 1 && group.envClasses.includes("cases")) {
4397
4451
  row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
@@ -7332,7 +7386,14 @@ rgba(0,0,0,0) 100%);`;
7332
7386
  }
7333
7387
 
7334
7388
  if (group.sup) {
7335
- children.push(buildGroup$1(group.sup, childStyle));
7389
+ const sup = buildGroup$1(group.sup, childStyle);
7390
+ const testNode = sup.type === "mrow" ? sup.children[0] : sup;
7391
+ if ((testNode.type === "mo" && testNode.classes.includes("tml-prime"))
7392
+ && group.base && group.base.text && group.base.text === "f") {
7393
+ // Chromium does not address italic correction on prime. Prevent f′ from overlapping.
7394
+ testNode.classes.push("prime-pad");
7395
+ }
7396
+ children.push(sup);
7336
7397
  }
7337
7398
 
7338
7399
  let nodeType;
@@ -7798,6 +7859,8 @@ rgba(0,0,0,0) 100%);`;
7798
7859
 
7799
7860
  const numberRegEx = /^\d(?:[\d,.]*\d)?$/;
7800
7861
  const latinRegEx = /[A-Ba-z]/;
7862
+ const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime",
7863
+ "\\backprime", "\\backdprime", "\\backtrprime"]);
7801
7864
 
7802
7865
  const italicNumber = (text, variant, tag) => {
7803
7866
  const mn = new mathMLTree.MathNode(tag, [text]);
@@ -7865,7 +7928,7 @@ rgba(0,0,0,0) 100%);`;
7865
7928
  text.text = variantChar(text.text, variant);
7866
7929
  }
7867
7930
  node = new mathMLTree.MathNode("mtext", [text]);
7868
- } else if (group.text === "\\prime") {
7931
+ } else if (primes.has(group.text)) {
7869
7932
  node = new mathMLTree.MathNode("mo", [text]);
7870
7933
  // TODO: If/when Chromium uses ssty variant for prime, remove the next line.
7871
7934
  node.classes.push("tml-prime");
@@ -8519,6 +8582,9 @@ rgba(0,0,0,0) 100%);`;
8519
8582
  // This macro provides a better rendering.
8520
8583
  defineMacro("\\surd", '\\sqrt{\\vphantom{|}}');
8521
8584
 
8585
+ // See comment for \oplus in symbols.js.
8586
+ defineMacro("\u2295", "\\oplus");
8587
+
8522
8588
  defineMacro("\\hbox", "\\text{#1}");
8523
8589
 
8524
8590
  // Per TeXbook p.122, "/" gets zero operator spacing.
@@ -10899,7 +10965,6 @@ rgba(0,0,0,0) 100%);`;
10899
10965
  loc: SourceLocation.range(nucleus),
10900
10966
  label: command,
10901
10967
  isStretchy: false,
10902
- isShifty: true,
10903
10968
  base: symbol
10904
10969
  };
10905
10970
  }
@@ -11097,7 +11162,7 @@ rgba(0,0,0,0) 100%);`;
11097
11162
  * https://mit-license.org/
11098
11163
  */
11099
11164
 
11100
- const version = "0.10.15";
11165
+ const version = "0.10.16";
11101
11166
 
11102
11167
  function postProcess(block) {
11103
11168
  const labelMap = {};