Alineación vertical relativa a la altura de la fila

Alineación vertical relativa a la altura de la fila

Estoy luchando con un caso aparentemente trivial de alineación vertical en un archivo tabular. Considere 3 columnas: dos columnas contienen texto que se supone debe estar ajustado y debe estar alineado en elarribade las células. La tercera columna (la columna del medio en mi ejemplo) debe estar centrada verticalmente dentro de la fila.

Ejemplo:

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

Salida 1: bien

Esto se ve como se esperaba, pero sólo si los dos textos ocupan la misma altura. De lo contrario (simplemente cambiando el segundo \lipsum[1][1]a \lipsum[1][1-2], el resultado es:

Salida 2: incorrecto

Problema: el contenido de la columna 1 no está alineado en la parte superior de la celda.

Por supuesto, cambiar la alineación de las dos columnas "largas" p{4cm}no ayuda:

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

Salida 3: incorrecto

Problema: ahora la columna del medio ya no está centrada verticalmente.


Creo que entiendopor quéEsto está sucediendo: todas estas alineaciones son relativas a la primera "línea" de la celda actual, no a la celda misma. (¿Cómo es esto posible? Estoy buscando una especificación de columna que me permita producir:

Rendimiento esperado

En el mejor de los casos, ni siquiera tendría que especificar un ancho para la columna del medio.

Respuesta1

Puedes hacer trampa con \multirow, contando el número máximo de líneas en las celdas de una fila:

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

ingrese la descripción de la imagen aquí

Respuesta2

Realmente no es tan trivial.

Podrías medir las dos cajas grandes y luego colocar la del medio en el centro vertical. Sin embargo, TeX puede hacerlo por usted.

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

ingrese la descripción de la imagen aquí

Respuesta3

O usar

\phantom

ingrese la descripción de la imagen aquí

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

Respuesta4

Una solución manual pero muy sencilla podría ser igualar el número de líneas de la celda izquierda y utilizar una ccolumna para el separador "x":

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

información relacionada