temml 0.10.14 → 0.10.16
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +1 -1
- package/dist/Temml-Asana.css +18 -146
- package/dist/Temml-Latin-Modern.css +20 -148
- package/dist/Temml-Libertinus.css +18 -147
- package/dist/Temml-Local.css +19 -147
- package/dist/Temml-STIX2.css +18 -146
- package/dist/Temml.woff2 +0 -0
- package/dist/temml.cjs +221 -55
- package/dist/temml.d.ts +60 -0
- package/dist/temml.js +221 -55
- package/dist/temml.min.js +1 -1
- package/dist/temml.mjs +221 -55
- package/dist/temmlPostProcess.js +1 -1
- package/package.json +4 -2
- package/src/Parser.js +0 -1
- package/src/buildMathML.js +1 -3
- package/src/domTree.js +2 -2
- package/src/environments/array.js +99 -23
- package/src/functions/accent.js +17 -22
- package/src/functions/accentunder.js +1 -1
- package/src/functions/enclose.js +24 -3
- package/src/functions/supsub.js +8 -1
- package/src/functions/symbolsOrd.js +3 -1
- package/src/macros.js +3 -0
- package/src/postProcess.js +1 -1
- package/src/stretchy.js +48 -1
- package/src/symbols.js +13 -1
- package/temml.js +6 -0
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
|
/**
|
@@ -973,6 +1020,10 @@ defineSymbol(math, mathord, "\u21af", "\\lightning", true);
|
|
973
1020
|
defineSymbol(math, mathord, "\u220E", "\\QED", true);
|
974
1021
|
defineSymbol(math, mathord, "\u2030", "\\permil", true);
|
975
1022
|
defineSymbol(text, textord, "\u2030", "\\permil");
|
1023
|
+
defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
|
1024
|
+
defineSymbol(math, mathord, "\u263c", "\\sun", true);
|
1025
|
+
defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
|
1026
|
+
defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
|
976
1027
|
|
977
1028
|
// AMS Negated Binary Relations
|
978
1029
|
defineSymbol(math, rel, "\u226e", "\\nless", true);
|
@@ -1051,6 +1102,8 @@ defineSymbol(math, textord, "\u2127", "\\mho");
|
|
1051
1102
|
defineSymbol(math, textord, "\u2132", "\\Finv", true);
|
1052
1103
|
defineSymbol(math, textord, "\u2141", "\\Game", true);
|
1053
1104
|
defineSymbol(math, textord, "\u2035", "\\backprime");
|
1105
|
+
defineSymbol(math, textord, "\u2036", "\\backdprime");
|
1106
|
+
defineSymbol(math, textord, "\u2037", "\\backtrprime");
|
1054
1107
|
defineSymbol(math, textord, "\u25b2", "\\blacktriangle");
|
1055
1108
|
defineSymbol(math, textord, "\u25bc", "\\blacktriangledown");
|
1056
1109
|
defineSymbol(math, textord, "\u25a0", "\\blacksquare");
|
@@ -1254,6 +1307,9 @@ defineSymbol(text, textord, "\u2423", "\\textvisiblespace", true);
|
|
1254
1307
|
defineSymbol(math, textord, "\u2220", "\\angle", true);
|
1255
1308
|
defineSymbol(math, textord, "\u221e", "\\infty", true);
|
1256
1309
|
defineSymbol(math, textord, "\u2032", "\\prime");
|
1310
|
+
defineSymbol(math, textord, "\u2033", "\\dprime");
|
1311
|
+
defineSymbol(math, textord, "\u2034", "\\trprime");
|
1312
|
+
defineSymbol(math, textord, "\u2057", "\\qprime");
|
1257
1313
|
defineSymbol(math, textord, "\u25b3", "\\triangle");
|
1258
1314
|
defineSymbol(text, textord, "\u0391", "\\Alpha", true);
|
1259
1315
|
defineSymbol(text, textord, "\u0392", "\\Beta", true);
|
@@ -1433,7 +1489,8 @@ defineSymbol(math, punct, ";", ";");
|
|
1433
1489
|
defineSymbol(math, bin, "\u22bc", "\\barwedge", true);
|
1434
1490
|
defineSymbol(math, bin, "\u22bb", "\\veebar", true);
|
1435
1491
|
defineSymbol(math, bin, "\u2299", "\\odot", true);
|
1436
|
-
|
1492
|
+
// Firefox turns ⊕ into an emoji. So append \uFE0E. Define Unicode character in macros, not here.
|
1493
|
+
defineSymbol(math, bin, "\u2295\uFE0E", "\\oplus");
|
1437
1494
|
defineSymbol(math, bin, "\u2297", "\\otimes", true);
|
1438
1495
|
defineSymbol(math, textord, "\u2202", "\\partial", true);
|
1439
1496
|
defineSymbol(math, bin, "\u2298", "\\oslash", true);
|
@@ -1664,6 +1721,8 @@ for (let i = 0; i < letters.length; i++) {
|
|
1664
1721
|
defineSymbol(math, mathord, ch, ch);
|
1665
1722
|
defineSymbol(text, textord, ch, ch);
|
1666
1723
|
}
|
1724
|
+
// Prevent Firefox from using a dotless i.
|
1725
|
+
defineSymbol(text, textord, "i\uFE0E", "i");
|
1667
1726
|
|
1668
1727
|
// Some more letters in Unicode Basic Multilingual Plane.
|
1669
1728
|
const narrow = "ÇÐÞçþℂℍℕℙℚℝℤℎℏℊℋℌℐℑℒℓ℘ℛℜℬℰℱℳℭℨ";
|
@@ -2131,9 +2190,7 @@ function buildMathML(tree, texExpression, style, settings) {
|
|
2131
2190
|
}
|
2132
2191
|
if (settings.displayMode) {
|
2133
2192
|
math.setAttribute("display", "block");
|
2134
|
-
math.style.display = math
|
2135
|
-
? "inline"
|
2136
|
-
: "block math"; // necessary in Chromium.
|
2193
|
+
math.style.display = "block math"; // necessary in Chromium.
|
2137
2194
|
// Firefox and Safari do not recognize display: "block math".
|
2138
2195
|
// Set a class so that the CSS file can set display: block.
|
2139
2196
|
math.classes = ["tml-display"];
|
@@ -2143,7 +2200,7 @@ function buildMathML(tree, texExpression, style, settings) {
|
|
2143
2200
|
|
2144
2201
|
const mathmlBuilder$a = (group, style) => {
|
2145
2202
|
const accentNode = group.isStretchy
|
2146
|
-
? stretchy.
|
2203
|
+
? stretchy.accentNode(group)
|
2147
2204
|
: new mathMLTree.MathNode("mo", [makeText(group.label, group.mode)]);
|
2148
2205
|
|
2149
2206
|
if (group.label === "\\vec") {
|
@@ -2163,25 +2220,21 @@ const mathmlBuilder$a = (group, style) => {
|
|
2163
2220
|
return node;
|
2164
2221
|
};
|
2165
2222
|
|
2166
|
-
const
|
2167
|
-
|
2168
|
-
|
2169
|
-
|
2170
|
-
|
2171
|
-
|
2172
|
-
|
2173
|
-
|
2174
|
-
|
2175
|
-
|
2176
|
-
|
2177
|
-
|
2178
|
-
|
2179
|
-
|
2180
|
-
|
2181
|
-
]
|
2182
|
-
.map((accent) => `\\${accent}`)
|
2183
|
-
.join("|")
|
2184
|
-
);
|
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
|
+
]);
|
2185
2238
|
|
2186
2239
|
// Accents
|
2187
2240
|
defineFunction({
|
@@ -2219,7 +2272,7 @@ defineFunction({
|
|
2219
2272
|
handler: (context, args) => {
|
2220
2273
|
const base = normalizeArgument(args[0]);
|
2221
2274
|
|
2222
|
-
const isStretchy = !
|
2275
|
+
const isStretchy = !nonStretchyAccents.has(context.funcName);
|
2223
2276
|
|
2224
2277
|
return {
|
2225
2278
|
type: "accent",
|
@@ -2257,7 +2310,6 @@ defineFunction({
|
|
2257
2310
|
mode: mode,
|
2258
2311
|
label: context.funcName,
|
2259
2312
|
isStretchy: false,
|
2260
|
-
isShifty: true,
|
2261
2313
|
base: base
|
2262
2314
|
};
|
2263
2315
|
},
|
@@ -2287,7 +2339,7 @@ defineFunction({
|
|
2287
2339
|
};
|
2288
2340
|
},
|
2289
2341
|
mathmlBuilder: (group, style) => {
|
2290
|
-
const accentNode = stretchy.
|
2342
|
+
const accentNode = stretchy.accentNode(group);
|
2291
2343
|
accentNode.style["math-depth"] = 0;
|
2292
2344
|
const node = new mathMLTree.MathNode("munder", [
|
2293
2345
|
buildGroup$1(group.base, style),
|
@@ -3824,10 +3876,20 @@ const mathmlBuilder$8 = (group, style) => {
|
|
3824
3876
|
node.style.borderBottom = "0.065em solid";
|
3825
3877
|
break
|
3826
3878
|
case "\\cancel":
|
3827
|
-
node.
|
3879
|
+
node.style.background = `linear-gradient(to top left,
|
3880
|
+
rgba(0,0,0,0) 0%,
|
3881
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3882
|
+
rgba(0,0,0,1) 50%,
|
3883
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3884
|
+
rgba(0,0,0,0) 100%);`;
|
3828
3885
|
break
|
3829
3886
|
case "\\bcancel":
|
3830
|
-
node.
|
3887
|
+
node.style.background = `linear-gradient(to top right,
|
3888
|
+
rgba(0,0,0,0) 0%,
|
3889
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3890
|
+
rgba(0,0,0,1) 50%,
|
3891
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3892
|
+
rgba(0,0,0,0) 100%);`;
|
3831
3893
|
break
|
3832
3894
|
/*
|
3833
3895
|
case "\\longdiv":
|
@@ -3871,7 +3933,18 @@ const mathmlBuilder$8 = (group, style) => {
|
|
3871
3933
|
break
|
3872
3934
|
}
|
3873
3935
|
case "\\xcancel":
|
3874
|
-
node.
|
3936
|
+
node.style.background = `linear-gradient(to top left,
|
3937
|
+
rgba(0,0,0,0) 0%,
|
3938
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3939
|
+
rgba(0,0,0,1) 50%,
|
3940
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3941
|
+
rgba(0,0,0,0) 100%),
|
3942
|
+
linear-gradient(to top right,
|
3943
|
+
rgba(0,0,0,0) 0%,
|
3944
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3945
|
+
rgba(0,0,0,1) 50%,
|
3946
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3947
|
+
rgba(0,0,0,0) 100%);`;
|
3875
3948
|
break
|
3876
3949
|
}
|
3877
3950
|
if (group.backgroundColor) {
|
@@ -4302,24 +4375,98 @@ const mathmlBuilder$7 = function(group, style) {
|
|
4302
4375
|
// Write horizontal rules
|
4303
4376
|
if (i === 0 && hlines[0].length > 0) {
|
4304
4377
|
if (hlines[0].length === 2) {
|
4305
|
-
mtr.
|
4378
|
+
mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; });
|
4306
4379
|
} else {
|
4307
|
-
mtr.
|
4380
|
+
mtr.children.forEach(cell => {
|
4381
|
+
cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid";
|
4382
|
+
});
|
4308
4383
|
}
|
4309
4384
|
}
|
4310
4385
|
if (hlines[i + 1].length > 0) {
|
4311
4386
|
if (hlines[i + 1].length === 2) {
|
4312
|
-
mtr.
|
4387
|
+
mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; });
|
4313
4388
|
} else {
|
4314
|
-
mtr.
|
4389
|
+
mtr.children.forEach(cell => {
|
4390
|
+
cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid";
|
4391
|
+
});
|
4315
4392
|
}
|
4316
4393
|
}
|
4317
4394
|
tbl.push(mtr);
|
4318
4395
|
}
|
4319
|
-
|
4396
|
+
|
4320
4397
|
if (group.envClasses.length > 0) {
|
4321
|
-
|
4398
|
+
const pad = group.envClasses.includes("jot")
|
4399
|
+
? "0.7" // 0.5ex + 0.09em top & bot padding
|
4400
|
+
: group.envClasses.includes("small")
|
4401
|
+
? "0.35"
|
4402
|
+
: "0.5"; // 0.5ex default top & bot padding
|
4403
|
+
const sidePadding = group.envClasses.includes("abut")
|
4404
|
+
? "0"
|
4405
|
+
: group.envClasses.includes("cases")
|
4406
|
+
? "0"
|
4407
|
+
: group.envClasses.includes("small")
|
4408
|
+
? "0.1389"
|
4409
|
+
: group.envClasses.includes("cd")
|
4410
|
+
? "0.25"
|
4411
|
+
: "0.4"; // default side padding
|
4412
|
+
|
4413
|
+
const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;
|
4414
|
+
|
4415
|
+
const sidePad = (j, hand) => {
|
4416
|
+
if (j === 0 && hand === 0) { return "0" }
|
4417
|
+
if (j === numCols - 1 && hand === 1) { return "0" }
|
4418
|
+
if (group.envClasses[0] !== "align") { return sidePadding }
|
4419
|
+
if (hand === 1) { return "0" }
|
4420
|
+
if (group.addEqnNum) {
|
4421
|
+
return (j % 2) ? "1" : "0"
|
4422
|
+
} else {
|
4423
|
+
return (j % 2) ? "0" : "1"
|
4424
|
+
}
|
4425
|
+
};
|
4426
|
+
|
4427
|
+
// Padding
|
4428
|
+
for (let i = 0; i < tbl.length; i++) {
|
4429
|
+
for (let j = 0; j < tbl[i].children.length; j++) {
|
4430
|
+
tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`;
|
4431
|
+
}
|
4432
|
+
}
|
4433
|
+
|
4434
|
+
// Justification
|
4435
|
+
const align = group.envClasses.includes("align") || group.envClasses.includes("alignat");
|
4436
|
+
for (let i = 0; i < tbl.length; i++) {
|
4437
|
+
const row = tbl[i];
|
4438
|
+
if (align) {
|
4439
|
+
for (let j = 0; j < row.children.length; j++) {
|
4440
|
+
// Chromium does not recognize text-align: left. Use -webkit-
|
4441
|
+
// TODO: Remove -webkit- when Chromium no longer needs it.
|
4442
|
+
row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
|
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
|
+
}
|
4448
|
+
}
|
4449
|
+
if (row.children.length > 1 && group.envClasses.includes("cases")) {
|
4450
|
+
row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
|
4451
|
+
}
|
4452
|
+
|
4453
|
+
if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
|
4454
|
+
for (const cell of row.children) {
|
4455
|
+
cell.style.textAlign = "-webkit-" + "left";
|
4456
|
+
}
|
4457
|
+
}
|
4458
|
+
}
|
4459
|
+
} else {
|
4460
|
+
// Set zero padding on side of the matrix
|
4461
|
+
for (let i = 0; i < tbl.length; i++) {
|
4462
|
+
tbl[i].children[0].style.paddingLeft = "0em";
|
4463
|
+
if (tbl[i].children.length === tbl[0].children.length) {
|
4464
|
+
tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em";
|
4465
|
+
}
|
4466
|
+
}
|
4322
4467
|
}
|
4468
|
+
|
4469
|
+
let table = new mathMLTree.MathNode("mtable", tbl);
|
4323
4470
|
if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); }
|
4324
4471
|
|
4325
4472
|
if (group.addEqnNum || group.envClasses.includes("multline")) {
|
@@ -4399,6 +4546,8 @@ const mathmlBuilder$7 = function(group, style) {
|
|
4399
4546
|
align = "left " + (align.length > 0 ? align : "center ") + "right ";
|
4400
4547
|
}
|
4401
4548
|
if (align) {
|
4549
|
+
// Firefox reads this attribute, not the -webkit-left|right written above.
|
4550
|
+
// TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
|
4402
4551
|
table.setAttribute("columnalign", align.trim());
|
4403
4552
|
}
|
4404
4553
|
|
@@ -4423,7 +4572,7 @@ const alignedHandler = function(context, args) {
|
|
4423
4572
|
cols,
|
4424
4573
|
addEqnNum: context.envName === "align" || context.envName === "alignat",
|
4425
4574
|
emptySingleRow: true,
|
4426
|
-
envClasses: ["
|
4575
|
+
envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
|
4427
4576
|
maxNumCols: context.envName === "split" ? 2 : undefined,
|
4428
4577
|
leqno: context.parser.settings.leqno
|
4429
4578
|
},
|
@@ -4441,18 +4590,22 @@ const alignedHandler = function(context, args) {
|
|
4441
4590
|
// binary. This behavior is implemented in amsmath's \start@aligned.
|
4442
4591
|
let numMaths;
|
4443
4592
|
let numCols = 0;
|
4444
|
-
|
4593
|
+
const isAlignedAt = context.envName.indexOf("at") > -1;
|
4594
|
+
if (args[0] && isAlignedAt) {
|
4595
|
+
// alignat environment takes an argument w/ number of columns
|
4445
4596
|
let arg0 = "";
|
4446
4597
|
for (let i = 0; i < args[0].body.length; i++) {
|
4447
4598
|
const textord = assertNodeType(args[0].body[i], "textord");
|
4448
4599
|
arg0 += textord.text;
|
4449
4600
|
}
|
4601
|
+
if (isNaN(arg0)) {
|
4602
|
+
throw new ParseError("The alignat enviroment requires a numeric first argument.")
|
4603
|
+
}
|
4450
4604
|
numMaths = Number(arg0);
|
4451
4605
|
numCols = numMaths * 2;
|
4452
4606
|
}
|
4453
|
-
const isAligned = !numCols;
|
4454
4607
|
res.body.forEach(function(row) {
|
4455
|
-
if (
|
4608
|
+
if (isAlignedAt) {
|
4456
4609
|
// Case 1
|
4457
4610
|
const curMaths = row.length / 2;
|
4458
4611
|
if (numMaths < curMaths) {
|
@@ -4480,14 +4633,10 @@ const alignedHandler = function(context, args) {
|
|
4480
4633
|
align: align
|
4481
4634
|
};
|
4482
4635
|
}
|
4483
|
-
if (context.envName === "split") ; else if (
|
4484
|
-
res.envClasses.push("
|
4485
|
-
} else if (isAligned) {
|
4486
|
-
res.envClasses[1] = context.envName === "align*"
|
4487
|
-
? "align-star"
|
4488
|
-
: "align"; // Sets column spacing & justification
|
4636
|
+
if (context.envName === "split") ; else if (isAlignedAt) {
|
4637
|
+
res.envClasses.push("alignat"); // Sets justification
|
4489
4638
|
} else {
|
4490
|
-
res.envClasses
|
4639
|
+
res.envClasses[0] = "align"; // Sets column spacing & justification
|
4491
4640
|
}
|
4492
4641
|
return res;
|
4493
4642
|
};
|
@@ -4737,7 +4886,7 @@ defineEnvironment({
|
|
4737
4886
|
}
|
4738
4887
|
const res = {
|
4739
4888
|
cols: [],
|
4740
|
-
envClasses: ["
|
4889
|
+
envClasses: ["abut", "jot"],
|
4741
4890
|
addEqnNum: context.envName === "gather",
|
4742
4891
|
emptySingleRow: true,
|
4743
4892
|
leqno: context.parser.settings.leqno
|
@@ -7236,7 +7385,14 @@ defineFunctionBuilders({
|
|
7236
7385
|
}
|
7237
7386
|
|
7238
7387
|
if (group.sup) {
|
7239
|
-
|
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);
|
7240
7396
|
}
|
7241
7397
|
|
7242
7398
|
let nodeType;
|
@@ -7702,6 +7858,8 @@ const smallCaps = Object.freeze({
|
|
7702
7858
|
|
7703
7859
|
const numberRegEx = /^\d(?:[\d,.]*\d)?$/;
|
7704
7860
|
const latinRegEx = /[A-Ba-z]/;
|
7861
|
+
const primes = new Set(["\\prime", "\\dprime", "\\trprime", "\\qprime",
|
7862
|
+
"\\backprime", "\\backdprime", "\\backtrprime"]);
|
7705
7863
|
|
7706
7864
|
const italicNumber = (text, variant, tag) => {
|
7707
7865
|
const mn = new mathMLTree.MathNode(tag, [text]);
|
@@ -7769,7 +7927,7 @@ defineFunctionBuilders({
|
|
7769
7927
|
text.text = variantChar(text.text, variant);
|
7770
7928
|
}
|
7771
7929
|
node = new mathMLTree.MathNode("mtext", [text]);
|
7772
|
-
} else if (group.text
|
7930
|
+
} else if (primes.has(group.text)) {
|
7773
7931
|
node = new mathMLTree.MathNode("mo", [text]);
|
7774
7932
|
// TODO: If/when Chromium uses ssty variant for prime, remove the next line.
|
7775
7933
|
node.classes.push("tml-prime");
|
@@ -8423,6 +8581,9 @@ defineMacro("\\char", function(context) {
|
|
8423
8581
|
// This macro provides a better rendering.
|
8424
8582
|
defineMacro("\\surd", '\\sqrt{\\vphantom{|}}');
|
8425
8583
|
|
8584
|
+
// See comment for \oplus in symbols.js.
|
8585
|
+
defineMacro("\u2295", "\\oplus");
|
8586
|
+
|
8426
8587
|
defineMacro("\\hbox", "\\text{#1}");
|
8427
8588
|
|
8428
8589
|
// Per TeXbook p.122, "/" gets zero operator spacing.
|
@@ -12703,7 +12864,6 @@ class Parser {
|
|
12703
12864
|
loc: SourceLocation.range(nucleus),
|
12704
12865
|
label: command,
|
12705
12866
|
isStretchy: false,
|
12706
|
-
isShifty: true,
|
12707
12867
|
base: symbol
|
12708
12868
|
};
|
12709
12869
|
}
|
@@ -12901,7 +13061,7 @@ class Style {
|
|
12901
13061
|
* https://mit-license.org/
|
12902
13062
|
*/
|
12903
13063
|
|
12904
|
-
const version = "0.10.
|
13064
|
+
const version = "0.10.16";
|
12905
13065
|
|
12906
13066
|
function postProcess(block) {
|
12907
13067
|
const labelMap = {};
|
@@ -12952,6 +13112,7 @@ function postProcess(block) {
|
|
12952
13112
|
/* eslint no-console:0 */
|
12953
13113
|
|
12954
13114
|
/**
|
13115
|
+
* @type {import('./temml').render}
|
12955
13116
|
* Parse and build an expression, and place that expression in the DOM node
|
12956
13117
|
* given.
|
12957
13118
|
*/
|
@@ -12989,6 +13150,7 @@ if (typeof document !== "undefined") {
|
|
12989
13150
|
}
|
12990
13151
|
|
12991
13152
|
/**
|
13153
|
+
* @type {import('./temml').renderToString}
|
12992
13154
|
* Parse and build an expression, and return the markup for that.
|
12993
13155
|
*/
|
12994
13156
|
const renderToString = function(expression, options) {
|
@@ -12997,6 +13159,7 @@ const renderToString = function(expression, options) {
|
|
12997
13159
|
};
|
12998
13160
|
|
12999
13161
|
/**
|
13162
|
+
* @type {import('./temml').generateParseTree}
|
13000
13163
|
* Parse an expression and return the parse tree.
|
13001
13164
|
*/
|
13002
13165
|
const generateParseTree = function(expression, options) {
|
@@ -13005,6 +13168,7 @@ const generateParseTree = function(expression, options) {
|
|
13005
13168
|
};
|
13006
13169
|
|
13007
13170
|
/**
|
13171
|
+
* @type {import('./temml').definePreamble}
|
13008
13172
|
* Take an expression which contains a preamble.
|
13009
13173
|
* Parse it and return the macros.
|
13010
13174
|
*/
|
@@ -13037,6 +13201,7 @@ const renderError = function(error, expression, options) {
|
|
13037
13201
|
};
|
13038
13202
|
|
13039
13203
|
/**
|
13204
|
+
* @type {import('./temml').renderToMathMLTree}
|
13040
13205
|
* Generates and returns the Temml build tree. This is used for advanced
|
13041
13206
|
* use cases (like rendering to custom output).
|
13042
13207
|
*/
|
@@ -13054,6 +13219,7 @@ const renderToMathMLTree = function(expression, options) {
|
|
13054
13219
|
}
|
13055
13220
|
};
|
13056
13221
|
|
13222
|
+
/** @type {import('./temml').default} */
|
13057
13223
|
var temml = {
|
13058
13224
|
/**
|
13059
13225
|
* Current Temml version
|
package/dist/temml.d.ts
ADDED
@@ -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;
|