temml 0.10.14 → 0.10.15
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/README.md +1 -1
- package/dist/Temml-Asana.css +0 -146
- package/dist/Temml-Latin-Modern.css +0 -147
- package/dist/Temml-Libertinus.css +0 -147
- package/dist/Temml-Local.css +0 -146
- package/dist/Temml-STIX2.css +0 -146
- package/dist/temml.cjs +126 -25
- package/dist/temml.d.ts +60 -0
- package/dist/temml.js +126 -25
- package/dist/temml.min.js +1 -1
- package/dist/temml.mjs +126 -25
- package/dist/temmlPostProcess.js +1 -1
- package/package.json +4 -2
- package/src/buildMathML.js +1 -3
- package/src/environments/array.js +95 -23
- package/src/functions/enclose.js +24 -3
- package/src/postProcess.js +1 -1
- package/src/symbols.js +4 -0
- package/temml.js +6 -0
package/dist/temml.mjs
CHANGED
@@ -971,6 +971,10 @@ defineSymbol(math, mathord, "\u21af", "\\lightning", true);
|
|
971
971
|
defineSymbol(math, mathord, "\u220E", "\\QED", true);
|
972
972
|
defineSymbol(math, mathord, "\u2030", "\\permil", true);
|
973
973
|
defineSymbol(text, textord, "\u2030", "\\permil");
|
974
|
+
defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
|
975
|
+
defineSymbol(math, mathord, "\u263c", "\\sun", true);
|
976
|
+
defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
|
977
|
+
defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
|
974
978
|
|
975
979
|
// AMS Negated Binary Relations
|
976
980
|
defineSymbol(math, rel, "\u226e", "\\nless", true);
|
@@ -2129,9 +2133,7 @@ function buildMathML(tree, texExpression, style, settings) {
|
|
2129
2133
|
}
|
2130
2134
|
if (settings.displayMode) {
|
2131
2135
|
math.setAttribute("display", "block");
|
2132
|
-
math.style.display = math
|
2133
|
-
? "inline"
|
2134
|
-
: "block math"; // necessary in Chromium.
|
2136
|
+
math.style.display = "block math"; // necessary in Chromium.
|
2135
2137
|
// Firefox and Safari do not recognize display: "block math".
|
2136
2138
|
// Set a class so that the CSS file can set display: block.
|
2137
2139
|
math.classes = ["tml-display"];
|
@@ -3822,10 +3824,20 @@ const mathmlBuilder$8 = (group, style) => {
|
|
3822
3824
|
node.style.borderBottom = "0.065em solid";
|
3823
3825
|
break
|
3824
3826
|
case "\\cancel":
|
3825
|
-
node.
|
3827
|
+
node.style.background = `linear-gradient(to top left,
|
3828
|
+
rgba(0,0,0,0) 0%,
|
3829
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3830
|
+
rgba(0,0,0,1) 50%,
|
3831
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3832
|
+
rgba(0,0,0,0) 100%);`;
|
3826
3833
|
break
|
3827
3834
|
case "\\bcancel":
|
3828
|
-
node.
|
3835
|
+
node.style.background = `linear-gradient(to top right,
|
3836
|
+
rgba(0,0,0,0) 0%,
|
3837
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3838
|
+
rgba(0,0,0,1) 50%,
|
3839
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3840
|
+
rgba(0,0,0,0) 100%);`;
|
3829
3841
|
break
|
3830
3842
|
/*
|
3831
3843
|
case "\\longdiv":
|
@@ -3869,7 +3881,18 @@ const mathmlBuilder$8 = (group, style) => {
|
|
3869
3881
|
break
|
3870
3882
|
}
|
3871
3883
|
case "\\xcancel":
|
3872
|
-
node.
|
3884
|
+
node.style.background = `linear-gradient(to top left,
|
3885
|
+
rgba(0,0,0,0) 0%,
|
3886
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3887
|
+
rgba(0,0,0,1) 50%,
|
3888
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3889
|
+
rgba(0,0,0,0) 100%),
|
3890
|
+
linear-gradient(to top right,
|
3891
|
+
rgba(0,0,0,0) 0%,
|
3892
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
3893
|
+
rgba(0,0,0,1) 50%,
|
3894
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
3895
|
+
rgba(0,0,0,0) 100%);`;
|
3873
3896
|
break
|
3874
3897
|
}
|
3875
3898
|
if (group.backgroundColor) {
|
@@ -4300,24 +4323,94 @@ const mathmlBuilder$7 = function(group, style) {
|
|
4300
4323
|
// Write horizontal rules
|
4301
4324
|
if (i === 0 && hlines[0].length > 0) {
|
4302
4325
|
if (hlines[0].length === 2) {
|
4303
|
-
mtr.
|
4326
|
+
mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double"; });
|
4304
4327
|
} else {
|
4305
|
-
mtr.
|
4328
|
+
mtr.children.forEach(cell => {
|
4329
|
+
cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid";
|
4330
|
+
});
|
4306
4331
|
}
|
4307
4332
|
}
|
4308
4333
|
if (hlines[i + 1].length > 0) {
|
4309
4334
|
if (hlines[i + 1].length === 2) {
|
4310
|
-
mtr.
|
4335
|
+
mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double"; });
|
4311
4336
|
} else {
|
4312
|
-
mtr.
|
4337
|
+
mtr.children.forEach(cell => {
|
4338
|
+
cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid";
|
4339
|
+
});
|
4313
4340
|
}
|
4314
4341
|
}
|
4315
4342
|
tbl.push(mtr);
|
4316
4343
|
}
|
4317
|
-
|
4344
|
+
|
4318
4345
|
if (group.envClasses.length > 0) {
|
4319
|
-
|
4346
|
+
const pad = group.envClasses.includes("jot")
|
4347
|
+
? "0.7" // 0.5ex + 0.09em top & bot padding
|
4348
|
+
: group.envClasses.includes("small")
|
4349
|
+
? "0.35"
|
4350
|
+
: "0.5"; // 0.5ex default top & bot padding
|
4351
|
+
const sidePadding = group.envClasses.includes("abut")
|
4352
|
+
? "0"
|
4353
|
+
: group.envClasses.includes("cases")
|
4354
|
+
? "0"
|
4355
|
+
: group.envClasses.includes("small")
|
4356
|
+
? "0.1389"
|
4357
|
+
: group.envClasses.includes("cd")
|
4358
|
+
? "0.25"
|
4359
|
+
: "0.4"; // default side padding
|
4360
|
+
|
4361
|
+
const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;
|
4362
|
+
|
4363
|
+
const sidePad = (j, hand) => {
|
4364
|
+
if (j === 0 && hand === 0) { return "0" }
|
4365
|
+
if (j === numCols - 1 && hand === 1) { return "0" }
|
4366
|
+
if (group.envClasses[0] !== "align") { return sidePadding }
|
4367
|
+
if (hand === 1) { return "0" }
|
4368
|
+
if (group.addEqnNum) {
|
4369
|
+
return (j % 2) ? "1" : "0"
|
4370
|
+
} else {
|
4371
|
+
return (j % 2) ? "0" : "1"
|
4372
|
+
}
|
4373
|
+
};
|
4374
|
+
|
4375
|
+
// Padding
|
4376
|
+
for (let i = 0; i < tbl.length; i++) {
|
4377
|
+
for (let j = 0; j < tbl[i].children.length; j++) {
|
4378
|
+
tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`;
|
4379
|
+
}
|
4380
|
+
}
|
4381
|
+
|
4382
|
+
// Justification
|
4383
|
+
const align = group.envClasses.includes("align") || group.envClasses.includes("alignat");
|
4384
|
+
for (let i = 0; i < tbl.length; i++) {
|
4385
|
+
const row = tbl[i];
|
4386
|
+
if (align) {
|
4387
|
+
for (let j = 0; j < row.children.length; j++) {
|
4388
|
+
// Chromium does not recognize text-align: left. Use -webkit-
|
4389
|
+
// TODO: Remove -webkit- when Chromium no longer needs it.
|
4390
|
+
row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right");
|
4391
|
+
}
|
4392
|
+
}
|
4393
|
+
if (row.children.length > 1 && group.envClasses.includes("cases")) {
|
4394
|
+
row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em");
|
4395
|
+
}
|
4396
|
+
|
4397
|
+
if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
|
4398
|
+
for (const cell of row.children) {
|
4399
|
+
cell.style.textAlign = "-webkit-" + "left";
|
4400
|
+
}
|
4401
|
+
}
|
4402
|
+
}
|
4403
|
+
} else {
|
4404
|
+
// Set zero padding on side of the matrix
|
4405
|
+
for (let i = 0; i < tbl.length; i++) {
|
4406
|
+
tbl[i].children[0].style.paddingLeft = "0em";
|
4407
|
+
if (tbl[i].children.length === tbl[0].children.length) {
|
4408
|
+
tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em";
|
4409
|
+
}
|
4410
|
+
}
|
4320
4411
|
}
|
4412
|
+
|
4413
|
+
let table = new mathMLTree.MathNode("mtable", tbl);
|
4321
4414
|
if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true"); }
|
4322
4415
|
|
4323
4416
|
if (group.addEqnNum || group.envClasses.includes("multline")) {
|
@@ -4397,6 +4490,8 @@ const mathmlBuilder$7 = function(group, style) {
|
|
4397
4490
|
align = "left " + (align.length > 0 ? align : "center ") + "right ";
|
4398
4491
|
}
|
4399
4492
|
if (align) {
|
4493
|
+
// Firefox reads this attribute, not the -webkit-left|right written above.
|
4494
|
+
// TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
|
4400
4495
|
table.setAttribute("columnalign", align.trim());
|
4401
4496
|
}
|
4402
4497
|
|
@@ -4421,7 +4516,7 @@ const alignedHandler = function(context, args) {
|
|
4421
4516
|
cols,
|
4422
4517
|
addEqnNum: context.envName === "align" || context.envName === "alignat",
|
4423
4518
|
emptySingleRow: true,
|
4424
|
-
envClasses: ["
|
4519
|
+
envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
|
4425
4520
|
maxNumCols: context.envName === "split" ? 2 : undefined,
|
4426
4521
|
leqno: context.parser.settings.leqno
|
4427
4522
|
},
|
@@ -4439,18 +4534,22 @@ const alignedHandler = function(context, args) {
|
|
4439
4534
|
// binary. This behavior is implemented in amsmath's \start@aligned.
|
4440
4535
|
let numMaths;
|
4441
4536
|
let numCols = 0;
|
4442
|
-
|
4537
|
+
const isAlignedAt = context.envName.indexOf("at") > -1;
|
4538
|
+
if (args[0] && isAlignedAt) {
|
4539
|
+
// alignat environment takes an argument w/ number of columns
|
4443
4540
|
let arg0 = "";
|
4444
4541
|
for (let i = 0; i < args[0].body.length; i++) {
|
4445
4542
|
const textord = assertNodeType(args[0].body[i], "textord");
|
4446
4543
|
arg0 += textord.text;
|
4447
4544
|
}
|
4545
|
+
if (isNaN(arg0)) {
|
4546
|
+
throw new ParseError("The alignat enviroment requires a numeric first argument.")
|
4547
|
+
}
|
4448
4548
|
numMaths = Number(arg0);
|
4449
4549
|
numCols = numMaths * 2;
|
4450
4550
|
}
|
4451
|
-
const isAligned = !numCols;
|
4452
4551
|
res.body.forEach(function(row) {
|
4453
|
-
if (
|
4552
|
+
if (isAlignedAt) {
|
4454
4553
|
// Case 1
|
4455
4554
|
const curMaths = row.length / 2;
|
4456
4555
|
if (numMaths < curMaths) {
|
@@ -4478,14 +4577,10 @@ const alignedHandler = function(context, args) {
|
|
4478
4577
|
align: align
|
4479
4578
|
};
|
4480
4579
|
}
|
4481
|
-
if (context.envName === "split") ; else if (
|
4482
|
-
res.envClasses.push("
|
4483
|
-
} else if (isAligned) {
|
4484
|
-
res.envClasses[1] = context.envName === "align*"
|
4485
|
-
? "align-star"
|
4486
|
-
: "align"; // Sets column spacing & justification
|
4580
|
+
if (context.envName === "split") ; else if (isAlignedAt) {
|
4581
|
+
res.envClasses.push("alignat"); // Sets justification
|
4487
4582
|
} else {
|
4488
|
-
res.envClasses
|
4583
|
+
res.envClasses[0] = "align"; // Sets column spacing & justification
|
4489
4584
|
}
|
4490
4585
|
return res;
|
4491
4586
|
};
|
@@ -4735,7 +4830,7 @@ defineEnvironment({
|
|
4735
4830
|
}
|
4736
4831
|
const res = {
|
4737
4832
|
cols: [],
|
4738
|
-
envClasses: ["
|
4833
|
+
envClasses: ["abut", "jot"],
|
4739
4834
|
addEqnNum: context.envName === "gather",
|
4740
4835
|
emptySingleRow: true,
|
4741
4836
|
leqno: context.parser.settings.leqno
|
@@ -12899,7 +12994,7 @@ class Style {
|
|
12899
12994
|
* https://mit-license.org/
|
12900
12995
|
*/
|
12901
12996
|
|
12902
|
-
const version = "0.10.
|
12997
|
+
const version = "0.10.15";
|
12903
12998
|
|
12904
12999
|
function postProcess(block) {
|
12905
13000
|
const labelMap = {};
|
@@ -12950,6 +13045,7 @@ function postProcess(block) {
|
|
12950
13045
|
/* eslint no-console:0 */
|
12951
13046
|
|
12952
13047
|
/**
|
13048
|
+
* @type {import('./temml').render}
|
12953
13049
|
* Parse and build an expression, and place that expression in the DOM node
|
12954
13050
|
* given.
|
12955
13051
|
*/
|
@@ -12987,6 +13083,7 @@ if (typeof document !== "undefined") {
|
|
12987
13083
|
}
|
12988
13084
|
|
12989
13085
|
/**
|
13086
|
+
* @type {import('./temml').renderToString}
|
12990
13087
|
* Parse and build an expression, and return the markup for that.
|
12991
13088
|
*/
|
12992
13089
|
const renderToString = function(expression, options) {
|
@@ -12995,6 +13092,7 @@ const renderToString = function(expression, options) {
|
|
12995
13092
|
};
|
12996
13093
|
|
12997
13094
|
/**
|
13095
|
+
* @type {import('./temml').generateParseTree}
|
12998
13096
|
* Parse an expression and return the parse tree.
|
12999
13097
|
*/
|
13000
13098
|
const generateParseTree = function(expression, options) {
|
@@ -13003,6 +13101,7 @@ const generateParseTree = function(expression, options) {
|
|
13003
13101
|
};
|
13004
13102
|
|
13005
13103
|
/**
|
13104
|
+
* @type {import('./temml').definePreamble}
|
13006
13105
|
* Take an expression which contains a preamble.
|
13007
13106
|
* Parse it and return the macros.
|
13008
13107
|
*/
|
@@ -13035,6 +13134,7 @@ const renderError = function(error, expression, options) {
|
|
13035
13134
|
};
|
13036
13135
|
|
13037
13136
|
/**
|
13137
|
+
* @type {import('./temml').renderToMathMLTree}
|
13038
13138
|
* Generates and returns the Temml build tree. This is used for advanced
|
13039
13139
|
* use cases (like rendering to custom output).
|
13040
13140
|
*/
|
@@ -13052,6 +13152,7 @@ const renderToMathMLTree = function(expression, options) {
|
|
13052
13152
|
}
|
13053
13153
|
};
|
13054
13154
|
|
13155
|
+
/** @type {import('./temml').default} */
|
13055
13156
|
var temml = {
|
13056
13157
|
/**
|
13057
13158
|
* Current Temml version
|
package/dist/temmlPostProcess.js
CHANGED
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "temml",
|
3
|
-
"version": "0.10.
|
3
|
+
"version": "0.10.15",
|
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/buildMathML.js
CHANGED
@@ -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
|
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"]
|
@@ -276,24 +276,94 @@ const mathmlBuilder = function(group, style) {
|
|
276
276
|
// Write horizontal rules
|
277
277
|
if (i === 0 && hlines[0].length > 0) {
|
278
278
|
if (hlines[0].length === 2) {
|
279
|
-
mtr.
|
279
|
+
mtr.children.forEach(cell => { cell.style.borderTop = "0.15em double" })
|
280
280
|
} else {
|
281
|
-
mtr.
|
281
|
+
mtr.children.forEach(cell => {
|
282
|
+
cell.style.borderTop = hlines[0][0] ? "0.06em dashed" : "0.06em solid"
|
283
|
+
})
|
282
284
|
}
|
283
285
|
}
|
284
286
|
if (hlines[i + 1].length > 0) {
|
285
287
|
if (hlines[i + 1].length === 2) {
|
286
|
-
mtr.
|
288
|
+
mtr.children.forEach(cell => { cell.style.borderBottom = "0.15em double" })
|
287
289
|
} else {
|
288
|
-
mtr.
|
290
|
+
mtr.children.forEach(cell => {
|
291
|
+
cell.style.borderBottom = hlines[i + 1][0] ? "0.06em dashed" : "0.06em solid"
|
292
|
+
})
|
289
293
|
}
|
290
294
|
}
|
291
295
|
tbl.push(mtr);
|
292
296
|
}
|
293
|
-
|
297
|
+
|
294
298
|
if (group.envClasses.length > 0) {
|
295
|
-
|
299
|
+
const pad = group.envClasses.includes("jot")
|
300
|
+
? "0.7" // 0.5ex + 0.09em top & bot padding
|
301
|
+
: group.envClasses.includes("small")
|
302
|
+
? "0.35"
|
303
|
+
: "0.5" // 0.5ex default top & bot padding
|
304
|
+
const sidePadding = group.envClasses.includes("abut")
|
305
|
+
? "0"
|
306
|
+
: group.envClasses.includes("cases")
|
307
|
+
? "0"
|
308
|
+
: group.envClasses.includes("small")
|
309
|
+
? "0.1389"
|
310
|
+
: group.envClasses.includes("cd")
|
311
|
+
? "0.25"
|
312
|
+
: "0.4" // default side padding
|
313
|
+
|
314
|
+
const numCols = tbl.length === 0 ? 0 : tbl[0].children.length
|
315
|
+
|
316
|
+
const sidePad = (j, hand) => {
|
317
|
+
if (j === 0 && hand === 0) { return "0" }
|
318
|
+
if (j === numCols - 1 && hand === 1) { return "0" }
|
319
|
+
if (group.envClasses[0] !== "align") { return sidePadding }
|
320
|
+
if (hand === 1) { return "0" }
|
321
|
+
if (group.addEqnNum) {
|
322
|
+
return (j % 2) ? "1" : "0"
|
323
|
+
} else {
|
324
|
+
return (j % 2) ? "0" : "1"
|
325
|
+
}
|
326
|
+
}
|
327
|
+
|
328
|
+
// Padding
|
329
|
+
for (let i = 0; i < tbl.length; i++) {
|
330
|
+
for (let j = 0; j < tbl[i].children.length; j++) {
|
331
|
+
tbl[i].children[j].style.padding = `${pad}ex ${sidePad(j, 1)}em ${pad}ex ${sidePad(j, 0)}em`
|
332
|
+
}
|
333
|
+
}
|
334
|
+
|
335
|
+
// Justification
|
336
|
+
const align = group.envClasses.includes("align") || group.envClasses.includes("alignat")
|
337
|
+
for (let i = 0; i < tbl.length; i++) {
|
338
|
+
const row = tbl[i];
|
339
|
+
if (align) {
|
340
|
+
for (let j = 0; j < row.children.length; j++) {
|
341
|
+
// Chromium does not recognize text-align: left. Use -webkit-
|
342
|
+
// TODO: Remove -webkit- when Chromium no longer needs it.
|
343
|
+
row.children[j].style.textAlign = "-webkit-" + (j % 2 ? "left" : "right")
|
344
|
+
}
|
345
|
+
}
|
346
|
+
if (row.children.length > 1 && group.envClasses.includes("cases")) {
|
347
|
+
row.children[1].style.padding = row.children[1].style.padding.replace(/0em$/, "1em")
|
348
|
+
}
|
349
|
+
|
350
|
+
if (group.envClasses.includes("cases") || group.envClasses.includes("subarray")) {
|
351
|
+
for (const cell of row.children) {
|
352
|
+
cell.style.textAlign = "-webkit-" + "left"
|
353
|
+
}
|
354
|
+
}
|
355
|
+
}
|
356
|
+
} else {
|
357
|
+
// Set zero padding on side of the matrix
|
358
|
+
for (let i = 0; i < tbl.length; i++) {
|
359
|
+
tbl[i].children[0].style.paddingLeft = "0em"
|
360
|
+
if (tbl[i].children.length === tbl[0].children.length) {
|
361
|
+
tbl[i].children[tbl[i].children.length - 1].style.paddingRight = "0em"
|
362
|
+
}
|
363
|
+
}
|
296
364
|
}
|
365
|
+
|
366
|
+
let table = new mathMLTree.MathNode("mtable", tbl)
|
297
367
|
if (group.scriptLevel === "display") { table.setAttribute("displaystyle", "true") }
|
298
368
|
|
299
369
|
if (group.addEqnNum || group.envClasses.includes("multline")) {
|
@@ -373,6 +443,8 @@ const mathmlBuilder = function(group, style) {
|
|
373
443
|
align = "left " + (align.length > 0 ? align : "center ") + "right "
|
374
444
|
}
|
375
445
|
if (align) {
|
446
|
+
// Firefox reads this attribute, not the -webkit-left|right written above.
|
447
|
+
// TODO: When Chrome no longer needs "-webkit-", use CSS and delete the next line.
|
376
448
|
table.setAttribute("columnalign", align.trim())
|
377
449
|
}
|
378
450
|
|
@@ -397,7 +469,7 @@ const alignedHandler = function(context, args) {
|
|
397
469
|
cols,
|
398
470
|
addEqnNum: context.envName === "align" || context.envName === "alignat",
|
399
471
|
emptySingleRow: true,
|
400
|
-
envClasses: ["
|
472
|
+
envClasses: ["abut", "jot"], // set row spacing & provisional column spacing
|
401
473
|
maxNumCols: context.envName === "split" ? 2 : undefined,
|
402
474
|
leqno: context.parser.settings.leqno
|
403
475
|
},
|
@@ -415,18 +487,22 @@ const alignedHandler = function(context, args) {
|
|
415
487
|
// binary. This behavior is implemented in amsmath's \start@aligned.
|
416
488
|
let numMaths;
|
417
489
|
let numCols = 0;
|
418
|
-
|
419
|
-
|
490
|
+
const isAlignedAt = context.envName.indexOf("at") > -1
|
491
|
+
if (args[0] && isAlignedAt) {
|
492
|
+
// alignat environment takes an argument w/ number of columns
|
493
|
+
let arg0 = ""
|
420
494
|
for (let i = 0; i < args[0].body.length; i++) {
|
421
|
-
const textord = assertNodeType(args[0].body[i], "textord")
|
422
|
-
arg0 += textord.text
|
495
|
+
const textord = assertNodeType(args[0].body[i], "textord")
|
496
|
+
arg0 += textord.text
|
497
|
+
}
|
498
|
+
if (isNaN(arg0)) {
|
499
|
+
throw new ParseError("The alignat enviroment requires a numeric first argument.")
|
423
500
|
}
|
424
|
-
numMaths = Number(arg0)
|
425
|
-
numCols = numMaths * 2
|
501
|
+
numMaths = Number(arg0)
|
502
|
+
numCols = numMaths * 2
|
426
503
|
}
|
427
|
-
const isAligned = !numCols;
|
428
504
|
res.body.forEach(function(row) {
|
429
|
-
if (
|
505
|
+
if (isAlignedAt) {
|
430
506
|
// Case 1
|
431
507
|
const curMaths = row.length / 2;
|
432
508
|
if (numMaths < curMaths) {
|
@@ -456,14 +532,10 @@ const alignedHandler = function(context, args) {
|
|
456
532
|
}
|
457
533
|
if (context.envName === "split") {
|
458
534
|
// Append no more classes
|
459
|
-
} else if (
|
460
|
-
res.envClasses.push("
|
461
|
-
} else if (isAligned) {
|
462
|
-
res.envClasses[1] = context.envName === "align*"
|
463
|
-
? "align-star"
|
464
|
-
: "align" // Sets column spacing & justification
|
535
|
+
} else if (isAlignedAt) {
|
536
|
+
res.envClasses.push("alignat") // Sets justification
|
465
537
|
} else {
|
466
|
-
res.envClasses
|
538
|
+
res.envClasses[0] = "align" // Sets column spacing & justification
|
467
539
|
}
|
468
540
|
return res;
|
469
541
|
};
|
@@ -713,7 +785,7 @@ defineEnvironment({
|
|
713
785
|
}
|
714
786
|
const res = {
|
715
787
|
cols: [],
|
716
|
-
envClasses: ["
|
788
|
+
envClasses: ["abut", "jot"],
|
717
789
|
addEqnNum: context.envName === "gather",
|
718
790
|
emptySingleRow: true,
|
719
791
|
leqno: context.parser.settings.leqno
|
package/src/functions/enclose.js
CHANGED
@@ -34,10 +34,20 @@ const mathmlBuilder = (group, style) => {
|
|
34
34
|
node.style.borderBottom = "0.065em solid"
|
35
35
|
break
|
36
36
|
case "\\cancel":
|
37
|
-
node.
|
37
|
+
node.style.background = `linear-gradient(to top left,
|
38
|
+
rgba(0,0,0,0) 0%,
|
39
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
40
|
+
rgba(0,0,0,1) 50%,
|
41
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
42
|
+
rgba(0,0,0,0) 100%);`
|
38
43
|
break
|
39
44
|
case "\\bcancel":
|
40
|
-
node.
|
45
|
+
node.style.background = `linear-gradient(to top right,
|
46
|
+
rgba(0,0,0,0) 0%,
|
47
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
48
|
+
rgba(0,0,0,1) 50%,
|
49
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
50
|
+
rgba(0,0,0,0) 100%);`
|
41
51
|
break
|
42
52
|
/*
|
43
53
|
case "\\longdiv":
|
@@ -81,7 +91,18 @@ const mathmlBuilder = (group, style) => {
|
|
81
91
|
break
|
82
92
|
}
|
83
93
|
case "\\xcancel":
|
84
|
-
node.
|
94
|
+
node.style.background = `linear-gradient(to top left,
|
95
|
+
rgba(0,0,0,0) 0%,
|
96
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
97
|
+
rgba(0,0,0,1) 50%,
|
98
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
99
|
+
rgba(0,0,0,0) 100%),
|
100
|
+
linear-gradient(to top right,
|
101
|
+
rgba(0,0,0,0) 0%,
|
102
|
+
rgba(0,0,0,0) calc(50% - 0.06em),
|
103
|
+
rgba(0,0,0,1) 50%,
|
104
|
+
rgba(0,0,0,0) calc(50% + 0.06em),
|
105
|
+
rgba(0,0,0,0) 100%);`
|
85
106
|
break
|
86
107
|
}
|
87
108
|
if (group.backgroundColor) {
|
package/src/postProcess.js
CHANGED
package/src/symbols.js
CHANGED
@@ -212,6 +212,10 @@ defineSymbol(math, mathord, "\u21af", "\\lightning", true);
|
|
212
212
|
defineSymbol(math, mathord, "\u220E", "\\QED", true);
|
213
213
|
defineSymbol(math, mathord, "\u2030", "\\permil", true);
|
214
214
|
defineSymbol(text, textord, "\u2030", "\\permil");
|
215
|
+
defineSymbol(math, mathord, "\u2609", "\\astrosun", true);
|
216
|
+
defineSymbol(math, mathord, "\u263c", "\\sun", true);
|
217
|
+
defineSymbol(math, mathord, "\u263e", "\\leftmoon", true);
|
218
|
+
defineSymbol(math, mathord, "\u263d", "\\rightmoon", true);
|
215
219
|
|
216
220
|
// AMS Negated Binary Relations
|
217
221
|
defineSymbol(math, rel, "\u226e", "\\nless", true);
|
package/temml.js
CHANGED
@@ -21,6 +21,7 @@ import defineMacro from "./src/defineMacro";
|
|
21
21
|
import { postProcess, version } from "./src/postProcess";
|
22
22
|
|
23
23
|
/**
|
24
|
+
* @type {import('./temml').render}
|
24
25
|
* Parse and build an expression, and place that expression in the DOM node
|
25
26
|
* given.
|
26
27
|
*/
|
@@ -58,6 +59,7 @@ if (typeof document !== "undefined") {
|
|
58
59
|
}
|
59
60
|
|
60
61
|
/**
|
62
|
+
* @type {import('./temml').renderToString}
|
61
63
|
* Parse and build an expression, and return the markup for that.
|
62
64
|
*/
|
63
65
|
const renderToString = function(expression, options) {
|
@@ -66,6 +68,7 @@ const renderToString = function(expression, options) {
|
|
66
68
|
};
|
67
69
|
|
68
70
|
/**
|
71
|
+
* @type {import('./temml').generateParseTree}
|
69
72
|
* Parse an expression and return the parse tree.
|
70
73
|
*/
|
71
74
|
const generateParseTree = function(expression, options) {
|
@@ -74,6 +77,7 @@ const generateParseTree = function(expression, options) {
|
|
74
77
|
};
|
75
78
|
|
76
79
|
/**
|
80
|
+
* @type {import('./temml').definePreamble}
|
77
81
|
* Take an expression which contains a preamble.
|
78
82
|
* Parse it and return the macros.
|
79
83
|
*/
|
@@ -106,6 +110,7 @@ const renderError = function(error, expression, options) {
|
|
106
110
|
};
|
107
111
|
|
108
112
|
/**
|
113
|
+
* @type {import('./temml').renderToMathMLTree}
|
109
114
|
* Generates and returns the Temml build tree. This is used for advanced
|
110
115
|
* use cases (like rendering to custom output).
|
111
116
|
*/
|
@@ -123,6 +128,7 @@ const renderToMathMLTree = function(expression, options) {
|
|
123
128
|
}
|
124
129
|
};
|
125
130
|
|
131
|
+
/** @type {import('./temml').default} */
|
126
132
|
export default {
|
127
133
|
/**
|
128
134
|
* Current Temml version
|