texjporg / tex-jp-build

Minimum source repository to build Japanese TeX processing tools
23 stars 6 forks source link

[ptex] \hbox{・} の処理 #25

Open aminophen opened 7 years ago

aminophen commented 7 years ago

14 に「\hbox{・} の処理」という言及があったのですが,数ヶ月経って何だったっけ…?となってしまったので,非公開の場所ではない発言なので北川さんのを転載しておこうと思います。


pTeX で \hbox{・} で前の方に空白が入る問題ですが,どうやら adjust_hlist 関数のバグのようです.例えば \hbox{(} と入力したとき,adjust_hlist 関数に渡されるときには

\glue(refer from jfm) 4.58203 minus 2.291
\tenmin (
\penalty 10000(for kinsoku)

と,先頭に JFM グルーが挿入されています. しかし adjust_hlist 関数にある

if not is_char_node(link(p)) {p1.0.9d}
    and(type(link(p))=glue_node)and(subtype(link(p))=jfm_skip+1) then
  begin v:=link(p); link(p):=link(v);
  fast_delete_glue_ref(glue_ptr(v)); free_node(v,small_node_size);
  end;

というコードによって「ボックスの先頭が JFM グルーだった場合にはそのグルーを削除する」処理が行われます.同様に,ボックスの末尾が JFM グルーであった場合も削除されます.そのため,\hbox{(} の幅は 0.5 zw となります. 一方,\hbox{・} では,adjust_hlist 関数に渡される時点で

\penalty 10000(for kinsoku)
\glue(refer from jfm) 3.04276 minus 3.04276
\tenmin ・
\glue(refer from jfm) 3.04276 minus 3.04276

と先頭がグルーではありません.そのため,この場合は頭から二番目のグルーは残り,一方で最後のグルーは消えるので「前のみグルーが入る」という歪な結果になります. ペナルティは \unhbox の時を考えると消す必要はないと思いますが,「先頭が禁則用ペナルティかつその後が JFM グルー(JFM カーンも含む)であった場合でも,その JFM グルーを消す」とするのはどうでしょう? あと,\prebreakpenalty に 0 を設定すると,\penalty0 が入るんですね.せっかくなのでここも何とかしたいですね.

h-kitagawa commented 7 years ago

すっかり忘れていました,ありがとうございます.

07e48d0d2c60f69b954f7c78dd73a8b507917b9f で

なお,リストの先頭が JFM カーン(または禁則用ペナルティ→ JFM カーン)であったときにはまだ特に何もしていません.


同様に,ボックスの末尾が JFM グルーであった場合も削除されます.そのため,\hbox{(} の幅は 0.5 zw となります.

ですが,単純に削除されるのではなく,グルーが \hskip0pt になっていますね.削除されないのは何が理由があるのでしょうか?

aminophen commented 7 years ago

07e48d0

よさそうですね。ありがとうございます。 → r45329 でコミット。

ボックスの末尾が JFM グルーであった場合も削除されます.

ですが,単純に削除されるのではなく,グルーが \hskip0pt になっていますね.

ほんとだ,なんでだろう? 要らないノードは作らない方が良いと思うのですが…

\tracingonline1 \showboxdepth10000 \showboxbreadth10000
\kanjiskip10pt
\setbox0=\hbox{・あ・}\showbox0
漢\box0漢
\bye
h-kitagawa commented 6 years ago

ボックスの末尾が JFM グルーであった場合,グルーが \hskip0pt となる

\hbox{)}あ\hbox{)\inhibitglue}あ を比較すると,前者だとグルーのおかげで「)」「あ」の間に \kanjiskip が挿入されないという違いがありますね.どうしてこういう挙動になっているのだろう…….