我在使用多列将文本居中放置在表格中时遇到了问题。这是我创建的表格:
\begin{table}[H]\centering
\setlength\extrarowheight{3pt}
\begin{tabular}{|c|c|c|c|c|}
\hline
\multirow{2}{*}{Metric}&
\multicolumn{2}{c}{FFNN}\vline&
\multicolumn{2}{c}{CNN}\vline\\
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\\hline
RMSE & 1 & 2 & 3 & 4\\\hline MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\\hline $\text{R}^2$ & 1 & 2 & 3 & 4\\\hline
\end{tabular}
\end{table}
这是我编译后得到的结果:
问题是,两个列标题“FFNN”和“CNN”相对于下面的“样本内”和“样本外”列未居中。有没有办法在不改变表格布局的情况下将它们居中?
答案1
如果希望FFNN
和CNN
标题字符串分别位于第 2/3 列和第 4/5 列之间,则四个数据列需要具有相同的宽度。实现此目的的一种方法是借助包w
提供的列类型array
。
您可能还想重新思考为什么有必要将FFNN
和CNN
字符串置于分隔第 2/3 列和第 4/5 列的垂直线上。如果您删除所有垂直线并使用较少但间距适当的水平线,则实际上没有必要关注不等的列宽。
以下屏幕截图中的第一个表格复制了 OP 的屏幕截图。第二个表格使用列类型来使和标题w
居中;请注意,尽管这些标题现在位于列对的中央,但“外观”仍然不平衡,因为子标题中的字符串——“样本内”和“样本外”——宽度相差很大。第三个表格取消了垂直线,从而消除了对等宽列的需求。FFNN
CNN
\documentclass{article}
\usepackage{amsmath,array,multirow,booktabs}
\newlength\mylen
\settowidth\mylen{Out-of-Sample}
\begin{document}
\begin{table}[ht]
\centering
\setlength\extrarowheight{3pt}
\begin{tabular}{|c|*{4}{c|}}
\hline
\multirow{2}{*}{Metric}&
\multicolumn{2}{c}{FFNN}\vline&
\multicolumn{2}{c}{CNN}\vline\\
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\\hline
RMSE & 1 & 2 & 3 & 4\\\hline MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\\hline R\textsuperscript{2} & 1 & 2 & 3 & 4\\\hline
\end{tabular}
\end{table}
\begin{table}[h]
\centering
\setlength\extrarowheight{3pt}
\begin{tabular}{|c|*{4}{wc{\mylen}|}}
\hline
\multirow{2}{*}{Metric}&
\multicolumn{2}{c}{FFNN}\vline&
\multicolumn{2}{c}{CNN}\vline\\
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\\hline
RMSE & 1 & 2 & 3 & 4\\\hline MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\\hline R\textsuperscript{2} & 1 & 2 & 3 & 4\\\hline
\end{tabular}
\end{table}
\begin{table}[h]
\centering
\begin{tabular}{@{} l cccc @{}}
\toprule
Metric & \multicolumn{2}{c}{FFNN} & \multicolumn{2}{c@{}}{CNN} \\
\cmidrule(lr){2-3} \cmidrule(l){4-5}
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\
\midrule
RMSE & 1 & 2 & 3 & 4\\
MAE & 1 & 2 & 3 & 4\\
MDA & 1 & 2 & 3 & 4\\
R\textsuperscript{2} & 1 & 2 & 3 & 4\\
\bottomrule
\end{tabular}
\end{table}
\end{document}
答案2
“FFNN”和“CNN”确实居中,问题在于“样本内”和“样本外”列的宽度。使用包\widthof
中的calc
功能,我们可以将“样本内”置于与“样本外”宽度相同的框中,从而实现正确的居中。
\documentclass{article}
\usepackage{float}
\usepackage{array}
\usepackage{multirow}
\usepackage{amsmath}
\usepackage{calc} %<--
\begin{document}
\begin{table}[H]\centering
\setlength\extrarowheight{3pt}
\begin{tabular}{|c|c|c|c|c|}
\hline
\multirow{2}{*}{Metric}&
\multicolumn{2}{c}{FFNN}\vline&
\multicolumn{2}{c}{CNN}\vline\\
&\makebox[\widthof{Out-of-Sample}][c]{In-Sample} & Out-of-Sample &\makebox[\widthof{Out-of-Sample}][c]{In-Sample} & Out-of-Sample\\\hline%<--
RMSE & 1 & 2 & 3 & 4\\\hline MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\\hline $\text{R}^2$ & 1 & 2 & 3 & 4\\\hline
\end{tabular}
\end{table}
\end{document}
答案3
使用该tabularray
包编写的两个版本的表:
\documentclass{article}
\usepackage{tabularray}
\UseTblrLibrary{booktabs}
\newlength\mycolwidth
\begin{document}
\begin{table}[ht]
\centering
\settowidth\mycolwidth{Out-of-Sample}
\begin{tblr}{hline{1,3-Z}, vlines,
colspec={c *{4}{Q[c, wd=\mycolwidth]} },
column{2-Z} = {colsep=4pt}
}
\SetCell[r=2]{c} Metric
& \SetCell[c=2]{c} FFNN
& & \SetCell[c=2]{c} CNN
& \\
& In-Sample
& Out-of-Sample
& In-Sample
& Out-of-Sample \\
RMSE & 1 & 2 & 3 & 4 \\
MAE & 1 & 2 & 3 & 4 \\
MDA & 1 & 2 & 3 & 4 \\
R\textsuperscript{2}
& 1 & 2 & 3 & 4 \\
\end{tblr}
\end{table}
\begin{table}[ht]
\centering
\settowidth\mycolwidth{Out-of-Sample}
\begin{tblr}{column{2-Z} = {colsep=3pt},
colspec={@{} l *{4}{Q[c, wd=\mycolwidth]} @{}},
}
\toprule
\SetCell[r=2]{c} Metric
& \SetCell[c=2]{c} FFNN
& & \SetCell[c=2]{c} CNN
& \\
\cmidrule[r] {2-3}
\cmidrule[l] {4-5}
& In-Sample
& Out-of-Sample
& In-Sample
& Out-of-Sample \\
\midrule
RMSE & 1 & 2 & 3 & 4 \\
MAE & 1 & 2 & 3 & 4 \\
MDA & 1 & 2 & 3 & 4 \\
R\textsuperscript{2}
& 1 & 2 & 3 & 4 \\
\bottomrule
\end{tblr}
\end{table}
\end{document}
答案4
如果您确实希望第 2 列和第 3 列具有不同的宽度(第 4 列和第 5 列同上),并且尽管存在这种差异,但FFNN
仍根据第 2 列和第 3 列之间的规则居中(第 4 列和第 5 列之间CNN
的规则同上),则可以编写一个命令\BiBlock
来自动完成这项工作。{NiceTabular}
nicematrix
\documentclass{article}
\usepackage{float}
\usepackage{nicematrix,tikz}
\ExplSyntaxOn
\NewDocumentCommand \BiBlock { m }
{
\Block{1-2}{}
\tl_gput_right:Nx \g_nicematrix_code_after_tl
{
\__willis_myblock:nnn
{ \int_use:c { c@iRow } }
{ \int_eval:n { \int_use:c { c@jCol } + 1 } }
{ #1 }
}
}
\cs_new_protected:Nn \__willis_myblock:nnn
{ \tikz \node [baseline=base] at ( #1.5 -| #2 ) { #3 } ; }
\ExplSyntaxOff
\begin{document}
\begin{table}[H]\centering
\setlength\extrarowheight{3pt}
\begin{NiceTabular}{ccccc}[vlines]
\hline
\Block{2-1}{Metric}&
\BiBlock{FFNN}& &
\BiBlock{CNN}\\
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\\hline
RMSE & 1 & 2 & 3 & 4\\\hline MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\\hline $\text{R}^2$ & 1 & 2 & 3 & 4\\\hline
\end{NiceTabular}
\end{table}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。
与的水平规则相同booktabs
。
\documentclass{article}
\usepackage{float}
\usepackage{nicematrix,tikz,booktabs}
\ExplSyntaxOn
\NewDocumentCommand \BiBlock { m }
{
\Block{1-2}{}
\tl_gput_right:Nx \g_nicematrix_code_after_tl
{
\__willis_myblock:nnn
{ \int_use:c { c@iRow } }
{ \int_eval:n { \int_use:c { c@jCol } + 1 } }
{ #1 }
}
}
\cs_new_protected:Nn \__willis_myblock:nnn
{ \tikz \node [baseline=base] at ( #1.5 -| #2 ) { #3 } ; }
\ExplSyntaxOff
\begin{document}
\begin{table}[H]\centering
\setlength\extrarowheight{3pt}
\begin{NiceTabular}{ccccc}
\toprule
\Block{2-1}{Metric}&
\BiBlock{FFNN}& &
\BiBlock{CNN}\\
\cmidrule(r){2-3}
\cmidrule(l){4-5}
& In-Sample & Out-of-Sample & In-Sample & Out-of-Sample\\
\midrule
RMSE & 1 & 2 & 3 & 4\\ MAE & 1 & 2 & 3 & 4\\\hline
MDA & 1 & 2 & 3 & 4\\ $\text{R}^2$ & 1 & 2 & 3 & 4\\
\bottomrule
\end{NiceTabular}
\end{table}
\end{document}