From ca224eda818c36b90ffd905fc26fec15a45df01c Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Tue, 5 Sep 2017 09:49:10 +0900 Subject: [PATCH] Support for \raisebox (#685) * Rough support for \raisebox * Fix bounding box thanks to @kevinbarash and @ronkok * Use calculateSize to support all currently supported units (ex, em, mu). * Shift height and depth in all cases. * Add screenshot test * Rename transform -> raisebox * Switch to normalsize in raisebox * Attempt at using makeVList * Significant rewrite, now working well * rename textFunctionStyles to textFunctionFonts --- src/buildHTML.js | 20 +++++++++++++++++- src/buildMathML.js | 4 ++++ src/functions.js | 19 +++++++++++++++-- test/screenshotter/images/Raisebox-chrome.png | Bin 0 -> 11292 bytes .../screenshotter/images/Raisebox-firefox.png | Bin 0 -> 11321 bytes test/screenshotter/ss_data.yaml | 1 + 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 test/screenshotter/images/Raisebox-chrome.png create mode 100644 test/screenshotter/images/Raisebox-firefox.png diff --git a/src/buildHTML.js b/src/buildHTML.js index 98d2eb4b..fb2e9ee9 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -304,7 +304,7 @@ groupTypes.ordgroup = function(group, options) { }; groupTypes.text = function(group, options) { - const newOptions = options.withFont(group.value.style); + const newOptions = options.withFont(group.value.font); const inner = buildExpression(group.value.body, newOptions, true); for (let i = 0; i < inner.length - 1; i++) { if (inner[i].tryCombine(inner[i + 1])) { @@ -1631,6 +1631,24 @@ groupTypes.mclass = function(group, options) { return makeSpan([group.value.mclass], elements, options); }; +groupTypes.raisebox = function(group, options) { + const body = groupTypes.sizing({value: { + value: [{ + type: "text", + value: { + body: group.value.body, + font: "mathrm", // simulate \textrm + }, + }], + size: 6, // simulate \normalsize + }}, options); + const dy = units.calculateSize(group.value.dy.value, options); + return buildCommon.makeVList([{ + type: "elem", + elem: body, + }], "shift", -dy, options); +}; + /** * buildGroup is the function that takes a group and calls the correct groupType * function for it. It also handles the interaction of size and style changes diff --git a/src/buildMathML.js b/src/buildMathML.js index d54e2b38..0dccb596 100644 --- a/src/buildMathML.js +++ b/src/buildMathML.js @@ -601,6 +601,10 @@ groupTypes.mclass = function(group, options) { return new mathMLTree.MathNode("mstyle", inner); }; +// Transforms (translation/rotation) don't seem to have a representation +// in MathML, so just treat them like \text{...} +groupTypes.raisebox = groupTypes.text; + /** * Takes a list of nodes, builds them, and returns a list of the generated * MathML nodes. A little simpler than the HTML version because we don't do any diff --git a/src/functions.js b/src/functions.js index d0a6f2db..c29bbe85 100644 --- a/src/functions.js +++ b/src/functions.js @@ -32,7 +32,7 @@ defineFunction("\\sqrt", { }); // Non-mathy text, possibly in a font -const textFunctionStyles = { +const textFunctionFonts = { "\\text": undefined, "\\textrm": "mathrm", "\\textsf": "mathsf", "\\texttt": "mathtt", "\\textnormal": "mathrm", "\\textbf": "mathbf", "\\textit": "textit", @@ -51,7 +51,7 @@ defineFunction([ return { type: "text", body: ordargument(body), - style: textFunctionStyles[context.funcName], + font: textFunctionFonts[context.funcName], }; }); @@ -650,3 +650,18 @@ defineFunction(["\\begin", "\\end"], { nameGroup: nameGroup, }; }); + +// Box manipulation +defineFunction(["\\raisebox"], { + numArgs: 2, + argTypes: ["size", "text"], + allowedInText: true, +}, function(context, args) { + const amount = args[0]; + const body = args[1]; + return { + type: "raisebox", + dy: amount, + body: ordargument(body), + }; +}); diff --git a/test/screenshotter/images/Raisebox-chrome.png b/test/screenshotter/images/Raisebox-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..fc8da117dc436aa4eced0bc3d23827092c3223de GIT binary patch literal 11292 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index dd5022e8..442ae192 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -186,6 +186,7 @@ OverUnderset: | Phantom: \dfrac{1+\phantom{x^{\blue{2}}} = x}{1+x^{\blue{2}} = x} \left(\vphantom{\int_t} zzz \right) \left( X \hphantom{\frac{\frac X X}{X}} \right) PrimeSpacing: f'+f_2'+f^{f'} PrimeSuper: x'^2+x'''^2+x'^2_3+x_3'^2 +Raisebox: \frac{a}{a\raisebox{0.5em}{b}} \cdot \frac{a\raisebox{-0.5em}{b}}{a} \cdot \sqrt{a\raisebox{0.5em}{b}} \cdot \sqrt{a\raisebox{-0.5em}{b}} \cdot \sqrt{a\raisebox{0.5em}{b}\raisebox{-0.5em}{b}} RelativeUnits: | \begin{array}{ll} a\kern1emb^{a\kern1emb^{a\kern1emb}} &