\multicolumn 未按预期合并列

\multicolumn 未按预期合并列

我正在尝试实现这样的表格:

我需要的表格布局

以下是代码:

% \usepackage{multirow}
\begin{table}[!h]
    \begin{tabular}{|r|c|c|c|c|c|c|c|c|c|c|c|c|}
    \hline
    \multicolumn{1}{|l|}{\multirow{2}{*}{channels}} & \multicolumn{12}{c|}{Encoding format} \\ \cline{2-13} 
    \multicolumn{1}{|l|}{} & \multicolumn{12}{c|}{pixel} \\ \hline
    1 & \multicolumn{12}{c|}{grey} \\ \hline
    2 & \multicolumn{6}{c|}{grey} & \multicolumn{6}{c|}{alpha} \\ \hline
    3 & \multicolumn{4}{c|}{R} & \multicolumn{4}{c|}{G} & \multicolumn{4}{c|}{B} \\ \hline
    4 & \multicolumn{3}{c|}{R} & \multicolumn{3}{c|}{G} & \multicolumn{3}{c|}{B} & \multicolumn{3}{c|}{A} \\ \hline
    \end{tabular}
\end{table}

但是我从上面的代码中得到的表格如下所示:

在此处输入图片描述

我错过了什么?

答案1

我最近发现了一个新的软件包nicematrix,它似乎可以解决普通用户在尝试设置简单表格时遇到的大多数常见问题。摘自手册:

在 nicematrix 环境中,可以使用命令 \Block将元素放置在数组合并单元矩形的中心。

该命令\Block本身不会创建空间。该命令 \Block必须在数组最左上角的单元格中使用,并带有两个参数。

第一个参数是块的大小,语法为 ij,其中 i 是块的行数,j 是其列数。第二个参数是块的内容。

NiceTabular块的内容中,以文本模式编写。在其他环境中,它以数学模式编写

“[hvlines]”关键字进一步简化了输入。

生成的代码非常紧凑,不需要新的命令或添加的包。

\documentclass{article} 
\usepackage{nicematrix}
\begin{document} 

\NiceMatrixOptions{cell-space-top-limit = 3pt,cell-space-bottom-limit = 2pt}

\begin{NiceTabular}{r*{12}{c}}[hvlines]
\Block{2-1}{channels}&  \Block{1-12}{Encoding format} \\    
                     &  \Block{1-12}{pixel} \\
1                    &  \Block{1-12}{grey} \\   
2                    &  \Block{1-6}{grey} &&&&&&    \Block{1-6}{alpha}&&&&&\\
3                    &  \Block{1-4}{R} &&&&  \Block{1-4}{G} &&&&  \Block{1-4}{B} &&&\\
4                    &  \Block{1-3}{R}&&&\Block{1-3}{G} &&& \Block{1-3}{B} &&& \Block{1-3}{A}&&\\
\end{NiceTabular}
\end{document} 

输出3

这是我第一次尝试。我使用了文档中包含的众多示例之一作为指南。

https://ctan.org/pkg/nicematrix?lang=en

答案2

我设置块的宽度等于“通道”的宽度,两边都有通常的填充,但除以三。第一列需要三个块,其他列需要 12 个块。

需要进行一些计算来处理垂直规则,这些计算占用一些虽小但不可忽略的空间。

这个想法并不难:在每一行(第一列不在这些考虑范围内)中,我们总共需要 11 条规则,但我们必须在单元格之间平均分配空间;因此顶部单元格必须占据 12 个块并跨越 11 条规则;接下来的两个单元格必须占据 6 个块并分别跨越 5 条规则,依此类推。

\documentclass{article}
\usepackage{array}

\newlength{\blockwidth}

\begin{document}

\begin{center}
\settowidth{\blockwidth}{\hspace{\tabcolsep}channels\hspace{\tabcolsep}}
\setlength{\blockwidth}{0.3333\blockwidth}
\setlength{\tabcolsep}{0pt}
\newcommand{\mc}[3]{%
  \multicolumn{#1}{
    w{c}{\dimexpr#1\blockwidth-#2\arrayrulewidth}
    |
   }{#3}%
}

\begin{tabular}{ | >{\vphantom{$\Big|$}}w{c}{3\blockwidth} | *{12}{ w{c}{\blockwidth}| } }
\hline
channels & \mc{12}{11}{Encoding format} \\
\cline{2-13}
         & \mc{12}{11}{pixel} \\
\hline
1        & \mc{12}{11}{grey} \\
\hline
2        & \mc{6}{5}{grey} & \mc{6}{5}{alpha} \\
\hline
3        & \mc{4}{3}{R} & \mc{4}{3}{G} & \mc{4}{3}{B} \\
\hline
4        & \mc{3}{2}{R} & \mc{3}{2}{G} & \mc{3}{2}{B} & \mc{3}{2}{A} \\
\hline
\end{tabular}
\end{center}

\end{document}

在此处输入图片描述

说实话,该表格解释的内容很少。

答案3

您可以添加一个包含所有单元格和幻影字母的空行:

\documentclass{article}
\usepackage{multirow}
 \newcommand{\mc}[2]{\multicolumn{#1}{c|}{#2}}
 \newcommand{\ec}{\multicolumn{1}{c}{\phantom{W}}}
 \usepackage{lipsum}

 \begin{document}

    \lipsum[47]

    \begin{table}[!h]
    \centering
        \begin{tabular}{|r|*{12}{c}}
    \ec & \ec & \ec &\ec & \ec & \ec &\ec & \ec & \ec &\ec & \ec & \ec & \ec \\[-2ex]
        \hline
       \multirow{2}{*}{channels}& \mc{12}{Encoding format} \\ \cline{2-13}
        & \mc{12}{pixel} \\ \hline
        1 & \multicolumn{12}{c|}{grey} \\ \hline
        2 & \mc{6}{grey} & \mc{6}{alpha} \\ \hline
        3 & \mc{4}{R} & \mc{4}{G} & \mc{4}{B} \\ \hline
        4 & \mc{3}{R} & \mc{3}{G} & \mc{3}{B} & \mc{3}{A}\\ \hline
        \end{tabular}
    \end{table}

 \end{document} 

在此处输入图片描述

相关内容