高效地为表格单元格块着色

高效地为表格单元格块着色

我用以下代码和hhline包制作了一个表格:

\documentclass{article}
\usepackage{hhline}
\begin{document}
\begin{tabular}{l || l l l l l | l}
& 1 & 2 & 3 & 4 & 5 & 6\\\hhline{=#=====|=}
1 & 1 & 1 & 1 & 1 & 1 & 0\\
2 & 1 & 1 & 1 & 1 & 1 & 0\\
3 & 1 & 1 & 1 & 1 & 1 & 0\\
4 & 1 & 1 & 1 & 1 & 1 & 0\\
5 & 1 & 1 & 1 & 1 & 1 & 0\\\hline
6 & 0 & 0 & 0 & 0 & 0 & 1
\end{tabular}
\end{document}

在此处输入图片描述

现在,我想将 5×5 块涂成特定颜色,将 1×1 块涂成另一种颜色。其他单元格应保持原样。

我见过分别对表格中的合并单元格和常规单元格进行着色这意味着\cellcolor\rowcolorcolumncolor- 但是,在这种情况下我只能使用\cellcolor,因为没有完整的行或列。但这意味着我必须输入 26 次\cellcolor。有没有有效的方法来做到这一点(无论是通过算法还是通过一次给整个块着色)?

答案1

  1. 手动解决方案:您可以应用\rowcolor并选择性地将不应有颜色的单元格涂成白色

    在此处输入图片描述

  2. \ColorBlock{<start row>}{<end row>}{<color>} 使用collcell包我们可以定义一个宏来指定要为表格的哪些行着色。这仅适用于L在 MWE 中定义的对齐方式的列。

    在此处输入图片描述


代码:

\documentclass{article}

\usepackage{hhline}
\usepackage{xcolor}
\usepackage{colortbl}

\newcommand{\RowColor}{\rowcolor{red!50} \cellcolor{white}}

\begin{document}
\begin{tabular}{l || l l l l l | l}
                  & 1 & 2 & 3 & 4 & 5 & \cellcolor{yellow}6 \\\hhline{=#=====|=}
\RowColor       1 & 1 & 1 & 1 & 1 & 1 & \cellcolor{white}0  \\
\RowColor       2 & 1 & 1 & 1 & 1 & 1 & \cellcolor{white}0  \\
\RowColor       3 & 1 & 1 & 1 & 1 & 1 & \cellcolor{white}0  \\
\RowColor       4 & 1 & 1 & 1 & 1 & 1 & \cellcolor{white}0  \\
\RowColor       5 & 1 & 1 & 1 & 1 & 1 & \cellcolor{white}0  \\\hline
\cellcolor{cyan}6 & 0 & 0 & 0 & 0 & 0 & \cellcolor{green}1
\end{tabular}
\end{document}

代码:\ColorBlock{<start row>}{<end row>}{<color>}

\documentclass{article}

\usepackage{hhline}
\usepackage{xcolor}
\usepackage{colortbl}

\usepackage{collcell}

\newcounter{CurrentRow}
\newcommand*{\StartRow}{1}%
\newcommand*{\EndRow}{1}%
\newcommand*{\CellColor}{white}%
\newcommand{\ColorBlock}[3]{%
    \renewcommand*{\StartRow}{#1}%
    \renewcommand*{\EndRow}{#2}%
    \renewcommand*{\CellColor}{#3}%
}

\newcommand*{\ApplyCellColor}[1]{%
    \ifnum\arabic{CurrentRow}>\numexpr\StartRow-1\relax
        \ifnum\arabic{CurrentRow}<\numexpr\EndRow+1\relax
            \cellcolor{\CellColor}#1%
        \else
            #1%
        \fi
    \else
        #1%
    \fi
}
\newcolumntype{L}{>{\collectcell\ApplyCellColor}{l}<{\endcollectcell}}%%  for left alignment
%\newcolumntype{C}{>{\collectcell\ApplyCellColor}{c}<{\endcollectcell}}%% if need center alignment
%\newcolumntype{R}{>{\collectcell\ApplyCellColor}{r}<{\endcollectcell}}%% if need right alignment

\newcommand{\RowColor}{\rowcolor{red!50} \cellcolor{white}}

\newcommand{\EndOfRow}{\stepcounter{CurrentRow}\\}% So that we know when we have ended a row
\newenvironment{MyTabular}[1]{%
    \setcounter{CurrentRow}{1}%
    \begin{tabular}{#1}%
}{%
    \end{tabular}%
    \gdef\CellColor{white}%
}


\begin{document}
\ColorBlock{2}{6}{red} 
\begin{MyTabular}{l || L L L L L | l}
       & 1 & 2 & 3 & 4 & 5 & 6 \EndOfRow\hhline{=#=====|=}
     1 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     2 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     3 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     4 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     5 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow\hline
     6 & 0 & 0 & 0 & 0 & 0 & 1
\end{MyTabular}\verb|\ColorBlock{2}{6}{red}:|

\medskip
\ColorBlock{3}{5}{cyan} 
\begin{MyTabular}{l || L L L L L | l}
       & 1 & 2 & 3 & 4 & 5 & 6 \EndOfRow\hhline{=#=====|=}
     1 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     2 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     3 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     4 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow
     5 & 1 & 1 & 1 & 1 & 1 & 0 \EndOfRow\hline
     6 & 0 & 0 & 0 & 0 & 0 & 1
\end{MyTabular}\verb|\ColorBlock{3}{5}{cyan}:|

\end{document}

答案2

如果为单元格着色,则不需要规则。并且表格中永远不需要垂直规则(也不需要双重规则)。

\documentclass{article}
\usepackage{xcolor}
\usepackage{colortbl}

\begin{document}
\begin{tabular}{l *{5}{>{\columncolor{blue!20}}l} l}
\rowcolor{white}%
& 1 & 2 & 3 & 4 & 5 & 6\\
1 & 1 & 1 & 1 & 1 & 1 & 0\\
2 & 1 & 1 & 1 & 1 & 1 & 0\\
3 & 1 & 1 & 1 & 1 & 1 & 0\\
4 & 1 & 1 & 1 & 1 & 1 & 0\\
5 & 1 & 1 & 1 & 1 & 1 & 0\\
\rowcolor{white}%
6 & 0 & 0 & 0 & 0 & 0 & \cellcolor{green!20}1
\end{tabular}
\end{document}

在此处输入图片描述

请注意,\rowcolor优先于\columncolor\cellcolor覆盖两者。

答案3

{NiceTabular}nicematrix,您可以使用命令来为\CodeBefore所需的单元格、矩形、行或列着色。

惯于在某些缩放级别下,某些 PDF 查看器中会出现细白线。

\documentclass{article}
\usepackage{xcolor}
\usepackage{nicematrix}

\begin{document}
\begin{NiceTabular}{lllllll}
\CodeBefore
  \rectanglecolor{blue!20}{2-2}{6-6}
  \cellcolor{green!20}{7-7}
\Body
  & 1 & 2 & 3 & 4 & 5 & 6\\
1 & 1 & 1 & 1 & 1 & 1 & 0\\
2 & 1 & 1 & 1 & 1 & 1 & 0\\
3 & 1 & 1 & 1 & 1 & 1 & 0\\
4 & 1 & 1 & 1 & 1 & 1 & 0\\
5 & 1 & 1 & 1 & 1 & 1 & 0\\
6 & 0 & 0 & 0 & 0 & 0 & 1\\
\end{NiceTabular}
\end{document}

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

上述代码的输出

相关内容