Alinhamento vertical em relação à altura da linha

Alinhamento vertical em relação à altura da linha

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}

Saída 1: ok

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 é:

Resultado 2: errado

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}

Resultado 3: errado

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:

Resultado esperado

Na melhor das hipóteses, eu nem precisaria especificar uma largura para a coluna do meio.

Responder1

Você pode trapacear \multirowcontando 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} 

insira a descrição da imagem aqui

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}

insira a descrição da imagem aqui

Responder3

Ou use

\phantom

insira a descrição da imagem aqui

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

informação relacionada