In einer Tabelle möchte ich in bestimmten Spalten den Inhalt der Zellen relativ zur Zelle vertikal mittig ausrichten.

Hier mal eine Test-Tabelle:

Öffne in Overleaf
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{p{2cm}m{1cm}c}
\hline
Besonders viel Text in einer Zelle & wenig Text & Text \\
\hline
\end{tabular}
\end{document}

Ausgabe der Beispieltabelle

Die m-Spalte eignet sich hier nicht, weil das ja für die Ausrichtung zu den anderen Tabellen-Zellen ist, nicht zum Zentrieren ihres Inhalts innerhalb, ganz unabhängig von den anderen.

Wie kann ich das dann machen? Meine Idee wäre, Zellenhöhe bestimmen (\height ?), mit \raisebox verschieben oder anders in Box packen und zentrieren.

gefragt 16 Jul '13, 12:55

Student's gravatar image

Student
5807779104
Akzeptiert-Rate: 82%

bearbeitet 20 Feb '17, 19:02

stefan's gravatar image

stefan ♦♦
18.1k143048


Das geht schon mit m-Spalten, man muss sie nur konsequent einsetzen:

Open in writeLaTeX
\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{m{2cm}m{1cm}c}
\hline
Besonders viel Text in einer Zelle & wenig Text & Text \\
\hline
\end{tabular}
\end{document}

Ergebnis

Um zu verstehen, was da passiert, muss man wissen, dass die Zentrierung immer relativ zur aktuellen Grundlinie erfolgt. Die Grundlinie wird in diesem Fall durch die c-Spalte vorgegeben. Die erste Spalte und die zweite werden nun relativ dazu zentriert. Letztlich ist das die Ausrichtung von Boxen mit \parbox ohne Höhenangabe. Eine t ausgerichtete \parbox wird mit ihrer obersten inneren Grundlinie auf der äußeren Grundlinie ausgerichtet. Genau das wird bei p-Spalten verwendet. Eine b ausgerichtete \parbox wird mit ihrer untersten inneren Grundlinie auf der äußeren Grundlinie ausgerichtet. Das wird bei b-Spalten verwendet. Eine c ausgerichtete bzw. jede nicht t oder b ausgerichtete \parbox wird relativ zur äußeren Grundlinie vertikal zentriert.

Wenn man nun also eine t ausgerichtete \parbox neben eine b ausgerichtete \parbox setzt, dann liegt die oberste innere Grundlinie der t ausgerichteten \parbox auf der Höhe der untersten inneren Grundlinie der b ausgerichteten \parbox. Die t ausgerichtete \parbox liegt also tiefer als die b ausgerichtete. Ebenso ist es mit einer p-Spalte im Vergleich zu einer b-Spalte:

Open in writeLaTeX
\documentclass{article}
\usepackage{array}
\newcommand*{\blindtext}{Mir reichen drei bis vier Zeilen, um die Ausrichtung
  zu verdeutlichen. Dabei ist es sogar von Vorteil, wenn die Zellen gleich
  viel Text enthalten.}
\begin{document}
\noindent
\begin{tabular}{@{}p{.5\linewidth}@{}b{.5\linewidth}@{}}
\blindtext & \blindtext\\
\end{tabular}
\end{document}

p-Spalte links, m-Spalte rechts

Eine zentrierte \parbox oder eben eine m-Spalte wird zur Grundlinie zentriert. Steht eine t-ausgerichtete \parbox oder eine p-Spalte daneben, so ist jene mit der oberen inneren Grundlinie an der Grundlinie ausgerichtet. Damit steht die m-Spalte potentiell höher:

Open in writeLaTeX
\documentclass{article}
\usepackage{array}
\newcommand*{\blindtext}{Mir reichen drei bis vier Zeilen, um die Ausrichtung
  zu verdeutlichen. Dabei ist es sogar von Vorteil, wenn die Zellen gleich
  viel Text enthalten.}
\begin{document}
\noindent
\begin{tabular}{@{}p{.5\linewidth}@{}m{.5\linewidth}@{}}
\blindtext & \blindtext\\
\end{tabular}
\end{document}

p-Spalte links, m-Spalte rechts

Ist steht eine b ausgerichtete \parbox oder eben eine b-Spalte neben einer zentrierten \parbox bzw. neben einer m-Spalte, so die b ausgerichtete \parbox bzw. b-Spalte mit ihrer unteren Grundlinie auf jener äußeren Grundlinie ausgerichtet, zu der die zentrierte \parbox bzw. m-Spalte zentriert wird. Damit ist die zentrierte \parbox oder m-Spalte potentiell tiefer:

Open in writeLaTeX
\documentclass{article}
\usepackage{array}
\newcommand*{\blindtext}{Mir reichen drei bis vier Zeilen, um die Ausrichtung
  zu verdeutlichen. Dabei ist es sogar von Vorteil, wenn die Zellen gleich
  viel Text enthalten.}
\begin{document}
\noindent
\begin{tabular}{@{}b{.5\linewidth}@{}m{.5\linewidth}@{}}
\blindtext & \blindtext\\
\end{tabular}
\end{document}

