ttf2pkと補助漢字


ttf2pk とは

ttf2pk は,その名の通り TrueType フォントを TeX の標準的なフォントフォーマットである PK フォントに変換するツールです. PS フォントを PK フォントに変換するツールとして ps2pk, gsftopk が知られていますが,ttf2pk はこれらの TrueType 版に相当します. 実際 ttf2pk (ttf2tfm) のソースは gsftopk (afm2tfm) をベースにしているようです.

ttf2pk は CJK package (Chinese Japanese Korean 等の multi byte 文字を扱うための LaTeX マクロ) での利用を考慮して設計されており, msmincho 等の日本語 TrueType フォントも問題なく利用できます. 特に Windows 98 に付属する msmincho.ttc/msgothic.ttc には JIS 補助漢字 (JIS X 0212-1990) の範囲の漢字が追加されており, これらを TeX で利用できれば漢字不足の問題がかなり改善されるものと思われます.

なお,ttf2pk という名前のツールは CTAN の languages/chinese/CJK/4_1.3/utils/ttf2pk/ にあるものと, FreeType projectcontrib として配布されているものの 2 種類が存在しているようですが, ここでは FreeType エンジンを使った後者について説明します. (作者の一部が共通しており,後者が進化バージョンと考えられます)

FreeType 版 ttf2pk のソースコードは FreeType project の full source archive から入手できます. MS-DOS や OS/2 版のバイナリも提供されているようです.

Win32 版 ttf2pk のインストール

ttf2pk を win32 用に make してみました. コンパイラには Borland C++ 5.0 を使用し, FreeType 1.2 と kpathsea 3.2 の 2 種類のライブラリをリンクしています. 以下,このバイナリを使ったインストール手順について説明します. ttf2pk の詳しい使い方については付属のドキュメントを参照して下さい.

  1. 実行ファイル ttf2pk.exe, ttf2tfm.exe をパスの通ったディレクトリにコピーします.

  2. $TEXMF/ttf2pk というディレクトリを作成し, data/ 以下のファイル群 (ttfonts.map など) をこのディレクトリにコピーします.

  3. 環境に合わせて ttfonts.map (フォントの名前,encoding 等の設定ファイル) を編集します. msmincho/msgothic を利用する場合は以下の行を追加すればよいでしょう.
    msmin@unicode@ msmincho.ttc
    msgoth@unicode@ msgothic.ttc
    
    なお,texmf.cnf で TTFONTS (後述) に指定した場所以外に存在するフォントの場合は, ファイル名をフルパスで指定しておく必要があります.

  4. texmf.cnf の TTFONTS, TTF2PKINPUTS, TTF2TFMINPUTS 変数を設定します. TTFONTS には TrueType フォントの存在するディレクトリ名, TTF2PKINPUTS, TTF2TFMINPUTS にはそれぞれ ttf2pk, ttf2tfm が読みこむ設定ファイルの位置を指定します.
    % TrueType outline fonts.
    TTFONTS = .;c:/windows/fonts;$TEXMF/fonts/truetype//
    TTF2PKINPUTS = .;$TEXMF/ttf2pk
    TTF2TFMINPUTS = .;$TEXMF/ttf2pk
    
    なお,淺山氏の DLL 版 ptex を使用している人は, 角藤版のパッケージなどから texmf.cnf だけを $TEXMF/web2c にコピーし, TEXMF 変数を適切に書き直した上でその所在を環境変数 TEXMFCNF に指定してください.

ttf2pk の使用例

ここでは unicode: 9ad9 の文字を msmincho を使って出力する場合を例に説明します.

まず, ttf2tfm を使って変換したいフォントの tfm ファイルを作成します. msmincho/msgothic の場合は以下のようにタイプします.

ttf2tfm msmincho.ttc msmin@unicode@
ttf2tfm msgothic.ttc msgoth@unicode@
カレントディレクトリに msmin??.tfm, msgoth??.tfm (?? は 00 〜 ff までの 16 進数) が作成されていれば OK です. これらの tfm ファイルは例えば $TEXMF/fonts/tfm/ttf2pk といった名前のディレクトリに移動しておきます.

