PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabelle: vertikale Zentrierung und Silbentrennung funktionieren nicht



ApfelQ
07-07-2010, 08:59
Hallo zusammen,

ich arbeite mich gerade in das Thema Tabellen ein und fand dabei insbesondere diese Anleitung hier sehr hilfreich: http://www.vision.ime.usp.br/~jmena/misc/latex/tables_with_latex.pdf

Nun habe ich aber folgende Probleme:

In meiner Tabelle, die in folgendem Minimalbeispiel enthalten ist, wird der Inhalt der Multirow-Zellen (erste Spalte) nicht vertikal zentriert. Auch wenn ich m{} aus dem Array Paket verwende klappt das nicht.
Die Silbentrennung scheint in den ersten beiden Spalten nicht richtig zu funktionieren (nur an manchen Stellen), der Text ragt in die benachbarte Zelle hinein.


So hier nun der Code:


\documentclass[a4paper]{scrreprt}

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

% Neue Spalte in Tabularx für linksbündig
\newcolumntype{Y}{>{\raggedright\arraybackslash}X}

% Neuer Command für Linien unter dem Heading
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}

\begin{document}

\begin{table}
\centering
\begin{tabularx}{\textwidth}{YYp{2.8cm}p{5cm}}
\toprule
\multicolumn{2}{l}{Leistungskriterien} & Bewertung & Blindtext\\
\otoprule
\multirow{2}{2cm}{Argumentationsleistung Präsentation} & Rein diskussionsorientiert & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\
\cmidrule(l){2-4}
& Überzeugungskraft & sehr gut (+++) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Themenschwerpunkt & sehr gut (+++) & So, jetzt ist mein supertoller Blindtext riesengroß geworden und geht sogar über vier Zeilen, hammer!\\
\midrule
\multirow{2}{2cm}{Argumentationsleistung Diskussion} & Überzeugungs- und Durchsetzungsvermögen & OK (0) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Fachkundigkeit & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\\bottomrule
\end{tabularx}
\caption{Meine super Tabelle}
\end{table}

\end{document}


Hat jemand schon mal ein ähnliches Problem gehabt? Ich wäre für jeden Hinweis dankbar - habe schon das ganze Web abgegrast und bin total ratlos...

Xenara
07-07-2010, 09:20
Die fehlende Trennung scheint daran zu liegen, dass LaTeX die Wörter nicht kennt. Gib die Trennungen mal vor, dann sollte es klappen, also etwa "Argumentations\-leistung"

Das Problem bei multirow lässt sich im MB lösen, indem man \multirow{5}{2cm}{...} vorgibt statt 2, denn mit den automatischen Umbrüchen werden 5 Zeilen gebraucht.
Allerdings hoffe ich, dass es dafür mittlerweile eine elegantere Lösung gibt.

Karlo
07-07-2010, 23:14
Hallo,
ich hab mal nen bisschen rumprobiert und festgestellt, dass es wohl daran liegt, dass das Wort breiter ist als die Spalte. Die Trennung an sich macht kein Problem, wenn vorher noch ein kurzes Wort steht:



\documentclass[a4paper]{scrreprt}

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

\begin{document}

\begin{tabular}{p{3cm}p{3cm}}
Argumentationsleistung & hallo Argumentationsleistung
\end{tabular}


\end{document}


lg
karlo

bobmalaria
07-07-2010, 23:20
hi,

mal \usepackage[babel]{microtype} einbinden und ecentuell deiner p spalte noch \RaggedRight aus dem ragged2e paket mitgeben.

gruss

lockstep
07-07-2010, 23:44
Die fehlende Trennung scheint daran zu liegen, dass LaTeX die Wörter nicht kennt. Gib die Trennungen mal vor, dann sollte es klappen, also etwa "Argumentations\-leistung"

Die fehlende Trennung liegt daran, dass TeX das erste Wort eines Absatzes nicht auf mögliche Trennstellen überprüft (was in schmalen Tabellenspalten keine gute Idee ist). Füge vor "Argumentationsleistung" \hspace{0pt} ein, dann wird korrekt getrennt.

