PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Unterabschnitt sollte nicht alleine auf der Seite stehen



Specht
16-11-2009, 17:42
Hallo zusammen

Schon wieder ich, aber ich mache lieber für meine verschiedenen Fragen einzelne Threads.

Problem:

Ich habe einen Unterabschnitt. Als erstes steht dort eine Longtable. Je nach Situation kommt es nun vor, dass am Ende einer Seite nur noch die Überschrift steht und auf der nächsten Seite die Tabelle. Kann ich Latex irgendwie sagen, dass die Überschrift nicht alleine stehen darf und in diesem Fall auch auf die neue Seite soll?
Es muss auch nicht jeder Unterabschnitt auf eine neue Seite. Falls genügend Platz vorhanden ist, darf auch die Tabelle getrennt werden (in jeder 5. Zeile).

Das folgende Minimalbeispiel domonstriert mein Problem.



\documentclass{scrartcl}

\usepackage{longtable} %Tabellen mit Seitenumbruch

\begin{document}
\section{Erster Abschnitt}
\label{sec:ErsterAbschnitt}
\vspace{20cm}
\subsection{unterabschnitt}
\label{sec:unterabschnitt}
\begin{longtable}[l]{l@{\extracolsep{5mm}}lllll}
Das & ist & die & wunderbare & Kopfzeile & \\
\hline
\endhead
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
\end{longtable}
\end{document}

u_fischer
16-11-2009, 17:55
longtable ist etwas schwierig. Am einfachsten dürfte es sein, in solchen Fällen needspace zu benutzen:


\documentclass{scrartcl}

\usepackage{needspace,longtable} %Tabellen mit Seitenumbruch

\begin{document}
\section{Erster Abschnitt}
\label{sec:ErsterAbschnitt}
\vspace{20cm}
\needspace{5\baselineskip}
\subsection{unterabschnitt}
\label{sec:unterabschnitt}
\begin{longtable}[l]{l@{\extracolsep{5mm}}lllll}

usw.....

Specht
16-11-2009, 18:26
neespace ist fast das was ich bräuchte, wenn es zusammen mit Longtables nicht plötzlich die Kopfzeile doppelt ausgibt (siehe mein neues Minimalbeispiel)


\documentclass{scrartcl}

\usepackage{needspace}
\usepackage{longtable} %Tabellen mit Seitenumbruch

\begin{document}
\section{Erster Abschnitt}
\label{sec:ErsterAbschnitt}
\vspace{10cm}
\needspace{5\baselineskip}
\subsection{unterabschnitt}
\label{sec:unterabschnitt}
\begin{longtable}[l]{l@{\extracolsep{5mm}}lllll}
Das & ist & die & wunderbare & Kopfzeile & \\
\hline
\endhead
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
ja & hier & darf & problemlos & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\nopagebreak & hier & darf & nicht & umgebrochen & werden \\
\hline
\end{longtable}
\end{document}

