From 8201501d770a9dd5a58af2f6023a1f85027f7aff Mon Sep 17 00:00:00 2001 From: Martin von Gagern Date: Mon, 23 Nov 2015 13:14:02 +0100 Subject: [PATCH] Introduce an aligned environment This is almost like the align* environment, but it starts out in math mode, so we don't have to worry about the fact that we have no real surrounding text mode in KaTeX. This is the first step towards align* and align. --- src/environments.js | 40 ++++++++++++++++++ test/katex-spec.js | 9 ++++ test/screenshotter/images/Aligned-chrome.png | Bin 0 -> 9631 bytes test/screenshotter/images/Aligned-firefox.png | Bin 0 -> 9024 bytes test/screenshotter/ss_data.yaml | 5 +++ 5 files changed, 54 insertions(+) create mode 100644 test/screenshotter/images/Aligned-chrome.png create mode 100644 test/screenshotter/images/Aligned-firefox.png diff --git a/src/environments.js b/src/environments.js index 0c183f259..3fb0de6a6 100644 --- a/src/environments.js +++ b/src/environments.js @@ -176,3 +176,43 @@ defineEnvironment("cases", { }, context.mode); return res; }); + +// An aligned environment is like the align* environment +// except it operates within math mode. +// Note that we assume \nomallineskiplimit to be zero, +// so that \strut@ is the same as \strut. +defineEnvironment("aligned", { +}, function(context) { + var res = { + type: "array", + cols: [] + }; + res = parseArray(context.parser, res); + var emptyGroup = new ParseNode("ordgroup", [], context.mode); + var numCols = 0; + res.value.body.forEach(function(row) { + var i; + for (i = 1; i < row.length; i += 2) { + row[i].value.unshift(emptyGroup); + } + if (numCols < row.length) { + numCols = row.length; + } + }); + for (var i = 0; i < numCols; ++i) { + var align = "r"; + var pregap = 0; + if (i % 2 === 1) { + align = "l"; + } else if (i > 0) { + pregap = 2; // one \qquad between columns + } + res.value.cols[i] = { + type: "align", + align: align, + pregap: pregap, + postgap: 0 + }; + } + return res; +}); diff --git a/test/katex-spec.js b/test/katex-spec.js index 30cf29798..d01b6724f 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -1672,6 +1672,15 @@ describe("A cases environment", function() { }); +describe("An aligned environment", function() { + + it("should parse its input", function() { + expect("\\begin{aligned}a&=b&c&=d\\\\e&=f\\end{aligned}") + .toParse(); + }); + +}); + var getMathML = function(expr, settings) { var usedSettings = settings ? settings : defaultSettings; diff --git a/test/screenshotter/images/Aligned-chrome.png b/test/screenshotter/images/Aligned-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..89e5899b318b165d635d51f98cd7a9607c6c0223 GIT binary patch literal 9631 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