diff --git a/js/MathtoolsConfiguration.d.ts b/js/MathtoolsConfiguration.d.ts new file mode 100644 index 0000000..da04679 --- /dev/null +++ b/js/MathtoolsConfiguration.d.ts @@ -0,0 +1,7 @@ +import { MultlineItem } from 'mathjax-full/js/input/tex/ams/AmsItems.js'; +import { Configuration } from 'mathjax-full/js/input/tex/Configuration.js'; +export declare class MultlinedItem extends MultlineItem { + get kind(): string; + EndTable(): void; +} +export declare const MathtoolsConfiguration: Configuration; diff --git a/js/MathtoolsConfiguration.js b/js/MathtoolsConfiguration.js new file mode 100644 index 0000000..f65eb4c --- /dev/null +++ b/js/MathtoolsConfiguration.js @@ -0,0 +1,158 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var _a; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.MathtoolsConfiguration = exports.MultlinedItem = void 0; +var AmsItems_js_1 = require("mathjax-full/js/input/tex/ams/AmsItems.js"); +var ParseUtil_js_1 = require("mathjax-full/js/input/tex/ParseUtil.js"); +var ParseMethods_js_1 = require("mathjax-full/js/input/tex/ParseMethods.js"); +var Configuration_js_1 = require("mathjax-full/js/input/tex/Configuration.js"); +var AmsMethods_js_1 = require("mathjax-full/js/input/tex/ams/AmsMethods.js"); +var BaseMethods_js_1 = require("mathjax-full/js/input/tex/base/BaseMethods.js"); +var TexError_js_1 = require("mathjax-full/js/input/tex/TexError.js"); +var SymbolMap_js_1 = require("mathjax-full/js/input/tex/SymbolMap.js"); +var NodeUtil_js_1 = require("mathjax-full/js/input/tex/NodeUtil.js"); +var TexConstants_js_1 = require("mathjax-full/js/input/tex/TexConstants.js"); +var MathtoolsMethods = {}; +var MultlinedItem = (function (_super) { + __extends(MultlinedItem, _super); + function MultlinedItem() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(MultlinedItem.prototype, "kind", { + get: function () { + return 'multlined'; + }, + enumerable: false, + configurable: true + }); + MultlinedItem.prototype.EndTable = function () { + if (this.Size() || this.row.length) { + this.EndEntry(); + this.EndRow(); + } + if (this.table.length) { + var first = NodeUtil_js_1.default.getChildren(this.table[0])[0]; + var m = this.table.length - 1; + if (NodeUtil_js_1.default.getAttribute(first, 'columnalign') !== TexConstants_js_1.TexConstant.Align.RIGHT) { + first.appendChild(this.create('node', 'mspace', [], { width: this.factory.configuration.options['MultlineGap'] || '2em' })); + } + var last = NodeUtil_js_1.default.getChildren(this.table[m])[0]; + if (NodeUtil_js_1.default.getAttribute(last, 'columnalign') !== TexConstants_js_1.TexConstant.Align.LEFT) { + var top_1 = last.childNodes[0]; + top_1.childNodes.unshift(null); + var space = this.create('node', 'mspace', [], { width: this.factory.configuration.options['MultlineGap'] || '2em' }); + NodeUtil_js_1.default.setChild(top_1, 0, space); + } + } + _super.prototype.EndTable.call(this); + }; + return MultlinedItem; +}(AmsItems_js_1.MultlineItem)); +exports.MultlinedItem = MultlinedItem; +MathtoolsMethods.MtMatrix = function (parser, begin, open, close) { + var align = parser.GetBrackets('\\begin{' + begin.getName() + '}') || 'c'; + return BaseMethods_js_1.default.Array(parser, begin, open, close, align); +}, + MathtoolsMethods.MtSmallMatrix = function (parser, begin, open, close, align) { + if (!align) { + align = parser.GetBrackets('\\begin{' + begin.getName() + '}') || 'c'; + } + return BaseMethods_js_1.default.Array(parser, begin, open, close, align, ParseUtil_js_1.default.Em(1 / 3), '.2em', 'S', 1); + }, + MathtoolsMethods.MtMultlined = function (parser, begin) { + var pos = parser.GetBrackets('\\begin{' + begin.getName() + '}') || ''; + var width = pos ? parser.GetBrackets('\\begin{' + begin.getName() + '}') : null; + if (!pos.match(/^[cbt]$/)) { + var tmp = width; + width = pos; + pos = tmp; + } + parser.Push(begin); + var item = parser.itemFactory.create('multlined', parser, begin); + item.arraydef = { + displaystyle: true, + rowspacing: '.5em', + width: width || parser.options['multlineWidth'], + columnwidth: '100%', + }; + return ParseUtil_js_1.default.setArrayAlign(item, pos || 'c'); + }; +MathtoolsMethods.HandleShove = function (parser, name, shove) { + var top = parser.stack.Top(); + if (top.kind !== 'multline' && top.kind !== 'multlined') { + throw new TexError_js_1.default('CommandInMultlined', '%1 can only appear within the multline or multlined environments', name); + } + if (top.Size()) { + throw new TexError_js_1.default('CommandAtTheBeginingOfLine', '%1 must come at the beginning of the line', name); + } + top.setProperty('shove', shove); + var shift = parser.GetBrackets(name); + var mml = parser.ParseArg(name); + if (shift) { + var mrow = parser.create('node', 'mrow', []); + var mspace = parser.create('node', 'mspace', [], { width: shift }); + if (shove === 'left') { + mrow.appendChild(mspace); + mrow.appendChild(mml); + } + else { + mrow.appendChild(mml); + mrow.appendChild(mspace); + } + mml = mrow; + } + parser.Push(mml); +}; +MathtoolsMethods.Array = BaseMethods_js_1.default.Array; +MathtoolsMethods.Macro = BaseMethods_js_1.default.Macro; +MathtoolsMethods.xArrow = AmsMethods_js_1.AmsMethods.xArrow; +new SymbolMap_js_1.CommandMap('mathtools-macros', { + shoveleft: ['HandleShove', TexConstants_js_1.TexConstant.Align.LEFT], + shoveright: ['HandleShove', TexConstants_js_1.TexConstant.Align.RIGHT], + coloneqq: ['Macro', '\\mathrel{≔}'], + xleftrightarrow: ['xArrow', 0x2194, 7, 6] +}, MathtoolsMethods); +new SymbolMap_js_1.EnvironmentMap('mathtools-environment', ParseMethods_js_1.default.environment, { + dcases: ['Array', null, '\\{', '.', 'll', null, '.2em', 'D'], + rcases: ['Array', null, '.', '\\}', 'll', null, '.2em', 'D'], + drcases: ['Array', null, '\\{', '\\}', 'll', null, '.2em', 'D'], + 'matrix*': ['MtMatrix', null, null, null], + 'pmatrix*': ['MtMatrix', null, '(', ')'], + 'bmatrix*': ['MtMatrix', null, '[', ']'], + 'Bmatrix*': ['MtMatrix', null, '\\{', '\\}'], + 'vmatrix*': ['MtMatrix', null, '\\vert', '\\vert'], + 'Vmatrix*': ['MtMatrix', null, '\\Vert', '\\Vert'], + 'smallmatrix*': ['MtSmallMatrix', null, null, null], + psmallmatrix: ['MtSmallMatrix', null, '(', ')', 'c'], + 'psmallmatrix*': ['MtSmallMatrix', null, '(', ')'], + bsmallmatrix: ['MtSmallMatrix', null, '[', ']', 'c'], + 'bsmallmatrix*': ['MtSmallMatrix', null, '[', ']'], + Bsmallmatrix: ['MtSmallMatrix', null, '\\{', '\\}', 'c'], + 'Bsmallmatrix*': ['MtSmallMatrix', null, '\\{', '\\}'], + vsmallmatrix: ['MtSmallMatrix', null, '\\vert', '\\vert', 'c'], + 'vsmallmatrix*': ['MtSmallMatrix', null, '\\vert', '\\vert'], + Vsmallmatrix: ['MtSmallMatrix', null, '\\Vert', '\\Vert', 'c'], + 'Vsmallmatrix*': ['MtSmallMatrix', null, '\\Vert', '\\Vert'], + multlined: 'MtMultlined', +}, MathtoolsMethods); +exports.MathtoolsConfiguration = Configuration_js_1.Configuration.create('mathtools', { + handler: { + macro: ['mathtools-macros'], + environment: ['mathtools-environment'] + }, + items: (_a = {}, _a[MultlinedItem.prototype.kind] = MultlinedItem, _a) +}); +//# sourceMappingURL=MathtoolsConfiguration.js.map \ No newline at end of file diff --git a/js/MathtoolsConfiguration.js.map b/js/MathtoolsConfiguration.js.map new file mode 100644 index 0000000..5020ddd --- /dev/null +++ b/js/MathtoolsConfiguration.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MathtoolsConfiguration.js","sourceRoot":"","sources":["../ts/MathtoolsConfiguration.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/mathtools.js b/mathtools.js deleted file mode 100644 index de7a552..0000000 --- a/mathtools.js +++ /dev/null @@ -1,194 +0,0 @@ -/************************************************************* - * Copyright (c) 2019 MathJax Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -MathJax.Extension['mathtools'] = { - version: '1.2.0', -}; - -MathJax.Hub.Register.StartupHook('TeX Jax Ready', function () { - var TEX = MathJax.InputJax.TeX; - TEX.Definitions.Add({ - macros: { - coloneqq: ['Macro', '\\mathrel{≔}'], - xleftrightarrow: ['xArrow', 0x2194, 7, 6], - }, - environment: { - dcases: ['Array', null, '\\{', '.', 'll', null, '.2em', 'D'], - rcases: ['Array', null, '.', '\\}', 'll', null, '.2em', 'D'], - - 'matrix*': ['ExtensionEnv', null, 'AMSmath'], - 'pmatrix*': ['ExtensionEnv', null, 'AMSmath'], - 'bmatrix*': ['ExtensionEnv', null, 'AMSmath'], - 'Bmatrix*': ['ExtensionEnv', null, 'AMSmath'], - 'vmatrix*': ['ExtensionEnv', null, 'AMSmath'], - 'Vmatrix*': ['ExtensionEnv', null, 'AMSmath'], - - 'smallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - psmallmatrix: ['ExtensionEnv', null, 'AMSmath'], - 'psmallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - bsmallmatrix: ['ExtensionEnv', null, 'AMSmath'], - 'bsmallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - Bsmallmatrix: ['ExtensionEnv', null, 'AMSmath'], - 'Bsmallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - vsmallmatrix: ['ExtensionEnv', null, 'AMSmath'], - 'vsmallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - Vsmallmatrix: ['ExtensionEnv', null, 'AMSmath'], - 'Vsmallmatrix*': ['ExtensionEnv', null, 'AMSmath'], - - multlined: ['ExtensionEnv', null, 'AMSmath'], - }, - }); -}); - -MathJax.Hub.Register.StartupHook('TeX AMSmath Ready', function () { - var MML = MathJax.ElementJax.mml, - TEX = MathJax.InputJax.TeX, - STACKITEM = TEX.Stack.Item; - - TEX.Definitions.Add({ - environment: { - 'matrix*': ['MtMatrix', null, null, null], - 'pmatrix*': ['MtMatrix', null, '(', ')'], - 'bmatrix*': ['MtMatrix', null, '[', ']'], - 'Bmatrix*': ['MtMatrix', null, '\\{', '\\}'], - 'vmatrix*': ['MtMatrix', null, '\\vert', '\\vert'], - 'Vmatrix*': ['MtMatrix', null, '\\Vert', '\\Vert'], - - 'smallmatrix*': ['MtSmallMatrix', null, null, null], - psmallmatrix: ['MtSmallMatrix', null, '(', ')', 'c'], - 'psmallmatrix*': ['MtSmallMatrix', null, '(', ')'], - bsmallmatrix: ['MtSmallMatrix', null, '[', ']', 'c'], - 'bsmallmatrix*': ['MtSmallMatrix', null, '[', ']'], - Bsmallmatrix: ['MtSmallMatrix', null, '\\{', '\\}', 'c'], - 'Bsmallmatrix*': ['MtSmallMatrix', null, '\\{', '\\}'], - vsmallmatrix: ['MtSmallMatrix', null, '\\vert', '\\vert', 'c'], - 'vsmallmatrix*': ['MtSmallMatrix', null, '\\vert', '\\vert'], - Vsmallmatrix: ['MtSmallMatrix', null, '\\Vert', '\\Vert', 'c'], - 'Vsmallmatrix*': ['MtSmallMatrix', null, '\\Vert', '\\Vert'], - - multlined: 'MtMultlined', - }, - }); - - TEX.Parse.Augment({ - MtMatrix: function (begin, open, close) { - var align = this.GetBrackets('\\begin{' + begin.name + '}') || 'c'; - return this.Array(begin, open, close, align); - }, - - MtSmallMatrix: function (begin, open, close, align) { - if (!align) - align = this.GetBrackets('\\begin{' + begin.name + '}') || 'c'; - return this.Array( - begin, - open, - close, - align, - this.Em(1 / 3), - '.2em', - 'S', - 1 - ); - }, - - MtMultlined: function (begin) { - var pos = this.GetBrackets('\\begin{' + begin.name + '}') || ''; - var width = pos ? this.GetBrackets('\\begin{' + begin.name + '}') : null; - if (!pos.match(/^[cbt]$/)) { - var tmp = width; - width = pos; - pos = tmp; - } - this.Push(begin); - return this.setArrayAlign( - STACKITEM.multlined(false, this.stack).With({ - arraydef: { - displaystyle: true, - rowspacing: '.5em', - width: width, - columnwidth: '100%', - }, - }), - pos || 'c' - ); - }, - - HandleShove: function (name, shove) { - var top = this.stack.Top(); - if (top.type !== 'multline' && top.type !== 'multlined') { - TEX.Error([ - 'CommandInMultlined', - '%1 can only appear within the multline or multlined environments', - name, - ]); - } - if (top.data.length) { - TEX.Error([ - 'CommandAtTheBeginingOfLine', - '%1 must come at the beginning of the line', - name, - ]); - } - top.data.shove = shove; - var shift = this.GetBrackets(name); - var mml = this.ParseArg(name); - if (shift) { - var mrow = MML.mrow(); - var mspace = MML.mspace().With({ width: shift }); - if (shove === 'left') { - mrow.Append(mspace); - mrow.Append(mml); - } else { - mrow.Append(mml); - mrow.Append(mspace); - } - mml = mrow; - } - this.Push(mml); - }, - }); - - STACKITEM.multlined = STACKITEM.multline.Subclass({ - EndTable: function () { - if (this.data.length || this.row.length) { - this.EndEntry(); - this.EndRow(); - } - if (this.table.length) { - var m = this.table.length - 1; - if (this.table[0][0].columnalign !== 'right') { - this.table[0][0].Append( - MML.mspace().With({ width: TEX.config.MultlineGap || '2em' }) - ); - } - if (this.table[m][0].columnalign !== 'left') { - this.table[m][0].data[0].data.unshift(null); - this.table[m][0].data[0].SetData( - 0, - MML.mspace().With({ width: TEX.config.MultlineGap || '2em' }) - ); - } - } - this.SUPER(arguments).EndTable.call(this); - }, - }); -}); - -MathJax.Callback.Queue([ - 'loadComplete', - MathJax.Ajax, - '[mathtools]/mathtools.js', -]); diff --git a/package-lock.json b/package-lock.json index a436ef7..46caf20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -173,6 +173,12 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "commander": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz", + "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==", + "dev": true + }, "compare-func": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", @@ -549,6 +555,12 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -1204,6 +1216,17 @@ "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", "dev": true }, + "mathjax-full": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.1.2.tgz", + "integrity": "sha512-jFCwRFdFwIOa8J7r6VZT0AIv9ZwbLQ9aPc9YZp695NTvv7XKU2NunJodA+zDWzElIFJ7mTsImyfe5R3QyRNZjw==", + "dev": true, + "requires": { + "esm": "^3.2.25", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^3.1.1" + } + }, "meow": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", @@ -1296,6 +1319,12 @@ "kind-of": "^6.0.3" } }, + "mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==", + "dev": true + }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -1715,6 +1744,17 @@ "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", "dev": true }, + "speech-rule-engine": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.1.1.tgz", + "integrity": "sha512-FGX8B44yI3yGhmcw8nZ/by2ffUlZG6m5b/O3RULXsSiwhL/evL+jwQ6BXQxV3gGtOYptOFalTVCAFknAJgBKAg==", + "dev": true, + "requires": { + "commander": "^6.0.0", + "wicked-good-xpath": "^1.3.0", + "xmldom-sre": "^0.1.31" + } + }, "split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -1906,6 +1946,12 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, "uglify-js": { "version": "3.10.4", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.4.tgz", @@ -1935,6 +1981,12 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha1-gbDpXoZQ5JyUsiKY//hoa1VTz2w=", + "dev": true + }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -1985,6 +2037,12 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index c01ac48..f8e3afd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mathjax-mathtools", - "main": "./mathtools.js", + "main": "./js/MathtoolsConfiguration.js", "version": "1.3.0", "description": "MathJax extension reimplementing (parts of) the mathtools package", "keywords": [ @@ -26,6 +26,8 @@ "test": "echo 'No tests yet'" }, "devDependencies": { - "standard-version": "^9.0.0" + "mathjax-full": "^3.1.2", + "standard-version": "^9.0.0", + "typescript": "^3.9.7" } } diff --git a/ts/MathtoolsConfiguration.ts b/ts/MathtoolsConfiguration.ts new file mode 100644 index 0000000..2b6a038 --- /dev/null +++ b/ts/MathtoolsConfiguration.ts @@ -0,0 +1,196 @@ +/************************************************************* + * Copyright (c) 2019-2020 MathJax Consortium + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import {ArrayItem} from 'mathjax-full/js/input/tex/base/BaseItems.js'; +import {MultlineItem} from 'mathjax-full/js/input/tex/ams/AmsItems.js'; +import {StackItem} from 'mathjax-full/js/input/tex/StackItem.js'; +import ParseUtil from 'mathjax-full/js/input/tex/ParseUtil.js'; +import ParseMethods from 'mathjax-full/js/input/tex/ParseMethods.js'; +import {Configuration} from 'mathjax-full/js/input/tex/Configuration.js'; +import {ParseMethod} from 'mathjax-full/js/input/tex/Types.js'; +import {AmsMethods} from 'mathjax-full/js/input/tex/ams/AmsMethods.js'; +import BaseMethods from 'mathjax-full/js/input/tex/base/BaseMethods.js'; +import TexParser from 'mathjax-full/js/input/tex/TexParser.js'; +import TexError from 'mathjax-full/js/input/tex/TexError.js'; +import {MmlNode} from 'mathjax-full/js/core/MmlTree/MmlNode.js'; +import {CommandMap, EnvironmentMap} from 'mathjax-full/js/input/tex/SymbolMap.js'; +import NodeUtil from 'mathjax-full/js/input/tex/NodeUtil.js'; +import {TexConstant} from 'mathjax-full/js/input/tex/TexConstants.js'; + + +let MathtoolsMethods: Record = {}; + +export class MultlinedItem extends MultlineItem { + + /** + * @override + */ + get kind() { + return 'multlined'; + } + + + /** + * @override + */ + public EndTable() { + if (this.Size() || this.row.length) { + this.EndEntry(); + this.EndRow(); + } + if (this.table.length) { + let first = NodeUtil.getChildren(this.table[0])[0]; + let m = this.table.length - 1; + if (NodeUtil.getAttribute(first, 'columnalign') !== TexConstant.Align.RIGHT) { + first.appendChild( + this.create('node', 'mspace', [], + { width: this.factory.configuration.options['MultlineGap'] || '2em' }) + ); + } + let last = NodeUtil.getChildren(this.table[m])[0]; + if (NodeUtil.getAttribute( + last, 'columnalign') !== TexConstant.Align.LEFT) { + let top = last.childNodes[0] as MmlNode; + top.childNodes.unshift(null); + const space = this.create( + 'node', 'mspace', [], + { width: this.factory.configuration.options['MultlineGap'] || '2em' }); + NodeUtil.setChild(top, 0, space); + } + } + super.EndTable.call(this); + } + +} + + +MathtoolsMethods.MtMatrix = function(parser: TexParser, begin: StackItem, open, close) { + const align = parser.GetBrackets('\\begin{' + begin.getName() + '}') || 'c'; + return BaseMethods.Array(parser, begin, open, close, align); +}, + +MathtoolsMethods.MtSmallMatrix = function( + parser: TexParser, begin: StackItem, open, close, align) { + if (!align) { + align = parser.GetBrackets('\\begin{' + begin.getName() + '}') || 'c'; + } + return BaseMethods.Array( + parser, begin, open, close, align, ParseUtil.Em(1 / 3), '.2em', 'S', 1); +}, + +MathtoolsMethods.MtMultlined = function(parser: TexParser, begin: StackItem) { + let pos = parser.GetBrackets('\\begin{' + begin.getName() + '}') || ''; + let width = pos ? parser.GetBrackets('\\begin{' + begin.getName() + '}') : null; + if (!pos.match(/^[cbt]$/)) { + let tmp = width; + width = pos; + pos = tmp; + } + parser.Push(begin); + let item = parser.itemFactory.create('multlined', parser, begin) as ArrayItem; + item.arraydef = { + displaystyle: true, + rowspacing: '.5em', + width: width || parser.options['multlineWidth'], + columnwidth: '100%', + }; + return ParseUtil.setArrayAlign(item as ArrayItem, pos || 'c'); +}; + +MathtoolsMethods.HandleShove = function(parser: TexParser, name: string, shove: string) { + let top = parser.stack.Top(); + if (top.kind !== 'multline' && top.kind !== 'multlined') { + throw new TexError( + 'CommandInMultlined', + '%1 can only appear within the multline or multlined environments', + name); + } + if (top.Size()) { + throw new TexError( + 'CommandAtTheBeginingOfLine', + '%1 must come at the beginning of the line', + name); + } + top.setProperty('shove', shove); + let shift = parser.GetBrackets(name); + let mml = parser.ParseArg(name); + if (shift) { + let mrow = parser.create('node', 'mrow', []); + let mspace = parser.create('node', 'mspace', [], { width: shift }); + if (shove === 'left') { + mrow.appendChild(mspace); + mrow.appendChild(mml); + } else { + mrow.appendChild(mml); + mrow.appendChild(mspace); + } + mml = mrow; + } + parser.Push(mml); +}; + + +MathtoolsMethods.Array = BaseMethods.Array; +MathtoolsMethods.Macro = BaseMethods.Macro; +MathtoolsMethods.xArrow = AmsMethods.xArrow; + + +new CommandMap('mathtools-macros', { + shoveleft: ['HandleShove', TexConstant.Align.LEFT], + shoveright: ['HandleShove', TexConstant.Align.RIGHT], + + coloneqq: ['Macro', '\\mathrel{≔}'], + xleftrightarrow: ['xArrow', 0x2194, 7, 6] +}, MathtoolsMethods); + + +new EnvironmentMap('mathtools-environment', ParseMethods.environment, { + dcases: ['Array', null, '\\{', '.', 'll', null, '.2em', 'D'], + rcases: ['Array', null, '.', '\\}', 'll', null, '.2em', 'D'], + drcases: ['Array', null, '\\{', '\\}', 'll', null, '.2em', 'D'], + 'matrix*': ['MtMatrix', null, null, null], + 'pmatrix*': ['MtMatrix', null, '(', ')'], + 'bmatrix*': ['MtMatrix', null, '[', ']'], + 'Bmatrix*': ['MtMatrix', null, '\\{', '\\}'], + 'vmatrix*': ['MtMatrix', null, '\\vert', '\\vert'], + 'Vmatrix*': ['MtMatrix', null, '\\Vert', '\\Vert'], + + 'smallmatrix*': ['MtSmallMatrix', null, null, null], + psmallmatrix: ['MtSmallMatrix', null, '(', ')', 'c'], + 'psmallmatrix*': ['MtSmallMatrix', null, '(', ')'], + bsmallmatrix: ['MtSmallMatrix', null, '[', ']', 'c'], + 'bsmallmatrix*': ['MtSmallMatrix', null, '[', ']'], + Bsmallmatrix: ['MtSmallMatrix', null, '\\{', '\\}', 'c'], + 'Bsmallmatrix*': ['MtSmallMatrix', null, '\\{', '\\}'], + vsmallmatrix: ['MtSmallMatrix', null, '\\vert', '\\vert', 'c'], + 'vsmallmatrix*': ['MtSmallMatrix', null, '\\vert', '\\vert'], + Vsmallmatrix: ['MtSmallMatrix', null, '\\Vert', '\\Vert', 'c'], + 'Vsmallmatrix*': ['MtSmallMatrix', null, '\\Vert', '\\Vert'], + + multlined: 'MtMultlined', +}, MathtoolsMethods); + + +export const MathtoolsConfiguration = Configuration.create( + 'mathtools', { + handler: { + macro: ['mathtools-macros'], + environment: ['mathtools-environment'] + }, + items: {[MultlinedItem.prototype.kind]: MultlinedItem} + } +); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..57e0b43 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "target": "ES5", + "downlevelIteration": true, + "module": "commonjs", + "declaration": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "removeComments": true, + "baseUrl": ".", + "paths": { + "mathjax-full": ["node_modules/mathjax-full"] + }, + "lib": ["es6", "dom"], + "noLib": false, + "sourceMap": true, + "outDir": "js", + "typeRoots": ["./typings"] + }, + "include": ["ts/**/*"], + "exclude": ["js", "es5", "components"] + }