Раскрашивание фонов частей матрицы

Раскрашивание фонов частей матрицы

Я некоторое время искал информацию и, похоже, у меня возникли большие трудности с раскрашиванием следующей матрицы:

\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

Отдельно отвозможности, перечисленные в комментарии Зарко, вы можете использовать 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=.3and inner sep=4ptдля первого и второго nodes, поэтому их цвета самосмешиваются.

введите описание изображения здесь

\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}of 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допостроение массива (с использованием узлов Tikz, созданных nicematrixв матрице).

Опять же, это работает даже с фоном.

\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}

Вывод третьего кода

Связанный контент