Wie interagieren \widowpenalty und \clubpenalty in einem zweizeiligen Absatz?

Wie interagieren \widowpenalty und \clubpenalty in einem zweizeiligen Absatz?

Manchmal \\*reicht es nicht aus, einen Zeilenumbruch zu verhindern. Das Hinzufügen von {\widowpenalty10000 \par}oder {\clubpenalty10000 \par}hilft, wenn die abgetrennte Zeile am Ende des Absatzes steht und am Anfang einer Seite festhängt ("Witwenzeile") oder am Anfang des Absatzes steht und am Ende einer Seite festhängt ("Waisenzeile").

Hier ist ein Beispiel:

\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}

In diesem Code \twolineswird durch den Zeilenumbruch zwischen den Seiten 1 und 2 ( ) ein 2-zeiliger Block geteilt (trotz des \\*), während dies zwischen den Seiten 3 und 4 nicht geschieht ( \twolinesInseparable, wodurch ein „unendliches“ ( 10000) gesetzt wird \widowpenalty).

Interagieren diese beiden Parameter bei einem zweizeiligen Absatz auf sinnvolle Weise?

(Dies ist eine theoretische Frage. Mir fällt momentan keine praktische Anwendung ein, außer dem Gedankenexperiment, sicherzustellen, dass unterschiedliche Makros, die ein \widowpenaltyoder enthalten \clubpenalty, nicht miteinander in Konflikt geraten oder unsinnige oder widersprüchliche Einschränkungen erzeugen.)

Antwort1

Schauen wir uns an, was wir bekommen, wenn wir hinzufügen \showoutput. Ich zeige nur die Diagnosemeldungen zum ersten Zeilenpaar:

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

Es ist ganz klar, was passiert: Der Befehl \\*tut es \vadjust{\penalty10000}und dieses \vadjustElement findet seinen Weg nach der Zeile, die enthält line 1. Aber auch die normalen Strafen für die Absätze werden hinzugefügt. In diesem Fall wird die Summe von \clubpenaltyund \widowpenaltyeingefügt, was zu ergibt \penalty300. Jede Strafe in der äußeren vertikalen Liste ist ein möglicher Seitenumbruchpunkt, und TeXdürfenUndtutWählen Sie es im siebten Zweizeilenpaar.

Was bedeutet das? Einfach, dass es \\*in einem Absatz nicht verwendet werden sollte, um einen Seitenumbruch zu verhindern. \\Um die Wahrheit zu sagen, sollte es im Allgemeinen nicht zum Umbrechen einer Zeile verwendet werden.

verwandte Informationen