Add unicode's mathematical alphabets to TeX input method

* lisp/leim/quail/latin-ltx.el: Add math "alphabets" that can be matched
with simple regexps; a few others are added by hand.  There are 13
variants: bf, it, bfit, bb, scr, bfscr, frak, bffrak, sf, bfsf, sfit,
bfsfit, and tt.
This commit is contained in:
Leo C. Stein 2025-10-13 22:38:39 -05:00 committed by Eli Zaretskii
parent b1f7d6254a
commit 4de7ddc837

View file

@ -66,6 +66,22 @@ system, including many technical ones. Examples:
(defun latin-ltx--ascii-p (char)
(and (characterp char) (< char 128)))
;; For mathematical alphabets
(defconst latin-ltx--math-variant-prefix-map
'(("BOLD" . "bf")
("ITALIC" . "it")
("BOLD ITALIC" . "bfit")
("DOUBLE-STRUCK" . "bb")
("SCRIPT" . "scr")
("BOLD SCRIPT" . "bfscr")
("FRAKTUR" . "frak")
("BOLD FRAKTUR" . "bffrak")
("SANS-SERIF" . "sf")
("SANS-SERIF BOLD" . "bfsf")
("SANS-SERIF ITALIC" . "sfit")
("SANS-SERIF BOLD ITALIC" . "bfsfit")
("MONOSPACE" . "tt")))
(defmacro latin-ltx--define-rules (&rest rules)
(load "uni-name" nil t)
(let ((newrules ()))
@ -742,6 +758,77 @@ system, including many technical ones. Examples:
("\\wp" ?℘)
("\\wr" ?≀)
;;;; Mathematical alphabets
;; Latin letters
((lambda (name _char)
(let* ((variant (match-string 1 name))
(prefix (cdr (assoc variant latin-ltx--math-variant-prefix-map)))
(basename (match-string 3 name))
(name (if (match-end 2) (capitalize basename) (downcase basename))))
(concat "\\" prefix name)))
"\\`MATHEMATICAL \\(.+\\) \\(?:SMALL\\|CAPITA\\(L\\)\\) \\([[:ascii:]]+\\)\\'")
;; Digits
((lambda (name _char)
(let* ((variant (match-string 1 name))
(prefix (cdr (assoc variant latin-ltx--math-variant-prefix-map)))
(basename (match-string 2 name)))
(concat "\\" prefix (char-to-string (char-from-name basename)))))
"\\`MATHEMATICAL \\(.+\\) \\(DIGIT [[:ascii:]]+\\)\\'")
;; Some Greek variants
;; NOTE: Check if any of these are reversed from their counterparts, like
;; the claim above of \phi and \varphi being swapped
((lambda (name _char)
(let* ((variant (match-string 1 name))
(prefix (cdr (assoc variant latin-ltx--math-variant-prefix-map)))
(basename (downcase (match-string 2 name))))
(if prefix ;; This avoids e.g. MATHEMATICAL BOLD CAPITAL <greek> SYMBOL
(concat "\\" prefix "var" basename))))
"\\`MATHEMATICAL \\(.+\\) \\([A-Z]+\\) SYMBOL\\'")
((lambda (name _char)
(let* ((variant (match-string 1 name))
(prefix (cdr (assoc variant latin-ltx--math-variant-prefix-map)))
(basename (if (match-end 2) "partial" "nabla")))
(concat "\\" prefix basename)))
"\\`MATHEMATICAL \\(.*\\) \\(?:NABLA\\|PARTIAL DIFFERENTIA\\(L\\)\\)\\'")
;; Some of the math alphabet characters have other canonical names and must be
;; added manually
("\\scrB" ?)
("\\scrE" ?)
("\\scrF" ?)
("\\scrH" ?)
("\\scrI" ?)
("\\scrL" ?)
("\\scrM" ?)
("\\scrR" ?)
("\\frakC" ?)
("\\frakH" ?)
("\\frakI" ?)
("\\frakR" ?)
("\\frakZ" ?)
("\\bbC" ?)
("\\bbH" ?)
("\\bbN" ?)
("\\bbP" ?)
("\\bbQ" ?)
("\\bbR" ?)
("\\bbZ" ?)
("\\ith" ?)
("\\scre" ?)
("\\scrg" ?)
("\\scro" ?)
("\\bbsum" ?⅀)
("\\bbSigma" ?⅀)
("\\bbgamma" ?)
("\\bbGamma" ?ℾ)
("\\bbprod" ?ℿ)
("\\bbPi" ?ℿ)
("\\bbpi" ?ℼ)
("\\Bbb{A}" ?𝔸) ; AMS commands for blackboard bold
("\\Bbb{B}" ?𝔹) ; Also sometimes \mathbb.
("\\Bbb{C}" ?)