多列表格的格式化问题

多列表格的格式化问题

我在使用多列将文本居中放置在表格中时遇到了问题。这是我创建的表格:

\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

如果希望FFNNCNN标题字符串分别位于第 2/3 列和第 4/5 列之间,则四个数据列需要具有相同的宽度。实现此目的的一种方法是借助包w提供的列类型array

您可能还想重新思考为什么有必要将FFNNCNN字符串置于分隔第 2/3 列和第 4/5 列的垂直线上。如果您删除所有垂直线并使用较少但间距适当的水平线,则实际上没有必要关注不等的列宽。

以下屏幕截图中的第一个表格复制了 OP 的屏幕截图。第二个表格使用列类型来使和标题w居中;请注意,尽管这些标题现在位于列对的中央,但“外观”仍然不平衡,因为子标题中的字符串——“样本内”和“样本外”——宽度相差很大。第三个表格取消了垂直线,从而消除了对等宽列的需求。FFNNCNN

在此处输入图片描述

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

第二段代码的输出

相关内容