¿Por qué la tercera columna es tan ancha?

¿Por qué la tercera columna es tan ancha?
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabularx}
\usepackage{caption}



\begin{document}


\begin{center}
\begin{tabularx}{100pt}{c|c|c|}
\multicolumn{1}{c}{ } &\multicolumn{1}{c}{$r$} &\multicolumn{1}{c}{$b$} \\ \cline{2-3}
$r$ & $\frac{4}{9}$ & $\frac{2}{9}$  \\ \cline{2-3}
$b$ & $\frac{2}{9}$ & $\frac{1}{9}$   \\ \cline{2-3} \multicolumn{3}{c}{2 red 1 blue}
\end{tabularx}\hskip 1.7cm 
\begin{tabularx}{100pt}{c|c|c|}
\multicolumn{1}{c}{ } &\multicolumn{1}{c}{$r$} &\multicolumn{1}{c}{$b$} \\ \cline{2-3}
$r$ & $\frac{1}{9}$ & $\frac{2}{9}$  \\ \cline{2-3}
$b$ & $\frac{2}{9}$ & $\frac{4}{9}$   \\ \cline{2-3} \multicolumn{3}{c}{2 blue 1 red}
\end{tabularx}
\end{center}

\end{document}

Mi intención es poner "2 rojos 1 azul" debajo del subgráfico y en el medio del subgráfico. Pero ¿por qué la tercera columna es tan ancha?

Respuesta1

Como dije en el comentario, al menos una columna en tabularxlas tablas tenía que ser de Xtipo. Esto significa que, en su caso, la tabla debería ser, por ejemplo:

