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

\prebreakpenalty の合算と JFM グルー,\lastpenalty #67

Open
aminophen opened this issue Sep 17, 2018 · 4 comments
Open

\prebreakpenalty の合算と JFM グルー,\lastpenalty #67

aminophen opened this issue Sep 17, 2018 · 4 comments

Comments

@aminophen
Copy link
Member

aminophen commented Sep 17, 2018

「\postbreakpenalty が設定されている文字(始め括弧類など)の後ろに JFM グルーの設定がある」という状況下(jlreq クラスの jlreq.tfm など)での禁則ペナルティの挙動についての疑問です。

  • [疑問1] (\postbreakpenalty + 後ろにグルー な文字)(\prebreakpenalty な文字) の並びでは合算が起きる(☆)が,この間に \relax などが挟まると合算されなくなる。
  • [疑問2] 上記(☆)の合算が起きる場合も,(\postbreakpenalty + 後ろにグルー な文字) の直後の \lastpenalty を取得してみると必ずゼロになる。

これらの挙動が私には不自然に思えます。(この “状況” 自体がアスキー pTeX にとって想定外?)何か良い改善案はあるでしょうか?

[疑問1] については,下記のソースで再現します。

  • jis.tfm の場合: の後禁則 10000 と の前禁則 10000 が合算され,20000 のペナルティになる。これは間に \relax が挟まっても変わらない。
  • jlreq.tfm の場合: \relax を挟んだ時だけ合算が起きなくなる。
\tracingonline1
\showboxdepth10000
\showboxbreadth10000

\font\y=jis \y
\setbox0=\vbox{ああああ()ああああ\showlists}% => 合算される
\setbox4=\vbox{ああああ(\relax )ああああ\showlists}% => 合算される
\font\x=jlreq \x
\setbox0=\vbox{ああああ()ああああ\showlists}% => 合算される
\setbox4=\vbox{ああああ(\relax )ああああ\showlists}% => 合算されない(!)

[疑問2] については,これに続けて下記のソースを付けると再現できます。

\font\y=jis \y
\setbox8=\vbox{あ(%
  \showthe\lastnodetype    % => 13
  \showthe\lastnodesubtype % => 2
  \showthe\lastpenalty     % => 10000
}
\font\x=jlreq \x
% * pTeX では,ある文字に禁則ペナルティと JFM グルーが後置されるとき
%   Kinsoku penalty -> JFM glue の順になる。
%   だから jlreq では最後のノードとして JFM グルーが検知される【期待どおり】。
%   すると \lastpenalty がゼロになる【★】。
\setbox8=\vbox{あ(%
  \showthe\lastnodetype    % => 11
  \showthe\lastnodesubtype % => 21
  \showthe\lastpenalty     % => 0
}
%   試しに,予め \unskip しておくと,確かにその前のノードは禁則ペナルティである。
\setbox8=\vbox{あ(\unskip
  \showthe\lastnodetype    % => 13
  \showthe\lastnodesubtype % => 2
  \showthe\lastpenalty     % => 10000
}
\bye
@h-kitagawa
Copy link
Member

取り急ぎ,[疑問1] テストソースの jlreq の場合ですが,

  • (\relax 間には \postbreakpenalty とゼロ空白(JFM 由来)
  • \relax) 間には \prebreakpenalty とゼロ空白(JFM 由来)

となるので,

  • JFM グルー挿入処理を \relax などで中断した場合,後に文字クラス 0 の和文文字があるものとしてグルーを挿入する
  • JFM グルーを開始した場合も,前に文字クラス 0 の和文文字があったものとしてグルーを挿入する

という現状の pTeX の仕様で説明はできます.

@aminophen
Copy link
Member Author

すみません,[疑問1] の内容が不明瞭でした。少しわかりやすい表現に直します。

「\prebreakpenalty は,直前にペナルティがあれば合算されて一つのペナルティになる」はずなのに,jlreq.tfm だと \relax によって阻害されるのは何故だろうか

という意図でした。

@aminophen
Copy link
Member Author

ptex-base.ch を読み直して,[疑問1] の理由までは判りました。

https://github.com/texjporg/tex-jp-build/blob/master/source/texk/web2c/ptexdir/ptex-base.ch#L6573

if not is_char_node(cur_q)and(type(cur_q)=penalty_node) then

https://github.com/texjporg/tex-jp-build/blob/master/source/texk/web2c/ptexdir/ptex-base.ch#L6591

if not is_char_node(tail)and(type(tail)=penalty_node) then
  • () の場合(=間に \relax がない),\prebreakpenalty 挿入時点ではまだ JFM グルーが挿入されていないので,最後のノードは \postbreakpenalty 由来のペナルティである。そのため,上の if 文が true になるので「合算」になる。
  • (\relax ) の場合(=間に \relax がある),\prebreakpenalty 挿入時点で既に JFM グルーが挿入されているので,最後のノードは JFM グルーである。そのため,上の if 文が false になるので「合算されず新たなペナルティとして発行」となる。

ただ,どうもしっくりこない挙動です。

@aminophen
Copy link
Member Author

あ,そもそもなぜ今回の [疑問1] [疑問2] が発生したかというと, texjporg/platex に置いてある tests/footnote.tex を jarticle → jlreq に変えると「\footnotetext が始め括弧類直後に置かれた場合への対策」が効かないことに気づいたからです。「JFM グルーが挟まると \lastpenalty がゼロになるし,\unpenalty もできない」という今の pTeX の挙動によって,この対策が効いていないことがわかると思います。

%\documentclass[twocolumn]{jarticle}
%\textwidth42zw
%\columnsep2zw
%\parindent0zw
\documentclass[twocolumn,line_length=20zw,column_gap=2zw]{jlreq}
\parindent0zw
\begin{document}

41あああああああああああああああああ(\footnotetext[1]{いいいいい}うううううううう\par
410ああああああああああああああああ(\relax\removejfmglue\footnotetext[1]{いいいいい}うううううううう\par
411あああああああああああああああああ(\footnotetext[1]{いいいいい}うううううううう\par
412あああああああああああああああ(\footnotetext[1]{いいいいい}うううううううう\par

\end{document}

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

No branches or pull requests

2 participants