katex-convert-unicode.rkt (4456B)
1 #lang at-exp racket/base 2 (require racket/string) 3 4 (provide katex-convert-unicode 5 string-replace*) 6 7 (define (literal-alternatives→regexp literal-alternatives) 8 (string-append "(" 9 (string-join (map regexp-quote literal-alternatives) "|") 10 ")")) 11 12 (define (string-replace* str mathmode? sym→*) 13 (define →* (map (λ (x) 14 (cons (symbol->string (car x)) 15 (cadr x))) 16 sym→*)) 17 (define hash→* (make-immutable-hash →*)) 18 (regexp-replace* (literal-alternatives→regexp (map car →*)) 19 str 20 (λ (found . _) 21 (let ([replacement (hash-ref hash→* found)]) 22 (if mathmode? 23 replacement 24 (string-append "$" replacement "$")))))) 25 26 (define (katex-convert-unicode str mathmode? [more-sym→* '()]) 27 (define sym→* 28 `([₀ "{}_0"] 29 [₁ "{}_1"] 30 [₂ "{}_2"] 31 [₃ "{}_3"] 32 [₄ "{}_4"] 33 [₅ "{}_5"] 34 [₆ "{}_6"] 35 [₇ "{}_7"] 36 [₈ "{}_8"] 37 [₉ "{}_9"] 38 [ᵢ "{}_i"] 39 [ⱼ "{}_j"] 40 [ₖ "{}_k"] 41 [ₗ "{}_l"] 42 [ₘ "{}_m"] 43 [ₙ "{}_n"] 44 [ₒ "{}_o"] 45 [ₓ "{}_x"] 46 [⁰ "{}^0"] 47 [¹ "{}^1"] 48 [² "{}^2"] 49 [³ "{}^3"] 50 [⁴ "{}^4"] 51 [⁵ "{}^5"] 52 [⁶ "{}^6"] 53 [⁷ "{}^7"] 54 [⁸ "{}^8"] 55 [⁹ "{}^9"] 56 [ⁱ "{}^i"] 57 [ʲ "{}^j"] 58 [ᵏ "{}^k"] 59 [ˡ "{}^l"] 60 [ᵐ "{}^m"] 61 [ⁿ "{}^n"] 62 [ᵒ "{}^o"] 63 [⊆ "\\subseteq{}" "\\ensuremath{\\subseteq}"] 64 [⊂ "\\subset{}" "\\ensuremath{\\subset}"] 65 [⊇ "\\supseteq{}" "\\ensuremath{\\supseteq}"] 66 [⊃ "\\supset{}" "\\ensuremath{\\supset}"] 67 [→ "\\rightarrow{}" "\\ensuremath{\\rightarrow}"] 68 [⇒ "\\Rightarrow{}" "\\ensuremath{\\Rightarrow}"] 69 [← "\\leftarrow{}" "\\ensuremath{\\leftarrow}"] 70 [⇐ "\\Leftarrow{}" "\\ensuremath{\\Leftarrow}"] 71 [↔ "\\leftrightarrow{}" "\\ensuremath{\\leftrightarrow}"] 72 [⇔ "\\Leftrightarrow{}" "\\ensuremath{\\Leftrightarrow}"] 73 ;; Partially extracted from my .XCompose generator 74 [ñ "\\tilde{n}" "{\\ifmmode\\tilde{n}\\else\\~{n}\\fi}"] 75 [Ñ "\\tilde{N}" "{\\ifmmode\\tilde{N}\\else\\~{N}\\fi}"] 76 [⋆ "\\star{}" "\\ensuremath{\\star}"] 77 [⍣ "\\ddot{\\star}}" "\\ensuremath{\\ddot{\\star}}"] 78 [⃰ "^*" "^*"] 79 [⟨ "\\langle{}" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\langle}}}"] 80 [⟩ "\\rangle{}" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\rangle}}}"] 81 [⋯ "\\cdots{}"] 82 [⋮ "\\vdots{}"] 83 [⋰ "\\iddots{}"] 84 [⋱ "\\ddots{}"] 85 [⧺ "\\mathbin{+\\mkern-6.5mu+}" "\\ensuremath{\\mathbin{+\\mkern-6.5mu+}}"] 86 [∅ "\\emptyset{}" "\\ensuremath{\\emptyset}"] 87 [ı⃗ "\\vec{\\i}}" "\\ensuremath{\\vec{\\i}"] 88 [⊕ "\\oplus{}" "\\ensuremath{\\oplus}"] 89 [⊖ "\\ominus{}" "\\ensuremath{\\ominus}"] 90 [⋓ "\\Cup{}" "\\ensuremath{\\Cup}"] 91 ;[ₗ "\\ensuremath{_{l}}"] 92 [∷ "::"] 93 [Λ "\\Lambda{}" "\\ensuremath{\\Lambda}"] 94 [κ "\\kappa" "\\ensuremath{\\kappa}"] 95 [ι "\\iota" "\\ensuremath{\\iota}"] 96 [ν "\\nu" "\\ensuremath{\\nu}"] 97 [υ "\\upsilon" "\\ensuremath{\\upsilon}"] 98 [ς "\\varsigma" "\\ensuremath{\\varsigma}"] 99 [∀ "\\forall{}"] 100 [∃ "\\exists{}"] 101 [≡ "\\equiv{}"] 102 [≢ "\\not\\equiv{}"] 103 [… "\\ldots{}"] 104 [⋯ "\\cdots{}"] 105 [⋰ "\\uddots{}"] ;; or \iddots from package mathdots, see http://tex.stackexchange.com/a/17650 106 [⋱ "\\ddots{}"] 107 [∌ "\\notni{}"] 108 [ℰ "\\mathcal{E}"] 109 [𝒮 "\\mathcal{S}"] 110 [• "\\bullet{}"] 111 [|'| "{}'"] 112 [′ "{}'"] 113 [″ "{}''"] 114 [‴ "{}'''"] 115 [⁗ "{}''''"] 116 [∪ "\\cup"] 117 [∩ "\\cap"] 118 [⋃ "\\bigcup{}"] 119 [⋂ "\\bigcap{}"] 120 [⋀ "\\bigwedge{}"] 121 [⋁ "\\bigvee{}"] 122 [± "\\pm{}"] 123 [≟ "\\stackrel{?}{=}"] 124 [≛ "\\stackrel{*}{=}"] 125 [≝ "\\stackrel{\\scriptscriptstyle\\mathsf{def}}{=}"] 126 [∃ "\\exists{}" "\\ensuremath{\\exists}"] 127 [⋅ "\\cdot{}" "\\ensuremath{\\cdot}"] 128 [ϱ "\\varrho{}" "\\ensuremath{\\varrho}"] 129 )) 130 (if (string? str) 131 (string-replace* 132 str 133 mathmode? 134 (append more-sym→* sym→*)) 135 str))