From 7ec455083feef02deebb0e64d0e5414213ed4196 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Fri, 6 Jan 2017 18:52:50 +0100 Subject: [PATCH 1/5] Builtin macros, macro arguments, overset and underset * Ship predefined macros with the library, in macros.js. * Allow macro arguments #1 and so on, with argument count deduced from string. * Use these features to implement \overset and \underset, fixes #484. --- .eslintrc | 2 +- package.json | 1 + src/MacroExpander.js | 76 ++++++++++++++++++++++++++++++++++++++++++-- src/macros.js | 15 +++++++++ test/katex-spec.js | 7 ++++ 5 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 src/macros.js diff --git a/.eslintrc b/.eslintrc index 96821cc6..74c9e4d3 100644 --- a/.eslintrc +++ b/.eslintrc @@ -39,7 +39,7 @@ "no-with": 2, "one-var": [2, "never"], "prefer-const": 2, - "prefer-spread": 2, + "prefer-spread": 0, // re-enable once we use es6 "semi": [2, "always"], "space-before-blocks": 2, "space-before-function-paren": [2, "never"], diff --git a/package.json b/package.json index 4f00ff38..6e794ffe 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "less": "~2.7.1", "morgan": "^1.7.0", "nomnom": "^1.8.1", + "object-assign": "^4.1.0", "pako": "1.0.4", "selenium-webdriver": "^2.48.2", "sri-toolbox": "^0.2.0", diff --git a/src/MacroExpander.js b/src/MacroExpander.js index 8569e6ad..7ea8d315 100644 --- a/src/MacroExpander.js +++ b/src/MacroExpander.js @@ -4,10 +4,13 @@ */ const Lexer = require("./Lexer"); +const builtinMacros = require("./macros"); +const ParseError = require("./ParseError"); +const objectAssign = require("object-assign"); function MacroExpander(input, macros) { this.lexer = new Lexer(input); - this.macros = macros; + this.macros = objectAssign({}, builtinMacros, macros); this.stack = []; // contains tokens in REVERSE order this.discardedWhiteSpace = []; } @@ -25,18 +28,87 @@ MacroExpander.prototype.nextToken = function() { if (!(name.charAt(0) === "\\" && this.macros.hasOwnProperty(name))) { return topToken; } + let tok; let expansion = this.macros[name]; if (typeof expansion === "string") { + let numArgs = 0; + if (expansion.indexOf("#") !== -1) { + const stripped = expansion.replace(/##/g, ""); + while (stripped.indexOf("#" + (numArgs + 1)) !== -1) { + ++numArgs; + } + } const bodyLexer = new Lexer(expansion); expansion = []; - let tok = bodyLexer.lex(); + tok = bodyLexer.lex(); while (tok.text !== "EOF") { expansion.push(tok); tok = bodyLexer.lex(); } expansion.reverse(); // to fit in with stack using push and pop + expansion.numArgs = numArgs; this.macros[name] = expansion; } + if (expansion.numArgs) { + const args = []; + let i; + // obtain arguments, either single token or balanced {…} group + for (i = 0; i < expansion.numArgs; ++i) { + const startOfArg = this.get(true); + if (startOfArg.text === "{") { + const arg = []; + let depth = 1; + while (depth !== 0) { + tok = this.get(false); + arg.push(tok); + if (tok.text === "{") { + ++depth; + } else if (tok.text === "}") { + --depth; + } else if (tok.text === "EOF") { + throw new ParseError( + "End of input in macro argument", + startOfArg); + } + } + arg.pop(); // remove last } + arg.reverse(); // like above, to fit in with stack order + args[i] = arg; + } else if (startOfArg.text === "EOF") { + throw new ParseError( + "End of input expecting macro argument", topToken); + } else { + args[i] = [startOfArg]; + } + } + // paste arguments in place of the placeholders + expansion = expansion.slice(); // make a shallow copy + for (i = expansion.length - 1; i >= 0; --i) { + tok = expansion[i]; + if (tok.text === "#") { + if (i === 0) { + throw new ParseError( + "Incomplete placeholder at end of macro body", + tok); + } + tok = expansion[--i]; // next token on stack + if (tok.text === "#") { // ## → # + expansion.splice(i + 1, 1); // drop first # + } else if (/^[1-9]$/.test(tok.text)) { + // expansion.splice(i, 2, arg[0], arg[1], …) + // to replace placeholder with the indicated argument. + // TODO: use spread once we move to ES2015 + expansion.splice.apply( + expansion, + [i, 2].concat(args[tok.text - 1])); + } else { + throw new ParseError( + "Not a valid argument number", + tok); + } + } + } + } this.stack = this.stack.concat(expansion); } }; diff --git a/src/macros.js b/src/macros.js new file mode 100644 index 00000000..197145c9 --- /dev/null +++ b/src/macros.js @@ -0,0 +1,15 @@ +/** + * Predefined macros for KaTeX. + * This can be used to define some commands in terms of others. + */ + +module.exports = { + + ////////////////////////////////////////////////////////////////////// + // amsmath.sty + + // \def\overset#1#2{\binrel@{#2}\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} + "\\overset": "\\mathop{#2}\\limits^{#1}", + "\\underset": "\\mathop{#2}\\limits_{#1}", + +}; diff --git a/test/katex-spec.js b/test/katex-spec.js index 36dd5f5b..651df70e 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -2011,6 +2011,13 @@ describe("A macro expander", function() { "\\bar": "a", }); }); + + it("should expand the \overset macro as expected", function() { + expect("\\overset?=").toParseLike("\\mathop{=}\\limits^{?}"); + expect("\\overset{x=y}{\sqrt{ab}}") + .toParseLike("\\mathop{\sqrt{ab}}\\limits^{x=y}"); + expect("\\overset {?} =").toParseLike("\\mathop{=}\\limits^{?}"); + }); }); describe("A parser taking String objects", function() { From 96d1e6aea789a5816bf7866c5ba2789c917c90ff Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Fri, 6 Jan 2017 19:45:51 +0100 Subject: [PATCH 2/5] Introduce defineMacro function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit … as suggested by Erik Demaine, to future-proof the code. --- src/macros.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/macros.js b/src/macros.js index 197145c9..f88935f0 100644 --- a/src/macros.js +++ b/src/macros.js @@ -3,13 +3,14 @@ * This can be used to define some commands in terms of others. */ -module.exports = { +// This function might one day accept additional argument and do more things. +function defineMacro(name, body) { + module.exports[name] = body; +} - ////////////////////////////////////////////////////////////////////// - // amsmath.sty +////////////////////////////////////////////////////////////////////// +// amsmath.sty - // \def\overset#1#2{\binrel@{#2}\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} - "\\overset": "\\mathop{#2}\\limits^{#1}", - "\\underset": "\\mathop{#2}\\limits_{#1}", - -}; +// \def\overset#1#2{\binrel@{#2}\binrel@@{\mathop{\kern\z@#2}\limits^{#1}}} +defineMacro("\\overset", "\\mathop{#2}\\limits^{#1}"); +defineMacro("\\underset", "\\mathop{#2}\\limits_{#1}"); From e2763a300712e6b2774b925daf5d389a7377cb08 Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Fri, 6 Jan 2017 23:34:29 +0100 Subject: [PATCH 3/5] Support \bgroup and \egroup --- src/macros.js | 7 +++++++ test/screenshotter/images/GroupMacros-chrome.png | Bin 0 -> 4250 bytes .../screenshotter/images/GroupMacros-firefox.png | Bin 0 -> 4252 bytes test/screenshotter/ss_data.js | 3 +++ test/screenshotter/ss_data.yaml | 5 +++++ test/screenshotter/test.html | 6 ++++++ 6 files changed, 21 insertions(+) create mode 100644 test/screenshotter/images/GroupMacros-chrome.png create mode 100644 test/screenshotter/images/GroupMacros-firefox.png diff --git a/src/macros.js b/src/macros.js index f88935f0..fb1054bf 100644 --- a/src/macros.js +++ b/src/macros.js @@ -8,6 +8,13 @@ function defineMacro(name, body) { module.exports[name] = body; } +////////////////////////////////////////////////////////////////////// +// basics +defineMacro("\\bgroup", "{"); +defineMacro("\\egroup", "}"); +defineMacro("\\begingroup", "{"); +defineMacro("\\endgroup", "}"); + ////////////////////////////////////////////////////////////////////// // amsmath.sty diff --git a/test/screenshotter/images/GroupMacros-chrome.png b/test/screenshotter/images/GroupMacros-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..da77a3acb729435f42d618ae62b3889ad5a306c6 GIT binary patch literal 4250 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 Date: Sat, 7 Jan 2017 00:21:28 +0100 Subject: [PATCH 4/5] Indicate missing support for delimited macros --- src/MacroExpander.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MacroExpander.js b/src/MacroExpander.js index 7ea8d315..608feafe 100644 --- a/src/MacroExpander.js +++ b/src/MacroExpander.js @@ -17,6 +17,10 @@ function MacroExpander(input, macros) { /** * Recursively expand first token, then return first non-expandable token. + * + * At the moment, macro expansion doesn't handle delimited macros, + * i.e. things like those defined by \def\foo#1\end{…}. + * See the TeX book page 202ff. for details on how those should behave. */ MacroExpander.prototype.nextToken = function() { for (;;) { From 3a95d8889b381ea3a35f6f3051ac18c83e18ce5c Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Mon, 9 Jan 2017 14:18:40 +0100 Subject: [PATCH 5/5] Added screenshotter tests for overset and underset --- .../images/OverUnderset-chrome.png | Bin 0 -> 16255 bytes .../images/OverUnderset-firefox.png | Bin 0 -> 15424 bytes test/screenshotter/ss_data.yaml | 7 +++++++ 3 files changed, 7 insertions(+) create mode 100644 test/screenshotter/images/OverUnderset-chrome.png create mode 100644 test/screenshotter/images/OverUnderset-firefox.png diff --git a/test/screenshotter/images/OverUnderset-chrome.png b/test/screenshotter/images/OverUnderset-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..3c5c71d71241aaf10b62f8a16dc1918046273c7d GIT binary patch literal 16255 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index 2c620e63..040d66ec 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -127,6 +127,13 @@ OpLimits: | {\sin_2^2 \lim_2^2 \int_2^2 \sum_2^2} {\displaystyle \lim_2^2 \int_2^2 \intop_2^2 \sum_2^2} OverUnderline: x\underline{x}\underline{\underline{x}}\underline{x_{x_{x_x}}}\underline{x^{x^{x^x}}}\overline{x}\overline{x}\overline{x^{x^{x^x}}} \blue{\overline{\underline{x}}\underline{\overline{x}}} +OverUnderset: | + \begin{array}{l} + x\overset?=1\\ + {\displaystyle\lim_{t\underset{>0}\to0}}\\ + a+b+c+d\overset{b+c=0}\longrightarrow a+d\\ + \overset { x = y } { \sqrt { a b } } + \end{array} Phantom: \dfrac{1+\phantom{x^{\blue{2}}} = x}{1+x^{\blue{2}} = x} PrimeSpacing: f'+f_2'+f^{f'} PrimeSuper: x'^2+x'''^2+x'^2_3+x_3'^2