temml 0.10.13 → 0.10.15

Sign up to get free protection for your applications and to get access to all the features.
package/dist/temml.cjs CHANGED
@@ -973,6 +973,10 @@ defineSymbol(math, mathord, "\u21af", "\\lightning", true);
973
973
  defineSymbol(math, mathord, "\u220E", "\\QED", true);
974
974
  defineSymbol(math, mathord, "\u2030", "\\permil", true);
975
975
  defineSymbol(text, textord, "\u2030", "\\permil");
976
+ defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
977
+ defineSymbol(math, mathord, "\u263c", "\\sun", true);
978
+ defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
979
+ defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
976
980
 
977
981
  // AMS Negated Binary Relations
978
982
  defineSymbol(math, rel, "\u226e", "\\nless", true);
@@ -1117,6 +1121,7 @@ defineSymbol(math, rel, "\u2ab7", "\\precapprox", true);
1117
1121
  defineSymbol(math, rel, "\u22b2", "\\vartriangleleft");
1118
1122
  defineSymbol(math, rel, "\u22b4", "\\trianglelefteq");
1119
1123
  defineSymbol(math, rel, "\u22a8", "\\vDash", true);
1124
+ defineSymbol(math, rel, "\u22ab", "\\VDash", true);
1120
1125
  defineSymbol(math, rel, "\u22aa", "\\Vvdash", true);
1121
1126
  defineSymbol(math, rel, "\u2323", "\\smallsmile");
1122
1127
  defineSymbol(math, rel, "\u2322", "\\smallfrown");
