
Estou lutando com um caso aparentemente trivial de alinhamento vertical em um arquivo tabular
. Considere 3 colunas: duas colunas contêm texto que deve ser moldado suavemente e deve ser alinhado na parte inferior.principaldas células. A terceira coluna (a coluna do meio no meu exemplo) deve ser centralizada verticalmente na linha.
Exemplo:
\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}
Isso parece o esperado, mas apenas se os dois textos ocuparem a mesma altura. Caso contrário (apenas mudando o segundo \lipsum[1][1]
para \lipsum[1][1-2]
, o resultado é:
Problema: O conteúdo da coluna 1 não está alinhado no topo da célula.
É claro que alterar o alinhamento das duas colunas "longas" para p{4cm}
não ajuda:
\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: Agora a coluna do meio não está mais centralizada verticalmente.
eu acho que entendipor queisso está acontecendo: todos esses alinhamentos são relativos à primeira "linha" da célula atual, e não à própria célula. (Como isso é possível? Estou procurando uma especificação de coluna que me permita produzir:
Na melhor das hipóteses, eu nem precisaria especificar uma largura para a coluna do meio.
Responder1
Você pode trapacear \multirow
contando o número máximo de linhas nas células de uma linha:
\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}
Responder2
Não é tão trivial.
Você poderia medir as duas caixas grandes e depois colocar a do meio no centro vertical. No entanto, o TeX pode fazer isso por você.
\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}
Responder3
Ou use
\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}
Responder4
Uma solução manual, mas muito simples, poderia ser equalizar o número de linhas da célula esquerda e usar uma c
coluna para o 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}