From a7381857048222b56a7cefd1421be3d6e2080381 Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Thu, 19 Jan 2017 13:50:16 -0500 Subject: [PATCH] Fix x'^2 (#636) * Fix x'^2 * Add screenshot for x'^2 * x^2' should fail. Add and fix multiple prime/superscript tests. --- src/Parser.js | 10 +++++++++- test/errors-spec.js | 10 ++++++++++ test/katex-spec.js | 1 - test/screenshotter/images/PrimeSuper-chrome.png | Bin 0 -> 9224 bytes test/screenshotter/images/PrimeSuper-firefox.png | Bin 0 -> 5731 bytes test/screenshotter/ss_data.yaml | 1 + 6 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test/screenshotter/images/PrimeSuper-chrome.png create mode 100644 test/screenshotter/images/PrimeSuper-firefox.png diff --git a/src/Parser.js b/src/Parser.js index 31f51e5..82d0777 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -343,6 +343,9 @@ Parser.prototype.parseAtom = function() { subscript = this.handleSupSubscript("subscript"); } else if (lex.text === "'") { // We got a prime + if (superscript) { + throw new ParseError("Double superscript", lex); + } const prime = new ParseNode("textord", "\\prime", this.mode); // Many primes can be grouped together, so we handle this here @@ -354,7 +357,12 @@ Parser.prototype.parseAtom = function() { primes.push(prime); this.consume(); } - // Put them into an ordgroup as the superscript + // If there's a superscript following the primes, combine that + // superscript in with the primes. + if (this.nextToken.text === "^") { + primes.push(this.handleSupSubscript("superscript")); + } + // Put everything into an ordgroup as the superscript superscript = new ParseNode("ordgroup", primes, this.mode); } else { // If it wasn't ^, _, or ', stop parsing super/subscripts diff --git a/test/errors-spec.js b/test/errors-spec.js index 641863c..190e75c 100644 --- a/test/errors-spec.js +++ b/test/errors-spec.js @@ -106,6 +106,16 @@ describe("Parser:", function() { expect("1^{2+3}_4^5").toFailWithParseError( "Double superscript at position 10: 1^{2+3}_4^̲5"); }); + it("rejects double superscripts involving primes", function() { + expect("1'_2^3").toFailWithParseError( + "Double superscript at position 5: 1'_2^̲3"); + expect("1^2'").toFailWithParseError( + "Double superscript at position 4: 1^2'̲"); + expect("1^2_3'").toFailWithParseError( + "Double superscript at position 6: 1^2_3'̲"); + expect("1'_2'").toFailWithParseError( + "Double superscript at position 5: 1'_2'̲"); + }); it("rejects double subscripts", function() { expect("1_2_3").toFailWithParseError( "Double subscript at position 4: 1_2_̲3"); diff --git a/test/katex-spec.js b/test/katex-spec.js index 15012f7..36dd5f5 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -1260,7 +1260,6 @@ describe("A TeX-compliant parser", function() { expect("x''''").toParse(); expect("x_2''").toParse(); expect("x''_2").toParse(); - expect("x'_2'").toParse(); }); it("should fail when sup/subscripts are interspersed with arguments", function() { diff --git a/test/screenshotter/images/PrimeSuper-chrome.png b/test/screenshotter/images/PrimeSuper-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4c68942a44b3b16f5b4cd5e93a2e1c4e8de22b GIT binary patch literal 9224 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/images/PrimeSuper-firefox.png b/test/screenshotter/images/PrimeSuper-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..41352b34a977c3777aedc7b8c906354deca8d650 GIT binary patch literal 5731 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 literal 0 HcmV?d00001 diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml index bef0d7b..8838e48 100644 --- a/test/screenshotter/ss_data.yaml +++ b/test/screenshotter/ss_data.yaml @@ -124,6 +124,7 @@ OpLimits: | OverUnderline: x\underline{x}\underline{\underline{x}}\underline{x_{x_{x_x}}}\underline{x^{x^{x^x}}}\overline{x}\overline{x}\overline{x^{x^{x^x}}} \blue{\overline{\underline{x}}\underline{\overline{x}}} Phantom: \dfrac{1+\phantom{x^{\blue{2}}} = x}{1+x^{\blue{2}} = x} PrimeSpacing: f'+f_2'+f^{f'} +PrimeSuper: x'^2+x'''^2+x'^2_3+x_3'^2 RlapBug: \frac{\rlap{x}}{2} Rule: \rule{1em}{0.5em}\rule{1ex}{2ex}\rule{1em}{1ex}\rule{1em}{0.431ex} SizingBaseline: