マクロツイーター

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

pxchfon の unicode オプションについて語ってみる

unicode オプションのここがスゴイ!

“AJ1 でない”フォントが使える

例えば、unicode 無しで源ノ明朝(Source Han Serif)を指定しようとすると……。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage[noalphabet]{pxchfon}
\setminchofont[0]{SourceHanSerif-Light.ttc}
\begin{document}
{\TeX}言語危険、ダメゼッタイ!
\end{document}

dvipdfmx で次のようなエラーが出て失敗する。*1

test.dvi -> test.pdf
[1
Character collection mismatched:
        Font: Adobe-Identity-0
        CMap: Adobe-Japan1-1

dvipdfmx:fatal: Inconsistent CMap specified for this font.

Output file removed.

ところが、unicode 有りにすると……。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont[0]{SourceHanSerif-Light.ttc}
\begin{document}
{\TeX}言語危険、ダメゼッタイ!
\end{document}

スゴイ!!!

※japanese-otf パッケージを使ったもう少し複雑な例を挙げておく。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage[deluxe]{otf}
\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont[0]{SourceHanSerif-Medium.ttc}%    明朝・中字
\setboldminchofont[0]{SourceHanSerif-Heavy.ttc}% 明朝・太字
\usepackage{plext}
\begin{document}
\parbox{6zw}{\ajMaru{1}横組\ajLig{サンチーム}\\
  {\TeX}\textbf{アレ}\\
  {\ajSnowman}\textbf{非アレ}}%
\quad
\parbox<t>{6zw}{\ajMaru{2}縦組\ajLig{サンチーム}\\
  {\TeX}\textbf{アレ}\\
  {\ajSnowman}\textbf{非アレ}}%
\end{document}
どんな Unicode 文字でも使える
※ただし全角に限る

japanese-otf パッケージの \UTF 命令や upLaTeX を用いると、任意の Unicode 文字が入力できる。ところが、文字によっては出力できないものが存在する。

例えば次の例では、BMP の全漢字を収録したフォント「花園明朝A」を指定しているにも関わらず、〈㝹〉(U+3779)の文字が出力できていない。

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage{otf}
\usepackage[noalphabet]{pxchfon}
\setminchofont{HanaMinA.ttf} % 花園明朝A
\begin{document}
\UTF{618D}梵波提 賓頭盧頗羅墮 迦留陀夷 摩訶劫賓那 %
薄拘羅 阿\UTF{3779}樓駄
\end{document}
% upLaTeX文書, UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[noalphabet]{pxchfon}
\setminchofont{HanaMinA.ttf} % 花園明朝A
\begin{document}
憍梵波提 賓頭盧頗羅墮 迦留陀夷 摩訶劫賓那 %
薄拘羅 阿㝹樓駄
\end{document}

出力できない文字があるのには様々なヤヤコシイ理由がある。しかし、とにかく unicode 有りにしてみると……

% pLaTeX文書
\documentclass[a4paper]{jsarticle}
\usepackage{otf}
\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont{HanaMinA.ttf} % 花園明朝A
\begin{document}
\UTF{618D}梵波提 賓頭盧頗羅墮 迦留陀夷 摩訶劫賓那 %
薄拘羅 阿\UTF{3779}樓駄
\end{document}
% upLaTeX文書, UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont{HanaMinA.ttf} % 花園明朝A
\begin{document}
憍梵波提 賓頭盧頗羅墮 迦留陀夷 摩訶劫賓那 %
薄拘羅 阿㝹樓駄
\end{document}

スゴイ!!

ところが、このスゴイ unicode でも対処できないケースがある。例えば次の例では、ゆきだるま☃は出力できるが、アヒル🦆は出力できない、という結果になる。

% upLaTeX文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[deluxe]{otf}
\usepackage[noalphabet,unicode]{pxchfon}
\setmarugothicfont{wlcmaru2004emoji.ttf} % 和田研中丸ゴシック
\begin{document}
立てば{\mgfamily}% U+2603 SNOWMAN
座れば{\mgfamily 🦆}% U+1F986 DUCK
歩く姿は{\TeX}のアレ。
\end{document}

これが失敗する理由は例によってヤヤコシイ。しかしこの問題にも対処法が存在する。次のように、\diruni 命令((\diruni は“フォントを切り替える宣言型命令”である。従って、\bfseries\mgfamily 等と同様に、適用範囲をグループで囲ってその中で実行する、という使い方をする。\diruni に対応する引数型命令 \textdiruni も存在する。))を使うと……。

% upLaTeX文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[deluxe]{otf}
\usepackage[noalphabet,unicode]{pxchfon}
\setmarugothicfont{wlcmaru2004emoji.ttf} % 和田研中丸ゴシック
\begin{document}
立てば{\mgfamily}% U+2603 SNOWMAN
座れば{\mgfamily\diruni 🦆}% U+1F986 DUCK
歩く姿は{\TeX}のアレ。
\end{document}

スバラシイ!!*2

TrueType フォントでも異体字切替が使える

japanese-otf パッケージや pxchfon パッケージには、漢字の字形を切り替えるための jis2004 というオプションが用意されている。jis2004 を指定しない場合は所謂“90JIS 字形”が使われる。

% pLaTeX文書
\documentclass[a4paper]{jsarticle} % 90JIS字形
\usepackage[kozuka-pr6n]{pxchfon}% 小塚フォント
\begin{document}
葛餅で蓬餅で、かつ\textgt{煎餅}\end{document}

対して、jis2004 を指定した場合は“2004JIS 字形”が使われる。((ここでは、japanese-otf と pxchfon の両方に効かせるため、グローバルオプションに jis2004 を入れている。))

% pLaTeX文書
\documentclass[a4paper,jis2004]{jsarticle} % 2004JIS字形
\usepackage[kozuka-pr6n]{pxchfon}% 小塚フォント
\begin{document}
葛餅で蓬餅で、かつ\textgt{煎餅}\end{document}

もし 90JIS 字形と 2004JIS 字形を混在させる必要がある場合は、\CID 命令を利用すればよい。

% pLaTeX文書
\documentclass[a4paper,jis2004]{jsarticle}% 既定は2004JIS字形
\usepackage{otf}
\usepackage[kozuka-pr6n]{pxchfon}% 小塚フォント
\begin{document}
\CID{1481}城市か\CID{7652}飾区かで葛藤する。
\end{document}

ところが、japanese-otf や pxchfon がもつこの異体字切替の機能には重要な制限がある。それは、“AJ1 な OpenType フォント”(例えば、今までの例で使った「小塚明朝」)でないと正しく機能しない、ということである。

TrueType フォント*3の中にも異体字切替に対応したものは存在し、例えば「IPAex明朝」はその一つである。しかし、pxchfon で「IPAex明朝」を指定した場合、異体字切替が無効になってしまい、常に 2004JIS 字形が出力される。*4

% pLaTeX文書
\documentclass[a4paper]{jsarticle} % 90JIS字形
\usepackage[ipaex]{pxchfon}% IPAexフォント
\begin{document}
葛餅で蓬餅で、かつ\textgt{煎餅}\end{document}

しかし、この問題も unicode で解決できる。unicode 有りの場合、フォントの方が対応していれば、異体字切替が有効になる。つまり……。

% pLaTeX文書
\documentclass[a4paper]{jsarticle} % 90JIS字形
\usepackage[ipaex,unicode]{pxchfon}% IPAexフォント
\begin{document}
葛餅で蓬餅で、かつ\textgt{煎餅}\end{document}
% pLaTeX文書
\documentclass[a4paper,jis2004]{jsarticle}% 既定は2004JIS字形
\usepackage{otf}
\usepackage[ipaex,unicode]{pxchfon}% 小塚フォント
\begin{document}
\CID{1481}城市か\CID{7652}飾区かで葛藤する。
\end{document}

スゴイ!!

unicode オプションのここがダメ!

TeX Live 2017 では使えない。

unicode オプションを使うには 20170918 版以降(※)の dvipdfmx が必要である。TeX Live 2017 の dvipdfmx はこれより古い 20170318 版なので unicode 指定を正常に扱うことができない。2017/09/18 以降の W32TeX の dvipdfmx であれば unicode が使える。
※元々は「20170627 版以降」としていたが、この版にはバグがあるためサポート範囲から外して、修正後の 20170918 版以降を必須とした。

しかし、pxchfon では TeX Live 2017 に対する救済策として「unicode* オプション」というものを用意している。これは「大体は unicode と同じになるが一部はうまくいかない」という性質の暫定的な設定である。詳細については別の記事を参照してほしい。

*1:少し古い dvipdfmx の場合、エラーは出ずに文字化けした PDF が出力されれる。

*2:ただ和田研中丸ゴシックのアヒル🦆がチョットアレなのが残念。

*3:「TrueType グリフの OpenType フォント」のこと。

*4:この場合にどちらの字形が採用されるかはフォントによって異なる。