u_fischer
16-11-2009, 18:47
Bitter ;-(. Naja, versuche entweder eine kleinen Wert (\needspace{2\baselineskip}), oder statt dessen \goodbreak.

Du kannst dem Autor auch einfach mal einen Bugreport schicken. Vielleicht findet er ja eine Lösung. (Allerdings sind die Probleme nicht neu:
http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=tools/3396).

Specht
17-11-2009, 09:23
Hab jetzt mal mit Zuckerbrot (\goodbreak) und Peitsche (\nopagebreak) versucht. Allerdings ohne Erfolg.

Bin auch mal auf \filbreak gestossen, dass ist aber im Zusammenhang mit einer longtable auch nicht möglich.

Ulrike, besten Dank für den Link. Andere haben das selbe Problem. Es werden dort auch noch Lösungsvorschläge diskutiert, aber auf einem Level welcher nicht mehr meinem entspricht.

Weitere Geistesblitze sind natürlich immer noch wilkommen.

u_fischer
17-11-2009, 12:36
Vielleicht klappt sowas:

\usepackage{ifthen}

\label{tab} in die erste der longtable diese vor \subsection:

\label{sec}
\ifthenelse{\equal{\pageref{sec}}{\pageref{tab}}}{ }{\newpage}%
\subsection{unterabschnitt}

Allerdings musst du regelmäßig die aux-Datei mal löschen, damit neu getestet werden kann.

Specht
17-11-2009, 14:19
interessante Idee. Habe ich ausprobiert und einen kleinen Hacken gefunden (wie kann es auch anders sein).

Wenn er merkt dass Tabelle und Section nicht auf der gleichen Seite sind fügt er einen Seitenumbruch ein und das ganze befindet sich nun auf der gleichen Seite. Soweit so gut, ist ja gewollt.

Da er immer die alte aux-Datei nimmt, sieht er beim nächsten Durchlauf dass beides auf der gleichen Seite ist und nimmt den (benötigten) Seitenumbruch wieder raus.

Mit mehreren solchen Sachen, sich verschiebenden Longtables und so weiter kommt es nie zu einem guten Ergebniss.

Aber ich danke dir für die Denkanstösse!

u_fischer
17-11-2009, 14:33
Dann hast du nicht meinen Code benutzt. Dort ist der \label{sec}-Befehl vor dem evtl. \newpage.

D.h. wenn nach \subsection der Seitenumbruch ist, sind beim ersten Lauf die \pagerefs beide undefiniert, also gleich -> kein \newpage. Beim zweiten Lauf ist sind die \pagerefs verschieden -> \newpage. Und von da an sind sie immer verschieden.

Specht
17-11-2009, 15:46
Du hast recht, ich hatte es nach der Section. Jetzt bin ich (oder du?, wir?) Ein Schritt weiter, aber noch nicht am Ziel. Folgende Situation:

Nach dem ersten Durchgang:
Unterabschnitt1: Label und Überschrift befindet sich auf einer Seite, die Tabelle auf der nächsten.
Unterabschnit2: Dem Label reicht es gerade noch auf die Seite, Überschrift und Tabelle sind auf der nächsten Seite zusammen.

Nach dem 2. Durchgang:
Vor dem Unterabschnitt1 wird wie gewüscht ein \pagebreak eingefügt. Jetzt rutsch aber die Tabelle welche zu Beginn komplett auf einer Seite Platz gehabt hat, ein wenig auf die nächste Seite. Jetzt kommt aber gleich ein Zeilenumbruch, weil es nach dem ersten Durchgang für das Label des 2. Abschnitts noch auf dieser Seite gereicht hat.

Jetzt habe ich dein ifthenelse mit 2 verschiedene erweitert, um das Label grundsätzlich dem Abschnitt zuzuordnen und nur bei einem Seitenumbruch das Label vor den Abschnitt. Es ist schon kompliziert zum erklären, also hier ein kleiner Pseudocode:
\ifthenelse{\\equal{\\pageref{sec}}{\pageref{tab}} }{section+Label}{Label+newpage+section}

Mein Problem ist, das ich mehrere solche Unterabschnitte habe und bei irgdendeinem fällt auch meine Lösung auf die Nase.

Die Suche geht weiter...

u_fischer
17-11-2009, 16:05
Ich habe gerade nochmal in needspace reingeschaut. Versuche doch einmal ob \Needspace{5\baselineskip} statt \needspace funktioniert.

Specht
17-11-2009, 16:41
100 Punkte für dich (hast ein Bier zu gut)! Es funktioniert wunderbar. Das ganze ist auch noch einfach und elegant.

Wenn du noch Lust hast, mir den Unterschied zwischen needspace und Needspace zu erklären fände ich das super.

u_fischer
18-11-2009, 08:12
Nun, im Wesentlich fügt \needspace Abstand ein und lässt dann TeX entscheiden, ob jetzt ein Zeilenumbruch kommt, und fügt danach negativen Abstand ein, um (falls es noch auf der ersten Seite ist) den ersten Abstand auszugleichen.

\Needspace vergleicht \pagegoal+\pagetotal und fügt selbst bei Bedarf einen harten Seitenumbruch ein.

Deswegen kann es bei \needspace dazu kommen, dass TeX schon einen Teil der longtable "gesehen hat" bevor die Entscheidung für den Seitenumbruch fällt.

Die Doku (in needspace.sty) sagt noch folgendes:


% The \needspace macro reserves an APPROXIMATE amount of space (depending
% on what penalties are in effect) but is efficient and normally adequate.
% A short page will be ragged bottom even if \flushbottom is in
% effect.
%
% \Needspace is less efficient but reserves the requested space. It
% should only be used between paragraphs. Short pages produced by
% \Needspace{<length>} will be ragged bottom but short pages produced by
% \Needspace*{<length>} will be flush bottom if \flushbottom is in effect.