
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}
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:
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}
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:
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}
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}
Respuesta3
O usar
\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}
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 c
columna 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}