update.
[chise/uptex-chise.git] / elisp / chise-tex.el
1 ;;; chise-tex.el --- Coding-system based chise2otf like tool
2
3 ;; Copyright (C) 2004,2005,2006,2007,2008,2009,2010 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 (defun decompose-char (char)
28   (let (ret dest)
29     (while (setq ret (char-feature char '=decomposition))
30       (setq dest
31             (if (cddr ret)
32                 (append (cdr ret) dest)
33               (cons (nth 1 ret) dest))
34             char (car ret)))
35     (if dest
36         (cons char dest)
37       char)))
38
39 (defvar chise-tex-coded-charset-expression-alist
40   '((=adobe-japan1-6    "AdobeJP"       5 d)
41     (=ucs-bmp@gb        "UCSgb"         4 X)
42     (=ucs-bmp@jis       "UCSjis"        4 X)
43     (=ucs-bmp@ks        "UCSks"         4 X)
44     ;; (=ucs-sip-ext-b     "ucsSIP"        4 X)
45     ;; (=ucs-sip-ext-b@iso "ucsSIP"        4 X)
46     (=gt-pj-1           "GTpjA"         4 X)
47     (=gt-pj-2           "GTpjB"         4 X)
48     (=gt-pj-3           "GTpjC"         4 X)
49     (=gt-pj-4           "GTpjD"         4 X)
50     (=gt-pj-5           "GTpjE"         4 X)
51     (=gt-pj-6           "GTpjF"         4 X)
52     (=gt-pj-7           "GTpjG"         4 X)
53     (=gt-pj-8           "GTpjH"         4 X)
54     (=gt-pj-9           "GTpjI"         4 X)
55     (=gt-pj-10          "GTpjJ"         4 X)
56     (=gt-pj-11          "GTpjK"         4 X)
57     (=ruimoku-v6        "Ruimoku"       4 X)
58     (=hanziku-1         "HanzikuA"      4 X)
59     (=hanziku-2         "HanzikuB"      4 X)
60     (=hanziku-3         "HanzikuC"      4 X)
61     (=hanziku-4         "HanzikuD"      4 X)
62     (=hanziku-5         "HanzikuE"      4 X)
63     (=hanziku-6         "HanzikuF"      4 X)
64     (=hanziku-7         "HanzikuG"      4 X)
65     (=hanziku-8         "HanzikuH"      4 X)
66     (=hanziku-9         "HanzikuI"      4 X)
67     (=hanziku-10        "HanzikuJ"      4 X)
68     (=hanziku-11        "HanzikuK"      4 X)
69     (=hanziku-12        "HanzikuL"      4 X)
70     (=ucs-bmp@cns       "UCScns"        4 X)
71     (thai-tis620        "ThaiTIS"       2 X)
72     ))
73
74 (defvar chise-tex-accents-macro-alist
75   '((?\u0300 . "`") ; <COMBINING GRAVE ACCENT>
76     (?\u0301 . "'") ; <COMBINING ACUTE ACCENT>
77     (?\u0302 . "^") ; <COMBINING CIRCUMFLEX ACCENT>
78     ((?\u0302 ?\u0300) . "CircGrave")
79     ((?\u0302 ?\u0301) . ("\\'{\\^" . "}"))
80     ((?\u0302 ?\u0303) . ("\\~{\\^" . "}"))
81     ((?\u0302 ?\u0309) . "CircHook")
82     (?\u0303 . "~") ; <COMBINING TILDE>
83     (?\u0304 . "=") ; <COMBINING MACRON>
84     ((?\u0304 ?\u0301) . "textacutemacron")
85     (?\u0306 . "u") ; <COMBINING BREVE>
86     (?\u0307 . ".") ; <COMBINING DOT ABOVE>
87     (?\u0308 . "\"") ; <COMBINING DIAERESIS>
88     (?\u0309 . "Hook")
89     (?\u030B . "H") ; <COMBINING DOUBLE ACUTE ACCENT>
90     (?\u030C . "v") ; <COMBINING CARON>
91     (?\u031B . "Horn") ; <COMBINING HORN>
92     ((?\u031B ?\u0301) . "HornAcute")
93     ((?\u031B ?\u0303) . "HornTilde")
94     (?\u0323 . "d") ; <COMBINING DOT BELOW>
95     ((?\u0323 ?\u0302) . "Circudot")
96     (?\u0327 . "c") ; <COMBINING CEDILLA>
97     (?\u0328 . "k") ; <COMBINING OGONEK>
98     (?\u032E . "ubreve")
99     (?\u0331 . "umacron")
100     ))
101
102 (defun chise-tex-encode-region-for-gb (start end)
103   (interactive "r")
104   (save-excursion
105     (save-restriction
106       (narrow-to-region start end)
107       (goto-char start)
108       (let (chr ret rest spec)
109         (while (and (skip-chars-forward "\x00-\xFF")
110                     (not (eobp)))
111           (setq chr (char-after))
112           (cond ((memq chr '(?\e$(O#@\e(B))
113                  (delete-char)
114                  (insert (format "\\UCSjis{%04X}"
115                                  (encode-char chr '=ucs@jis)))
116                  )
117                 ((and (setq ret (encode-char chr '=jis-x0208-1983))
118                       (< ret #x3021))
119                  (forward-char))
120                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
121                 ;;  (delete-char)
122                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
123                 ((and (encode-char chr '=ks-x1001)
124                       (setq ret (or (encode-char chr '=ucs@ks)
125                                     (char-ucs chr))))
126                  (delete-char)
127                  ;; (if (eq (char-before) ?\e$B!T\e(B)
128                  ;;     (insert " "))
129                  (insert (format "\\UCSks{%04X}" ret)))
130                 ((catch 'tag
131                    (setq rest chise-tex-coded-charset-expression-alist)
132                    (while (setq spec (car rest))
133                      (if (setq ret (encode-char chr (car spec)))
134                          (throw 'tag ret))
135                      (setq rest (cdr rest))))
136                  (delete-char)
137                  ;; (if (eq (char-before) ?\e$B!T\e(B)
138                  ;;     (insert " "))
139                  (insert (format (format "\\%s{%%0%d%s}"
140                                          (nth 1 spec)
141                                          (nth 2 spec)
142                                          (nth 3 spec))
143                                  ret)))
144                 (t
145                  (forward-char))))))))
146
147 (defun chise-tex-encode-ucs-char-at-point (&optional chr)
148   (unless chr
149     (setq chr (char-after)))
150   (let (ret rest spec)
151     (cond
152      ((setq ret (encode-char chr '=adobe-japan1-6))
153       (delete-char)
154       ;; (if (eq (char-before) ?\e$B!T\e(B)
155       ;;     (insert " "))
156       (insert (format "\\AdobeJP{%05d}" ret))
157       t)
158      ((and (encode-char chr '=ks-x1001)
159            (setq ret (or (encode-char chr '=ucs@ks)
160                          (char-ucs chr))))
161       (delete-char)
162       ;; (if (eq (char-before) ?\e$B!T\e(B)
163       ;;     (insert " "))
164       (insert (format "\\UCSks{%04X}" ret))
165       t)
166      ((setq ret (encode-char chr '=ucs-hangul))
167       (delete-char)
168       ;; (if (eq (char-before) ?\e$B!T\e(B)
169       ;;     (insert " "))
170       (insert (format "\\UCSks{%04X}" ret))
171       t)
172      ((eq chr ?\u00B2)
173       (delete-char)
174       (insert "$^2$")
175       t)
176      ((eq chr ?\u00B3)
177       (delete-char)
178       (insert "$^3$")
179       t)
180      ((eq chr ?\u00F8)
181       (delete-char)
182       (insert "\\o{}")
183       t)
184      ((eq chr ?\u0111)
185       (delete-char)
186       (insert "{\\usefont{T1}{pxr}{m}{n}\\dj}")
187       t)
188      ((eq chr ?\u0131)
189       (delete-char)
190       (insert "\\i{}")
191       t)
192      ((eq chr ?\u0142)
193       (delete-char)
194       (insert "\\l{}")
195       t)
196      ((eq chr ?\u014B)
197       (delete-char)
198       ;; (insert "{\\usefont{T1}{pxr}{m}{n}\\ng}")
199       (insert "\\LATINeng{}")
200       t)
201      ((eq chr ?\u0250)
202       (delete-char)
203       (insert "\\textturna{}")
204       t)
205      ((eq chr ?\u0251)
206       (delete-char)
207       (insert "\\textscripta{}")
208       t)
209      ((eq chr ?\u0254)
210       (delete-char)
211       (insert "\\textopeno{}")
212       t)
213      ((eq chr ?\u025B)
214       (delete-char)
215       (insert "\\IPAepsilon{}")
216       t)
217      ((eq chr ?\u0264)
218       (delete-char)
219       (insert "\\textramshorns{}")
220       t)
221      ((eq chr ?\u0269)
222       (delete-char)
223       (insert "\\IPAiota{}")
224       t)
225      ((eq chr ?\u026F)
226       (delete-char)
227       (insert "\\textturnm{}")
228       t)
229      ((eq chr ?\u027F)
230       (delete-char)
231       (insert "\\IPArevfishhookr{}")
232       t)
233      ((eq chr ?\u0282)
234       (delete-char)
235       (insert "{\\usefont{T1}{pxr}{m}{n}\\k{s}}")
236       t)
237      ((eq chr ?\u0294)
238       (delete-char)
239       ;; (insert "\\UCSjis{0294}")
240       (insert "\\textglotstop{}")
241       t)
242      ((eq chr ?\u02BF)
243       (delete-char)
244       (insert "\\textrevapostrophe{}")
245       t)
246      ((eq chr ?\u2022)
247       (delete-char)
248       (insert "\\textbullet{}")
249       t)
250      ((eq chr ?\u2074)
251       (delete-char)
252       (insert "$^4$")
253       t)
254      ((eq chr ?\u2075)
255       (delete-char)
256       (insert "$^5$")
257       t)
258      ((eq chr ?\u2080)
259       (delete-char)
260       (insert "$_0$")
261       t)
262      ((eq chr ?\u2081)
263       (delete-char)
264       (insert "$_1$")
265       t)
266      ((eq chr ?\u2082)
267       (delete-char)
268       (insert "$_2$")
269       t)
270      ((eq chr ?\u2083)
271       (delete-char)
272       (insert "$_3$")
273       t)
274      ((eq chr ?\u2084)
275       (delete-char)
276       (insert "$_4$")
277       t)
278      ((eq chr ?\u2085)
279       (delete-char)
280       (insert "$_5$")
281       t)
282      ((eq chr ?\u2086)
283       (delete-char)
284       (insert "$_6$")
285       t)
286      ((eq chr ?\u2087)
287       (delete-char)
288       (insert "$_7$")
289       t)
290      ((eq chr ?\u2088)
291       (delete-char)
292       (insert "$_8$")
293       t)
294      ((eq chr ?\u2089)
295       (delete-char)
296       (insert "$_9$")
297       t)
298      ((eq chr ?\u208A)
299       (delete-char)
300       (insert "$_+$")
301       t)
302      ((eq chr ?\u208B)
303       (delete-char)
304       (insert "$_-$")
305       t)
306      ((eq chr ?\u208C)
307       (delete-char)
308       (insert "$_=$")
309       t)
310      ((eq chr ?\u208D)
311       (delete-char)
312       (insert "$_($")
313       t)
314      ((eq chr ?\u208E)
315       (delete-char)
316       (insert "$_)$")
317       t)
318      ((eq chr ?\u2637)
319       (delete-char)
320       (insert "\\UCSgb{2637}")
321       t)
322      ((eq (encode-char chr '=ucs@jis) #x8DBC)
323       (delete-char)
324       (insert "\\GTpjG{4933}")
325       t)
326      ((and (encode-char chr '=ucs@jp)
327            (setq ret (char-representative-of-domain chr 'gb))
328            (setq ret (encode-char ret '=ucs@gb))
329            (<= ret #xFFFF))
330       (delete-char)
331       ;; (if (eq (char-before) ?\e$B!T\e(B)
332       ;;     (insert " "))
333       (insert (format "\\UCSgb{%04X}" ret))
334       t)
335      ((catch 'tag
336         (setq rest chise-tex-coded-charset-expression-alist)
337         (while (setq spec (car rest))
338           (if (setq ret (encode-char chr (car spec)))
339               (throw 'tag ret))
340           (setq rest (cdr rest))))
341       (delete-char)
342       ;; (if (eq (char-before) ?\e$B!T\e(B)
343       ;;     (insert " "))
344       (insert (format (format "\\%s{%%0%d%s}"
345                               (nth 1 spec)
346                               (nth 2 spec)
347                               (nth 3 spec))
348                       ret))
349       t)
350      )))
351
352 (defun chise-tex-encode-region-for-jis (start end)
353   (interactive "r")
354   (save-excursion
355     (save-restriction
356       (narrow-to-region start end)
357       (goto-char start)
358       (let (chr ret
359                 ;; rest spec
360                 modifier base modifier-1)
361         (while (and (skip-chars-forward "\x00-\x7F")
362                     (not (eobp)))
363           (setq chr (char-after))
364           (cond ((encode-char chr '=jis-x0208-1983)
365                  (forward-char))
366                 ;; ((setq ret (encode-char chr '=jis-x0208-1990))
367                 ;;  (delete-char)
368                 ;;  (insert (decode-char '=jis-x0208-1983 ret)))
369                 ((encode-char chr '=jis-x0208-1983)
370                  (forward-char))
371                 ((and (not (eq (char-ucs chr) #x0439))
372                       (not (eq (char-ucs chr) #x0451))
373                       (setq ret (char-feature chr '=decomposition))
374                       (setq modifier (assq (nth 1 ret)
375                                            '((?\u0300 . "`")
376                                              (?\u0301 . "'")
377                                              (?\u0302 . "^")
378                                              (?\u0303 . "~")
379                                              (?\u0304 . "=")
380                                              (?\u0306 . "u")
381                                              (?\u0307 . ".")
382                                              (?\u0308 . "\"")
383                                              (?\u0309 . "Hook")
384                                              (?\u030C . "v")
385                                              (?\u0323 . "d")
386                                              (?\u0327 . "c")
387                                              ))))
388                  (delete-char)
389                  (setq base (car ret))
390                  (if (and (setq ret (char-feature base '=decomposition))
391                           (setq modifier-1
392                                 (assq (car modifier)
393                                       (cdr
394                                        (assq (nth 1 ret)
395                                              '((?\u0302
396                                                 (?\u0300 . "CircGrave")
397                                                 (?\u0301 . "CircAcute")
398                                                 (?\u0303 . "CircTilde")
399                                                 (?\u0309 . "CircHook")
400                                                 )
401                                                (?\u031B
402                                                 (?\u0301 . "HornAcute")
403                                                 )
404                                                (?\u0323
405                                                 (?\u0302 . "Circudot")
406                                                 )))))))
407                      (insert (format "\\%s{%c}" (cdr modifier-1) (car ret)))
408                    (insert (format "\\%s{%c}" (cdr modifier) base))))
409                 ((and (or (encode-char chr '=jis-x0213-1-2000)
410                           (encode-char chr '=jis-x0213-2-2000))
411                       (setq ret (or (encode-char chr '=ucs@jis/2000)
412                                     (encode-char chr '=ucs@jis/fw)))
413                       (<= ret #xFFFF))
414                  (delete-char)
415                  ;; (if (eq (char-before) ?\e$B!T\e(B)
416                  ;;     (insert " "))
417                  (insert (format "\\UCSjis{%04X}" ret)))
418                 ((chise-tex-encode-ucs-char-at-point chr))
419                 (t
420                  (forward-char))))))))
421
422 (defun chise-tex-encode-region-for-utf-8-jis (start end &optional ptex-mode)
423   (interactive "r")
424   (save-excursion
425     (save-restriction
426       (narrow-to-region start end)
427       (goto-char start)
428       (let ((font-encoding 'T1)
429             chr ret
430             ;; rest spec
431             modifier base
432             ;; modifier-1
433             pos)
434         (while (and (skip-chars-forward "\x00-\x7F")
435                     (not (eobp)))
436           (setq chr (char-after))
437           (cond
438            ((and (setq ret (encode-char chr '=ucs))
439                  (and (<= #x0400 ret)(<= ret #x04F9)))
440             (if (eq font-encoding 'T2A)
441                 (forward-char)
442               (setq pos (point))
443               ;; (unless (and (prog1
444               ;;                  (search-backward
445               ;;                   "\\fontencoding{T2A}\\selectfont{}" nil t)
446               ;;                (goto-char pos))
447               ;;              (eq pos (match-end 0)))
448               ;;   (insert "\\fontencoding{T2A}\\selectfont{}")
449               ;;   )
450               (if (search-backward "\\CyrillicScript{"
451                                    (- pos (eval-when-compile
452                                             (length "\\CyrillicScript{")))
453                                    t)
454                   (search-forward "}" nil t)
455                 (insert "\\CyrillicScript{")
456                 (forward-char)
457                 (skip-chars-forward "---\u0400-\u04F9 ")
458                 (insert "}"))
459               ;; (setq font-encoding 'T2A)
460               )
461             )
462            ((and (setq ret (encode-char chr '=ucs))
463                  (and (<= #x0374 ret)(<= ret #x03F3)))
464             (if (eq font-encoding 'LGR)
465                 (forward-char)
466               (setq pos (point))
467               ;; (unless (and (prog1
468               ;;                  (search-backward
469               ;;                   "\\fontencoding{LGR}\\selectfont{}" nil t)
470               ;;                (goto-char pos))
471               ;;              (eq pos (match-end 0)))
472               ;;   (insert "\\fontencoding{LGR}\\selectfont{}")
473               ;;   )
474               (if (search-backward "\\GreekScript{"
475                                    (- pos (eval-when-compile
476                                             (length "\\GreekScript{")))
477                                    t)
478                   (search-forward "}" nil t)
479                 (insert "\\GreekScript{")
480                 (forward-char)
481                 (skip-chars-forward "\u0374-\u03F3 ")
482                 (insert "}"))
483               ;; (setq font-encoding 'LGR)
484               )
485             ;; (unless (eq font-encoding 'T1)
486             ;;   (unless (looking-at
487             ;;            "\\\\fontencoding{T1}\\\\selectfont{}")
488             ;;     (insert "\\fontencoding{T1}\\selectfont{}")
489             ;;     )
490             ;;   (setq font-encoding 'T1))
491             )
492            (t
493             (unless (eq font-encoding 'T1)
494               (setq pos (point))
495               (unless (and (prog1
496                                (search-backward
497                                 "\\fontencoding{T1}\\selectfont{}" nil t)
498                              (goto-char pos))
499                            (eq pos (match-end 0)))
500                 (insert "\\fontencoding{T1}\\selectfont{}")
501                 )
502               (setq font-encoding 'T1))
503             (cond ((eq (char-ucs chr) #x00D7)
504                    (delete-char)
505                    (insert "\\UCSjis{00D7}"))
506                   ((encode-char chr '=jis-x0208@1983)
507                    (forward-char))
508                   ((encode-char chr '=jis-x0208@1990)
509                    (forward-char))
510                   ((and (setq ret (char-ucs chr))
511                         (or (eq ret #x00C5)
512                             (eq ret #x00E5)
513                             (eq ret #x015B)
514                             (eq ret #x1E2B)
515                             ))
516                    (forward-char))
517                   ;; ((setq ret (encode-char chr '=jis-x0208-1990))
518                   ;;  (delete-char)
519                   ;;  (insert (decode-char '=jis-x0208-1983 ret)))
520                   ((eq (char-ucs chr) #x012B)
521                    (delete-char)
522                    (insert "\\={\\i}")
523                    )
524                   ((setq ret (encode-char chr 'thai-tis620))
525                    (delete-char)
526                    (insert (format "\\ThaiTIS{%X}" (logior ret #x80)))
527                    )
528                   ((and (not (eq (char-ucs chr) #x0439))
529                         (not (eq (char-ucs chr) #x0451))
530                         (listp (setq ret (decompose-char chr)))
531                         ;; (setq ret (char-feature chr '=decomposition))
532                         (setq modifier (cdr ret))
533                         ;; (setq modifier (assq (nth 1 ret)
534                         ;;                      chise-tex-accent-macro-alist))
535                         )
536                    ;; (delete-char)
537                    (setq base (car ret))
538                    (if (setq ret
539                              (if (cdr modifier)
540                                  (assoc modifier
541                                         chise-tex-accents-macro-alist)
542                                (assq (car modifier)
543                                      chise-tex-accents-macro-alist)))
544                        (progn
545                          (delete-char)
546                          (setq ret (cdr ret))
547                          (if (consp ret)
548                              (insert (format "%s%c%s"
549                                              (car ret) base (cdr ret)))
550                            (insert (format "\\%s{%c}" ret base))))
551                      (forward-char))
552                    )
553                   ((eq (encode-char chr '=ucs@jis) #x0153)
554                    (delete-char)
555                    (insert "\\oe{}")
556                    t)
557                   ((and (not ptex-mode)
558                         (setq ret (encode-char chr '=ucs@JP))
559                         (>= ret #x20000))
560                    (delete-char)
561                    (insert (format "\\UCSsip{%X}" ret))
562                    t)
563                   ((and (not ptex-mode)
564                         (or (encode-char chr '=jis-x0213-1-2000)
565                             (encode-char chr '=jis-x0213-2-2000))
566                         (setq ret (or (encode-char chr '=ucs@jis/2000)
567                                       (encode-char chr '=ucs@jis/fw)))
568                         (<= ret #xFFFF))
569                    ;; (delete-char)
570                    ;; (if (eq (char-before) ?\e$B!T\e(B)
571                    ;;     (insert " "))
572                    ;; (insert (format "\\UCSjis{%04X}" ret))
573                    (forward-char))
574                   ((chise-tex-encode-ucs-char-at-point chr))
575                   (t
576                    (forward-char))))))))))
577
578 (defun chise-ptex-encode-region-for-utf-8-jis (start end)
579   (interactive "r")
580   (chise-tex-encode-region-for-utf-8-jis start end 'ptex-mode))
581
582 (defun chise-xetex-encode-region-for-utf-8-jis (start end)
583   (interactive "r")
584   (save-excursion
585     (save-restriction
586       (narrow-to-region start end)
587       (goto-char start)
588       (let (chr ret rest spec)
589         (while (and (skip-chars-forward "\x00-\x7F")
590                     (not (eobp)))
591           (setq chr (char-after))
592           (cond ((encode-char chr '=jis-x0208@1983)
593                  (forward-char))
594                 ((encode-char chr '=jis-x0208@1990)
595                  (forward-char))
596                 ;; ((encode-char chr '=jis-x0212)
597                 ;;  (forward-char))
598                 ((and (setq ret (encode-char chr '=ucs@JP))
599                       (>= ret #x20000))
600                  (insert "\\SIPChars{")
601                  (forward-char)
602                  (insert "}"))
603                 ((encode-char chr '=jis-x0213-1@2000)
604                  (forward-char))
605                 ((encode-char chr '=jis-x0213-1@2004)
606                  (forward-char))
607                 ((encode-char chr '=jis-x0213-2)
608                  (forward-char))
609                 ((setq ret (encode-char chr 'thai-tis620))
610                  (delete-char)
611                  (insert (format "\\ThaiTIS{%X}" (logior ret #x80)))
612                  )
613                 ((or (encode-char chr '=ks-x1001)
614                      (encode-char chr '=ucs-hangul))
615                  (insert "\\KoreanChars{")
616                  (forward-char)
617                  (insert "}"))
618                 ((encode-char chr '=ucs@gb)
619                  (insert "\\GBChars{")
620                  (forward-char)
621                  (insert "}"))
622                 ((encode-char chr '=ucs@cns)
623                  (insert "\\CNSChars{")
624                  (forward-char)
625                  (insert "}"))
626                 ((and (encode-char chr '=ucs@JP)
627                       (setq ret (char-representative-of-domain chr 'gb))
628                       (setq ret (encode-char ret '=ucs@gb)))
629                  (insert "\\GBChars{")
630                  (forward-char)
631                  (insert "}"))
632                 ((setq ret (char-feature chr '=decomposition))
633                  (delete-char)
634                  (dolist (c ret)
635                    (insert c)))
636                 ((catch 'tag
637                    (setq rest chise-tex-coded-charset-expression-alist)
638                    (while (setq spec (car rest))
639                      (if (setq ret (encode-char chr (car spec)))
640                          (throw 'tag ret))
641                      (setq rest (cdr rest))))
642                  (delete-char)
643                  (insert (format (format "\\%s{%%0%d%s}"
644                                          (nth 1 spec)
645                                          (nth 2 spec)
646                                          (nth 3 spec))
647                                  ret))
648                  )
649                 (t
650                  (forward-char))))))))
651
652 (defun chise-tex-decode-region (start end)
653   (interactive "r")
654   (save-excursion
655     (save-restriction
656       (narrow-to-region start end)
657       (goto-char start)
658       (let (macro code ret me rest spec)
659         (while (search-forward "\\={\\i}" nil t)
660           (replace-match "\e.D\eNo" t t))
661         (goto-char start)
662         (while (re-search-forward "\\\\\\(.\\){\\(.\\)}" nil t)
663           (when (and
664                  (setq macro
665                        (assq
666                         (aref (match-string 1) 0)
667                         '((?\` . ?\u0300) ; <COMBINING GRAVE ACCENT>
668                           (?\' . ?\u0301) ; <COMBINING ACUTE ACCENT>
669                           (?^  . ?\u0302) ; <COMBINING CIRCUMFLEX ACCENT>
670                           (?~  . ?\u0303) ; <COMBINING TILDE>
671                           (?=  . ?\u0304) ; <COMBINING MACRON>
672                           (?u  . ?\u0306) ; <COMBINING BREVE>
673                           (?\. . ?\u0307) ; <COMBINING DOT ABOVE>
674                           (?\" . ?\u0308) ; <COMBINING DIAERESIS>
675                           (?v  . ?\u030C) ; <COMBINING CARON>
676                           (?d  . ?\u0323) ; <COMBINING DOT BELOW>
677                           (?c  . ?\u0327) ; <COMBINING CEDILLA>
678                           )))
679                  (setq ret
680                        (cdr (assq (cdr macro)
681                                   (char-feature (aref (match-string 2) 0)
682                                                 'composition)))))
683             (delete-region (match-beginning 0)(match-end 0))
684             (insert ret)))
685         (goto-char start)
686         (while (re-search-forward "\\\\\\([a-zA-Z0-9]+\\){\\([0-9A-Fa-f]+\\)}"
687                                   nil t)
688           (setq macro (match-string 1)
689                 code (match-string 2)
690                 me (match-end 0))
691           (if (and (catch 'tag
692                      (setq rest chise-tex-coded-charset-expression-alist)
693                      (while (setq spec (car rest))
694                        (if (string= (nth 1 spec) macro)
695                            (throw 'tag spec))
696                        (setq rest (cdr rest))))
697                    (setq ret (decode-char (car spec)
698                                           (string-to-int
699                                            code
700                                            (if (eq (nth 3 spec) 'X)
701                                                16)))))
702               (progn
703                 (delete-region (match-beginning 0)(match-end 0))
704                 (insert ret))
705             (goto-char me)))))))
706
707 (make-coding-system
708  'iso-2022-jp-tex-gb 'iso2022
709  "ISO-2022-JP with TeX representation for GB fonts."
710  '(charset-g0 ascii
711    short t
712    seven t
713    ;; input-charset-conversion ((latin-jisx0201 ascii)
714    ;;                        (japanese-jisx0208-1978 japanese-jisx0208))
715    pre-write-conversion chise-tex-encode-region-for-gb
716    post-read-conversion chise-tex-decode-region
717    mnemonic "pTeX(GB)/7bit"
718    ))
719
720 (make-coding-system
721  'iso-2022-jp-tex-jis 'iso2022
722  "ISO-2022-JP with TeX representation for JIS fonts."
723  '(charset-g0 ascii
724    short t
725    seven t
726    ccs-priority-list (ascii
727                       =jis-x0208@1983 =jis-x0208@1978
728                       latin-jisx0201)
729    ;; output-charset-conversion ((=jis-x0208@1990 =jis-x0208@1983))
730    pre-write-conversion chise-tex-encode-region-for-jis
731    post-read-conversion chise-tex-decode-region
732    mnemonic "pTeX(JIS)/7bit"
733    ))
734
735 (make-coding-system
736  'utf-8-jp-ptex 'utf-8
737  "Coding-system of UTF-8 for pLaTeX with common glyphs used in Japan."
738  '(pre-write-conversion chise-ptex-encode-region-for-utf-8-jis
739    post-read-conversion chise-tex-decode-region
740    charset-g0 =ucs@jp
741    charset-g1 =>ucs-jis
742    charset-g2 =>ucs
743    mnemonic "pTeX(JP)/UTF8"))
744
745 (make-coding-system
746  'utf-8-jp-tex 'utf-8
747  "Coding-system of UTF-8 for upLaTeX with common glyphs used in Japan."
748  '(pre-write-conversion chise-tex-encode-region-for-utf-8-jis
749    post-read-conversion chise-tex-decode-region
750    charset-g0 =ucs@jp
751    charset-g1 =>ucs-jis
752    charset-g2 =>ucs
753    mnemonic "upTeX(JP)/UTF8"))
754
755 (make-coding-system
756  'utf-8-jp-xetex 'utf-8
757  "Coding-system of UTF-8 for XeLaTeX with common glyphs used in Japan."
758  '(pre-write-conversion chise-xetex-encode-region-for-utf-8-jis
759    post-read-conversion chise-tex-decode-region
760    charset-g0 =ucs@jp
761    charset-g1 =>ucs-jis
762    charset-g2 =>ucs
763    mnemonic "XeTeX(JP)/UTF8"))
764
765
766 ;;; @ End.
767 ;;;
768
769 (provide 'chise-tex)
770
771 ;;; chise-tex.el ends here