Sie sind hier

Letzte Zeile und Absatzblock

Wie kann ich ein Zeile, die auf der vorherigen Seite ist, aber zu einem Absatzblock gehört mit auf die nächste Seite bringen. Das soll so funktionieren wie mit /paragraph, nur das dieser Befehl mir zusätzlich Abstand oberhalb des Absatzes macht und das möchte ich nicht, ich möchte den globalen Absatz zwischen zwei Absätzen nutzen.

ich habe ein Befehl definiert änlich \paragraph :

\newcommand{\paragraphcode}[1]{\texttt{#1}}

es soll etwa so ausehen:

Text Text Text Text
Text Text Text Text
  ^
  | Absatz wie im ganzan Dokument
  |
\paragraphcode{Text} - Text Text Text Text      <--- siehe [BESCHREIBUNG]
Text Text Text Text                                  
Text Text Text Text                                                                                       
<\code>
 
[BESCHREIBUNG] Die Zeile soll nicht am Ende der 
Seite alleine stehen, sondern 
auf die nächste seite verfrachtet 
werden.
 
 
Hat einer für mich einen Tipp, wie ich das bewerkstelligen kann
forum: 
Bild von Markus Kohm

Siehe dazu die De-TeX-FAQ (Link gibt es massenhaft im Forum). Dort die Frage: »Wie kann ich `Hurenkinder' (engl. widows), also einzelne Zeilen eines Absatzes am Kopf von Buchseiten, bzw. `Schusterjungen/Waisenkinder' (engl. clubs), einzelne Absatzzeilen auf der Seite unten, verhindern?«

Eine etwas eigenartige Beschreibung :D Aber sie funktioniert ! THX

Die Lösung !

\newcommand{\paragraphcode}[1]{\clubpenalty=10000\texttt{#1}}

Der gelungsbereich ist mir noch unklar, hoffe der beschränkt sich auf \paragraphcode

Bild von Markus Kohm

Penalties gelten immer bis zum Ende der aktuellen Gruppe. da du keine Gruppe verwendest also forever.

Wobei ich ja ehrlicherweise zugeben muss, dass mir absolut nicht klar ist, was der Sinn des Ganzen ist. Wenn das wirklich eine Überschrift werden soll, dann solltest du auch eine Überschrift definieren (siehe Definition von \paragraph in classes.dtx oder \minisec in scrclass.dtx). Ich vermute aber (schon wegen \texttt), dass das eigentlich etwas ganz anderes werden soll.

Nein lasse dich nicht von \texttt beirren. Es ist gnau wie \paragraph, nur mich stört der Absatz dem dieser oberhalb macht. Da hast du recht, dass ich \paragraph redefineren könnte, nur verstehe ich davon nicht so viel.

Der \paragraph soll eigentlich so aussehen:

\paragraph{\texttt{ÜBERSCHRIFT}}

Dannach soll der dazugehörige Absatztext folgen. Nur oberhalb \paragraph soll der Abstand \baseskip höchstens die Absätze in der Länge trennen. \paragraph hat ja eine elastische Größe und macht mehr als nur eine Zeile Abstand oberhalb und das soll ja eben nicht so sein.

Bild von Markus Kohm

AFAIK ist in der De-TeX-FAQ erklärt, wie die Definition eines Gliederungsbefehls mit \@startsection funktioniert. In jedem Fall ist das in classes.dtx und source2e erklärt. Du hast ja auch schon erkannt, dass der Abstand über \paragraph elastisch ist. Jetzt rate mal, wo in

% Definition aus scrartcl.cls
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
  {3.25ex \@plus1ex \@minus.2ex}%
  {-1em}%
  {\setlength{\parfillskip}{\z@ \@plus 1fil}%
    \raggedsection\normalfont\sectfont\nobreak
    \size@paragraph\nobreak}}

die elastische Größe des Abstandes vor der Überschrift steckt, wie man die Dehnbarkeit und Schrumpfbarkeit raus bekommt und den Wert des Abstandes ändert (nicht vergessen, \newcommand durch \renewcommand zu ersetzen). Wenn du KOMA-Script verwendest, kannst du tt dann per \addtokomafont{paragraph}{\ttfamily} erreichen. Wenn du nicht KOMA-Script verwendest, solltest du statt obiger Definition die aus deiner Klasse verwenden und am Ende des letzten (also des sechsten) Arguments von \@startsection ein \ttfamily einfügen.

Iregendwie bekomme ich Fehler, wenn ich das so am Anfang des Dokumentes setze, habe aber mal gegooglet und fand heraus das ich das zwischen \makeatletter und \makeatother setzen muss und da ich ja Koma-Skript benutze, habe ich auch \addtokomafont{paragraph}{\ttfamily} verwendet und das klappt jetzt mit den Absätzen und der letzten Zeile.

\makeatletter
\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
  {3.25ex \@plus1ex \@minus.2ex}%
  {-1em}%
  {\setlength{\parfillskip}{\z@ \@plus 1fil}%
    \raggedsection\normalfont\sectfont\nobreak
    \size@paragraph\nobreak}}
\makeatother

Irgendwie nimmt er den \bigskip abstand nicht so richtig an und der Leerraum zwischen Überschrift des Paragraphen und Text ist etwas zu groß, aber vielleicht bekomme ich das auch noch hin. Ach ja und die Pragraphüberschrift ist noch Fett. Aber vielleicht bekomme ich das noch irgendwie hin.
THX für die prompte Hilfe

Bild von Markus Kohm

Ich weiß nicht, wo du \bigskip verwendet hast. In dem von dir geposteten Code ist es nicht zu finden. Es sei aber angemerkt, dass \bigskip nicht einfach ein Wert wie 3.25ex \@plus1ex \@minus.2ex ist, sondern:

\def\bigbreak{\par\ifdim\lastskip

Es ist also anzunehmen, dass du eher etwas wie \bigskipamount verwenden willst, wobei \bigskipamount wiederum ein skip und keine dimension, also dehnbar und schrumpfbar ist. Du solltest also wirklich eher etwas wie 2ex verwenden, wenn das weder gedehnt noch geschrumpft werden soll.

Der Abstand hinter der Überschrift ist durch -1em vorgegeben, wobei das Vorzeichen nicht für einen negativen Abstand steht, wie man meinen sollte, sondern dafür, dass ein horizontaler statt einem vertikalen Abstand verwendet werden soll. Der kleinste mögliche horizontale Abstand ist 1 sp durch Verwendung von -1sp.

Ich verwende in meinen Dokument den folgenden Kopf:

\documentclass[12pt,a4paper,cleardoubleempty,pointlessnumbers,parskip]{scrbook}

und verwende für das ganze Dokument den Zeilenabstand:

\linespread{1.25}\selectfont
\addtokomafont{sectioning}{\linespread{1}\selectfont}

So mache ich den Absatzabstand einfach mit der Returntaste, also nicht mit \\. Wenn ich jetzt für das ganze Dokument das folgende verwende:

\clubpenalty=10000 %verhindert einzelne erste Zeilen unten
\widowpenalty=10000 %verhindert einzelne letzte Zeilen oben

Dann dehnt er mir die Abstände zwischen den Absätzen so, dass der Text unten und oben bündig ist. Das liegt ja an parskip in der Dokumentclasse. Ich will aber, dass der Text nur oben bündig mit der Seite ist und die Abstände gleich sind, etwas Spielraum sollten die dennoch haben. Wenn ich also \parskip=WERT verwende sind die Abstände zwischen den Absätzen nicht mehr elastisch. Sie sollen elastisch sein, aber nicht bis ins Unendliche, sonder mit ganz kleiner Elastizität.

Übrigens wenn ich nur \clubpenalty=10000 benutze, sieht es so aus wie ich mir das vorstelle, nur dass die einzelne letzte Zeilen oben nicht verhindert wird.

Bild von Markus Kohm

Du veränderst den Durchschuss, ohne den Satzspiegel anzupassen. In der Voreinstellung doppelseitiger Dokumente (Voreinstellung von scrbook) wird mit vertikalem Ausgleich gearbeitet, damit die letzte Zeile immer an derselben Stelle steht. Damit das bei normalem Text ohne Dehnung funktioniert, wird der Satzspiegel von typearea so berechnet, dass der Satzspiegel eine ganze Anzahl von Zeilen zuzüglich \topskip hoch ist. Wenn man nun aber den Durchschuss ändert, dann stimmt diese Berechnung nicht mehr. Deshalb steht in der KOMA-Script-Anleitung auch, dass man bei Änderung des Durchschusses anschließend mit \typearea den Satzspiegel neu berechnen soll. Das war das eine.

Außerdem handhabt TeX es so, dass bei Problemen mit der Füllung (egal ob vertikal aufgrund des vertikalen Ausgleichs oder horizontal beispielsweise im Blocksatz) alle dehnbaren Abstände entsprechend ihrer Dehnbarkeit überdehnt werden. Bei Überdehnung wird dann aber eine Meldung »underfull \vbox« (bzw. dasselbe mit »\hbox« bei horizontalen Problemen) von TeX erzeugt. Darauf solltest du einmal achten, denn der Absatzabstand ist nicht mit unendlicher Dehnbarkeit definiert, sondern es darf je nach parskip-Option maximal eine halbe Zeile zusätzlicher Abstand eingefügt werden (bevor eben überdehnt und damit das Problem auch gemeldet wird).

Desweiteren ist existiert ein grundsätzliches Satzproblem, wenn gleichzeitig Schusterjungen und Hurenkinder verboten und mit vertikalem Ausgleich gearbeitet wird. Eigentlich bedeutet das, dass der Seitenumbruch über mehrere Seiten hinweg (bei Büchern bis hin zu einem ganzen Kapitel) optimiert werden müsste. TeX bietet dafür aber praktisch keine Möglichkeit. Es bleibt nur, entweder auf den vertikalen Ausgleich zu verzichten (Stichwort: \raggedbottom) oder aber den Seitenumbruch an besonders problematischen Stellen von Hand zu optimieren, etwa mit gezielt eingestreuten \tolerance=-1 oder \tolerace=1 bei einzelnen Absätzen zu versuchen eine Zeile weniger oder mehr herauszuholen, oder vor einzelnen Überschriften gezielt mit \clearpage einen Seitenumbruch ohne vertikalen Ausgleich zu erzeugen.

Es würde zu weit führen, hier all diese Möglichkeiten im Detail auszuführen. Ich hoffe aber, die diversen möglichen Probleme und Lösungsansätze wurden etwas klarer.

Vielen Dank!
\raggedbotton ist genau das was ich gesucht habe. \tolerance=3500 habe ich vorher auch schon verwendet, nur nicht in bezug auf Absätze, sondern im Dokumentenkopf um größere Wortzwischenräume zu zulassen, da bei dem Schriftart (put), die ich benutze, sonst der Blocksatz nicht richtig gesetzt wird.

Comments for "Letzte Zeile und Absatzblock" abonnieren