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

強制改行と \par で Underfull 警告が出ない(← platex と pdflatex でハイフネーションが変わる) #27

Open
aminophen opened this issue Nov 5, 2016 · 15 comments

Comments

@aminophen
Copy link
Member

aminophen commented Nov 5, 2016

texconf16 の懇親会の雑談で出した話題です:

\documentclass{article}
\hyphenpenalty=0
\begin{document}
ABC\footnote{footnote footnote footnote footnote
footnote footnote footnote footnote
footnote footnote footnote footnote\\\begin{enumerate}\item TEST\end{enumerate}}
\end{document}

このハイフネーションが、platex と pdflatex で異なります。

@okumuralab
Copy link
Member

あれ,うちではどちらもハイフネーション起こりません。pdflatex 32966バイト,platex 4379バイト。

@aminophen
Copy link
Member Author

バイト数だとよくわからない(両方とも symlink のはず)なので、platex --version などをもらえますか? うちの win32 と北川さんの linux で再現していて、platex では foot-note の分割が一箇所減ります。

@okumuralab
Copy link
Member

PDFのバイト数はバージョンを示すためではなく,ずいぶん違うサイズになるという意味でした。
$ pdflatex --version
pdfTeX 3.14159265-2.6-1.40.17 (TeX Live 2016)
kpathsea version 6.2.2
Copyright 2016 Han The Thanh (pdfTeX) et al.
There is NO warranty. Redistribution of this software is
covered by the terms of both the pdfTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the pdfTeX source.
Primary author of pdfTeX: Han The Thanh (pdfTeX) et al.
Compiled with libpng 1.6.21; using libpng 1.6.21
Compiled with zlib 1.2.8; using zlib 1.2.8
Compiled with xpdf version 3.04
$ platex --version
e-pTeX 3.14159265-p3.7-160201-2.6 (utf8.euc) (TeX Live 2016)
kpathsea version 6.2.2
ptexenc version 1.3.4
Copyright 2016 D.E. Knuth.
There is NO warranty. Redistribution of this software is
covered by the terms of both the e-pTeX copyright and
the Lesser GNU General Public License.
For more information about these matters, see the file
named COPYING and the e-pTeX source.
Primary author of e-pTeX: Peter Breitenlohner.

@h-kitagawa
Copy link
Member

tests/hyphtest0.tex でログに結果が出るようにしました.

pdflatex で実行すると

..\OT1/cmr/m/n/10 f
..\OT1/cmr/m/n/10 o
..\kern0.27779
..\OT1/cmr/m/n/10 o
..\OT1/cmr/m/n/10 t
..\discretionary
...\OT1/cmr/m/n/10 -
..\OT1/cmr/m/n/10 n
..\OT1/cmr/m/n/10 o
..\OT1/cmr/m/n/10 t
..\OT1/cmr/m/n/10 e

と discretionary が入りますが,platex では入りません.

@h-kitagawa
Copy link
Member

plcore.ltx では

\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null
    \ignorespaces
  \fi}

と @gnewline を再定義しており,最後に \null を追加しています.

これをなくす(LaTeX でのオリジナルの定義に戻す)と解決しますが,plcore.dtx にある通り,
今度は あいうえお\\!かきくけこ のようなソースで改行が出来なくなります(これが \null を追加した理由でした).

よくわかりませんが,

\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \break
    \ignorespaces
  \fi}

と \null の代わりにもう一度 \break を入れると両方ともうまく動いているようです.

@aminophen
Copy link
Member Author

aminophen commented Nov 5, 2016

あれ,うちではどちらもハイフネーション起こりません。

これについてはすみません、北川さんに例示したときとココに書き込んだソースが違っていました(ので今追記しました)。\hyphenpenalty=0 を設定してコンパイルすると再現するはずです。

pdflatex 32966バイト,platex 4379バイト。

ああこれは生成した pdf のサイズだったのですね。てっきり実行ファイルか何かのサイズかと… pdf のサイズは dvipdfmx と pdftex で結構違いますからそういうものでしょうね。

@okumuralab
Copy link
Member

\hyphenpenalty=0 でMacでも再現しました。なるほどplcoreがらみの話だったんですね。PDFのサイズがpdflatexで肥大しているのでmicrotypographyがenableされてしまったのかと思いましたが,これはむしろdvipdfmxの最適化(おかげで行末が揃わないことがある,Windowsの游とか)のおかげなのでしょうか。

@h-kitagawa
Copy link
Member

\null の代わりにもう一度 \break を入れる

c778a48 で exppl2e.sty に入れました.

PDFのサイズがpdflatexで肥大している

dvipdfmx では Type1 フォントを CFF に変換していますが,pdfTeX(, LuaTeX) ではそのような処理をしていないことによると思われます.

@aminophen
Copy link
Member Author

2ヶ月前に発見していたのですが、pTeX / e-pTeX バイナリ由来なのか plcore 絡みなのか、はたまたフォーマット作成時に読まれるハイフネーションパターンファイルの違い由来なのかが区別できず、報告を怠っていました。今回北川さんのご尽力で \@gnewline とわかりスッキリしました。

TeX Live 2016 の期間中の pLaTeX カーネルの変更は、基本的には次回(今月末?)を最後にしようと思っています。今回のハイフネーションのような古いバグの fix は、TeX Live 2017 pretest までカーネルには入れません。今月末のリリースでは、100% 副作用がなさそうな #3 の FAM256 だけカーネルにインストールし、\@gnewline の fix は exppl2e.sty のテストに入れます。

@okumuralab
Copy link
Member

