PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Longtable] Multirow



kurztipp
24-11-2012, 18:44
Hallo,

ich möchte ein mehrseitige Tabelle erstellen. Ich nutze hierfür Longtable. Die Tabelle hat im Tabellenkörper 6 Spalten.
Ich grenze den Tabellenkopf auf der ersten Seite von denen der folgenden Seiten ab und nutze darin multirow Spalten.

Problem:
Das Layout ist zu breit für das Dokument, obwohl ich die breite mit \textwidth angepasst habe.
Meine Vermutung ist, dass Latex die Tabellenspalten der \multicolumn Zellen aneinander ausrichtet und das zu der Übergröße führt.
Die ersten beiden Zeilen enthalten beispielsweise jew. 2 Spalten, die ihrerseits 3 (originalspalten) Spalten des Tabellenkörpers umfassen. Die Trennlinie stimmt mit der Trennlinie der dritten Spalte (3. Feinziele) überein.
Meiner Meinung nach macht das diese "3. Feinziele" Spalte zu breit (die breiter als die beiden linken Spalten sind, obwohl auch diese Spalte nur 0.1\textwidth breit sein sollte).
Kann man diese Ausrichtung der Spalten unterdrücken, sodass die beiden oberen Spalten in der Mitte der Tabelle getrennt werden?

Oder habe ich mit \textwidth einen Fehler gemacht und sehe ihn nicht?

Im Anhang ein Bild der Tabelle, wie sie sich mir Darstellt.


\documentclass[fontsize=12pt,paper=a4,twoside=false,headings=norm al,landscape]{scrartcl}

% Deutsche Sprachunterstützung
\usepackage{ngerman}
\usepackage[utf8]{inputenc}

% Sonderzeichen verfügbar machen
\usepackage[T1]{fontenc}

% Zeilenabstand: eineinhalb
\usepackage{setspace}
\onehalfspacing

% Überschriften auf Times stellen
\addtokomafont{sectioning}{\rmfamily}

% Schriftartfamilie auf Times stellen
\usepackage{txfonts}

% Zeilen verbinden
\usepackage{multirow}

\usepackage{longtable}

% Seitenränder
\usepackage{geometry}
\geometry{a4paper, top=20mm, left=20mm, right=20mm, bottom=20mm,
headsep=10mm, footskip=12mm} % headsep=Abstand Kopfzeile-Text footskip=Abstand Fußzeile-Text

% Absätze ohne Einrückung aber mit Zeilenabstand
\parindent 0pt
\parskip 10pt


\begin{document}
\begin{longtable}{*{3}{|p{0.1\textwidth}}|p{0.4\te xtwidth}*{2}{|p{0.1\textwidth}}|}
% BEGINN: Tabellenüberschrift erste Seite
\hline
\multicolumn{3}{|p{0.5\textwidth}|}{1. Ausbildungsthema} & \multicolumn{3}{|p{0.5\textwidth}|}{2. Feinziele} \\
\hline
\multicolumn{3}{|p{0.5\textwidth}|}{Akrobatik, Krafttraining, Kraftausdauer} & \multicolumn{3}{|p{0.5\textwidth}|}{Akrobatik Techniken erlernen, verfeinern. Maximalkraft, Kraftausdauer und Schnellkraft steigern} \\
\hline
\multicolumn{2}{|p{0.2\textwidth}|}{3. Ausbildungsform} & \multicolumn{2}{|p{0.6\textwidth}|}{4. Organisatorische Maßnahmen} & \multicolumn{2}{|p{0.2\textwidth}|}{5. Ausbildungsort} \\
\hline
\multicolumn{2}{|p{0.2\textwidth}|}{U/PD} & \multicolumn{2}{|p{0.6\textwidth}|}{Schlüssel und Musik organisieren} & \multicolumn{2}{|p{0.2\textwidth}|}{Turnhalle} \\
\hline
\multicolumn{3}{|p{0.5\textwidth}|}{6. Dienstvorschriften, Weisungen, andere Quellen} & \multicolumn{3}{|p{0.5\textwidth}|}{7. Ausbildungsmittel} \\
\hline
\multicolumn{3}{|p{0.5\textwidth}|}{Eigene Unterlagen} & \multicolumn{3}{|p{0.5\textwidth}|}{Weichboden Matten, Gerätekasten} \\
\hline
8. Zeitbedarf in Minuten & 9. Ablauf & 10. Feinziele & 11. Ausbildungsinhalt in Stichworten & 12. Ausbildungsverfahren & 13. Ausbildungsmittel, Hilfspersonal \endfirsthead
\hline
% ENDE: Tabellenüberschrift erste Seite
% BEGINN: Tabellenüberschrift zweite Seite
8. Zeitbedarf in Minuten & 9. Ablauf & 10. Feinziele & 11. Ausbildungsinhalt in Stichworten & 12. Ausbildungsverfahren & 13. Ausbildungsmittel, Hilfspersonal \endhead
\hline
% ENDE: Tabellenüberschrift zweite Seite
% BEGINN: Tabelleninhalt
10&dies&das&Text&nix&nix\\
\hline
\vspace{15cm} A & große Spalte & dies & das & nix & nix \\
\hline
\vspace{5cm}10&dies&das&Text&nix&nix\\
\hline
\end{longtable}

