From 21f7fe85d515b3086ca6305c6196313bd46d1638 Mon Sep 17 00:00:00 2001 From: Ron Kok Date: Thu, 28 Mar 2019 09:37:54 -0700 Subject: [PATCH] Improve MathML for characters in Unicode private use area (#1908) * Add macros for private area characters * Add \nsupseteqq and \nsubseteqq --- src/macros.js | 17 +++++++++++++++++ src/symbols.js | 29 +++++++++++++++-------------- test/katex-spec.js | 6 ++++++ 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/macros.js b/src/macros.js index 1d993d64..06541df7 100644 --- a/src/macros.js +++ b/src/macros.js @@ -812,6 +812,23 @@ defineMacro("\\notni", "\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220C}}"); defineMacro("\\limsup", "\\DOTSB\\mathop{\\operatorname{lim\\,sup}}\\limits"); defineMacro("\\liminf", "\\DOTSB\\mathop{\\operatorname{lim\\,inf}}\\limits"); +////////////////////////////////////////////////////////////////////// +// MathML alternates for KaTeX glyphs in the Unicode private area +defineMacro("\\gvertneqq", "\\html@mathml{\\@gvertneqq}{\u2269}"); +defineMacro("\\lvertneqq", "\\html@mathml{\\@lvertneqq}{\u2268}"); +defineMacro("\\ngeqq", "\\html@mathml{\\@ngeqq}{\u2271}"); +defineMacro("\\ngeqslant", "\\html@mathml{\\@ngeqslant}{\u2271}"); +defineMacro("\\nleqq", "\\html@mathml{\\@nleqq}{\u2270}"); +defineMacro("\\nleqslant", "\\html@mathml{\\@nleqslant}{\u2270}"); +defineMacro("\\nshortmid", "\\html@mathml{\\@nshortmid}{∤}"); +defineMacro("\\nshortparallel", "\\html@mathml{\\@nshortparallel}{∦}"); +defineMacro("\\nsubseteqq", "\\html@mathml{\\@nsubseteqq}{\u2288}"); +defineMacro("\\nsupseteqq", "\\html@mathml{\\@nsupseteqq}{\u2289}"); +defineMacro("\\varsubsetneq", "\\html@mathml{\\@varsubsetneq}{⊊}"); +defineMacro("\\varsubsetneqq", "\\html@mathml{\\@varsubsetneqq}{⫋}"); +defineMacro("\\varsupsetneq", "\\html@mathml{\\@varsupsetneq}{⊋}"); +defineMacro("\\varsupsetneqq", "\\html@mathml{\\@varsupsetneqq}{⫌}"); + ////////////////////////////////////////////////////////////////////// // semantic diff --git a/src/symbols.js b/src/symbols.js index 2f51eade..f28ab4e4 100644 --- a/src/symbols.js +++ b/src/symbols.js @@ -202,11 +202,12 @@ defineSymbol(math, main, rel, "\u21cc", "\\rightleftharpoons", true); // AMS Negated Binary Relations defineSymbol(math, ams, rel, "\u226e", "\\nless", true); -defineSymbol(math, ams, rel, "\ue010", "\\nleqslant"); -defineSymbol(math, ams, rel, "\ue011", "\\nleqq"); +// Symbol names preceeded by "@" each have a corresponding macro. +defineSymbol(math, ams, rel, "\ue010", "\\@nleqslant"); +defineSymbol(math, ams, rel, "\ue011", "\\@nleqq"); defineSymbol(math, ams, rel, "\u2a87", "\\lneq", true); defineSymbol(math, ams, rel, "\u2268", "\\lneqq", true); -defineSymbol(math, ams, rel, "\ue00c", "\\lvertneqq"); +defineSymbol(math, ams, rel, "\ue00c", "\\@lvertneqq"); defineSymbol(math, ams, rel, "\u22e6", "\\lnsim", true); defineSymbol(math, ams, rel, "\u2a89", "\\lnapprox", true); defineSymbol(math, ams, rel, "\u2280", "\\nprec", true); @@ -215,22 +216,22 @@ defineSymbol(math, ams, rel, "\u22e0", "\\npreceq", true); defineSymbol(math, ams, rel, "\u22e8", "\\precnsim", true); defineSymbol(math, ams, rel, "\u2ab9", "\\precnapprox", true); defineSymbol(math, ams, rel, "\u2241", "\\nsim", true); -defineSymbol(math, ams, rel, "\ue006", "\\nshortmid"); +defineSymbol(math, ams, rel, "\ue006", "\\@nshortmid"); defineSymbol(math, ams, rel, "\u2224", "\\nmid", true); defineSymbol(math, ams, rel, "\u22ac", "\\nvdash", true); defineSymbol(math, ams, rel, "\u22ad", "\\nvDash", true); defineSymbol(math, ams, rel, "\u22ea", "\\ntriangleleft"); defineSymbol(math, ams, rel, "\u22ec", "\\ntrianglelefteq", true); defineSymbol(math, ams, rel, "\u228a", "\\subsetneq", true); -defineSymbol(math, ams, rel, "\ue01a", "\\varsubsetneq"); +defineSymbol(math, ams, rel, "\ue01a", "\\@varsubsetneq"); defineSymbol(math, ams, rel, "\u2acb", "\\subsetneqq", true); -defineSymbol(math, ams, rel, "\ue017", "\\varsubsetneqq"); +defineSymbol(math, ams, rel, "\ue017", "\\@varsubsetneqq"); defineSymbol(math, ams, rel, "\u226f", "\\ngtr", true); -defineSymbol(math, ams, rel, "\ue00f", "\\ngeqslant"); -defineSymbol(math, ams, rel, "\ue00e", "\\ngeqq"); +defineSymbol(math, ams, rel, "\ue00f", "\\@ngeqslant"); +defineSymbol(math, ams, rel, "\ue00e", "\\@ngeqq"); defineSymbol(math, ams, rel, "\u2a88", "\\gneq", true); defineSymbol(math, ams, rel, "\u2269", "\\gneqq", true); -defineSymbol(math, ams, rel, "\ue00d", "\\gvertneqq"); +defineSymbol(math, ams, rel, "\ue00d", "\\@gvertneqq"); defineSymbol(math, ams, rel, "\u22e7", "\\gnsim", true); defineSymbol(math, ams, rel, "\u2a8a", "\\gnapprox", true); defineSymbol(math, ams, rel, "\u2281", "\\nsucc", true); @@ -240,20 +241,20 @@ defineSymbol(math, ams, rel, "\u22e9", "\\succnsim", true); defineSymbol(math, ams, rel, "\u2aba", "\\succnapprox", true); // unicode-math maps \u2246 to \simneqq. We'll use the AMS synonym. defineSymbol(math, ams, rel, "\u2246", "\\ncong", true); -defineSymbol(math, ams, rel, "\ue007", "\\nshortparallel"); +defineSymbol(math, ams, rel, "\ue007", "\\@nshortparallel"); defineSymbol(math, ams, rel, "\u2226", "\\nparallel", true); defineSymbol(math, ams, rel, "\u22af", "\\nVDash", true); defineSymbol(math, ams, rel, "\u22eb", "\\ntriangleright"); defineSymbol(math, ams, rel, "\u22ed", "\\ntrianglerighteq", true); -defineSymbol(math, ams, rel, "\ue018", "\\nsupseteqq"); +defineSymbol(math, ams, rel, "\ue018", "\\@nsupseteqq"); defineSymbol(math, ams, rel, "\u228b", "\\supsetneq", true); -defineSymbol(math, ams, rel, "\ue01b", "\\varsupsetneq"); +defineSymbol(math, ams, rel, "\ue01b", "\\@varsupsetneq"); defineSymbol(math, ams, rel, "\u2acc", "\\supsetneqq", true); -defineSymbol(math, ams, rel, "\ue019", "\\varsupsetneqq"); +defineSymbol(math, ams, rel, "\ue019", "\\@varsupsetneqq"); defineSymbol(math, ams, rel, "\u22ae", "\\nVdash", true); defineSymbol(math, ams, rel, "\u2ab5", "\\precneqq", true); defineSymbol(math, ams, rel, "\u2ab6", "\\succneqq", true); -defineSymbol(math, ams, rel, "\ue016", "\\nsubseteqq"); +defineSymbol(math, ams, rel, "\ue016", "\\@nsubseteqq"); defineSymbol(math, ams, bin, "\u22b4", "\\unlhd"); defineSymbol(math, ams, bin, "\u22b5", "\\unrhd"); diff --git a/test/katex-spec.js b/test/katex-spec.js index b254fcc3..800cd6b5 100644 --- a/test/katex-spec.js +++ b/test/katex-spec.js @@ -2998,6 +2998,12 @@ describe("A macro expander", function() { expect('\\char"g').not.toParse(); }); + it("should build Unicode private area characters", function() { + expect`\gvertneqq\lvertneqq\ngeqq\ngeqslant\nleqq`.toBuild(); + expect`\nleqslant\nshortmid\nshortparallel\varsubsetneq`.toBuild(); + expect`\varsubsetneqq\varsupsetneq\varsupsetneqq`.toBuild(); + }); + // TODO(edemaine): This doesn't work yet. Parses like `\text text`, // which doesn't treat all four letters as an argument. //it("\\TextOrMath should work in a macro passed to \\text", function() {