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
         |