@@ -1766,13 +1771,16 @@ for (let i = 0; i < 10; i++) {
1766
1771
  * much of this module.
1767
1772
  */
1768
1773
 
1774
+ const openDelims = "([{⌊⌈⟨⟮⎰⟦⦃";
1775
+ const closeDelims = ")]}⌋⌉⟩⟯⎱⟦⦄";
1776
+
1769
1777
  function setLineBreaks(expression, wrapMode, isDisplayMode) {
1770
1778
  const mtrs = [];
1771
1779
  let mrows = [];
1772
1780
  let block = [];
1773
1781
  let numTopLevelEquals = 0;
1774
- let canBeBIN = false; // The first node cannot be an infix binary operator.
1775
1782
  let i = 0;
1783
+ let level = 0;
1776
1784
  while (i < expression.length) {
1777
1785
  while (expression[i] instanceof DocumentFragment) {
1778
1786
  expression.splice(i, 1, ...expression[i].children); // Expand the fragment.
@@ -1795,7 +1803,12 @@ function setLineBreaks(expression, wrapMode, isDisplayMode) {
1795
1803
  }
1796
1804
  block.push(node);
1797
1805
  if (node.type && node.type === "mo" && node.children.length === 1) {
1798
- if (wrapMode === "=" && node.children[0].text === "=") {
1806
+ const ch = node.children[0].text;
1807
+ if (openDelims.indexOf(ch) > -1) {
1808
+ level += 1;
1809
+ } else if (closeDelims.indexOf(ch) > -1) {
1810
+ level -= 1;
1811
+ } else if (level === 0 && wrapMode === "=" && ch === "=") {
1799
1812
  numTopLevelEquals += 1;
1800
1813
  if (numTopLevelEquals > 1) {
1801
1814
  block.pop();
@@ -1804,59 +1817,48 @@ function setLineBreaks(expression, wrapMode, isDisplayMode) {
1804
1817
  mrows.push(element);
1805
1818
  block = [node];
1806
1819
  }
1807
- } else if (wrapMode === "tex") {
1808
- // This may be a place for a soft line break.
1809
- if (canBeBIN && !node.attributes.form) {
1810
- // Check if the following node is a \nobreak text node, e.g. "~""
1811
- const next = i < expression.length - 1 ? expression[i + 1] : null;
1812
- let glueIsFreeOfNobreak = true;
1813
- if (
1814
- !(
1815
- next &&
1816
- next.type === "mtext" &&
1817
- next.attributes.linebreak &&
1818
- next.attributes.linebreak === "nobreak"
1819
- )
1820
- ) {
1821
- // We may need to start a new block.
1822
- // First, put any post-operator glue on same line as operator.
1823
- for (let j = i + 1; j < expression.length; j++) {
1824
- const nd = expression[j];
1820
+ } else if (level === 0 && wrapMode === "tex") {
1821
+ // Check if the following node is a \nobreak text node, e.g. "~""
1822
+ const next = i < expression.length - 1 ? expression[i + 1] : null;
1823
+ let glueIsFreeOfNobreak = true;
1824
+ if (
1825
+ !(
1826
+ next &&
1827
+ next.type === "mtext" &&
1828
+ next.attributes.linebreak &&
1829
+ next.attributes.linebreak === "nobreak"
1830
+ )
1831
+ ) {
1832
+ // We may need to start a new block.
1833
+ // First, put any post-operator glue on same line as operator.
1834
+ for (let j = i + 1; j < expression.length; j++) {
1835
+ const nd = expression[j];
1836
+ if (
1837
+ nd.type &&
1838
+ nd.type === "mspace" &&
1839
+ !(nd.attributes.linebreak && nd.attributes.linebreak === "newline")
1840
+ ) {
1841
+ block.push(nd);
1842
+ i += 1;
1825
1843
  if (
1826
- nd.type &&
1827
- nd.type === "mspace" &&
1828
- !(nd.attributes.linebreak && nd.attributes.linebreak === "newline")
1844
+ nd.attributes &&
1845
+ nd.attributes.linebreak &&
1846
+ nd.attributes.linebreak === "nobreak"
1829
1847
  ) {
1830
- block.push(nd);
1831
- i += 1;
1832
- if (
1833
- nd.attributes &&
1834
- nd.attributes.linebreak &&
1835
- nd.attributes.linebreak === "nobreak"
1836
- ) {
1837
- glueIsFreeOfNobreak = false;
1838
- }
1839
- } else {
1840
- break;
1848
+ glueIsFreeOfNobreak = false;
1841
1849
  }
1850
+ } else {
1851
+ break;
1842
1852
  }
1843
1853
  }
1844
- if (glueIsFreeOfNobreak) {
1845
- // Start a new block. (Insert a soft linebreak.)
1846
- const element = new mathMLTree.MathNode("mrow", block);
1847
- mrows.push(element);
1848
- block = [];
1849
- }
1850
- canBeBIN = false;
1851
1854
  }
1852
- const isOpenDelimiter = node.attributes.form && node.attributes.form === "prefix";
1853
- // Any operator that follows an open delimiter is unary.
1854
- canBeBIN = !(node.attributes.separator || isOpenDelimiter);
1855
- } else {
1856
- canBeBIN = true;
1855
+ if (glueIsFreeOfNobreak) {
1856
+ // Start a new block. (Insert a soft linebreak.)
1857
+ const element = new mathMLTree.MathNode("mrow", block);
1858
+ mrows.push(element);
1859
+ block = [];
1860
+ }
1857
1861
  }
1858
- } else {
1859
- canBeBIN = true;
1860
1862
  }
1861
1863
  i += 1;
1862
1864
  }
@@ -2133,9 +2135,10 @@ function buildMathML(tree, texExpression, style, settings) {
2133
2135
  }
2134
2136
  if (settings.displayMode) {
2135
2137
  math.setAttribute("display", "block");
2136
- math.style.display = math.children.length === 1 && math.children[0].type === "mtable"
2137
- ? "inline"
2138
- : "block math";
2138
+ math.style.display = "block math"; // necessary in Chromium.
2139
+ // Firefox and Safari do not recognize display: "block math".
2140
+ // Set a class so that the CSS file can set display: block.
2141
+ math.classes = ["tml-display"];
2139
2142
  }
2140
2143
  return math;
2141
2144
  }
@@ -3664,10 +3667,9 @@ defineFunction({
3664
3667
  // so we have to explicitly set stretchy to true.
3665
3668
  node.setAttribute("stretchy", "true");
3666
3669
  }
3667
-
3668
3670
  node.setAttribute("symmetric", "true"); // Needed for tall arrows in Firefox.
3669
3671
  node.setAttribute("minsize", sizeToMaxHeight[group.size] + "em");
3670
- // Don't set the maxsize attribute. It's broken in Chromium.
3672
+ node.setAttribute("maxsize", sizeToMaxHeight[group.size] + "em");
3671
3673
  return node;
3672
3674
  }
3673
3675
  });
@@ -3802,34 +3804,42 @@ const padding$1 = _ => {
3802
3804
 
3803
3805
  const mathmlBuilder$8 = (group, style) => {
3804
3806
  let node;
3805
- if (group.label.indexOf("colorbox") > -1) {
3806
- // Chrome mpadded +width attribute is broken. Insert <mspace>
3807
- node = new mathMLTree.MathNode("mpadded", [
3807
+ if (group.label.indexOf("colorbox") > -1 || group.label === "\\boxed") {
3808
+ // MathML core does not support +width attribute in <mpadded>.
3809
+ // Firefox does not reliably add side padding.
3810
+ // Insert <mspace>
3811
+ node = new mathMLTree.MathNode("mrow", [
3808
3812
  padding$1(),
3809
3813
  buildGroup$1(group.body, style),
3810
3814
  padding$1()
3811
3815
  ]);
3812
3816
  } else {
3813
- node = new mathMLTree.MathNode("menclose", [buildGroup$1(group.body, style)]);
3817
+ node = new mathMLTree.MathNode("mrow", [buildGroup$1(group.body, style)]);
3814
3818
  }
3815
3819
  switch (group.label) {
3816
3820
  case "\\overline":
3817
- node.setAttribute("notation", "top");
3818
3821
  node.style.padding = "0.1em 0 0 0";
3819
3822
  node.style.borderTop = "0.065em solid";
3820
3823
  break
3821
3824
  case "\\underline":
3822
- node.setAttribute("notation", "bottom");
3823
3825
  node.style.padding = "0 0 0.1em 0";
3824
3826
  node.style.borderBottom = "0.065em solid";
3825
3827
  break
3826
3828
  case "\\cancel":
3827
- node.setAttribute("notation", "updiagonalstrike");
3828
- node.classes.push("cancel");
3829
+ node.style.background = `linear-gradient(to top left,
3830
+ rgba(0,0,0,0) 0%,
3831
+ rgba(0,0,0,0) calc(50% - 0.06em),
3832
+ rgba(0,0,0,1) 50%,
3833
+ rgba(0,0,0,0) calc(50% + 0.06em),
3834
+ rgba(0,0,0,0) 100%);`;
3829
3835
  break
3830
3836
  case "\\bcancel":
3831
- node.setAttribute("notation", "downdiagonalstrike");
3832
- node.classes.push("bcancel");
3837
+ node.style.background = `linear-gradient(to top right,
3838
+ rgba(0,0,0,0) 0%,
3839
+ rgba(0,0,0,0) calc(50% - 0.06em),
3840
+ rgba(0,0,0,1) 50%,
3841
+ rgba(0,0,0,0) calc(50% + 0.06em),
3842
+ rgba(0,0,0,0) 100%);`;
3833
3843
  break
3834
3844
  /*
3835
3845
  case "\\longdiv":
@@ -3839,18 +3849,21 @@ const mathmlBuilder$8 = (group, style) => {
3839
3849
  node.setAttribute("notation", "phasorangle");
3840
3850
  break */
3841
3851
  case "\\angl":
3842
- node.setAttribute("notation", "actuarial");
3843
3852
  node.style.padding = "0.03889em 0.03889em 0 0.03889em";
3844
3853
  node.style.borderTop = "0.049em solid";
3845
3854
  node.style.borderRight = "0.049em solid";
3846
3855
  node.style.marginRight = "0.03889em";
3847
3856
  break
3848
3857
  case "\\sout":
3849
- node.setAttribute("notation", "horizontalstrike");
3850
3858
  node.style["text-decoration"] = "line-through 0.08em solid";
3851
3859
  break
3860
+ case "\\boxed":
3861
+ // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}} from amsmath.sty
3862
+ node.style = { padding: "3pt 0 3pt 0", border: "1px solid" };
3863
+ node.setAttribute("scriptlevel", "0");
3864
+ node.setAttribute("displaystyle", "true");
3865
+ break
3852
3866
  case "\\fbox":
3853
- node.setAttribute("notation", "box");
3854
3867
  node.style = { padding: "3pt", border: "1px solid" };
3855
3868
  break
3856
3869
  case "\\fcolorbox":
@@ -3870,8 +3883,18 @@ const mathmlBuilder$8 = (group, style) => {
3870
3883
  break
3871
3884
  }
3872
3885
  case "\\xcancel":
3873
- node.setAttribute("notation", "updiagonalstrike downdiagonalstrike");
3874
- node.classes.push("xcancel");
3886
+ node.style.background = `linear-gradient(to top left,
3887
+ rgba(0,0,0,0) 0%,
3888
+ rgba(0,0,0,0) calc(50% - 0.06em),
3889
+ rgba(0,0,0,1) 50%,
3890
+ rgba(0,0,0,0) calc(50% + 0.06em),
3891
+ rgba(0,0,0,0) 100%),
3892
+ linear-gradient(to top right,
3893
+ rgba(0,0,0,0) 0%,
3894
+ rgba(0,0,0,0) calc(50% - 0.06em),
3895
+ rgba(0,0,0,1) 50%,
3896
+ rgba(0,0,0,0) calc(50% + 0.06em),
3897
+ rgba(0,0,0,0) 100%);`;
3875
3898
  break
3876
3899
  }
3877
3900
  if (group.backgroundColor) {
@@ -3965,7 +3988,7 @@ defineFunction({
3965
3988
 
3966
3989
  defineFunction({
3967
3990
  type: "enclose",
3968
- names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline"],
3991
+ names: ["\\angl", "\\cancel", "\\bcancel", "\\xcancel", "\\sout", "\\overline", "\\boxed"],
3969
3992
  // , "\\phase", "\\longdiv"
3970
3993
  props: {
3971
3994
  numArgs: 1
@@ -4302,24 +4325,94 @@ const mathmlBuilder$7 = function(group, style) {
4302
4325
  // Write horizontal rules
4303
4326
  if (i === 0 && hlines[0].length > 0) {
4304
4327
  if (hlines[0].length === 2) {
4305
- mtr.classes.push("tml-top-double");
4328
+ mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; });
4306
4329
  } else {
4307
- mtr.classes.push(hlines[0][0] ? "tml-top-dashed" : "tml-top-solid");
4330
+ mtr.children.forEach(cell => {
4331
+ cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid";
4332
+ });
4308
4333
  }
4309
4334
  }
4310
4335
  if (hlines[i + 1].length > 0) {
4311
4336
  if (hlines[i + 1].length === 2) {
4312
- mtr.classes.push("tml-hline-double");
4337
+ mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; });
4313
4338
  } else {
4314
- mtr.classes.push(hlines[i + 1][0] ? "tml-hline-dashed" : "tml-hline-solid");
4339
+ mtr.children.forEach(cell => {
4340
+ cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid";
4341
+ });
4315
4342
  }
4316
4343
  }
4317
4344
  tbl.push(mtr);
4318
4345
  }
4319
- let table = new mathMLTree.MathNode("mtable", tbl);
4346
+
4320
4347
  if (group.envClasses.length > 0) {
4321
- table.classes = group.envClasses.map(e => "tml-" + e);
4348
+ const pad = group.envClasses.includes("jot")
4349
+ ? "0.7" // 0.5ex + 0.09em top & bot padding
4350
+ : group.envClasses.includes("small")
4351
+ ? "0.35"
4352
+ : "0.5"; // 0.5ex default top & bot padding
4353
+ const sidePadding = group.envClasses.includes("abut")
4354
+ ? "0"
4355
+ : group.envClasses.includes("cases")
4356
+ ? "0"
4357
+ : group.envClasses.includes("small")
4358
+ ? "0.1389"
4359
+ : group.envClasses.includes("cd")
4360
+ ? "0.25"
4361
+ : "0.4"; // default side padding
4362
+
4363
+ const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;
4364
+
4365
+ const sidePad = (j, hand) => {
4366
+ if (j === 0 && hand === 0) { return "0" }
4367
+ if (j === numCols - 1 && hand === 1) { return "0" }
4368
+ if (group.envClasses[0] !== "align") { return sidePadding }
4369
+ if (hand === 1) { return "0" }
4370
+ if (group.addEqnNum) {
4371
+ return (j % 2) ? "1" : "0"
4372
+ } else {
4373
+ return (j % 2) ? "0" : "1"
4374
+ }
4375
+ };
4376
+
4377
+ // Padding
4378
+ for (let i = 0; i < tbl.length; i++) {
4379
+ for (let j = 0; j < tbl[i].children.length; j++) {
4380
+ tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`;
4381
+ }
4382
+ }
4383
+
4384
+ // Justification
4385
+ const align = group.envClasses.includes("align") || group.envClasses.includes("alignat");
4386
+ for (let i = 0; i < tbl.length; i++) {
4387
+ const row = tbl[i];
4388
+ if (align) {
4389
+ for (let j = 0; j < row.children.length; j++) {
4390
+ // Chromium does not recognize text-align: left. Use -webkit-
4391
+ // TODO: Remove -webkit- when Chromium no longer needs it.
4392
+ row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
4393
+ }
4394
+ }
4395
+ if (row.children.length > 1 && group.envClasses.includes("cases")) {
4396
+ row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
4397
+ }
4398
+
4399
+ if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
4400
+ for (const cell of row.children) {
4401
+ cell.style.textAlign = "-webkit-" + "left";
4402
+ }
4403
+ }
4404
+ }
4405
+ } else {
4406
+ // Set zero padding on side of the matrix
4407
+ for (let i = 0; i < tbl.length; i++) {
4408
+ tbl[i].children[0].style.paddingLeft = "0em";
4409
+ if (tbl[i].children.length === tbl[0].children.length) {
4410
+ tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em";
4411
+ }
4412
+ }
4322
4413
  }
4414
+
4415
+ let table = new mathMLTree.MathNode("mtable", tbl);
4323
4416
  if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); }
4324
4417
 
4325
4418
  if (group.addEqnNum || group.envClasses.includes("multline")) {
@@ -4399,6 +4492,8 @@ const mathmlBuilder$7 = function(group, style) {
4399
4492
  align = "left " + (align.length > 0 ? align : "center ") + "right ";
4400
4493
  }
4401
4494
  if (align) {
4495
+ // Firefox reads this attribute, not the -webkit-left|right written above.
4496
+ // TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
4402
4497
  table.setAttribute("columnalign", align.trim());
4403
4498
  }
4404
4499
 
@@ -4423,7 +4518,7 @@ const alignedHandler = function(context, args) {
4423
4518
  cols,
4424
4519
  addEqnNum: context.envName === "align" || context.envName === "alignat",
4425
4520
  emptySingleRow: true,
4426
- envClasses: ["jot", "abut"], // set row spacing & provisional column spacing
4521
+ envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
4427
4522
  maxNumCols: context.envName === "split" ? 2 : undefined,
4428
4523
  leqno: context.parser.settings.leqno
4429
4524
  },
@@ -4441,18 +4536,22 @@ const alignedHandler = function(context, args) {
4441
4536
  // binary. This behavior is implemented in amsmath's \start@aligned.
4442
4537
  let numMaths;
4443
4538
  let numCols = 0;
4444
- if (args[0] && args[0].type === "ordgroup") {
4539
+ const isAlignedAt = context.envName.indexOf("at") > -1;
4540
+ if (args[0] && isAlignedAt) {
4541
+ // alignat environment takes an argument w/ number of columns
4445
4542
  let arg0 = "";
4446
4543
  for (let i = 0; i < args[0].body.length; i++) {
4447
4544
  const textord = assertNodeType(args[0].body[i], "textord");
4448
4545
  arg0 += textord.text;
4449
4546
  }
4547
+ if (isNaN(arg0)) {
4548
+ throw new ParseError("The alignat enviroment requires a numeric first argument.")
4549
+ }
4450
4550
  numMaths = Number(arg0);
4451
4551
  numCols = numMaths * 2;
4452
4552
  }
4453
- const isAligned = !numCols;
4454
4553
  res.body.forEach(function(row) {
4455
- if (!isAligned) {
4554
+ if (isAlignedAt) {
4456
4555
  // Case 1
4457
4556
  const curMaths = row.length / 2;
4458
4557
  if (numMaths < curMaths) {
@@ -4480,14 +4579,10 @@ const alignedHandler = function(context, args) {
4480
4579
  align: align
4481
4580
  };
4482
4581
  }
4483
- if (context.envName === "split") ; else if (context.envName.indexOf("ed") > -1) {
4484
- res.envClasses.push("aligned"); // Sets justification
4485
- } else if (isAligned) {
4486
- res.envClasses[1] = context.envName === "align*"
4487
- ? "align-star"
4488
- : "align"; // Sets column spacing & justification
4582
+ if (context.envName === "split") ; else if (isAlignedAt) {
4583
+ res.envClasses.push("alignat"); // Sets justification
4489
4584
  } else {
4490
- res.envClasses.push("aligned"); // Sets justification
4585
+ res.envClasses[0] = "align"; // Sets column spacing & justification
4491
4586
  }
4492
4587
  return res;
4493
4588
  };
@@ -4737,7 +4832,7 @@ defineEnvironment({
4737
4832
  }
4738
4833
  const res = {
4739
4834
  cols: [],
4740
- envClasses: ["jot", "abut"],
4835
+ envClasses: ["abut", "jot"],
4741
4836
  addEqnNum: context.envName === "gather",
4742
4837
  emptySingleRow: true,
4743
4838
  leqno: context.parser.settings.leqno
@@ -6831,8 +6926,6 @@ defineFunction({
6831
6926
  }
6832
6927
  });
6833
6928
 
6834
- const sign = num => num >= 0 ? "+" : "-";
6835
-
6836
6929
  // \raise, \lower, and \raisebox
6837
6930
 
6838
6931
  const mathmlBuilder = (group, style) => {
@@ -6840,11 +6933,13 @@ const mathmlBuilder = (group, style) => {
6840
6933
  const node = new mathMLTree.MathNode("mpadded", [buildGroup$1(group.body, newStyle)]);
6841
6934
  const dy = calculateSize(group.dy, style);
6842
6935
  node.setAttribute("voffset", dy.number + dy.unit);
6843
- const dyAbs = Math.abs(dy.number);
6844
- // The next two lines do not work in Chromium.
6845
- // TODO: Find some other way to adjust height and depth.
6846
- node.setAttribute("height", sign(dy.number) + dyAbs + dy.unit);
6847
- node.setAttribute("depth", sign(-dy.number) + dyAbs + dy.unit);
6936
+ // Add padding, which acts to increase height in Chromium.
6937
+ // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.
6938
+ if (dy.number > 0) {
6939
+ node.style.padding = dy.number + dy.unit + " 0 0 0";
6940
+ } else {
6941
+ node.style.padding = "0 0 " + Math.abs(dy.number) + dy.unit + " 0";
6942
+ }
6848
6943
  return node
6849
6944
  };
6850
6945
 
@@ -8473,9 +8568,6 @@ defineMacro("\u22ee", "\\vdots");
8473
8568
  //\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
8474
8569
  defineMacro("\\substack", "\\begin{subarray}{c}#1\\end{subarray}");
8475
8570
 
8476
- // \newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
8477
- defineMacro("\\boxed", "\\fbox{$\\displaystyle{#1}$}");
8478
-
8479
8571
  // \def\iff{\DOTSB\;\Longleftrightarrow\;}
8480
8572
  // \def\implies{\DOTSB\;\Longrightarrow\;}
8481
8573
  // \def\impliedby{\DOTSB\;\Longleftarrow\;}
@@ -8724,7 +8816,7 @@ defineMacro(
8724
8816
  defineMacro(
8725
8817
  "\\Temml",
8726
8818
  // eslint-disable-next-line max-len
8727
- "\\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}}"
8819
+ "\\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}}"
8728
8820
  );
8729
8821
 
8730
8822
  // \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
@@ -12904,7 +12996,7 @@ class Style {
12904
12996
  * https://mit-license.org/
12905
12997
  */
12906
12998
 
12907
- const version = "0.10.13";
12999
+ const version = "0.10.15";
12908
13000
 
12909
13001
  function postProcess(block) {
12910
13002
  const labelMap = {};
@@ -12955,6 +13047,7 @@ function postProcess(block) {
12955
13047
  /* eslint no-console:0 */
12956
13048
 
12957
13049
  /**
13050
+ * @type {import('./temml').render}
12958
13051
  * Parse and build an expression, and place that expression in the DOM node
12959
13052
  * given.
12960
13053
  */
@@ -12992,6 +13085,7 @@ if (typeof document !== "undefined") {
12992
13085
  }
12993
13086
 
12994
13087
  /**
13088
+ * @type {import('./temml').renderToString}
12995
13089
  * Parse and build an expression, and return the markup for that.
12996
13090
  */
12997
13091
  const renderToString = function(expression, options) {
@@ -13000,6 +13094,7 @@ const renderToString = function(expression, options) {
13000
13094
  };
13001
13095
 
13002
13096
  /**
13097
+ * @type {import('./temml').generateParseTree}
13003
13098
  * Parse an expression and return the parse tree.
13004
13099
  */
13005
13100
  const generateParseTree = function(expression, options) {
@@ -13008,6 +13103,7 @@ const generateParseTree = function(expression, options) {
13008
13103
  };
13009
13104
 
13010
13105
  /**
13106
+ * @type {import('./temml').definePreamble}
13011
13107
  * Take an expression which contains a preamble.
13012
13108
  * Parse it and return the macros.
13013
13109
  */
@@ -13040,6 +13136,7 @@ const renderError = function(error, expression, options) {
13040
13136
  };
13041
13137
 
13042
13138
  /**
13139
+ * @type {import('./temml').renderToMathMLTree}
13043
13140
  * Generates and returns the Temml build tree. This is used for advanced
13044
13141
  * use cases (like rendering to custom output).
13045
13142
  */
@@ -13057,6 +13154,7 @@ const renderToMathMLTree = function(expression, options) {
13057
13154
  }
13058
13155
  };
13059
13156
 
13157
+ /** @type {import('./temml').default} */
13060
13158
  var temml = {
13061
13159
  /**
13062
13160
  * Current Temml version
@@ -0,0 +1,60 @@
1
+ export interface Options {
2
+ displayMode?: boolean;
3
+ annotate?: boolean;
4
+ leqno?: boolean;
5
+ throwOnError?: boolean;
6
+ errorColor?: string;
7
+ macros?: Record<string, string>;
8
+ wrap?: "tex" | "=" | "none";
9
+ xml?: boolean;
10
+ colorIsTextColor?: boolean;
11
+ strict?: boolean;
12
+ trust?: boolean | ((context: any) => boolean);
13
+ maxSize?: [number, number];
14
+ maxExpand?: number;
15
+ }
16
+
17
+ export function render(
18
+ expression: string,
19
+ baseNode: HTMLElement,
20
+ options?: Options,
21
+ ): void;
22
+
23
+ export function renderToString(expression: string, options?: Options): string;
24
+
25
+ export function generateParseTree(expression: string, options?: Options): any;
26
+
27
+ export function definePreamble(expression: string, options?: Options): any;
28
+
29
+ export function renderToMathMLTree(expression: string, options?: Options): any;
30
+
31
+ declare function postProcess(block: any): void;
32
+ declare function defineMacro(name: string, body: any): void;
33
+ declare function defineSymbol(
34
+ mode: string,
35
+ group: string,
36
+ replace: string,
37
+ name: string,
38
+ acceptUnicodeChar: boolean,
39
+ ): void;
40
+ declare class ParseError {
41
+ constructor(
42
+ message: string, // The error message
43
+ token: any, // An object providing position information
44
+ ) {}
45
+ }
46
+
47
+ declare const Temml: {
48
+ version: string;
49
+ render: typeof render;
50
+ renderToString: typeof renderToString;
51
+ postProcess: typeof postProcess;
52
+ ParseError: typeof ParseError;
53
+ definePreamble: typeof definePreamble;
54
+ __parse: typeof generateParseTree;
55
+ __renderToMathMLTree: typeof renderToMathMLTree;
56
+ __defineSymbol: typeof defineSymbol;
57
+ __defineMacro: typeof defineMacro;
58
+ };
59
+
60
+ export default Temml;