PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Nochmals zu Tabellen: multirow mit Umbruch und zentriertem Text?



trustee
19-04-2006, 16:33
Liebe Mitglieder des Forums,

mit Latex klappt alles super, aber bei der Gestaltung von (auch kleinen) Tabellen gerate ich manchmal ans Verzweifeln. Ich möchte Folgendes erreichen: Zwei untereinanderliegende Zellen einer Tabelle sollen miteinander verbunden werden. In der neuen größeren Zelle soll der Text erstens zentriert und zweitens über die Zeilen umbrochen werden, er soll also nicht über den Rand hinaus gehen. Die Ziele "Zentrieren" und "Umbrechen" erreiche ich erstens über die Verwendung von tabularx und zweitens über die Definition eines eigenen Spaltentyps.

Hier ein Beispiel:



\documentclass[a4paper]{scrbook}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{ae}
\usepackage{array}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{tabularx}

\newcommand{\abbtabbreite}{0.97\textwidth}

% Zeilenumbruch und linksbündig mit Angabe der Breite in tabular:
\newcolumntype{v}[1]{>{\raggedright\hspace{0pt}}p{#1}}
% Zeilenumbruch und zentriert mit Angabe der Breite in tabular:
\newcolumntype{z}[1]{>{\centering\hspace{0pt}}p{#1}}
% Zeilenumbruch und linksbündig in tabularx:
\newcolumntype{V}{>{\raggedright\arraybackslash}X}
% Zeilenumbruch und zentriert in tabularx:
\newcolumntype{Z}{>{\centering\arraybackslash}X}

\begin{document}

\begin{table}[htbp]
\small
\centering
\caption{Gründe für den Abbruch einer Gesamthandlung}
\label{tab:Jucknat3}
\begin{tabularx}{\abbtabbreite}{v{5em}|ZZZZ}
\toprule
& Erreichung des Maximums & \multicolumn{2}{c}{Mangelnder Erfolg} & Abbrechen vor dem Maximum trotz guter Erfolge\\
& & Dauernd schwache Erfolge & Wechselnde Erfolge & \\
\midrule
Gruppe A & 42\% & 22\% & 28\% & 8\% \\
Gruppe B & 32\% & 6\% & 40\% & 14\% \\
\bottomrule
\end{tabularx}
\end{table}

\end{document}


Ich versuche zu erreichen, dass die Zellen mit den Texten "Erreichung des Maximums" und "Abbrechen vor dem Maximum trotz guter Erfolge" mit der jeweils darunter liegenden Zelle verbunden werden.

Multirow funktioniert nicht, da es die Zentrierung auflöst. Der Dokumentationstipp, man solle eine tabular-Umgebung aufnehmen, führt zu unschönen Zwischenräumen am linken Rand.

Armultirow führt dazu, dass der Zelleinhalt nach rechts verschoben wird (und dass ich von Hand den Abstand zur nächsten Zeile schaffen muss). Ebenfalls unschön.

Raisebox führt dazu, dass die Zentrierung aufgelöst wird.

Weitere Lösungen fallen mir nicht ein. Hätte jemand vielleicht einen Tipp? Danke im voraus!

Gruß
Sebastian

countbela666
19-04-2006, 19:40
Hallo Sebastian,

ehrlich gesagt halte ich eine Zentrierung der Tabellenköpfe nicht für so sinnvoll. Das Ergebnis, das man erhält, wenn man genau nach den Regeln von tabsatz.pdf verfährt (ein Dokument das dir ja bekannt zu sein scheint), erscheint mir schon nahezu optimal. Verzeih mir bitte, dass ich also nicht direkt auf deine Fragen eingehe, aber ich würde die Tabelle folgendermaßen gestalten:

\documentclass[a4paper]{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{
multirow,
booktabs,
tabularx,
ragged2e,
dcolumn
}
\usepackage[
font=small,
labelfont=bf,
textfont=it,
justification=RaggedRight
]{caption}
\captionsetup[table]{position=top}

\makeatletter
\newcolumntype{d}[1]{>{\DC@{.}{,}{#1}}l<{\DC@end}}
\makeatother
\newcolumntype{N}{>{\scriptsize}l}
\newcolumntype{Z}{>{\scriptsize\RaggedRight\arraybackslash}X}
\newcolumntype{V}[1]{>{\scriptsize\RaggedRight\hspace{0pt}}p{#1}}
\newcommand{\armultirow}[3]{%
\multicolumn{#1}{#2}{%
\begin{picture}(0,0)%
\put(0,0){%
\begin{tabular}[t]{@{}#2@{}}%
#3%
\end{tabular}%
}%
\end{picture}%
}%
}%

\newcommand{\abbtabbreite}{.7\textwidth}

\begin{document}
\begin{table}
\small
\centering
\caption{Gründe für den Abbruch einer Gesamthandlung}
\label{tab:Jucknat3}
\begin{tabularx}{\abbtabbreite}{@{}V{3em}*{4}{d{2. 0}}@{}}
\toprule
Gruppe &
\armultirow{1}{V{6em}}{Erreichung des Maximums} &
\multicolumn{2}{N}{Mangelnder Erfolg} &
\armultirow{1}{V{5em}@{}}{Abbrechen vor dem Maximum trotz guter Erfolge}\\\addlinespace\cmidrule(lr){3-4}
&
&
\multicolumn{1}{Z}{Dauernd schwache Erfolge} &
\multicolumn{1}{Z}{Wechselnde Erfolge} &
\\ & \% & \% & \% & \%
\\\cmidrule(r){1-1}\cmidrule(rl){2-2}\cmidrule(rl){3-3}\cmidrule(rl){4-4}\cmidrule(l){5-5}\addlinespace
A & 42 & 22 & 28 & 8 \\
B & 32 & 6 & 40 & 14 \\\addlinespace
\bottomrule
\end{tabularx}
\end{table}
\end{document}Vor allem solltest du, wenn du schon das (sehr zu empfehlende) Paket booktabs benutzt, dringend auf vertikale Linien verzichten. Booktabs und vertikale Linien zusammen gehen überhaupt nicht.

Grüße,
Marcel

trustee
20-04-2006, 09:05
Hallo Marcel,

vielen Dank für Deine Antwort! Du hast prinzipiell schon recht, Deine tabsatz.pdf-basierte Lösung sieht nicht schlecht aus; für mich ist sie aber leider nicht das richtige. Die zentrierten Tabellenköpfe sind quasi ein Muss für meine Tabelle.

Zu den restlichen Korrekturen, die Du vorschlägst (vertikale Linien, Einheiten im Kopf etc.): Über diese Punkte werde ich mir auch noch Gedanken machen müssen, allerdings weiß ich jetzt schon, dass ich mit den üblichen "Do's and Dont's" nicht komplett übereinstimme. Jedem seine Meinung, vielleicht muss ich auch noch dazulernen...

Auf jeden Fall vielen Dank für Deinen Code-Vorschlag, den ich gespeichert habe -- evtl. greife ich doch noch darauf zurück. Dennoch die Frage an den Rest des Forums: Gibt es eine Lösung für mein ursprüngliches Vorhaben? Es geht um verbundene Zellen mit Zeilenumbruch und zentriertem Text...

Danke!
Sebastian

edico
20-04-2006, 12:03
Mach es so:
...
\usepackage{calc}
...
\begin{table}[htbp]
\small
\centering
\caption{Gruende fuer den Abbruch einer Gesamthandlung}
\label{tab:Jucknat3}
\begin{tabularx}{\linewidth}{XZZZZ}
\toprule
&\multirow{2}{.2\textwidth}{\parbox{.2\textwidth}{\ begin{center}
Erreichung des Maximums \end{center}}}
% &\multicolumn{2}{m{.4\textwidth-2\tabcolsep}}{%
% \centering{%
% Mangelnder Erfolg}}
&\multicolumn{2}{c}{Mangelnder Erfolg}
&\multirow{2}{.2\textwidth}{\parbox{.2\textwidth}{\ begin{center}
Abbrechen vor dem Maximum trotz guter Erfolge \end{center}}}\\\cline{3-4}
& & Dauernd schwache Erfolge & Wechselnde Erfolge & \\
\midrule
Gruppe A & 42\% & 22\% & 28\% & 8\% \\
Gruppe B & 32\% & 6\% & 40\% & 14\% \\
\bottomrule
\end{tabularx}
\end{table}
...
edico

trustee
20-04-2006, 14:34
Hallo edico,

vielen Dank! Das klappt ziemlich gut und sieht auch fast so aus wie es soll! Leider nur fast -- denn nun muss ich noch eine Frage anschließen: Die parboxen werden vertikal nicht oben am Rand der Tabelle ausgerichtet, dazwischen ist leider ein leerer Raum. Eine Idee, wie ich das beheben kann? In der Beispieltabelle sollte der Text "Erreichung..." vertikal auf der gleichen Höhe liegen wie "Mangelnder Erfolg"...

Auf jeden Fall vielen Dank für den Code! Das hilft schon viel weiter.

Gruß
Sebastian

edico
20-04-2006, 18:37
[1] versuch erstmal
\renewcommand{\arraystretch}{1.3} % Abstaende in Zellen strecken
[2] wenn immer noch nicht, dann so:
...
\newcommand*{\VCenter}[1]{\raisebox{0pt}{#1}}
...
\begin{table}[htb]
\small
\centering
\caption{Gruende fuer den Abbruch einer Gesamthandlung}
\label{tab:Jucknat0}
\begin{tabularx}{\linewidth}{lZZZZ}
\toprule
&\multirow{2}{.2\textwidth}{%
% &\multirow{3}{.2\textwidth}{%
\VCenter{%
\parbox{.2\textwidth}{%
\centering
Erreichung des Maximums
}}}
&\multicolumn{2}{c}{\VCenter{Mangelnder Erfolg}}
&\multirow{2}{.2\textwidth}{%
% &\multirow{3}{.2\textwidth}{%
\VCenter{%
\parbox{.2\textwidth}{%
\centering
Abbrechen vor dem Maximum trotz guter Erfolge
}}}\\\cline{3-4}
& & Dauernd schwache Erfolge & Wechselnde Erfolge & \\\cline{2-5}
%&\% &\% &\% &\% \\
& \multicolumn{4}{c}{(in Prozent \%)}\\
\midrule
Gruppe A & 42 & 22 & 28 & 8 \\
Gruppe B & 32 & 6 & 40 & 14 \\
\bottomrule
\end{tabularx}
\end{table}
...
edico

trustee
21-04-2006, 09:32
Hallo edico,

vielen Dank für die Vorschläge! Der zweite funktioniert -- allerdings nicht wegen des neuen Befehls, sondern wegen des \centering-Befehls. Dieser führt im Gegensatz zu der center-Umgebung anscheinend dazu, dass der Text oben ausgerichtet wird. Interessant... Allerdings stellt sich mir jetzt ein neues (zugegebenermaßen kleinliches) Problem: Der Text in den parboxen ist jetzt zwar oben am Rand der Tabelle ausgerichtet, aber er ist nicht auf einer Höhe mit den Texten in deselben Spalte, die nicht in parboxen stecken. Die Texte in den parboxen sind vielleicht zwei, drei Pixel höher. Sollte ich vielleicht mit Deinem raisebox-Vorschlag herumspielen, um dies zu vermeiden? Das könnte ich machen, aber irgendwie gibt mir das ein schlechtes Gefühl -- je mehr man manuell eingreift, desto größer wird die Gefahr, dass die "Perfektion" des Latex-Satzes verloren geht, vermute ich. Ich könnte auch alle Zellen der Tabelle in parboxen stecken, dann wären die Texte wohl auch auf einer Höhe; allerdings wäre die Tabelle dann nicht einheitlich mit den anderen Tabellen und eigentlich möchte ich es vermeiden, die Breite aller Zellen explizit angeben zu müssen (das müsste ich ja bei parboxen).

In jedem Fall vielen Dank für die Vorschläge! Jetzt bin ich an meinem gewünschten Ergebnis schon recht nahe dran. Hier zur Information der Code, den ich jetzt nehme:


\begin{table}
\small
\centering
\caption[Gründe für den Abbruch einer Gesamthandlung nach Jucknat]{Gründe für den Abbruch einer Gesamthandlung nach Jucknat}
\label{tab:Jucknat3}
\begin{tabularx}{\textwidth}{v{5em}ZZZZ}
\toprule
& \multirow{2}{5em}{\parbox{5em}{\centering Erreichung des Maximums}}
& \multicolumn{2}{c}{Mangelnder Erfolg}
& \multirow{2}{7em}{\parbox{7em}{\centering Abbrechen vor dem Maximum trotz guter Erfolge}}\\
\addlinespace\cmidrule(lr){3-4}
& & Dauernd schwache Erfolge & Wechselnde Erfolge & \\
\midrule
Gruppe A & 42\% & 22\% & 28\% & 8\% \\
Gruppe B & 32\% & 6\% & 40\% & 14\% \\
\bottomrule
\end{tabularx}
\end{table}


Gruß
Sebastian

trustee
21-04-2006, 09:38
Wenn ich die Ausrichtung (in) der parbox verändere, klappt es. Hier der Code:



\multirow{2}{5em}{\parbox[t]{5em}{\centering Erreichung des Maximums}}


Das war's, nun sieht es aus wie es soll. Vielen Dank für die Existenz dieses Forums!

Sebastian