dvipdfmx では Type1 フォントを CFF に変換していますが,pdfTeX(, LuaTeX) ではそのような処理をしていないことによると思われます.

それが原因ですか。ありがとうございます。

@aminophen
Copy link
Member Author

例の \@gnewline の修正に関するバグを早速見つけました。

\RequirePackage{exppl2e}
\documentclass{article}
\begin{document}
XXX\\XXX\par
\end{document}

新しい定義だと、おかしな空行が入って

Underfull \hbox (badness 10000) in paragraph at lines 4--4

が出てきます。(発見のきっかけは LaTeX2e の tl2e2.lvt より)

@h-kitagawa
Copy link
Member

h-kitagawa commented Nov 7, 2016

確認しました.XXX\\\\XXX\par と変えると,1行入るはずの空行が3行になりますね.
結構厄介で,\nobreak \hfil\break\penalty9999 でもこの症状は発生し,
\nobreak \hfil\break\nobreak としないと回避できないようです.

\nobreak \hfil\break\nobreak とすると,

XXX\\XXX\par
XXX\\\\XXX\par
あいう\\!かきく\par
あいう\\\\!かきく\par
a footnote\\

はうまくいっているみたいです.

2016-11-07 20:51追記:\prebreakpenalty を負の値にすると,あいう\\!かきく\par` で余計な空行が現れます.やはりこの「ペナルティを重ねる」方針には無理がある?

@aminophen
Copy link
Member Author

aminophen commented Nov 7, 2016

なるほど

\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \nobreak 
    \ignorespaces
  \fi}

を試すとたしかにうまくいってそうです…が、まだよくわかってないので不安です。

2016-11-07 20:51追記: \prebreakpenalty を負の値にすると,あいう\\\\!かきく\par で余計な空行が現れます.やはりこの「ペナルティを重ねる」方針には無理がある?

これは厄介ですね… 実際問題として \hyphenpenalty=0 とでもしないと組版上で露呈しないようなら、諦めて \null が入ったアスキーの定義を「仕様」と定めるのも手だと思います。

LuaTeX は TeX82 とハイフネーション規則が異なるというのも、私は全く把握していませんでした。また、\@gnewline は jsclasses 側では「\inhibitglue を足す」という変更を加えているのですね。つまり exppl2e.sty にパッチを入れたとしても、js に再定義されてしまってテストが全然機能できない…。前回の #16 のときも jsclasses による独自の定義とぶつかってテストしづらい状況でしたので、テスト法についても検討がいるかもしれません。

@aminophen
Copy link
Member Author

aminophen commented Nov 11, 2016

さっぱりわかりませんが

\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \space
    \ignorespaces
  \fi}

という定義を試してみると、これはハイフネーションできるようです。

さらに、これはどうやら現行の jsclasses にある定義

\def\@gnewline #1{%
  \ifvmode
    \@nolnerr
  \else
    \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break \null
    \inhibitglue \ignorespaces
  \fi}

の \inhibitglue 発行と同様の JFM グルーを消す結果になっているようにも見えます。

まだ以下のソースでしか試していませんので怪しいですが。

\documentclass{article}
\hyphenpenalty=0
\begin{document}
ABC\footnote{footnote footnote footnote footnote
footnote footnote footnote footnote
footnote footnote footnote footnote\\\begin{enumerate}\item TEST\end{enumerate}}

あいう\\!かきく
\end{document}

@aminophen
Copy link
Member Author

aminophen commented Nov 17, 2016

どうやらこの issue は、「ハイフネーションが変わる」ことではなく「LaTeX で空行を入れた場合の挙動」が本質だったようです。

以下のソースを考えます。

\documentclass{article}
\begin{document}
a test\\

b test
\end{document}

latex で処理すると

Underfull \hbox (badness 10000) in paragraph at lines 3--4

が出ますが、platex では出なくなります。

このようなソースの書き方は、本来 LaTeX では好ましくないとされるもの(TeX.SX のこの回答の下の議論などを参照)でしょうから、Underfull 警告が出るのが期待される挙動だと思われます。latex で Underfull 警告が出て platex で出ない理由は、ZR さんが説明してくださっています。

\\\par」とすると、段落の最後は

nobreak;hfil;break(;hbox)
;nobreak;hskip-parfillskip

と並ぶ。breakの箇所で行分割すると、hbox(\null)のないpdflatexでは後続を全部吹き飛ばしてしまう。(twitter:@zr_tex8r

「ハイフネーションが変わる」という現象は Underfull 警告をトリガとしていて、latex の場合だけ分綴の可能性を考慮した行分割を試そうとするからのようです。platex の場合は Underfull 警告が出ないので、2パス目にあたる分綴を加味した demerit の最小化ルーチンに渡ることなく、1パス目の行分割ルーチンがそのまま採用されるので、結果的に \discretionary が出なくなると理解できます。

\\\par と書いた場合には「空行がひとつ出る」わけですから、現在の latex と platex の組版結果に差はありません。\@gnewline\null\hskip\z@ あるいは \space に変えるという変更を施せば「LaTeX のコンセプトどおり Underfull 警告が復活する」わけですが、その“副作用”として JFM グルーが消えることを考えると、plcore.ltx は現状維持(Underfull が出ないことを「仕様」と定める)がよい気がします。

一方、jsclasses のほうは JFM グルーを消したいという明確な意図があるので、そちらは「Underfull 警告の復活」も可能であると思われます。

@aminophen aminophen changed the title platex と pdflatex でハイフネーションが変わる 強制改行と \par で Underfull 警告が出ない(← platex と pdflatex でハイフネーションが変わる) Nov 19, 2016
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

3 participants