Sie sind hier

Vertikale Ausrichtung in Tabellen

Ich habe eine Tabelle, in der eine Grafik und ein Text steht. Nun möchte ich, dass beide vertikal oben ausgerichtet wird. Wie ist das möglich? Ich habe bereits viele verschiedene Dinge probiert, jedoch ohne Erfolg. Der Text ist leider immer unten ausgerichtet.

Hier ein Minimalbeispiel:
Wichtige Vorausetzung: Die Grafik ist natürlich größer als eine Zellehöhe.

\documentclass[11pt, ngerman]{scrartcl}
 
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{babel}
 
\begin{document}
 
\begin{longtable}[l]{|p{0.5\textwidth}|p{0.5\textwidth}|}
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} \\
Text & \includegraphics{grafik.png} \\
\hline
\end{longtable}
 
\end{document}
forum: 
Bild von Markus Kohm

Zunächst brauchst Du für ein Minimalbeispiel des Problems weder graphicx, noch longtable oder babel. Dann ist anzumerken, dass eine Tabelle mit zwei Spalten, bei der jede Spalte 0,5 \textwidth breit ist, insgesamt breiter als \textwidth ist, weil zur reinen Spaltenbreite noch der Spaltenabstand kommt und zwar vor und nach jeder Spalte. Deshalb meldet TeX auch overfull \hbox.

Als nächstes sind die beiden Zellen tatsächlich gar nicht unten ausgerichtet, sondern oben, auch wenn der Anschein das Gegenteil vermuten lässt. Tatsächlich ist es aber so, dass bei Abbildungen der Referenzpunkt unten links liegt. Dieser wird auf der Grundlinie ausgerichtet. Die Abbildung hat also eine große Höhe und keine Tiefe. Der Text hat dagegen eine kleine Höhe und – je nach Text &ndash auch noch ein wenig Tiefe. Das ist auch der Grund, warum \rule so einfach als Ersatz für eine Abbildung verwendet werden kann. Diese hat ebenfalls nur Höhe und keine Tiefe.

Wenn man das erst einmal weiß, dann ist die Lösung vergleichsweise einfach. Man muss nur dafür sorgen, dass die Abbildung die maximale Höhe einer Textzeile bekommt und der Rest zu Tiefe wird. Die maximale Höhe einer Textzeile ist die Höhe der Box, die von der unsichtbaren Stütze \strut gesetzt wird. Die Box heißt \stutbox. Die Höhe einer Box ist \ht<em>&lt;Box&gt;</em>. Zum vertikalen Verschieben gibt es die Anweisung \raisebox{<em>&lt;Verschiebung&gt;</em>}{<em>&lt;zu verschiebender Inhalt&gt;</em>} (die Anweisung hat auch noch optionale Argumente, die Du bitte in einer LaTeX-Einführung nachschlägst). Die Gesamthöhe (Höhe + Tiefe) des Inhalts von \raisebox ist in \totalheight zu finden. Um nun also die Gesamthöhe abzüglich der maximalen Zeilenhöhe zu erhalten, muss man entweder über eine Hilfslänge mit den mageren LaTeX-Mitteln rechnen, oder man verwendet das Paket calc:

\documentclass{scrartcl}
\usepackage{calc}
\begin{document}
\noindent
\begin{tabular}{|p{.5\linewidth-2\tabcolsep}|p{.5\linewidth-2\tabcolsep}|}
  \hline
  \textbf{Spalte 1} & \textbf{Spalte 2} \\
  Text & \raisebox{\ht\strutbox-\totalheight}{\rule{.3\textwidth}{4cm}} \\
  \hline
\end{tabular}
\end{document}

oder aber man rechnet schlicht und einfach mit Hilfe der Möglichkeiten, die e-TeX bietet:

\documentclass{scrartcl}
\begin{document}
\noindent
\begin{tabular}{|p{\dimexpr .5\linewidth-2\tabcolsep\relax}%
                |p{\dimexpr.5\linewidth-2\tabcolsep\relax}|}
  \hline
  \textbf{Spalte 1} & \textbf{Spalte 2} \\
  Text & 
  \raisebox{\dimexpr \ht\strutbox-\totalheight\relax}
           {\rule{.3\textwidth}{4cm}} \\
  \hline
