Как взаимодействуют \widowpenalty и \clubpenalty в абзаце из 2 строк?

Как взаимодействуют \widowpenalty и \clubpenalty в абзаце из 2 строк?

Иногда \\*недостаточно для предотвращения переноса строки. Добавление {\widowpenalty10000 \par}или {\clubpenalty10000 \par}помогает, если отделенная строка является последней в абзаце и застряла в верхней части страницы («вдова») или начальной в абзаце и застряла в нижней части страницы («сирота»).

Вот пример:

\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) разделит двухстрочный фрагмент (несмотря на \\*), тогда как между страницами 3 и 4 этого не происходит ( \twolinesInseparable, что устанавливает «бесконечность» ( 10000) \widowpenalty).

Взаимодействуют ли эти два параметра осмысленным образом в абзаце из двух строк?

(Это теоретический вопрос. Сейчас у меня нет практического применения, кроме мысленного эксперимента, чтобы убедиться, что различные макросы, включающие \widowpenaltyили , \clubpenaltyне конфликтуют и не создают бессмысленных или конфликтующих ограничений.)

решение1

Давайте посмотрим, что мы получим, если добавим \showoutput. Я просто покажу диагностические сообщения относительно первой пары строк:

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и , в результате чего получается . Любой штраф во внешнем вертикальном списке является допустимой точкой разрыва страницы, и TeX\widowpenalty\penalty300можетиделаетвыберите его в седьмой паре из двух строк.

Что это значит? Просто то, что \\*не должно использоваться в абзаце для запрета разрыва страницы. В общем, \\не должно использоваться для разрыва строки, если говорить по правде.

Связанный контент