![Tabular: acoplar dimensões de uma tabela a outra tabela](https://rvso.com/image/335499/Tabular%3A%20acoplar%20dimens%C3%B5es%20de%20uma%20tabela%20a%20outra%20tabela.png)
tabular
define as larguras das colunas para o elemento mais largo em todas as linhas.
É possível definir dois ou mais tabular
s separados para considerar as larguras das colunas um do outro e escolher o maior deles?
Por exemplo, se eu quebrar um tabular
texto de parágrafo adicional e quiser continuar o tabular como se fosse um longtable
cruzamento para a próxima página (mesmas larguras de coluna, possivelmente reiterando os cabeçalhos), isso seria possível?
Responder1
A ideia é criar vários tipos de colunas especiais de forma que toda vez que esse tipo de coluna aparecer em uma tabela ela sempre tenha a mesma largura. Isto requer 2 execuções do documento, onde as larguras calculadas na primeira execução são salvas no arquivo aux.
Nota: Se você quiser estreitar as colunas, precisará excluir o arquivo aux ou pelo menos comentar o \AtEndDocument.
\documentclass{article}
\usepackage{array}
\newsavebox{\tempbox}% \box0 etc. used
\makeatletter
\newcommand{\saveWidth}[1]% #1=column name (A,B,...)
{\immediate\write\@auxout{\string\initWidth{#1}{\the\csname Width#1\endcsname}}}
\newcommand{\initWidth}[2]% #1=column name (A,B,...), #2=the width
{\@ifundefined{Width#1}{}{\global\csname Width#1\endcsname=#2\relax}}
\makeatother
\newlength{\WidthA}% one for each column type
\newlength{\WidthB}
\newlength{\WidthC}
\AtEndDocument{\saveWidth{A}\saveWidth{B}\saveWidth{C}}
\newcolumntype{A}{>{\savebox{\tempbox}\bgroup}{l}<{\egroup%
\ifdim\wd\tempbox>\WidthA \global\WidthA=\wd\tempbox\fi%
\makebox[\WidthA][l]{\usebox\tempbox}}}
\newcolumntype{B}{>{\savebox{\tempbox}\bgroup}{c}<{\egroup%
\ifdim\wd\tempbox>\WidthB \global\WidthB=\wd\tempbox\fi%
\makebox[\WidthB][c]{\usebox\tempbox}}}
\newcolumntype{C}{>{\savebox{\tempbox}\bgroup}{r}<{\egroup%
\ifdim\wd\tempbox>\WidthC \global\WidthC=\wd\tempbox\fi%
\makebox[\WidthC][r]{\usebox\tempbox}}}
\begin{document}
\noindent\begin{tabular}{ABC}
left & center & right\\
wide left & wide center & wide right
\end{tabular}
\medskip
Some text here.
\medskip
\noindent\begin{tabular}{ABC}
left & center & right\\
\end{tabular}
\medskip
Some text here.
\medskip
\noindent\begin{tabular}{ABC}
very wide left & very wide center & very wide right\\
\end{tabular}
\end{document}
Para facilitar a criação de novas colunas, adicionei \newcolumnwidth{<name>}{l/c/r}
(o que é bastante feio).
\newcommand{\newcolumnwidth}[2]% #1=new column type, #2=l/c/r
{\expandafter\newlength\csname Width#1\endcsname%
\AtEndDocument{\saveWidth{#1}}%
\newcolumntype{#1}{>{\savebox{\tempbox}\bgroup}{#2}<{\egroup%
\ifdim\wd\tempbox>\csname Width#1\endcsname \global\csname Width#1\endcsname=\wd\tempbox\fi%
\makebox[\csname Width#1\endcsname][#2]{\usebox\tempbox}}}}
\newcolumnwidth{A}{l}
\newcolumnwidth{B}{c}
\newcolumnwidth{C}{r}
Responder2
A abordagem que eu seguiria é semelhante à que é feita dentro do tabbing
ambiente. Você define uma primeira linha que define as paradas de tabulação e depois \kill
essa linha para que ela não seja exibida. As linhas subsequentes usarão essas paradas de tabulação sem que a primeira linha esteja presente.
\documentclass{article}
\begin{document}
\noindent
\begin{tabular}{l c r}
left & center & right \\
wide left & wide center & wide right
\end{tabular}
\medskip
Some text here.
\medskip
\noindent
\begin{tabular}{l c r}
\phantom{wide left} &
\phantom{wide center} &
\phantom{wide right} \\[-\normalbaselineskip]% Similar to \kill
left & center & right
\end{tabular}
\end{document}
A " \kill
linha" no exemplo acima coloca os elementos mais largos em ambas as tabelas dentro de a \phantom
, enquanto a altura da linha é removida usando uma nova linha no formato \\[-\normalbaselineskip]
.
Se o conteúdo a ser ocultado for muito alto, use \hphantom
. Se você estiver preocupado com a impressão sobreposta de regras verticais, não as use (como sugerido pelo incrívelbooktabs
) ou insira cada elemento da coluna na " \kill
linha" usando\multicolumn{1}{l}{...}
semregras verticais.