\end{tabular}
\end{document}

Inzwischen bevorzuge ich die letzte Möglichkeit. Falls Du ebenfalls e-TeX-Features nutzen willst, lies diese bitte im e-TeX-Manual nach.

Vielen Dank für deine ausführliche Erklärung!

Zugegeben finde ich die Lösung zwar sehr gut nachvollziehbar, aber da es sich meiner Meinung nach nicht um eine außergewöhnliche Anforderung handelt, halte ich die Vorgehensweise dennoch für recht aufwändig.
Mit Hilfe eines eigenen Kommandos lässt sich das natürlich leicht vereinfachen, aber ich hätte einen einfacheren Weg vermutet.

Ich habe außerdem eine Frage zur Berechnung der Spaltenbreite für Tabellen. In deinem Minimalbeispiel funktioniert die Berechnung einwandfrei, so dass es zu keiner übervollen Box kommt. Verwende ich diese Tabelle hingegen in meinem Dokument, kommt es dennoch zu einer übervollen Box.
Hast du eine Idee, woran das liegen könnte?

Ich verwende diesen Code in meinem Dokument:

\begin{tabular}{|p{.5\linewidth-2\tabcolsep}|p{.5\linewidth-2\tabcolsep}|}
  \hline
  \textbf{Spalte 1} & \textbf{Spalte 2} \\
  Text & \raisebox{\ht\strutbox-\totalheight}{\rule{.3\textwidth}{4cm}} \\
  \hline
\end{tabular}

Nochmals vielen Dank für deine Hilfe!

Bild von Markus Kohm

Da Du nur den Codeschnipsel beigefügt hast, der in meinem Beispiel einwandfrei funktioniert, kann ich nur raten. Vermutlich wird die Tabelle mit normalem Absatzeinzug gesetzt. Dann bekommst Du eine overfull \hbox im Bereich von 1 em, also je nach Grundschrift ca. 10 pt–12 pt. Im Beispiel habe ich den Absatzeinzug mit \noindent verhindert.

Nein, das ist es wohl nicht. Wenn ich \noindent vor der Tabelle einfüge, ändert das nichts im Ergebnis.
Stelle ich den draft-Modus ein sehe ich, dass die Tabelle nach rechts hin breiter ist als bspw. die Linie der Kopfzeile.

Könnte es evtl. an einer der folgenden Einstellungen aus der Konfiguration liegen?

