Anzeige:
Ergebnis 1 bis 10 von 10

Thema: keine vertikale Zentrierung mit multirow möglich?

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    77

    keine vertikale Zentrierung mit multirow möglich?

    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:

    Code:
    \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):

    Code:
    \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

  2. #2
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

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

    Gruß
    Marco

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    77
    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

  4. #4
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    1. Hier eine Redefinition von multirow -- sollte passen

    Code:
    \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

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    77
    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:

    Code:
    \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

  6. #6
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    77
    Unglücklich? Du meinst wohl unmöglich; jedenfalls für mich

  8. #8
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    unglücklich trifft es schon

    Wie wäre ein Verzicht auf multirow und dafür diese Variante:
    Code:
    \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

  9. #9
    Registrierter Benutzer
    Registriert seit
    08.08.2011
    Beiträge
    77
    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

  10. #10
    Registrierter Benutzer Avatar von mechanicus
    Registriert seit
    10.07.2008
    Ort
    Hamburg
    Beiträge
    3.944
    Hi,

    wir werden das schon machen. cmidrule würde allein auf die rechte Spalte wirken. Also würde gehen:
    Code:
    \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+\tabcolsep}{.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

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •