""" Unicode to LaTeX symbol mappings for OMML/MathML to LaTeX conversion. This module provides comprehensive Unicode symbol to LaTeX command mappings for mathematical notation, chemical symbols, and special characters. Architecture ============ This module defines three primary dictionaries that work together to handle symbol conversion with MathJax compatibility: 1. UNICODE_TO_LATEX (dict[str, str]) - Maps Unicode symbols → LaTeX commands - Used for symbols that SHOULD be converted to LaTeX - Contains ~430 symbol mappings organized by category: * Greek letters (lowercase and uppercase) * Mathematical operators and relations * Arrows and directional symbols * Set theory and logic symbols * Calculus and analysis symbols (basic integrals) * Chemistry symbols and arrows * Geometric shapes and special characters 2. UNICODE_PASSTHROUGH (set[str]) - Unicode symbols that should NEVER be converted to LaTeX - These symbols are kept as-is for MathJax compatibility - Contains ~64 advanced mathematical symbols whose LaTeX commands are not supported or render poorly in MathJax - Examples: advanced integrals (∯, ∰), special operators (⊛, ⊚) - IMPORTANT: Symbols in this set are NOT in UNICODE_TO_LATEX 3. MATHJAX_UNSUPPORTED_TO_UNICODE (dict[str, str]) - Inverse of UNICODE_PASSTHROUGH: LaTeX command → Unicode - Used in post-processing to convert unsupported LaTeX back to Unicode - Should be exact inverse of symbols in UNICODE_PASSTHROUGH Conversion Flow =============== Input Unicode Symbol ↓ Is it in UNICODE_PASSTHROUGH? ├─ YES → Keep as Unicode (don't convert) └─ NO → Look up in UNICODE_TO_LATEX ↓ Convert to LaTeX command ↓ Post-process: If command in MATHJAX_UNSUPPORTED_TO_UNICODE ↓ Convert back to Unicode for MathJax rendering Design Principles ================= 1. **No Overlap**: Symbols should be in EITHER UNICODE_TO_LATEX OR UNICODE_PASSTHROUGH, never both. 2. **Consistency**: MATHJAX_UNSUPPORTED_TO_UNICODE values must exactly match UNICODE_PASSTHROUGH contents (they are inverses). 3. **Inverse Mapping**: For any symbol in UNICODE_PASSTHROUGH, if there exists a LaTeX command in MATHJAX_UNSUPPORTED_TO_UNICODE, the command names must be consistent. 4. **Special Patterns**: - Empty braces ({}) only for radical symbols (√, ∛, ∜) - Placeholders (__DDOT__, __DDDOT__) only for accent detection - Regional preferences handled separately (see REGIONAL_SYMBOL_PREFERENCES) Testing ======= Symbol dictionary integrity is validated by: - tests/test_symbol_dictionaries.py This test suite ensures: - No duplicate keys in any dictionary - No overlap between UNICODE_TO_LATEX and UNICODE_PASSTHROUGH - Consistency between MATHJAX_UNSUPPORTED and UNICODE_PASSTHROUGH - Valid mappings and inverse consistency """ # Centralized symbol mappings to eliminate duplication UNICODE_TO_LATEX = { # Greek letters (lowercase) "α": "\\alpha", "β": "\\beta", "γ": "\\gamma", "δ": "\\delta", "ε": "\\varepsilon", "ζ": "\\zeta", "η": "\\eta", "θ": "\\theta", "ι": "\\iota", "κ": "\\kappa", "λ": "\\lambda", "μ": "\\mu", "ν": "\\nu", "ξ": "\\xi", "ο": "\\omicron", "π": "\\pi", "ρ": "\\rho", "σ": "\\sigma", "τ": "\\tau", "υ": "\\upsilon", "φ": "\\varphi", "χ": "\\chi", "ψ": "\\psi", "ω": "\\omega", "ϵ": "\\epsilon", "ϑ": "\\vartheta", "ϕ": "\\phi", "ϱ": "\\varrho", "ϖ": "\\varpi", "ς": "\\varsigma", "ϰ": "\\varkappa", # Greek letters (uppercase) "Α": "A", "Β": "B", "Γ": "\\Gamma", "Δ": "\\Delta", "Ε": "E", "Ζ": "Z", "Η": "H", "Θ": "\\Theta", "Ι": "I", "Κ": "K", "Λ": "\\Lambda", "Μ": "M", "Ν": "N", "Ξ": "\\Xi", "Ο": "O", "Π": "\\Pi", "Ρ": "P", "Σ": "\\Sigma", "Τ": "T", "Υ": "\\Upsilon", "Φ": "\\Phi", "Χ": "X", "Ψ": "\\Psi", "Ω": "\\Omega", # Mathematical constants and special symbols "∞": "\\infty", "∅": "\\emptyset", "∇": "\\nabla", "∂": "\\partial", "ℏ": "\\hbar", "ℓ": "\\ell", "∠": "\\angle", "∁": "\\complement", "℘": "\\wp", "ℵ": "\\aleph", "℧": "\\mho", # Geometric symbols "△": "\\triangle", "▲": "\\blacktriangle", "▽": "\\triangledown", "◁": "\\triangleleft", "▷": "\\triangleright", "◀": "\\blacktriangleleft", "▶": "\\blacktriangleright", # Square symbols (comprehensive coverage) "□": "\\square", # U+25A1 WHITE SQUARE "■": "\\blacksquare", # U+25A0 BLACK SQUARE "▪": "\\blacksquare", # U+25AA BLACK SMALL SQUARE "▫": "\\square", # U+25AB WHITE SMALL SQUARE "◻": "\\square", # U+25FB WHITE MEDIUM SQUARE "◼": "\\blacksquare", # U+25FC BLACK MEDIUM SQUARE "◽": "\\square", # U+25FD WHITE MEDIUM SMALL SQUARE "◾": "\\blacksquare", # U+25FE BLACK MEDIUM SMALL SQUARE # Other geometric shapes # NOTE: ▱ (parallelogram) is in UNICODE_PASSTHROUGH "◇": "\\diamond", "◆": "\\blacklozenge", "○": "\\circ", "●": "\\bullet", "☆": "\\star", "★": "\\bigstar", "◯": "\\bigcirc", # Temperature symbols "℃": "^\\circ\\mathrm{C}", "℉": "^\\circ\\mathrm{F}", # Basic operators and punctuation "∶": ":", # U+2236 RATIO to colon for assignment operators "§": "\\S", "†": "\\dagger", "‵": "\\backprime", "`": "\\backprime", # U+0060 GRAVE ACCENT (backtick) used as backprime in equations "―": "\\textemdash", # U+2015 horizontal bar # Multiplication and division "×": "\\times", "⋅": "\\cdot", "·": "\\cdot", "÷": "\\div", "∕": "/", "⁄": "/", "//": "/ /", # Double slash with spacing "⧸": "/", # U+29F8 BIG SOLIDUS (used in \not patterns but also standalone) # Mathematical script letters "ℑ": "\\Im", # Imaginary part (Fraktur I) "ℜ": "\\Re", # Real part (Fraktur R) # Arrows (basic) "→": "\\rightarrow", "←": "\\leftarrow", "↔": "\\leftrightarrow", "⇒": "\\Longrightarrow", "⇐": "\\Longleftarrow", "⇔": "\\Longleftrightarrow", "⟹": "\\Longrightarrow", "⟸": "\\Longleftarrow", "⟺": "\\Longleftrightarrow", "⟷": "\\longleftrightarrow", "↑": "\\uparrow", "↓": "\\downarrow", "⇑": "\\Uparrow", "⇓": "\\Downarrow", "↕": "\\updownarrow", "⇕": "\\Updownarrow", # Arrows (diagonal) "↗": "\\nearrow", "↘": "\\searrow", "↙": "\\swarrow", "↖": "\\nwarrow", "⤴": "\\nwarrow", "⤵": "\\searrow", "⤡": "\\swarrow", "⤢": "\\nearrow", # Arrows (special forms) # NOTE: Some special arrows (↤ mapsfrom, ⟻ longmapsfrom, ⇜ leftsquigarrow, ⇝ rightsquigarrow) are in UNICODE_PASSTHROUGH "↦": "\\mapsto", "⟼": "\\longmapsto", "↪": "\\hookrightarrow", "↩": "\\hookleftarrow", "⤷": "\\hookrightarrow", "⤶": "\\hookleftarrow", "↬": "\\looparrowright", "↫": "\\looparrowleft", "⇀": "\\rightharpoonup", "↼": "\\leftharpoonup", "↢": "\\leftarrowtail", "↣": "\\rightarrowtail", "↰": "\\Lsh", "↱": "\\Rsh", # Arrows (negated) "↛": "\\nrightarrow", "↚": "\\nleftarrow", "⇏": "\\nRightarrow", "⇍": "\\nLeftarrow", "↮": "\\nleftrightarrow", "⇎": "\\nLeftrightarrow", # Set theory and logic # Set membership "∈": "\\in", "∉": "\\notin", "∋": "\\ni", "∌": "\\notni", "⋲": "\\in", "⋳": "\\ni", "⋴": "\\in", "⋵": "\\ni", "⋶": "\\in", "⋷": "\\ni", "⋸": "\\pitchfork", "⋹": "\\ltimes", # Subset and superset relations (basic) "⊂": "\\subset", "⊃": "\\supset", "⊆": "\\subseteq", "⊇": "\\supseteq", "⊄": "\\not\\subset", "⊅": "\\not\\supset", "⊈": "\\nsubseteq", "⊉": "\\nsupseteq", "⊊": "\\subsetneq", "⊋": "\\supsetneq", # Subset and superset relations (extended with double lines) "⫅": "\\subseteqq", "⫆": "\\supseteqq", # U+2AC5, U+2AC6 subset/supset with double equals "⫋": "\\subsetneqq", "⫌": "\\supsetneqq", # U+2ACB, U+2ACC not equal variant with double "⫏": "\\sqsubset", "⫐": "\\sqsupset", # U+2ACF, U+2AD0 square subset/supset "⫑": "\\sqsubseteq", "⫒": "\\sqsupseteq", # U+2AD1, U+2AD2 square subset/supset equal "⊏": "\\sqsubset", "⊐": "\\sqsupset", # U+228F, U+2290 square variants "⊑": "\\sqsubseteq", "⊒": "\\sqsupseteq", # U+2291, U+2292 square equal variants # Set operations # NOTE: Some symbols like ⊌ (dotcup), ⊍ (cupdot) are in UNICODE_PASSTHROUGH "∪": "\\cup", "∩": "\\cap", "∖": "\\setminus", "⊎": "\\uplus", "⊔": "\\sqcup", "⊓": "\\sqcap", "⨃": "\\Cup", "⨄": "\\biguplus", "⨅": "\\bigsqcap", "⨆": "\\bigsqcup", "⩁": "\\Cup", "⩂": "\\Cap", "⩃": "\\cupdot", # Logical operators "∧": "\\wedge", "∨": "\\vee", "¬": "\\neg", "⊕": "\\oplus", "⊗": "\\otimes", "⊙": "\\odot", "⊖": "\\ominus", "⊘": "\\oslash", "∀": "\\forall", "∃": "\\exists", "∄": "\\nexists", "⊤": "\\top", "⊥": "\\perp", "⊢": "\\vdash", "⊣": "\\dashv", "⊨": "\\models", "⊭": "\\not\\models", "∴": "\\therefore", "∵": "\\because", "⋏": "\\curlywedge", "⋎": "\\curlyvee", # Additional logical symbols "⊩": "\\Vdash", "⊪": "\\Vvdash", "⊫": "\\VDash", "⊬": "\\nvdash", "⊯": "\\nVdash", "⊮": "\\nVDash", "∎": "\\qed", "◊": "\\lozenge", "≐": "\\doteq", "≑": "\\doteqdot", "≒": "\\fallingdotseq", "≓": "\\risingdotseq", # Relations # Equality and equivalence "≈": "\\approx", "≅": "\\cong", "≡": "\\equiv", "≢": "\\not\\equiv", "≠": "\\neq", "≁": "\\not\\sim", "≄": "\\nsim", "≇": "\\ncong", "~": "\\sim", # ASCII tilde (U+007E) - similarity operator "∼": "\\sim", "≃": "\\simeq", "≂": "\\eqsim", "≊": "\\approxeq", # Inequality relations (basic) # NOTE: Triple relations ⋘ (lll), ⋙ (ggg) are in UNICODE_PASSTHROUGH "≤": "\\leqslant", "≥": "\\geqslant", "≮": "\\nless", "≯": "\\ngtr", "≰": "\\nleq", "≱": "\\ngeq", "≪": "\\ll", "≫": "\\gg", # Inequality relations (extended) "≦": "\\leqq", "≧": "\\geqq", "≨": "\\lneqq", "≩": "\\gneqq", "⩽": "\\leqslant", "⩾": "\\geqslant", "⩿": "\\gneq", "≶": "\\lessgtr", "≷": "\\gtrless", "≸": "\\not\\lessgtr", "≹": "\\not\\gtrless", # NOTE: Advanced comparison symbols (⪋ lesseqgtr, ⪌ gtreqless, ⪅ lessapprox, etc.) are in UNICODE_PASSTHROUGH "⪇": "\\lneq", "⪈": "\\gneq", # Precedence and succession # NOTE: Advanced precedence symbols (⋞ curlyeqprec, ⋟ curlyeqsucc, ⪷ precapprox, ⪸ succapprox) are in UNICODE_PASSTHROUGH "≺": "\\prec", "≻": "\\succ", "⪯": "\\preceq", "⪰": "\\succeq", "⪳": "\\preceqq", "⪴": "\\succeqq", "⪵": "\\precneqq", "⪶": "\\succneqq", # Similarity and comparison "≲": "\\lesssim", "≳": "\\gtrsim", "≴": "\\not\\lesssim", "≵": "\\not\\gtrsim", "∝": "\\propto", "∥": "\\parallel", "∦": "\\nparallel", "≍": "\\asymp", "≎": "\\Bumpeq", "≏": "\\bumpeq", "∽": "\\backsim", "⋍": "\\backsimeq", # U+22CD REVERSED TILDE EQUALS "≌": "\\cong", # U+224C ALL EQUAL TO (commonly used for congruence) "⊲": "\\lhd", "⊳": "\\rhd", "⌢": "\\frown", "⌣": "\\smile", # Special equality symbols # NOTE: Some special equality symbols (≔ coloneqq, ≕ eqqcolon, ≘ arceq, ≙ wedgeq, ≚ veeeq) are in UNICODE_PASSTHROUGH "≜": "\\triangleq", "≝": "\\overset{\\mathrm{def}}{=}", "≞": "\\overset{\\mathrm{m}}{=}", "≟": "\\overset{?}{=}", "≗": "\\circeq", "≖": "\\eqcirc", # Calculus and analysis # Integrals # NOTE: Many advanced integral symbols (∯, ∰, ∱, etc.) are in UNICODE_PASSTHROUGH # for direct MathJax rendering, so they are NOT listed here "∫": "\\int", "∬": "\\iint", "∭": "\\iiint", "⨌": "\\iiiint", "∮": "\\oint", # Differentials and operators "∆": "\\Delta", "∂": "\\partial", "∇": "\\nabla", "∝": "\\propto", "∞": "\\infty", # Cardinality symbols # NOTE: Hebrew letters ℶ (beth), ℷ (gimel), ℸ (daleth) are in UNICODE_PASSTHROUGH "ℵ": "\\aleph", # Number sets (use \mathbb for blackboard bold notation) "ℕ": "\\mathbb{N}", "ℤ": "\\mathbb{Z}", "ℚ": "\\mathbb{Q}", "ℝ": "\\mathbb{R}", "ℂ": "\\mathbb{C}", "ℍ": "\\mathbb{H}", "ℙ": "\\mathbb{P}", "𝔽": "\\mathbb{F}", "𝔾": "\\mathbb{G}", # Special operators # Basic arithmetic operators "±": "\\pm", "∓": "\\mp", "−": "-", "∔": "\\dotplus", # Binary operators (algebraic) "⋆": "\\star", "∗": "\\ast", "∘": "\\circ", "∙": "\\bullet", "⋄": "\\diamond", "⋅": "\\cdot", "•": "\\bullet", # Binary operators (lattice and semilattice) # NOTE: ⊌ (dotcup), ⊍ (cupdot) are in UNICODE_PASSTHROUGH "⊔": "\\sqcup", "⊓": "\\sqcap", "⊎": "\\uplus", # Binary operators (group theory) # NOTE: Some group theory operators (⋋ leftthreetimes, ⋌ rightthreetimes, ⋇ divideontimes) are in UNICODE_PASSTHROUGH "⋉": "\\ltimes", "⋊": "\\rtimes", "⨿": "\\amalg", "⋈": "\\bowtie", # Binary operators (wreath and semidirect products) "≀": "\\wr", "⊺": "\\intercal", "⊻": "\\veebar", # Binary operators (extended) # NOTE: Advanced box operators (⧄ boxbox, ⧅ boxast, ⧆ boxcirc, ⧇ boxbslash, ⧈ boxslash) are in UNICODE_PASSTHROUGH "⊝": "\\ominus", "⊞": "\\boxplus", "⊟": "\\boxminus", "⊠": "\\boxtimes", "⊡": "\\boxdot", # Big operators "∑": "\\sum", "∏": "\\prod", "∐": "\\coprod", "⋃": "\\bigcup", "⋂": "\\bigcap", "⋁": "\\bigvee", "⋀": "\\bigwedge", "⨁": "\\bigoplus", "⨂": "\\bigotimes", "⨄": "\\biguplus", "⨅": "\\bigsqcap", "⨆": "\\bigsqcup", # Delimiters and brackets # Angle brackets "⟨": "\\langle", "⟩": "\\rangle", "⟪": "\\langle\\langle", "⟫": "\\rangle\\rangle", "〈": "\\langle", "〉": "\\rangle", # CJK angle brackets # Floor and ceiling "⌊": "\\lfloor", "⌋": "\\rfloor", "⌈": "\\lceil", "⌉": "\\rceil", # Special brackets # NOTE: Some special brackets (⦅ llparenthesis, ⦆ rrparenthesis, 〚 llbracket, 〛 rrbracket, ⦉ Langle, ⦊ Rangle) are in UNICODE_PASSTHROUGH "⦃": "\\{", "⦄": "\\}", "⟦": "[\\![", "⟧": "]\\!]", "⟬": "\\llbracket", "⟭": "\\rrbracket", "⦇": "\\llparenthesis", "⦈": "\\rrparenthesis", # Absolute value and norm "|": "|", "‖": "\\|", "∥": "\\parallel", # ‖ (U+2016) is double vertical line for norms → \| # Miscellaneous symbols # NOTE: Radical symbols must include {} braces for valid LaTeX # Users may type these directly as text (malformed input), so we ensure valid output "√": "\\sqrt{}", "∛": "\\sqrt[3]{}", "∜": "\\sqrt[4]{}", "∡": "\\measuredangle", "∢": "\\sphericalangle", "°": "^\\circ", # Prime notation - both Unicode primes and ASCII apostrophe (commonly used in Word) "'": "\\prime", # ASCII apostrophe (U+0027) - commonly typed instead of Unicode prime "′": "\\prime", "″": "\\prime\\prime", "‴": "\\prime\\prime\\prime", "⁗": "\\prime\\prime\\prime\\prime", "℮": "e", "ℯ": "e", "ⅈ": "i", "ⅉ": "j", # NOTE: ⋰ (iddots) is in UNICODE_PASSTHROUGH "…": "\\ldots", "⋯": "\\cdots", "⋮": "\\vdots", "⋱": "\\ddots", "♭": "\\flat", "♮": "\\natural", "♯": "\\sharp", # Fullwidth punctuation (CJK) ",": ", ", # U+FF0C fullwidth comma (Chinese comma) → regular comma with space # Accent marks (for detection in mover elements) "¨": "__DDOT__", # U+00A8 diaeresis (standalone) - placeholder for ddot detection "⃛": "__DDDOT__", # U+20DB combining three dots above - placeholder for dddot detection "̈": "__DDOT__", # U+0308 combining diaeresis - placeholder for ddot detection "⃛": "__DDDOT__", # U+20DB combining triple dot above - placeholder for dddot detection # Chemistry arrows and symbols (harpoons) "⇌": "\\rightleftharpoons", # U+21CC rightleftharpoons (equilibrium) "⇋": "\\leftrightharpoons", # U+21CB leftrightharpoons (equilibrium reversed) "⇀": "\\rightharpoonup", # U+21C0 rightharpoonup "⇁": "\\rightharpoondown", # U+21C1 rightharpoondown "↼": "\\leftharpoonup", # U+21BC leftharpoonup "↽": "\\leftharpoondown", # U+21BD leftharpoondown "⥂": "\\rightleftharpoons", # U+2942 alternate form "⥃": "\\leftrightharpoons", # U+2943 alternate form "⥄": "\\rightleftarrows", # U+2944 right over left arrows "⥅": "\\leftrightarrows", # U+2945 left over right arrows "⥆": "\\rightleftarrows", # U+2946 right over left arrows "⥇": "\\leftrightarrows", # U+2947 left over right arrows "⇄": "\\rightleftarrows", # U+21C4 right over left (already in extended arrows) "⇆": "\\leftrightarrows", # U+21C6 left over right (already in extended arrows) "⇉": "\\rightrightarrows", # U+21C9 double right (already in extended arrows) "⇇": "\\leftleftarrows", # U+21C7 double left (already in extended arrows) # Overbrace and underbrace characters "⏞": "\\overbrace", "⏟": "\\underbrace", # Extended mathematical operators (remaining unique ones) # NOTE: ⊚ (ocirc), ⊛ (oast) are in UNICODE_PASSTHROUGH # Extended relation symbols (remaining unique ones) # NOTE: Several special equality symbols (≔ coloneqq, ≕ eqqcolon, ≘ arceq, ≙ wedgeq, ≚ veeeq) are in UNICODE_PASSTHROUGH "≆": "\\approxeq", "≛": "\\triangleq", # Extended arrows (remaining unique ones) "⇈": "\\upuparrows", "⇊": "\\downdownarrows", "⇅": "\\updownarrows", "⇵": "\\downuparrows", "↶": "\\curvearrowleft", "↷": "\\curvearrowright", "↺": "\\circlearrowleft", "↻": "\\circlearrowright", # Extended logical symbols # NOTE: ⟀ (lozengeminus) is in UNICODE_PASSTHROUGH "⟁": "\\lozengepls", "⟂": "\\perp", "⟃": "\\between", "⟄": "\\pitchfork", "⟅": "\\varpropto", "⟆": "\\backprime", "⟇": "\\caretinsert", # Extended geometric symbols "⟐": "\\angle", "⟑": "\\measuredangle", "⟒": "\\sphericalangle", "⟓": "\\rightangle", "⟔": "\\angle", "⟕": "\\measuredangle", "⟖": "\\sphericalangle", "⟗": "\\rightangle", # Extended miscellaneous symbols "⟘": "\\perp", "⟙": "\\diamondsuit", "⟚": "\\heartsuit", "⟛": "\\clubsuit", "⟜": "\\spadesuit", "⟝": "\\varnothing", "⟞": "\\diameter", "⟟": "\\house", } # Additional Symbol Replacements (Consolidated from scattered code) # ======================================================================== # These symbols are used in specific contexts (e.g., function subscripts) # and should be applied consistently across the codebase ADDITIONAL_SYMBOL_REPLACEMENTS = { # Arrows used in function subscripts (line 1828) '→': '\\to ', # These are handled in UNICODE_TO_LATEX but kept for reference in subscript context # '∞': '\\infty', # Already in UNICODE_TO_LATEX # '≤': '\\leqslant ', # Already in UNICODE_TO_LATEX # '≥': '\\geqslant ', # Already in UNICODE_TO_LATEX # '≠': '\\ne ', # Already in UNICODE_TO_LATEX as \\neq # '±': '\\pm ', # Already in UNICODE_TO_LATEX } # LaTeX command normalization (converting between command variants) LATEX_COMMAND_REPLACEMENTS = { # Logical equivalence (line 5545) '\\Longleftrightarrow': '\\iff ', # Arrow shorthand (line 5548) '\\lra': '\\leftrightarrow', } # Summation symbols for OMML fallback parser SUMMATION_SYMBOLS = { '∑': 'sum', '∏': 'prod', '∫': 'integral', 'Σ': 'sum', 'Π': 'prod' } # LaTeX commands not supported by MathJax - use Unicode fallback # Maps LaTeX command (without backslash) to Unicode character # This comprehensive list ensures proper rendering in MathJax environments MATHJAX_UNSUPPORTED_TO_UNICODE = { # ========================================================================= # INTEGRAL OPERATORS - Many not in standard MathJax # ========================================================================= # Surface and volume integrals 'oiint': '∯', # U+222F SURFACE INTEGRAL 'oiiint': '∰', # U+2230 VOLUME INTEGRAL # Clockwise/counterclockwise integrals - NOT in MathJax 'intclockwise': '∱', # U+2231 CLOCKWISE INTEGRAL 'varointclockwise': '∲', # U+2232 CLOCKWISE CONTOUR INTEGRAL 'varointctrclockwise': '∳', # U+2233 ANTICLOCKWISE CONTOUR INTEGRAL # Extended integrals - limited MathJax support 'fint': '⨍', # U+2A0D FINITE PART INTEGRAL 'pointint': '⨎', # U+2A0E PATH INTEGRAL (line integral) 'sqint': '⨏', # U+2A0F INTEGRAL WITH SQUARED OPERATOR 'intlarhk': '⨐', # U+2A10 CIRCULATION FUNCTION 'intbar': '⨑', # U+2A11 INTEGRAL WITH OVERBAR 'intBar': '⨒', # U+2A12 INTEGRAL WITH DOUBLE OVERBAR 'fintbar': '⨓', # U+2A13 FINITE PART INTEGRAL WITH OVERBAR 'ointbar': '⨔', # U+2A14 CONTOUR INTEGRAL WITH OVERBAR 'ointBar': '⨕', # U+2A15 CONTOUR INTEGRAL WITH DOUBLE OVERBAR 'oiintbar': '⨖', # U+2A16 SURFACE INTEGRAL WITH OVERBAR 'oiintBar': '⨗', # U+2A17 SURFACE INTEGRAL WITH DOUBLE OVERBAR # ========================================================================= # BINARY OPERATORS - Non-standard or limited support # ========================================================================= # Division operator 'divideontimes': '⋇', # U+22C7 DIVISION TIMES # Circle operators - non-standard names 'oast': '⊛', # U+229B CIRCLED ASTERISK OPERATOR 'ocirc': '⊚', # U+229A CIRCLED RING OPERATOR # Box operators - extended (standard ones like boxplus ARE supported) 'boxbox': '⧄', # U+29C4 SQUARED SQUARE 'boxast': '⧅', # U+29C5 SQUARED ASTERISK 'boxcirc': '⧆', # U+29C6 SQUARED SMALL CIRCLE 'boxbslash': '⧇', # U+29C7 SQUARED BACKSLASH 'boxslash': '⧈', # U+29C8 SQUARED SLASH # Semidirect products 'leftthreetimes': '⋋', # U+22CB LEFT SEMIDIRECT PRODUCT 'rightthreetimes': '⋌', # U+22CC RIGHT SEMIDIRECT PRODUCT # Set operations with dot 'dotcup': '⊌', # U+228C MULTISET 'cupdot': '⊍', # U+228D MULTISET MULTIPLICATION # ========================================================================= # ARROWS - Extended arrows with limited MathJax support # ========================================================================= 'mapsfrom': '↤', # U+21A4 LEFTWARDS ARROW FROM BAR 'longmapsfrom': '⟻', # U+27FB LONG LEFTWARDS ARROW FROM BAR 'leftsquigarrow': '⇜', # U+21DC LEFTWARDS SQUIGGLE ARROW 'rightsquigarrow': '⇝', # U+21DD RIGHTWARDS SQUIGGLE ARROW # 'looparrowleft': '↫', # U+21AB LEFTWARDS ARROW WITH LOOP # 'looparrowright': '↬', # U+21AC RIGHTWARDS ARROW WITH LOOP # 'leftarrowtail': '↢', # U+21A2 LEFTWARDS ARROW WITH TAIL # 'rightarrowtail': '↣', # U+21A3 RIGHTWARDS ARROW WITH TAIL # 'Lsh': '↰', # U+21B0 UPWARDS ARROW WITH TIP LEFTWARDS # 'Rsh': '↱', # U+21B1 UPWARDS ARROW WITH TIP RIGHTWARDS # 'curvearrowleft': '↶', # U+21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW # 'curvearrowright': '↷', # U+21B7 CLOCKWISE TOP SEMICIRCLE ARROW # 'circlearrowleft': '↺', # U+21BA ANTICLOCKWISE OPEN CIRCLE ARROW # 'circlearrowright': '↻', # U+21BB CLOCKWISE OPEN CIRCLE ARROW # 'upuparrows': '⇈', # U+21C8 UPWARDS PAIRED ARROWS # 'downdownarrows': '⇊', # U+21CA DOWNWARDS PAIRED ARROWS # 'updownarrows': '⇅', # U+21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS # 'downuparrows': '⇵', # U+21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS # ========================================================================= # RELATION SYMBOLS - Extended relations # ========================================================================= # Triple comparisons 'lll': '⋘', # U+22D8 VERY MUCH LESS-THAN 'ggg': '⋙', # U+22D9 VERY MUCH GREATER-THAN # Combined relations 'lesseqgtr': '⪋', # U+2A8B LESS-THAN EQUAL TO OR GREATER-THAN 'gtreqless': '⪌', # U+2A8C GREATER-THAN EQUAL TO OR LESS-THAN 'lessapprox': '⪅', # U+2A85 LESS-THAN OR APPROXIMATE 'gtrapprox': '⪆', # U+2A86 GREATER-THAN OR APPROXIMATE 'lnapprox': '⪉', # U+2A89 LESS-THAN AND NOT APPROXIMATE 'gnapprox': '⪊', # U+2A8A GREATER-THAN AND NOT APPROXIMATE # Precedence relations 'precapprox': '⪷', # U+2AB7 PRECEDES ABOVE ALMOST EQUAL TO 'succapprox': '⪸', # U+2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO 'curlyeqprec': '⋞', # U+22DE EQUAL TO OR PRECEDES 'curlyeqsucc': '⋟', # U+22DF EQUAL TO OR SUCCEEDS # Similarity relations # 'backsim': '∽', # U+223D REVERSED TILDE # 'backsimeq': '⋍', # U+22CD REVERSED TILDE EQUALS # Special equality symbols 'wedgeq': '≙', # U+2259 ESTIMATES (wedge equals) 'veeeq': '≚', # U+225A EQUIANGULAR TO 'arceq': '≘', # U+2258 CORRESPONDS TO 'coloneqq': '≔', # U+2254 COLON EQUALS 'eqqcolon': '≕', # U+2255 EQUALS COLON 'Coloneqq': '⩴', # U+2A74 DOUBLE COLON EQUAL 'eqcolon': '∹', # U+2239 EXCESS (-:) # ========================================================================= # BRACKET/DELIMITER SYMBOLS # ========================================================================= 'llbracket': '〚', # U+301A LEFT WHITE SQUARE BRACKET 'rrbracket': '〛', # U+301B RIGHT WHITE SQUARE BRACKET 'llparenthesis': '⦅', # U+2985 LEFT WHITE PARENTHESIS 'rrparenthesis': '⦆', # U+2986 RIGHT WHITE PARENTHESIS 'Langle': '⦉', # U+2989 Z NOTATION LEFT BINDING BRACKET 'Rangle': '⦊', # U+298A Z NOTATION RIGHT BINDING BRACKET # ========================================================================= # GEOMETRIC AND MISCELLANEOUS SYMBOLS # ========================================================================= 'parallelogram': '▱', # U+25B1 WHITE PARALLELOGRAM 'iddots': '⋰', # U+22F0 UP RIGHT DIAGONAL ELLIPSIS # 'mho': '℧', # U+2127 INVERTED OHM SIGN # 'complement': '∁', # U+2201 COMPLEMENT # Hebrew letters (beyond aleph) 'beth': 'ℶ', # U+2136 BET SYMBOL 'gimel': 'ℷ', # U+2137 GIMEL SYMBOL 'daleth': 'ℸ', # U+2138 DALET SYMBOL # ========================================================================= # LOGICAL AND SET OPERATORS # ========================================================================= # Extended subset/superset relations # 'subseteqq': '⫅', # U+2AC5 SUBSET OF ABOVE EQUALS SIGN # 'supseteqq': '⫆', # U+2AC6 SUPERSET OF ABOVE EQUALS SIGN # 'subsetneqq': '⫋', # U+2ACB SUBSET OF ABOVE NOT EQUAL TO # 'supsetneqq': '⫌', # U+2ACC SUPERSET OF ABOVE NOT EQUAL TO # Logic symbols 'lozengeminus': '⟀', # U+27C0 THREE DIMENSIONAL ANGLE 'between': '≬', # U+226C BETWEEN } # Regional symbol preferences (e.g., Chinese region prefers varnothing over emptyset) # Maps standard LaTeX command to regional alternative REGIONAL_SYMBOL_PREFERENCES = { # Chinese region: prefer varnothing (⌀) over emptyset (∅) # varnothing has a diagonal line which is clearer in Chinese typography 'emptyset': 'varnothing', # ∅ → ⌀ } # Unicode symbols that should be kept as-is (NOT converted to LaTeX) # These are symbols whose LaTeX commands are not supported or render poorly in MathJax. # By keeping them as Unicode, they render correctly using system fonts. # This set is the "inverse" of MATHJAX_UNSUPPORTED_TO_UNICODE - same symbols, different direction. UNICODE_PASSTHROUGH = { # ========================================================================= # INTEGRAL OPERATORS - Keep as Unicode for MathJax compatibility # ========================================================================= '∯', # U+222F SURFACE INTEGRAL (oiint) '∰', # U+2230 VOLUME INTEGRAL (oiiint) '∱', # U+2231 CLOCKWISE INTEGRAL (intclockwise) '∲', # U+2232 CLOCKWISE CONTOUR INTEGRAL (varointclockwise) '∳', # U+2233 ANTICLOCKWISE CONTOUR INTEGRAL (varointctrclockwise) '⨍', # U+2A0D FINITE PART INTEGRAL (fint) '⨎', # U+2A0E PATH INTEGRAL (pointint) '⨏', # U+2A0F INTEGRAL WITH SQUARED OPERATOR (sqint) '⨐', # U+2A10 CIRCULATION FUNCTION (intlarhk) '⨑', # U+2A11 INTEGRAL WITH OVERBAR (intbar) '⨒', # U+2A12 INTEGRAL WITH DOUBLE OVERBAR (intBar) '⨓', # U+2A13 FINITE PART INTEGRAL WITH OVERBAR (fintbar) '⨔', # U+2A14 CONTOUR INTEGRAL WITH OVERBAR (ointbar) '⨕', # U+2A15 CONTOUR INTEGRAL WITH DOUBLE OVERBAR (ointBar) '⨖', # U+2A16 SURFACE INTEGRAL WITH OVERBAR (oiintbar) '⨗', # U+2A17 SURFACE INTEGRAL WITH DOUBLE OVERBAR (oiintBar) # ========================================================================= # BINARY OPERATORS - Keep as Unicode # ========================================================================= '⋇', # U+22C7 DIVISION TIMES (divideontimes) '⊛', # U+229B CIRCLED ASTERISK OPERATOR (oast) '⊚', # U+229A CIRCLED RING OPERATOR (ocirc) '⧄', # U+29C4 SQUARED SQUARE (boxbox) '⧅', # U+29C5 SQUARED ASTERISK (boxast) '⧆', # U+29C6 SQUARED SMALL CIRCLE (boxcirc) '⧇', # U+29C7 SQUARED BACKSLASH (boxbslash) '⧈', # U+29C8 SQUARED SLASH (boxslash) '⋋', # U+22CB LEFT SEMIDIRECT PRODUCT (leftthreetimes) '⋌', # U+22CC RIGHT SEMIDIRECT PRODUCT (rightthreetimes) '⊌', # U+228C MULTISET (dotcup) '⊍', # U+228D MULTISET MULTIPLICATION (cupdot) # ========================================================================= # ARROWS - Keep as Unicode for consistency # ========================================================================= '↤', # U+21A4 LEFTWARDS ARROW FROM BAR (mapsfrom) '⟻', # U+27FB LONG LEFTWARDS ARROW FROM BAR (longmapsfrom) '⇜', # U+21DC LEFTWARDS SQUIGGLE ARROW (leftsquigarrow) '⇝', # U+21DD RIGHTWARDS SQUIGGLE ARROW (rightsquigarrow) # '↫', # U+21AB LEFTWARDS ARROW WITH LOOP (looparrowleft) # '↬', # U+21AC RIGHTWARDS ARROW WITH LOOP (looparrowright) # '↢', # U+21A2 LEFTWARDS ARROW WITH TAIL (leftarrowtail) # '↣', # U+21A3 RIGHTWARDS ARROW WITH TAIL (rightarrowtail) # '↰', # U+21B0 UPWARDS ARROW WITH TIP LEFTWARDS (Lsh) # '↱', # U+21B1 UPWARDS ARROW WITH TIP RIGHTWARDS (Rsh) # '↶', # U+21B6 ANTICLOCKWISE TOP SEMICIRCLE ARROW (curvearrowleft) # '↷', # U+21B7 CLOCKWISE TOP SEMICIRCLE ARROW (curvearrowright) # '↺', # U+21BA ANTICLOCKWISE OPEN CIRCLE ARROW (circlearrowleft) # '↻', # U+21BB CLOCKWISE OPEN CIRCLE ARROW (circlearrowright) # '⇈', # U+21C8 UPWARDS PAIRED ARROWS (upuparrows) # '⇊', # U+21CA DOWNWARDS PAIRED ARROWS (downdownarrows) # '⇅', # U+21C5 UPWARDS ARROW LEFTWARDS OF DOWNWARDS (updownarrows) # '⇵', # U+21F5 DOWNWARDS ARROW LEFTWARDS OF UPWARDS (downuparrows) # ========================================================================= # RELATION SYMBOLS - Keep as Unicode # ========================================================================= '⋘', # U+22D8 VERY MUCH LESS-THAN (lll) '⋙', # U+22D9 VERY MUCH GREATER-THAN (ggg) '⪋', # U+2A8B LESS-THAN EQUAL TO OR GREATER-THAN (lesseqgtr) '⪌', # U+2A8C GREATER-THAN EQUAL TO OR LESS-THAN (gtreqless) '⪅', # U+2A85 LESS-THAN OR APPROXIMATE (lessapprox) '⪆', # U+2A86 GREATER-THAN OR APPROXIMATE (gtrapprox) '⪉', # U+2A89 LESS-THAN AND NOT APPROXIMATE (lnapprox) '⪊', # U+2A8A GREATER-THAN AND NOT APPROXIMATE (gnapprox) '⪷', # U+2AB7 PRECEDES ABOVE ALMOST EQUAL TO (precapprox) '⪸', # U+2AB8 SUCCEEDS ABOVE ALMOST EQUAL TO (succapprox) '⋞', # U+22DE EQUAL TO OR PRECEDES (curlyeqprec) '⋟', # U+22DF EQUAL TO OR SUCCEEDS (curlyeqsucc) # '∽', # U+223D REVERSED TILDE (backsim) # '⋍', # U+22CD REVERSED TILDE EQUALS (backsimeq) '≙', # U+2259 ESTIMATES (wedgeq) '≚', # U+225A EQUIANGULAR TO (veeeq) '≘', # U+2258 CORRESPONDS TO (arceq) '≔', # U+2254 COLON EQUALS (coloneqq) '≕', # U+2255 EQUALS COLON (eqqcolon) '⩴', # U+2A74 DOUBLE COLON EQUAL (Coloneqq) '∹', # U+2239 EXCESS (eqcolon) '≬', # U+226C BETWEEN (between) # ========================================================================= # BRACKET/DELIMITER SYMBOLS - Keep as Unicode # ========================================================================= '〚', # U+301A LEFT WHITE SQUARE BRACKET (llbracket) '〛', # U+301B RIGHT WHITE SQUARE BRACKET (rrbracket) '⦅', # U+2985 LEFT WHITE PARENTHESIS (llparenthesis) '⦆', # U+2986 RIGHT WHITE PARENTHESIS (rrparenthesis) '⦉', # U+2989 Z NOTATION LEFT BINDING BRACKET (Langle) '⦊', # U+298A Z NOTATION RIGHT BINDING BRACKET (Rangle) # ========================================================================= # GEOMETRIC AND MISCELLANEOUS SYMBOLS - Keep as Unicode # ========================================================================= '▱', # U+25B1 WHITE PARALLELOGRAM (parallelogram) '⋰', # U+22F0 UP RIGHT DIAGONAL ELLIPSIS (iddots) # '℧', # U+2127 INVERTED OHM SIGN (mho) # '∁', # U+2201 COMPLEMENT (complement) 'ℶ', # U+2136 BET SYMBOL (beth) 'ℷ', # U+2137 GIMEL SYMBOL (gimel) 'ℸ', # U+2138 DALET SYMBOL (daleth) '⟀', # U+27C0 THREE DIMENSIONAL ANGLE (lozengeminus) # ========================================================================= # LOGICAL AND SET OPERATORS - Keep as Unicode # ========================================================================= # '⫅', # U+2AC5 SUBSET OF ABOVE EQUALS SIGN (subseteqq) # '⫆', # U+2AC6 SUPERSET OF ABOVE EQUALS SIGN (supseteqq) # '⫋', # U+2ACB SUBSET OF ABOVE NOT EQUAL TO (subsetneqq) # '⫌', # U+2ACC SUPERSET OF ABOVE NOT EQUAL TO (supsetneqq) }