Почему третий столбец такой широкий?

Почему третий столбец такой широкий?
\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}

введите описание изображения здесь

Как видите, в первой таблице второй и третий столбцы имеют одинаковую ширину, но первый более узкий, во второй таблице все столбцы имеют одинаковую ширину.

Columns c, lи rимеет ширину самой широкой ширины содержимого ячеек в столбце. Напротив, в tabularxвы должны прописать ширину таблицы и по крайней мере одна ширина столбца в таблице должна быть рассчитана LaTeX. Эта функциональность имеет столбцы Xod столбцов, полученные из нее (для центрирования, выравнивания содержимого ячеек влево или вправо). Если это не включено, обычно \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 не обновил свой репозиторий пакетов. Надеюсь, это будет сделано в ближайших функциях. До тех пор вы можете использовать "классический" подход с использованием arrayи makecellпакетов:

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

Вы спрашивали,

Но почему третий столбец такой широкий?

Сначала немного терминологии:

  • Общая ширина столбца типа l, c, или rпредставляет собой сумму (a) «естественной» ширины самой широкой ячейки в столбце и (b) 2\tabcolsep(или 2\arraycolsepесли arrayиспользуется среда). Параметры \tabcolsepи \arraycolsepопределяют величину пробельных отступов, которые LaTeX вставляет по краям столбца, в зависимости от того, используется ли среда tabular-like или .array

  • Общая ширина многоколоночного пространства tabularили arrayсреды по определению определяется как сумма общей ширины отдельных колонок плюс объединенная ширина любых вертикальных линий (если они есть).

Ваши tabularсреды также содержат следующую запись из трех столбцов:

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

Как вы "обнаружили", этот элемент определяет общую или итоговую ширину среды tabular. Поскольку его ширина превышает сумму ширин трех отдельных столбцов, что-то должно уступить. Решение, которое выбирает LaTeX, заключается в выделении избыточной ширины последнему столбцу. Хотя этот выбор может показаться произвольным, любое другое решение — например, выделение избыточной ширины равными частями каждому из трех столбцов — было бы столь же произвольным.

Я полагаю, что вы хотите, чтобы ширина столбцов 2 и 3 была одинаковой. Два варианта позволяют достичь вашей цели: (a) увеличить значение \tabcolsep(или \arraycolsep, если arrayиспользуется среда), и/или (b) увеличить ширину столбцов сверх их "естественной" ширины. Обе возможности проиллюстрированы на следующем снимке экрана, который содержит три строки.

  • Верхний ряд иллюстрирует вашу первоначальную настройку. (Чтобы уменьшить беспорядок в коде и избавиться от множества $символов, я перешел с tabularна arrayокружения). Очевидно, что столбец 3 намного шире столбца 2.

  • Средняя строка иллюстрирует эффект увеличения значения \arraycolsepпри сохранении базового cтипа столбца. Добавление 5pt к значению по умолчанию \arraycolsep(которое также равно 5pt) решает задачу. (Отступление: этот подход «работает», поскольку естественная ширина столбцов 2 и 3 определяется терминами \frac, которые, как оказалось, имеют одинаковую ширину.)

  • Нижняя строка иллюстрирует эффект установки фиксированной (пригодной) ширины 14pt для столбцов 2 и 3 (используя 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}

Связанный контент