\documentclass{article}
\usepackage{tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}
\NewExpandableDocumentCommand\mcc{O{1}m}%
                                 {\multicolumn{#1}{c}{#2}}

\begin{document}
    \begin{center}
\begin{tabularx}{100pt}{c | C|C|}
\mcc{}  & \mcc{$r$}     & \mcc{$b$}     \\
    \cline{2-3}
$r$     & $\frac{4}{9}$ & $\frac{2}{9}$ \\
    \cline{2-3}
$b$     & $\frac{2}{9}$ & $\frac{1}{9}$ \\
    \cline{2-3}
\mcc[3]{2 red 1 blue}
\end{tabularx}
    \hskip 21mm
\begin{tabularx}{100pt}{C | C|C|}
\mcc{}  & \mcc{$r$}     & \mcc{$b$}     \\
    \cline{2-3}
$r$     & $\frac{4}{9}$ & $\frac{2}{9}$ \\
    \cline{2-3}
$b$     & $\frac{2}{9}$ & $\frac{1}{9}$ \\
    \cline{2-3}
\mcc[3]{2 red 1 blue}
\end{tabularx}
    \end{center}
\end{document}

ingrese la descripción de la imagen aquí

Como puede ver, en la primera tabla la segunda y tercera columna tienen el mismo ancho pero la primera es más estrecha, en la segunda tabla todas las columnas tienen el mismo ancho.

Columns cy tiene el ancho más ancho del contenido de las celdas en la columna l. rPor el contrario, tabularxdebe prescribir el ancho de la tabla y LaTeX debe calcular al menos el ancho de una columna en la tabla. Esta funcionalidad tiene columnas Xo columnas derivadas de ella (para centrar, alinear a la izquierda o a la derecha el contenido de la celda). Si esto no está habilitado, generalmente \hlinesobresale \clinede la mesa (así que tienes suerte de que esto no suceda en tus casos).

Sin embargo, cuando tiene \multicolumnceldas cuyo contenido es más ancho que la suma de las columnas de ancho natural, el ancho de la última columna aumenta en la cantidad dictada por el ancho de la \multicolumncelda. En consecuencia, debería preocuparse de que eso no suceda (defina un ancho mayor de las columnas distribuidas).

En mi opinión, sus tablas serán mejor si usa tabularrayel paquete y centra la celda ˙\multicolum` debajo de las dos últimas columnas:

\documentclass{article}
\usepackage{tabularray}

\begin{document}
    \begin{center}
\begin{tblr}{hline{2-Y}={2-Z}{solid},
             vline{2-Z}={2-Y}{solid}, 
             colspec={c *{2}{Q[c,wd=2em,mode=math]}},  
             row{Z} = {mode=text},
             rowsep=3pt
             }
    &       r       &   b           \\ 
r   & \frac{4}{9}   & \frac{2}{9}   \\ 
b   & \frac{2}{9}   & \frac{1}{9}   \\ 
    & \SetCell[c=2]{c}    2 red 1 blue 
\end{tblr}
    \hskip 21mm
\begin{tblr}{hline{2-Y}={2-Z}{solid},
             vline{2-Z}={2-Y}{solid},
             colspec={c *{2}{Q[c,wd=2em,mode=math]}},
             row{Z} = {mode=text},
             rowsep=3pt
             }
    &       r       &   b           \\
r   & \frac{4}{9}   & \frac{2}{9}   \\
b   & \frac{2}{9}   & \frac{1}{9}   \\
    & \SetCell[c=2]{c}  2 red 1 blue
\end{tblr}
    \end{center}
\end{document}

ingrese la descripción de la imagen aquí

Apéndice: Parece que hasta ahora Overleaf todavía no actualiza su repositorio de paquetes. Con suerte, esto funcionará en funciones cercanas. Hasta entonces puede utilizar el enfoque "clásico" mediante el uso de arrayy makecellpaquetes:

\documentclass{article}
\usepackage{array, makecell}
\NewExpandableDocumentCommand\mcc{O{1}m}%
                                 {\multicolumn{#1}{c}{#2}}

\begin{document}
    \begin{center}
    \setcellgapes{3pt}
    \makegapedcells
\begin{tabular}{c | *{2}{>{$}w{c}{2em}<{$} |}}
\mcc{}  & \mcc{$r$}     & \mcc{$b$}     \\
    \cline{2-3}
r       & \frac{4}{9}   & \frac{2}{9}   \\
    \cline{2-3}
b       & \frac{2}{9}   & \frac{1}{9}   \\
    \cline{2-3}
\mcc{}  & \mcc[2]{2 red 1 blue}
\end{tabular}
    \hskip 21mm
\begin{tabular}{c | *{2}{>{$}w{c}{2em}<{$} |}}
\mcc{}  & \mcc{$r$}     & \mcc{$b$}     \\
    \cline{2-3}
r       & \frac{4}{9}   & \frac{2}{9}   \\
    \cline{2-3}
b       & \frac{2}{9}   & \frac{1}{9}   \\
    \cline{2-3}
\mcc[3]{2 red 1 blue}
\end{tabular}
    \end{center}
\end{document}

El resultado de la compilación es muy similar al del uso del tabularraypaquete.

ingrese la descripción de la imagen aquí

Ambas tablas, a efectos de comparación de estilos, difieren ligeramente. En la primera, el texto "2 rojo 1 azul" está debajo de la segunda y tercera columnas, y en la segunda, está debajo de las tres columnas.

Respuesta2

Un comentario inicial: dado que ninguna de las columnas de sus tablas de muestra parece requerir un salto de línea automático dentro de las celdas, no creo que sea una buena idea utilizar un tabularxentorno.

Tu preguntaste,

Pero ¿por qué la tercera columna es tan ancha?

Primero algo de terminología:

  • El ancho total de una columna de tipo l, co res la suma de (a) el ancho "natural" de la celda más ancha de la columna y (b) 2\tabcolsep(o si se está utilizando 2\arraycolsepun entorno). arrayLos parámetros \tabcolsepy \arraycolsepdeterminan la cantidad de relleno de espacios en blanco que LaTeX inserta en los bordes de la columna, dependiendo de si se está utilizando un entorno tabularsimilar o uno .array

  • tabularEl ancho total de un entorno o varias columnas arrayse proporciona, casi por definición, como la suma de los anchos totales de las columnas individuales, más el ancho combinado de cualquier regla vertical (si está presente).

Sus tabularentornos también contienen la siguiente entrada de 3 columnas:

\multicolumn{3}{c}{2 red 1 blue}

Como habrás "descubierto", este elemento determina el ancho global o total del tabularentorno. Dado que su ancho excede la suma de los anchos de las tres columnas individuales, algo tiene que ceder. La solución que elige LaTeX es asignar el ancho sobrante a la columna final. Si bien esta elección puede parecer arbitraria, cualquier otra solución (como asignar el ancho sobrante en partes iguales a cada una de las 3 columnas) sería igualmente arbitraria.

Supongo que desea que los anchos de las columnas 2 y 3 sean iguales. Dos opciones le permiten lograr su objetivo: (a) aumentar el valor de \tabcolsep(o \arraycolsep, si arrayse está utilizando un entorno) y/o (b) aumentar los anchos de las columnas más allá de sus anchos "naturales". Ambas posibilidades se ilustran en la siguiente captura de pantalla, que contiene tres filas.

  • La fila superior ilustra su configuración inicial. (Para reducir el desorden de códigos y deshacerme de muchísimos $símbolos, cambié de tabularentornos array). Claramente, la columna 3 es mucho más ancha que la columna 2.

  • La fila del medio ilustra el efecto de aumentar el valor de \arraycolsepmientras se mantiene el tipo de columna básico c. Agregar 5 puntos al valor predeterminado de \arraycolsep(que también es 5 puntos) hace el trabajo. (Aparte: este enfoque "funciona" porque los anchos naturales de las columnas 2 y 3 están determinados por los \fractérminos, que resultan tener anchos iguales).

  • La fila inferior ilustra el efecto de establecer un ancho fijo (utilizable) de 14 puntos para las columnas 2 y 3 (empleando el wtipo de columna proporcionado por el arraypaquete), mientras se usa el valor predeterminado de \arraycolsep. Siempre que los anchos de las columnas wc(donde csignifica "centro") se elijan "lo suficientemente grandes" (aquí, 14 puntos parece correcto), terminará con una tabla cuyas columnas segunda y tercera son igualmente anchas.

¿Es siempre una solución mejor que la otra? En general, no. Sin embargo, para el caso específico que nos ocupa, observe que el primer método de solución también termina aumentando el ancho total de la columna 1, mientras que este no es el caso para el segundo. Si para usted es importante la máxima compacidad de la primera columna, es posible que prefiera emplear el segundo método de solución.

ingrese la descripción de la imagen aquí

\documentclass{article}
\usepackage{array} % for 'w' column type and \extrarowheight macro
\setlength\extrarowheight{2pt}
\newcommand\mc[1]{\multicolumn{1}{c}{#1}} % handy shortcut macro

\begin{document}

Initial setup
\[
\begin{array}{ c | c | c | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{4}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{1}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 red 1 blue}
\end{array}
\hskip 1.7cm 
\begin{array}{ c | c | c | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{1}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{4}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 blue 1 red}
\end{array}
\]

\bigskip
Solution 1: Increase \texttt{\string\arraycolsep} or \texttt{\string\tabcolsep}
\[
\addtolength{\arraycolsep}{5pt} % default value: 5pt
\begin{array}{ c | c | c | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{4}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{1}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 red 1 blue}
\end{array}
\hskip 1.7cm 
\begin{array}{ c | c | c | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{1}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{4}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 blue 1 red}
\end{array}
\]

\bigskip
Solution 2: Increase usable column widths
\[
\begin{array}{ c |wc{14pt} | wc{14pt} | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{4}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{1}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 red 1 blue}
\end{array}
\hskip 1.7cm 
\begin{array}{ c |wc{14pt} | wc{14pt} | }
\mc{} & \mc{r} & \mc{b} \\ \cline{2-3}
r & \frac{1}{9} & \frac{2}{9}   \\ \cline{2-3}
b & \frac{2}{9} & \frac{4}{9}   \\ \cline{2-3} 
\multicolumn{3}{>{$}c<{$}}{2 blue 1 red}
\end{array}
\]
\end{document}

información relacionada