lockstep

ApfelQ
08-07-2010, 09:39
Hallo zusammen,

herzlichen Dank für das umfangreiche Feedback - das ist ja super!



Das Problem bei multirow lässt sich im MB lösen, indem man \multirow{5}{2cm}{...} vorgibt statt 2, denn mit den automatischen Umbrüchen werden 5 Zeilen gebraucht.
Allerdings hoffe ich, dass es dafür mittlerweile eine elegantere Lösung gibt.

Ok, das ist gut zu wissen. Funktioniert so - allerdings muss man eben erst in die PDF schauen und die Zeilen zählen.



Die fehlende Trennung scheint daran zu liegen, dass LaTeX die Wörter nicht kennt. Gib die Trennungen mal vor, dann sollte es klappen, also etwa "Argumentations\-leistung"

Die manuelle Trennung funktioniert. Ich glaube aber, dass LaTeX mit einem Algorithmus trennt und es daher egal ist, ob er das Wort kennt oder nicht.



Die fehlende Trennung liegt daran, dass TeX das erste Wort eines Absatzes nicht auf mögliche Trennstellen überprüft (was in schmalen Tabellenspalten keine gute Idee ist). Füge vor "Argumentationsleistung" \hspace{0pt} ein, dann wird korrekt getrennt.

Das ist ebenfalls gut zu Wissen und liefert dann auch die Antwort :)
\hspace{0} funktioniert super, wenn es am Anfang der Zelle gesetzt wird. Ich würde das jedoch am liebsten global definieren (im Spalten command z.B.), aber das hier funktioniert nicht:



\newcolumntype{Y}{>{\raggedright\hspace{0pt}\arraybackslash}X}

Kann man das irgendwie erreichen?

@bobmalaria: Mit microtype komme ich irgendwie nicht weiter, da erhalte ich einen Fehler (! pdfTeX error (font expansion): auto expansion is only possible with scalable fonts.). In meinem vollständigen Dokument verwende ich außerdem XeLaTeX (verwende eine OpenType Font) und ich glaub das geht auch nicht ohne weiteres mit microtype?!

Nochmal tausend dank für Eure Antworten!

lockstep
08-07-2010, 09:50
\hspace{0} funktioniert super, wenn es am Anfang der Zelle gesetzt wird. Ich würde das jedoch am liebsten global definieren (im Spalten command z.B.), aber das hier funktioniert nicht:



\newcolumntype{Y}{>{\raggedright\hspace{0pt}\arraybackslash}X}

Kann man das irgendwie erreichen?


Dein Code funktioniert grundsätzlich durchaus (und ist die saubere Vorgangsweise) - du musst allerdings in multirow-Feldern händisch \hspace{0pt} ergänzen.

lockstep

lockstep
08-07-2010, 09:54
In meinem vollständigen Dokument verwende ich außerdem XeLaTeX (verwende eine OpenType Font) und ich glaub das geht auch nicht ohne weiteres mit microtype?!

Möglicherweise sogar überhaupt nicht. Soferne man also nicht als Alpha-Tester für luaLaTeX agieren möchte, muss man sich derzeit noch zwischen OpenType-Schriften und mikrotypographischen Features entscheiden.

lockstep

ApfelQ
08-07-2010, 10:29
Hallo lockstep,

danke für Deine Antworten! Das mit dem \hspace und Multirow habe ich nun auch geschnallt. Seltsames Verhalten von Multirow...

Nun habe ich folgendes abgeändertes Minimalbeispiel (der Einfachheit halber habe ich nur die erste Spalte vertikal zentriert):



\documentclass[a4paper]{scrreprt}

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

% Neue Spalte in Tabularx für linksbündig
\newcolumntype{Y}{>{\raggedright\hspace{0pt}\arraybackslash}X}

% Neuer Command für Linien unter dem Heading
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}


\begin{document}

