diff --git a/src/environments.js b/src/environments.js index c2579158..0a0a6265 100644 --- a/src/environments.js +++ b/src/environments.js @@ -8,15 +8,23 @@ const ParseNode = parseData.ParseNode; /** * Parse the body of the environment, with rows delimited by \\ and * columns delimited by &, and create a nested list in row-major order - * with one group per cell. + * with one group per cell. If given an optional argument style + * ("text", "display", etc.), then each cell is cast into that style. */ -function parseArray(parser, result) { +function parseArray(parser, result, style) { let row = []; const body = [row]; const rowGaps = []; while (true) { - const cell = parser.parseExpression(false, null); - row.push(new ParseNode("ordgroup", cell, parser.mode)); + let cell = parser.parseExpression(false, null); + cell = new ParseNode("ordgroup", cell, parser.mode); + if (style) { + cell = new ParseNode("styling", { + style: style, + value: [cell], + }, parser.mode); + } + row.push(cell); const next = parser.nextToken.text; if (next === "&") { parser.consume(); @@ -82,9 +90,21 @@ function defineEnvironment(names, props, handler) { } } +// Decides on a style for cells in an array according to whether the given +// environment name starts with the letter 'd'. +function dCellStyle(envName) { + if (envName.substr(0, 1) === "d") { + return "display"; + } else { + return "text"; + } +} + // Arrays are part of LaTeX, defined in lttab.dtx so its documentation // is part of the source2e.pdf file of LaTeX2e source documentation. -defineEnvironment("array", { +// {darray} is an {array} environment where cells are set in \displaystyle, +// as defined in nccmath.sty. +defineEnvironment(["array", "darray"], { numArgs: 1, }, function(context, args) { let colalign = args[0]; @@ -111,7 +131,7 @@ defineEnvironment("array", { cols: cols, hskipBeforeAndAfter: true, // \@preamble in lttab.dtx }; - res = parseArray(context.parser, res); + res = parseArray(context.parser, res, dCellStyle(context.envName)); return res; }); @@ -138,7 +158,7 @@ defineEnvironment([ type: "array", hskipBeforeAndAfter: false, // \hskip -\arraycolsep in amsmath }; - res = parseArray(context.parser, res); + res = parseArray(context.parser, res, dCellStyle(context.envName)); if (delimiters) { res = new ParseNode("leftright", { body: [res], @@ -152,7 +172,12 @@ defineEnvironment([ // A cases environment (in amsmath.sty) is almost equivalent to // \def\arraystretch{1.2}% // \left\{\begin{array}{@{}l@{\quad}l@{}} … \end{array}\right. -defineEnvironment("cases", { +// {dcases} is a {cases} environment where cells are set in \displaystyle, +// as defined in mathtools.sty. +defineEnvironment([ + "cases", + "dcases", +], { }, function(context) { let res = { type: "array", @@ -173,7 +198,7 @@ defineEnvironment("cases", { postgap: 0, }], }; - res = parseArray(context.parser, res); + res = parseArray(context.parser, res, dCellStyle(context.envName)); res = new ParseNode("leftright", { body: [res], left: "\\{", diff --git a/test/screenshotter/images/ArrayMode-chrome.png b/test/screenshotter/images/ArrayMode-chrome.png new file mode 100644 index 00000000..16b10fa5 Binary files /dev/null and b/test/screenshotter/images/ArrayMode-chrome.png differ diff --git a/test/screenshotter/images/ArrayMode-firefox.png b/test/screenshotter/images/ArrayMode-firefox.png new file mode 100644 index 00000000..65aaf66f Binary files /dev/null and b/test/screenshotter/images/ArrayMode-firefox.png differ diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index 1b986633..bef0d7b3 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -23,11 +23,20 @@ Arrays: | 1+1&2+1&3+1\cr1\over2&\scriptstyle 1/2&\frac12\\[1ex] \begin{pmatrix}x\\y\end{pmatrix}&0&\begin{vmatrix}a&b\\c&d\end{vmatrix} \end{array}\right] +ArrayMode: + tex: | + \begin{matrix} + \frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1\,\partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1\,\partial x_n} \\ + \frac{\partial^2 f}{\partial x_2\,\partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2\,\partial x_n} \\ + \vdots & \vdots & \ddots & \vdots \\ + \frac{\partial^2 f}{\partial x_n\,\partial x_1} & \frac{\partial^2 f}{\partial x_n\,\partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2} + \end{matrix} + display: 1 ArrayType: 1\begin{array}{c}2\\3\end{array}4 Baseline: a+b-c\cdot d/e BasicTest: a BinCancellation: | - \begin{array}{ccc} + \begin{array}{cccc} +1 & 1+ & 1+1 & (,) \\ 1++1 & 3\times) & 1+, & \left(,\right) \end{array}