
Estou pesquisando há algum tempo e parece que estou tendo muitos problemas para colorir a seguinte matriz:
\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}
Como abaixo:
Alguém saberia por onde eu começaria a fazer isso? Tudo o que encontrei parece ter sido escrito especialmente para uma matriz específica e tenho tido problemas para adaptar os códigos.
Responder1
Apesar depossibilidades listadas no comentário de Zarko, você pode usar tikzmark
, o que oferece um controle automático indiscutivelmente mais preciso. No seu caso de uso, entretanto, o controle mais preciso não é necessário, mas pode ser se você tiver entradas mais sofisticadas na matriz, como coisas com expoentes.
\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}
Apêndice (por BlackMild): Esta é uma pequena alteração no código do mamot. Eu removo o terceiro nó e uso opacity=.3
e inner sep=4pt
para o primeiro e o segundo node
s, para que suas cores se misturem automaticamente.
\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}
Responder2
Você pode fazer isso facilmente com {pNiceMatrix}
of nicematrix
.
Nesse ambiente, você tem um comando integrado \Block
e pode preencher um bloco com a cor desejada.
Para mostrar que isso funciona mesmo na presença de plano de fundo, coloquei o ambiente {pNiceMatrix}
em a {tcolorbox}
(a resposta do usuário121799 não funciona com plano de fundo).
\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}
Você precisa de várias compilações (porque nicematrix
usa nós PGF/Tikz).
Você pode usar a chave opacity
(requer v. 6.22 do 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}
Se você quiser o bloco vermelho atrás do azul, esta técnica não funcionará. Nesse caso, é possível utilizar o \CodeBefore
fornecido por {pNiceMatrix}
para desenhar os retângulos coloridos com Tikzantesa construção do array (usando nós Tikz criados nicematrix
na matriz).
Mais uma vez, isso funciona mesmo com um plano de fundo.
\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}