From f8e0c91de464af514479d53521d77036494145ce Mon Sep 17 00:00:00 2001 From: Eddie Kohler Date: Sat, 26 Nov 2016 23:00:01 -0500 Subject: [PATCH] Support \stackrel (#468). --- src/functions.js | 30 ++++++++++++++++++ test/screenshotter/images/StackRel-chrome.png | Bin 0 -> 6103 bytes .../screenshotter/images/StackRel-firefox.png | Bin 0 -> 6045 bytes test/screenshotter/ss_data.yaml | 1 + 4 files changed, 31 insertions(+) create mode 100644 test/screenshotter/images/StackRel-chrome.png create mode 100644 test/screenshotter/images/StackRel-firefox.png diff --git a/src/functions.js b/src/functions.js index deaf4f74..b3f875ac 100644 --- a/src/functions.js +++ b/src/functions.js @@ -1,5 +1,7 @@ var utils = require("./utils"); var ParseError = require("./ParseError"); +var parseData = require("./parseData"); +var ParseNode = parseData.ParseNode; /* This file contains a list of functions that we parse, identified by * the calls to defineFunction. @@ -236,6 +238,34 @@ defineFunction([ }; }); +// Build a relation by placing one symbol on top of another +defineFunction("\\stackrel", { + numArgs: 2, +}, function(context, args) { + var top = args[0]; + var bottom = args[1]; + + var bottomop = new ParseNode("op", { + type: "op", + limits: true, + alwaysHandleSupSub: true, + symbol: false, + value: ordargument(bottom), + }, bottom.mode); + + var supsub = new ParseNode("supsub", { + base: bottomop, + sup: top, + sub: null, + }, top.mode); + + return { + type: "mclass", + mclass: "mrel", + value: [supsub], + }; +}); + // Extra data needed for the delimiter handler down below var delimiterSizes = { "\\bigl" : {mclass: "mopen", size: 1}, diff --git a/test/screenshotter/images/StackRel-chrome.png b/test/screenshotter/images/StackRel-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc2456fb93749705dd73e61b510045de39ac36f GIT binary patch literal 6103 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 OV(;nd=d#Wzp$P!L(ZF^9 literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/StackRel-firefox.png b/test/screenshotter/images/StackRel-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..9a861c143a131cd4dc424732c1a3dca96ee6a4e9 GIT binary patch literal 6045 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 BkwgFh literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index 6c596c9a..77799122 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -116,6 +116,7 @@ Sqrt: | ^{\sqrt{\sqrt{\sqrt{x}}}}} SqrtRoot: | 1+\sqrt[3]{2}+\sqrt[1923^234]{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^2}}}}}}}}}}} +StackRel: a \stackrel{?}{=} b \stackrel{\text{def}}{=} c StyleSwitching: a\cdot b\scriptstyle a\cdot ba\textstyle\cdot ba\scriptstyle\cdot b SupSubCharacterBox: a_2f_2{f}_2{aa}_2{af}_2\mathbf{y}_Ay_A SupSubHorizSpacing: |