\end{document}

Ich hoffe, es findet sich jemand, der mit helfen kann.

hakaze
24-11-2012, 20:15
Multirow ist (da es auch nicht angewendet wird) völlig unschuldig. ;)

Ich glaube, du hast dich lediglich beim Zusammenrechnen der Anteile von textwidth für die zusammengefassten Spalten verrechnet. Hier mal mit korrigierten Werten. Dann passt es auch so, wie du es dir vorgestellt hast:

\documentclass[fontsize=12pt, paper=a4, parskip=half, headings=normal, landscape]{scrartcl}
% twoside=false ist Standard für article
% Deutsche Sprachunterstützung
\usepackage{ngerman}
\usepackage[utf8]{inputenc}

% Sonderzeichen verfügbar machen
\usepackage[T1]{fontenc}

% Zeilenabstand: eineinhalb
\usepackage{setspace}
\onehalfspacing

% Überschriften auf Times stellen
\addtokomafont{sectioning}{\rmfamily}

% Schriftartfamilie auf Times stellen
\usepackage{txfonts}

% Zeilen verbinden
%\usepackage{multirow}

\usepackage{longtable}

% Seitenränder
\usepackage{geometry}
\geometry{a4paper, top=20mm, left=20mm, right=20mm, bottom=20mm,
headsep=10mm, footskip=12mm} % headsep=Abstand Kopfzeile-Text footskip=Abstand Fußzeile-Text

% Absätze ohne Einrückung aber mit Zeilenabstand
%\parindent 0pt % lieber über Klassenoption
%\parskip 10pt


\begin{document}
\begin{longtable}{*{3}{|p{0.1\textwidth}}|p{0.4\te xtwidth}*{2}{|p{0.1\textwidth}}|}
% BEGINN: Tabellenüberschrift erste Seite
\hline
\multicolumn{3}{|l|}{1. Ausbildungsthema} & \multicolumn{3}{|l|}{2. Feinziele} \\
\hline
\multicolumn{3}{|p{0.3\textwidth}|}{Akrobatik, Krafttraining, Kraftausdauer} & \multicolumn{3}{|p{0.6\textwidth}|}{Akrobatik Techniken erlernen, verfeinern. Maximalkraft, Kraftausdauer und Schnellkraft steigern} \\
\hline
\multicolumn{2}{|p{0.2\textwidth}|}{3. Ausbildungsform} & \multicolumn{2}{|p{0.5\textwidth}|}{4. Organisatorische Maßnahmen} & \multicolumn{2}{|p{0.2\textwidth}|}{5. Ausbildungsort} \\
\hline
\multicolumn{2}{|p{0.2\textwidth}|}{U/PD} & \multicolumn{2}{|p{0.5\textwidth}|}{Schlüssel und Musik organisieren} & \multicolumn{2}{|p{0.2\textwidth}|}{Turnhalle} \\
\hline
\multicolumn{3}{|p{0.3\textwidth}|}{6. Dienstvorschriften, Weisungen, andere Quellen} & \multicolumn{3}{|p{0.6\textwidth}|}{7. Ausbildungsmittel} \\
\hline
\multicolumn{3}{|p{0.3\textwidth}|}{Eigene Unterlagen} & \multicolumn{3}{|p{0.6\textwidth}|}{Weichboden Matten, Gerätekasten} \\
\hline
8. Zeitbedarf in Minuten & 9. Ablauf & 10. Feinziele & 11. Ausbildungsinhalt in Stichworten & 12. Ausbildungsverfahren & 13. Ausbildungsmittel, Hilfspersonal \endfirsthead
\hline
% ENDE: Tabellenüberschrift erste Seite
% BEGINN: Tabellenüberschrift zweite Seite
8. Zeitbedarf in Minuten & 9. Ablauf & 10. Feinziele & 11. Ausbildungsinhalt in Stichworten & 12. Ausbildungsverfahren & 13. Ausbildungsmittel, Hilfspersonal \endhead
\hline
% ENDE: Tabellenüberschrift zweite Seite
% BEGINN: Tabelleninhalt
10&dies&das&Text&nix&nix\\
\hline
\vspace{15cm} A & große Spalte & dies & das & nix & nix \\
\hline
\vspace{5cm}10&dies&das&Text&nix&nix\\
\hline
\end{longtable}

