在表格中使用多行和多列时如何避免水平线和垂直线断裂

在表格中使用多行和多列时如何避免水平线和垂直线断裂

我有一张表格需要放在论文中。水平线和垂直线是虚线,但我的主管要求我使用闭合线。我无法修复它。

\usepackage{tabularx}

  \begin{table}[h]
  \centering
  \caption{my table with broken lines}
  \resizebox{\textwidth}{!}{%
\begin{tabular}{@{}|c|c|c|c|c|c|@{}}
\toprule
\multirow{3}{*}{A}             & \multirow{3}{*}{B}                 & \multicolumn{4}{|c|}{M}                                                                                                               \\ \cmidrule(l){3-6} 
                                   &                                & \multicolumn{2}{|c|}{C}                                        & \multicolumn{2}{|c|}{D}                                          \\ \cmidrule(l){3-6} 
                                   &                                & \multicolumn{1}{|c|}{e}            & \multicolumn{1}{|c|}{f} & \multicolumn{1}{|c|}{e}            & \multicolumn{1}{|c|}{f} \\ \midrule
\multicolumn{1}{|c|}{1}  & \multicolumn{1}{|c|}{a}      & \multicolumn{1}{|c|}{\multirow{4}{*}{100}} & \multicolumn{1}{|c|}{91.02}    & \multicolumn{1}{|c|}{\multirow{4}{*}{90}} & \multicolumn{1}{|c|}{209.2}    \\ \cmidrule(r){1-2} \cmidrule(lr){4-4} \cmidrule(l){6-6} 
\multicolumn{1}{|c|}{2} & \multicolumn{1}{|c|}{b}  & \multicolumn{1}{|c|}{}                   & \multicolumn{1}{|c|}{133.83}   & \multicolumn{1}{|c|}{}                   & \multicolumn{1}{|c|}{239.66}   \\ \cmidrule(r){1-2} \cmidrule(lr){4-4} \cmidrule(l){6-6} 
\multicolumn{1}{|c|}{3}    & \multicolumn{1}{|c|}{b} & \multicolumn{1}{|c|}{}                   & \multicolumn{1}{|c|}{159.73}   & \multicolumn{1}{|c|}{}                   & \multicolumn{1}{|c|}{373.47}   \\ \cmidrule(r){1-2} \cmidrule(lr){4-4} \cmidrule(l){6-6} 
4                              & \multicolumn{1}{|c|}{c}  & \multicolumn{1}{c|}{}                   & \multicolumn{1}{|c|}{144.1}    & \multicolumn{1}{|c|}{}                   & 317.01                        \\ \bottomrule
\end{tabular}
}
  \label{tbl:lbl1}
\end{table}

它看起来像这样。在此处输入图片描述

答案1

像这样?

在此处输入图片描述

\documentclass{article}
\usepackage{makecell, multirow}

\begin{document}
  \begin{table}[h]
  \centering
  \setcellgapes{3pt}
  \makegapedcells
\caption{my table with broken lines}
  \label{tbl:lbl1}
\begin{tabular}{|*{6}{c|}}
    \Xhline{1pt}
\multirow{3.4}{*}{A}
    &   \multirow{3.4}{*}{B}
        &   \multicolumn{4}{c|}{M}                  \\
    \cline{3-6}
    &   &   \multicolumn{2}{c|}{C}
                &   \multicolumn{2}{c|}{D}          \\
    \cline{3-6}
    &   & e & f & e & f                             \\
    \hline
1   & a & \multirow{4.5}{*}{100}
            &  91.02    & \multirow{4.5}{*}{90}   
                                        & 209.2    \\
    \cline{1-2} \cline{4-4} \cline{6-6}
2   & b &   &  133.83   &               &  239.66   \\
    \cline{1-2} \cline{4-4} \cline{6-6}
3   & b &   & 159.73    &              & 373.47    \\
        \cline{1-2} \cline{4-4} \cline{6-6}
4   & c &   & 144.1     &              & 317.01    \\
    \Xhline{1pt}
\end{tabular}
    \end{table}
\end{document}

或者如果您喜欢表格宽度\textwidth,那么您可以使用tabularx表格环境(不推荐):

在此处输入图片描述

\documentclass{article}
\usepackage{makecell, multirow, tabularx}
\newcolumntype{C}{>{\centering\arraybackslash}X}

