From 925c96dbe24080bfc7b98a08ecdc4110a9fa01a6 Mon Sep 17 00:00:00 2001 From: Emily Eisenberg Date: Sat, 6 Sep 2014 15:08:23 -0700 Subject: [PATCH] Add square roots (\sqrt) Summary: Follow the TeXbook instructions on how to construct square roots. Using makeCustomSizedDelim, this becomes nearly trivial. Test Plan: - Make sure normal tests work - Make sure the new huxley test looks good, and other huxley tests haven't changed. Reviewers: alpert Reviewed By: alpert Differential Revision: http://phabricator.khanacademy.org/D12918 --- Parser.js | 13 ++++++ buildTree.js | 65 ++++++++++++++++++++++++++++- delimiter.js | 9 +++- static/katex.less | 40 ++++++++++++++++++ symbols.js | 5 +++ test/huxley/Huxleyfile.json | 6 +++ test/huxley/Sqrt.hux/firefox-1.png | Bin 0 -> 30876 bytes test/huxley/Sqrt.hux/record.json | 5 +++ test/katex-tests.js | 23 ++++++++++ 9 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 test/huxley/Sqrt.hux/firefox-1.png create mode 100644 test/huxley/Sqrt.hux/record.json diff --git a/Parser.js b/Parser.js index 6a3d0977..f24c2d28 100644 --- a/Parser.js +++ b/Parser.js @@ -535,6 +535,19 @@ Parser.prototype.parseNucleus = function(pos, mode) { this.lexer, nucleus.position ); } + } else if (mode === "math" && nucleus.type === "\\sqrt") { + // If this is a square root, parse its argument and return + var group = this.parseGroup(nucleus.position, mode); + if (group) { + return new ParseResult( + new ParseNode("sqrt", group, mode), + group.position); + } else { + throw new ParseError("Expected group after '" + + nucleus.type + "'", + this.lexer, nucleus.position + ); + } } else if (mode === "math" && nucleus.type === "\\rule") { // Parse the width of the rule var widthGroup = this.parseSizeGroup(nucleus.position, mode); diff --git a/buildTree.js b/buildTree.js index a523548e..4d7a6cc4 100644 --- a/buildTree.js +++ b/buildTree.js @@ -38,7 +38,8 @@ var groupToType = { katex: "mord", overline: "mord", rule: "mord", - leftright: "minner" + leftright: "minner", + sqrt: "mord" }; var getTypeOfGroup = function(group) { @@ -429,6 +430,68 @@ var groupTypes = { ["katex-logo"], [k, a, t, e, x], options.getColor()); }, + sqrt: function(group, options, prev) { + var innerGroup = buildGroup(group.value.result, + options.withStyle(options.style.cramp())); + + var fontSizer = buildCommon.makeFontSizer( + options, Math.max(innerGroup.maxFontSize, 1.0)); + + // The theta variable in the TeXbook + var lineWidth = fontMetrics.metrics.defaultRuleThickness; + + var lineInner = + makeSpan([options.style.reset(), Style.TEXT.cls(), "line"]); + lineInner.maxFontSize = 1.0; + var line = makeSpan(["sqrt-line"], [fontSizer, lineInner]); + + var inner = makeSpan(["sqrt-inner"], [fontSizer, innerGroup]); + var fixIE = makeSpan( + ["fix-ie"], [fontSizer, new domTree.textNode("\u00a0")]); + + var theta = fontMetrics.metrics.defaultRuleThickness / + options.style.sizeMultiplier; + var phi = theta; + if (options.style.id < Style.TEXT.id) { + phi = fontMetrics.metrics.xHeight; + } + + var psi = theta + phi / 4; + + var innerHeight = + (inner.height + inner.depth) * options.style.sizeMultiplier; + var minDelimiterHeight = innerHeight + psi + theta; + + var delim = makeSpan(["sqrt-sign"], [ + delimiter.customSizedDelim("\\surd", minDelimiterHeight, + false, options, group.mode)]); + + var delimDepth = delim.height + delim.depth; + + if (delimDepth > inner.height + inner.depth + psi) { + psi = (psi + delimDepth - inner.height - inner.depth) / 2; + } + + delim.style.top = (-inner.height - psi + delim.height - theta) + "em"; + + line.style.top = (-inner.height - psi) + "em"; + line.height = inner.height + psi + 2 * theta; + + // We add a special case here, because even when `inner` is empty, we + // still get a line. So, we use a simple heuristic to decide if we + // should omit the body entirely. (note this doesn't work for something + // like `\sqrt{\rlap{x}}`, but if someone is doing that they deserve for + // it not to work. + var body; + if (inner.height === 0 && inner.depth === 0) { + body = makeSpan(); + } else { + body = makeSpan(["sqrt-body"], [line, inner, fixIE]); + } + + return makeSpan(["sqrt", "mord"], [delim, body]); + }, + overline: function(group, options, prev) { var innerGroup = buildGroup(group.value.result, options.withStyle(options.style.cramp())); diff --git a/delimiter.js b/delimiter.js index de5dda08..b5f786ea 100644 --- a/delimiter.js +++ b/delimiter.js @@ -191,6 +191,12 @@ var makeStackedDelim = function(delim, heightTotal, center, options, mode) { bottom = "\u23ad"; repeat = "\u23aa"; font = "Size4-Regular"; + } else if (delim === "\\surd") { + top = "\ue001"; + bottom = "\u23b7"; + repeat = "\ue000"; + font = "Size4-Regular"; + overlap = true; } // Get the metrics of the three sections @@ -312,7 +318,8 @@ var normalDelimiters = [ "(", ")", "[", "\\lbrack", "]", "\\rbrack", "\\{", "\\lbrace", "\\}", "\\rbrace", "\\lfloor", "\\rfloor", "\\lceil", "\\rceil", - "<", ">", "\\langle", "\\rangle", "/", "\\backslash" + "<", ">", "\\langle", "\\rangle", "/", "\\backslash", + "\\surd" ]; var stackDelimiters = [ diff --git a/static/katex.less b/static/katex.less index df8bc8b3..3ad5e52a 100644 --- a/static/katex.less +++ b/static/katex.less @@ -350,6 +350,46 @@ big parens } } + .sqrt { + > .sqrt-sign { + position: relative; + } + + > .sqrt-body { + .baseline-align-hack-outer; + + > .sqrt-line, + > .sqrt-inner, + > .fix-ie { + .baseline-align-hack-middle; + position: relative; + + > span { + .baseline-align-hack-inner; + } + } + + > .sqrt-line > .line { + width: 100%; + + &:before { + border-bottom-style: solid; + border-bottom-width: 1px; + content: ""; + display: block; + } + + &:after { + border-bottom-style: solid; + border-bottom-width: 0.04em; + content: ""; + display: block; + margin-top: -1px; + } + } + } + } + .sizing, .fontsize-ensurer { display: inline-block; diff --git a/symbols.js b/symbols.js index 41631e73..377dafa5 100644 --- a/symbols.js +++ b/symbols.js @@ -298,6 +298,11 @@ var symbols = { group: "bin", replace: "\u00d7" }, + "\\surd": { + font: "main", + group: "textord", + replace: "\u221a" + }, "(": { font: "main", group: "open" diff --git a/test/huxley/Huxleyfile.json b/test/huxley/Huxleyfile.json index 0fe46040..18b1ca78 100644 --- a/test/huxley/Huxleyfile.json +++ b/test/huxley/Huxleyfile.json @@ -153,5 +153,11 @@ "name": "NullDelimiterInteraction", "screenSize": [1024, 768], "url": "http://localhost:7936/test/huxley/test.html?m=a \\bigl. + 2 \\quad \\left. + a \\right)" + }, + + { + "name": "Sqrt", + "screenSize": [1024, 768], + "url": "http://localhost:7936/test/huxley/test.html?m=\\sqrt{\\sqrt{\\sqrt{x}}}_{\\sqrt{\\sqrt{x}}}^{\\sqrt{\\sqrt{\\sqrt{x}}}^{\\sqrt{\\sqrt{\\sqrt{x}}}}}" } ] diff --git a/test/huxley/Sqrt.hux/firefox-1.png b/test/huxley/Sqrt.hux/firefox-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d22c3229bf01cc82615bf26cabd805d771241f94 GIT binary patch literal 30876 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