マクロツイーター

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

XeTeX の謎の正規化の謎についての補足

前回の続きの話。XeTeX が文字を出力する際に行う「正規化」についてもう少し調べてみる。

% plain XeTeX/LuaTeX 文書, 文字コードUTF-8
\ifdefined\luatexversion \input luaotfload.sty \fi
\font\fTest="[OpenSans-Regular.ttf]:-liga" \fTest

% NFDで表す
A LÉGPÁRNÁS HAJÓM TELE VAN ANGOLNÁKKAL.

% <έ> は U+1F73, これは U+03AD への単元正規分解をもつ
τέχνη
% Open Sans Regular は U+03AD は持つが U+1F73 は持たない

\bye

XeTeX だと出力はコレ。

LuaTeX だと出力はコレ。

つまり、XeTeX の結果を見ると

  • 〈A+結合´(U+0301)〉 → 〈Á(U+00C1)〉
  • 〈έ(U+1F73)〉 → 〈έ(U+03AD)〉

のような「正規化」が行われているように見えるが、LuaTeX での結果からみて推測できるように、これはフォントの中での指定によるものではなく*1、XeTeX エンジンが独自に行っているものと推察できる。

それではこの「正規化」は具体的にはどんな変換なのであろうか。前回の結合濁点の例や今回の例を見ている限りでは、結果は何れも NFC の形になっている。ということは単純に NFC を行っているのだろうか。いや、そうではない。何故なら、

普段は Lost in N11n していない

からである。もし XeTeX が文字を出力する際に NFC 正規化を行っているのだとすると、〈神(U+FA19)〉等の互換漢字は対応する統合漢字の方(〈神〉(U+795E))に置き換えられるので、結果的に、〈神〉は絶対に出力できないはずである。しかし以前の例に出てきたように、(\XeTeXinputnormalization で正規化を明示しない限りは)互換漢字はそのまま出力できている。従って、件の正規化は NFC ではない、といえる。

*1:つまり、LuaTeX の場合は、U+0301 については(先の結合濁点の例と同じく)単にゼロ幅の文字を重ね書きしたので醜い出力になったのである。また、当該のフォントは U+1F73 の字形を持っていないので LuaTeX では出力されなかったのに対し、XeTeX では予め U+03AD に置き換えられていて、こちらの字形は持っていたために出力されている。