b-Spalte links, m-Spalte rechts

Der Effekt ist also keineswegs so, dass b-Spalten tief stehen, t-Spalten hoch und m-Spalten zu allem zentriert sind. Entscheidend ist immer die der Bezugspunkt sowohl innerhalb als auch außerhalb der Box bzw. der Zelle. Dadurch muss man ggf. ein wenig um die Ecke denken, wenn man mehrere Boxen oder Spalten unterschiedlich zueinander ausrichten will.

Spalten der Typen l, r oder c sind übrigens immer einzeilig (außer man packt eine \parbox hinein) und werden immer mit ihrer Grundlinie auf der äußeren Grundlinie ausgerichtet. Damit kann man sie wie im obersten Beispiel ersichtlich leicht als Indikator für die Grundlinie verwenden.

Die Zellenhöhe auszumessen würde im übrigen erste einmal nichts nützen, da jede Zelle für sich nur so hoch und tief wie ihr Inhalt ist. Die Tabellenzeile ist dann so hoch und tief wie die höchste bzw. tiefste Zelle. Aber diese Information steht erst zur Verfügung, wenn die Zelle bereits gesetzt ist. Erst wenn man weiß, wie hoch und tief die höchste und die tiefste Zelle sind (das müssten übrigens nicht dieselben Zellen sein), könnte man alle Zellen durch explizite Boxen gleich hoch machen und dann das Material innerhalb dieser Boxen ausrichten. Das ist aber etwas anderes als die Ausrichtung der Boxen selbst, die man über den Spaltentyp einstellt.

Abschließend sei auch noch darauf hingewiesen, dass eine Zeile, eine \parbox und natürlich auch eine Tabellenzelle nicht zwingend genauso hoch wie tief ist. Da die zentrierte Ausrichtung die Mitte der Box oder Tabellenzelle und nicht etwa die mittlere Zeile der Box oder Tabellenzelle an der Grundlinie ausrichtet, kann daher bereits eine zentrierte \parbox mit nur einer Zeile gegenüber der Grundlinie verschoben sein:

Open in writeLaTeX
\documentclass{article}

\begin{document}
Test\parbox{2em}{Test}
\end{document}

Verschiebung

Das hängt aber stark vom Inhalt ab. c ausgerichtete Boxen bzw. m-Spalten unterscheiden sich diesbezüglich also stark von t oder b ausgerichteten Boxen bzw. p- oder b-Spalten, bei denen die Grundlinie der obersten bzw. untersten Zeile an der aktuellen Grundlinie ausgerichtet wird.

Da in einem Kommentar danach gefragt wurde, sei darauf hingewiesen, dass man für X-Spalten des Pakets tabularx den zugrundeliegenden Spaltentyp über \tabularxcolumn einstellen kann. Soweit ich weiß, kann man den Typ aber nicht innerhalb einer Tabelle wechseln. Näheres ist der recht kurzen Anleitung zu dem Paket zu entnehmen.

Permanenter link

beantwortet 16 Jul '13, 14:10

saputello's gravatar image

saputello
11.1k154365
Akzeptiert-Rate: 51%

bearbeitet 10 Jan '15, 20:20

Gibt nicht einen Weg, wo ich nicht alles zu m machen muss? Also Oberkante-ausgerichtete Zellen haben kann (p) plus mittige? So wird ja alles mittig. Ich möchte auch gern X-Spalten von tabularx verwenden.

(16 Jul '13, 15:05) Student

@Student: Man kann auch X-Spalten auf m oder b statt auf p basieren lassen. Und muss man nicht alle Spalten zentrieren. Die Frage ist immer welche-Spalten man zentrieren muss. Du siehst das sehr schön an Deinem eigenen Code. Dort wird die mittlere Spalte tatsächlich zur Grundlinie zentriert. Da aber die linke Spalte mit der obersten inneren Grundlinie auf eben dieser Grundlinie ausgerichtet wird, ist dann die mittlere Spalte eben nicht zur linken Spalte zentriert. Ich werde versuchen, das in meiner Antwort noch einmal zu verdeutlichen.

(16 Jul '13, 16:13) saputello

@saputello Vielen Dank, dass Du Dir die Zeit für diese ausführliche Erklärung genommen hast!

(16 Jul '13, 20:05) Student

Man kann Tabellen schachteln, um oben ausgerichtete Spalten mit mittig ausgerichteten zu mischen.

Ein Beispiel:

\documentclass{article}
\usepackage{array}
\begin{document}
\begin{tabular}{l*2{m{1cm}}}
  \begin{tabular}{rp{1cm}}
    Oben & Oben ausgerichtet
  \end{tabular}
    & Mitte & Mitte
\end{tabular}
\end{document}

Tabelle mit gemischter Ausrichtung

Permanenter link

beantwortet 30 Jul '13, 14:30

stefan's gravatar image

stefan ♦♦
18.1k143048
Akzeptiert-Rate: 48%

bearbeitet 30 Jul '13, 14:52

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×254
×117
×23

gestellte Frage: 16 Jul '13, 12:55

Frage wurde gesehen: 96,056 Mal

zuletzt geändert: 10 Jan '15, 20:20