Matrix в модуле TIKZ

Матрицы в графическом мобуле TIKZ

Введение в MATRIX

при объявлении node просто указать, что это будет matrix

\node [matrix,fill=red!20,draw=blue,very thick]

а дальше как в обычной таблице или array

\draw (0,0)   circle (4mm); & \node[rotate=10] {Hello};        \\
    \draw (0.2,0) circle (2mm); & \fill[red]   (0,0) circle (3mm); \\
  };

вот и всё.

every matrix

определяет стиль matrix

every outer matrix

это настраивает внешний node в котором объявлен matrix

\matrix

специальная команда без node

аналог \path node[matrix]

Выравнивание matrix

column sep=⟨spacing list⟩

расстояние между колонками

matr1

column sep={1cm,between origins} — расстояние будет мерить не по краям, а по центрам

row sep=⟨spacing list⟩

расстояние между строк

Задавать можно целиком на matrix, так и на отдельную ячейку

\draw (0,0) circle (2mm); \\[1cm,between origins] — можно так

\node {8}; &[2mm] \node{1}; &[-1mm] \node {6}; \\ — а можно и так

&[between borders] \node (c) {6}; — а можно и так

параметры ячейки (размеры)

every cell={⟨row⟩}{⟨column⟩} задает параметры каждой ячейки

cells=⟨options⟩

это стиль ячейки cell/.append style=⟨options⟩

nodes=⟨options⟩

это тоже стиль для ячеек matrix node/.append style=⟨options⟩

\begin{tikzpicture}
  \matrix [nodes={fill=blue!20,minimum size=5mm}]
  {
    \node {8}; & \node{1}; & \node {6}; \\
    \node {3}; & \node{5}; & \node {7}; \\
    \node {4}; & \node{9}; & \node {2}; \\
  };
\end{tikzpicture}

стили колонок и строк

  • /tikz/column ⟨number⟩ — column 2/.style={green!50!black}
  • /tikz/every odd column — стиль для нечетной колонки
  • /tikz/every even column — стиль для четной колонки
  • /tikz/row ⟨number⟩ — row 3/.style={green!50!black}
  • /tikz/every odd row — стиль для нечетной строки
  • /tikz/every even row — стиль для четной строки
  • /tikz/row ⟨row number⟩ column ⟨column number⟩ — стиль для строки и колонки
\begin{tikzpicture}
  [row 1/.style={red},
   column 2/.style={green!50!black},
   row 3 column 3/.style={blue}]

  \matrix
  {
    \node {8}; & \node{1}; & \node {6}; \\
    \node {3}; & \node{5}; & \node {7}; \\
    \node {4}; & \node{9}; & \node {2}; \\
  };
\end{tikzpicture}

Выравнивание в ячейках и колонках

\begin{tikzpicture}
  [column 1/.style={anchor=base west},%выравнивает слева
   column 2/.style={anchor=base east},%выравнивает справа
   column 3/.style={anchor=base}]% выравнивает по центру
  \matrix
  {
    \node {123}; & \node{456}; & \node {789}; \\
    \node {12}; & \node{45}; & \node {78}; \\
    \node {1}; & \node{4}; & \node {7}; \\
  };
\end{tikzpicture}

Большая таблица

