Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
aminophen opened this issue Sep 9, 2017 · 3 comments
Open

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

aminophen opened this issue Sep 9, 2017 · 3 comments

Comments

@aminophen
Copy link
Member

aminophen commented Sep 9, 2017

#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 が入るんですね.せっかくなのでここも何とかしたいですね.

@aminophen aminophen changed the title \hbox{・} の処理 [ptex] \hbox{・} の処理 Sep 9, 2017
@h-kitagawa
Copy link
Member

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

07e48d0

  • 先頭が禁則用ペナルティかつその後が JFM グルーであった場合でも,その JFM グルーを消す
  • 禁則用ペナルティに 0 が設定されていた場合,未設定であるかのように振る舞う(わざわざ\penalty0は挿入しない)
    を実装しました.

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


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

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

@h-kitagawa h-kitagawa reopened this Sep 9, 2017
@aminophen
Copy link
Member Author

aminophen commented Sep 9, 2017

07e48d0

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

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

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

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

\tracingonline1 \showboxdepth10000 \showboxbreadth10000
\kanjiskip10pt
\setbox0=\hbox{・あ・}\showbox0
漢\box0漢
\bye

@h-kitagawa
Copy link
Member

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

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants