2 行の段落では \widowpenalty と \clubpenalty はどのように相互作用しますか?

2 行の段落では \widowpenalty と \clubpenalty はどのように相互作用しますか?

\\*改行を防ぐのに十分でない場合があります。{\widowpenalty10000 \par}またはを追加する{\clubpenalty10000 \par}と、分離された行が段落の最後でページの上部に残ってしまう場合 (「widow」)、または段落の最初でページの下部に残ってしまう場合 (「orphan」) に役立ちます。

次に例を示します。

\documentclass{article}

\newcommand*{\twolines}{%
  line 1 \\*
  line 2 \par%
}
\newcommand*{\twolinesInseparable}{%
  line 1 \\*
  line 2 {\widowpenalty10000 \par}%
}

\begin{document}

\vspace*{32\baselineskip}
\twolines\twolines\twolines
\twolines\twolines\twolines
\twolines\twolines\twolines

\newpage

\vspace*{32\baselineskip}
\twolinesInseparable\twolinesInseparable\twolinesInseparable
\twolinesInseparable\twolinesInseparable\twolinesInseparable
\twolinesInseparable\twolinesInseparable\twolinesInseparable

\end{document}

このコードでは、ページ 1 と 2 の間の改行 ( \twolines) によって 2 行のチャンクが分割されます ( にもかかわらず\\*)。一方、ページ 3 と 4 の間では改行は発生しません ( \twolinesInseparable、つまり「無限大」 ( 10000)が設定されます\widowpenalty)。

これら 2 つのパラメータは、2 行の段落に対して意味のある方法で相互作用しますか?

\widowpenalty(これは理論的な質問です。またはを含むさまざまなマクロが競合したり、無意味な制約や矛盾する制約を作成したりしないことを確認するという思考実験以外に、現時点では実用的なアプリケーションは\clubpenaltyありません。)

答え1

を追加したときに何が得られるかを見てみましょう\showoutput。最初の 2 行に関連する診断メッセージのみを示します。

Completed box being shipped out [1]
\vbox(633.0+0.0)x407.0
.\glue 16.0
.\vbox(617.0+0.0)x345.0, shifted 62.0
..\vbox(12.0+0.0)x345.0, glue set 12.0fil
...\glue 0.0 plus 1.0fil
...\hbox(0.0+0.0)x345.0
..\glue 25.0
..\glue(\lineskip) 0.0
..\vbox(550.0+0.0)x345.0
...\write-{}
...\glue(\topskip) 10.0
...\rule(0.0+0.0)x*
...\penalty 10000
...\glue 384.0
...\glue 0.0
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 5.05556
...\hbox(6.94444+0.0)x345.0, glue set 306.11107fil
....\hbox(0.0+0.0)x15.0
....\OT1/cmr/m/n/10 l
....\OT1/cmr/m/n/10 i
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 e
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 1
....\penalty 10000
....\glue 0.0 plus 1.0fil
....\penalty -10000
....\glue(\rightskip) 0.0
....\glue(\rightskip) 0.0
...\penalty 10000
...\penalty 300
...\glue(\baselineskip) 5.05556
...\hbox(6.94444+0.0)x345.0, glue set 321.11107fil
....\OT1/cmr/m/n/10 l
....\OT1/cmr/m/n/10 i
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 e
....\glue 3.33333 plus 1.66666 minus 1.11111
....\OT1/cmr/m/n/10 2
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0
...\glue(\parskip) 0.0 plus 1.0
...\glue(\baselineskip) 5.05556

何が起こるかは明らかです。コマンドは\\*を実行し\vadjust{\penalty10000}、この\vadjust項目は を含む行の後に続きますline 1。しかし、段落に関連する通常のペナルティも追加されます。この場合、 と の合計\clubpenalty\widowpenalty挿入され、 になります\penalty300。外側の垂直リストのペナルティは実行可能なページ区切り点であり、TeXできるそしてする7番目の2行のペアで選択します。

これはどういう意味でしょうか? 単純に、\\*段落内で改ページを禁止するために使用すべきではないということです。\\実を言うと、一般的には行を区切るために使用すべきではありません。

関連情報