前回の続きの話。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 に置き換えられていて、こちらの字形は持っていたために出力されている。