マクロツイーター

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

OpenType の palt 特性の既定値

XeTeX で OpenType フォントを用いる場合、palt 特性(プロポーショナル幅を指定)が存在するフォント(IPAex、ヒラギノ、小塚、等)については palt が既定で有効になるので、等幅で用いたい場合(大概はそうであろう)は -palt を明示的に指定する(XeLaTeX + fontspec の場合、これに対応する指定が用意されていないので RawFeature=-palt の指定方法を使う)必要があるということは奥底でも説明した。


[XeTeX の場合]
\font\ipaxmA="IPAex明朝" % palt 有効
\font\ipaxmB="IPAex明朝:-palt" % palt 無効
\ipaxmA いろはにほへと(ちりぬるを)わかよたれそ\par
\ipaxmB いろはにほへと(ちりぬるを)わかよたれそ\par
\bye
[XeLaTeX + fontspec の場合]
\documentclass[a4paper]{article}
\usepackage{fontspec}
\newfontfamily\ipaxmA{IPAex明朝} % palt 有効
\newfontfamily\ipaxmB[RawFeature=-palt]{IPAex明朝} % palt 無効
\begin{document}
\ipaxmA いろはにほへと(ちりぬるを)わかよたれそ\par
\ipaxmB いろはにほへと(ちりぬるを)わかよたれそ\par
\end{document}

これに関して、用字系(script)を漢字(hani)や仮名(kana)等に設定すると、palt が既定で有効になることがなくなるということを教えてもらった。


[XeTeX]
\font\ipaxmC="IPAex明朝:script=hani" % 用字系→漢字
\font\ipaxmD="IPAex明朝:script=kana" % 用字系→仮名
\ipaxmC いろはにほへと(ちりぬるを)わかよたれそ\par
\ipaxmD いろはにほへと(ちりぬるを)わかよたれそ\par
\bye
[XeLaTeX + fontspec]
\documentclass[a4paper]{article}
\usepackage{fontspec}
\newfontfamily\ipaxmC[Script=CJK]{IPAex明朝} % 用字系→漢字
\newfontfamily\ipaxmD[Script=Kana]{IPAex明朝} % 用字系→仮名
\begin{document}
\ipaxmC いろはにほへと(ちりぬるを)わかよたれそ\par
\ipaxmD いろはにほへと(ちりぬるを)わかよたれそ\par
\end{document}

確かにその通りの動作になる。ただ、palt は CJK 向けの特性なので、「用字系が CJK な場合に既定が変わる」というのはどうも奇妙だ。そもそも OpenType の仕様では palt は既定で無効になるべきだったのではないか……と思って、OpenType の仕様(と等価な ISO/IEC 14496-22)を確認してみた。

Tag: 'palt'
Friendly name: Proportional Alternate Widths (…)
UI suggestion: This feature would be off by default. (…)
Feature interaction: (…) If palt is activated, there is no requirement that kern must also be activated. If kern is activated, palt must also be activated if it exists. See also vpal.

これを見ると、kern を有効化した場合は palt も有効化する必要があるとなっている。XeTeX は恐らく kern を既定で有効にするだろうから、palt が既定で有効になるのはその副作用のように見える。すると script=hani の場合に palt が既定で無効なのは、その場合に kern が既定で無効になるからのような気がしてきた。そこで確かめてみる。


\font\kozmA="Kozuka Mincho Pro-VI"
\font\kozmB="Kozuka Mincho Pro-VI:-palt"
\font\kozmC="Kozuka Mincho Pro-VI:script=hani"
\kozmA エッフェル塔 Eiffel Tower\par
\kozmB エッフェル塔 Eiffel Tower\par
\kozmC エッフェル塔 Eiffel Tower\par
\bye

明らかに、script=hani を指定した \kozmC では「ff」のリガチャ(liga)が無効になっている。カーニング(kern)については極めて判りにくい*1が、\kozmA\kozmB では「To」の部分に僅かな詰めがあるのに対して、\kozmC ではそれが消えている。すなわち script=hani の指定は kern と liga の既定を無効にするようである。やはり palt の既定が無効になるのはこれが波及した結果のようだ。

先の例を調べていて、もっと重大なことに気付いた。-palt 指定のみの \kozmB では「フェ」の部分で詰めが行われている。つまりこれではベタ組になっていない。和文の文字の並びを完全なベタ組にしたければ欧文でのカーニングも諦めるしかないということか。((「和文が完全なベタ組でなくてもよい」という考え方もあるかも知れないが、先述の OpenType の仕様は、「kern が有効で palt が無効」な状態(\kozmB の動作)自体を排除していると読むのが自然な気がする。))恐らく liga は和文ベタ組には影響を及ぼさないと思われる。すると、和文と欧文で全く同じフォント設定を用いたい場合は、script=hani を指定しておいて改めて liga のみを有効にするのが最適……? まあ TeX 屋は和文と欧文のフォントを別にすることを好むと思うが。


[XeTeX]
\font\kozmD="Kozuka Mincho Pro-VI:script=hani,+liga"
[XeLaTeX + fontspec]
\newfontfamily\kozmD[Script=CJK,Ligatures=Common]{Kozuka Mincho Pro-VI}

*1:結果の PDF の中の描画命令を調べるまで気付かなかったぞ。