为矩阵各部分的背景着色

为矩阵各部分的背景着色

我已经寻找了一段时间,似乎在为以下矩阵着色时遇到了很大的麻烦:

\begin{pmatrix}  3 & -1 & -1 & -1 & 0 & 0 & 0 \\
        -1 & 1 & 0 & 0 & 0 & 0 & 0 \\
        -1 & 0 & 2 & 0 & 0 & 0 & 0 \\
        -1 & 0 & 0 & 2 & -1 & 0 & 0 \\
        0 & 0 & -1 & 0 & 3 & -1 & -1 \\
        0 & 0 & 0 & -1 & -1 & 3 & -1 \\
        0 & 0 & 0 & 0 & -1 & -1 & 2 \end{pmatrix}

如下:

在此处输入图片描述

有人知道我应该从哪里开始做这件事吗?我遇到的所有东西似乎都是为特定矩阵专门编写的,而我在调整代码时遇到了麻烦。

答案1

除了Zarko 评论中列出的可能性,您可以使用tikzmark,这可以为您提供更精细的自动控制。但是,在您的用例中,不需要更精细的控制,但如果矩阵中有更多奇特的条目(例如带有指数的内容),则可能需要更精细的控制。

\documentclass{article}
\usepackage{eso-pic}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit}
\begin{document}
\AddToShipoutPictureBG{%
\begin{tikzpicture}[overlay,remember picture]
 \node[fill=blue!40,rounded corners,fit=(m1)(m3)]{};
 \node[fill=red!40,rounded corners,fit=(m2)(m4)]{};
 \node[fill=purple!60,inner xsep=1.6ex,rounded corners,fit=(m2)(m3)]{};
\end{tikzpicture}
}
\[\begin{pmatrix}  
    \tikzmarknode{m1}{3} & -1 & -1 & -1 & 0 & 0 & 0 \\
        -1 & 1 & 0 & 0 & 0 & 0 & 0 \\
        -1 & 0 & \tikzmarknode{m2}{2} & 0 & 0 & 0 & 0 \\
        -1 & 0 & 0 & \tikzmarknode{m3}{2} & -1 & 0 & 0 \\
        0 & 0 & -1 & 0 & 3 & -1 & -1 \\
        0 & 0 & 0 & -1 & -1 & 3 & -1 \\
        0 & 0 & 0 & 0 & -1 & -1 & \tikzmarknode{m4}{2}
\end{pmatrix}\]
\end{document}

在此处输入图片描述


附录(作者 BlackMild):这是对 mamot 代码的一个小改动。我删除了第三个节点,并使用opacity=.3inner sep=4pt作为第一个和第二个node节点,因此它们的颜色是自混合的。

在此处输入图片描述

\documentclass{article}
\usepackage{eso-pic}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit}
\begin{document}
\AddToShipoutPictureBG{%
\begin{tikzpicture}[overlay,remember picture,opacity=.3,inner sep=4pt]
\node[fill=blue,fit=(m1)(m3)]{};
\node[fill=red,fit=(m2)(m4)]{};
\end{tikzpicture}
}
    \[\begin{pmatrix}  
        \tikzmarknode{m1}{3} & -1 & -1 & -1 & 0 & 0 & 0 \\
        -1 & 1 & 0 & 0 & 0 & 0 & 0 \\
        -1 & 0 & \tikzmarknode{m2}{2} & 0 & 0 & 0 & 0 \\
        -1 & 0 & 0 & \tikzmarknode{m3}{2} & -1 & 0 & 0 \\
        0 & 0 & -1 & 0 & 3 & -1 & -1 \\
        0 & 0 & 0 & -1 & -1 & 3 & -1 \\
        0 & 0 & 0 & 0 & -1 & -1 & \tikzmarknode{m4}{2}
    \end{pmatrix}\]
\end{document}

答案2

您可以使用 轻松做到这{pNiceMatrix}一点nicematrix

在该环境中,您有一个内置命令\Block,可以用所需的颜色填充块。

为了证明即使在有背景的情况下也能正常工作,我将环境置于{pNiceMatrix}{tcolorbox}用户 121799 的答案在有背景的情况下不起作用)。

\documentclass{article}

\usepackage{tcolorbox}
\usepackage{nicematrix,tikz}

\begin{document}

\begin{tcolorbox}
\[\begin{pNiceMatrix}[margin]  
\Block[fill=blue!40,rounded-corners]{4-4}{}
3  & -1 & -1 & -1 & 0  & 0  & 0  \\
-1 & 1  & 0  & 0  & 0  & 0  & 0  \\
-1 & 0  & \Block[fill=red!40,rounded-corners]{*-*}{}
          2  & 0  & 0  & 0  & 0  \\
-1 & 0  & 0  & 2  & -1 & 0  & 0  \\
0  & 0  & -1 & 0  & 3  & -1 & -1 \\
0  & 0  & 0  & -1 & -1 & 3  & -1 \\
0  & 0  & 0  & 0  & -1 & -1 & 2 
\end{pNiceMatrix}\]
\end{tcolorbox}

\end{document}

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

第一个代码的输出

您可以使用密钥opacity(需要 6.22 版nicematrix)。

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{nicematrix}

\begin{document}

\begin{tcolorbox}
\[\begin{pNiceMatrix}[margin]  
\Block[fill=blue!40,rounded-corners]{4-4}{}
3  & -1 & -1 & -1 & 0  & 0  & 0  \\
-1 & 1  & 0  & 0  & 0  & 0  & 0  \\
-1 & 0  & \Block[fill=red!80,opacity=0.5,rounded-corners]{*-*}{}
          2  & 0  & 0  & 0  & 0  \\
-1 & 0  & 0  & 2  & -1 & 0  & 0  \\
0  & 0  & -1 & 0  & 3  & -1 & -1 \\
0  & 0  & 0  & -1 & -1 & 3  & -1 \\
0  & 0  & 0  & 0  & -1 & -1 & 2 
\end{pNiceMatrix}\]
\end{tcolorbox}

\end{document}

第二段代码的输出

如果你想要红色块位于蓝色块后面,则此技术将不起作用。在这种情况下,可以使用\CodeBefore提供的{pNiceMatrix}来使用 Tikz 绘制彩色矩形数组的构建(使用nicematrix矩阵中创建的 Tikz 节点)。

再次强调,即使有背景,这种方法也能奏效。

\documentclass{article}
\usepackage{tcolorbox}
\usepackage{nicematrix,tikz}

\begin{document}

\begin{tcolorbox}
\[\begin{pNiceMatrix}[margin]  
\CodeBefore
  \begin{tikzpicture}
  \fill [red!40,rounded corners] (3-|3) rectangle (8-|8) ;
  \fill [blue!40,rounded corners] (1-|1) rectangle (5-|5) ;
  \end{tikzpicture}
\Body
3  & -1 & -1 & -1 & 0  & 0  & 0  \\
-1 & 1  & 0  & 0  & 0  & 0  & 0  \\
-1 & 0  & 2  & 0  & 0  & 0  & 0  \\
-1 & 0  & 0  & 2  & -1 & 0  & 0  \\
0  & 0  & -1 & 0  & 3  & -1 & -1 \\
0  & 0  & 0  & -1 & -1 & 3  & -1 \\
0  & 0  & 0  & 0  & -1 & -1 & 2 
\end{pNiceMatrix}\]
\end{tcolorbox}

\end{document}

第三个代码的输出

相关内容