我用以下代码和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
,\rowcolor
和columncolor
- 但是,在这种情况下我只能使用\cellcolor
,因为没有完整的行或列。但这意味着我必须输入 26 次\cellcolor
。有没有有效的方法来做到这一点(无论是通过算法还是通过一次给整个块着色)?
答案1
手动解决方案:您可以应用
\rowcolor
并选择性地将不应有颜色的单元格涂成白色\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 节点)。