
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 tabularx
nas quais duas delas são l
ou r
e c
a coluna do meio é uma X
coluna. Se a X
coluna ocupar mais de uma linha, o comportamento desejado é que a primeira coluna (digamos, a l
coluna) seja alinhada no topo (na mesma linha da primeira linha da X
coluna, e a terceira coluna seja alinhada na parte inferior (no mesma linha da última linha da X
coluna). 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
, \xend
e \xpad
. Funcionou perfeitamente até agora.
- 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.
- O uso de
\hbox
para 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ãotext\hfill text
para 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 ( c
e r
colunas).
O segundo ponto refere-se ao uso de \hfill
. No exemplo, o \hfill
in A\hfill1
se expande para nada, então o texto exibido é "A1", mas a próxima linha contém A\hfill2
em 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 \hfill
também pudesse ser alcançado com as linhas nas quais a X
coluna 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 \hfill
se estique. Seria possível (suponho) usar o \pdflatstpos
mecanismo 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 \settowidth
para obter a largura do que você sabe ser a entrada mais larga.
\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}