次に ttf2pk を使って,必要な文字を含む PK フォントを作成します. 例えば出力装置の解像度が 300dpi で,デザインサイズ (10pt) の文字を出力したい場合, 次のようにタイプします.

ttf2pk msmin9a 300
ここで ttf2pk の第 1 引数はフォント名に unicode の上位 2 バイトを付加したもの, 2 引数は解像度を意味しています.

ttf2pk によって作成された msmin9a.300pk を PK フォントの検索パス (例えば $TEXMF/fonts/pk/ttf2pk) に格納し,以下のサンプルで unicode: 9ad9 の文字 (はしご高) がタイプセットできれていれば成功です.

\documentclass{article}
\newfont{\msminIXA}{msmin9a}
\begin{document}
{\msminIXA\symbol{"D9}}島屋
\end{document}

なお,新しい PK フォントが必要になる度に ttf2pk を手で起動するのは面倒なので, 私は次のバッチファイル (mktexpk.bat) を用意し, mktexpk.exe と同じインターフェースで実行できるようにしています. (dviout の場合 gen: `mktexpk.bat ^s ^d ^D ^d/^D のように指定)

set FONTDIR=c:\ptex\texmf\fonts\pk\ttf2pk
ttf2pk %1 %2
if not exist %1.%2pk goto mktexpk
move %1.%2pk %FONTDIR%
goto exit
:mktexpk
mktexpk.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
:exit
角藤さんの新しい mftoolsでは, mktexpk が ttf2pk に対応しています!

CJK 互換 virtual font

上の例からもわかるように, msmincho/msgothic の内部コードには Unicode が採用されています, このため,希望の文字を出力するためにはその文字の Unicode を調べる必要がありますが, 市販のOA字典などはまだ Unicode に対応していないものが多いようです. そこで,Windows 98 付属の msmincho/msgothic を JIS コードで参照できるようにするための virtual font を作ってみました. (Windows 95 の msmincho/msgothic では一部の文字しか使えません) この中の js ではじまるファイルは JIS X 0208-1990 (いわゆる新JIS) 用, j2 ではじまるファイルは JIS X 0212-1990 (JIS 補助漢字) 用の virtual font (とそれに対応した tfm ファイル) です. これらのファイルは CJK package の encoding 規則に従っていますので, CJK pakage がインストールされている環境であれば, vf, tfm, c??msknj.fd ファイルを適切なディレクトリにコピーするだけで, CJK 互換フォントとして使用できます. 例えば,CJK のサンプルの JIS.tex であれば,
\begin{CJK*}{JIS}{song}
となっている部分を
\begin{CJK*}{JIS}{msknj}
のように書き換えるだけで,タイプセットできるようになります

なお,フォント定義ファイル c??msknj.fd の c?? の部分は, CJK package で規定されている C?? encoding に対応しています (C40: JIS X 0208,C50: JIS X 0212, C70: Unicode). これらのフォント定義ファイルでは medium series に対して明朝体 (j*msm??.vf), bold series に対してゴシック体 (j*msg??.vf) が割り当てられるようになっています. また,pTeX の min/goth フォントとのバランスを考えて, デザインサイズに対して 0.96 倍の大きさに縮小するようになっています. この辺りの設定は好みに合わせて適宜変更してみてください.

pLaTeX2e 用マクロ

CJK package では 0x80 以上のキャラクターコードを \active に変更することで multi byte キャラクタの処理を実現しており, その性格上 pTeX では正常に動作しません. そこで,CJK package の一部の機能 (主に NFSS の拡張部分) を切り出して, pLaTeX2e でも動作するようにしたもの (jskanji.sty) を, 上記の virtual font に添付しています.

利用可能なマクロは以下の通りです.

\jskanjienc{C??}
encoding の変更,デフォルトは "C50" (JIS X 0212).

\jskanjifamily{family}
font family の変更,デフォルトは "msknj". これらを変更することにより, フォント定義ファイル c??family.fd が使用されます.

\jskanjishift{dim}
ベースラインに対するシフトアップ量.デフォルトは 0.025ex.

\jskanji{nn}{mm}
区点コード nnmm の文字を出力.

\JSkanji{"NN}{"MM}
16進コード NNMM の文字を出力.

\Unicode{"NN}{"MM}
Unicode NNMM の文字を出力. (\jskanjienc{} とは無関係に "C70" encoding を使用)
使用例は次のようになります.
\documentclass{jarticle}
\usepackage{jskanji}
\begin{document}
森\JSkanji{"6C}{"3F}外,
\jskanji{66}{39}小平,
\Unicode{"9A}{"D9}島屋
\end{document}
出力結果
[sample1]

補助漢字 METAFONT 代用フォント

TeX で補助漢字フォントを利用する方法として, 京大の安岡さんによる JIS X 0212-1990(補助漢字)用METAFONTとスタイルファイル が良く知られています. これは, NACSIS-UCSフォントのJIS X 0212 部分を Adobe 社の「平成明朝体W3外字」 と同じエンコーディング規則に従って METAFONT 化したもので, TeX (METAFONT) が動作する環境の全てで利用できるという利点があります.

そこで,msmincho/msgothic から補助漢字 METAFONT と互換性のあるフォントを生成できるようにしてみました. 本来なら, 内部で msmincho?? を呼び出すような virtual font を用意するのが素直(?)なのですが, ここでは単純にコード変換だけを行うこととし, ttf2pk の sfd ファイル (Subfont definition file) を利用する方法について説明します.

  1. ここにあるuni2hj.sfdを $TEXMF/ttf2pk に格納し,$TEXMF/ttf2pk/ttfonts.map に以下のようなエントリを追加します.
    HeiseiMin-W3-G@uni2hj@ msmincho.ttc
    
    ここではフォント名を補助漢字 METAFONT と同じ (HeiseiMin-W3-G??)にしてありますが, 利用目的や書体に応じて適当な名前をつけて下さい.

  2. ttf2tfm を使って,tfm ファイルを生成します.
    ttf2tfm msmincho.ttc HeiseiMin-W3-G@uni2hj@
    
    ここで生成される tfm ファイルは, 本物の補助漢字 METAFONT とメトリック 情報が異なることに注意して下さい. 既に補助漢字 METAFONT がインストールされている場合は, 本物をそのまま使うこともできます.

  3. ttf2pk を使って,必要な PK フォントを作成します.
    ttf2pk HeiseiMin-W3-G01 300
    

なお,補助漢字 METAFONT の利用法については以下のページが参考になります.

dviout での注意点

dviout for Windows では, virtual font 内に定義されているローカルなフォントの全てについて (そのフォントを実際に使用するか否かに関わらず) そのパスを調査し,存在しないものについては自動生成を試みます. CJK 互換 virtual font は大量の物理フォントを定義しているため, 1 文字だけの文書であっても数十個の (実際には使用されない) 物理フォントを要求することがあり, ディスク資源を無駄に消費してしまいます. また,CJK のサンプル文書や下の例のように, 使用する文字が多くなるとフォント検索の際のキャッシュ効率が低下して, プレビューに異常に時間がかかることがあるようです. (ttf2pk の作成するフォントのパスが再帰的検索の対象とならないよう, TEXPK: の設定を工夫する必要があります)

これらの問題は dviout が msmincho/msgothic の補助漢字領域を 直接ラスタライズできるようになれば解決すると思われますが, 同時に dvi ファイルの可搬性も考慮しなくてはなりません.

sample2

おまけ

2 byte コード対応の vftovp/vptovf が欲しくなったので, VF -> VPL のフィルタとして動作する Perl script を作ってみました. VPL -> VF の方は ovp2ovf で代用可能なので, これらを組み合わせればとりあえず 2 byte コードの virtual font が編集可能になります. 但し,vftovp/ovf2ovp とは異なり, tfm/ofm を全く参照しませんので, vptovf/ovp2ovf にかけたときに生成されるメトリックファイルは 使い物になりません. また,丸め誤差の影響で VF -> VPL -> VF の結果が一致しない場合があるようです.
(2000/10/23 Perl 5 で負の数値がおかしくなるバグを修正 Thanks > 本田さん)
matsuda (a) ee.noda.tus.ac.jp