0f5e29caa8b27db86fc8a48d282913b92f0f44fa
[chise/omega.git] / chise2otf / elisp / chise-tex.el
1 ;;; chise-tex.el --- Coding-system based chise2otf like tool
2
3 ;; Copyright (C) 2004,2005,2006 MORIOKA Tomohiko
4
5 ;; Author: MORIOKA Tomohiko <tomo@kanji.zinbun.kyoto-u.ac.jp>
6 ;; Keywords: OTF package, pTeX, CHISE, Multiscript, Multilingual
7
8 ;; This file is a part of Omega/CHISE.
9
10 ;; This program is free software; you can redistribute it and/or
11 ;; modify it under the terms of the GNU General Public License as
12 ;; published by the Free Software Foundation; either version 2, or (at
13 ;; your option) any later version.
14
15 ;; This program is distributed in the hope that it will be useful, but
16 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 ;; General Public License for more details.
19
20 ;; You should have received a copy of the GNU General Public License
21 ;; along with this program; see the file COPYING.  If not, write to
22 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23 ;; Boston, MA 02111-1307, USA.
24
25 ;;; Code:
26
27 (defvar chise-tex-coded-charset-expression-alist
28   '((=ucs-bmp@gb        "UCSgb"         4 X)
29     (=ucs-bmp@jis       "UCSjis"        4 X)
30     (=ucs-bmp@ks        "UCSks"         4 X)
31     (=gt-pj-1           "GTpjA"         4 X)
32     (=gt-pj-2           "GTpjB"         4 X)
33     (=gt-pj-3           "GTpjC"         4 X)
34     (=gt-pj-4           "GTpjD"         4 X)
35     (=gt-pj-5           "GTpjE"         4 X)
36     (=gt-pj-6           "GTpjF"         4 X)
37     (=gt-pj-7           "GTpjG"         4 X)
38     (=gt-pj-8           "GTpjH"         4 X)
39     (=gt-pj-9           "GTpjI"         4 X)
40     (=gt-pj-10          "GTpjJ"         4 X)
41     (=gt-pj-11          "GTpjK"         4 X)
42     (=ruimoku-v6        "Ruimoku"       4 X)
43     (=ucs-bmp@cns       "UCScns"        4 X)))
44
45 (defun chise-tex-encode-region-for-gb (start end)
46   (interactive "r")
47   (save-excursion
48     (save-restriction
49       (narrow-to-region start end)
50       (goto-char start)
51       (let (chr ret rest spec)
52         (while (and (skip-chars-forward "\x00-\xFF")
53                     (not (eobp)))
54           (setq chr (char-after))
55           (cond ((memq chr '(?\e$(O#@\e(B))
56                  (delete-char)
57                  (insert (format "\\UCSjis{%04X}"
58                                  (encode-char chr '=ucs@jis)))
59                  )
60                 ((and (setq ret (encode-char chr '=jis-x0208-1983))
61                       (< ret #x3021))
62                  (forward-char))
63                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
64                 ;;  (delete-char)
65                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
66                 ((and (encode-char chr '=ks-x1001)
67                       (setq ret (or (encode-char chr '=ucs@ks)
68                                     (char-ucs chr))))
69                  (delete-char)
70                  ;; (if (eq (char-before) ?\e$B!T\e(B)
71                  ;;     (insert " "))
72                  (insert (format "\\UCSks{%04X}" ret)))
73                 ((catch 'tag
74                    (setq rest chise-tex-coded-charset-expression-alist)
75                    (while (setq spec (car rest))
76                      (if (setq ret (encode-char chr (car spec)))
77                          (throw 'tag ret))
78                      (setq rest (cdr rest))))
79                  (delete-char)
80                  ;; (if (eq (char-before) ?\e$B!T\e(B)
81                  ;;     (insert " "))
82                  (insert (format (format "\\%s{%%0%d%s}"
83                                          (nth 1 spec)
84                                          (nth 2 spec)
85                                          (nth 3 spec))
86                                  ret)))
87                 (t
88                  (forward-char))))))))
89
90 (defun chise-tex-encode-region-for-jis (start end)
91   (interactive "r")
92   (save-excursion
93     (save-restriction
94       (narrow-to-region start end)
95       (goto-char start)
96       (let (chr ret rest spec modifier base modifier-1)
97         (while (and (skip-chars-forward "\x00-\x7F")
98                     (not (eobp)))
99           (setq chr (char-after))
100           (cond ((encode-char chr '=jis-x0208-1983)
101                  (forward-char))
102                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
103                 ;;  (delete-char)
104                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
105                 ((and (not (eq (char-ucs chr) #x0439))
106                       (not (eq (char-ucs chr) #x0451))
107                       (setq ret (char-feature chr '=decomposition))
108                       (setq modifier (assq (nth 1 ret)
109                                            '((?\u0300 . "`")
110                                              (?\u0301 . "'")
111                                              (?\u0302 . "^")
112                                              (?\u0303 . "~")
113                                              (?\u0304 . "=")
114                                              (?\u0306 . "u")
115                                              (?\u0307 . ".")
116                                              (?\u0308 . "\"")
117                                              (?\u0309 . "Hook")
118                                              (?\u030C . "v")
119                                              (?\u0323 . "d")
120                                              (?\u0327 . "c")
121                                              ))))
122                  (delete-char)
123                  (setq base (car ret))
124                  (if (and (setq ret (char-feature base '=decomposition))
125                           (setq modifier-1
126                                 (assq (car modifier)
127                                       (cdr
128                                        (assq (nth 1 ret)
129                                              '((?\u0302
130                                                 (?\u0301 . "CircAcute")
131                                                 (?\u0303 . "CircTilde")
132                                                 (?\u0309 . "CircHook")
133                                                 )
134                                                (?\u0323
135                                                 (?\u0302 . "Circudot")
136                                                 )))))))
137                      (insert (format "\\%s{%c}" (cdr modifier-1) (car ret)))
138                    (insert (format "\\%s{%c}" (cdr modifier) base))))
139                 ((and (or (encode-char chr '=jis-x0213-1-2000)
140                           (encode-char chr '=jis-x0213-2-2000))
141                       (setq ret (or (encode-char chr '=ucs@jis/2000)
142                                     (encode-char chr '=ucs@jis/fw)))
143                       (<= ret #xFFFF))
144                  (delete-char)
145                  ;; (if (eq (char-before) ?\e$B!T\e(B)
146                  ;;     (insert " "))
147                  (insert (format "\\UCSjis{%04X}" ret)))
148                 ((and (encode-char chr '=ks-x1001)
149                       (setq ret (or (encode-char chr '=ucs@ks)
150                                     (char-ucs chr))))
151                  (delete-char)
152                  ;; (if (eq (char-before) ?\e$B!T\e(B)
153                  ;;     (insert " "))
154                  (insert (format "\\UCSks{%04X}" ret)))
155                 ((setq ret (encode-char chr '=ucs-hangul))
156                  (delete-char)
157                  ;; (if (eq (char-before) ?\e$B!T\e(B)
158                  ;;     (insert " "))
159                  (insert (format "\\UCSks{%04X}" ret)))
160                 ((eq chr ?\u00B2)
161                  (delete-char)
162                  (insert "$^2$"))
163                 ((eq chr ?\u00B3)
164                  (delete-char)
165                  (insert "$^3$"))
166                 ((eq chr ?\u0111)
167                  (delete-char)
168                  (insert "{\\usefont{T1}{pxr}{m}{n}\\dj}"))
169                 ((eq chr ?\u014B)
170                  (delete-char)
171                  (insert "{\\usefont{T1}{pxr}{m}{n}\\ng}"))
172                 ((eq chr ?\u0282)
173                  (delete-char)
174                  (insert "{\\usefont{T1}{pxr}{m}{n}\\k{s}}"))
175                 ((eq chr ?\u2022)
176                  (delete-char)
177                  (insert "\\textbullet{}"))
178                 ((eq chr ?\u2083)
179                  (delete-char)
180                  (insert "$_3$"))
181                 ((eq chr ?\u2085)
182                  (delete-char)
183                  (insert "$_5$"))
184                 ((eq chr ?\u0294)
185                  (delete-char)
186                  (insert "\\UCSjis{0294}"))
187                 ((and (encode-char chr '=ucs@jp)
188                       (setq ret (char-representative-of-domain chr 'gb))
189                       (setq ret (encode-char ret '=ucs@gb))
190                       (<= ret #xFFFF))
191                  (delete-char)
192                  ;; (if (eq (char-before) ?\e$B!T\e(B)
193                  ;;     (insert " "))
194                  (insert (format "\\UCSgb{%04X}" ret)))
195                 ((catch 'tag
196                    (setq rest chise-tex-coded-charset-expression-alist)
197                    (while (setq spec (car rest))
198                      (if (setq ret (encode-char chr (car spec)))
199                          (throw 'tag ret))
200                      (setq rest (cdr rest))))
201                  (delete-char)
202                  ;; (if (eq (char-before) ?\e$B!T\e(B)
203                  ;;     (insert " "))
204                  (insert (format (format "\\%s{%%0%d%s}"
205                                          (nth 1 spec)
206                                          (nth 2 spec)
207                                          (nth 3 spec))
208                                  ret)))
209                 (t
210                  (forward-char))))))))
211
212 (defun chise-tex-decode-region (start end)
213   (interactive "r")
214   (save-excursion
215     (save-restriction
216       (narrow-to-region start end)
217       (goto-char start)
218       (let (macro code ret me rest spec)
219         (while (re-search-forward "\\\\\\([a-zA-Z0-9]+\\){\\([0-9A-Fa-f]+\\)}"
220                                   nil t)
221           (setq macro (match-string 1)
222                 code (match-string 2)
223                 me (match-end 0))
224           (if (and (catch 'tag
225                      (setq rest chise-tex-coded-charset-expression-alist)
226                      (while (setq spec (car rest))
227                        (if (string= (nth 1 spec) macro)
228                            (throw 'tag spec))
229                        (setq rest (cdr rest))))
230                    (setq ret (decode-char (car spec)
231                                           (string-to-int
232                                            code
233                                            (if (eq (nth 3 spec) 'X)
234                                                16)))))
235               (progn
236                 (delete-region (match-beginning 0)(match-end 0))
237                 (insert ret))
238             (goto-char me)))))))
239
240 (make-coding-system
241  'iso-2022-jp-tex-gb 'iso2022
242  "ISO-2022-JP with TeX representation for GB fonts."
243  '(charset-g0 ascii
244    short t
245    seven t
246    input-charset-conversion ((latin-jisx0201 ascii)
247                              (japanese-jisx0208-1978 japanese-jisx0208))
248    pre-write-conversion chise-tex-encode-region-for-gb
249    post-read-conversion chise-tex-decode-region
250    mnemonic "pTeX(GB)/7bit"
251    ))
252
253 (make-coding-system
254  'iso-2022-jp-tex-jis 'iso2022
255  "ISO-2022-JP with TeX representation for JIS fonts."
256  '(charset-g0 ascii
257    short t
258    seven t
259    ccs-priority-list (ascii
260                       =jis-x0208@1983 =jis-x0208@1978
261                       latin-jisx0201)
262    pre-write-conversion chise-tex-encode-region-for-jis
263    post-read-conversion chise-tex-decode-region
264    mnemonic "pTeX(JIS)/7bit"
265    ))
266
267
268 ;;; @ End.
269 ;;;
270
271 (provide 'chise-tex)
272
273 ;;; chise-tex.el ends here