luatex/xetexでのリガチャの抑制

luatex/xetexでのリガチャの抑制

- 本田 知亮 の投稿
返信数: 2
リガチャを手っ取り早く抑制するバッドノウハウ的なものに

{f}{i}
f{}i

のように,見えない仕切り的なものを
リガチャのところに入れるというのがありました.

これ,ptex/uptex/pdftexでは期待通りの動作をしますが,
xetexとluatexではリガチャされてしまいますよね.

これは仕様なんだとは思いますし,
実際は\textcompwordmarkを使えばエンジン依存しないし,
正統だと思います.

疑問なのですが,これは何の違いによるのでしょうか
xetex/luatexだと
(1) fとiが連続すると判断されるタイミングが違うのか,
(2) {と}は「連続する」を妨害しないのか
でしょうか.なんとなく(2)の気がしますが.


これに関連して,expl3で

\def\test#1{
\str_map_variable:nNn {#1} \arg {\arg}
% \str_map_variable:nNn {#1} \arg {\arg\textcompwordmark} %%これならOK
}

なんてのを書くと
\test{fi}の結果が,上の{f}{i}と同じになって
xetexとluatexではリガチャになりません.
tarcingallでlogを手あたり次第追いかけて
たぶん,同じことが原因なんだと思ってはいますが,
実際のところどうなんでしょうか.



本田 知亮 への返信

Re: luatex/xetexでのリガチャの抑制

- aminophen の投稿
LuaTeX については
https://ja.osdn.net/projects/eptex/wiki/lastnodechar
の下の方に
「LuaTeX では,リガチャやカーニングの処理は段落・ボックス終了時に一括してノードベースで」
とあります。
・段落内では各文字がバラバラの char_node として保持される
・空グループ {} はノードを生成しない
・\par などによって段落が終了したときに初めてリガチャになる
従って「連続すると判断されるタイミングが違う」に該当します。

XeTeX については
OpenType フォントを指定した場合,文字は個別の char_node ではなく単語単位で保持され,
それが外部のライブラリに渡されて戻ってくると単語全体が塊のまま whatsit ノードになります。
空グループ {} が挟まっても影響しない挙動からすると,
これは「外部ライブラリにとっては連続が妨害されていない」ということなんでしょうかね。
aminophen への返信

Re: luatex/xetexでのリガチャの抑制

- 本田 知亮 の投稿
>段落・ボックス終了時に一括してノードベースで

>個別の char_node ではなく単語単位で保持され>

二点ともありがとうございます.
すごく納得できました.

やっぱり,ルールが確立しているものは
きちん従うべきですね.

背景としては・・・
プログラムコードに
標準ではリガチャのある等幅フォントが指定されて
なおかつリガチャはNGという状況があたったことでした.

tfmを作りかえるか,手動でなんとかするか,
マクロ的に攻めるか,マクロでいくにしても
TeX言語万歳でいくか,expl3でいくか
いろいろやってるときに,ふと
luatex/xetex/pdftex/(u)pTeXで同じ挙動かチェックすべきかとか
思ったことが発端でした.
その過程で,\textcompwordmarkのスペルは長いとはいえ,
\letで短くするのも可読性落ちるしとか,
昔は{}で切断したよねとか,いろいろやってるうちに,
expl3で結果が変わるケースがあることに気が付いたのでした.

ありがとうございました.