Vertikale Ausrichtung relativ zur Zeilenhöhe

Vertikale Ausrichtung relativ zur Zeilenhöhe

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}

Ausgabe 1: ok

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:

Ausgabe 2: falsch

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}

Ausgabe 3: falsch

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:

Erwartete Ausgabe

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} 

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

Antwort3

Oder verwenden Sie

\phantom

Bildbeschreibung hier eingeben

\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 cSpalte 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}

verwandte Informationen