¿Equilibrar columnas tabulares automáticamente?

¿Equilibrar columnas tabulares automáticamente?

Cómo equilibrar las columnas de dicha declaración:

\begin{tabularx}{\linewidth}{
  >{\hsize=0.4\hsize}X% 10% of 4\hsize
  >{\hsize=1.6\hsize}X% 30% of 4\hsize
  >{\hsize=0.4\hsize}X% 10% of 4\hsize
  >{\hsize=1.6\hsize}X% 30% of 4\hsize
  }
\end{tabularx}

Obviamente los valores 0.4y 1.6deben ajustarse automáticamente en el momento de la construcción...

Ejemplo:

     .--------- Same width ---------------.
     |                                    |
<----+--->                            <---+---->    
┌────────┬────────────────────────────┬────────┬───────────────────────────┐
│ A      │ B                          │ A      │ B                         │
├────────┼────────────────────────────┼────────┼───────────────────────────┤
│ 132132 │ Sed rutrum elit quis neque │ 42     │ Cras porta                │
└────────┴────────────────────────────┴────────┴───────────────────────────┘
         <------------+--------------->        <-------------+------------->
                      |                                      |
                      '------------- Same width -------------'

¿Dónde las columnas impares tienen tamaño Ay las pares un tamaño B? Con esto garantizo que las columnas 1 y 3 tienen siempre el mismo tamaño, y las columnas 2 y 4 están igualmente distribuidas en el espacio.

En otras palabras, el ancho mínimo de las columnas se determina de la siguiente manera:

min_widths[0] = min_widths[2] = max(map(width, columns[0] + columns[2]))
min_widths[1] = min_widths[3] = max(map(width, columns[1] + columns[3]))

Luego todo se estira para que quepa en \linewidth:

if sum(min_widths) > \linewidth: 
    % Attempts to wrap some text and reduce the column sizes
else: 
    widths = map(lambda x: x * (\linewidth / sum(min_widths), min_widths)

Buenos parámetros para dicha característica serían:

- Column alignment: left, center, right, raggedleft, raggedright
- Maximum width: e.g. 10em
- Minimum width: e.g. 0em
- Desired width ratio: 1
- Automatic wrapping: yes, no

Respuesta1

Aquí hay una solución con {NiceTabular}de nicematrix(≥ 6.25a). En ese entorno, tiene una clave columns-width=autoque requiere que todas las columnas tengan el mismo ancho, excepto las Xcolumnas (que son similares a las Xcolumnas de tabularx).

\documentclass{article}
\usepackage{nicematrix}
\usepackage{lipsum} % for dummy text

\begin{document}

\lipsum[1]
\begin{center}
\begin{NiceTabular}{lXlX}[columns-width=auto,hvlines]
A & B & A & B \\
132132 & Sed rutrum elit quis neque & 42 & Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna
fringilla ultrices. 
\end{NiceTabular}
\end{center}
\lipsum[2]

\end{document}

Salida del código anterior

Respuesta2

EDITAR 20190807Al final de la respuesta, he incluido el código que recomiendo, una combinación de la respuesta de Zarko y la mía.

Es posible que tengas que tabularusar el todo linewidthcalculando el ancho de p{}las columnas como fracciones del linewidth. Solo asegúrese de que el número total de anchos de columna se acumulen en el archivo linewidth. Tienes que restar el número correcto de tabcolseps, que es dos por columna (un total de ocho para cuatro columnas). Si tienes reglas verticales, también debes restar los números correctos de arrayrulewidths.

He 'mejorado' el ejemplo anterior. Si nos fijamos en la definición de una Acolumna, ahora dice:

\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/2-1.5\tabcolsep\relax}}
  1. Si prefiere columnas centradas o alineadas a la derecha, cambie \RaggedRighta \Centeringo \RaggedLeft.
  2. Si necesita una tabla donde el ancho total es menor que el total linewidth, cambie (1\linewidth)a la fracción correcta. Por ejemplo, si necesita un 80 por ciento tabular de linewidth, utilice (0.8\linewidth).
  3. La fórmula 25/100/2es el ancho relativo de la Acolumna, aquí 25%. Este número debe establecerse de modo que el total newcolumntypesea 100. Por lo tanto, Bse utiliza la columna 75/100. El último dígito es el número de A-o B-columnas.
  4. Si quitas los cojinetes del lado izquierdo y derecho, ( @{}), el número de tabcolseps a restar será dos menos que el número total de tabcolsepts. Si tienes cuatro columnas, tienes que restar seis, si tienes seis columnas, tienes que restar diez,etc.. La fórmula será -(2\tabcolsep-(\tabcolsep/<no. col.type>)). Si tienes tres Acolumnas, debes restar -(2\tabcolsep-(\tabcolsep/3)).
  5. Si usas reglas verticales, también debes distribuir el número arrayruleswidthcorrectamente. Te lo dejo como ejercicio para hacerlo.

