From a2bab659391e1a4de47031b06faeec7c40f17e4c Mon Sep 17 00:00:00 2001 From: chitwitgit <100676229+chitwitgit@users.noreply.github.com> Date: Sun, 14 Jun 2026 21:12:44 +0800 Subject: [PATCH] Merge KaTeX symbol tables into a single lookup map. Flatten symbol, alias, and override entries into one generated katexData.ts object literal for a smaller minified bundle (~1.7% gzip savings vs three-table lookup). Add a benchmark script to compare serialization formats. --- lib/scripts/benchmark-bundle-formats.ts | 289 ++++++++++++++++++++++ lib/scripts/generate-katex-data.ts | 36 ++- lib/src/index.ts | 10 +- lib/src/{katexSymbols.ts => katexData.ts} | 146 +++++++++++ lib/src/katexMeta.ts | 156 ------------ 5 files changed, 462 insertions(+), 175 deletions(-) create mode 100644 lib/scripts/benchmark-bundle-formats.ts rename lib/src/{katexSymbols.ts => katexData.ts} (83%) delete mode 100644 lib/src/katexMeta.ts diff --git a/lib/scripts/benchmark-bundle-formats.ts b/lib/scripts/benchmark-bundle-formats.ts new file mode 100644 index 0000000..eb900a0 --- /dev/null +++ b/lib/scripts/benchmark-bundle-formats.ts @@ -0,0 +1,289 @@ +/** + * Benchmark KaTeX symbol table serialization formats. + * Run from lib/: pnpm exec node --experimental-strip-types scripts/benchmark-bundle-formats.ts + */ +import { execSync } from "node:child_process"; +import { readFileSync, rmSync, writeFileSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; +import { gzipSync } from "node:zlib"; +import { + KATEX_ACCENTS, + KATEX_ALIASES, + KATEX_FUNCTIONS, + KATEX_SYMBOL_OVERRIDES, +} from "../src/katexMeta.ts"; +import { KATEX_SYMBOLS as BASE_SYMBOLS } from "../src/katexSymbols.ts"; + +const ROOT = join(dirname(fileURLToPath(import.meta.url)), ".."); +const SRC = join(ROOT, "src"); +const INDEX = join(SRC, "index.ts"); + +type Format = { + name: string; + note: string; + write: () => void; + patchIndex: (src: string) => string; +}; + +const mergedLookup: Record = { + ...KATEX_ALIASES, + ...BASE_SYMBOLS, + ...KATEX_SYMBOL_OVERRIDES, +}; + +const sortedEntries = Object.entries(mergedLookup).sort(([a], [b]) => + a.localeCompare(b), +); +const accentsJson = JSON.stringify(KATEX_ACCENTS); +const functionsJson = JSON.stringify([...KATEX_FUNCTIONS].sort()); + +const metaTail = [ + `export const KATEX_ACCENTS = ${accentsJson} as Record;`, + `export const KATEX_FUNCTIONS = new Set(${functionsJson});`, + "", +].join("\n"); + +const objectLiteralBody = sortedEntries + .map(([k, v]) => ` ${JSON.stringify(k)}: ${JSON.stringify(v)},`) + .join("\n"); + +const tupleBody = sortedEntries + .map(([k, v]) => ` [${JSON.stringify(k)}, ${JSON.stringify(v)}],`) + .join("\n"); + +const parallelKeys = sortedEntries.map(([k]) => JSON.stringify(k)).join(","); +const parallelValues = JSON.stringify(sortedEntries.map(([, v]) => v)); +const gzipB64 = gzipSync( + Buffer.from(JSON.stringify(mergedLookup), "utf8"), +).toString("base64"); + +const baselineIndex = readFileSync(INDEX, "utf8"); + +const cleanupGenerated = () => { + for (const f of ["katexData.ts"]) { + try { + rmSync(join(SRC, f)); + } catch { + /* absent */ + } + } +}; + +const mergedPatchIndex = (src: string): string => + src + .replace( + `import { KATEX_ACCENTS, KATEX_ALIASES, KATEX_FUNCTIONS, KATEX_SYMBOL_OVERRIDES } from "./katexMeta";\nimport { KATEX_SYMBOLS } from "./katexSymbols";`, + `import { KATEX_ACCENTS, KATEX_FUNCTIONS, KATEX_SYMBOLS } from "./katexData";`, + ) + .replace( + `const resolveLatexSymbol = (name: string): string | undefined =>\n KATEX_SYMBOL_OVERRIDES[name] ?? KATEX_SYMBOLS[name] ?? KATEX_ALIASES[name];`, + `const resolveLatexSymbol = (name: string): string | undefined => KATEX_SYMBOLS[name];`, + ); + +const formats: Format[] = [ + { + name: "1-baseline-multi", + note: "PR #7: katexSymbols + katexMeta, 3-table lookup chain", + write: () => cleanupGenerated(), + patchIndex: (src) => src, + }, + { + name: "2-merged-literal", + note: "Single katexData.ts object literal + direct lookup", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: merged object literal */`, + `export const KATEX_SYMBOLS: Record = {`, + objectLiteralBody, + `};`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "3-json-parse", + note: "Single JSON.parse blob", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: JSON.parse blob */`, + `export const KATEX_SYMBOLS = JSON.parse(${JSON.stringify(JSON.stringify(mergedLookup))}) as Record;`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "4-tuple-fromEntries", + note: "Tuple array + Object.fromEntries at module init", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: tuple entries + Object.fromEntries */`, + `const ENTRIES: [string, string][] = [`, + tupleBody, + `];`, + `export const KATEX_SYMBOLS = Object.fromEntries(ENTRIES) as Record;`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "5-parallel-arrays", + note: "Parallel keys/values arrays + Object.fromEntries", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: parallel arrays */`, + `const KEYS = [${parallelKeys}] as const;`, + `const VALS = ${parallelValues} as const;`, + `export const KATEX_SYMBOLS = Object.fromEntries(KEYS.map((k, i) => [k, VALS[i]])) as Record;`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "6-gzip-base64-node", + note: "gzip+base64 blob, gunzipSync at module init (Node zlib)", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: gzip base64 (Node) */`, + `import { gunzipSync } from "node:zlib";`, + `const B64 = ${JSON.stringify(gzipB64)};`, + `export const KATEX_SYMBOLS = JSON.parse(`, + ` gunzipSync(Buffer.from(B64, "base64")).toString("utf8"),`, + `) as Record;`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "7-literal-oneline", + note: "Merged object literal on one line via JSON.stringify", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: one-line object literal */`, + `export const KATEX_SYMBOLS: Record = ${JSON.stringify(mergedLookup)};`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: mergedPatchIndex, + }, + { + name: "8-map-constructor", + note: "new Map(entries) then lookup via .get", + write: () => { + cleanupGenerated(); + writeFileSync( + join(SRC, "katexData.ts"), + [ + `/** benchmark: Map constructor */`, + `const ENTRIES: [string, string][] = [`, + tupleBody, + `];`, + `export const KATEX_SYMBOL_MAP = new Map(ENTRIES);`, + metaTail, + ].join("\n"), + ); + }, + patchIndex: (src) => + mergedPatchIndex(src) + .replace( + `import { KATEX_ACCENTS, KATEX_FUNCTIONS, KATEX_SYMBOLS } from "./katexData";`, + `import { KATEX_ACCENTS, KATEX_FUNCTIONS, KATEX_SYMBOL_MAP } from "./katexData";`, + ) + .replace(`KATEX_SYMBOLS[name]`, `KATEX_SYMBOL_MAP.get(name)`), + }, +]; + +const measure = () => { + const cjs = readFileSync(join(ROOT, "dist/index.js")); + const esm = readFileSync(join(ROOT, "dist/index.mjs")); + const gzCjs = execSync("gzip -c dist/index.js", { + cwd: ROOT, + encoding: "buffer", + }); + const dataSrc = ["katexData.ts", "katexSymbols.ts", "katexMeta.ts"] + .map((f) => join(SRC, f)) + .filter((f) => { + try { + readFileSync(f); + return true; + } catch { + return false; + } + }) + .reduce((sum, f) => sum + readFileSync(f).length, 0); + + return { cjs: cjs.length, esm: esm.length, gzCjs: gzCjs.length, dataSrc }; +}; + +console.log("KaTeX symbol format benchmark\n"); +console.log(`Merged lookup entries: ${sortedEntries.length}`); +console.log(`Raw JSON size: ${JSON.stringify(mergedLookup).length} B`); +console.log( + `gzip(JSON) alone: ${gzipSync(Buffer.from(JSON.stringify(mergedLookup))).length} B`, +); +console.log(`gzip+base64 payload: ${gzipB64.length} chars\n`); + +const results: Array< + { name: string; note: string } & ReturnType +> = []; + +for (const format of formats) { + format.write(); + writeFileSync(INDEX, format.patchIndex(baselineIndex)); + execSync("pnpm build", { cwd: ROOT, stdio: "pipe" }); + const stats = measure(); + results.push({ name: format.name, note: format.note, ...stats }); + console.log( + `✓ ${format.name}: gzip ${stats.gzCjs} B, CJS ${stats.cjs} B, data src ${stats.dataSrc} B`, + ); +} + +writeFileSync(INDEX, baselineIndex); +cleanupGenerated(); + +console.log("\n| Format | gzip CJS | CJS | ESM | data src | vs baseline |"); +console.log("|--------|----------|-----|-----|----------|-------------|"); +const baseGz = results[0].gzCjs; +for (const r of results) { + const delta = r.gzCjs - baseGz; + const pct = ((delta / baseGz) * 100).toFixed(1); + const deltaStr = + delta === 0 ? "—" : `${delta >= 0 ? "+" : ""}${delta} B (${pct}%)`; + console.log( + `| ${r.name} | ${r.gzCjs} | ${r.cjs} | ${r.esm} | ${r.dataSrc} | ${deltaStr} |`, + ); +} + +console.log("\nNotes:"); +for (const r of results) { + console.log(`- ${r.name}: ${r.note}`); +} diff --git a/lib/scripts/generate-katex-data.ts b/lib/scripts/generate-katex-data.ts index 196b469..840601d 100644 --- a/lib/scripts/generate-katex-data.ts +++ b/lib/scripts/generate-katex-data.ts @@ -178,27 +178,41 @@ const generate = async (): Promise => { if (overrideMap.neq) overrideMap.ne = overrideMap.neq; if (symbolMap["@cdots"]) overrideMap.cdots = symbolMap["@cdots"]; - const symbolLines = Object.entries(symbolMap) + const lookupMap: Record = { + ...aliasMap, + ...symbolMap, + ...overrideMap, + }; + + const lookupLines = Object.entries(lookupMap) .sort(([a], [b]) => a.localeCompare(b)) .map(([k, v]) => ` ${JSON.stringify(k)}: ${JSON.stringify(v)},`) .join("\n"); const sourceNote = `KaTeX v${KATEX_VERSION} — regenerate via \`${REGENERATE_CMD}\` (fetches from ${KATEX_BASE}).`; + const functions = [...fnSet].sort(); writeFileSync( - join(ROOT, "src/katexSymbols.ts"), - `/** ${sourceNote} */\nexport const KATEX_SYMBOLS: Record = {\n${symbolLines}\n};\n`, - ); - - writeFileSync( - join(ROOT, "src/katexMeta.ts"), - `/** ${sourceNote} */\nexport const KATEX_ALIASES: Record = ${JSON.stringify(aliasMap, null, 2)};\n\nexport const KATEX_ACCENTS: Record = ${JSON.stringify(accentMap, null, 2)};\n\nexport const KATEX_FUNCTIONS = new Set(${JSON.stringify([...fnSet].sort())});\n\n/** KaTeX macro-only symbols mapped to Unicode for Word OMML text runs. */\nexport const KATEX_SYMBOL_OVERRIDES: Record = ${JSON.stringify(overrideMap, null, 2)};\n`, + join(ROOT, "src/katexData.ts"), + [ + `/** ${sourceNote} */`, + `export const KATEX_SYMBOLS: Record = {`, + lookupLines, + `};`, + ``, + `export const KATEX_ACCENTS = ${JSON.stringify(accentMap)} as Record;`, + ``, + `export const KATEX_FUNCTIONS = new Set(${JSON.stringify(functions)});`, + ``, + ].join("\n"), ); - console.log(`KATEX_SYMBOLS: ${Object.keys(symbolMap).length}`); - console.log(`KATEX_ALIASES: ${Object.keys(aliasMap).length}`); + console.log(`KATEX_SYMBOLS: ${Object.keys(lookupMap).length} (merged)`); + console.log(` base symbols: ${Object.keys(symbolMap).length}`); + console.log(` aliases: ${Object.keys(aliasMap).length}`); + console.log(` overrides: ${Object.keys(overrideMap).length}`); + console.log(`KATEX_ACCENTS: ${Object.keys(accentMap).length}`); console.log(`KATEX_FUNCTIONS: ${fnSet.size}`); - console.log(`KATEX_SYMBOL_OVERRIDES: ${Object.keys(overrideMap).length}`); }; generate().catch((error) => { diff --git a/lib/src/index.ts b/lib/src/index.ts index 8471730..73b1b70 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -4,13 +4,7 @@ import type * as latex from "@unified-latex/unified-latex-types"; // skipcq: JS-C1003 import type * as DOCX from "docx"; import { parseMath } from "latex-math"; -import { - KATEX_ACCENTS, - KATEX_ALIASES, - KATEX_FUNCTIONS, - KATEX_SYMBOL_OVERRIDES, -} from "./katexMeta"; -import { KATEX_SYMBOLS } from "./katexSymbols"; +import { KATEX_ACCENTS, KATEX_FUNCTIONS, KATEX_SYMBOLS } from "./katexData"; /** * Checks if the argument has curly brackets. @@ -35,7 +29,7 @@ const logSkippedEmptyMath = (latex: string, scope: "inline" | "block") => { /** Resolve a LaTeX command name to its Unicode symbol. */ const resolveLatexSymbol = (name: string): string | undefined => - KATEX_SYMBOL_OVERRIDES[name] ?? KATEX_SYMBOLS[name] ?? KATEX_ALIASES[name]; + KATEX_SYMBOLS[name]; type NAryOptions = { accent: string; diff --git a/lib/src/katexSymbols.ts b/lib/src/katexData.ts similarity index 83% rename from lib/src/katexSymbols.ts rename to lib/src/katexData.ts index aac7747..16fc96e 100644 --- a/lib/src/katexSymbols.ts +++ b/lib/src/katexData.ts @@ -52,6 +52,8 @@ export const KATEX_SYMBOLS: Record = { acute: "ˊ", ae: "æ", AE: "Æ", + alef: "ℵ", + alefsym: "ℵ", aleph: "ℵ", alpha: "α", amalg: "⨿", @@ -72,6 +74,7 @@ export const KATEX_SYMBOLS: Record = { beta: "β", beth: "ℶ", between: "≬", + bgroup: "{", bigcap: "⋂", bigcirc: "◯", bigcup: "⋃", @@ -99,6 +102,7 @@ export const KATEX_SYMBOLS: Record = { boxplus: "⊞", boxtimes: "⊠", breve: "˘", + bull: "∙", bullet: "∙", bumpeq: "≏", Bumpeq: "≎", @@ -107,6 +111,7 @@ export const KATEX_SYMBOLS: Record = { Cap: "⋒", cdot: "⋅", cdotp: "⋅", + cdots: "⋯", centerdot: "⋅", check: "ˇ", checkmark: "✓", @@ -120,10 +125,14 @@ export const KATEX_SYMBOLS: Record = { circleddash: "⊝", circledR: "®", circledS: "Ⓢ", + clubs: "♣", clubsuit: "♣", + coloneqq: "≔", + Coloneqq: "⩴", complement: "∁", cong: "≅", coprod: "∐", + copyright: "©", cup: "∪", Cup: "⋓", curlyeqprec: "⋞", @@ -134,10 +143,15 @@ export const KATEX_SYMBOLS: Record = { curvearrowright: "↷", dag: "†", dagger: "†", + Dagger: "‡", daleth: "ℸ", + darr: "↓", + dArr: "⇓", + Darr: "⇓", dashleftarrow: "⇠", dashrightarrow: "⇢", dashv: "⊣", + dblcolon: "∷", ddag: "‡", ddagger: "‡", ddot: "¨", @@ -149,6 +163,7 @@ export const KATEX_SYMBOLS: Record = { diagup: "╱", diamond: "⋄", Diamond: "◊", + diamonds: "♢", diamondsuit: "♢", digamma: "ϝ", div: "÷", @@ -166,16 +181,21 @@ export const KATEX_SYMBOLS: Record = { downdownarrows: "⇊", downharpoonleft: "⇃", downharpoonright: "⇂", + egroup: "}", ell: "ℓ", + empty: "∅", emptyset: "∅", epsilon: "ϵ", eqcirc: "≖", + eqcolon: "∹", + eqqcolon: "≕", eqsim: "≂", eqslantgtr: "⪖", eqslantless: "⪕", equiv: "≡", eta: "η", eth: "ð", + exist: "∃", exists: "∃", fallingdotseq: "≒", Finv: "Ⅎ", @@ -207,8 +227,12 @@ export const KATEX_SYMBOLS: Record = { gtrless: "≷", gtrsim: "≳", H: "˝", + harr: "↔", + hArr: "⇔", + Harr: "⇔", hat: "^", hbar: "ℏ", + hearts: "♡", heartsuit: "♡", hookleftarrow: "↩", hookrightarrow: "↪", @@ -217,21 +241,29 @@ export const KATEX_SYMBOLS: Record = { iiint: "∭", iint: "∬", Im: "ℑ", + image: "ℑ", imageof: "⊷", in: "∈", + infin: "∞", infty: "∞", int: "∫", intercal: "⊺", intop: "∫", iota: "ι", + isin: "∈", j: "ȷ", Join: "⋈", kappa: "κ", lambda: "λ", Lambda: "Λ", land: "∧", + lang: "⟨", langle: "⟨", + larr: "←", + lArr: "⇐", + Larr: "⇐", lbrace: "{", + lBrace: "⦃", lbrack: "[", lceil: "⌈", ldotp: ".", @@ -263,6 +295,8 @@ export const KATEX_SYMBOLS: Record = { lgroup: "⟮", lhd: "⊲", ll: "≪", + llbracket: "⟦", + llcorner: "⌞", Lleftarrow: "⇚", lll: "⋘", llless: "⋘", @@ -284,6 +318,11 @@ export const KATEX_SYMBOLS: Record = { lor: "∨", lozenge: "◊", lparen: "(", + lq: "`", + lrarr: "↔", + lrArr: "⇔", + Lrarr: "⇔", + lrcorner: "⌟", Lsh: "↰", lt: "<", ltimes: "⋉", @@ -295,6 +334,7 @@ export const KATEX_SYMBOLS: Record = { mathring: "˚", mathsterling: "£", measuredangle: "∡", + medspace: ":", mho: "℧", mid: "∣", models: "⊨", @@ -304,8 +344,11 @@ export const KATEX_SYMBOLS: Record = { nabla: "∇", natural: "♮", ncong: "≆", + ne: "≠", nearrow: "↗", neg: "¬", + negthinspace: "!", + neq: "≠", nexists: "∄", ngeq: "≱", ngtr: "≯", @@ -318,6 +361,8 @@ export const KATEX_SYMBOLS: Record = { nless: "≮", nmid: "∤", nobreakspace: " ", + notin: "∉", + notni: "∌", nparallel: "∦", nprec: "⊀", npreceq: "⋠", @@ -351,6 +396,7 @@ export const KATEX_SYMBOLS: Record = { omicron: "ο", ominus: "⊖", oplus: "⊕", + ordinarycolon: ":", origof: "⊶", oslash: "⊘", otimes: "⊗", @@ -364,6 +410,7 @@ export const KATEX_SYMBOLS: Record = { pi: "π", Pi: "Π", pitchfork: "⋔", + plusmn: "±", pm: "±", pounds: "£", prec: "≺", @@ -379,12 +426,20 @@ export const KATEX_SYMBOLS: Record = { propto: "∝", psi: "ψ", Psi: "Ψ", + qquad: "  ", + quad: " ", r: "˚", + rang: "⟩", rangle: "⟩", + rarr: "→", + rArr: "⇒", + Rarr: "⇒", rbrace: "}", + rBrace: "⦄", rbrack: "]", rceil: "⌉", Re: "ℜ", + real: "ℜ", restriction: "↾", rfloor: "⌋", rgroup: "⟯", @@ -403,13 +458,17 @@ export const KATEX_SYMBOLS: Record = { risingdotseq: "≓", rmoustache: "⎱", rparen: ")", + rq: "'", + rrbracket: "⟧", Rrightarrow: "⇛", Rsh: "↱", rtimes: "⋊", rvert: "∣", rVert: "∥", S: "§", + sdot: "⋅", searrow: "↘", + sect: "§", setminus: "∖", sharp: "♯", shortmid: "∣", @@ -424,6 +483,7 @@ export const KATEX_SYMBOLS: Record = { smallsmile: "⌣", smile: "⌣", space: " ", + spades: "♠", spadesuit: "♠", sphericalangle: "∢", sqcap: "⊓", @@ -435,6 +495,8 @@ export const KATEX_SYMBOLS: Record = { square: "□", ss: "ß", star: "⋆", + sub: "⊂", + sube: "⊆", subset: "⊂", Subset: "⋐", subseteq: "⊆", @@ -450,6 +512,7 @@ export const KATEX_SYMBOLS: Record = { succnsim: "⋩", succsim: "≿", sum: "∑", + supe: "⊇", supset: "⊃", Supset: "⋑", supseteq: "⊇", @@ -480,13 +543,17 @@ export const KATEX_SYMBOLS: Record = { textquotedblright: "”", textquoteleft: "‘", textquoteright: "’", + textregistered: "®", textsterling: "£", textunderscore: "_", therefore: "∴", theta: "θ", Theta: "Θ", + thetasym: "ϑ", thickapprox: "≈", thicksim: "∼", + thickspace: ";", + thinspace: ",", tilde: "~", times: "×", to: "→", @@ -525,6 +592,10 @@ export const KATEX_SYMBOLS: Record = { u211A: "Q", u211D: "R", u2124: "Z", + uarr: "↑", + uArr: "⇑", + Uarr: "⇑", + ulcorner: "⌜", unlhd: "⊴", unrhd: "⊵", uparrow: "↑", @@ -537,6 +608,7 @@ export const KATEX_SYMBOLS: Record = { upsilon: "υ", Upsilon: "Υ", upuparrows: "⇈", + urcorner: "⌝", v: "ˇ", varepsilon: "ε", varkappa: "ϰ", @@ -554,6 +626,7 @@ export const KATEX_SYMBOLS: Record = { vdash: "⊢", vDash: "⊨", Vdash: "⊩", + vdots: "⋮", vec: "⃗", vee: "∨", veebar: "⊻", @@ -561,6 +634,7 @@ export const KATEX_SYMBOLS: Record = { Vert: "∥", Vvdash: "⊪", wedge: "∧", + weierp: "℘", wp: "℘", wr: "≀", xi: "ξ", @@ -568,3 +642,75 @@ export const KATEX_SYMBOLS: Record = { yen: "¥", zeta: "ζ", }; + +export const KATEX_ACCENTS = { + acute: "ˊ", + grave: "ˋ", + ddot: "¨", + tilde: "~", + bar: "ˉ", + breve: "˘", + check: "ˇ", + hat: "^", + vec: "⃗", + dot: "˙", + mathring: "˚", + "'": "ˊ", + "`": "ˋ", + "^": "ˆ", + "~": "˜", + "=": "ˉ", + u: "˘", + ".": "˙", + c: "¸", + r: "˚", + v: "ˇ", + H: "˝", + textcircled: "◯", +} as Record; + +export const KATEX_FUNCTIONS = new Set([ + "Pr", + "arccos", + "arcctg", + "arcsin", + "arctan", + "arctg", + "arg", + "ch", + "cos", + "cosec", + "cosh", + "cot", + "cotg", + "coth", + "csc", + "ctg", + "cth", + "deg", + "det", + "dim", + "exp", + "gcd", + "hom", + "inf", + "ker", + "lg", + "lim", + "liminf", + "limsup", + "ln", + "log", + "mathop", + "max", + "min", + "sec", + "sh", + "sin", + "sinh", + "sup", + "tan", + "tanh", + "tg", + "th", +]); diff --git a/lib/src/katexMeta.ts b/lib/src/katexMeta.ts deleted file mode 100644 index 614fae6..0000000 --- a/lib/src/katexMeta.ts +++ /dev/null @@ -1,156 +0,0 @@ -/** KaTeX v0.16.22 — regenerate via `pnpm generate:katex` (fetches from https://raw.githubusercontent.com/KaTeX/KaTeX/v0.16.22/src). */ -export const KATEX_ALIASES: Record = { - bgroup: "{", - egroup: "}", - lq: "`", - rq: "'", - thinspace: ",", - medspace: ":", - thickspace: ";", - negthinspace: "!", - ordinarycolon: ":", - notni: "∌", - darr: "↓", - dArr: "⇓", - Darr: "⇓", - lang: "⟨", - rang: "⟩", - uarr: "↑", - uArr: "⇑", - Uarr: "⇑", - alef: "ℵ", - alefsym: "ℵ", - bull: "∙", - clubs: "♣", - Dagger: "‡", - diamonds: "♢", - empty: "∅", - exist: "∃", - harr: "↔", - hArr: "⇔", - Harr: "⇔", - hearts: "♡", - image: "ℑ", - infin: "∞", - isin: "∈", - larr: "←", - lArr: "⇐", - Larr: "⇐", - lrarr: "↔", - lrArr: "⇔", - Lrarr: "⇔", - plusmn: "±", - rarr: "→", - rArr: "⇒", - Rarr: "⇒", - real: "ℜ", - sdot: "⋅", - sect: "§", - spades: "♠", - sub: "⊂", - sube: "⊆", - supe: "⊇", - thetasym: "ϑ", - weierp: "℘", -}; - -export const KATEX_ACCENTS: Record = { - acute: "ˊ", - grave: "ˋ", - ddot: "¨", - tilde: "~", - bar: "ˉ", - breve: "˘", - check: "ˇ", - hat: "^", - vec: "⃗", - dot: "˙", - mathring: "˚", - "'": "ˊ", - "`": "ˋ", - "^": "ˆ", - "~": "˜", - "=": "ˉ", - u: "˘", - ".": "˙", - c: "¸", - r: "˚", - v: "ˇ", - H: "˝", - textcircled: "◯", -}; - -export const KATEX_FUNCTIONS = new Set([ - "Pr", - "arccos", - "arcctg", - "arcsin", - "arctan", - "arctg", - "arg", - "ch", - "cos", - "cosec", - "cosh", - "cot", - "cotg", - "coth", - "csc", - "ctg", - "cth", - "deg", - "det", - "dim", - "exp", - "gcd", - "hom", - "inf", - "ker", - "lg", - "lim", - "liminf", - "limsup", - "ln", - "log", - "mathop", - "max", - "min", - "sec", - "sh", - "sin", - "sinh", - "sup", - "tan", - "tanh", - "tg", - "th", -]); - -/** KaTeX macro-only symbols mapped to Unicode for Word OMML text runs. */ -export const KATEX_SYMBOL_OVERRIDES: Record = { - quad: " ", - qquad: "  ", - cdotp: "⋅", - neq: "≠", - notin: "∉", - perp: "⊥", - notni: "∌", - ulcorner: "⌜", - urcorner: "⌝", - llcorner: "⌞", - lrcorner: "⌟", - copyright: "©", - textregistered: "®", - vdots: "⋮", - dblcolon: "∷", - eqcolon: "∹", - coloneqq: "≔", - eqqcolon: "≕", - Coloneqq: "⩴", - llbracket: "⟦", - rrbracket: "⟧", - lBrace: "⦃", - rBrace: "⦄", - ne: "≠", - cdots: "⋯", -};