diff --git a/dollar.rkt b/dollar.rkt index 588ab4bd6..11efec7ed 100644 --- a/dollar.rkt +++ b/dollar.rkt @@ -6,7 +6,9 @@ scribble/latex-properties scriblib/render-cond racket/runtime-path - setup/collects) + setup/collects + "katex-convert-unicode.rkt" + racket/list) (provide $ $$ @@ -190,13 +192,15 @@ EOTEX (make-element math-inline-style-mathjax `("$" ,@strs "$"))) (define ($-katex strs) - (make-element math-inline-style-katex strs)) + (make-element math-inline-style-katex + (map katex-convert-unicode (flatten strs)))) (define ($$-mathjax strs) (make-element math-display-style-mathjax `("\\[" ,@strs "\\]"))) (define ($$-katex strs) - (make-element math-display-style-katex strs)) + (make-element math-display-style-katex + (map katex-convert-unicode (flatten strs)))) (define $-html-handler (make-parameter $-katex)) (define $$-html-handler (make-parameter $$-katex)) diff --git a/katex-convert-unicode.rkt b/katex-convert-unicode.rkt new file mode 100644 index 000000000..4cf79849b --- /dev/null +++ b/katex-convert-unicode.rkt @@ -0,0 +1,95 @@ +#lang racket/base +(require racket/string) + +(provide katex-convert-unicode) + +(define (literal-alternatives→regexp literal-alternatives) + (string-append "(" + (string-join (map regexp-quote literal-alternatives) "|") + ")")) + +(define (string-replace* str sym→*) + (define →* (map (λ (x) + (cons (symbol->string (car x)) + (cadr x))) + sym→*)) + (define hash→* (make-immutable-hash →*)) + (regexp-replace* (literal-alternatives→regexp (map car →*)) + str + (λ (found . _) + (hash-ref hash→* found)))) + +(define (katex-convert-unicode str) + (if (string? str) + (string-replace* + str + '([₀ "_0"] + [₁ "_1"] + [₂ "_2"] + [₃ "_3"] + [₄ "_4"] + [₅ "_5"] + [₆ "_6"] + [₇ "_7"] + [₈ "_8"] + [₉ "_9"] + [ᵢ "_i"] + [ⱼ "_j"] + [ₖ "_k"] + [ₗ "_l"] + [ₘ "_m"] + [ₙ "_n"] + [ₒ "_o"] + [⁰ "^0"] + [¹ "^1"] + [² "^2"] + [³ "^3"] + [⁴ "^4"] + [⁵ "^5"] + [⁶ "^6"] + [⁷ "^7"] + [⁸ "^8"] + [⁹ "^9"] + [ⁱ "^i"] + [ʲ "^j"] + [ᵏ "^k"] + [ˡ "^l"] + [ᵐ "^m"] + [ⁿ "^n"] + [ᵒ "^o"] + [⊆ "\\subseteq" "\\ensuremath{\\subseteq}"] + [⊂ "\\subset" "\\ensuremath{\\subset}"] + [⊇ "\\supseteq" "\\ensuremath{\\supseteq}"] + [⊃ "\\supset" "\\ensuremath{\\supset}"] + [→ "\\rightarrow" "\\ensuremath{\\rightarrow}"] + [⇒ "\\Rightarrow" "\\ensuremath{\\Rightarrow}"] + [← "\\leftarrow" "\\ensuremath{\\leftarrow}"] + [⇐ "\\Leftarrow" "\\ensuremath{\\Leftarrow}"] + [↔ "\\leftrightarrow" "\\ensuremath{\\leftrightarrow}"] + [⇔ "\\Leftrightarrow" "\\ensuremath{\\Leftrightarrow}"] + ;; Partially extracted from my .XCompose generator + [ñ "\\tilde{n}" "{\\ifmmode\\tilde{n}\\else\\~{n}\\fi}"] + [Ñ "\\tilde{N}" "{\\ifmmode\\tilde{N}\\else\\~{N}\\fi}"] + [⋆ "\\star" "\\ensuremath{\\star}"] + [⍣ "\\ddot{\\star}}" "\\ensuremath{\\ddot{\\star}}"] + [⃰ "^*" "^*"] + [⟨ "\\langle" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\langle}}}"] + [⟩ "\\rangle" "\\ensuremath{\\mathsmaller{\\raisemath{.15ex}{\\rangle}}}"] + [⋯ "\\cdots"] + [⋮ "\\vdots"] + [⋰ "\\iddots"] + [⋱ "\\ddots"] + [⧺ "\\mathbin{+\\mkern-6.5mu+}" "\\ensuremath{\\mathbin{+\\mkern-6.5mu+}}"] + [∅ "\\emptyset" "\\ensuremath{\\emptyset}"] + [ı⃗ "\\vec{\\i}}" "\\ensuremath{\\vec{\\i}"] + [⊕ "\\oplus" "\\ensuremath{\\oplus}"] + [⊖ "\\ominus" "\\ensuremath{\\ominus}"] + [⋓ "\\Cup" "\\ensuremath{\\Cup}"] + ;[ₗ "\\ensuremath{_{l}}"] + [∷ "::"] + [Λ "\\Lambda" "\\ensuremath{\\Lambda}"] + [∀ "\\forall"] + [∃ "\\exists"] + [≡ "\\equiv"] + [≢ "\not\\equiv"])) + str)) \ No newline at end of file