マクロツイーター

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

jlreqしてjlreq-deluxeしてpxchfonしてunicodeする方法

アレForumの質問についての話。

その問題

jlreqクラスの文書でjlreq-deluxeパッケージ1を利用して多書体化している状況において、pxchfonパッケージ和文フォントを変更する場合に、unicodeオプションを指定して“Unicode直接”モードに切り替えると、エラーが発生する。

※jlreq-deluxeを使っていない場合は大丈夫である2

% upLaTeX文書, UTf-8 (以下の例も同じ)
\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
\usepackage{jlreq-deluxe}
% これはエラーになる
\usepackage[yu-win10,unicode,jis2004]{pxchfon}
\begin{document}
巷で噂の葛飾区☃
\end{document}

(エラーメッセージ)

! Font JT2/hmc/m/n/10=zu-jlreq--upnmlminrn-v at 10.0pt not loadable: Metric (TF
M/OFM) file not found.

pxchfonにおいてnoto-otcsourcehan等の “AI0なフォント3 のためのプリセットを指定する場合はunicodeが自動で有効になる4ため、そういうプリセットを指定したときも同じエラーになる。

\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
\usepackage{jlreq-deluxe}
% 'unicode'が自動で有効になるのでエラーになる
\usepackage[noto-otc,jis2004]{pxchfon}
\begin{document}
巷で噂の葛飾区☃
\end{document}

その対策方針

前提として、pxchfonパッケージで“Unicode直接指定”モード(unicodeオプション)を有効にする際にはpxufontパッケージが読み込まれて和文フォント設定5が変更される。この設定変更のことをここでは仮に Unicode直接化” と呼ぶことにする。

件のエラーの原因は「そもそもjlreq-deluxeが提供する和文フォント設定が“Unicode直接化”をサポートしていない(そのための和文TFM/VFが提供されていない)」からである。だから「必要な和文TFM/VFを自分で作成する」ことをしない限り完全に解決することは不可能である。

完全な解決は不可能なので次善策を考えることにする。そもそも“Unicode直接化”の目的は「“AJ1を利用した機能”をベストエフォートでエミュレートする」ことである。従って​「“AJ1を利用した機能”を諦める」​という前提であれば“Unicode直接化”を行わずに“AI0なフォント”を使うことができる。

