
\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}
Meine Absicht ist, „2 rot 1 blau“ unterhalb des Unterdiagramms und in die Mitte des Unterdiagramms zu setzen. Aber warum ist die dritte Spalte so breit?
Antwort1
tabularx
Wie ich im Kommentar sagte, muss mindestens eine Spalte in Tabellen vom X
Typ sein. Das bedeutet, dass die Tabelle in Ihrem Fall beispielsweise so aussehen sollte:
\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}
Wie Sie sehen, sind in der ersten Tabelle die zweite und dritte Spalte gleich breit, die erste ist jedoch schmäler. In der zweiten Tabelle sind alle Spalten gleich breit.
Spalten c
und haben die Breite der größten Breite des Zelleninhalts in der Spalte. Im Gegensatz dazu müssen Sie die Tabellenbreite vorgeben und mindestens eine Spaltenbreite in der Tabelle muss von LaTeX berechnet werden. Diese Funktion hat Spalten oder Spalten l
, die davon abgeleitet werden (zum Zentrieren, Links- oder Rechtsausrichten des Zelleninhalts). Wenn dies nicht aktiviert ist, ragen normalerweise oder aus der Tabelle heraus (Sie haben also Glück, dass dies in Ihrem Fall nicht passiert).r
tabularx
X
\hline
\cline
Wenn Sie jedoch Zellen haben \multicolumn
, deren Inhalt breiter ist als die Summe der natürlichen Breite der überspannten Spalten, wird die Breite der letzten Spalte um den durch die Zellenbreite vorgegebenen Betrag erhöht \multicolumn
. Daher sollten Sie darauf achten, dass dies nicht passiert (definieren Sie eine größere Breite der überspannten Spalten).
Meiner Meinung nach würden Ihre Tabellen schöner aussehen, wenn Sie tabularray
die Zelle „\multicolum“ unter den letzten beiden Spalten verpacken und zentrieren würden:
\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}
Nachtrag:
Es scheint, dass Overleaf sein Paket-Repository bisher noch nicht aktualisiert hat. Hoffentlich wird dies in naher Zukunft der Fall sein. Bis dahin können Sie den „klassischen“ Ansatz verwenden, indem Sie folgende array
Pakete verwenden 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}
Das Kompilierungsergebnis ist dem bei der Verwendung des tabularray
Pakets sehr ähnlich.
Die beiden Tabellen unterscheiden sich, um den Stilvergleich zu erleichtern, leicht. In der ersten steht der Text „2 rot 1 blau“ unter der zweiten und dritten Spalte, in der zweiten unter allen drei Spalten.
Antwort2
Eine Anmerkung vorweg: Da keine der Spalten in Ihren Beispieltabellen einen automatischen Zeilenumbruch innerhalb der Zellen zu erfordern scheint, halte ich die Verwendung einer tabularx
Umgebung für keine gute Idee.
Du hast gefragt,
Aber warum ist die dritte Spalte so breit?
Zunächst einige Begriffe:
Die Gesamtbreite einer Spalte vom Typ
l
,c
, oderr
ist die Summe aus (a) der „natürlichen“ Breite der breitesten Zelle in der Spalte und (b)2\tabcolsep
(oder2\arraycolsep
ob einearray
Umgebung verwendet wird). Die Parameter\tabcolsep
und\arraycolsep
bestimmen die Menge an Leerzeichen, die LaTeX an den Rändern der Spalte einfügt, je nachdem, ob eintabular
-ähnliches oder einearray
Umgebung verwendet wird.Die Gesamtbreite einer Mehrspaltenansicht
tabular
oderarray
Umgebung ergibt sich fast per Definition aus der Summe der Gesamtbreiten der einzelnen Spalten plus der kombinierten Breite aller vertikalen Linien (sofern vorhanden).
Ihre tabular
Umgebungen enthalten außerdem den folgenden 3-Spalten-Eintrag:
\multicolumn{3}{c}{2 red 1 blue}
Wie Sie „entdeckt“ haben, bestimmt dieses Element die Gesamtbreite der tabular
Umgebung. Da seine Breite die Summe der drei einzelnen Spaltenbreiten übersteigt, muss etwas nachgegeben werden. Die Lösung, die LaTeX wählt, besteht darin, die überschüssige Breite der letzten Spalte zuzuweisen. Diese Wahl mag zwar willkürlich erscheinen, aber jede andere Lösung – wie die Zuweisung der überschüssigen Breite zu gleichen Teilen an jede der drei Spalten – wäre ebenso willkürlich.
Ich nehme an, Sie möchten, dass die Breiten der Spalten 2 und 3 gleich sind. Sie haben zwei Möglichkeiten, Ihr Ziel zu erreichen: (a) Erhöhen Sie den Wert von \tabcolsep
(oder \arraycolsep
, wenn eine array
Umgebung verwendet wird) und/oder (b) Erhöhen Sie die Spaltenbreiten über ihre „natürliche“ Breite hinaus. Beide Möglichkeiten werden im folgenden Screenshot dargestellt, der drei Zeilen enthält.
Die oberste Zeile zeigt Ihre anfängliche Einrichtung. (Um die Code-Unordnung zu reduzieren und viele, viele Symbole loszuwerden
$
, bin ich vontabular
aufarray
Umgebungen umgestiegen.) Spalte 3 ist eindeutig viel breiter als Spalte 2.Die mittlere Zeile veranschaulicht die Wirkung einer Erhöhung des Wertes von
\arraycolsep
, während der grundlegendec
Spaltentyp beibehalten wird. Das Hinzufügen von 5pt zum Standardwert von\arraycolsep
(der zufällig auch 5pt beträgt) erledigt die Aufgabe. (Abgesehen davon: Dieser Ansatz „funktioniert“, weil die natürlichen Breiten der Spalten 2 und 3 durch die\frac
Begriffe bestimmt werden, die zufällig gleich breit sind.)Die untere Zeile veranschaulicht die Wirkung, wenn für die Spalten 2 und 3 eine feste (nutzbare) Breite von 14pt festgelegt wird (durch Verwendung des
w
Spaltentyps, der vomarray
Paket bereitgestellt wird), während der Standardwert von verwendet wird\arraycolsep
. Solange die Breiten der Spaltenwc
(wobeic
„Mitte“ steht) „groß genug“ gewählt werden – hier scheint 14pt ungefähr richtig zu sein – erhalten Sie eine Tabelle, deren 2. und 3. Spalte gleich breit sind.
Ist eine Lösung immer besser als die andere? Im Allgemeinen nicht. Beachten Sie jedoch für den konkreten Fall, dass die erste Lösungsmethode auch die Gesamtbreite der Spalte 1 vergrößert, während dies bei der zweiten nicht der Fall ist. Wenn Ihnen maximale Kompaktheit der ersten Spalte wichtig ist, sollten Sie die zweite Lösungsmethode bevorzugen.
\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}