W32TeX や TeX Live では既に更新されている。
- Package PXchfon(CTAN) 1.1a 版。
Unicode 直接指定に関するアレコレ
アドホックに拡張を続けていて複雑になっているので、一回整理してみた。ただ、何か機能を削ったわけではないので依然として複雑であり、一般のユーザが知る必要性も乏しいので詳細はブログでは扱わない。マニュアル((TeX Live や W32TeX では「texdoc pxchfon」で開く。))の「Unicode 直接指定」の節(7 節)を参照してほしい。
要するに
- dvipdfmx の
20170627 版20170918 版以降であれば、pxchfon でunicodeオプションを付けることで、「AJ1 でない OpenType フォント」が使用できるようになる。また、任意の OpenType フォント(TrueType グリフのものも含む)について、OpenType の機能を利用した機能(異体字の区別など)が使えるようになる。 - dvipdfmx の 20170318 版(TeX Live 2017)の場合、残念ながら
unicodeは使えないが、代わりに“劣化版”であるunicode*が使える。劣化版なので、一部の機能が異常になる。 - Source Han 系のプリセット(
sourcehan(-otc)、noto(-otc))は自動的にunicodeを有効化する。- ただし、
unicodeは TeX Live 2017 で使えないため、「unicode*状態に対してアレな細工を施してunicode状態を模倣した」プリセットであるsourcehan(-otc)+、noto-(otc)+を用意している。これらはunicode*が使える環境なら使える。 - そして、TeX Live 2017 の期間の暫定措置として、Source Han 系のプリセット(
sourcehanなど)は“+ 版”(sourcehan+など)として扱われる。((TeX Live 2018 のリリースの時点で本来の「unicode版」に切り替わる予定である。TeX Live 2017 のユーザの便宜のため、“+ 版”も当面の間サポートされる。)) - 「
yu-win10にunicodeを付けた状態」を(アレな細工をして)模倣したプリセットであるyu-win10+も存在する。(yu-win10は従来通り非unicodeである。)((TeX Live 2018 でどうするかは未定。yu-win10を自動的にunicode付きにすると、「古い dvipdfmx でyu-win10を使っていた人が pxchfon をアップデートすると異常になる」という不具合を生じてしまうし、また同名の ptex-fontmap の設定とも食い違う。「yu-win10*を別に作る」という案もあるが、そもそも任意のプリセットにunicodeを付けることができるのだから、yu-win10を特別扱いする必要もないようにも思える。))
- ただし、
- 前項以外の場合、
unicodeもunicode*も付けなければ「従来通り」(CMap 指定)になる。 - “試験的”であるため、まだマニュアルにも書いてないこと:
unicode(*)が有効である場合、自動的に pxufont パッケージが読み込まれる。((正確ににいうと、「pxufont を読み込む」ことを指定するreplace-legacycodeというオプションが存在し、unicode(*)はこのオプションを既定で有効にする。apply-legacycodeというオプションを指定するとこの指定は打ち消される。))- これにより、pLaTeX でも
unicode(*)指定が機能するようになる。 - また、japanese-otf の
\CID命令も正常になる。
要するに要するに
- プリセット指定で、Source Han 系のフォントが使える。pLaTeX でも使える。
yu-win10で欧文クオートがアレで困った場合は、代わりにyu-win10+を使おう。- “AJ1 でない OpenType フォント”を使いたい場合は、
unicode*オプション(20170627 版20170918 版以降の dvipdfmx の場合はunicodeオプション)を指定しよう。
CSI 指定を正しくする
※上級者向けの話題である。
旧版の pxchfon において japanese-otf 併用で kozuka-pr6n プリセットを指定した場合、Identity-H の CMap を指定したマップ行(例えば otf-cjmr-h)は次のようになっていた。
otf-cjmr-h Identity-H KozMinPr6N-Regular.otf/AJ16
ところが、この中の /AJ16 のような指定(CSI 指定)は、本来は TrueType グリフのフォントを指定する場合にのみ付加すべきものであり、KozMinPr6N-Regular.otf のような CFF グリフのフォントの時に付加するのは正しくない。ただし、これまでのところ、不正に付けていても特に問題は起こらないようである。
「フォントのグリフ種別を TeX で判別する」のは面倒であり((例えば「拡張子が .otf である TrueType グリフのフォント」もあるので、ファイル名の拡張子では判別できない。))、かつ実害もないため、これまで対策は敢えてしていなかった。しかし、フォントマップのダンプ機能が使われた場合、外から見えるファイルに書いてあるマップ行に問題がある、というのは許容し難いであろう。
そういうわけで、CSI 指定の付加を適切に行う機能を実装した。ただし、この機能は kpsewhich の呼出を伴うため時間がかかる。そのため、strictcsi オプションを付けたときにのみ働くようにした。そして、フォントマップダンプ機能(dumpmap(tl) オプション)が有効な場合は自動的に既定で有効になる。
以上より、新版でフォントマップダンプを行った場合、マップファイルには以下のような適切な(CSI 無しの)マップ行が出力される。
otf-cjmr-h Identity-H KozMinPr6N-Regular.otf
“strictcsi”オプション
strictcsi: Identity-H/V に対する CSI 指定を(仕様に厳密に従って)フォントが TrueType グリフの場合にのみ出力する。nostrictcsi(既定):strictcsiの否定。Identity-H/V に対する CSI 指定は常に出力される。dumpmap(tl)が指定された場合はstrictcsiが既定になる。
もっと“アレな細工”する話
Source Han 系のプリセット(の“+版”*1)では「一部を中国語用のフォントに飛ばす」という“アレな細工”を行っているため、通常(unicode* 状態)では不正になる欧文クオートの出力が正常になる。
% upLaTeX文書 \documentclass[uplatex,a4paper]{jsarticle} \usepackage[sourcehan-otc]{pxchfon} \begin{document} {\TeX}は“アレ”。 \end{document}

ところが、ここでもし「自分はもっと細い明朝体がよい」ということで、\setminchofont で Source Han Serif Light を設定したとする。この場合、“細工”が必要なクオートはどうなるか。
% upLaTeX文書 \documentclass[uplatex,a4paper]{jsarticle} \usepackage[sourcehan-otc]{pxchfon} \setminchofont[0]{SourceHanSerif-Light.ttc}% 明朝体はLightにしたい \begin{document} {\TeX}は“アレ”。 \end{document}
旧版では、“細工”はプリセット指定で選択されたフォントにしか効果がなかった。だから、先の場合、クオートの出力は異常になる。

新版では、Source Han 系のプリセットが指定されている場合、\set...font 命令で自分で指定した Source Han 系のフォントにも“細工”が適用される。従って、クオートは正常に出力されるようになる。((これは「中国語版の Source Han Serif Light」が使われているということなので、当該のフォントがインストールされている必要がある。なお、noswitchfont というオプションを指定すると、この類の「別のフォントに振り替える」という“細工”を全て抑止することができる。もちろん、それにより出力が不正になるかも知れない。))

その他諸々
- 「
notoプリセットが使えない」というバグを修正。(v1.0c)
*1:前述の通り、現在は Source Han 系のプリセットは自動的に“+版”に振り替えられる。