Matrix в модуле TIKZ
Categories:
Введение в 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⟩
расстояние между колонками
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}
внутренние стили назначаются в определенной очередности.
Очередность задается параметром:
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}
кратко по примеру выше:
- во второй строчке node дали имя
inner node
- в опциях matrix дали команду
[matrix anchor=inner node.south, ... at (1,1)
, т.е. сказали, что точку юга этой ноды поместить в координату (1,1) 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}
Символы конца строк и переноса строк в узлах
обычно это \\
чтобы в ячейке переносить по строкам, нужно поместить текст в {}
\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}