\end{document}

ctansearch
24-11-2012, 20:46
Diese Konstruktion, \multicolumn nochmals die Spaltenbreite mitzuteilen, finde ich seltsam.
\multicolumn soll einfach eine Anzahl Spalten aus der Grundefinition überspannen.

Wenn man also sagt

\multicolumn{3}{|}{1. Ausbildungsthema} & \multicolumn{2}{|}{2. Feinziele}

weist man an, jeweils 3 und 2 Spalten zu überspannen.

Warum das zusätzliche {|p{0.5\textwidth}|} ?

kurztipp
30-11-2012, 10:20
Multirow ist (da es auch nicht angewendet wird) völlig unschuldig. ;)
Ja, ich meinte multicolumn ;)


Ich glaube, du hast dich lediglich beim Zusammenrechnen der Anteile von textwidth für die zusammengefassten Spalten verrechnet. Hier mal mit korrigierten Werten. Dann passt es auch so, wie du es dir vorgestellt hast:
Ich hab deinen Code kopiert, aber bei ist es immer noch länger als die Seitenbreite...


Diese Konstruktion, \multicolumn nochmals die Spaltenbreite mitzuteilen, finde ich seltsam.
\multicolumn soll einfach eine Anzahl Spalten aus der Grundefinition überspannen.[...]
Warum das zusätzliche {|p{0.5\textwidth}|} ?
Damit hast Du eigentlich recht. Habe alle p{..} durch l ersetzt, jedoch auch ohne, dass sich was verändert hat.

Es bleibt somit dabei, dass die Tabelle breiter als die Seitenbreite ist. Jemand eine Idee, woran das liegt?

Dann passt es auch so, wie du es dir vorgestellt hast
Passt die Tabelle bei Dir auf die Seite?

LG

kurztipp
30-11-2012, 10:31
Hallo,

mein Fehler, der interne PDF-Betrachter von TexStudio war zu weit reingezoomt und hat komischerweise keinen Scrollbalken angezeigt...
Der obige Post müsse somit wie folgt lauten:



Multirow ist (da es auch nicht angewendet wird) völlig unschuldig. ;)
Ja, ich meinte multicolumn ;)


Ich glaube, du hast dich lediglich beim Zusammenrechnen der Anteile von textwidth für die zusammengefassten Spalten verrechnet. Hier mal mit korrigierten Werten. Dann passt es auch so, wie du es dir vorgestellt hast:
Ich hab deinen Code kopiert, habe mich wohl wirklich verrechnet ;)


Diese Konstruktion, \multicolumn nochmals die Spaltenbreite mitzuteilen, finde ich seltsam.
\multicolumn soll einfach eine Anzahl Spalten aus der Grundefinition überspannen.[...]
Warum das zusätzliche {|p{0.5\textwidth}|} ?
Damit hast Du eigentlich recht. Habe alle p{..} durch l ersetzt. Funktioniert genauso, wie die selbstständige Angabe


Vielen Dank für die Hilfe

Eine Frage hätte ich allerdings noch: Die ersten beiden Zeilen hätte ich gerne gleich breit (jew. die Hälfte der Tabellenbreite). Wenn ich jedoch p{.5\textwidth} statt l nehme, wird die Tabelle wieder zu breit.
Gibt es da eine unkomplizierte Möglichkeit?
Ich denke, dass wird daran liegen, dass die Trennline der ersten Spalte mit derjenigen der "originalen" dritten Spalte übereinstimmen muss. Wenn die erste Spalte der ersten Zeile nun p{.5\textwidth} statt 0.3\textwidth ist(wie eigentlich definiert) wird die Tabelle (natürlich) um 0.2 zu breit.
Kann man die Zeilen voneinander "entkoppeln"?
Ansonsten würde mir nur einfallen eine "Dummy"-Spalte mit 0.2 einzubauen, die die Spalte "11. Ausbildungsinhalte" dann immer überspannt. Das scheint mir aber sehr umständlich, weil das in jeder Zeile geschehen müsste und den Aufwand nicht wert wäre.

LG

rstuby
30-11-2012, 10:33
Bei mir passt hakazes Tabelle schön auf die Seite. Ich habe gegenüber hakazes Beispiel nur \usepackage{ngerman} durch \usepackage[ngerman]{babel} ersetzt und die Schriftart txfonts, die ich nicht habe, auskommentiert, die beiden Änderungen dürften ja auf die Tabellenbreite keinen Einfluss haben.
Es kommen einige "underfull hbox"-Meldungen wegen der schwierigen Zeilenumbrüche in den Spalten, aber keine "overfull".

