From 3083efba6689529a9fed1f593a62b4c7a682afaf Mon Sep 17 00:00:00 2001 From: Kevin Barabash Date: Wed, 30 Dec 2015 16:58:50 -0800 Subject: [PATCH] Add support for \kern Summary: This only supports em and ex units and doesn't handle vertical layouts. Negative kerning works. Test Plan: - make test - make screenshots (verify that d is slightly overlapping c in the screenshots) Reviewers: emily --- src/buildHTML.js | 19 ++++++++++++++++ src/buildMathML.js | 7 ++++++ src/functions.js | 10 +++++++++ test/katex-spec.js | 25 +++++++++++++++++++++ test/screenshotter/images/Kern-chrome.png | Bin 0 -> 6390 bytes test/screenshotter/images/Kern-firefox.png | Bin 0 -> 6376 bytes test/screenshotter/ss_data.yaml | 1 + 7 files changed, 62 insertions(+) create mode 100644 test/screenshotter/images/Kern-chrome.png create mode 100644 test/screenshotter/images/Kern-firefox.png diff --git a/src/buildHTML.js b/src/buildHTML.js index dbd33a3f..a0e2d522 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -1178,6 +1178,25 @@ groupTypes.rule = function(group, options, prev) { return rule; }; +groupTypes.kern = function(group, options, prev) { + // Make an empty span for the rule + var rule = makeSpan(["mord", "rule"], [], options.getColor()); + + var dimension = 0; + if (group.value.dimension) { + dimension = group.value.dimension.number; + if (group.value.dimension.unit === "ex") { + dimension *= fontMetrics.metrics.xHeight; + } + } + + dimension /= options.style.sizeMultiplier; + + rule.style.marginLeft = dimension + "em"; + + return rule; +}; + groupTypes.accent = function(group, options, prev) { // Accents are handled in the TeXbook pg. 443, rule 12. var base = group.value.base; diff --git a/src/buildMathML.js b/src/buildMathML.js index f3c7c5e1..0a4d5445 100644 --- a/src/buildMathML.js +++ b/src/buildMathML.js @@ -430,6 +430,13 @@ groupTypes.rule = function(group) { return node; }; +groupTypes.kern = function(group) { + // TODO(kevin): Figure out if there's a way to add space in MathML + var node = new mathMLTree.MathNode("mrow"); + + return node; +}; + groupTypes.llap = function(group, options) { var node = new mathMLTree.MathNode( "mpadded", [buildGroup(group.value.body, options)]); diff --git a/src/functions.js b/src/functions.js index 2fa124d3..ea5c33ea 100644 --- a/src/functions.js +++ b/src/functions.js @@ -187,6 +187,16 @@ defineFunction("\\rule", { }; }); +defineFunction("\\kern", { + numArgs: 1, + argTypes: ["size"], +}, function(context, args) { + return { + type: "kern", + dimension: args[0].value, + }; +}); + // A KaTeX logo defineFunction("\\KaTeX", { numArgs: 0, diff --git a/test/katex-spec.js b/test/katex-spec.js index 75a0d393..b6ac37e3 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -909,6 +909,31 @@ describe("A rule parser", function() { }); }); +describe("A kern parser", function() { + var emKern = "\\kern{1em}"; + var exKern = "\\kern{1ex}"; + var badUnitRule = "\\kern{1px}"; + var noNumberRule = "\\kern{em}"; + + it("should list the correct units", function() { + var emParse = getParsed(emKern)[0]; + var exParse = getParsed(exKern)[0]; + + expect(emParse.value.dimension.unit).toEqual("em"); + expect(exParse.value.dimension.unit).toEqual("ex"); + }); + + it("should not parse invalid units", function() { + expect(badUnitRule).toNotParse(); + expect(noNumberRule).toNotParse(); + }); + + it("should parse negative sizes", function() { + var parse = getParsed("\\kern{-1em}")[0]; + expect(parse.value.dimension.number).toBeCloseTo(-1); + }); +}); + describe("A left/right parser", function() { var normalLeftRight = "\\left( \\dfrac{x}{y} \\right)"; var emptyRight = "\\left( \\dfrac{x}{y} \\right."; diff --git a/test/screenshotter/images/Kern-chrome.png b/test/screenshotter/images/Kern-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..232ace52c6d1ffc75e88c2c1e705823543e7ecc0 GIT binary patch literal 6390 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 n!)Rg{O$-8~*bP0l+XkK%mZio literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/Kern-firefox.png b/test/screenshotter/images/Kern-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..e33835dd4352f384c2a3a1bae4d26553a08204e2 GIT binary patch literal 6376 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index d5e8736f..6b41de8d 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -58,6 +58,7 @@ FractionTest: \dfrac{a}{b}\frac{a}{b}\tfrac{a}{b}\;-\dfrac12\;1\tfrac12 Functions: \sin\cos\tan\ln\log GreekLetters: \alpha\beta\gamma\omega KaTeX: \KaTeX +Kern: \frac{a\kern{1em}b}{c}a\kern{1em}b\kern{1ex}c\kern{-0.25em}d Lap: ab\llap{f}cd\rlap{g}h LeftRight: \left( x^2 \right) \left\{ x^{x^{x^{x^x}}} \right. LeftRightListStyling: a+\left(x+y\right)-x