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