1 ;;; latin-ltx.el --- Quail package for TeX-style input -*-coding: utf-8;-*-
3 ;; Copyright (C) 2001-2015 Free Software Foundation, Inc.
4 ;; Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
6 ;; National Institute of Advanced Industrial Science and Technology (AIST)
7 ;; Registration Number H14PRO021
9 ;; Author: TAKAHASHI Naoto <ntakahas@m17n.org>
10 ;; Dave Love <fx@gnu.org>
11 ;; Keywords: multilingual, input, Greek, i18n
13 ;; This file is part of GNU Emacs.
15 ;; GNU Emacs is free software: you can redistribute it and/or modify
16 ;; it under the terms of the GNU General Public License as published by
17 ;; the Free Software Foundation, either version 3 of the License, or
18 ;; (at your option) any later version.
20 ;; GNU Emacs is distributed in the hope that it will be useful,
21 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
22 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 ;; GNU General Public License for more details.
25 ;; You should have received a copy of the GNU General Public License
26 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
36 "LaTeX-like input method for many characters.
37 These characters are from the charsets used by the `utf-8' coding
38 system, including many technical ones. Examples:
39 \\\\='a -> á \\\\=`{a} -> à
40 \\pi -> π \\int -> ∫ ^1 -> ¹"
42 '(("\t" . quail-completion))
43 t t nil nil nil nil nil nil nil t)
48 (defconst latin-ltx--mark-map
54 ;; ("HOOK ABOVE" . ??)
61 ("DOUBLE ACUTE" . "H")
64 (defconst latin-ltx--mark-re (regexp-opt (mapcar #'car latin-ltx--mark-map)))
66 (defun latin-ltx--ascii-p (char)
67 (and (characterp char) (< char 128)))
69 (defmacro latin-ltx--define-rules (&rest rules)
74 (`(,_ ,(pred characterp)) (push rule newrules)) ;; Normal quail rule.
78 (dolist (pair (ucs-names))
79 (let ((name (car pair))
81 (when (and (characterp char) ;; Ignore char-ranges.
82 (string-match re name))
83 (let ((keys (if (stringp seq)
84 (replace-match seq nil nil name)
85 (funcall seq name char))))
88 (setq count (1+ count))
89 (push (list x char) newrules))
90 (setq count (1+ count))
91 (push (list keys char) newrules))))))
92 ;; (message "latin-ltx: %d mappings for %S" count re)
94 (setq newrules (delete-dups newrules))
95 (let ((rules (copy-sequence newrules)))
97 (let ((rule (pop rules)))
98 (when (assoc (car rule) rules)
99 (let ((conflicts (list (cadr rule)))
102 (while (setq c (assoc (car rule) tail))
103 (push (cadr c) conflicts)
104 (setq tail (cdr (memq c tail)))
105 (setq rules (delq c rules)))
106 (message "Conflict for %S: %S"
107 (car rule) (apply #'string conflicts)))))))
108 (let ((inputs (mapcar #'car newrules)))
109 (setq inputs (delete-dups inputs))
110 (message "latin-ltx: %d rules (+ %d conflicts)!"
111 (length inputs) (- (length newrules) (length inputs))))
112 `(quail-define-rules ,@(nreverse newrules)))))
114 (latin-ltx--define-rules
116 ("\\pounds" ?£) ;; ("{\\pounds}" ?£)
117 ("\\S" ?§) ;; ("{\\S}" ?§)
119 ("$\\pm$" ?±) ("\\pm" ?±)
122 ("\\P" ?¶) ;; ("{\\P}" ?¶)
123 ;; Fixme: Yudit has the equivalent of ("\\cdot" ?⋅), for U+22C5, DOT
124 ;; OPERATOR, whereas · is MIDDLE DOT. JadeTeX translates both to
126 ("$\\cdot$" ?·) ("\\cdot" ?·)
132 (let* ((c (if (match-end 1)
133 (downcase (match-string 2 name))
134 (match-string 2 name)))
135 (mark1 (cdr (assoc (match-string 3 name) latin-ltx--mark-map)))
136 (mark2 (if (match-end 4)
137 (cdr (assoc (match-string 4 name) latin-ltx--mark-map))))
138 (marks (if mark2 (concat mark1 "\\" mark2) mark1)))
140 (cons (format "\\%s{%s}" marks c)
141 ;; Exclude "d" because we use "\\dh" for something else.
142 (unless (member (or mark2 mark1) '("d"));; "k"
143 (list (format "\\%s%s" marks c))))))
144 (concat "\\`LATIN \\(?:CAPITAL\\|SMAL\\(L\\)\\) LETTER \\(.\\) WITH \\("
145 latin-ltx--mark-re "\\)\\(?: AND \\("
146 latin-ltx--mark-re "\\)\\)?\\'"))
149 (let* ((mark (cdr (assoc (match-string 1 name) latin-ltx--mark-map))))
151 (list (format "\\%s" mark))))
152 (concat "\\`COMBINING \\(" latin-ltx--mark-re "\\)\\(?: ACCENT\\)?\\'"))
155 (unless (latin-ltx--ascii-p char)
156 (let* ((mark (cdr (assoc (match-string 1 name) latin-ltx--mark-map))))
158 (list (format "\\%s{}" mark)))))
159 (concat "\\`\\(?:SPACING \\)?\\(" latin-ltx--mark-re "\\)\\(?: ACCENT\\)?\\'"))
161 ("\\AA" ?Å) ;; ("{\\AA}" ?Å)
162 ("\\AE" ?Æ) ;; ("{\\AE}" ?Æ)
164 ("$\\times$" ?×) ("\\times" ?×)
165 ("\\O" ?Ø) ;; ("{\\O}" ?Ø)
166 ("\\ss" ?ß) ;; ("{\\ss}" ?ß)
168 ("\\aa" ?å) ;; ("{\\aa}" ?å)
169 ("\\ae" ?æ) ;; ("{\\ae}" ?æ)
171 ("$\\div$" ?÷) ("\\div" ?÷)
172 ("\\o" ?ø) ;; ("{\\o}" ?ø)
178 ("\\i" ?ı) ;; ("{\\i}" ?ı)
181 ("\\L" ?Ł) ;; ("{\\L}" ?Ł)
182 ("\\l" ?ł) ;; ("{\\l}" ?ł)
186 ("\\U{o}" ?ő) ("\\Uo" ?ő) ;; FIXME: Was it just a typo?
188 ("\\OE" ?Œ) ;; ("{\\OE}" ?Œ)
189 ("\\oe" ?œ) ;; ("{\\oe}" ?œ)
193 ("\\={\\AE}" ?Ǣ) ("\\=\\AE" ?Ǣ)
194 ("\\={\\ae}" ?ǣ) ("\\=\\ae" ?ǣ)
197 ("\\'{\\AE}" ?Ǽ) ("\\'\\AE" ?Ǽ)
198 ("\\'{\\ae}" ?ǽ) ("\\'\\ae" ?ǽ)
199 ("\\'{\\O}" ?Ǿ) ("\\'\\O" ?Ǿ)
200 ("\\'{\\o}" ?ǿ) ("\\'\\o" ?ǿ)
208 (let* ((base (concat (match-string 1 name) (match-string 3 name)))
209 (basechar (cdr (assoc base (ucs-names)))))
210 (when (latin-ltx--ascii-p basechar)
211 (string (if (match-end 2) ?^ ?_) basechar))))
212 "\\(.*\\)SU\\(?:B\\|\\(PER\\)\\)SCRIPT \\(.*\\)")
214 ((lambda (name _char)
215 (let* ((basename (match-string 2 name))
216 (name (if (match-end 1) (capitalize basename) (downcase basename))))
217 (concat "^" (if (> (length name) 1) "\\") name)))
218 "\\`MODIFIER LETTER \\(?:SMALL\\|CAPITA\\(L\\)\\) \\([[:ascii:]]+\\)\\'")
220 ;; ((lambda (name char) (format "^%s" (downcase (match-string 1 name))))
221 ;; "\\`MODIFIER LETTER SMALL \\(.\\)\\'")
222 ;; ("^\\1" "\\`MODIFIER LETTER CAPITAL \\(.\\)\\'")
232 ;; FIXME: Provides some useful entries (yen, euro, copyright, registered,
233 ;; currency, minus, micro), but also a lot of dubious ones.
235 (unless (or (latin-ltx--ascii-p char)
236 ;; We prefer COMBINING LONG SOLIDUS OVERLAY for \not.
237 (member name '("NOT SIGN")))
238 (concat "\\" (downcase (match-string 1 name)))))
239 "\\`\\([^- ]+\\) SIGN\\'")
242 (concat "\\" (funcall (if (match-end 1) #' capitalize #'downcase)
243 (match-string 2 name))))
244 "\\`GREEK \\(?:SMALL\\|CAPITA\\(L\\)\\) LETTER \\([^- ]+\\)\\'")
256 ("\\Leftrightarrow" ?⇔)
259 ("\\Longleftarrow" ?⇐)
260 ("\\Longleftrightarrow" ?⇔)
261 ("\\Longrightarrow" ?⇒)
295 ("\\bigtriangledown" ?▽)
296 ("\\bigtriangleup" ?△)
299 ("\\blacklozenge" ?✦)
301 ("\\blacktriangle" ?▴)
302 ("\\blacktriangledown" ?▾)
303 ("\\blacktriangleleft" ?◂)
304 ("\\blacktriangleright" ?▸)
319 ("\\circlearrowleft" ?↺)
320 ("\\circlearrowright" ?↻)
337 ("\\curvearrowleft" ?↶)
338 ("\\curvearrowright" ?↷)
349 ("\\divideontimes" ?⋇)
355 ("\\downdownarrows" ?⇊)
356 ("\\downleftharpoon" ?⇃)
357 ("\\downrightharpoon" ?⇂)
366 ("\\fallingdotseq" ?≒)
407 ("\\hookleftarrow" ?↩)
408 ("\\hookrightarrow" ?↪)
415 ("\\langle" ?⟨) ;; Was ?〈, see bug#12948.
423 ("\\leftarrowtail" ?↢)
424 ("\\leftharpoondown" ?↽)
425 ("\\leftharpoonup" ?↼)
426 ("\\leftleftarrows" ?⇇)
427 ;; ("\\leftparengtr" ?〈), see bug#12948.
428 ("\\leftrightarrow" ?↔)
429 ("\\leftrightarrows" ?⇆)
430 ("\\leftrightharpoons" ?⇋)
431 ("\\leftrightsquigarrow" ?↭)
432 ("\\leftthreetimes" ?⋋)
451 ("\\longleftarrow" ?←)
452 ("\\longleftrightarrow" ?↔)
454 ("\\longrightarrow" ?→)
455 ("\\looparrowleft" ?↫)
456 ("\\looparrowright" ?↬)
464 ("\\measuredangle" ?∡)
471 ("\\nLeftrightarrow" ?⇎)
492 ("\\nleftrightarrow" ?↮)
498 ("\\not" ?̸) ;FIXME: conflict with "NOT SIGN" ¬.
505 ("\\nshortparallel" ?∦)
516 ("\\ntriangleleft" ?⋪)
517 ("\\ntrianglelefteq" ?⋬)
518 ("\\ntriangleright" ?⋫)
519 ("\\ntrianglerighteq" ?⋭)
545 ("\\rangle" ?⟩) ;; Was ?〉, see bug#12948.
551 ("\\rightarrowtail" ?↣)
552 ("\\rightharpoondown" ?⇁)
553 ("\\rightharpoonup" ?⇀)
554 ("\\rightleftarrows" ?⇄)
555 ("\\rightleftharpoons" ?⇌)
556 ;; ("\\rightparengtr" ?⦔) ;; Was ?〉, see bug#12948.
557 ("\\rightrightarrows" ?⇉)
558 ("\\rightthreetimes" ?⋌)
559 ("\\risingdotseq" ?≓)
566 ("\\shortparallel" ?∥)
570 ("\\smallsetminus" ?∖)
574 ("\\sphericalangle" ?∢)
582 ("\\squigarrowright" ?⇝)
611 ("\\triangledown" ?▿)
612 ("\\triangleleft" ?◃)
613 ("\\trianglelefteq" ?⊴)
615 ("\\triangleright" ?▹)
616 ("\\trianglerighteq" ?⊵)
617 ("\\twoheadleftarrow" ?↞)
618 ("\\twoheadrightarrow" ?↠)
622 ("\\upleftharpoon" ?↿)
624 ("\\uprightharpoon" ?↾)
631 (concat "\\var" (downcase (match-string 1 name))))
632 "\\`GREEK \\([^- ]+\\) SYMBOL\\'")
636 ("\\varsigma" ?ς) ;FIXME: Looks reversed with the non\var.
637 ("\\vartriangleleft" ?⊲)
638 ("\\vartriangleright" ?⊳)
648 ("\\Bbb{N}" ?ℕ) ; AMS commands for blackboard bold
649 ("\\Bbb{P}" ?ℙ) ; Also sometimes \mathbb.
654 ;; We used to use ~ for NBSP but that's inconvenient and may even look like
655 ;; a bug where the user finds his ~ key doesn't insert a ~ any more.
658 ("\\mathscr{I}" ?ℐ) ; moment of inertia
664 ;; Probably not useful enough:
665 ;; ("\\Telefon" ?☎) ; there are other possibilities
666 ;; ("\\Radioactivity" ?☢)
667 ;; ("\\Biohazard" ?☣)
670 ;; ("\\Lightning" ?☇)
679 ;; ("\\Writinghand" ?✍)
688 ("\\ordmasculine" ?º)
691 ;; by analogy with lq, rq:
694 ("\\defs" ?≙) ; per fuzz/zed
696 ("\\llbracket" ?\〚) ; stmaryrd
698 ;; ("\\lbag" ?\〚) ; fuzz
700 ("\\ldata" ?\《) ; fuzz/zed
702 ;; From Karl Eichwalder.
705 ("\\glqq" ?„) ("\\\"`" ?„)
706 ("\\grqq" ?“) ("\\\"'" ?“)
709 ("\\flqq" ?\«) ("\\\"<" ?\«)
710 ("\\frqq" ?\») ("\\\">" ?\»)
712 ("\\-" ?) ;; soft hyphen
715 ("\\textfractionsolidus" ?⁄)
716 ("\\textbigcircle" ?⃝)
717 ("\\textmusicalnote" ?♪)
719 ("\\textcolonmonetary" ?₡)
725 ("\\textinterrobang" ?‽)
726 ("\\textpertenthousand" ?‱)
729 ("\\textdiscount" ?⁒)
730 ("\\textestimated" ?℮)
731 ("\\textopenbullet" ?◦)
734 ("\\textcircledP" ?℗)
735 ("\\textreferencemark" ?※)
738 ;;; latin-ltx.el ends here