PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : keine vertikale Zentrierung mit multirow möglich?



josephine
21-09-2011, 17:15
Hallo liebes Forum,

ich versuche gerade eine Tabelle zu erstellen, die mehrzeilige Zellen enthält. Mit dem Paket multirow klappt es auch schon, nur die vertikale Ausrichtung scheint sich meinen Vorstellungen zu verwehren. Hier zunächst mein Minimalbeispiel Nr. 1:


\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabularx} % ermöglicht Tabellen über die gesamte Breite des Texts mit automatischer Spaltengrößenberechnung

\begin{document}

\begin{table}
\centering
\begin{tabularx}{\textwidth}{lX}
\toprule
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\midrule
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\midrule
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\midrule
\multirow{3}{*}{Auswahl} & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde. \\

& Hier steht weiterer Beispieltext. \\

& Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen hinaus geht. \\
\midrule
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\bottomrule
\end{tabularx}
\end{table}

\end{document}

Wie man sieht, geht der Begriff "Auswahl" zwar über drei Zeilen, dennoch ist er leider nicht vertikal zentriert. Eine Möglichkeit wäre es dies über das optionale Argument [] in \multirow zu erzielen. Ich würde aber gerne eine automatisierte vertikale Zentrierung einrichten, da die Inhalte der Zellen noch nicht feststehen.

Außerdem würde ich mich freuen, wenn mir jemand einen Tipp geben könnte wie man den Abstand zwischen dem Inhalt einer Zelle und den Rahmenlinien verändern kann, sodass dieser oben und unten gleich ist. Folgendes habe ich versucht (siehe Minimalbeispiel 2):


\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabularx} % ermöglicht Tabellen über die gesamte Breite des Texts mit automatischer Spaltengrößenberechnung

\usepackage{cellspace}
\addtolength\cellspacetoplimit{6pt}
\addtolength\cellspacebottomlimit{6pt}

\begin{document}

\begin{table}
\centering
\begin{tabularx}{\textwidth}{SlX}
\toprule
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\midrule
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\midrule
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\midrule
\multirow{3}{*}{Auswahl} & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde. \\

& Hier steht weiterer Beispieltext. \\

& Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen hinaus geht. \\
\midrule
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\bottomrule
\end{tabularx}
\end{table}

\end{document}

Das cellspace Package lässt sich jedoch scheinbar nicht mit der Tabularx Umgebung verwenden, denn \begin{tabularx}{\textwidth}{SlSX} ergibt eine Fehlermeldung. Da ich aber gerne weiterhin Tabularx verwenden möchte, würde ich mich freuen, wenn mich jemand in die Richtung einer weiteren Lösung für das Problem der Abstände von Text zum Rahmen schubsen könnte;)

Vielen Dank wie immer schonmal im Voraus für eure Kreativität.

Josephine

mechanicus
21-09-2011, 17:42
Hi,

schaue dir bitte das Paket tabu an. Es erweitert die Schnittstelle des Benutzers und stellt ebenfalls X-Spalten zur Verfügung.

Gruß
Marco

josephine
22-09-2011, 10:47
Hi Marco,

vielen Dank für den Tipp. Tabu scheint ja tatsächlich die neue Generation zur Tabellendarstellung zu sein. Folgendes habe ich nun implementiert:


\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabu}

\begin{document}

\begin{table}
\centering
\tabulinesep=5mm
\begin{tabu} to 1\linewidth{X[l,m]X[l,m]}
\toprule
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\midrule
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\midrule
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\midrule
\multirow{3}{*}{Auswahl} & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde. \\

& Hier steht weiterer Beispieltext. \\

& Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen geht. \\
\midrule
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\bottomrule
\end{tabu}
\end{table}

\end{document}

Wie man sieht habe ich die vertikale Zentrierung über X[l,m] umsetzen können. Dennoch funktioniert dies nicht für den Begriff "Auswahl" in der 4. Zeile und 1. Spalte. "Auswahl" steht nicht zentriert, sondern unterhalb des theoretisch optimal vertikal zentrierten Punktes. Woran liegt das?

