使用 \multicolumn 制作表格

使用 \multicolumn 制作表格

我使用 制作了下表\multicolumn。一切看起来都很好。不幸的是,当我用一些较长的文本替换 A、B 或 C 时,下面三列之间的间距不相等。有人能解释一下为什么吗?

\begin{table}[h!]
  \centering
    \begin{tabular}{|ccc|ccc|ccc|c|}
    \toprule
\multicolumn{3}{|c}{Longer text} & \multicolumn{3}{|c}{B} & \multicolumn{3}{|c}{C} &\multicolumn{1}{|c|}{D} \\
    \midrule 
    a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{4}\\
     a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
\cline{1-9}
    \multicolumn{3}{|c|}{A} & \multicolumn{3}{c|}{B} & \multicolumn{3}{c|}{C} & \multicolumn{1}{c|}{} \\
\cline{1-9}
     a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
     a & b & c & a & b & c & a & b & c & \multicolumn{1}{c|}{} \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \multicolumn{1}{c|}{}\\
    \bottomrule
    \end{tabular}
\end{table}

答案1

一些建议:删除垂直线并使用C{0.3cm}等列类型与重复代码结合*{3}C{},以简化此类列兽的使用:

\documentclass{article}
\usepackage{array}

\usepackage{booktabs}

\newcolumntype{C}[1]{>{\centering}p{#1}}
\newlength{\stdcolumnwidth}
\setlength{\stdcolumnwidth}{0.3cm}

\begin{document}


\begin{table}[h!]
  \centering
    \begin{tabular}{*{3}{C{\stdcolumnwidth}}*{3}{C{\stdcolumnwidth}}*{3}{C{\stdcolumnwidth}}c}
    \toprule
    \multicolumn{3}{c}{Longer text} & \multicolumn{3}{c}{B} & \multicolumn{3}{c}{C} &D \\
    \midrule 
    a & b & c & a & b & c & a & b & c & \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & 4\\
    a & b & c & a & b & c & a & b & c & \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 & \\
    \midrule
    \multicolumn{3}{c}{A} & \multicolumn{3}{c}{B} & \multicolumn{3}{c}{C} &  \\
    \midrule
    a & b & c & a & b & c & a & b & c &  \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 &  \\
    a & b & c & a & b & c & a & b & c &  \\
    1 & 2 & 3 & 1 & 2 & 3 & 1 & 2 & 3 &  \\
    \bottomrule
    \end{tabular}
\end{table}

\end{document}

enter image description here

答案2

当单元格中的文本宽度multicolumn大于所属列的最长文本的总和时,就会出现问题(见下图)。在这种情况下,前两列具有自然宽度,但第三列将其宽度调整为multicolum单元格请求的宽度。

这个问题可以用不同的方法解决,其中以下两种方法相对简单,但都需要手动调整列宽。在这两个表中,列都被分成几组(正如 Christian Hupfer 在他的回答中所建议的那样)。这样你就可以在列中设置列宽,这就是问题所在。建议的解决方案是:

  • 你调整出现问题的组中列的宽度,以确保所有所属列的宽度相等

  • 通过将单元格中的文本分成multicolumn更多行使其更窄,以便能够适合multicolum单元格的可用宽度。

  • 当然,上述两种方法可以结合起来,寻找一种折衷方案,让表格看起来更好

该问题和前两个提到的解决方案说明了下面的 MWE:

\documentclass{article}
    \usepackage{array,booktabs,makecell}
    \usepackage{stackengine}
\renewcommand\theadset{\normalsize\renewcommand\arraystretch{.85}}
\newcolumntype{C}[1]{>{\centering\arraybackslash}p{#1}}

    \begin{document}
    \centering
demonstrate the problem\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{4mm}|}*{3}{C{4mm}|}c|}
    \toprule
\multicolumn{3}{|c|}{Longer text}
            &   \multicolumn{3}{c|}{BBBB BBB BB BBBBB}
                            &   \multicolumn{3}{c|}{C}
                                            & D   \\
    \midrule
a & b & c   & a & b & c     & a & b & c     &     \\
1 & 2 & 3   & 1 & 2 & 3     & 1 & 2 & 3     & 4   \\
    \bottomrule
\end{tabular}

\medskip
first possible solution\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{10mm}|}*{3}{C{4mm}|}c|}
    \toprule
\multicolumn{3}{|c|}{Longer text}
            & \multicolumn{3}{c|}{BBBB BBB BB BBBBB}
                            & \multicolumn{3}{c|}{C}
                                            & D   \\
    \midrule
a & b & c   & a & b & c     & a & b & c     &     \\
1 & 2 & 3   & 1 & 2 & 3     & 1 & 2 & 3     & 4   \\
    \bottomrule
\end{tabular}

\medskip
second possible solution\\
\begin{tabular}{|*{3}{C{4mm}|}*{3}{C{4mm}|}*{3}{C{4mm}|}c|}
    \toprule
\multicolumn{3}{|c|}{Longer text}
            & \multicolumn{3}{c|}{\thead[b]{BBBB BBB\\ BB BBBBB}}
                            & \multicolumn{3}{c|}{C}
                                            & D   \\
    \midrule
a & b & c   & a & b & c     & a & b & c     &     \\
1 & 2 & 3   & 1 & 2 & 3     & 1 & 2 & 3     & 4   \\
    \bottomrule
\end{tabular}
    \end{document}

makecell为第二个解决方案添加了包,其中使用了thead该包中的宏。为了说明,我仅考虑了表中的前三行。

enter image description here

相关内容