如何均匀填充 TikZ 矩阵内元素块的背景颜色?

如何均匀填充 TikZ 矩阵内元素块的背景颜色?

当我分别填充要突出显示的块中的每个元素时,PDF 输出会在突出显示的块内单独的矩阵元素的背景之间显示非常小的空白。这很烦人。我该怎么办?这是blue!10我希望均匀应用于多个元素的颜色。这是代码。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}
\begin{tikzpicture}[row 2 column 3/.style=red, fill=green]
\matrix[left delimiter=(,right delimiter=)] (magic) [matrix of nodes]
{
|[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|1 & 0 & 0 & 0\\
|[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & 0 & 0 & 0\\
|[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & 0 & 0 & 0\\
|[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & 0 & 0 & 0 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|1\\
|[fill=blue!10]|1 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & 0 & 0 & 0 & |[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|1\\
|[fill=blue!10]|0 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & 0 & 0 & 0 & |[fill=blue!10]|1 & |[fill=blue!10]|1 & |[fill=blue!10]|0\\
0 & 0 & 0 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|0 & 0 & 0 & 0\\
0 & 0 & 0 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|1 & 0 & 0 & 0\\
0 & 0 & 0 & |[fill=blue!10]|0 & |[fill=blue!10]|1 & |[fill=blue!10]|0 & 0 & 0 & 0\\
};
\end{tikzpicture}
\end{document}

答案1

如果这是您需要做的唯一矩阵,那么您可以使用此解决方案。我之前分配了节点并使用这些节点填充路径,但后来更改并使用了自动分配的矩阵节点名称(percusse 在评论中帮助了我)。这有点麻烦,但确实有效。

如果您需要多次执行此操作,那么可能有更好的解决方案,但这个解决方案不会花费太长时间。

矩阵图像

第 6 行、第 6 列有一点瑕疵,两个角度不是完全匹配,但除非您需要 10mx10m 的尺寸,否则不太明显。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{%
  highlight/.style={rectangle,fill=blue,draw=none,fill opacity=.1,inner sep=0pt}
}

\begin{document}
\begin{tikzpicture}[row 2 column 3/.style=red, fill=green]
\matrix[left delimiter=(,right delimiter=)] (magic) [matrix of nodes]
{
1 & 0 & 1 & 0 & 1 & 1 & 0 & 0 & 0\\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
1 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1\\
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1\\
0 & 0 & 1 & 0 & 0 & 0 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 1 & 1 & 0 & 0 & 0\\
0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0\\
};

\fill[highlight] 
(magic-1-1.north west) |- (magic-7-6.north east) |- 
(magic-9-4.south west) |- (magic-4-9.north east) -- 
(magic-6-9.south east) -| (magic-1-6.north east) -- cycle;

\end{tikzpicture}
\end{document}

使用图层

或者,你可以设置另一个图层,这样你就不用使用不透明度键了,方法是使用这种方法由 Andrew建议在评论中

在你的序言中包括这一点:

\pgfdeclarelayer{back}
\pgfsetlayers{back,main}

\makeatletter
\pgfkeys{%
  /tikz/on layer/.code={
    \def\tikz@path@do@at@end{\endpgfonlayer\endgroup\tikz@path@do@at@end}%
    \pgfonlayer{#1}\begingroup%
  }%
}
\makeatother

然后添加on layer=back到您想要放置“后面”的路径。此时您可以将 tikzset 命令改写为

highlight/.style={rectangle,fill=blue!10,draw=none,inner sep=0pt}}

相关内容