Die Abstände zwischen den Zellen habe ich über \tabulinesep=5mm eingestellt. Dazu habe ich jedoch zwei Fragen. 1.) Steht \tabulinesep=5mm in meinem Minimalbeispiel an der richtigen Stelle? 2.) Eigentlich möchte ich den Abstand zwischen Text und Rahmen nicht in jeder Zelle gleich gestalten. Tabulinesep scheint jedoch global zu wirken. Konkret möchte ich den Abstand von Zeile 3, Spalte 2 zu Zeile 4, Spalte 2 sowie den Abstand von Zeile 4, Spalte 2 zu Zeile 5, Spalte 2 verkleinern (also <5mm). Ist das irgendwie möglich?

Vielen Dank für die deine/eure Unterstützung.

Beste Grüße

Josephine

mechanicus
22-09-2011, 13:44
Hi,

1. Hier eine Redefinition von multirow -- sollte passen :o


\makeatletter
\def\multirowsetup{\raggedright}
\def\multirow#1{\relax\@ifnextchar
[{\@multirow{#1}}{\@multirow{#1}[0]}}
\def\@multirow#1[#2]#3{\@ifnextchar [{\@xmultirow{#1}[#2]{#3}}%
{\@xmultirow{#1}[#2]{#3}[0pt]}}
\def\@xmultirow#1[#2]#3[#4]#5{\@tempcnta=#1%
\@tempdima\@tempcnta\ht\@arstrutbox
\advance\@tempdima\@tempcnta\dp\@arstrutbox
\advance\@tempdima-\the\abovetabulinesep\relax
\advance\@tempdima-\the\belowtabulinesep\relax
\ifnum\@tempcnta<0\@tempdima=-\@tempdima\fi
\advance\@tempdima#2\bigstrutjot
\if*#3\setbox0\vtop to \@tempdima{\vfill\multirowsetup
\hbox{\strut#5\strut}\vfill}%
\else
\setbox0\vtop to \@tempdima{\hsize#3\@parboxrestore
\vfill \multirowsetup \strut#5\strut\par\vfill}%
\fi
\ht0\z@\dp0\z@
\ifnum\@tempcnta<0\advance\@tempdima-\dp\@arstrutbox
\else\@tempdima=\ht\@arstrutbox
\ifnum#2>0 \advance\@tempdima\bigstrutjot \fi
\fi
\advance\@tempdima#4\relax\leavevmode\vtop{\vskip-\@tempdima\box0\vss}}
\@ifundefined{bigstrutjot}{\newdimen\bigstrutjot \bigstrutjot\jot}{}
\makeatother

tabulinesep wirkt global innerhabel der table-Umgebung.

Du kannst den Abstand intern noch mittels \\[ABSTAND] beeinflussen.

Gruß
Marco

josephine
22-09-2011, 14:48
Hallo Marco,

vielen Dank für deine Hilfe. Die vertikale Zentrierung des Begriffs "Auswahl" hat funktioniert. Allerdings ist mir aufgefallen, dass sich bei einer Änderung von \tabulinesep=5mm auf bspw. \tabulinesep=12mm die vertikale Zentrierung wieder in Luft auflöst und der Begriff "Auswahl" ganz und garnicht vertikal zentriert wird.

Gibt es nicht eine Lösung, die unabhängig von der Größe der Zellen eine vertikale Zentrierung vornimmt? Scheint als wäre multirow das Problem, denn ohne multirow funktioniert es ja problemlos wie oben dargestellt über X[l,m].

Außerdem bin ich mit deiner Idee über \\[Abstand] leider nicht zurecht gekommen. Ich konnte damit keine guten Ergebnisse erzielen. Hab es mal mit addlinespace versucht, aber auch damit erhalte ich wiederum keine vertikale Zentrierung des Begriffs "Auswahl". Hier mein Minimalbeispiel mit addlinespace:


\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabu}




\begin{document}

\begin{table}
\centering
\begin{tabu} to 1\linewidth{X[l,m]X[l,m]}
\toprule
\addlinespace[4mm]
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
\multirow{3}{*}{Auswahl} & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde. \\
\addlinespace[2mm]
& Hier steht weiterer Beispieltext. \\
\addlinespace[2mm]
& Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen geht. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\addlinespace[4mm]
\bottomrule
\end{tabu}
\end{table}

\end{document}

Gibt es noch Hoffnung?

Viele Grüße

Josephine

mechanicus
22-09-2011, 14:52
Hi,

eigentlich wollte der Autor von tabu mit der Version 2.9 eine eingebaute multirow-Variante präsentieren. Leider hat er 2.9 noch nicht auf CTAN hochgeladen.

Multirow in seiner eigentlichen Verwendung berücksichtigt ebenfalls Parameter wie \arraystretch nicht. Sich aber jetzt hinzusetzten und einen kompatiblen \multirow-Befehl zu schreiben hallte ich für unglücklich.

Dein Beispiel habe ich mir noch nicht angesehen ;)

Marco

josephine
22-09-2011, 14:59
Unglücklich? Du meinst wohl unmöglich; jedenfalls für mich;)

mechanicus
22-09-2011, 15:05
Hi,

unglücklich trifft es schon :p

Wie wäre ein Verzicht auf multirow und dafür diese Variante:

\documentclass{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabu}


\begin{document}

\begin{table}
\centering
\begin{tabu} to 1\linewidth{X[l,m]X[l,m]}
\toprule
\addlinespace[4mm]
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Auswahl & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde.\par\kern2mm
Hier steht weiterer Beispieltext.\par\kern2mm
Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen geht. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\addlinespace[4mm]
\bottomrule
\end{tabu}
\end{table}

\end{document}

Dann könntest du auch wieder mit \tabulinesep arbeiten.

Viele Grüße
Marco

josephine
22-09-2011, 16:29
Hi Marco,

deine Antwort ist wie immer sehr elegant und beinah dachte ich, wir hätten die ultimative Lösung. Mir ist jedoch aufgefallen, dass mit dieser Lösung kein \cmidrule möglich ist, da jetzt an besagter Stelle keine 3 Zeilen mehr stehen, sondern nur noch eine mit zwei Absätzen. Die Lösung eines Problems ruft ein neues Problem auf. Es scheint mir als hätten wir es hier mit dem klassischen Teufelskreis zu tun oder tatsächlich mit der sagenhaften Sisyphus Arbeit?:(

Meinst du wir kriegen den Felsen jemals auf den Berg?

Viele Grüße

Josephine

mechanicus
22-09-2011, 16:36
Hi,

wir werden das schon machen. cmidrule würde allein auf die rechte Spalte wirken. Also würde gehen:

\documentclass{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{booktabs}
\usepackage{multirow} % ermöglicht mehrzeilige Zellen in Tabellen
\usepackage{tabu}


\begin{document}

\begin{table}
\centering
\begin{tabu} to 1\linewidth{X[l,m]X[l,m]}
\toprule
\addlinespace[4mm]
\textbf{Fragenkategorie} & \textbf{Fragestellung} \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Verfahren & Hier steht eine Frage, die über zwei Zeilen geht, da sie soooo lang ist. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Qualität & Wie kann der vertikale Abstand automatisiert werden? \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Auswahl & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde.\par\kern2mm\hrulefill\par\kern2mm
Hier steht weiterer Beispieltext.\par\hrulefill\par
Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen geht. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Auswahl & Die Frage der Auswahl ist in der Regel auch eine zweizeilige Frage, wenn sie lang genug formuliert wurde.\par\rlap{\rule{\dimexpr\hsize+\tabcolsep}{. 4pt}}\par\kern2mm
Hier steht weiterer Beispieltext.\par\rlap{\rule{\dimexpr\hsize+\tabco lsep}{.4pt}}\par\kern2mm
Und noch mehr Beispieltext, der aber ziemlich lang ist und gegebenenfalls auch mal über mehr als zwei Zeilen geht. \\
\addlinespace[4mm]
\midrule
\addlinespace[4mm]
Revision & Überprüfung in bestimmten zeitlichen Abständen \\
\addlinespace[4mm]
\bottomrule
\end{tabu}
\end{table}

\end{document}

Gruß
Marco