\documentclass[a4paper,parskip,oneside,10pt,pointlessnumbers,tocleft,draft]{scrartcl}
\usepackage[left=25mm,right=25mm,top=25mm,bottom=25mm]{geometry}
\usepackage{titlesec}
\titleformat{\paragraph}{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{}
\titleformat{\subparagraph}{\normalfont\normalsize\bfseries}{\thesubparagraph}{1em}{}
\titlespacing*{\paragraph} {0pt}{3.25ex plus 1ex minus .2ex}{0.25em}
\setlength{\extrarowheight}{3pt}
Bild von Markus Kohm

Mit Option parskip darf die letzte Zeile eines Absatzes nicht voll sein. Wenn der Absatz nur aus einer Tabelle besteht, führt das aber dazu, dass die Tabelle gleichzeitig die letzte Zeile ist. Das erklärt eine overfull \hbox. Man kann das vermeiden, indem man die Tabelle \raggedright setzt oder aber lokal \parskipfill ändert.

Die Option erklärt aber nicht, warum die Tabelle breiter als die Kopfzeile ist. Das kann ich mir wirklich nicht erklären.

Ich fürchte, ohne vollständiges Minimalbeispiel kann ich Dir nicht helfen.

Es scheint an den Tabellenpaketen zu liegen. Sobald ich im unten angegebenen Beispiel das Paket

  • tabularx,
  • array oder
  • colortbl

verwende, kommt es zu diesem Effekt. Werden diese Pakete nicht verwendet, sieht es (optisch) in Ordnung aus, auch wenn dann immer noch eine Warnung kommt.

\documentclass[a4paper,parskip,oneside,10pt,pointlessnumbers,tocleft,draft]{scrartcl}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{tabularx}
%\usepackage{array}
%\usepackage{colortbl}
\usepackage{calc}
\usepackage[automark]{scrpage2}
\defpagestyle{content}{%
(0pt,0pt){}{}{xxx}(\textwidth,0.4pt)%
}{%
(\textwidth,0.4pt){}{}{xxx}(0pt,0pt)%
}%
\begin{document}
\pagestyle{content}
\begin{tabular}{|p{.5\linewidth-2\tabcolsep}|p{.5\linewidth-2\tabcolsep}|}
\hline
\textbf{Spalte 1} & \textbf{Spalte 2} \\
Text & \raisebox{\ht\strutbox-\totalheight}{\rule{.3\textwidth}{4cm}} \\
\hline
\end{tabular}
\end{document}
Bild von Markus Kohm

Das Paket array setzt die vertikale Linie nicht in den Abstand der Spalten, sondern zwischen den Abstand der Spalten. Es muss also noch die Breite der drei vertikalen Linien weg:

\documentclass[headsepline,parskip,10pt,draft]{scrartcl}
\usepackage{array}
\usepackage{calc}
\begin{document}
\pagestyle{headings}
\begingroup
\setlength{\parfillskip}{0pt plus 1fil}% \parfillskip lokal ändern
\begin{tabular}{|p{.5\linewidth-2\tabcolsep-1.5\arrayrulewidth}%
                |p{.5\linewidth-2\tabcolsep-1.5\arrayrulewidth}|}
  \hline
  \textbf{Spalte 1} & \textbf{Spalte 2} \\
  Text & 
  \raisebox{\ht\strutbox-\totalheight}{\rule{.3\textwidth}{4cm}} \\
  \hline
\end{tabular}\par% Der Absatz muss vor dem Ende der Gruppe enden!
\endgroup
\end{document}

Vielen Dank für die Hilfe!

Und als kleine Ergänzung noch:
Auch wenn es typografisch vermutlich besser ist, dies nicht zu tun, kann man sich mit parksip- einen beträchtlichen Teil dieses Codes sparen.

Da die Schreibweise zugegeben sehr gewöhnungsbedürftig ist, würde ich gerne ein neues Kommando bzw. einen neuen Spaltentyp definieren, um die Spaltenbreiten zu setzen.

Das Ganze soll dann z.B. über einen neuen Spaltentyp so funktionieren:

V{Prozentuale Breite}{Spaltenzahl}

Der erste Parameter gibt die prozentuale Breite der Spalte an (zwischen 0 und 1), der zweite gibt die Anzahl der Spalten an. Mit dieser soll Breite der senkrechten Linien abgezogen werden ([Anzahl+1]/Anzahl).

Leider funktioniert dies nicht. Ich habe mehrere Varianten ausprobiert, auch über ein neues Kommando mittels \newcommand.

\documentclass[headsepline,parskip-,10pt,draft]{scrartcl}
\usepackage{array}
\usepackage{calc}
\usepackage{ifthen}

% Funktioniert
%\newcolumntype{V}[2]{%
%	>{}p{#1\linewidth-2\tabcolsep-1.5\arrayrulewidth}
%}

% Funktioniert nicht
\newcolumntype{V}[2]{%
  >{}%
  \ifthenelse{\equal{#2}{2}}%
  {p{#1\linewidth-2\tabcolsep-1.5\arrayrulewidth}}%
  {p{#1\linewidth-2\tabcolsep-1.25\arrayrulewidth}}
}

\begin{document}
\pagestyle{headings}
\begin{tabular}{|V{0.2}{2}|V{0.5}{2}|}
  \hline
  \textbf{Spalte 1} & \textbf{Spalte 2} \\
  Text & 
  \raisebox{\ht\strutbox-\totalheight}{\rule{.3\textwidth}{4cm}} \\
  \hline
\end{tabular}
\end{document}

Bitte beachten: Die Berechnung zur Subtrakation der Liniendicke ist noch nicht eingebaut, da es bereits zuvor einen Fehler gibt.

Comments for "Vertikale Ausrichtung in Tabellen" abonnieren