\usetikzlibrary {matrix,fit}
\begin{tikzpicture}[
  font=\sffamily,
  head color/.style args={#1/#2}{
    row 1 column #1/.append style={nodes={fill=#2}}},
  % swap order of row and column styles
  matrix/inner style order={
    every cell,
    row, even odd row,
    column, even odd column,
    cell

  }
]

\matrix [
   matrix of nodes, nodes in empty cells,
   nodes={text width=2cm, align=center,
          minimum height=1.5em, anchor=center},
   % add striped row style
   every even row/.style={nodes={fill=olive!50}},
   % modify the feature column and header row
   column 1/.style= {nodes={fill=olive, inner ysep=0}},
   row 1/.style= {nodes={text depth=0.2ex, text=white}},
   row 1 column 1/.style={nodes={fill=none, draw=none}},
   head color/.list={2/orange,3/teal,4/cyan,5/magenta} % specify header colors
  ] (m)
  {
            & Basic     & Standard   & Professional & Enterprise \\
  Feature A & $\bullet$ & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature B & $\bullet$ & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature C &           &            &              & $\bullet$  \\
  Feature D &           & $\bullet$  & $\bullet$    & $\bullet$  \\
  Feature E &           &            & $\bullet$    & $\bullet$  \\
  };
% Add emphasis on selection by the use of "fit" library
\node[fit={(m-1-4.north west) (m-6-4.south east)},
      ultra thick, inner sep=0pt, rounded corners=1mm,
      draw=cyan, label={[cyan,align=center]270:Popular\\Choice!}]{};
\end{tikzpicture}

tabl

внутренние стили назначаются в определенной очередности.

Очередность задается параметром:

inner style order

\tikzset{
  matrix/inner style order={
    every cell,
    column,
    even odd column,
    row,
    even odd row,
    cell,
  },
}
  • inner style/every cell
  • inner style/column
  • inner style/even odd column
  • inner style/row
  • inner style/even odd row
  • inner style/cell
  • inner style order

Настройки по умолчанию

Для многих матриц нужно делать однообразные настройки

node{ какой-то текст и };

поэтому определим три макроса:

  • /tikz/execute at begin cell=⟨code⟩ — перед текстом
  • /tikz/execute at end cell=⟨code⟩ — послетекста
  • /tikz/execute at empty cell=⟨code⟩ — если пусто
\begin{tikzpicture}
 [matrix of nodes/.style={
    execute at begin cell=\node\bgroup,
    execute at end cell=\egroup;%
  }]
 \matrix [matrix of nodes]
 {
   8 & 1 & 6 \\
   3 & 5 & 7 \\
   4 & 9 & 2 \\
 };
\end{tikzpicture}

или так

\begin{tikzpicture}
  [matrix of nodes/.style={
     execute at begin cell=\node\bgroup,
     execute at end cell=\egroup;,%
     execute at empty cell=\node{--};%
   }]
  \matrix [matrix of nodes]
  {
    8 & 1 &   \\
    3 &   & 7 \\
      &   & 2 \\
  };
\end{tikzpicture}

https://tikz.dev/library-matrix

Якоря Matrix

matrix anchor=⟨anchor⟩

этот параметр применяется только к самой матрице, но не применяется к ячейкам

т.е. все north, south, east, west

\matrix [matrix anchor=west] at (0,0) поместит левую сторону матрицы в координату (0,0)

отличается от параметра [anchor=west] — который выравнивает в ячейках по левому краю

anchor=⟨anchor or node.anchor⟩

относится только к ячейке

если ячейке дали имя, то можно обращаться к ее якорям node.anchor

\begin{tikzpicture}
  \draw[help lines] (0,0) grid (3,2);
  \matrix[matrix anchor=inner node.south,anchor=base,row sep=3mm] at (1,1)
  {
    \node {a}; & \node             {b}; & \node {c}; & \node {d}; \\
    \node {a}; & \node(inner node) {b}; & \node {c}; & \node {d}; \\
    \node {a}; & \node             {b}; & \node {c}; & \node {d}; \\
  };
  \draw (inner node.south) circle (1pt);
\end{tikzpicture}

ancor

кратко по примеру выше:

  1. во второй строчке node дали имя inner node
  2. в опциях matrix дали команду [matrix anchor=inner node.south, ... at (1,1), т.е. сказали, что точку юга этой ноды поместить в координату (1,1)
  3. anchor=base — колонки выравнивать по центру

Замена & как разделителя колонок

ampersand replacement=⟨macro name or empty⟩

для некоторых процедур это нужно,чтобы не было конфликта с другими библиотеками. Если матрицу закручивать по контуру, то придется поменять разделитель на другое.

\matrix [ampersand replacement=\&]

Matrix Library

без нее эта тема не закончена

\usetikzlibrary{matrix}

matrix of nodes

это матрица в которой каждая ячейка это node

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix (magic) [matrix of nodes]
  {
    8 & 1 & 6 \\
    3 & 5 & 7 \\
    4 & 9 & 2 \\
  };

  \draw[thick,red,->] (magic-1-1) |- (magic-2-3);
\end{tikzpicture}

мы такую уже делали сами, но она объявлена в библиотеке, нужно просто сослаться в заголовке

добавить свои опции вариант 1

указать колонку и строку в заголовке и назначить свой стиль

\begin{tikzpicture}[row 2 column 3/.style=red]
\matrix [matrix of nodes]

добавить опции непосредственно ячейке вариант 2

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of nodes]
  {
    8 & 1 &         6 \\
    3 & 5 & |[red]| 7 \\
    4 & 9 &         2 \\
  };
\end{tikzpicture}

для этого нужно поместить между вертикальных линий все данные |[red] (seven)|, как здесь передаем цвет и имя ноды

у & есть необязательный аргумент [3mm] — это расстояние между колонками

8 &[1cm] 1 &[3mm] |[red]| 6 \\

вариант 3 — указать полный список параметров

3 & 5 & \node[red]{7}; \draw(0,0) circle(10pt);\\

matrix of math nodes

все ячейки становятся заключены в $

nodes in empty cells=⟨true or false⟩

обязывает отображать пустые ячейки

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of math nodes,nodes={circle,draw},nodes in empty cells]
  {
    a_8 &     & a_6 \\
    a_3 &     & a_7 \\
    a_4 & a_9 &     \\
  };
\end{tikzpicture}

empty

Символы конца строк и переноса строк в узлах

обычно это \\

чтобы в ячейке переносить по строкам, нужно поместить текст в {}

\usetikzlibrary {matrix}
\begin{tikzpicture}
  \matrix [matrix of nodes,nodes={text width=16mm,draw}]
  {
    row 1 & {upper line \\ lower line} \\
    row 2 & hmm \\
  };
\end{tikzpicture}

Разделители в матрицах

  • left delimiter=⟨delimiter⟩
  • right delimiter=⟨delimiter⟩
  • every delimiter
  • every left delimiter
  • every right delimiter
  • above delimiter
  • every above delimiter
  • below delimiter=⟨delimiter⟩
  • every below delimiter
\usetikzlibrary {matrix}
\begin{tikzpicture}
 \matrix [matrix of math nodes,%
          left delimiter=\|,right delimiter=\rmoustache,%
          above delimiter=(,below delimiter=\}]
 {
   a_8 & a_1 & a_6 \\
   a_3 & a_5 & a_7 \\
   a_4 & a_9 & a_2 \\
 };
\end{tikzpicture}

matr