\begin{table}
\centering
\begin{tabularx}{\textwidth}{YYp{2.8cm}p{5cm}}
\toprule
\multicolumn{2}{l}{Leistungskriterien} & Bewertung & Blindtext\\
\otoprule
\multirow{9}{2cm}{\hspace{0pt}Argumentationsleistu ng Präsentation} & Rein diskussionsorientiert & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\
\cmidrule(l){2-4}
& Überzeugungskraft & sehr gut (+++) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Themenschwerpunkt & sehr gut (+++) & So, jetzt ist mein supertoller Blindtext riesengroß geworden und geht sogar über vier Zeilen, hammer!\\
\midrule
\multirow{5}{2cm}{\hspace{0pt}Argumentationsleistu ng Diskussion} & Überzeugungs- und Durchsetzungsvermögen & OK (0) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Fachkundigkeit & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\\bottomrule
\end{tabularx}
\caption{Meine super Tabelle}
\end{table}

\end{document}


Was mich nun aber stört: In der ersten Spalte ist der Text nicht exakt vertikal zentriert. Der Abstand nach oben ist kürzer, als der nach unten zum Zellenende.

Laut diesen hilfreichen Anmerkungen ( http://www.unix-ag.uni-kl.de/~fischer/blog/20070411_Tabellen_in_LaTeX/ ) liegt es wohl daran, dass das Multirow-Paket nicht checkt, dass das booktabs Paket vertikale Abstände eingefügt hat und die Zeilenhöhe daher falsch berechnet. Den Lösungsvorschlag von der Seite habe ich versucht umzusetzen - erfolglos. Hier der wieder abgeänderte Code (sorry für den langen Beitrag :D) - die erste Spalte wird nun komplett zerschossen (Änderungen zum ersten Minimalbeispiel dieses Posts sind rot markiert):



\documentclass[a4paper]{scrreprt}

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

% Neue Spalte in Tabularx für linksbündig
\newcolumntype{Y}{>{\raggedright\hspace{0pt}\arraybackslash}X}

% Neuer Command für Linien unter dem Heading
\newcommand{\otoprule}{\midrule[\heavyrulewidth]}

% Anpassen der vertikal zentrierten Zellen
% Quelle:http://www.unix-ag.uni-kl.de/~fischer/blog/20070411_Tabellen_in_LaTeX/
\usepackage{ifthen}
\newcommand{\forloop}[5][1]{%
\setcounter{#2}{#3}%
\ifthenelse{#4}{#5\addtocounter{#2}{#1}%
\forloop[#1]{#2}{\value{#2}}{#4}{#5}}%
{}}

\newcounter{crcounter}

\newcommand{\compensaterule}[1]{%
\forloop{crcounter}{1}{\value{crcounter} < #1}%
{\vspace*{-\aboverulesep}\vspace*{-\belowrulesep}}}

\newcommand{\multirowbt}[3]{\multirow{#1}{#2}%
{\compensaterule{#1}#3}}


\begin{document}

\begin{table}
\centering
\begin{tabularx}{\textwidth}{YYp{2.8cm}p{5cm}}
\toprule
\multicolumn{2}{l}{Leistungskriterien} & Bewertung & Blindtext\\
\otoprule
\multirowbt{9}{2cm}{\hspace{0pt}Argumentationsleis tung Präsentation} & Rein diskussionsorientiert & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\
\cmidrule(l){2-4}
& Überzeugungskraft & sehr gut (+++) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Themenschwerpunkt & sehr gut (+++) & So, jetzt ist mein supertoller Blindtext riesengroß geworden und geht sogar über vier Zeilen, hammer!\\
\midrule
\multirowbt{5}{2cm}{\hspace{0pt}Argumentationsleis tung Diskussion} & Überzeugungs- und Durchsetzungsvermögen & OK (0) & Mein supertoller Blindtext ist größer und geht sogar über drei Zeilen\\
\cmidrule(l){2-4}
& Fachkundigkeit & gut (++) & Mein supertoller Blindtext geht über zwei Zeilen\\\bottomrule
\end{tabularx}
\caption{Meine super Tabelle}
\end{table}

\end{document}


Den eingefügten Code schnall ich nicht wirklich :confused: Habt Ihr vielleicht ne Idee an was das liegen könnte?