Alinhamento diferente nas colunas quando a coluna 'X' é agrupada em tabularx

Alinhamento diferente nas colunas quando a coluna 'X' é agrupada em tabularx

Em 2013 fiz esta pergunta e fui respondida, mas implementando em outro código tive novos problemas não apresentados antes.

Eu tenho três colunas tabularxnas quais duas delas são lou re ca coluna do meio é uma Xcoluna. Se a Xcoluna ocupar mais de uma linha, o comportamento desejado é que a primeira coluna (digamos, a lcoluna) seja alinhada no topo (na mesma linha da primeira linha da Xcoluna, e a terceira coluna seja alinhada na parte inferior (no mesma linha da última linha da Xcoluna). As colunas em branco são preenchidas com algo como um \cdot.

A postagem original está disponível em [1]; a solução fornecida por David Carlisle envolveu novos comandos para fazer medições e colocar o texto nas posições desejadas: \xleft, \xright, \xstart, \xende \xpad. Funcionou perfeitamente até agora.

  1. Se as células da primeira e terceira colunas contiverem mais de um caractere de texto, as células preenchidas serão alinhadas horizontalmente ao início/fim do texto nas demais células envolvidas em vez de serem centralizadas, que é a aparência desejada.
  2. O uso de \hboxpara imprimir o conteúdo das células inibe o uso de espaços extensíveis como \hfill, e uma célula da coluna da direita deve ter o padrão text\hfill textpara expandir o espaço entre as duas palavras até a largura da coluna (retirada da célula mais longa, no meu caso o título da coluna).

O código a seguir é a solução de David Carlisle exemplificada para mostrar o que quero agora:

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2{\xpad{#1}{\hbox{#2}}{}}
\def\xright#1#2{\xpad{#1}{}{\hbox{#2}}}

\begin{document}
\begin{tabularx}{5cm}{cXr}
title 1 & title 2 & title 3 \\

 \xleft{a}{7890} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1} \\
 \xleft{b}{50} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

Como podemos ver, os pontos abaixo de “7890” estão alinhados ao início desta célula, ou seja, abaixo do número “7”, e o ponto abaixo da célula “50” está logo abaixo do “5”. A aparência geral é que está tudo desalinhado. Prefiro tê-los todos centralizados na primeira e na terceira colunas ( ce rcolunas).

O segundo ponto refere-se ao uso de \hfill. No exemplo, o \hfillin A\hfill1se expande para nada, então o texto exibido é "A1", mas a próxima linha contém A\hfill2em que o espaço extensível se expande até o tamanho da célula mais larga (a primeira: "título 3"). Seria ótimo se o efeito \hfilltambém pudesse ser alcançado com as linhas nas quais a Xcoluna pode ser quebrada.

TIA.

[1]tabularx: alinhamento inferior nas colunas r ou l quando a coluna X é quebrada

Responder1

A coisa mais simples sem reescrever tudo é permitir que você especifique uma largura a ser usada para a caixa, para permitir que ela \hfillse estique. Seria possível (suponho) usar o \pdflatstposmecanismo usado para medir a extensão vertical da coluna X para medir a extensão horizontal da 1ª e 3ª colunas, mas acrescenta muitas complicações para o que talvez seja de pouca utilidade prática. Em vez de usar uma largura fixa de 2 cm, como aqui, você poderia usar \settowidthpara obter a largura do que você sabe ser a entrada mais larga.

insira a descrição da imagem aqui

\documentclass{article}
\usepackage{tabularx}

\makeatletter
\def\savepos#1{\leavevmode\pdfsavepos\write\@auxout{%
\gdef\noexpand#1{\the\pdflastypos sp }}}

\def\xstart#1{\expandafter\savepos\csname save@start@#1\endcsname}
\def\xend#1{\expandafter\savepos\csname save@end@#1\endcsname}
\def\xpad#1#2#3{%
\vtop{%
\baselineskip\normalbaselineskip
#2%
\expandafter\ifx\csname save@start@#1\endcsname\relax
\else
\dimen@\csname save@start@#1\endcsname\relax
\loop
\ifdim\dimen@>\csname save@end@#1\endcsname
\advance\dimen@-\baselineskip
\hbox{$\cdot$}%
\repeat
\fi
#3%
}}
\def\xleft#1#2#3{\xpad{#1}{\hbox\ifx!#3!\else to #3\fi{#2}}{}}
\def\xright#1#2#3{\xpad{#1}{}{\hbox\ifx!#3!\else to #3\fi{#2}}}

\begin{document}
\begin{tabularx}{5cm}{lXr}
\multicolumn{1}{c}{title 1}& title 2 & title 3 \\

 \xleft{a}{7890}{} & \xstart{a}qwer asdf zxcv qwer 
    asdf zxcv qwer asdf
    zxcv\xend{a} & \xright{a}{1}{2cm} \\
 \xleft{b}{50}{} & \xstart{b}qwer asdf zxcv\xend{b} & \xright{b}{A\hfill1}{2cm} \\
 90 & ..... & B\hfill2
\end{tabularx}
\end{document}

informação relacionada