今もうできること
新しい dvipdfmx(20170318 版以降)では「Unicode 直接アクセス指定」の機能が強化され、それにより従来は面倒であった「AJ1 でない OpenType フォント」への対応が格段に容易になった、という話は既に何度か述べた。
すなわち、最新の TeX Live 2017 では次のようにして源ノ明朝(Source Han Serif)を upLaTeX で使うことができるようになっている。
\documentclass[uplatex,papersize,a5paper]{jsarticle}
\usepackage[deluxe]{otf}
\usepackage[sourcehan-otc]{pxchfon}
\begin{document}
{\TeX}と{\ajSnowman}は\textbf{一切}関係ありません。
\end{document}
今まだできないこと
一方で、dvipdfmx の「Unicode 直接アクセス指定」を利用した方法には明らかな限界がある。それは「Unicode 以外の和文フォントには対応できない」ということである。このため、「pLaTeX の標準和文フォント」や「japanese-otf の \CID
入力」には対応できない。
例えば次の pLaTeX 文書があるとする。
\documentclass[papersize,a5paper]{jsarticle}
\usepackage{otf}
\usepackage[kozuka-pr6n]{pxchfon}
\renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}}
\renewcommand{\labelenumi}{\theenumi}
\begin{document}
韓国プロ野球ではシーズン最多本塁打数の記録をもち
「アジアの大砲」と呼ばれ、日本の読売巨人軍に5年間在籍した
野球選手は誰か。
\begin{enumerate}
\item 森\UTF{9DD7}外
\item \UTF{9127}小平
\item \CID{13706}澤ひとみ
\item ウィリアム・ヘンリー・ゲイツ\ajRoman{3}世
\item またそのネタですか
\end{enumerate}
\end{document}
pxchfon のプリセットを kozuka-pr6n にした状態(上掲のソースのまま)では pLaTeX でのコンパイルは正常に行われる。
しかしプリセットを sourcehan-otc にした場合(4 行目の代わりに 5 行目を有効にする)は、pLaTeX のコンパイルは無事に終わるが、dvipdfmx の実行で次のようなエラーが出て失敗する。要するに「フォントが Adone-Japan1 でないからダメ」ということである。*1
Character collection mismatched:
Font: Adobe-Identity-0
CMap: Adobe-Japan1-1
dvipdfmx:fatal: Inconsistent CMap specified for this font.
Output file removed.
また、同じ内容の文書を upLaTeX でコンパイルした場合(1 行目の代わりに 2 行目を有効にする)は、直接入力と \UTF
入力の文字は正常に出力されるが、\CID
入力は全て化けている。
でも何とかしてみる
これは dvipdfmx 自体がもつ制限なので、マップ設定を工夫することでは(物理フォントの種類に依存しない形では)解決できない。しかし、話を「pxchfon が扱う範囲(標準および japanese-otf の和文フォント)」に絞って考えると、突破口は存在する。
要するに、論理フォントの名目の情報(TFM 名および NFSS での位置)が全て既知であるため、「Unicode の論理フォントだけを参照する仮想フォント(VF)」として他の(非 Unicode の)論理フォントの代替物を作成し、LaTeX 側の(NFSS の)設定を代替物の方を使用するように変更すればよいのである。*2
というわけで、作ってみた。(最新の TeX Live および W32TeX には既に収録されている。)
この pxufont は単に \usepackage
で読み込むだけでよい。(japanese-otf と併用する場合は otf パッケージの跡に読み込む。)
\documentclass[papersize,a5paper]{jsarticle}
\usepackage{otf}
\usepackage{pxufont}
\usepackage[sourcehan-otc]{pxchfon}
\renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}}
\renewcommand{\labelenumi}{\theenumi}
\begin{document}
韓国プロ野球ではシーズン最多本塁打数の記録をもち
「アジアの大砲」と呼ばれ、日本の読売巨人軍に5年間在籍した
野球選手は誰か。
\begin{enumerate}
\item 森\UTF{9DD7}外
\item \UTF{9127}小平
\item \CID{13706}澤ひとみ
\item ウィリアム・ヘンリー・ゲイツ\ajRoman{3}世
\item またそのネタですか
\end{enumerate}
\end{document}
今まで正常に扱えなかった非 Unicode のフォントが全て正常に出力されている。
もちろん、Unicode の論理フォントを参照している以上、Unicode にない文字には対応できない。(これは CID-keyed でない TrueType フォントを dvipdfmx で指定して普通に japanese-otf を用いた時と同様の制限である。)
\documentclass{jsarticle}
\usepackage{otf}
\usepackage[sourcehan-otc]{pxchfon}
\usepackage{pxufont}
\begin{document}
\begin{itemize}
\item \ajMaru{10}\ajMaru{20}\ajMaru{30}\ajMaru{40}
\ajMaru{50}\ajMaru{60}\ajMaru{70}\ajMaru{80}
\item \○A\○a\(A)\(a)\□A\□a\●A\●a
\item \ajLig{ドル}\ajLig{ポンド}\ajLig{ユーロ}\ajLig{ルーブル}
\ajLig{リラ}\ajLig{ルピー}\ajLig{バーツ}\ajLig{ドラクマ}
\item \○上\○下\○印\○秘\○正\○副\○問\○答
\item \ajSnowman\ajUmbrella\ajPostal\ajBall
\ajUpHand\ajDownHand\ajRightScissors\ajLeftScissors
\end{itemize}
\end{document}
これの出力結果は以下の左の図のようになる。右の図は同じ内容の文書を小塚フォントで出力したものであり、これと比較すると一部の文字が正常に出力されないことが判る。((実を言うと、\ajSnowman
、\ajUmbrella
、\ajPostal
の 3 つの記号は japanese-otf において最初から Unicode のフォントで扱われているのであるが。))
将来できるようになること
現状では、japanese-otf の機能を用いた異体字の区別はうまく働かない。
\documentclass[uplatex]{jsarticle}
\usepackage[jis2004]{otf}
\usepackage[sourcehan-otc,prefer2004jis]{pxchfon}
\usepackage{pxufont}
\begin{document}
\begin{itemize}
\item 葛餅で蓬餅で、かつ煎餅!
\item \CID{1481}城市から\CID{7652}飾区まで。
\end{itemize}
\end{document}
pLaTeX でコンパイルした場合は、ほぼ確実に 90JIS 字形が選択される。
upLaTeX でコンパイルした場合は、japanese-otf の jis2004
の有無は正常に考慮されるが、それでも \CID
で「両方の字形を使い分ける」ことはできない。
しかし実はこれは 20170318 版の dvipdfmx に存在するチョットしたバグのせいである。最新の 20170627 版(W32TeX では既に利用可能である)ではこのバグは既に修正されているため、完全に意図通りの出力が得られる。
この新しい dvipdfmx が TeX Live で使えるようになるのは来年の TeX Live 2018 からということになる。この新しい dvipdfmx が普及すれば、「Unicode 直接アクセス指定」の活用の幅はもっと拡がることになるだろう。