マクロツイーター

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

palt 特性が有効な場合に余分な空きが出現する

「フォントにない文字を別のフォントで補う」(2011-02-20)に対する K. Okada 様のコメントに対する私の返答:

XeTeX で最初の行の丸括弧の空きが不釣り合いになっている件について。これは、XeTeX で日本語用の設定を施して、ヒラギノ等の高品位 OpenType フォントをプロポーショナル幅の状態で用いた場合に起こる現象です。

今日はこれの話。従って、プロポーショナル組をすることを前提とする。


[XeTeX (プリミティブ)]
\font\ipaxmA="IPAex明朝"
\ipaxmA いろはにほへと(ちりぬるを)わかよ、たれそ、つね・ならむ。\par
\XeTeXlinebreaklocale "ja"
\XeTeXlinebreakskip=0pt plus .1em
\XeTeXlinebreakpenalty=0
\ipaxmA いろはにほへと(ちりぬるを)わかよ、たれそ、つね・ならむ。\par
\bye

上の行は kern と palt が有効な「IPAex明朝」として正常と思われる(「IPA P明朝」とほぼ同じ結果になっている)。しかし、このままの設定だと和文文字の間での行分割ができないので日本語文書の作成には役に立たない。そこで、和文文字間(禁則にならない箇所)にグルーの自動挿入を設定して日本語の段落が行分割されるようにしたものが下の行である。ここでは一部の約物の後に本来ないはずの空きが入ってしまっている。

これの原因を調べているが、今のところ完全には把握していない。\XeTeXlinebreak〜 を有効にして文字間にグルーやペナルティが自動挿入されるようにした((現在の \XeTeXlinebreaklocale の設定に従って行分割可能と判断された各々の場所について、\XeTeXlinebreakpenalty の値のペナルティと \XeTeXlinebreakskip の値のグルーが挿入される。ただし片方がゼロの場合はもう一方のみが挿入され、両方がゼロの場合はゼロのペナルティのみ挿入される。))場合、元々文字間にあったカーニングが無くなる(T\penalty0 o としたのと同様)ことは解っている。例えば、下の行で仮名文字の連続で幅が伸びているのはそのせいであろう。*1そして、見た目の動作としては、約物の後でも「カーニング」のような処理が行われているようである。これは次の例を見ればわかる:


% \fbox を使いたいので XeLaTeX にする
\documentclass[a4paper]{article}
\setlength{\fboxsep}{0pt}
\font\ipaxmA="IPAex明朝"
\begin{document}
\ipaxmA \fbox{(あ)} \fbox{(あ)い}
\end{document}

この例では、\XeTeXlinebreak〜 を設定せず((ちなみに、\hbox の中などの「限定水平モード」では \XeTeXlinebreak〜 の処理は自動的に無効になる。))、palt 有効の「IPAex明朝」で出した文字を枠で囲っている。〈)〉の後に文字がないと余分な空きが入っていることが判る。\XeTeXlinebreak〜 を設定した場合に空きが入るのも同じ原因であることが推測される。

しかし、「IPAex明朝」の中身を調べてみても、実際にそういうカーニングが施されているようには見えない。結局、何故この「カーニングのような現象」が起こるのかは解っていない。XeTeX のバグの可能性もある。

*1:この動作自体、まともに文字詰めを行おうとする場合には致命的な気がするが……。