Subscribed unsubscribe Subscribe Subscribe

sci

最果て風呂

SJIS 版 TeX を使い続けるために

まえがき

私の愛機は古い iBook なので、Carbon Emacs は古いバージョンの 22 しか無いし、TeX についても Shift-JIS 版しかないのでした。TeX はあまり使わないので詳しくはないのだけど、UTF 版が実用になっているらしい。これは漢字の旧字体を使う自分にとっては嬉しいお話だ。しかし冒頭に書いたように、UTF 版の TeX を使うことが出来ない。幸いにして現状では utf パッケージが使えるので、UTF-8 から Shift-JIS に変換できない漢字を16進数の UTF-8 に置換することが出来れば、何とか処理が出来るというわけ。今回はそんなお話し。

Emacs 23 系をビルドする

ちょっとした出来心で Emacs 23.4.1 をソースからビルドしてみたらエラーも無く終了した。かかった時間も 20 分程度だったので拍子抜け。もう Panther ではビルドが出来ないと思い込んでいたのでとても嬉しい。実際に起動してみると、Cocoa インターフェイスではなくターミナルで使うからなのか、起動がとても速い(Vim には敵わないけど)。

動作確認ということで、いろいろと試してみたら navi2ch で問題が発生。先日の Vim におけるフォールディング問題と同じで、文字が見えなくなってしまうのだ。つまり、これは VimEmacs に問題がある訳ではなく、Terminal.app に問題(相性?)があるということだね。背景色を明るくすれば見えるようになるのだけど、自分は黒で使いたい...。

Photo Emacs on Terminal.app

ターミナル上で使うことの利点はフォントのサイズ変更が簡単なこと。カラーの問題が解決できれば快適な環境になりそうだね。

昨日の続きで調子にのって Cocoa インターフェイスを有効にしてみる。./configure に --with-ns を付けてビルドすると

nsfns.m: In function `ns_do_applescript':
nsfns.m:2036: error: `typeUTF16ExternalRepresentation' undeclared (first use in this function)
nsfns.m:2036: error: (Each undeclared identifier is reported only once
nsfns.m:2036: error: for each function it appears in.)

というエラーになって完了しない。ヘッダが無いのかなぁ。古いから仕方ないね。

nsfns.m には下記のように書かれていた。

#if defined (NS_IMPL_COCOA) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
              (typeUTF16ExternalRepresentation
               == [returnDescriptor descriptorType]) ||
#endif

MAC_OS_X_VERSION_10_4 とかあるのだけどコメントアウトして良いみたい。

Boolean うんぬんというワーニングが大量に出てるし、さらにエラーが頻出するのでビルドをするのは諦めることにした。

nsfont.m: In function `ns_attribute_fvalue':
nsfont.m:121: error: `NSFontTraitsAttribute' undeclared (first use in this function)
nsfont.m:121: error: (Each undeclared identifier is reported only once
nsfont.m:121: error: for each function it appears in.)

どうやら Font 関係らしいね。

フォントについては Terminal から使うならば拡大縮小が自在なので GUI 版を使う理由が見当らないわけだけど、それなら Vim を使えってことになる。起動も Emacs よりは速いんだし。Terminal 版では Emacs 内でイメージが使えないんだけど、それで困るのは emacs-w3m と twittering-mode くらいかな。

Objective-C は C っぽいのに include じゃなくて import を使うとか Python みたいで見慣れない。ソースを頻繁に見ていれば慣れてくるのかもね。すぐに理解ができなくても目を慣らすことが肝心。旧字旧仮名も一年半で見るのが苦痛にならくなった訳だし。結局 Cocoa 版のビルドは出来なかったのだけど、StackOverflow が便利なことがわかった。

特定の漢字を 16進数 に変換する

Emacs の Version が 23 系になったので「福」という文字について再調査をした。カーソルを対象となる漢字の上に置いて「C-x =」を実行してみよう。すると下記のような答が返ってくる。

