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