Arriba, supuse que usará el mismo número de cada tipo de columna (ABAB, ABBA, ABBBAAetc..). En un cálculo automatizado hay que tener en cuenta que el número de tipos de columnas no necesariamente será el mismo (puede tener ABBAA, ABABA,etc..). Así que fácilmente terminarás con un paquete muy complicado. Probablemente sea mejor utilizar una calculadora o lápiz y papel para fijar el ancho de la columna. Evidentemente es mucho más rápido que programarlo en LaTeX.

¡NÓTESE BIEN! Hago hincapié en eso tabularxy tabularyya hago todos los cálculos por ti. Sin embargo, eche un vistazo a la sección 4.3 del tabularxmanual.

A continuación adjunto el código para una tabla con seis columnas:

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{array, booktabs, ragged2e}

\newcolumntype{A}{>{\RaggedRight\arraybackslash}p{\dimexpr(1\textwidth)*25/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\newcolumntype{B}{>{\Centering\arraybackslash}p{\dimexpr(1\textwidth)*75/100/3-(2\tabcolsep-(\tabcolsep/3))\relax}}
\usepackage{showframe}

\renewcommand*\ShowFrameColor{\color{red}}
\renewcommand*\ShowFrameLinethickness{.4pt}

\setlength{\tabcolsep}{2pt}

\begin{document}
{\centering
\begin{tabular}{@{}ABABBA@{}}

\toprule
A   &    B  &   A   &   B &   A   &   B\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text  & Wide centered column, which has lots of text & Short left alig\-ned column  \\
\bottomrule

\end{tabular}%
}
\end{document}

Código de ejemplo recomendado

\documentclass{article}
\usepackage{booktabs, ragged2e}
\usepackage{tabularx} 
\newcolumntype{D}{>{\small\RaggedRight\arraybackslash\hsize=0.4\hsize}X}
\newcolumntype{E}{>{\small\Centering\arraybackslash\hsize=1.6\hsize}X}
\setlength{\tabcolsep}{1.5pt}

\begin{document}

\noindent\begin{tabularx}{\linewidth}{@{}DEDEED@{}}
\toprule
D   &    E  &   D   &   E  &   E   &   D\\
\midrule
Short left alig\-ned column & Wide centered column, which has lots of text & Short left alig\-ned column & Wide centered column, which has lots of text  & Wide centered column, which has lots of text & Short left alig\-ned column  \\
\bottomrule
\end{tabularx}
\end{document}

Respuesta3

Según tengo entendido la pregunta, las tablas deben tener un ancho igual al ancho del texto. Entonces no veo ninguna ventaja (¿tal vez debido a mis vacaciones?) ¿Por qué?nopara usar tabularxcomo sugerí en mi comentario a continuación:

\documentclass{article} 
\usepackage{tabularx} 

\begin{document}
    \begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{2}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} } 
    \hline 
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
    & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\ 
    \hline 
\end{tabularx}
\caption{Four column}
    \end{table}
    \begin{table}[ht]
\begin{tabularx}{\linewidth}{|*{3}{>{\hsize=0.4\hsize}X| >{\hsize=1.6\hsize}X|} }
    \hline 
xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
    & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx 
        & xxx xxx & xxx xxx xxx xxx xxx xxx xxx xxx\\
    \hline 
\end{tabularx}
\caption{Sixt column}
    \end{table}
\end{document}

ingrese la descripción de la imagen aquí

(las líneas rojas indican los bordes del texto)

información relacionada