From 4801ab875a3f8406149002c5e8b8717d177fd373 Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Sun, 13 May 2018 09:58:24 -0400 Subject: [PATCH] Support for top-level \newline and \\ in inline math (#1298) * Support for top-level \newline and \\ in inline math This was a little tricky because `\\` was defined as an endOfExpression. Instead made `\\` a termination specific to an array environment. Outside an array environment, buildHTML handles the `cr` object, resulting in a `.newline` class. Currently this turns into a `display: block` (with appropriate vertical spacing) only in inline math, matching LaTeX. * Simplify code * Fix Jest errors * NewLine screenshot test * Bug fix: \\ only works at top level of inline * Add \newline and \cr to test * Switch test to pmatrix * Add vertical space test * Add \\ vs. \newline tests * Fix flow errors * Add \cr test * Add documentation for \\ at top level * Comment out newRow * Fix commenting out --- README.md | 7 +++ src/ParseNode.js | 2 + src/Parser.js | 2 +- src/buildHTML.js | 9 +++ src/defineFunction.js | 2 +- src/environments/array.js | 4 +- src/functions.js | 14 +---- src/functions/cr.js | 57 ++++++++++++++++++ src/katex.less | 12 ++++ src/types.js | 2 +- test/errors-spec.js | 8 +-- test/katex-spec.js | 12 ++++ test/screenshotter/images/NewLine-chrome.png | Bin 0 -> 18321 bytes test/screenshotter/images/NewLine-firefox.png | Bin 0 -> 17602 bytes test/screenshotter/ss_data.yaml | 8 +++ 15 files changed, 116 insertions(+), 23 deletions(-) create mode 100644 src/functions/cr.js create mode 100644 test/screenshotter/images/NewLine-chrome.png create mode 100644 test/screenshotter/images/NewLine-firefox.png diff --git a/README.md b/README.md index 77432fdb..172d2710 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,13 @@ will appear larger than 1cm in browser units. - MathJax supports Unicode text characters in math mode, unlike LaTeX. To support this behavior in KaTeX, set the `unicodeTextInMathMode` option to `true`. +- KaTeX breaks lines with `\\` and `\newline` in inline math, but ignores them + in display math (matching LaTeX's behavior, but not MathJax's behavior). + To allow `\\` and `\newline` to break lines in display mode, + add the following CSS rule: + ```css + .katex-display > .katex > .katex-html > .newline { display: block !important; } + ``` ## Libraries diff --git a/src/ParseNode.js b/src/ParseNode.js index 3b74107a..a999431c 100644 --- a/src/ParseNode.js +++ b/src/ParseNode.js @@ -121,6 +121,8 @@ type ParseNodeTypes = { |}, "cr": {| type: "cr", + //newRow: boolean, + newLine: boolean, size: ?ParseNode<*>, |}, "delimsizing": {| diff --git a/src/Parser.js b/src/Parser.js index c2951788..66b95ddd 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -150,7 +150,7 @@ export default class Parser { return expression; } - static endOfExpression = ["}", "\\end", "\\right", "&", "\\\\", "\\cr"]; + static endOfExpression = ["}", "\\end", "\\right", "&", "\\cr"]; /** * Parses an "expression", which is a list of atoms. diff --git a/src/buildHTML.js b/src/buildHTML.js index ca5f410a..b54d6a85 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -700,6 +700,15 @@ export default function buildHTML(tree, options) { htmlNode.children.push(buildHTMLUnbreakable(parts, options)); parts = []; } + } else if (expression[i].hasClass("newline")) { + // Write the line except the newline + parts.pop(); + if (parts.length > 0) { + htmlNode.children.push(buildHTMLUnbreakable(parts, options)); + parts = []; + } + // Put the newline at the top level + htmlNode.children.push(expression[i]); } } if (parts.length > 0) { diff --git a/src/defineFunction.js b/src/defineFunction.js index d3762974..55fcf773 100644 --- a/src/defineFunction.js +++ b/src/defineFunction.js @@ -132,7 +132,7 @@ export type FunctionSpec = {| // FLOW TYPE NOTES: Doing either one of the following two // - // - removing the NOTETYPE type parameter in FunctionSpec above; + // - removing the NODETYPE type parameter in FunctionSpec above; // - using ?FunctionHandler below; // // results in a confusing flow typing error: diff --git a/src/environments/array.js b/src/environments/array.js index 61929c23..e7f5291d 100644 --- a/src/environments/array.js +++ b/src/environments/array.js @@ -64,7 +64,7 @@ function parseArray( numHLinesBeforeRow.push(getNumHLines(parser)); while (true) { // eslint-disable-line no-constant-condition - let cell = parser.parseExpression(false, undefined); + let cell = parser.parseExpression(false, "\\\\"); cell = new ParseNode("ordgroup", cell, parser.mode); if (style) { cell = new ParseNode("styling", { @@ -100,7 +100,7 @@ function parseArray( row = []; body.push(row); } else { - throw new ParseError("Expected & or \\\\ or \\end", + throw new ParseError("Expected & or \\\\ or \\cr or \\end", parser.nextToken); } } diff --git a/src/functions.js b/src/functions.js index ca36276c..dac059ac 100644 --- a/src/functions.js +++ b/src/functions.js @@ -270,18 +270,8 @@ defineFunction("infix", ["\\over", "\\choose", "\\atop"], { }; }); -// Row breaks for aligned data -defineFunction("cr", ["\\\\", "\\cr"], { - numArgs: 0, - numOptionalArgs: 1, - argTypes: ["size"], -}, function(context, args, optArgs) { - const size = optArgs[0]; - return { - type: "cr", - size: size, - }; -}); +// Row and line breaks +import "./functions/cr"; // Environment delimiters defineFunction("environment", ["\\begin", "\\end"], { diff --git a/src/functions/cr.js b/src/functions/cr.js new file mode 100644 index 00000000..db55ae09 --- /dev/null +++ b/src/functions/cr.js @@ -0,0 +1,57 @@ +//@flow +// Row breaks within tabular environments, and line breaks at top level + +import defineFunction from "../defineFunction"; +import buildCommon from "../buildCommon"; +import mathMLTree from "../mathMLTree"; +import { calculateSize } from "../units"; +import ParseError from "../ParseError"; + +defineFunction({ + type: "cr", + names: ["\\\\", "\\cr", "\\newline"], + props: { + numArgs: 0, + numOptionalArgs: 1, + argTypes: ["size"], + allowedInText: true, + }, + + handler: (context, args, optArgs) => { + return { + type: "cr", + // \\ and \cr both end the row in a tabular environment + // This flag isn't currently needed by environments/array.js + //newRow: context.funcName !== "\\newline", + // \\ and \newline both end the line in an inline math environment + newLine: context.funcName !== "\\cr", + size: optArgs[0], + }; + }, + + // The following builders are called only at the top level, + // not within tabular environments. + + htmlBuilder: (group, options) => { + if (!group.value.newLine) { + throw new ParseError( + "\\cr valid only within a tabular environment"); + } + const span = buildCommon.makeSpan(["mspace", "newline"], [], options); + if (group.value.size) { + span.style.marginTop = + calculateSize(group.value.size.value, options) + "em"; + } + return span; + }, + + mathmlBuilder: (group, options) => { + const node = new mathMLTree.MathNode("mspace"); + node.setAttribute("linebreak", "newline"); + if (group.value.size) { + node.setAttribute("height", + calculateSize(group.value.size.value, options) + "em"); + } + return node; + }, +}); diff --git a/src/katex.less b/src/katex.less index b62c5acf..1492040c 100644 --- a/src/katex.less +++ b/src/katex.less @@ -30,6 +30,11 @@ > .katex-html { display: inline-block; + + /* \newline doesn't do anything in display mode */ + > .newline { + display: none; + } } } } @@ -60,6 +65,13 @@ overflow: hidden; } + .katex-html { + /* \newline is an empty block at top level of inline mode */ + > .newline { + display: block; + } + } + .base { position: relative; display: inline-block; diff --git a/src/types.js b/src/types.js index 48887b12..779a911e 100644 --- a/src/types.js +++ b/src/types.js @@ -24,4 +24,4 @@ export type ArgType = "color" | "size" | "url" | "original" | Mode; export type StyleStr = "text" | "display" | "script" | "scriptscript"; // Allowable token text for "break" arguments in parser -export type BreakToken = "]" | "}" | "$" | "\\)"; +export type BreakToken = "]" | "}" | "$" | "\\)" | "\\\\"; diff --git a/test/errors-spec.js b/test/errors-spec.js index 864b0d84..7fcb059f 100644 --- a/test/errors-spec.js +++ b/test/errors-spec.js @@ -208,10 +208,6 @@ describe("Parser.expect calls:", function() { "Expected 'EOF', got '\\end' at position 2:" + " x\\̲e̲n̲d̲{matrix}"); }); - it("complains about top-level \\\\", function() { - expect("1\\\\2").toFailWithParseError( - "Expected 'EOF', got '\\\\' at position 2: 1\\̲\\̲2"); - }); it("complains about top-level &", function() { expect("1&2").toFailWithParseError( "Expected 'EOF', got '&' at position 2: 1&̲2"); @@ -292,12 +288,12 @@ describe("environments.js:", function() { describe("parseArray", function() { it("rejects missing \\end", function() { expect("\\begin{matrix}1").toFailWithParseError( - "Expected & or \\\\ or \\end at end of input:" + + "Expected & or \\\\ or \\cr or \\end at end of input:" + " \\begin{matrix}1"); }); it("rejects incorrectly scoped \\end", function() { expect("{\\begin{matrix}1}\\end{matrix}").toFailWithParseError( - "Expected & or \\\\ or \\end at position 17:" + + "Expected & or \\\\ or \\cr or \\end at position 17:" + " …\\begin{matrix}1}̲\\end{matrix}"); }); }); diff --git a/test/katex-spec.js b/test/katex-spec.js index e629dc62..81f4d11d 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -3126,6 +3126,18 @@ describe("The \\mathchoice function", function() { }); }); +describe("Newlines via \\\\ and \\newline", function() { + it("should build \\\\ and \\newline the same", () => { + expect("hello \\\\ world").toBuildLike("hello \\newline world"); + expect("hello \\\\[1ex] world").toBuildLike( + "hello \\newline[1ex] world"); + }); + + it("should not allow \\cr at top level", () => { + expect("hello \\cr world").toNotParse(); + }); +}); + describe("Symbols", function() { it("should parse \\text{\\i\\j}", () => { expect("\\text{\\i\\j}").toBuild(); diff --git a/test/screenshotter/images/NewLine-chrome.png b/test/screenshotter/images/NewLine-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..d3ffb8008a0d462421ea0339072afcc857e4945b GIT binary patch literal 18321 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 Mp00i_>zopr0F5(rCIA2c literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/NewLine-firefox.png b/test/screenshotter/images/NewLine-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..29397e0ca109e8d8c9dfc086747f951a6369c7fd GIT binary patch literal 17602 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

B|2*z}|F7`Juk>m$ioeDY^O)V#AIJ_6Oyjnf?f@ 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index 99f18d1a..fc7620ac 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -207,6 +207,14 @@ NegativeSpace: NestedFractions: | \dfrac{\frac{a}{b}}{\frac{c}{d}}\dfrac{\dfrac{a}{b}} {\dfrac{c}{d}}\frac{\frac{a}{b}}{\frac{c}{d}} +NewLine: | + \frac{a^2+b^2}{c^2} \newline + \frac{a^2+b^2}{c^2} \\[1ex] + \begin{pmatrix} + a & b \\ + c & d \cr + \end{pmatrix} \\ + a+b+c+{d+\\e}+f+g Not: | \begin{array}{l} \not=\not>\not\geq\not\in\not<\not\leq\not{abc} \\