temml 0.10.14 → 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.
package/dist/temml.mjs CHANGED
@@ -476,7 +476,7 @@ class TextNode$1 {
476
476
  }
477
477
  }
478
478
 
479
- /**
479
+ /*
480
480
  * This node represents an image embed (<img>) element.
481
481
  */
482
482
  class Img {
@@ -521,7 +521,7 @@ class Img {
521
521
  markup += ` style="${utils.escape(styles)}"`;
522
522
  }
523
523
 
524
- markup += "/>";
524
+ markup += ">";
525
525
  return markup;
526
526
  }
527
527
  }
@@ -697,6 +697,34 @@ var mathMLTree = {
697
697
  * This file provides support for building horizontal stretchy elements.
698
698
  */
699
699
 
700
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
701
+ const estimatedWidth = node => {
702
+ let width = 0;
703
+ if (node.body) {
704
+ for (const item of node.body) {
705
+ width += estimatedWidth(item);
706
+ }
707
+ } else if (node.type === "supsub") {
708
+ width += estimatedWidth(node.base);
709
+ if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }
710
+ if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }
711
+ } else if (node.type === "mathord" || node.type === "textord") {
712
+ for (const ch of node.text.split('')) {
713
+ const codePoint = ch.codePointAt(0);
714
+ if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {
715
+ width += 0.56; // lower case latin or greek. Use advance width of letter n
716
+ } else if (0x2F < codePoint && codePoint < 0x3A) {
717
+ width += 0.50; // numerals.
718
+ } else {
719
+ width += 0.92; // advance width of letter M
720
+ }
721
+ }
722
+ } else {
723
+ width += 1.0;
724
+ }
725
+ return width
726
+ };
727
+
700
728
  const stretchyCodePoint = {
701
729
  widehat: "^",
702
730
  widecheck: "ˇ",
@@ -754,8 +782,27 @@ const mathMLnode = function(label) {
754
782
  return node
755
783
  };
756
784
 
785
+ const crookedWides = ["\\widetilde", "\\widehat", "\\widecheck", "\\utilde"];
786
+
787
+ // TODO: Remove when Chromium stretches \widetilde & \widehat
788
+ const accentNode = (group) => {
789
+ const mo = mathMLnode(group.label);
790
+ if (crookedWides.includes(group.label)) {
791
+ const width = estimatedWidth(group.base);
792
+ if (1 < width && width < 1.6) {
793
+ mo.classes.push("tml-crooked-2");
794
+ } else if (1.6 <= width && width < 2.5) {
795
+ mo.classes.push("tml-crooked-3");
796
+ } else if (2.5 <= width) {
797
+ mo.classes.push("tml-crooked-4");
798
+ }
799
+ }
800
+ return mo
801
+ };
802
+
757
803
  var stretchy = {
758
- mathMLnode
804
+ mathMLnode,
805
+ accentNode
759
806
  };
760
807
 
761
808
  /**
@@ -971,6 +1018,10 @@ defineSymbol(math, mathord, "\u21af", "\\lightning", true);
971
1018
  defineSymbol(math, mathord, "\u220E", "\\QED", true);
972
1019
  defineSymbol(math, mathord, "\u2030", "\\permil", true);
973
1020
  defineSymbol(text, textord, "\u2030", "\\permil");
1021
+ defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
1022
+ defineSymbol(math, mathord, "\u263c", "\\sun", true);
1023
+ defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
1024
+ defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
974
1025
 
975
1026
  // AMS Negated Binary Relations
976
1027
  defineSymbol(math, rel, "\u226e", "\\nless", true);
@@ -1049,6 +1100,8 @@ defineSymbol(math, textord, "\u2127", "\\mho");
1049
1100
  defineSymbol(math, textord, "\u2132", "\\Finv", true);
1050
1101
  defineSymbol(math, textord, "\u2141", "\\Game", true);
1051
1102
  defineSymbol(math, textord, "\u2035", "\\backprime");
1103
+ defineSymbol(math, textord, "\u2036", "\\backdprime");
1104
+ defineSymbol(math, textord, "\u2037", "\\backtrprime");
1052
1105
  defineSymbol(math, textord, "\u25b2", "\\blacktriangle");
1053
1106
  defineSymbol(math, textord, "\u25bc", "\\blacktriangledown");
1054
1107
  defineSymbol(math, textord, "\u25a0", "\\blacksquare");
@@ -1252,6 +1305,9 @@ defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true);
1252
1305
  defineSymbol(math, textord, "\u2220", "\\angle", true);
1253
1306
  defineSymbol(math, textord, "\u221e", "\\infty", true);
1254
1307
  defineSymbol(math, textord, "\u2032", "\\prime");
1308
+ defineSymbol(math, textord, "\u2033", "\\dprime");
1309
+ defineSymbol(math, textord, "\u2034", "\\trprime");
1310
+ defineSymbol(math, textord, "\u2057", "\\qprime");
1255
1311
  defineSymbol(math, textord, "\u25b3", "\\triangle");
1256
1312
  defineSymbol(text, textord, "\u0391", "\\Alpha", true);
1257
1313
  defineSymbol(text, textord, "\u0392", "\\Beta", true);
@@ -1431,7 +1487,8 @@ defineSymbol(math, punct, ";", ";");
1431
1487
  defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
1432
1488
  defineSymbol(math, bin, "\u22bb", "\\veebar", true);
1433
1489
  defineSymbol(math, bin, "\u2299", "\\odot", true);
1434
- defineSymbol(math, bin, "\u2295", "\\oplus", true);
1490
+ // Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
1491
+ defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
1435
1492
  defineSymbol(math, bin, "\u2297", "\\otimes", true);
1436
1493
  defineSymbol(math, textord, "\u2202", "\\partial", true);
1437
1494
  defineSymbol(math, bin, "\u2298", "\\oslash", true);
@@ -1662,6 +1719,8 @@ for (let i = 0; i < letters.length; i++) {
1662
1719
  defineSymbol(math, mathord, ch, ch);
1663
1720
  defineSymbol(text, textord, ch, ch);
1664
1721
  }
1722
+ // Prevent Firefox from using a dotless i.
1723
+ defineSymbol(text, textord, "i\uFE0E", "i");
1665
1724
 
1666
1725
  // Some more letters in Unicode Basic Multilingual Plane.
1667
1726
  const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ";
@@ -2129,9 +2188,7 @@ function buildMathML(tree, texExpression, style, settings) {
2129
2188
  }
2130
2189
  if (settings.displayMode) {
2131
2190
  math.setAttribute("display", "block");
2132
- math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
2133
- ? "inline"
2134
- : "block math"; // necessary in Chromium.
2191
+ math.style.display = "block math"; // necessary in Chromium.
2135
2192
  // Firefox and Safari do not recognize display: "block math".
2136
2193
  // Set a class so that the CSS file can set display: block.
2137
2194
  math.classes = ["tml-display"];
@@ -2141,7 +2198,7 @@ function buildMathML(tree, texExpression, style, settings) {
2141
2198
 
2142
2199
  const mathmlBuilder$a = (group, style) => {
2143
2200
  const accentNode = group.isStretchy
2144
- ? stretchy.mathMLnode(group.label)
2201
+ ? stretchy.accentNode(group)
2145
2202
  : new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]);
2146
2203
 
2147
2204
  if (group.label === "\\vec") {
@@ -2161,25 +2218,21 @@ const mathmlBuilder$a = (group, style) => {
2161
2218
  return node;
2162
2219
  };
2163
2220
 
2164
- const NON_STRETCHY_ACCENT_REGEX = new RegExp(
2165
- [
2166
- "\\acute",
2167
- "\\grave",
2168
- "\\ddot",
2169
- "\\dddot",
2170
- "\\ddddot",
2171
- "\\tilde",
2172
- "\\bar",
2173
- "\\breve",
2174
- "\\check",
2175
- "\\hat",
2176
- "\\vec",
2177
- "\\dot",
2178
- "\\mathring"
2179
- ]
2180
- .map((accent) => `\\${accent}`)
2181
- .join("|")
2182
- );
2221
+ const nonStretchyAccents = new Set([
2222
+ "\\acute",
2223
+ "\\grave",
2224
+ "\\ddot",
2225
+ "\\dddot",
2226
+ "\\ddddot",
2227
+ "\\tilde",
2228
+ "\\bar",
2229
+ "\\breve",
2230
+ "\\check",
2231
+ "\\hat",
2232
+ "\\vec",
2233
+ "\\dot",
2234
+ "\\mathring"
2235
+ ]);
2183
2236
 
2184
2237
  // Accents
2185
2238
  defineFunction({
@@ -2217,7 +2270,7 @@ defineFunction({
2217
2270
  handler: (context, args) => {
2218
2271
  const base = normalizeArgument(args[0]);
2219
2272
 
2220
- const isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);
2273
+ const isStretchy = !nonStretchyAccents.has(context.funcName);
2221
2274
 
2222
2275
  return {
2223
2276
  type: "accent",
@@ -2255,7 +2308,6 @@ defineFunction({
2255
2308
  mode: mode,
2256
2309
  label: context.funcName,
2257
2310
  isStretchy: false,
2258
- isShifty: true,
2259
2311
  base: base
2260
2312
  };
2261
2313
  },
@@ -2285,7 +2337,7 @@ defineFunction({
2285
2337
  };
2286
2338
  },
2287
2339
  mathmlBuilder: (group, style) => {
2288
- const accentNode = stretchy.mathMLnode(group.label);
2340
+ const accentNode = stretchy.accentNode(group);
2289
2341
  accentNode.style["math-depth"] = 0;
2290
2342
  const node = new mathMLTree.MathNode("munder", [
2291
2343
  buildGroup$1(group.base, style),
@@ -3822,10 +3874,20 @@ const mathmlBuilder$8 = (group, style) => {
3822
3874
  node.style.borderBottom = "0.065em solid";
3823
3875
  break
3824
3876
  case "\\cancel":
3825
- node.classes.push("cancel");
3877
+ node.style.background = `linear-gradient(to top left,
3878
+ rgba(0,0,0,0) 0%,
3879
+ rgba(0,0,0,0) calc(50% - 0.06em),
3880
+ rgba(0,0,0,1) 50%,
3881
+ rgba(0,0,0,0) calc(50% + 0.06em),
3882
+ rgba(0,0,0,0) 100%);`;
3826
3883
  break
3827
3884
  case "\\bcancel":
3828
- node.classes.push("bcancel");
3885
+ node.style.background = `linear-gradient(to top right,
3886
+ rgba(0,0,0,0) 0%,
3887
+ rgba(0,0,0,0) calc(50% - 0.06em),
3888
+ rgba(0,0,0,1) 50%,
3889
+ rgba(0,0,0,0) calc(50% + 0.06em),
3890
+ rgba(0,0,0,0) 100%);`;
3829
3891
  break
3830
3892
  /*
3831
3893
  case "\\longdiv":
@@ -3869,7 +3931,18 @@ const mathmlBuilder$8 = (group, style) => {
3869
3931
  break
3870
3932
  }
3871
3933
  case "\\xcancel":
3872
- node.classes.push("xcancel");
3934
+ node.style.background = `linear-gradient(to top left,
3935
+ rgba(0,0,0,0) 0%,
3936
+ rgba(0,0,0,0) calc(50% - 0.06em),
3937
+ rgba(0,0,0,1) 50%,
3938
+ rgba(0,0,0,0) calc(50% + 0.06em),
3939
+ rgba(0,0,0,0) 100%),
3940
+ linear-gradient(to top right,
3941
+ rgba(0,0,0,0) 0%,
3942
+ rgba(0,0,0,0) calc(50% - 0.06em),
3943
+ rgba(0,0,0,1) 50%,
3944
+ rgba(0,0,0,0) calc(50% + 0.06em),
3945
+ rgba(0,0,0,0) 100%);`;
3873
3946
  break
3874
3947
  }
3875
3948
  if (group.backgroundColor) {
@@ -4300,24 +4373,98 @@ const mathmlBuilder$7 = function(group, style) {
4300
4373
  // Write horizontal rules
4301
4374
  if (i === 0 && hlines[0].length > 0) {
4302
4375
  if (hlines[0].length === 2) {
4303
- mtr.classes.push("tml-top-double");
4376
+ mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; });
4304
4377
  } else {
4305
- mtr.classes.push(hlines[0][0] ? "tml-top-dashed" : "tml-top-solid");
4378
+ mtr.children.forEach(cell => {
4379
+ cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid";
4380
+ });
4306
4381
  }
4307
4382
  }
4308
4383
  if (hlines[i + 1].length > 0) {
4309
4384
  if (hlines[i + 1].length === 2) {
4310
- mtr.classes.push("tml-hline-double");
4385
+ mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; });
4311
4386
  } else {
4312
- mtr.classes.push(hlines[i + 1][0] ? "tml-hline-dashed" : "tml-hline-solid");
4387
+ mtr.children.forEach(cell => {
4388
+ cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid";
4389
+ });
4313
4390
  }
4314
4391
  }
4315
4392
  tbl.push(mtr);
4316
4393
  }
4317
- let table = new mathMLTree.MathNode("mtable", tbl);
4394
+
4318
4395
  if (group.envClasses.length > 0) {
4319
- table.classes = group.envClasses.map(e => "tml-" + e);
4396
+ const pad = group.envClasses.includes("jot")
4397
+ ? "0.7" // 0.5ex + 0.09em top & bot padding
4398
+ : group.envClasses.includes("small")
4399
+ ? "0.35"
4400
+ : "0.5"; // 0.5ex default top & bot padding
4401
+ const sidePadding = group.envClasses.includes("abut")
4402
+ ? "0"
4403
+ : group.envClasses.includes("cases")
4404
+ ? "0"
4405
+ : group.envClasses.includes("small")
4406
+ ? "0.1389"
4407
+ : group.envClasses.includes("cd")
4408
+ ? "0.25"
4409
+ : "0.4"; // default side padding
4410
+
4411
+ const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;
4412
+
4413
+ const sidePad = (j, hand) => {
4414
+ if (j === 0 && hand === 0) { return "0" }
4415
+ if (j === numCols - 1 && hand === 1) { return "0" }
4416
+ if (group.envClasses[0] !== "align") { return sidePadding }
4417
+ if (hand === 1) { return "0" }
4418
+ if (group.addEqnNum) {
4419
+ return (j % 2) ? "1" : "0"
4420
+ } else {
4421
+ return (j % 2) ? "0" : "1"
4422
+ }
4423
+ };
4424
+
4425
+ // Padding
4426
+ for (let i = 0; i < tbl.length; i++) {
4427
+ for (let j = 0; j < tbl[i].children.length; j++) {
4428
+ tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`;
4429
+ }
4430
+ }
4431
+
4432
+ // Justification
4433
+ const align = group.envClasses.includes("align") || group.envClasses.includes("alignat");
4434
+ for (let i = 0; i < tbl.length; i++) {
4435
+ const row = tbl[i];
4436
+ if (align) {
4437
+ for (let j = 0; j < row.children.length; j++) {
4438
+ // Chromium does not recognize text-align: left. Use -webkit-
4439
+ // TODO: Remove -webkit- when Chromium no longer needs it.
4440
+ row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
4441
+ }
4442
+ if (group.addEqnNum) {
4443
+ const k = group.leqno ? 0 : row.children.length - 1;
4444
+ row.children[k].style.textAlign = "-webkit-" + (group.leqno ? "left" : "right");
4445
+ }
4446
+ }
4447
+ if (row.children.length > 1 && group.envClasses.includes("cases")) {
4448
+ row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
4449
+ }
4450
+
4451
+ if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
4452
+ for (const cell of row.children) {
4453
+ cell.style.textAlign = "-webkit-" + "left";
4454
+ }
4455
+ }
4456
+ }
4457
+ } else {
4458
+ // Set zero padding on side of the matrix
4459
+ for (let i = 0; i < tbl.length; i++) {
4460
+ tbl[i].children[0].style.paddingLeft = "0em";
4461
+ if (tbl[i].children.length === tbl[0].children.length) {
4462
+ tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em";
4463
+ }
4464
+ }
4320
4465
  }
4466
+
4467
+ let table = new mathMLTree.MathNode("mtable", tbl);
4321
4468
  if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); }
4322
4469
 
4323
4470
  if (group.addEqnNum || group.envClasses.includes("multline")) {
@@ -4397,6 +4544,8 @@ const mathmlBuilder$7 = function(group, style) {
4397
4544
  align = "left " + (align.length > 0 ? align : "center ") + "right ";
4398
4545
  }
4399
4546
  if (align) {
4547
+ // Firefox reads this attribute, not the -webkit-left|right written above.
4548
+ // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
4400
4549
  table.setAttribute("columnalign", align.trim());
4401
4550
  }
4402
4551
 
@@ -4421,7 +4570,7 @@ const alignedHandler = function(context, args) {
4421
4570
  cols,
4422
4571
  addEqnNum: context.envName === "align" || context.envName === "alignat",
4423
4572
  emptySingleRow: true,
4424
- envClasses: ["jot", "abut"], // set row spacing & provisional column spacing
4573
+ envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
4425
4574
  maxNumCols: context.envName === "split" ? 2 : undefined,
4426
4575
  leqno: context.parser.settings.leqno
4427
4576
  },
@@ -4439,18 +4588,22 @@ const alignedHandler = function(context, args) {
4439
4588
  // binary. This behavior is implemented in amsmath's \start@aligned.
4440
4589
  let numMaths;
4441
4590
  let numCols = 0;
4442
- if (args[0] && args[0].type === "ordgroup") {
4591
+ const isAlignedAt = context.envName.indexOf("at") > -1;
4592
+ if (args[0] && isAlignedAt) {
4593
+ // alignat environment takes an argument w/ number of columns
4443
4594
  let arg0 = "";
4444
4595
  for (let i = 0; i < args[0].body.length; i++) {
4445
4596
  const textord = assertNodeType(args[0].body[i], "textord");
4446
4597
  arg0 += textord.text;
4447
4598
  }
4599
+ if (isNaN(arg0)) {
4600
+ throw new ParseError("The alignat enviroment requires a numeric first argument.")
4601
+ }
4448
4602
  numMaths = Number(arg0);
4449
4603
  numCols = numMaths * 2;
4450
4604
  }
4451
- const isAligned = !numCols;
4452
4605
  res.body.forEach(function(row) {
4453
- if (!isAligned) {
4606
+ if (isAlignedAt) {
4454
4607
  // Case 1
4455
4608
  const curMaths = row.length / 2;
4456
4609
  if (numMaths < curMaths) {
@@ -4478,14 +4631,10 @@ const alignedHandler = function(context, args) {
4478
4631
  align: align
4479
4632
  };
4480
4633
  }
4481
- if (context.envName === "split") ; else if (context.envName.indexOf("ed") > -1) {
4482
- res.envClasses.push("aligned"); // Sets justification
4483
- } else if (isAligned) {
4484
- res.envClasses[1] = context.envName === "align*"
4485
- ? "align-star"
4486
- : "align"; // Sets column spacing & justification
4634
+ if (context.envName === "split") ; else if (isAlignedAt) {
4635
+ res.envClasses.push("alignat"); // Sets justification
4487
4636
  } else {
4488
- res.envClasses.push("aligned"); // Sets justification
4637
+ res.envClasses[0] = "align"; // Sets column spacing & justification
4489
4638
  }
4490
4639
  return res;
4491
4640
  };
@@ -4735,7 +4884,7 @@ defineEnvironment({
4735
4884
  }
4736
4885
  const res = {
4737
4886
  cols: [],
4738
- envClasses: ["jot", "abut"],
4887
+ envClasses: ["abut", "jot"],
4739
4888
  addEqnNum: context.envName === "gather",
4740
4889
  emptySingleRow: true,
4741
4890
  leqno: context.parser.settings.leqno
@@ -7234,7 +7383,14 @@ defineFunctionBuilders({
7234
7383
  }
7235
7384
 
7236
7385
  if (group.sup) {
7237
- children.push(buildGroup$1(group.sup, childStyle));
7386
+ const sup = buildGroup$1(group.sup, childStyle);
7387
+ const testNode = sup.type === "mrow" ? sup.children[0] : sup;
7388
+ if ((testNode.type === "mo" && testNode.classes.includes("tml-prime"))
7389
+ && group.base && group.base.text && group.base.text === "f") {
7390
+ // Chromium does not address italic correction on prime. Prevent f′ from overlapping.
7391
+ testNode.classes.push("prime-pad");
7392
+ }
7393
+ children.push(sup);
7238
7394
  }
7239
7395
 
7240
7396
  let nodeType;
@@ -7700,6 +7856,8 @@ const smallCaps = Object.freeze({
7700
7856
 
7701
7857
  const numberRegEx = /^\d(?:[\d,.]*\d)?$/;
7702
7858
  const latinRegEx = /[A-Ba-z]/;
7859
+ const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime",
7860
+ "\\backprime", "\\backdprime", "\\backtrprime"]);
7703
7861
 
7704
7862
  const italicNumber = (text, variant, tag) => {
7705
7863
  const mn = new mathMLTree.MathNode(tag, [text]);
@@ -7767,7 +7925,7 @@ defineFunctionBuilders({
7767
7925
  text.text = variantChar(text.text, variant);
7768
7926
  }
7769
7927
  node = new mathMLTree.MathNode("mtext", [text]);
7770
- } else if (group.text === "\\prime") {
7928
+ } else if (primes.has(group.text)) {
7771
7929
  node = new mathMLTree.MathNode("mo", [text]);
7772
7930
  // TODO: If/when Chromium uses ssty variant for prime, remove the next line.
7773
7931
  node.classes.push("tml-prime");
@@ -8421,6 +8579,9 @@ defineMacro("\\char", function(context) {
8421
8579
  // This macro provides a better rendering.
8422
8580
  defineMacro("\\surd", '\\sqrt{\\vphantom{|}}');
8423
8581
 
8582
+ // See comment for \oplus in symbols.js.
8583
+ defineMacro("\u2295", "\\oplus");
8584
+
8424
8585
  defineMacro("\\hbox", "\\text{#1}");
8425
8586
 
8426
8587
  // Per TeXbook p.122, "/" gets zero operator spacing.
@@ -12701,7 +12862,6 @@ class Parser {
12701
12862
  loc: SourceLocation.range(nucleus),
12702
12863
  label: command,
12703
12864
  isStretchy: false,
12704
- isShifty: true,
12705
12865
  base: symbol
12706
12866
  };
12707
12867
  }
@@ -12899,7 +13059,7 @@ class Style {
12899
13059
  * https://mit-license.org/
12900
13060
  */
12901
13061
 
12902
- const version = "0.10.14";
13062
+ const version = "0.10.16";
12903
13063
 
12904
13064
  function postProcess(block) {
12905
13065
  const labelMap = {};
@@ -12950,6 +13110,7 @@ function postProcess(block) {
12950
13110
  /* eslint no-console:0 */
12951
13111
 
12952
13112
  /**
13113
+ * @type {import('./temml').render}
12953
13114
  * Parse and build an expression, and place that expression in the DOM node
12954
13115
  * given.
12955
13116
  */
@@ -12987,6 +13148,7 @@ if (typeof document !== "undefined") {
12987
13148
  }
12988
13149
 
12989
13150
  /**
13151
+ * @type {import('./temml').renderToString}
12990
13152
  * Parse and build an expression, and return the markup for that.
12991
13153
  */
12992
13154
  const renderToString = function(expression, options) {
@@ -12995,6 +13157,7 @@ const renderToString = function(expression, options) {
12995
13157
  };
12996
13158
 
12997
13159
  /**
13160
+ * @type {import('./temml').generateParseTree}
12998
13161
  * Parse an expression and return the parse tree.
12999
13162
  */
13000
13163
  const generateParseTree = function(expression, options) {
@@ -13003,6 +13166,7 @@ const generateParseTree = function(expression, options) {
13003
13166
  };
13004
13167
 
13005
13168
  /**
13169
+ * @type {import('./temml').definePreamble}
13006
13170
  * Take an expression which contains a preamble.
13007
13171
  * Parse it and return the macros.
13008
13172
  */
@@ -13035,6 +13199,7 @@ const renderError = function(error, expression, options) {
13035
13199
  };
13036
13200
 
13037
13201
  /**
13202
+ * @type {import('./temml').renderToMathMLTree}
13038
13203
  * Generates and returns the Temml build tree. This is used for advanced
13039
13204
  * use cases (like rendering to custom output).
13040
13205
  */
@@ -13052,6 +13217,7 @@ const renderToMathMLTree = function(expression, options) {
13052
13217
  }
13053
13218
  };
13054
13219
 
13220
+ /** @type {import('./temml').default} */
13055
13221
  var temml = {
13056
13222
  /**
13057
13223
  * Current Temml version
@@ -14,7 +14,7 @@
14
14
  * https://mit-license.org/
15
15
  */
16
16
 
17
- const version = "0.10.14";
17
+ const version = "0.10.16";
18
18
 
19
19
  function postProcess(block) {
20
20
  const labelMap = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "temml",
3
- "version": "0.10.14",
3
+ "version": "0.10.16",
4
4
  "description": "TeX to MathML conversion in JavaScript.",
5
5
  "main": "dist/temml.js",
6
6
  "engines": {
@@ -8,7 +8,9 @@
8
8
  },
9
9
  "exports": {
10
10
  ".": {
11
- "require": "./dist/temml.cjs"
11
+ "require": "./dist/temml.cjs",
12
+ "import": "./dist/temml.mjs",
13
+ "types": "./dist/temml.d.ts"
12
14
  },
13
15
  "./*": "./*"
14
16
  },
package/src/Parser.js CHANGED
@@ -972,7 +972,6 @@ export default class Parser {
972
972
  loc: SourceLocation.range(nucleus),
973
973
  label: command,
974
974
  isStretchy: false,
975
- isShifty: true,
976
975
  base: symbol
977
976
  };
978
977
  }
@@ -260,9 +260,7 @@ export default function buildMathML(tree, texExpression, style, settings) {
260
260
  }
261
261
  if (settings.displayMode) {
262
262
  math.setAttribute("display", "block");
263
- math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
264
- ? "inline"
265
- : "block math" // necessary in Chromium.
263
+ math.style.display = "block math" // necessary in Chromium.
266
264
  // Firefox and Safari do not recognize display: "block math".
267
265
  // Set a class so that the CSS file can set display: block.
268
266
  math.classes = ["tml-display"]
package/src/domTree.js CHANGED
@@ -134,7 +134,7 @@ export class TextNode {
134
134
  }
135
135
  }
136
136
 
137
- /**
137
+ /*
138
138
  * This node represents an image embed (<img>) element.
139
139
  */
140
140
  export class Img {
@@ -179,7 +179,7 @@ export class Img {
179
179
  markup += ` style="${utils.escape(styles)}"`;
180
180
  }
181
181
 
182
- markup += "/>";
182
+ markup += ">";
183
183
  return markup;
184
184
  }
185
185
  }