vor \begin{addmargin} gesetztes \clubpenalty wird ignoriert

Schriftbild, Absätze und Auflistungen einstellen


khzimmer
Forum-Anfänger
Forum-Anfänger
Beiträge: 32
Registriert: So 3. Mär 2019, 12:01

vor \begin{addmargin} gesetztes \clubpenalty wird ignoriert

Beitrag von khzimmer »

Hallo Wissende,

aus geheimem :) Grund möchte ich nach begin{document} die \clubpenalty mehrmals zwischen 0 und 10000 hin und umschalten.

Es funktioniert für normale Absätze gut, die 10000 wird aber leider in Absätzen ignoriert, die innerhalb einer addmargin-Umgebung sind.

mein Minimalbeispiel, bitte testweise \begin und \end der addmargin-Umgebung ein- und auskommentieren:
\documentclass{scrbook}

\clubpenalty=0


\begin{document}

Test des dynamischen ein/aus Schaltens der \textbackslash clubpenalty:

\vspace{41\baselineskip}


Hier sollte der letzter Absatz der Seite sein: Danach werden Schusterjungen verboten.


\clubpenalty=10000

\begin{addmargin}{1.5em}
Dieser Absatz nun SOLLTE komplett auf Seite 2 gesetzt werden, weil Schusterjungen ja per Strafwert 10000 verboten sind. Diese weitere Worte des Absatzes dienen nur dazu, ihn noch ein wenig mehr aufzufüllen.
\end{addmargin}


\end{document}
Ist das ein allgemeineres Problem? Wüsste jemand eine Lösung, ohne mir dabei addmargin ausreden zu wollen? ;)

Vielen Dank
Karl-Heinz

Gast

Beitrag von Gast »

LaTeX setzt per \everypar oder durch Umdefinierung von \par \clubpenalty immer wieder neu selbst entweder auf den Wert von \@clubpenalty oder \@M (das ist übrigens ebenfalls 10000). Eine dieser Gelegenheiten ist das Ende einer trivlist und damit auch das Ende jeder Listenumgebung. Wie in der KOMA-Script-Anleitung zu lesen ist, ist addmargin eine Listenumgebung. Eine andere Gelegenheit ist \item. Was nicht in der KOMA-Script-Anleitung zu lesen ist, was aber eigentlich logisch ist, wenn addmargin eine Listenumgebung ist, dass am Anfang der addmargin-Umgebung ein implizites \item ausgeführt wird.

Es gibt auch noch weitere Gelegenheiten wie die \@xsect oder \@afterheading. Deshalb kann man sich nicht darauf verlassen, dass eine Änderung von \clubpenalty auch nur das Ende des aktuellen Absatzes geschweige denn den Anfang einer neuen Umgebung oder eines Gliederungsbefehls o. ä. übersteht. Das Minimum wäre, lokal nicht nur \clubpenalty sondern auch \@clubpenalty zu ändern. Am besten definiert man sich dafür einen Befehl, der beide Werte ändert. \@clubpenalty ist übrigens ein TeX-Zähler, also bitte nicht mit [r]\renewcommand][/tt] sondern einfach per Wertzuweisung ändern. Je nachdem, was du tatsächlich vor hast, genügt eventuell auch \@nobreaktrue. Oder du willst eventuell eine minipage innerhalb der addmargin-Umgebung. Das kann ich nicht beurteilen, weil du nicht dein eigentliches Problem angegeben hast, sondern nur welches Problem du mit deinem eigenen Lösungsversuch hattest.

khzimmer
Forum-Anfänger
Forum-Anfänger
Beiträge: 32
Registriert: So 3. Mär 2019, 12:01

Beitrag von khzimmer »

Vielen Dank für die freundliche Erklärung.

Mein Ziel ist tatsächlich nur die Vermeidung von Schusterjungen in einigen, besonderen Fällen, daher passt Dein erster Tipp am besten.

Mit diesen Anweisungen klappt's:
\makeatletter\clubpenalty=\@M\@clubpenalty=\@M\makeatother
Fröhliche Wochenendgrüße :)

khzimmer
Forum-Anfänger
Forum-Anfänger
Beiträge: 32
Registriert: So 3. Mär 2019, 12:01

Beitrag von khzimmer »

PS: Ergänzender Hinweis für evtl. später dies Lesende:

Setzen von \clubpenalties anstelle der alten Befehle erspart das doppelte Setzen und kommt ohne ein @ aus.

Dies klappt gut für mich:
% verbieten der Schusterjungen:
\clubpenalties 2 10000 0

% einer oder mehrere Absätze …

% erlauben der Schusterjungen:
\clubpenalties 1 0

Antworten