マクロツイーター

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

pLaTeX + dvipdfmx で PUA 文字を何とかする話

ただし和文限定。(すなわち全角幅であることが前提。*1

例えば、MogaMincho フォントでは、U+E020 に〈𠮷〉(ツチ吉;U+20BB7*2)があるのでこれを利用したいとする。OTF パッケージと PXchfon パッケージを使うことにすると、次のようにすればできそうな気がする。

\documentclass[a4paper]{jsarticle}
\usepackage{pxchfon}
\usepackage{otf}
\setminchofont[0]{mogam.ttc} % MogaMincho
\begin{document}
\UTF{E020}野家な日常。
\end{document}

残念ながらこれは失敗する。次のような警告が出て、*3結果の PDF では〈𠮷〉が notdef グリフに化けてしまう。

** WARNING ** No character mapping available.
 CMap name: UniJIS-UTF16-H
 input str: <e0>

これが上手くいかない理由は複雑で説明が難しいので、ここでは「dvipdfmx の処理では途中に Adobe-Japan1 への変換を経由するからそこにない文字は扱えない」*4とだけ言っておく。

しかし、実はこの制限は(横書きに限れば)回避することができる。やはり詳細は略すが、フォントマップ設定でエンコーディング指定を通常の CMap (2000JIS なら UniJIS-UTF16-H、2004JIS なら UniJIS2004-UTF16-H)の代わりに「Unicode 直接処理」*5を表す「unicode」にすればよい。今の場合、対象となる原メトリック JFM は otf-ujmr-h なので、これに対するマップ行を直接記述することにする。マップ行の記述は pxbase パッケージの \dvipdfmxmapline 命令で行える。

\documentclass[a4paper]{jsarticle}
\usepackage{pxbase}
\usepackage{otf}
\dvipdfmxmapline{otf-ujmr-h unicode :0:mogam.ttc}
\begin{document}
\UTF{E020}野家な日常。
\end{document}

PXchfon パッケージを改訂(v0.6c)して、directunicode というオプションで「Unicode 直接」を指定する機能を試験的に実装した。

\documentclass[a4paper]{jsarticle}
\usepackage[directunicode,moga-mobo]{pxchfon}
\usepackage[jis2004]{otf} % 2004JIS 字形を既定とする
\begin{document}
% U+E211 は 2000JIS 字形の〈葛〉
\rmfamily それはまるで葛飾区か\UTF{E211}城市のような。\par
\gtfamily それはまるで葛飾区か\UTF{E211}城市のような。\par
\end{document}

オプション moga-mobo は MogaMincho + MogaGothic + MoboGothic の組み合わせからなるプリセットで、これに対しては OTF パッケージ側の jis2004 オプションが有効なので、既定は 2004JIS 字形になる。*6MogaMincho は U+E2xx の位置に 2000JIS 字形のグリフを収録しているので、directunicode 指定を利用してそれを呼び出している。

なお、PXchfon は、この数時間前に v0.6b をリリースしているのだが、そちらについての話はまた後で。


*「ところで欧文の場合は?」
ZR「OpenType フォントの PUA にある文字を dvipdfmx で使いたい?」
*「そう」
ZR「とすると、論理的帰結として、あなたは『OpenType フォントを dvipdfmx で使いたい』と思っていることになる」
*「ヒェーーーー!」

(OpenType フォントを LaTeX で欧文フォントとして用いる方法を会得しているならば、LaTeX は特に PUA を特別扱いしない*7ので、その方法がそのまま PUA の文字にも通用します。)

*1:もちろん、「全角幅でない和文 TFM/VF を作る」能力のある人についてはその限りでないが、そういう人はこの記事を読む必要がないだろう。

*2:MogaMincho では BMP のみに対応のソフトウェアで使用する際の便宜のために BMP 外文字を PUA 領域にも重複して収録している。

*3:他にも警告が出るが、これは MogaMincho を使う限り必ず出るもので無視して構わない。

*4:これは OTF パッケージとは関係がない。標準の和文フォントも同じである。

*5:主に欧文の Unicode サブフォントで使われる。

*6:つまり、Moga90Mincho 等でなく MogaMincho 等が選ばれるということ。CID 対応フォントの場合と異なり、実フォントを切り替えている。

*7:というか、レガシーな TeXUnicode についての知識を全く持たない。