temml 0.10.14 → 0.10.15
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 +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
|