TeX Live 2019 での \inhibitglue の挙動変更【予定】

TeX Live 2019 での \inhibitglue の挙動変更【予定】

- aminophen の投稿
返信数: 0
先ほど,pTeX に \inhibitglue の挙動変更が入りました。例えば

漢字\inhibitglue\relax (ああああ

のカッコの前の空白を見ると,

・TeX Live 2018 ではグルーが入る(= \inhibitglue 無効)
・TeX Live 2019 ではグルーが消える(= \inhibitglue 有効)

というように結果に差が出ます。
(ちなみに TeX Live 2013 以前も後者だったので,この例に限って言えば「昔に戻った」といえます。)

現時点では完全に確定したわけではありませんが,pTeX のコミット r49958 です。
https://www.tug.org/svn/texlive?view=revision&revision=49958


【背景】

原作者であるアスキーのドキュメントには,

===================================================================
\inhibitglue
和文フォントのメトリック情報から、自動的に挿入されるグルーの挿入を禁止します。
このプリミティブを挿入した箇所にのみ有効です。
===================================================================

と書かれていますが,
この「プリミティブを挿入した箇所のみ有効」という記述が大雑把であり,
「いったん発行した \inhibitglue が後ろのどこまで有効なのか」
がわかりにくいという問題がありました。

【過去の挙動】

(1) アスキーによる初期 〜 TeX Live 2013 以前

・いったん \inhibitglue を発行すると,次に和文文字が現れるまではずっと有効である。

(2) TeX Live 2014 〜 TeX Live 2018(pTeX 3.8.1 まで)

・\inhibitglue は,次に文字や展開不能トークンが現れると(後述の"穴"を除けば)無効化する。

ここでいう展開不能トークンには,\hbox{} や \hskip や \kern や \vrule といった
「ノードを挿入する処理」だけでなく,\relax や \let や数値代入といった
「ノードを挿入しない処理」も含まれます。それらが一つ以上挟まることで
\inhibitglue が無効化されるので,これぞまさに

> 「このプリミティブを挿入した箇所にのみ」

を実現したと思われてきました。参考:
http://doratex.hatenablog.jp/entry/20140714/1405302796

ところが,この時の修正にもまだ"穴"があることがわかってきました。

[穴1つ目] \hbox{} という展開不能トークン(しかも box ノードを挿入するもの)が
挟まったにもかかわらず,\inhibitglue が無効化されずにグルーが消えてしまう。

例→あ\relax \inhibitglue \hbox{}(このカッコの直前

※直前の \relax を削除すれば,想定通りグルーが消えます。

[穴2つ目] 別の \hbox{} の中で発行した \inhibitglue が外側に漏れ出して,
グルーが消えてしまう。

例→あ\setbox0=\hbox{\inhibitglue}(このカッコの直前

これらの穴をふさぐ修正のついでに,今回の \inhibitglue の挙動変更となりました。

【新しい挙動】

(3) TeX Live 2019 以降(予定)

1. \inhibitglue は,その後にノードが挿入されると無効化する。
つまり,\null や \hskip や \kern や \vrule といったノード挿入では必ず無効化され,
上述の [穴1つ目] のようなことは起こらない。

2. \inhibitglue は,ノードを挿入しない処理であれば透過する(無効化しない)。
つまり,\relax や \let\A\B や数値代入では無効化されない。

3. \inhibitglue の効果はリスト内に閉じる。
つまり,上述の [穴2つ目] のようなことは起こらない。

4. \inhibitglue を無効化する \disinhibitglue という新プリミティブの追加。
これは,上記 2. により \relax などが \inhibitglue を無効化しなくなったので,
「効きすぎて困った」という場合の対策として使えることを想定。

参考:GitHub issue 28
https://github.com/texjporg/tex-jp-build/issues/28

この新挙動が入った pTeX は,バージョンが p3.8.2 と表示されますので区別可能です。
(cf. TeX Live 2018 の最新版は p3.8.1)