vor \begin{addmargin} gesetztes \clubpenalty wird ignoriert

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: vor \begin{addmargin} gesetztes \clubpenalty wird ignoriert

von khzimmer » So 8. Sep 2019, 16:46

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

von khzimmer » Sa 7. Sep 2019, 18:34

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 :)

von Gast » Sa 7. Sep 2019, 18:12

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.

vor \begin{addmargin} gesetztes \clubpenalty wird ignoriert

von khzimmer » Sa 7. Sep 2019, 17:37

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

Nach oben