kurztipp
30-11-2012, 14:23
Bei mir passt hakazes Tabelle schön auf die Seite. Bei mir, wie gesagt, auch. EIFOK Fehler. Der klassiker eben ;)

Bleibt nur noch meine letzte, etwas umständlich formulierte Frage, falls es dafür eine Lösung gibt. Wenn nicht, auch gut.

LG

hakaze
01-12-2012, 10:52
Eine Frage hätte ich allerdings noch: Die ersten beiden Zeilen hätte ich gerne gleich breit (jew. die Hälfte der Tabellenbreite). Wenn ich jedoch p{.5\textwidth} statt l nehme, wird die Tabelle wieder zu breit.
Gibt es da eine unkomplizierte Möglichkeit?
Das geht schon. Du musst nur berücksichtigen, dass zu Breite der Textspalte auch noch der Spaltenabstand hinzukommt, wenn du Tabelle gezeichnet wird. D.h. du musst bei der Breitenangabe jeder Spalte noch 2mal den Abstand tabcolsep abziehen (eventuell auch noch die Breite der vertikalen Linien). Die Berechnung wird durch das Paket calc zur Verfügung gestellt.

\documentclass[fontsize=12pt, paper=a4, parskip=half, headings=normal, landscape]{scrartcl}
% twoside=false ist Standard für article
% Deutsche Sprachunterstützung
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}

% Sonderzeichen verfügbar machen
\usepackage[T1]{fontenc}

% Zeilenabstand: eineinhalb
\usepackage{setspace}
\onehalfspacing

% calc für Berechnungen, lipsum = Fülltext
\usepackage{calc,lipsum}

% Seitenränder
\usepackage{geometry}
\geometry{a4paper, top=20mm, left=20mm, right=20mm, bottom=20mm,
headsep=10mm, footskip=12mm} % headsep=Abstand Kopfzeile-Text footskip=Abstand Fußzeile-Text


\begin{document}

\begin{tabular}{p{0.5\textwidth-2\tabcolsep}p{0.5\textwidth-2\tabcolsep}}
\lipsum[1] & \lipsum[2] \\
\end{tabular}
\end{document}

kurztipp
01-12-2012, 13:43
Das geht schon. Du musst nur berücksichtigen, dass zu Breite der Textspalte auch noch der Spaltenabstand hinzukommt, wenn du Tabelle gezeichnet wird. D.h. du musst bei der Breitenangabe jeder Spalte noch 2mal den Abstand tabcolsep abziehen (eventuell auch noch die Breite der vertikalen Linien). Die Berechnung wird durch das Paket calc zur Verfügung gestellt.

Ich bin mir nicht sicher, ob Deinen Vorschlag nicht verstehe/auf mein Problem umsetzen kann, oder Du mich missverstanden hast.
Ich will in der oben geposteten Tabelle nur die ersten beiden Spalten mittig getrennt haben (siehe Anhang). Ich hoffe, der Anhang macht deutlich, was ich meine.

LG

hakaze
01-12-2012, 17:33
Achso, in dem Fall behaupte ich mal, dass es nicht geht (...zumindest kann ich es mir nicht vorstellen). Und zwar aus folgendem Grund:

Auch bei multicolumn müssen die Ende der Spalten übereinander liegen. In deinem gewünschten Zustand läge das Ende von Thema 1 in der 0.4\textwidth-Spalte (Thema 11). Das geht nicht. Mit

\multicolumn{3}{|p{0.5\textwidth-2\tabcolsep}|}{1. Ausbildungsthema}werden demzufolge auch die Breiten von Thema 8, 9 und 10 vergrößert (auch wenn die Breite der Textbox bei 0.1\textwidth bleibt). Mit

\multicolumn{4}{|p{0.5\textwidth-2\tabcolsep}|}{1. Ausbildungsthema}wird die Spalte dagegen 0.7\textwidth breit sein (der Text darin wird allerdings in einer Box der Breite 0.5\textwidth-2\tabcolsep umgebrochen).

Ich hoffe, ich konnte das verständlich rüberbringen :)

kurztipp
02-12-2012, 15:37
Achso, in dem Fall behaupte ich mal, dass es nicht geht[...]
Auch bei multicolumn müssen die Ende der Spalten übereinander liegen.[...]
Ich hoffe, ich konnte das verständlich rüberbringen :)

Hallo,

konntest Du, zumal ich mir genau das schon gedacht habe, nur sehr umständlich formuliert habe. Wie gesagt, die einzige Lösung, die mir spontan einfallen würde, wäre die Spalte 11 in zwei 0.25\textwidth Spalten aufzuteilen, damit die ersten beiden Zeilen mittig enden und für die Zeilen mit Text in Spalte 11, die beiden Spalten per multicolumn verbinden.
Das erscheint mir aber sehr umständlich und der mühe nicht wert.

Dankesehr, LG