为什么第三列这么宽?

为什么第三列这么宽?
\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}

我的意图是将“2 红 1 蓝”放在子图下方和子图中间。但为什么第三列这么宽?

答案1

正如我在评论中所说,表中至少有一列tabularx必须是X类型。这意味着,在您的情况下,表应该是:

\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}

在此处输入图片描述

如您所见,第一个表中的第二列和第三列宽度相等但第一列较窄,而第二​​个表中所有列的宽度均相等。

cl并且r具有列中单元格内容的最宽宽度。相反,tabularx您必须规定表格宽度,并且表格中至少一列的宽度必须由 LaTeX 计算。此功能具有 X从其派生的列(用于居中、左对齐或右对齐单元格内容)。如果未启用此功能,通常会\hline\cline突出表格(因此您很幸运,这种情况不会发生在您的案例中)。

但是,当您的\multicolumn单元格内容比自然宽度跨列的总和更宽时,最后一列的宽度将增加,增加量由\multicolumn单元格宽度决定。因此,您应该注意不要发生这种情况(定义更大的跨列宽度)。

tabularray在我看来,如果您使用包并在最后两列下方居中 ˙\multicolum` 单元格,您的表格会更漂亮:

\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}

在此处输入图片描述

附录: 到目前为止,Overleaf 似乎仍未更新其软件包存储库。希望在不久的将来能够实现这一点。在此之前,您可以使用arraymakecell软件包的“经典”方法:

\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}

编译结果与使用该tabularray包的结果非常相似。

在此处输入图片描述

为了便于比较样式,两个表格略有不同。第一个表格中,文本“2 red 1 blue”位于第二列和第三列下方,而第二个表格中,文本位于所有三列下方。

答案2

前面的评论:由于示例表中的任何列似乎都不需要在单元格内自动换行,因此我认为使用环境不是一个好主意tabularx

你问,

但是为什么第三列这么宽?

首先是一些术语:

  • lc或类型的列的总宽度r是 (a) 列中最宽单元格的“自然”宽度和 (b) 2\tabcolsep(或2\arraycolsep如果array正在使用环境)的总和。参数\tabcolsep\arraycolsep确定 LaTeX 在列边缘插入的空白填充量,具体取决于使用的是 -liketabular还是array环境。

  • 多列tabulararray环境的总宽度几乎按照定义定义为各个总列宽的总和加上任何垂直规则(如果存在)的组合宽度。

您的tabular环境还包含以下 3 列条目:

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

正如您“发现”的那样,此项决定了环境的整体或总宽度tabular。由于其宽度超过了三个单独列宽度的总和,因此必须做出一些让步。LaTeX 选择的解决方案是将超出的宽度分配给最后一列。虽然这种选择似乎很随意,但任何其他解决方案(例如将超出的宽度等分分配给 3 个列中的每一列)也同样随意。

我认为您希望第 2 列和第 3 列的宽度相等。有两种选择可以实现您的目标:(a) 增加 的值\tabcolsep(或\arraycolsep,如果array正在使用环境),和/或 (b) 将列宽增加到超出其“自然”宽度。以下屏幕截图显示了这两种可能性,其中包含三行。

  • 顶行显示了您的初始设置。(为了减少代码混乱并摆脱大量$符号,我已从环境切换tabulararray环境)。显然,第 3 列比第 2 列宽得多。

  • 中间一行说明了增加 的值\arraycolsep,同时保持基本c列类型不变的效果。将 的默认值\arraycolsep(也恰好是 5pt)加上 5pt 即可完成任务。(附言:这种方法“有效”,因为第 2 列和第 3 列的自然宽度由 项决定\frac,而 项恰好具有相同的宽度。)

  • 下面一行说明了为第 2 列和第 3 列设置固定(可用)宽度 14pt(通过使用包w提供的列类型array)的效果,同时使用默认值\arraycolsep。只要wc(其中c代表“中心”)列的宽度选择得“足够大”——这里,14pt 似乎合适——您最终将得到一个第 2 列和第 3 列宽度相等的表格。

一种解决方案是否总是比另一种更好?一般来说,不是。不过,对于手头的具体情况,请注意,第一种方法最终也会增加第 1 列的总宽度,而第二种方法则不会。如果第一列的最大紧凑性对您来说很重要,您可能更愿意采用第二种解决方法。

在此处输入图片描述

\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}

相关内容