
Ich kämpfe mit einem scheinbar trivialen Fall der vertikalen Ausrichtung in einem tabular
. Betrachten Sie 3 Spalten: Zwei Spalten enthalten Text, der weich umbrochen werden soll und an derSpitzeder Zellen. Die dritte Spalte (in meinem Beispiel die mittlere Spalte) sollte vertikal zentriert innerhalb der Zeile stehen.
Beispiel:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm} m{1cm} m{4cm}}
\lipsum[1][1] & x & \lipsum[1][1]
\end{tabular}
\end{document}
Das sieht wie erwartet aus, aber nur, wenn die beiden Texte die gleiche Höhe einnehmen. Andernfalls (einfach den zweiten \lipsum[1][1]
in ändern \lipsum[1][1-2]
) ist das Ergebnis:
Problem: Der Inhalt der Spalte 1 ist nicht oben in der Zelle ausgerichtet.
Natürlich p{4cm}
hilft es nicht, die Ausrichtung der beiden "langen" Spalten zu ändern:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{p{4cm} m{1cm} p{4cm}}
\lipsum[1][1] & x & \lipsum[1][1-2]
\end{tabular}
\end{document}
Problem: Jetzt ist die Spalte in der Mitte nicht mehr vertikal zentriert.
Ich denke ich versteheWarumFolgendes passiert: Alle diese Ausrichtungen beziehen sich auf die erste „Zeile“ der aktuellen Zelle, nicht auf die Zelle selbst. (Wie) Ist das möglich? Ich suche nach einer Spaltenspezifikation, die es mir ermöglicht, Folgendes zu erstellen:
Im besten Fall müsste ich für die mittlere Spalte nicht einmal eine Breite angeben.
Antwort1
Sie können schummeln \multirow
, indem Sie die maximale Anzahl von Zeilen in den Zellen einer Zeile zählen:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array, multirow}
\begin{document}
\begin{tabular}{p{4cm} m{1cm} p{4cm}}
\lipsum[1][1] & \multirow{6}{=}{x} & \lipsum[1][1-2]
\end{tabular}
\end{document}
Antwort2
Gar nicht so trivial.
Sie könnten die beiden großen Kästen messen und dann den mittleren vertikal in der Mitte platzieren. TeX kann dies jedoch für Sie erledigen.
\documentclass{article}
\usepackage[latin]{babel} % for better hyphenation
\usepackage{lipsum} % for mock text
\usepackage{microtype} % for less overfull boxes
\newcommand{\mytwocols}[4][4cm]{%
\valign{##\cr
\mycol{\vtop}{#1}{#2}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\vfill\mycol{\vbox}{1cm}{#3}\vfill\cr
\noalign{\hspace{2\tabcolsep}}
\mycol{\vtop}{#1}{#4}\vfill\cr
}%
}
\newcommand{\mycol}[3]{%
#1{\hsize#2\relax\parindent0pt\relax\sloppy#3}%
}
\begin{document}
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1]}
\bigskip
\mytwocols
{\lipsum[1][1]}
{x}
{\lipsum[1][1-2]}
\bigskip
\mytwocols
{\lipsum[1][1-2]}
{x}
{\lipsum[1][1]}
\end{document}
Antwort3
Oder verwenden Sie
\phantom
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\newcolumntype{M}[1]{>{\centering\let\newline\\\arraybackslash\hspace{0pt}}m{#1}}
\begin{document}
\begin{tabular}{p{4cm} M{5cm} p{4cm}}
\lipsum[1][1] & {\phantom{\lipsum[1][1-2]}} x & \lipsum[1][1-2]
\end{tabular}
\end{document}
Antwort4
Eine manuelle, aber sehr einfache Lösung könnte darin bestehen, die Anzahl der Zeilen der linken Zelle anzugleichen und eine c
Spalte für das „x“-Trennzeichen zu verwenden:
\documentclass{scrartcl}
\usepackage{lipsum}
\usepackage{array}
\begin{document}
\begin{tabular}{m{4cm}@{\qquad}c@{\qquad}m{4cm}}
\lipsum[1][1]\newline\newline\newline & x & \lipsum[1][1-2]
\end{tabular}
\end{document}