![Tabular: acoplar dimensiones de un tabular a otro tabular](https://rvso.com/image/335499/Tabular%3A%20acoplar%20dimensiones%20de%20un%20tabular%20a%20otro%20tabular.png)
tabular
establece el ancho de las columnas al elemento más ancho en todas las filas.
¿Es posible configurar dos o más tabular
mensajes separados para considerar los anchos de columna de cada uno y elegir el más grande de ellos?
Por ejemplo, si rompo un tabular
texto de párrafo adicional y quiero continuar con la tabla como si fuera un longtable
cruce a la página siguiente (mismo ancho de columna, posiblemente reiterando los encabezados), ¿sería posible?
Respuesta1
La idea es crear un montón de tipos de columnas especiales de modo que cada vez que este tipo de columna aparezca en una tabla siempre tendrá el mismo ancho. Esto requiere 2 ejecuciones del documento, donde los anchos calculados en la primera ejecución se guardan en el archivo auxiliar.
Nota: Si alguna vez desea estrechar las columnas, deberá eliminar el archivo auxiliar o al menos comentar \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 la creación de nuevas columnas, agregué \newcolumnwidth{<name>}{l/c/r}
(que en sí misma es bastante fea).
\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}
Respuesta2
El enfoque que seguiría es similar al que se hace dentro del tabbing
entorno. Establece una primera fila que define las tabulaciones y luego \kill
esa fila para que no se muestre. Las filas siguientes utilizarán estas tabulaciones sin que la primera fila esté 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}
La " \kill
fila" en el ejemplo anterior coloca los elementos más anchos en ambas tablas dentro de un \phantom
, mientras que la altura de la fila se elimina usando una nueva línea del formulario \\[-\normalbaselineskip]
.
Si el contenido a ocultar es muy alto, utilice \hphantom
. Si le preocupa la sobreimpresión de reglas verticales, no las use (como lo sugiere el increíblebooktabs
) o inserte cada elemento de columna en la " \kill
fila" usando\multicolumn{1}{l}{...}
sinreglas verticales.