From c48de165e8795dc6fc0c932d83c75b44ff7dc2d9 Mon Sep 17 00:00:00 2001 From: Emily Eisenberg Date: Wed, 22 Apr 2015 15:26:10 -0700 Subject: [PATCH] Add optional arguments to \sqrt Summary: Use the TeX definitions of `\root` to get the optional `\sqrt` argument in the right place. Also add the MathML version. Fixes #48 Test Plan: - `make test` - See that the images look good Reviewers: kevinb, alpert Reviewed By: alpert Differential Revision: https://phabricator.khanacademy.org/D17236 --- src/buildHTML.js | 32 +++++++++++++++++- src/buildMathML.js | 13 +++++-- src/functions.js | 11 ++---- static/katex.less | 10 ++++++ test/katex-spec.js | 4 +-- .../screenshotter/images/SqrtRoot-firefox.png | Bin 0 -> 22503 bytes test/screenshotter/ss_data.json | 1 + 7 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 test/screenshotter/images/SqrtRoot-firefox.png diff --git a/src/buildHTML.js b/src/buildHTML.js index 8a4fe9e4a..aee601df7 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -812,7 +812,37 @@ var groupTypes = { ], "firstBaseline", null, options); } - return makeSpan(["sqrt", "mord"], [delim, body]); + if (!group.value.index) { + return makeSpan(["sqrt", "mord"], [delim, body]); + } else { + // Handle the optional root index + + // The index is always in scriptscript style + var root = buildGroup( + group.value.index, + options.withStyle(Style.SCRIPTSCRIPT)); + var rootWrap = makeSpan( + [options.style.reset(), Style.SCRIPTSCRIPT.cls()], + [root]); + + // Figure out the height and depth of the inner part + var innerHeight = Math.max(delim.height, body.height); + var innerDepth = Math.max(delim.depth, body.depth); + + // The amount the index is shifted by. This is taken from the TeX + // source, in the definition of `\r@@t`. + var toShift = 0.6 * (innerHeight - innerDepth); + + // Build a VList with the superscript shifted up correctly + var rootVList = buildCommon.makeVList( + [{type: "elem", elem: rootWrap}], + "shift", -toShift, options); + // Add a class surrounding it so we can add on the appropriate + // kerning + var rootVListWrap = makeSpan(["root"], [rootVList]); + + return makeSpan(["sqrt", "mord"], [rootVListWrap, delim, body]); + } }, sizing: function(group, options, prev) { diff --git a/src/buildMathML.js b/src/buildMathML.js index 129b26d60..a681decaa 100644 --- a/src/buildMathML.js +++ b/src/buildMathML.js @@ -187,8 +187,17 @@ var groupTypes = { }, sqrt: function(group) { - var node = new mathMLTree.MathNode( - "msqrt", [buildGroup(group.value.body)]); + var node; + if (group.value.index) { + node = new mathMLTree.MathNode( + "mroot", [ + buildGroup(group.value.body), + buildGroup(group.value.index) + ]); + } else { + node = new mathMLTree.MathNode( + "msqrt", [buildGroup(group.value.body)]); + } return node; }, diff --git a/src/functions.js b/src/functions.js index 5bdbe0245..a00dd3f29 100644 --- a/src/functions.js +++ b/src/functions.js @@ -71,16 +71,11 @@ var functions = { "\\sqrt": { numArgs: 1, numOptionalArgs: 1, - handler: function(func, optional, body, positions) { - if (optional != null) { - throw new ParseError( - "Optional arguments to \\sqrt aren't supported yet", - this.lexer, positions[1] - 1); - } - + handler: function(func, index, body, positions) { return { type: "sqrt", - body: body + body: body, + index: index }; } }, diff --git a/static/katex.less b/static/katex.less index ff29f422f..44bc34536 100644 --- a/static/katex.less +++ b/static/katex.less @@ -1,5 +1,8 @@ @import "fonts.less"; +// The mu unit is defined as 1/18 em +@mu: 1.0/18.0em; + .katex-display { display: block; margin: 1em 0; @@ -359,6 +362,13 @@ margin-top: -1px; } } + + > .root { + // These values are taken from the definition of `\r@@t`, + // `\mkern 5mu` and `\mkern -10mu`. + margin-left: 5*@mu; + margin-right: -10*@mu; + } } .sizing, .fontsize-ensurer { diff --git a/test/katex-spec.js b/test/katex-spec.js index e89ccdc0b..ed102cb07 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -1210,8 +1210,8 @@ describe("An optional argument parser", function() { expect("\\rule[0.2em]{1em}{1em}").toParse(); }); - it("should fail on sqrts for now", function() { - expect("\\sqrt[3]{2}").toNotParse(); + it("should work with sqrts with optional arguments", function() { + expect("\\sqrt[3]{2}").toParse(); }); it("should work when the optional argument is missing", function() { diff --git a/test/screenshotter/images/SqrtRoot-firefox.png b/test/screenshotter/images/SqrtRoot-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..09b51fe937ca07bd960dd09474cd609e03456162 GIT binary patch literal 22503 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.json b/test/screenshotter/ss_data.json index 62ff0cb68..5f0416f48 100644 --- a/test/screenshotter/ss_data.json +++ b/test/screenshotter/ss_data.json @@ -29,6 +29,7 @@ "Sizing": "http://localhost:7936/test/screenshotter/test.html?m={\\Huge x}{\\LARGE y}{\\normalsize z}{\\scriptsize w}", "Spacing": "http://localhost:7936/test/screenshotter/test.html?m=^3+[-1][1-1]1=1(=1)\\lvert a\\rvert~b", "Sqrt": "http://localhost:7936/test/screenshotter/test.html?m=\\sqrt{\\sqrt{\\sqrt{x}}}_{\\sqrt{\\sqrt{x}}}^{\\sqrt{\\sqrt{\\sqrt{x}}}^{\\sqrt{\\sqrt{\\sqrt{x}}}}}", + "SqrtRoot": "http://localhost:7936/test/screenshotter/test.html?m=1+\\sqrt[3]{2}+\\sqrt[1923^234]{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^{2^2}}}}}}}}}}}", "SupSubCharacterBox": "http://localhost:7936/test/screenshotter/test.html?m=a_2f_2{f}_2{aa}_2{af}_2", "SupSubHorizSpacing": "http://localhost:7936/test/screenshotter/test.html?m=x^{x^{x}}\\Big|x_{x_{x_{x_{x}}}}\\bigg|x^{x^{x_{x_{x_{x_{x}}}}}}\\bigg|", "SupSubOffsets": "http://localhost:7936/test/screenshotter/test.html?m=\\displaystyle \\int_{2+3}x f^{2+3}+3\\lim_{2+3+4+5}f",