New file.
[chise/omega.git] / chise2otf / elisp / chise-tex.el
1 (defvar chise-tex-coded-charset-expression-alist
2   '((=ucs@gb    "UCSgb"         4 X)
3     (=ucs@jis   "UCSjis"        4 X)
4     (=gt-pj-1   "GTpj1"         4 X)
5     (=gt-pj-2   "GTpj2"         4 X)
6     (=gt-pj-3   "GTpj3"         4 X)
7     (=gt-pj-4   "GTpj4"         4 X)
8     (=gt-pj-5   "GTpj5"         4 X)
9     (=gt-pj-6   "GTpj6"         4 X)
10     (=gt-pj-7   "GTpj7"         4 X)
11     (=gt-pj-8   "GTpj8"         4 X)
12     (=gt-pj-9   "GTpj9"         4 X)
13     (=gt-pj-10  "GTpj10"        4 X)
14     (=gt-pj-11  "GTpj11"        4 X)
15     (=ucs@ks    "UCSks"         4 X)
16     (=ucs@cns   "UCScns"        4 X)))
17
18 (defun chise-tex-encode-region (start end)
19   (interactive "r")
20   (save-excursion
21     (save-restriction
22       (narrow-to-region start end)
23       (goto-char start)
24       (let (chr ret rest spec)
25         (while (and (skip-chars-forward "\x00-\xFF")
26                     (not (eobp)))
27           (setq chr (char-after))
28           (cond ((memq chr '(?\e$(O#@\e(B))
29                  (delete-char)
30                  (insert (format "\\UCSjis{%04X}"
31                                  (encode-char chr '=ucs@jis)))
32                  )
33                 ((and (setq ret (encode-char chr '=jis-x0208-1983))
34                       (< ret #x3021))
35                  (forward-char))
36                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
37                 ;;  (delete-char)
38                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
39                 ((catch 'tag
40                    (setq rest chise-tex-coded-charset-expression-alist)
41                    (while (setq spec (car rest))
42                      (if (setq ret (encode-char chr (car spec)))
43                          (throw 'tag ret))
44                      (setq rest (cdr rest))))
45                  (delete-char)
46                  ;; (if (eq (char-before) ?\e$B!T\e(B)
47                  ;;     (insert " "))
48                  (insert (format (format "\\%s{%%0%d%s}"
49                                          (nth 1 spec)
50                                          (nth 2 spec)
51                                          (nth 3 spec))
52                                  ret)))
53                 (t
54                  (forward-char))))))))
55
56 (defun chise-tex-decode-region (start end)
57   (interactive "r")
58   (save-excursion
59     (save-restriction
60       (narrow-to-region start end)
61       (goto-char start)
62       (let (macro code ret ms me)
63         (while (re-search-forward "\\\\\\([a-zA-Z0-9]+\\){\\([0-9A-Fa-f]+\\)}"
64                                   nil t)
65           (setq macro (match-string 1)
66                 code (match-string 2)
67                 ms (match-beginning 0)
68                 me (match-end 0))
69           (if (and (catch 'tag
70                      (setq rest chise-tex-coded-charset-expression-alist)
71                      (while (setq spec (car rest))
72                        (if (string= (nth 1 spec) macro)
73                            (throw 'tag spec))
74                        (setq rest (cdr rest))))
75                    (setq ret (decode-char (car spec)
76                                           (string-to-int
77                                            code
78                                            (if (eq (nth 3 spec) 'X)
79                                                16)))))
80               (progn
81                 (delete-region (match-beginning 0)(match-end 0))
82                 (insert ret))
83             (goto-char me)))))))
84
85 (make-coding-system
86  'iso-2022-jp-tex 'iso2022
87  "ISO-2022-JP with TeX representation."
88  '(charset-g0 ascii
89    short t
90    seven t
91    input-charset-conversion ((latin-jisx0201 ascii)
92                              (japanese-jisx0208-1978 japanese-jisx0208))
93    pre-write-conversion chise-tex-encode-region
94    post-read-conversion chise-tex-decode-region
95    mnemonic "pTeX/7bit"
96    ))