\begin{document}
  \begin{table}[h]
  \centering
  \setcellgapes{3pt}
  \makegapedcells
\caption{my table with broken lines}
      \label{tbl:lbl1}
\begin{tabularx}{\linewidth}{|*{6}{C|}}
    \Xhline{1pt}
\multirow{4}{*}{A}             
    &   \multirow{4}{*}{B}                 
        &   \multicolumn{4}{c|}{M}                  \\
    \cline{3-6}
    &   &   \multicolumn{2}{c|}{C} 
                &   \multicolumn{2}{c|}{D}          \\ 
    \cline{3-6}
    &   & e & f & e & f                             \\
    \hline
1   & a & \multirow{5.5}{=}{\centering    100}
            &  91.02    & \multirow{5.5}{=}{\centering 90}   
                            & 209.2    \\
    \cline{1-2} \cline{4-4} \cline{6-6}
2   & b &   &  133.83   &   &  239.66   \\
    \cline{1-2} \cline{4-4} \cline{6-6}
3   & b &   & 159.73    &   & 373.47    \\
        \cline{1-2} \cline{4-4} \cline{6-6}
4   & c &   & 144.1     &   & 317.01    \\
    \Xhline{1pt}
\end{tabularx}
    \end{table}
\end{document}

附录: 两年后...... :-) 我会考虑使用带有库(加载包tabularray)的包(版本 2022C),这样可以编写更短的表代码,并使用库在小数点处对齐的数字:siunitxsiunutx

\documentclass{article}
\usepackage[skip=1ex]{caption}
\usepackage{tabularray}
\UseTblrLibrary{siunitx}

\begin{document}
  \begin{table}[h]
\caption{my table with broken lines}
\label{tbl:lbl1}
    \begin{tblr}{hline{1,Z} = 1pt, hline{4} = 0.8pt, hline{2,3,5-Y}={solid},
                 vlines,
                 colspec = {*{2}{X[c]} *{4}{X[c, si={table-format=3.2}]}},
                 row{1-3} = {mode=text, guard}
                 }
\SetCell[r=3]{c}    A
    &   \SetCell[r=3]{c}    B
        &   \SetCell[c=4]{c}    M                
            &   &   &                       \\
    &   &   \SetCell[c=2]{c}    C  
            &   &   \SetCell[c=2]{c}    D
                    &                       \\
    \cline{3-6}
    &   & e & f & e & f                     \\
1   & a &   \SetCell[r=4]{c, guard}    100 
            &   91.02    
                &   \SetCell[r=4]{c, guard}    100 
                    & 209.2                 \\

2   & b &   &   133.83   
                &   &  239.66               \\
3   & b &   &   159.73    
                &   & 373.47                \\
4   & c &   &   144.1     
                &   & 317.01                \\
    \end{tblr}
    \end{table}
\end{document}

在此处输入图片描述

答案2

这里有一种使用 来构建该表格的方法{NiceTabular}nicematrix尽管本着 的精神进行设计booktabs,没有任何垂直规则,会是一种更好的设计)。

在 中{NiceTabular},您可以使用命令 水平和垂直合并单元格\Block。对于行,您可以指定逻辑行数(而不是像 那样的物理行数\multicolumn)。

使用键hvlines,绘制所有规则,但块(由 构造\Block)除外。

\documentclass{article}
\usepackage[skip=1ex]{caption}
\usepackage{nicematrix}
\usepackage{siunitx}

\begin{document}
\begin{table}[h]
\caption{my table with broken lines}
\label{tbl:lbl1}
\centering
\begin{NiceTabular}[hvlines, columns-width=auto, cell-space-limits=2pt]
  {cccS[table-format=3.2]cS[table-format=3.2]}
\Block{3-1}{A} &   \Block{3-1}{B} &   \Block{1-4}{M} \\
 & & \Block{1-2}{C} & & \Block{1-2}{D} \\
 & & e & {f} & e & {f} \\
1 & a & \Block{4-1}{100} &   91.02 & \Block{4-1}{100} & 209.2 \\
2 & b & & 133.83 & & 239.66 \\
3 & b & & 159.73 & & 373.47 \\
4 & c & &  144.1 & & 317.01 \\
\end{NiceTabular}
\end{table}
\end{document}

您需要多次编译(因为nicematrix在后台使用 PGF/Tikz 节点)。

上述代码的输出

相关内容