Ghostscript 8.54 (CJK フォント)

普段私は TeX 文書を PDF にすることが多く,この際 dvipdfmx しか用いない。かつては PostScript にして印刷したものだが,最近はほとんど dvips,Ghostscript を使わなくなってしまった。しかし,先に Beamer を試したところ dvipdfmx で生成した PDF だとアイコンでジャンプする機能が有効にならないという問題があり,dvips,Ghostscript で PDF にする環境を久しぶりに整備した。ところが OTF 中国語,韓国語でフォントを拾うことができず悩んでしまった。いろいろ調査・試行してなんとかうまくいった。

OTF パッケージにより日本語,中国語,韓国語を組版し, dvips,Ghostscript でフォント埋め込み PDF を作成したい pTeX ユーザで,同じ悩みに陥った方のためにも,備忘録として少し整理しておく。土村さんの ptetex3,OTF がすでに組込まれているものとしている。FreeBSD,Mac OS X 環境である。Linux でも通用すると思う。

  1. Ghostscript 8.54 のインストール

    Ghostscript 8.54 を奥村先生のページを参考に組込む。私の場合,FreeBSD においてパッケージ依存関係で勝手にインストールされた Ghostscript 7.07 が /usr/local にすでに陣取っているので,8.54 は /usr/local/teTeX を localbase とした。もちろん,パスは /usr/local/bin よりも /usr/local/teTeX/bin が優先して検索されるよう設定しておく。ghostscript-8.54-gpl.tar.bz2ghostscript-fonts-std-8.11.tar.gz を $HOME/tmp 下にダウンロードしてあるものとする。

    % setenv GSDIR /usr/local/teTeX/share/ghostscript
    % cd ~/tmp
    % tar jxvf ghostscript-8.54-gpl.tar.bz2
    % cd ghostscript-8.54-gpl
    % ./configure --prefix=/usr/local/teTeX
    % make
    % sudo make install
    % cd $GSDIR
    % sudo tar zxvf ~/tmp/ghostscript-fonts-std-8.11.tar.gz
  2. Font, CMap ファイルの追加

    Ghostscript のインストール(Mac OS X 10.4 Tiger)』サイトの解説『日本語フォントのインストール(3/3)』にある Font.tar.bz2 をダウンロード/展開し,Font ディレクトリごと $GSDIR/8.54/Resource 下に格納する。念のため,CMap: adobe-cmaps-200204.zip, acro5-cmaps-2001.zip, aj16.tar.Z を取って来て,CMap 下に追加する。

    % cd ~/tmp
    % tar jxvf Font.tar.bz2
    % sudo mv Font $GSDIR/8.54/Resource
    % zcat aj16.tar.Z | tar xvf -
    % sudo mv aj16/CMap/* $GSDIR/8.54/Resource/CMap
  3. 日中韓 TrueType フォント

    日中韓フォントはフリーの TrueType フォントをダウンロードし展開しておく。IPA 日本語フォントUn Fonts 韓国語フォントArphic 中国語フォントを設定することとする。私の場合,X11 のフォントディレクトリにインストールし,TeX からも参照できるように TeX ツリーからシンボリックリンクを設定している。

    % sudo ln -sf /usr/X11R6/lib/X11/fonts/TrueType \
      /usr/local/teTeX/share/texmf-local/fonts/truetype/X11
    % sudo mktexlsr
  4. フォントマップの調整

    上記日中韓フォントを使うように updmap 管理下のフォントマップを調整する。OTF パッケージを ptetex3 インストーラから組込むと,/usr/local/teTeX/share/texmf/fonts/map/dvipdfm/ 下に otf-cktx.map があるはずである。これは OTF パッケージの出力する中国語,韓国語のフォントについて DVIWARE で参照されるものである。これに対して,例えば以下 (一部) のように,Arphic, Un Fonts を参照するよう指定する。

    % Korean
    otf-ckmr-h    Identity-H     UnBatang.ttf
    otf-ckmr-v    Identity-V     UnBatang.ttf
    otf-ckgr-h    Identity-H     UnDotum.ttf
    otf-ckgr-v    Identity-V     UnDotum.ttf
    % Chinese Simplified
    otf-ccgr-h    Identity-H     gkai00mp.ttf
    otf-ccgr-v    Identity-V     gkai00mp.ttf
    otf-ccmr-h    Identity-H     gbsn00lp.ttf
    otf-ccmr-v    Identity-V     gbsn00lp.ttf
    % Chinese Traditional
    otf-ctgr-h    Identity-H     bkai00mp.ttf
    otf-ctgr-v    Identity-V     bkai00mp.ttf
    otf-ctmr-h    Identity-H     bsmi00lp.ttf
    otf-ctmr-v    Identity-V     bsmi00lp.ttf

    私の otf-cktx.map をリンクしておく。

    次に updmap-sys --edit として,updmap.cfg 編集画面に次の行があるか確認する。なければ追加する。

    KanjiMap otf-cktx.map
    KanjiMap ptex-ipa.map

    pTeX フォントにヒラギノを拾うように指定している方は rml, rmlv, gbm, gbmv というフォント名に対し,ヒラギノ otf フォントを設定した ptex-hiragino.map の行が updmap.cfg にあると思う。当然ユーザの選択次第であるが,pTeX フォントを IPA フォントで表示したいならばこれをコメントアウトし,ptex-ipa.map を活かすようにしよう。

    updmap.cfg 編集が完了したら updmap-sys でフォントマップを更新する(updmap --edit で変更していればエディタ終了とともに自動的にフォントマップ更新処理がはじまる)。

  5. cidfmap の調整

    Ghostscript の TrueType / OpenType フォント参照定義である $GSDIR/8.54/lib/cidfmap を updmap のマップに合わせ修正する。以下の CJK 関連の定義 (部分) には,もともとの日中韓フォントの設定も含んでいるが,/ipam, /ipag, /gbsn00lp, /gkai00mp, /bsmi00lp, /bkai00mp のエントリは updmap マップに合わせ追加した定義である。updmap で参照するフォントマップ,例えば ptex-ipa.map に ipam.ttf が指定されていると,dvips がフォント名称として ipam-H 出力する結果,Ghostscript は cidfmap の /ipam エントリの指定を参照するためである。これがないと dvips が出力するフォントを Ghostscript が参照できない。

    /Ryumin-Light        /IPAMincho  ;
    /Ryumin-Medium       /IPAMincho  ;
    /GothicBBB-Medium    /IPAGothic  ;
    ...
    /IPAMincho 
    %% Japanese IPA Fonts
    << /FileType /TrueType  /CSI [(Japan1) 6]
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/ipam.ttf) >> ;
    /IPAGothic 
    << /FileType /TrueType  /CSI [(Japan1) 6]
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/ipag.ttf) >> ;
    %%% added from ptex-ipa.map
    /ipam 
    << /FileType /TrueType /CSI [(Japan1) 6] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/ipam.ttf) >> ;
    /ipag 
    << /FileType /TrueType /CSI [(Japan1) 6] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/ipag.ttf) >> ;
    %% Chinese Arphic Fonts
    %% Chinese Simplified
    /BousungEG-Light-GB  
    << /FileType /TrueType   /CSI [(GB1) 5] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/gbsn00lp.ttf) >> ;
    /GBZenKai-Medium  
    << /FileType /TrueType   /CSI [(GB1) 5] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/gkai00mp.ttf) >> ;
    %% Chinese Traditional
    /ShanHeiSun-Light  
    << /FileType /TrueType   /CSI [(CNS1) 5]
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/bsmi00lp.ttf) >> ;
    /ZenKai-Medium  
    << /FileType /TrueType   /CSI [(CNS1) 5]
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/bkai00mp.ttf) >> ;
    %%% added from otf-cktx.map
    /gbsn00lp 
    << /FileType /TrueType /CSI [(GB1) 5]  
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/gbsn00lp.ttf) >> ;
    /gkai00mp 
    << /FileType /TrueType /CSI [(GB1) 5]  
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/gkai00mp.ttf) >> ;
    /bsmi00lp   
    << /FileType /TrueType /CSI [(CNS1) 5] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/bsmi00lp.ttf) >> ;
    /bkai00mp 
    << /FileType /TrueType /CSI [(CNS1) 5] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/bkai00mp.ttf) >> ;
    %% Korean Un Fonts
    /UnBatang      
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnBatang.ttf) >> ;
    /UnBatang-Bold  
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnBatangBold.ttf) >> ;
    /UnDotum        
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnDotum.ttf) >> ;
    /UnDotum-Bold   
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnDotumBold.ttf) >> ;
    /UnGraphic      
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnGraphic.ttf) >> ;
    /UnGraphic-Bold 
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnGraphicBold.ttf) >> ; 
    /UnGungseo      
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnGungseo.ttf) >> ;
    /UnPilgi        
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnPilgi.ttf) >> ;
    /UnPilgi-Bold   
    << /FileType /TrueType /CSI [(Korea1) 2] 
    /Path (/usr/X11R6/lib/X11/fonts/TrueType/UnPilgiBold.ttf) >> 

    私の cidfmap をリンクしておく。(※ 当然,このなかのフォントファイルのパス情報はお使いの環境に合わせて変更が必要である。また,8.70 以降の cidfmap は場所が 8.7x/Resource/Init/ に変更されたので注意)

  6. bkmk2uni のインストール

    角藤先生の bkmk2uni をインストールする。これは dvips 出力の PDF 日本語文字列を Unicode に変換するツールである。PDF のしおりなどを文字化けなく日本語出力することが可能となる。W32TeX 向けのものであるが,C でコンパイルすれば UNIX 系でも利用できる。角藤先生は,TeX 周辺プログラムを日本語できちんと使うに当たって本当に核心をついたユーティリティを提供してくださる。UNIX 系ユーザと言えども角藤先生の活動はチェックしておくとよい。

    % cd ~/tmp
    % gunzip bkmk2uni.c.gz
    % cc -g -o bkmk2uni bkmk2uni.c
    % sudo cp bkmk2uni /usr/local/teTeX/bin
    % rehash
  7. PDF の生成

    以上で準備は完了である。LaTeX でプレゼンテーション — Beamer のサンプル (UTF-8,UNIX 行末形式) を dvips 版に書き換えたもので例を示す。

    % utf82tex -qtx < multigs.tex | nkf -e > multigs.euc
    % platex multigs.euc
    % platex multigs.euc
    % dvips -Ppdf -T128mm,96mm -z -f multigs.dvi |\
      bkmk2uni -e > multigs.ps
    % gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite \
      -sOutputFile=multigs.pdf multigs.ps

    PS -> PDF 変換は ps2pdf ではなく gs -sDEVICE=pdfwrite ... を使うのがよい。ps2pdf は -dSAFER オプションをデフォルトで含んでおり,上記 CJK フォントを使う場合,標準的なフォント名ではないためかエラーとなってしまうのだ。

    TrueType フォントの埋め込みにかなりの時間を要する (CID フォントのエミュレーションに恐ろしく CPU コストがかかるようである)。固まったかと思うくらいなので注意。サンプル multigs.ps の変換に Mac OS X / 1.8GHz PowerPC G5 1GB DDR で 1 分半程度かかった。また dvipdfmx の生成する PDF に比べ,Ghostscript のものはサイズが大きくなる傾向がある。

    ともあれ,生成物 multigs.pdf は,右下のアイコンをクリックするとさまざまなジャンプ動作を行うはずである。上記マップ設定では。dvipdfmx でもフォント埋め込みが可能である。

    multigs サンプル原稿のアーカイブを掲載しておく。コンパイルのためには Beamer,OTF のほか,ThaiLaTeX タイ語,VnTeX ヴェトナム語,OldSlav 教会スラヴ語,skt サンスクリット語,ArabTeX アラビア語/ヘブライ語,Teubner ギリシア/ラテン古典語の各言語パッケージ環境が必要である。


以上,Ghostscript 8.54 を CJK に馴染ませる方法を辿ったわけだが,実は pTeX 縦組がダメである。このあたりは GNU Ghostscript 7.07 が優れている。7.07 は TrueType フォントが扱えるし,パッチを適用すればヒラギノなどの OpenType フォントも利用可能であるという。数ある日本語 Linux ディストリビューションも FreeBSD Japanese パッケージもいまだに 7.07 を標準としているところを見ると,CJK ハンドリングに関しては 7.07 の選択がベストといえるかも知れない。新バージョンの追っかけが必ずしも適切ではないということか。