Tabular: acoplar dimensiones de un tabular a otro tabular

Tabular: acoplar dimensiones de un tabular a otro tabular

tabularestablece el ancho de las columnas al elemento más ancho en todas las filas.

¿Es posible configurar dos o más tabularmensajes separados para considerar los anchos de columna de cada uno y elegir el más grande de ellos?

Por ejemplo, si rompo un tabulartexto de párrafo adicional y quiero continuar con la tabla como si fuera un longtablecruce 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 tabbingentorno. Establece una primera fila que define las tabulaciones y luego \killesa fila para que no se muestre. Las filas siguientes utilizarán estas tabulaciones sin que la primera fila esté presente.

ingrese la descripción de la imagen aquí

\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 " \killfila" 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 " \killfila" usando\multicolumn{1}{l}{...} sinreglas verticales.

información relacionada