
\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. Эта функциональность имеет столбцы X
od столбцов, полученные из нее (для центрирования, выравнивания содержимого ячеек влево или вправо). Если это не включено, обычно \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}