From a02859033abddaa9221597d25697aecc024df4de Mon Sep 17 00:00:00 2001 From: Ron Kok Date: Fri, 24 Nov 2017 11:19:22 -0800 Subject: [PATCH] Support Unicode Symbols (#950) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Support Unicode Symbols This is the third in a series of PRs to give KaTeX the ability to recognize Unicode character input. This one supports some but not all letter-like symbols and some other symbols. All the characters in this PR will produce `textord` atoms in `math` mode. The list is not comprehensive. It’s a bit eclectic. Some of these characters are important. Others were just easy to include. A few important characters are omitted because it wasn’t clear to me which is the best way to implement them. I’ll address those characters in future PRs. * Add comments. Remove RegEx. * Fix omitted parens --- src/macros.js | 9 +++++++ src/symbols.js | 62 ++++++++++++++++++++++++---------------------- test/katex-spec.js | 4 +++ 3 files changed, 45 insertions(+), 30 deletions(-) diff --git a/src/macros.js b/src/macros.js index f08c95fe..6944e87f 100644 --- a/src/macros.js +++ b/src/macros.js @@ -48,6 +48,15 @@ defineMacro("\\egroup", "}"); defineMacro("\\begingroup", "{"); defineMacro("\\endgroup", "}"); +// Unicode double-struck letters +defineMacro("\u2102", "\\mathbb{C}"); +defineMacro("\u210D", "\\mathbb{H}"); +defineMacro("\u2115", "\\mathbb{N}"); +defineMacro("\u2119", "\\mathbb{P}"); +defineMacro("\u211A", "\\mathbb{Q}"); +defineMacro("\u211D", "\\mathbb{R}"); +defineMacro("\u2124", "\\mathbb{Z}"); + // We don't distinguish between math and nonmath kerns. // (In TeX, the mu unit works only with \mkern.) defineMacro("\\mkern", "\\kern"); diff --git a/src/symbols.js b/src/symbols.js index b867ffe3..a8313774 100644 --- a/src/symbols.js +++ b/src/symbols.js @@ -108,22 +108,22 @@ defineSymbol(math, main, textord, "\u0023", "\\#"); defineSymbol(text, main, textord, "\u0023", "\\#"); defineSymbol(math, main, textord, "\u0026", "\\&"); defineSymbol(text, main, textord, "\u0026", "\\&"); -defineSymbol(math, main, textord, "\u2135", "\\aleph"); -defineSymbol(math, main, textord, "\u2200", "\\forall"); +defineSymbol(math, main, textord, "\u2135", "\\aleph", true); +defineSymbol(math, main, textord, "\u2200", "\\forall", true); defineSymbol(math, main, textord, "\u210f", "\\hbar"); -defineSymbol(math, main, textord, "\u2203", "\\exists"); -defineSymbol(math, main, textord, "\u2207", "\\nabla"); -defineSymbol(math, main, textord, "\u266d", "\\flat"); -defineSymbol(math, main, textord, "\u2113", "\\ell"); -defineSymbol(math, main, textord, "\u266e", "\\natural"); -defineSymbol(math, main, textord, "\u2663", "\\clubsuit"); -defineSymbol(math, main, textord, "\u2118", "\\wp"); -defineSymbol(math, main, textord, "\u266f", "\\sharp"); -defineSymbol(math, main, textord, "\u2662", "\\diamondsuit"); -defineSymbol(math, main, textord, "\u211c", "\\Re"); -defineSymbol(math, main, textord, "\u2661", "\\heartsuit"); -defineSymbol(math, main, textord, "\u2111", "\\Im"); -defineSymbol(math, main, textord, "\u2660", "\\spadesuit"); +defineSymbol(math, main, textord, "\u2203", "\\exists", true); +defineSymbol(math, main, textord, "\u2207", "\\nabla", true); +defineSymbol(math, main, textord, "\u266d", "\\flat", true); +defineSymbol(math, main, textord, "\u2113", "\\ell", true); +defineSymbol(math, main, textord, "\u266e", "\\natural", true); +defineSymbol(math, main, textord, "\u2663", "\\clubsuit", true); +defineSymbol(math, main, textord, "\u2118", "\\wp", true); +defineSymbol(math, main, textord, "\u266f", "\\sharp", true); +defineSymbol(math, main, textord, "\u2662", "\\diamondsuit", true); +defineSymbol(math, main, textord, "\u211c", "\\Re", true); +defineSymbol(math, main, textord, "\u2661", "\\heartsuit", true); +defineSymbol(math, main, textord, "\u2111", "\\Im", true); +defineSymbol(math, main, textord, "\u2660", "\\spadesuit", true); // Math and Text defineSymbol(math, main, textord, "\u2020", "\\dag"); @@ -251,11 +251,11 @@ defineSymbol(math, ams, textord, "\u25ca", "\\lozenge"); defineSymbol(math, ams, textord, "\u24c8", "\\circledS"); defineSymbol(math, ams, textord, "\u00ae", "\\circledR"); defineSymbol(text, ams, textord, "\u00ae", "\\circledR"); -defineSymbol(math, ams, textord, "\u2221", "\\measuredangle"); +defineSymbol(math, ams, textord, "\u2221", "\\measuredangle", true); defineSymbol(math, ams, textord, "\u2204", "\\nexists"); defineSymbol(math, ams, textord, "\u2127", "\\mho"); -defineSymbol(math, ams, textord, "\u2132", "\\Finv"); -defineSymbol(math, ams, textord, "\u2141", "\\Game"); +defineSymbol(math, ams, textord, "\u2132", "\\Finv", true); +defineSymbol(math, ams, textord, "\u2141", "\\Game", true); defineSymbol(math, ams, textord, "\u006b", "\\Bbbk"); defineSymbol(math, ams, textord, "\u2035", "\\backprime"); defineSymbol(math, ams, textord, "\u25b2", "\\blacktriangle"); @@ -263,22 +263,24 @@ defineSymbol(math, ams, textord, "\u25bc", "\\blacktriangledown"); defineSymbol(math, ams, textord, "\u25a0", "\\blacksquare"); defineSymbol(math, ams, textord, "\u29eb", "\\blacklozenge"); defineSymbol(math, ams, textord, "\u2605", "\\bigstar"); -defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle"); -defineSymbol(math, ams, textord, "\u2201", "\\complement"); -defineSymbol(math, ams, textord, "\u00f0", "\\eth"); +defineSymbol(math, ams, textord, "\u2222", "\\sphericalangle", true); +defineSymbol(math, ams, textord, "\u2201", "\\complement", true); +// unicode-math maps U+F0 to \matheth. We map to AMS function \eth +defineSymbol(math, ams, textord, "\u00f0", "\\eth", true); defineSymbol(math, ams, textord, "\u2571", "\\diagup"); defineSymbol(math, ams, textord, "\u2572", "\\diagdown"); defineSymbol(math, ams, textord, "\u25a1", "\\square"); defineSymbol(math, ams, textord, "\u25a1", "\\Box"); defineSymbol(math, ams, textord, "\u25ca", "\\Diamond"); -defineSymbol(math, ams, textord, "\u00a5", "\\yen"); -defineSymbol(math, ams, textord, "\u2713", "\\checkmark"); +// unicode-math maps U+A5 to \mathyen. We map to AMS function \yen +defineSymbol(math, ams, textord, "\u00a5", "\\yen", true); +defineSymbol(math, ams, textord, "\u2713", "\\checkmark", true); defineSymbol(text, ams, textord, "\u2713", "\\checkmark"); // AMS Hebrew -defineSymbol(math, ams, textord, "\u2136", "\\beth"); -defineSymbol(math, ams, textord, "\u2138", "\\daleth"); -defineSymbol(math, ams, textord, "\u2137", "\\gimel"); +defineSymbol(math, ams, textord, "\u2136", "\\beth", true); +defineSymbol(math, ams, textord, "\u2138", "\\daleth", true); +defineSymbol(math, ams, textord, "\u2137", "\\gimel", true); // AMS Greek defineSymbol(math, ams, textord, "\u03dd", "\\digamma"); @@ -436,8 +438,8 @@ defineSymbol(text, main, textord, "%", "\\%"); defineSymbol(math, main, textord, "_", "\\_"); defineSymbol(text, main, textord, "_", "\\_"); defineSymbol(text, main, textord, "_", "\\textunderscore"); -defineSymbol(math, main, textord, "\u2220", "\\angle"); -defineSymbol(math, main, textord, "\u221e", "\\infty"); +defineSymbol(math, main, textord, "\u2220", "\\angle", true); +defineSymbol(math, main, textord, "\u221e", "\\infty", true); defineSymbol(math, main, textord, "\u2032", "\\prime"); defineSymbol(math, main, textord, "\u25b3", "\\triangle"); defineSymbol(math, main, textord, "\u0393", "\\Gamma", true); @@ -563,7 +565,7 @@ defineSymbol(math, ams, bin, "\u22bb", "\\veebar", true); defineSymbol(math, main, bin, "\u2299", "\\odot", true); defineSymbol(math, main, bin, "\u2295", "\\oplus", true); defineSymbol(math, main, bin, "\u2297", "\\otimes", true); -defineSymbol(math, main, textord, "\u2202", "\\partial"); +defineSymbol(math, main, textord, "\u2202", "\\partial", true); defineSymbol(math, main, bin, "\u2298", "\\oslash", true); defineSymbol(math, ams, bin, "\u229a", "\\circledcirc", true); defineSymbol(math, ams, bin, "\u22a1", "\\boxdot", true); @@ -669,7 +671,7 @@ defineSymbol(text, main, textord, "\u00b0", "\\degree"); // TODO: In LaTeX, \pounds can generate a different character in text and math // mode, but among our fonts, only Main-Italic defines this character "163". defineSymbol(math, main, mathord, "\u00a3", "\\pounds"); -defineSymbol(math, main, mathord, "\u00a3", "\\mathsterling"); +defineSymbol(math, main, mathord, "\u00a3", "\\mathsterling", true); defineSymbol(text, main, mathord, "\u00a3", "\\pounds"); defineSymbol(text, main, mathord, "\u00a3", "\\textsterling"); defineSymbol(math, ams, textord, "\u2720", "\\maltese"); diff --git a/test/katex-spec.js b/test/katex-spec.js index 52b26229..d30798b9 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -2678,6 +2678,10 @@ describe("Unicode", function() { expect("⊂⊃⊆⊇⊏⊐⊑⊒⊢⊣⊩⊪⊸⋈⋍⋐⋑⋔⋙⋛⋞⋟⌢⌣⩾⪆⪌⪕⪖⪯⪰⪷⪸⫅⫆").toParse(); }); + it("should parse symbols", function() { + expect("£¥ðℂℍℑℓℕ℘ℙℚℜℝℤℲℵℶℷℸ⅁∀∁∂∃∇∞∠∡∢♠♡♢♣♭♮♯✓").toParse(); + }); + it("should parse arrows", function() { expect("←↑→↓↔↕↖↗↘↙↚↛↞↠↢↣↦↩↪↫↬↭↮↰↱↶↷↼↽↾↾↿⇀⇁⇂⇃⇄⇆⇇⇈⇉").toParse(); });