実際に、TeX Liveでは“そういう設定”を行うためのdvipdfmxのマップファイル群が用意されている。$TEXMF/fonts/map/dvipdfmx/ptex-fontmapsの下にある“AI0なフォント”用のマップファイルがそれである。

  • noto/*.map: 「Noto Serif/Sans CJK JP」OTF版
  • noto-otc/*.map: 「Noto Serif/Sans CJK JP」OTC
  • sourcehan/*.map: 「源ノ明朝/角ゴシック」OTF版
  • sourcehan-otc/*.map: 「源ノ明朝/角ゴシック」OTC

この次善策を利用する場合に気を付けないといけないのが“AJ1を利用した機能”である。これは以下のものを含むが、特にクオートに注意が必要である。

  • \CID命令
  • 文字出力命令の\aj~の一部6
  • ルビ用仮名・エキスパート仮名字形
  • クオート文字: ‘ ’ “ ”

もし仮にこれらの文字が使われたとすると、それが「想定通りのフォントで出力される」ことはありえないので「何か別のことが起こる」ことになる。特に「他のフォントで出力される」場合は見た目上は正常なので厄介である。先述のTeX Liveのマップファイルを真っ当に(kanji-config-updmapで)設定した場合は非埋込で出力される。「dvipdfmxの-fオプションで指定する」などの用法の場合は、指定の方法により異なり、例えば「既定のフォントマップ設定に従う(別のフォント7になる)」こともありえる。このため、先述の次善策を利用する場合は、出力PDFについて「想定された以外のフォントが使われていないか」を綿密にチェックする必要があるだろう。

その対策方法

ここからは、先述の「次善策」をpxchfonの機能を利用して実行する方法を説明する。

方法1:TeX Liveのマップファイルを読み込む

pxchfonには「既存のマップファイルを読み込んでそれをプリセットの代わりにする」という機能(ファイルプリセット機能)がある。先述のTeX Liveのマップファイルを利用するには、pxchfonの読込時に以下のオプションを指定すればよい。

  • tl:noto: 「Noto Serif/Sans CJK JP」OTF版
  • tl:noto-otc: 「Noto Serif/Sans CJK JP」OTC
  • tl:sourcehan: 「源ノ明朝/角ゴシック」OTF版
  • tl:sourcehan-otc: 「源ノ明朝/角ゴシック」OTC

※この方法を利用した場合、“AJ1を利用した機能”の文字は非埋込になる。

tl:noto-otcを使用した例を示す。これは2004JIS字形で出力される。

\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
\usepackage{jlreq-deluxe}
\usepackage[tl:noto-otc,jis2004]{pxchfon}
\begin{document}
巷で噂の葛飾区☃\par
\bfseries
巷で噂の葛飾区☃\par
\end{document}

※jlreq-deluxeの既定動作ではjapanese-otfパッケージをjis2004付で読み込む。事態が複雑になるのを避けるため、pxchfonのjis2004の指定は原則としてjapanese-otfに合わせるべきである8

出力結果

もし敢えて90JIS字形(2000JIS字形)にしたい場合は以下のように各パッケージにオプションを指定する。

\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
% 既定動作の'jis2004'を無効にする
\usepackage[jis2004=false]{jlreq-deluxe}
% 'jis2004'を付けない
\usepackage[tl:noto-otc]{pxchfon}
\begin{document}
巷で噂の葛飾区☃\par
\bfseries
巷で噂の葛飾区☃\par
\end{document}

出力結果

方法2:“Unicode直接化”を抑止する

pxchfonではunicodeオプションを指定して“Unicode直接指定”を有効にした場合は“Unicode直接化”を実施する(pxufontを読み込む)のであるが、この“Unicode直接化”を敢えて無効にする設定も用意されている。上級者向けの設定でありマニュアルにすらちゃんと説明がされていないのであるが、今回の「次善策」の実現に利用できるのでここで紹介しておく。

unicodeオプション(またはそれを自動有効化するプリセットオプション)と一緒に以下のようにオプションを指定する。

  • legacycode-replace=false,legacycode=ignore: “Unicode直接化”を無効にする。“AJ1を利用した機能”については既定のフォントマップ設定(別のフォント)が適用される。

noto-otcプリセットを使用した例を示す。2004JIS字形の場合は以下の通り。

\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
\usepackage{jlreq-deluxe}
\usepackage[noto-otc,legacycode-replace=false,legacycode=ignore,jis2004]{pxchfon}
\begin{document}
巷で噂の葛飾区☃\par
\bfseries
巷で噂の葛飾区☃\par
\end{document}

出力結果

90JIS字形にしたい場合は以下の通り。

\documentclass[uplatex,dvipdfmx,a4paper]{jlreq}
\usepackage[jis2004=false]{jlreq-deluxe}
\usepackage[noto-otc,legacycode-replace=false,legacycode=ignore]{pxchfon}
\begin{document}
巷で噂の葛飾区☃\par
\bfseries
巷で噂の葛飾区☃\par
\end{document}

出力結果

まとめ

ワタシハ pxchfon チョット デキル🙃


  1. 「jlreqの機能を損なわずにjapanese-otfパッケージの多書体化を適用した」状態を実現するためのパッケージ。
  2. upLaTeXでかつjapanese-otfが不使用の場合はそもそも“Unicode直接化”(後述)が不要であるため、pxufontを読み込んでも設定は変わらない。
  3. “AI0なフォント”というのは詳しくいうと「内部グリフエンコーディングAdobe-Identity-0であるCFFグリフのOpenTypeフォント」のことであるが、ここでは単純に「Noto CJKや源ノは“ちょっと特殊な”フォントである」と考えてほしい。
  4. “AI0なフォント”は「AJ1を前提とする“CMap指定”」を適用できず、従ってそういうフォントを使うためにはunicodeを有効にする必要があるからである。
  5. ここでいう“和文フォント設定”というのは(DVIウェアでなく)LaTeX側の設定の一種で、例えば「“明朝太字”に対してどういう和文TFMを対応させるか」のようなものを指す。
  6. 例えば\ajMaru{1}は最終的には\CID{7555}を実行する。直接“①”を書いた場合はそれは“Unicodeとして”出力される。
  7. もちろん、逆にそういう動作を利用するというテクニックも成立するであろう。
  8. ただしpxchfonのファイルプリセットの仕様に少し問題があってjis2004指定はプリセットには実は効いていない。つまり、jis2004が有効な場合は本来は(u)ptex-noto-otc-04.mapの方を採用するべきであるが、現在の仕様では常に(u)ptex-noto-otc.mapが採用されてしまう。ただしjapanese-otfを普通に用いている場合は実際にはこのマップファイルの違いが問題になることはないので、取りあえずはこのままで大丈夫である。