From c6647e330307638849cbfb8cdb4eff52622e3b3b Mon Sep 17 00:00:00 2001 From: Kevin Barabash Date: Wed, 23 Aug 2017 13:24:17 -0400 Subject: [PATCH] Added support for \not (#140) * Added support for \not * fix grammar in comment --- src/buildHTML.js | 34 ++++++++++++++++++++++ src/buildMathML.js | 3 ++ src/symbols.js | 1 + static/katex.less | 6 ++++ test/katex-spec.js | 2 ++ test/screenshotter/images/Not-chrome.png | Bin 0 -> 13934 bytes test/screenshotter/images/Not-firefox.png | Bin 0 -> 11598 bytes test/screenshotter/ss_data.yaml | 5 ++++ 8 files changed, 51 insertions(+) create mode 100644 test/screenshotter/images/Not-chrome.png create mode 100644 test/screenshotter/images/Not-firefox.png diff --git a/src/buildHTML.js b/src/buildHTML.js index c22ed050..cfd9a921 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -117,6 +117,40 @@ const buildExpression = function(expression, options, isRealGroup) { } } + // Process \\not commands within the group. + // TODO(kevinb): Handle multiple \\not commands in a row. + // TODO(kevinb): Handle \\not{abc} correctly. The \\not should appear over + // the 'a' instead of the 'c'. + for (let i = 0; i < groups.length; i++) { + if (groups[i].value === "\u0338" && i + 1 < groups.length) { + const children = groups.slice(i, i + 2); + + children[0].classes = ["mainrm"]; + // \u0338 is a combining glyph so we could reorder the children so + // that it comes after the other glyph. This works correctly on + // most browsers except for Safari. Instead we absolutely position + // the glyph and set its right side to match that of the other + // glyph which is visually equivalent. + children[0].style.position = "absolute"; + children[0].style.right = "0"; + + // Copy the classes from the second glyph to the new container. + // This is so it behaves the same as though there was no \\not. + const classes = groups[i + 1].classes; + const container = makeSpan(classes, children); + + // LaTeX adds a space between ords separated by a \\not. + if (classes.indexOf("mord") !== -1) { + // \glue(\thickmuskip) 2.77771 plus 2.77771 + container.style.paddingLeft = "0.277771em"; + } + + // Ensure that the \u0338 is positioned relative to the container. + container.style.position = "relative"; + groups.splice(i, 2, container); + } + } + return groups; }; diff --git a/src/buildMathML.js b/src/buildMathML.js index 758c7c7e..9979397d 100644 --- a/src/buildMathML.js +++ b/src/buildMathML.js @@ -661,6 +661,9 @@ const buildExpression = function(expression, options) { const group = expression[i]; groups.push(buildGroup(group, options)); } + + // TODO(kevinb): combine \\not with mrels and mords + return groups; }; diff --git a/src/symbols.js b/src/symbols.js index 01cbcbfa..2aeafa70 100644 --- a/src/symbols.js +++ b/src/symbols.js @@ -504,6 +504,7 @@ defineSymbol(math, main, rel, "\u2190", "\\gets"); defineSymbol(math, main, rel, ">", "\\gt"); defineSymbol(math, main, rel, "\u2208", "\\in"); defineSymbol(math, main, rel, "\u2209", "\\notin"); +defineSymbol(math, main, rel, "\u0338", "\\not"); defineSymbol(math, main, rel, "\u2282", "\\subset"); defineSymbol(math, main, rel, "\u2283", "\\supset"); defineSymbol(math, main, rel, "\u2286", "\\subseteq"); diff --git a/static/katex.less b/static/katex.less index 645dcc5c..a6dfa472 100644 --- a/static/katex.less +++ b/static/katex.less @@ -49,6 +49,7 @@ } .base { + position: relative; display: inline-block; } @@ -107,6 +108,11 @@ font-style: italic; } + .mainrm { + font-family: KaTeX_Main; + font-style: normal; + } + // This value is also used in fontMetrics.js, if you change it make sure the // values match. @ptperem: 10.0; diff --git a/test/katex-spec.js b/test/katex-spec.js index ce473f4e..56c46b88 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -240,9 +240,11 @@ describe("A bin parser", function() { describe("A rel parser", function() { const expression = "=<>\\leq\\geq\\neq\\nleq\\ngeq\\cong"; + const notExpression = "\\not=\\not<\\not>\\not\\leq\\not\\geq\\not\\in"; it("should not fail", function() { expect(expression).toParse(); + expect(notExpression).toParse(); }); it("should build a list of rels", function() { diff --git a/test/screenshotter/images/Not-chrome.png b/test/screenshotter/images/Not-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..438c392b51739f6d74577b94074cfecba676a376 GIT binary patch literal 13934 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 SFQ^19l=gJ>b6Mw<&;$VU;IGsG literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index 5471f864..62a52c1d 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -155,6 +155,11 @@ NegativeSpaceBetweenRel: A =\!= B NestedFractions: | \dfrac{\frac{a}{b}}{\frac{c}{d}}\dfrac{\dfrac{a}{b}} {\dfrac{c}{d}}\frac{\frac{a}{b}}{\frac{c}{d}} +Not: | + \begin{array}{l} + \not=\not>\not\geq\not\in\not<\not\leq\not{abc} \\ + \not xy + ab \not xy + \end{array} NullDelimiterInteraction: a \bigl. + 2 \quad \left. + a \right) OldFont: | \begin{matrix}