Version 22 系
Char: 福 (324315, #o1171333, #x4f2db, file ...) point=1 of 1 (0%) column=0

Version 23 系
Char: 福 (64027, #o175033, #xfa1b, file ...) point=1 of 1 (0%) column=0

丸カッコの中の数字に注目してもらいたいのだけど、「#x4f2db」が「#xfa1b」という見慣れたものになっている。

これの何が嬉しいのかというと、utf-8 で作成している TeX ファイルを Shift-JIS に変換する際に、例えば下記のようなスクリプトで手軽に変換できるようになるから。

(mapcar (function
         (lambda (s) (format "&#x%x;" s))) (mapcar 'identity "福田恆存"))
 => ("&#x fa1b;" "&#x 7530;" "&#x 6046;" "&#x 5b58;")

旧字体の一部の漢字を含んでいる時に便利なのだ。冒頭でも書いたように私のマシンの TeX は未だ sjis 版なので変換する必要があるのです。旧字旧仮名を使わない人にとっては関係の無い話ではあるのだけど。

すでに誰かが作っていると思うけど、検索しても出て来なかったので変換するスクリプトを作成した。たぶんみんな utf 版に移行しているのだろうね。

;Emacs 23 専用
(defun mami-utf8-to-sjis-for-latex ()
  (interactive)
  (save-excursion
    (mapcar (lambda (x)
              (goto-char (point-min))
              (while (re-search-forward x nil t)
                (replace-match (car (mami-string-to-num16 x)))))
            utf8-to-sjis-char)))

(defun mami-string-to-num16 (string)
  (mapcar (function
           (lambda (s) (format "\\\\UTF\{ %x}" s)))
          (mapcar 'identity string)))

;; [http://support.microsoft.com/default.aspx?scid=kb;ja;JP170559]
;; CodePage 932 : 398 non-round-trip mappings
;; にある「SHIFT - JIS と Unicode 間の変換問題」より
;; 漢字は文字パレットで探しながら手動で入力したので間違いがあるかも
(setq utf8-to-sjis-char
      '("≒" "≡" "∫" "√" "⊥" "∠" "∵" "∩" "∪" "纊"
        "褜" "鍈" "銈" "蓜" "俉" "炻" "昱" "棈" "鋹" "曻"
        "彅" "丨" "仡" "仼" "伀" "伃" "伹" "佖" "侒" "侊"
        "侚" "侔" "俍" "偀" "倢" "俿" "倞" "偆" "偰" "偂"
        "傔" "僴" "僘" "兊" "兤" "冝" "冾" "凬" "刕" "劜"
        "劦" "勀" "勛" "匀" "匇" "匤" "卲" "厓" "厲" "叝"
        "﨎" "咜" "咊" "咩" "哿" "喆" "坙" "坥" "垬" "埈"
        "埇" "﨏" "塚" "增" "墲" "夋" "奓" "奛" "奝" "奣"
        "妤" "妺" "孖" "寀" "甯" "寘" "寬" "尞" "岦" "岺"
        "峵" "崧" "嵓" "﨑" "嵂" "嵭" "嶸" "嶹" "巐" "弡"
        "弴" "彧" "德" "忞" "恝" "悅" "悊" "惞" "惕" "愠"
        "惲" "愑" "愷" "愰" "憘" "戓" "抦" "揵" "摠" "撝"
        "擎" "敎" "昀" "昕" "昻" "昉" "昮" "昞" "昤" "晥"
        "晗" "晙" "晴" "晳" "暙" "暠" "暲" "暿" "曺" "朎"
        "朗" "杦" "枻" "桒" "柀" "栁" "桄" "棏" "﨓" "楨"
        "﨔" "榘" "槢" "樰" "橫" "橆" "橳" "橾" "櫢" "櫤"
        "毖" "氿" "汜" "沆" "汯" "泚" "洄" "涇" "浯" "涖"
        "涬" "淏" "淸" "淲" "淼" "渹" "湜" "渧" "渼" "溿"
        "澈" "澵" "濵" "瀅" "瀇" "瀨" "炅" "炫" "焏" "焄"
        "煜" "煆" "煇" "凞" "燁" "燾" "犱" "犾" "猤" "猪"
        "獷" "玽" "珉" "珖" "珣" "珒" "琇" "珵" "琦" "琪"
        "琩" "琮" "瑢" "璉" "璟" "甁" "畯" "皂" "皜" "皞"
        "皛" "皦" "益" "睆" "劯" "砡" "硎" "硤" "硺" "礰"
        "礼" "神" "祥" "禔" "福" "禛" "竑" "竧" "靖" "竫"
        "箞" "精" "絈" "絜" "綷" "綠" "緖" "繒" "罇" "羡"
        "羽" "茁" "荢" "荿" "菇" "菶" "葈" "蒴" "蕓" "蕙"
        "蕫" "﨟" "薰" "蘒" "﨡" "蠇" "裵" "訒" "訷" "詹"
        "誧" "誾" "諟" "諸" "諶" "譓" "譿" "賰" "賴" "贒"
        "赶" "﨣" "軏" "﨤" "逸" "遧" "郞" "都" "鄕" "鄧"
        "釚" "釗" "釞" "釭" "釮" "釤" "釥" "鈆" "鈐" "鈊"
        "鈺" "鉀" "鈼" "鉎" "鉙" "鉑" "鈹" "鉧" "銧" "鉷"
        "鉸" "鋧" "鋗" "鋙" "鋐" "﨧" "鋕" "鋠" "鋓" "錥"
        "錡" "鋻" "﨨" "錞" "鋿" "錝" "錂" "鍰" "鍗" "鎤"
        "鏆" "鏞" "鏸" "鐱" "鑅" "鑈" "閒" "隆" "﨩" "隝"
        "隯" "霳" "霻" "靃" "靍" "靏" "靑" "靕" "顗" "顥"
        "飯" "飼" "餧" "館" "馞" "驊" "髙" "髜" "魵" "魲"
        "鮏" "鮱" "鮻" "鰀" "鵰" "鵫" "鶴" "鸙" "黑" "ⅰ" 
        "ⅱ" "ⅲ" "ⅳ" "ⅴ" "ⅵ" "ⅶ" "ⅷ" "ⅸ" "ⅹ" "¬"
        "¦" "'" """ "Ⅰ" "Ⅱ" "Ⅲ" "Ⅳ" "Ⅴ" "Ⅵ" "Ⅶ"
        "Ⅷ" "Ⅸ" "Ⅹ" "¬" "㈱" "№" "℡" "∵"
; ここから下は実際に変換できなかったものを独自にピックアップしたもの
        "益" "塚" "猪" "朗" "晴" "銳" "緣" "溫" "渴" "旣"
        "虛" "强" "揭" "啟" "擊" "硏" "戶" "黃" "榖" "吳"
        "娛" "鄉" "歲" "殺" "產" "涉" "狀" "巢" "卽" "稅"
        "說" "絕" "脫" "徵" "縳" "晚" "姬" "步" "每" "欄"
        "虜" "戾" "淚" "曆" "歷" "廊" "錄" "閱" "鍊" "內"
        "塡" "剝" "頰" "鷗" "﨑" "鄧" "𠮷" "髙"))

; Unicode     CID        字体
;   20bb7   13706        下が長い吉。これは CID で指定しないとダメらしい
;    fa11    8443        立つ崎。CID 指定ではダメだった
;    9ad9    8705        はしごの高。両方OK
;    9dd7    7646        鴎外の鴎。両方OK
;
; 基本は UTF 指定にして、CID を補助で使う方式がいいのかな

スクリプトを見てもらえばわかるように、やりたい事は例えば「福田恆存」を「\UTF{fa1b}田恆存」のように変換させること。文章を UTF-8 で作成しつつも、TeX にかける段階になってからこのスクリプトで変換し、かつ sjis で別名保存するという流れ。CID 番号のことは知らないので要勉強かな。

あらためて一覧を見てみると、自分では絶対に使わないような字体ばかりある。固有名詞で生き残る感じかしら。あれ?「叱」が載ってない?そうか、Shift-JIS から unicode への対応だから unicode にしか存在していない字体は載っていないのか。むむ、これはどうしよう...。そういう字体は使わないようにすれば...いいのかな。

それにしても、「\」を表現するために「\\\\」にしなければいけないという Emacs Lisp の仕様はなんとかならんのかしら。

おまけで texinfo について

texi ファイルから info および html 形式への変換は問題ないのだけど、pdf を生成しようとするとエラーになってしまう。この変換しようとしている texi ファイルは utf-8 なのだけど、インストールしてある texsjis 版なので、うまく処理ができないというわけね。

下記のようにすると(栞は無いけれど) pdf への変換が可能になる。

nkf -s homu.texi > mami.texi
TEX=ptex texi2dvi mami.texi
dvipdfmx mami.dvi

これを参考にして、texi2pdf から一発で生成できないものかと調べてみたけど、そんなに頻繁にやる作業でもないので、必要なときに手打でやる。TeX をソースからビルドすることが出来ればいいのだけど素人にはムリ。早く utf-8 化したいな。