PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Seitenumbruch in supertabular



roadrunner87
11-07-2012, 16:48
Hallo,
ich verwende supertabular um lange Tabellen über mehrere Seiten zu erstellen. Hierbei hat aber die supertabular Umgebung probleme mit dem Umbruch und der Text läuft über den Rand hinaus.
Wie kann ich supertabular sagen, dass ich an einer bestimmten Stelle einen Umbruch haben möchte?

hakaze
11-07-2012, 18:13
Hallo,
ich verwende supertabular um lange Tabellen über mehrere Seiten zu erstellen. Hierbei hat aber die supertabular Umgebung probleme mit dem Umbruch und der Text läuft über den Rand hinaus.
Wie kann ich supertabular sagen, dass ich an einer bestimmten Stelle einen Umbruch haben möchte?
Über welchen Rand? Links, rechts, unten? Minimalbeispiel?

Für den Zeilenumbruch innerhalb von Zellen muss du auch eine Spaltendefinitionen verwenden, die das unterstützt (z.B. p-Spalte).

Der Seitenumbruch zwischen den Tabellenzeilen wird automatisch durch supertabular erledigt. (Siehe auch die Antworten in deinem alten Thread (http://www.mrunix.de/forums/showthread.php?t=73411))

roadrunner87
11-07-2012, 18:40
Habe jetzt mal die Tabelle hinterlegt.



\documentclass[
11pt, % Schriftgröße
a4paper, % Papierformat
oneside, % einseitiges Dokument
titlepage, % es wird eine Titelseite verwendet
final % Status des Dokuments (final/draft)
]{report}

\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{supertabular}
\usepackage{array}
\usepackage{ragged2e}
\usepackage{xcolor,colortbl}
\usepackage{lscape}
\usepackage{pdflscape}
\usepackage{multicol}
\usepackage{multirow}


\begin{document}

\begin{landscape}

\bottomcaption{Überschrift}
\tablehead
{
% Header
\hline
\rowcolor{gray}
\textbf{Spalte 1}
& \textbf{Spalte 2}
& \textbf{Spalte 3}
& \textbf{S 4} \\\hline \hline
}

\tabletail{

\hline}
\tablelasttail{}

\centering
\begin{supertabular} {|p{7cm}|p{6cm}|p{8cm}|c|}


\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 1
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 2
A
& B
& C\newline
C\newline
C
& D \\\hline

% Zeile 3
A
& B
& C\newline
C
& D \\\hline

% Zeile 4
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 5
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline


% Zeile 6
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline


% Zeile 7
A
& B
& C\newline
C\newline
C
& D \\\hline







\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 9
A
& B
& C\newline
C
& D \\\hline

% Zeile 10
A
& B
& C\newline
C\newline
C
& D \\\hline

% Zeile 11
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 15
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 16
A
& B
& C\newline
C
& D \\\hline




\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 17
A
& B
& \multirow{5}{8cm}{C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C}
& D \\\cline{1-2}\cline{4-4}

% Zeile 18
A
& B
&
& D\\\cline{1-2}

% % Zeile 19
% High-level requirements are compatible with target computer.
% & SW Verification Results
% &
% & \\\cline{1-2}

% Zeile 20
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 21
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 22
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 23
A
& B
&
& D \\\hline

\end{supertabular}
\end{landscape}

\end{document}



Wenn ich nun dieses kompiliere ist bei mir

die erste Seite der Tabelle leer
die zweite Seite der Tabelle ist sehr weit im unteren Bereich der Seite (hier sollte schon eine Zeile zuvor umgebrochen werden)
die dritte Seite der Tabelle ist noch extremer ohne Umbruch


Meine Idee ist diese, dass ich an diesen Stellen einen manuellen Umbruch einfüge.

rstuby
11-07-2012, 18:59
So weit ich weiß, findet der Seitenumbruch nur zwischen zwei Tabellenzeilen, nicht aber innerhalb einer Tabellenzeile statt, und ich glaube nicht, dass man das ändern kann.

roadrunner87
11-07-2012, 20:17
Dann verstehe ich aber nicht, warum er bei der zweiten Seite nicht umbricht.
Hier ist die Tabelle ja schon am Ende.

Ich habe schon longtable probiert. Hier ist aber die Darstellung nicht die gleiche wie bei supertabular und bei den "normalen" Tabellen. Daher kann ich dies aus konsistenz Gründen nicht verwenden.

Was gibt es dann als Alternative noch?

hakaze
11-07-2012, 20:22
Das Problem mit der leeren Seite und dem suboptimalen Verteilung kannst mit
\shrinkheight{26pt} % oder ein bisschen mit dem Wert experimentierennach der ersten Tabellenzeile lösen. Das Ergebnis ist dann aber immer noch alles andere als perfekt.

.. wie auch supertabular, was durch deine (dank forcierten Umbrüchen) mehrzeiligen Tabellenzellen aus dem Konzept kommt und deshalb halb leere Seiten produziert.

Beim letzten Fall "weiss" Latex einfach nicht, wo der Platz herkommen soll. Du gibst der multirow nur 5 Zeilen vor, aber gleichzeitig packst du 15 (!!!) Zeilen Inhalt rein.

Da könnte man zum Beispiel die Zelle mit dem "A" in der letzten Zeile vergrößern:
...
% Zeile 23
\parbox[t]{7cm}{A \vspace{8\baselineskip}}
& B
&
& D \\\hline
...Das ist aber nicht schön, aber aktuell fällt mir aber auch nix besseres ein.

Vielleicht hat noch jemand einen besseren Vorschlag oder du überlegst dir, was du noch an der Tabellen oder am Inhalt umbauen kannst.

roadrunner87
12-07-2012, 07:52
Gibt es nicht irgendwas wie in der Art
pagebreak?
Oder dass ich eine Unsichtbare Zeile an diesen Stellen anfüge?

hakaze
12-07-2012, 08:06
Mit longtabu (longtable+tabu) klappt die Verteilung auf den Seiten besser:
\documentclass[
11pt, % Schriftgröße
a4paper, % Papierformat
oneside, % einseitiges Dokument
titlepage, % es wird eine Titelseite verwendet
final % Status des Dokuments (final/draft)
]{report}

\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{longtable,tabu}
\usepackage{array}
\usepackage{ragged2e}
\usepackage{xcolor,colortbl}
\usepackage{lscape}
\usepackage{pdflscape}
\usepackage{multicol}
\usepackage{multirow}


\begin{document}

\begin{landscape}
\centering
\begin{longtabu} {|p{7cm}|p{6cm}|p{8cm}|c|}
\hline
\rowcolor{gray}
\textbf{Spalte 1}
& \textbf{Spalte 2}
& \textbf{Spalte 3}
& \textbf{S 4} \\\hline \hline
\endhead
\hline
\endfoot \endlastfoot
\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 1
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 2
A
& B
& C\newline
C\newline
C
& D \\\hline

% Zeile 3
A
& B
& C\newline
C
& D \\\hline

% Zeile 4
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 5
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline


% Zeile 6
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline


% Zeile 7
A
& B
& C\newline
C\newline
C
& D \\\hline







\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 9
A
& B
& C\newline
C
& D \\\hline

% Zeile 10
A
& B
& C\newline
C\newline
C
& D \\\hline

% Zeile 11
A
& B
& C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 15
A
& B
& C\newline
C\newline
C\newline
C
& D \\\hline

% Zeile 16
A
& B
& C\newline
C
& D \\\hline




\multicolumn{4}{|l|}{\cellcolor{gray}\textbf{Kopf über alle Spalten}} \\\hline

% Zeile 17
A
& B
& \multirow{6}{8cm}{C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C\newline
C}
& D \\\cline{1-2}\cline{4-4}

% Zeile 18
A
& B
&
& D\\\cline{1-2}

% % Zeile 19
% High-level requirements are compatible with target computer.
% & SW Verification Results
% &
% & \\\cline{1-2}

% Zeile 20
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 21
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 22
A
& B
&
& D \\\cline{1-2}\cline{4-4}

% Zeile 23
A %\parbox[t]{7cm}{A \vspace*{8\baselineskip}}
& B
&
& D \\\hline

\end{longtabu}
\end{landscape}

\end{document}Das multirow-Desaster wird dadurch allerdings nicht gelöst.

roadrunner87
12-07-2012, 11:18
Das mit longtabu habe ich versucht. Ist aber das gleiche Problem wie mit longtable. Hier ist die Beschriftung der Tabelle und dessen Aussehen verschieden zu den anderen.

Könnte ich keine "versteckte" Tabelle oder einen Abstand an den kritischen Stellen packen?

sommerfee
12-07-2012, 17:38
Hier ist die Beschriftung der Tabelle und dessen Aussehen verschieden zu den anderen.

Das ließe sich doch ändern...

ctansearch
12-07-2012, 22:22
Um Seitenumbrüche in Tabellen zu steuern, muß man wissen, in welcher Spalte und in welcher Zeile man sich befindet. Dazu habe ich folgenden Vorschlag:



\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{longtable,blindtext}
\newcounter{tablines}
\newcounter{tabcols}
\newcommand{\colbreak}{\stepcounter{tabcols} Col: \thetabcols &}
\newcommand{\tabbreak}{\stepcounter{tablines}\step counter{tabcols}
Col: \thetabcols{} Line: \thetablines{} \setcounter{tabcols}{0} \\ }

\begin{document}
\begin{longtable}{p{4cm}p{4cm}p{4cm}}
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak
Test \colbreak Test \colbreak Test \tabbreak

\end{longtable}
\end{document}

Hier werden zunächst nur die Werte der Spalten und Zeilen ermittelt, diese werden hier nur zur Veranschaulichung dargestellt (cols, lines) Diese Werte könnte man mit einer \if \else Bedingung im \newcommand versehen, was eine direkte Steuerung von Zeilen-, Spalten- und Seitenumbrüchen ermöglichen würde.

Vielleicht hat jemand eine Idee, wie man diese Bedingungen geschickt in die \newcommands einbauen kann.

u_fischer
13-07-2012, 09:55
Dann verstehe ich aber nicht, warum er bei der zweiten Seite nicht umbricht.

Du rennst in einen der in der Dokumentation beschriebenen "Weak Points"


Gibt es nicht irgendwas wie in der Art "pagebreak"

Wenn du bereit bist, die Tabelle manuell zu beenden, warum benutzt du dann nicht einfach


\end{supertabular}
\begin{supertabular}

?

ctansearch
13-07-2012, 15:03
Hallo.
Mit diesem Code kann man mit longtable Tabellen erzeugen, die bei einer definierten Zeilenzahl umgebrochen und neu begonnen werden. Man kann zwischen die Tabellen einen Text, Bilder etc. einfügen.



\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{longtable,ifthen,graphicx}

%definition zähler für Spalten und Zeilen>
\newcounter{tablines}
\newcounter{tabcols}
%definition zähler für Spalten und Zeilen<

%definition tabellenstruktur>
\newcommand{\tabhead}
{
\begin{longtable}{p{4cm}p{4cm}p{4cm}} \caption{Lange Tabelle } \\
\endfirsthead Das ist der Tabellenkopf \endhead
}
%definitiontabellenstruktur<

%definition Tabellenumbruch>
\newcommand{\tabbreak}{
\setcounter{tabcols}{0}
\end{longtable}
Manueller Umbruch. Neue Tabelle Optionaler Zwischentext
\includegraphics[width=1cm,height=1cm]{test}
\begin{picture}(0,0)\put(0,0){\rule{1cm}{1cm}}\end {picture}
\tabhead
\endfirsthead Das ist der Tabellenkopf
\endhead }
%definition tabelleumbruch<

%definition spaltenumbruch>
\newcommand{\colbreak}{
\stepcounter{tabcols} Col: \thetabcols &
}
%definition spaltenumbruch<

%definition Zeilenumbruch mit Zeilennummer>
\newcommand{\tabline}{
\stepcounter{tablines}
\stepcounter{tabcols}
Col: \thetabcols{}
Line: \thetablines{}
\setcounter{tabcols}{0} \ifnum
\thetablines = 15 \tabbreak \\
\setcounter{tablines}{0} \else \\ \fi
}
%definition Zeilenumbruch mit Zeilennummer<

\begin{document}
\tabhead
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
Test \colbreak Test \colbreak Test \tabline
\end{longtable}
\end{document}

roadrunner87
13-07-2012, 19:34
Wenn du bereit bist, die Tabelle manuell zu beenden, warum benutzt du dann nicht einfach


\end{supertabular}
\begin{supertabular}

?

Da habe ich gerade versucht. Funktioniert aber nicht. Reicht einfach ein:

\end{supertabular}
dann ein

\begin{supertabular}
und anschließend alle Einstellungen erneut, wie in der Vorherigen Tabelle?

roadrunner87
13-07-2012, 19:38
Das ließe sich doch ändern...
Und wie genau.
Es muss umbedingt die gleiche Schrift wie bei Supertabular sein.
Vor allem wenn ich zweimal
\hline angebe, muss ebenfalls die Linie + Abstand + Linie erscheinen!