マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

dvipdfmx で OpenType する件について (CJK パッケージ編)

長く続いたサブフォント定義ファイル(SFD ファイル)関連の解説もようやく一区切りが付いた。折角サブフォントの話をし終えたので、今回は(非常に難解とされる)「CJK パッケージに新しいフォントを持ち込む話」を述べようと思う。ただし UTF-8 で入力することを前提とする。*1(CJK パッケージの使用法の解説は目的ではない。)

CJK パッケージの(UTF-8 入力、すなわち「C70」エンコーディングの)フォントが使用する TFM は「Unicode サブフォント」である。Unicode サブフォントについては「SFD 編-1」で取り上げた。つまり、(SFD ファイルを用いるとすると)Unicode.sfd で定義されるサブフォントであり、実際に「M+ 1P」フォントに対する Unicode サブフォント(mplus1p-r-u@Unicode@)を ttf2tfm で生成して dvipdfmx で用いる例を「SFD 編-2」で扱った。ということは「CJK パッケージ用の TFM」に対する生成とマップ設定の解説はもう既に済んでしまっている。あと残すのは「LaTeX レベルでの設定」のみということになる。従って、以下では、「mplus1p-r-u@Unicode@ を CJK パッケージで implus1p ファミリ*2として用いる」ための設定を述べることにする。

CJK パッケージにおいても通常の LaTeX と同様のフォント定義ファイル(.fd ファイル)を用いる。CJK 用の UTF-8 入力(LaTeX 文書中では「UTF8」で指定する)に対するエンコーディング名は「C70」である。従って、implus1p ファミリに対するフォント定義ファイルの名前は c70implus1p.fd に決まる。ファイルの中身は以下のように記述する。

[c70implus1p.fd]
\DeclareFontFamily{C70}{implus1p}{\hyphenchar\font\m@ne}
\DeclareFontShape{C70}{implus1p}{m}{n}{<->CJK*mplus1p-r-u}{}

これまでに扱った「通常の」.fd ファイルとの違いは以下の通り。

  • \DeclareFontFamily の第 3 引数に「\hyphenchar\font\m@ne」を書く。*3
  • TFM 名の前に「CJK*」を書き、サブフォントの識別子(「@Unicode@」の部分*4)を省いた名前を書く。

その他は通常の .fd と同じで、例えば bold ウェイトの mplus1p-b-u@Unicode@ を(TFM 生成・設定を済ませた上で)シリーズ b に割り当てて、かつシリーズ bx をシリーズ b で代替する場合は以下のようになる。((「太字」の総称シリーズ命令 \bfseries が既定でシリーズ bx(b ではなく)を用いる関係で、シリーズが bx になることは頻出する。だから、シリーズ bx(Bold + Extended)がない場合は b での代替を設定した方がよい。(そうしないと警告が出て m で代替される。)これは「普通の」.fd ファイルについても成立する。)) ((「ssub*」の書き方は「通常」のものと同じ。「s*[<スケール>]」を使いたい場合は、代わりに「sCJK*[<スケール>]」と記述する。))必要に応じて斜体(mplus1p-ro-u@Unicode@)のフォントを割り当てる等も可能である。*5

\DeclareFontFamily{C70}{implus1p}{\hyphenchar\font\m@ne}
\DeclareFontShape{C70}{implus1p}{m}{n}{<->CJK*mplus1p-r-u}{}
\DeclareFontShape{C70}{implus1p}{b}{n}{<->CJK*mplus1p-b-u}{}
\DeclareFontShape{C70}{implus1p}{bx}{n}{<->ssub*implus1p/b/n}{}

なお、CJK パッケージでは「貧者の太字」の機能―太字を「重ね打ち」で代用する―がある。「M+ フォント」のように本物の太字のあるフォントを用いる方が望ましいことは言うまでもないが、止むを得ない場合に備えてその設定を挙げておく。例えば、「IPA 明朝」の Unicode サブフォント ipam-r-u@Unicode@ を iipam ファミリに割り当てる場合は以下の通り。

\DeclareFontFamily{C70}{iipam}{\hyphenchar\font\m@ne}
\DeclareFontShape{C70}{iipam}{m}{n}{<->CJK*mplus1p-r-u}{}
\DeclareFontShape{C70}{iipam}{bx}{n}{<->CJKb*mplus1p-r-u}{\CJKbold}

作成した c70implus1p.fd を $LOCAL/tex/latex/mplus1p/ に配置(これも「通常」と同じ)すれば準備完了である。以下にテスト文書を示す。この文書では欧文の mplus1p ファミリも一緒に用いている。この設定は以前に行ったもので構わないが、定義ファイル(ot1mplus1p.fd 等)に「bx シリーズを b シリーズで代替する」記述を加える必要がある。

% 文字コードは UTF-8
\documentclass[a4paper]{article}
\usepackage{CJK}
\begin{document}
\begin{quote}
  \fontfamily{mplus1p}\selectfont % 欧文ファミリを mplus1p に変更
  \begin{CJK}{UTF8}{implus1p} % ファミリ implus1p 使用で CJK 環境に入る
    高徳納\ Donald Knuth % 通常(シリーズ m)
    \par \bfseries
    高徳納\ Donald Knuth % 太字(シリーズ bx)
  \end{CJK}
\end{quote}
\end{document}

「簡易包装」に置いてある mplus1p.zip に CJK パッケージ用の設定を加えて更新した。

*1:CJK パッケージ自体は Shift_JIS、GB 2312、Big5 といった他の CJK 用エンコーディングもサポートしている。しかし日本人ユーザが CJK パッケージを求める場合の大部分は日本語以外を扱う場合であり、それには UTF-8 が最も自然な選択であろう。Windows ユーザ(でかつ何らかの理由で日本語を CJK パッケージで扱う者)は Shift_JIS を使いたいと思うかも知れない。しかし、CJK パッケージで Shift_JIS を使おうとすると、いわゆる「ダメ文字」の問題に対処するために、入力ファイルにフィルタを通すという処理が入る。どうせフィルタ処理が必要となるのなら、そこで UTF-8 に変換してしまう方が賢明であるように思える。その理由として、CJK パッケージのフォント設定はエンコーディング毎に行う必要がある(つまり Shift_JIS 用に設定したフォントは UTF-8 で入力する場合には使えない)ことが挙げられる。だから、CJK パッケージは常に UTF-8 で運用することにして文書ファイルを変換した方が都合がよいのである。

*2:欧文用のファミリと異なる名前にするために前に i (< ideographic)を付した。

*3:この命令は「当該フォントでは分綴を無効にする」を意味する。CJK パッケージの処理を考えた時に何故これを明示的に書くのかは少し不可解であるが、とにかくパッケージの標準の .fd ファイルにはこれが書かれている。

*4:これは TFM 名の末尾である必要がある

*5:日本語では必要になることは少ないと思うが。