Node TIKZ
Categories:
Синтаксис NODE
\path … node ⟨foreach statements⟩ [⟨options⟩] (⟨name⟩) at(⟨coordinate⟩) :⟨animation attribute⟩={⟨options⟩} {⟨node contents⟩} …;
node contents
это тоже, что и в фигурных скобках.
\tikz {
\path (0,0) node [red] {A}
(1,0) node [blue] {B}
(2,0) node [green, node contents=C]
(3,0) node [node contents=D] ;
}
at
Node размещается в последней координате path, а at
указывает конкретно куда поместить node.
\node at (0,0) {сюда}
behind path
нарисует сзади текущего рисунка.
\tikz \fill [fill=blue!50, draw=blue, very thick] (0,0) node [behind path, fill=red!50] {first node}
in front of path
тоже, что и выше, только нарисует спереди текущего рисунка
name
задает имя node, полезно для якорей и координат
можно задать alias
и есть еще режим also
, позволяет под этим же именем node разместить другой текст
coordinate
\path … coordinate[⟨options⟩](⟨name⟩)at(⟨coordinate⟩) …;
специальный синтаксис для легковесных node
это будет просто точка и все якоря будут иметь одно и тоже значение.
\coordinate — простая запись
\path[shape=coordinate]
(0,0) coordinate(b1)
(1,0) coordinate(b2)
(1,1) coordinate(b3)
(0,1) coordinate(b4);
OPTIONS
Опции для node отличаются от назначений path, поэтому для node нужно давать свои назначения в опциях.
Для рисования вокруг node используем библиотеку \usetikzlibrary {shapes.geometric}
https://tikz.dev/library-shapes
в ней много разных shapes, которые можно указывать в options
По умолчанию без библиотек в node можно применять 3 вида shapes:
- rectangle
- circle
- coordinate
foreach
в node можно вставлять несколько foreach
\tikz \node foreach \x in {1,...,4} foreach \y in {1,2,3}
[draw] at (\x,\y) {\x,\y};
every node
устанавливает стиль для каждой ноды
\begin{tikzpicture}[every node/.style={draw}]
или
\begin{tikzpicture}
[every rectangle node/.style={draw},
every circle node/.style={draw,double}]
\draw (0,0) node[rectangle] {A} -- (1,1) node[circle] {B};
\end{tikzpicture}
для каждой прямоугольной node или для каждой круглой node
execute at begin node (end node)
\begin{tikzpicture}
[execute at begin node={A},
execute at end node={D}]
\node[execute at begin node={B}] {C};
\end{tikzpicture}
На выходе даст ABCD
name prefix=⟨text⟩
Используется в scope и добавляет префикс к имени node
\tikz {
\begin{scope}[name prefix = top-]
\node (A) at (0,1) {A};
\node (B) at (1,1) {B};
\draw (A) -- (B);
\end{scope}
\begin{scope}[name prefix = bottom-]
\node (A) at (0,0) {A};
\node (B) at (1,0) {B};
\draw (A) -- (B);
\end{scope}
\draw [red] (top-A) -- (bottom-B);
}
ее брат name suffix=⟨text⟩
добавит суффикс в конце имени
inner sep=⟨dimension⟩
внутренний отступ от текста к рамке
inner xsep=⟨dimension⟩
margin по x
inner ysep=⟨dimension⟩
margin по y
outer sep=⟨dimension or “auto”⟩
эффект этой опции позволит сместить все якоря вовне
outer sep=auto
outer xsep=⟨dimension⟩
outer ysep=⟨dimension⟩
minimum height=⟨dimension⟩
минимальная высота node
если текст не вместится,то node расширится
minimum width=⟨dimension⟩
минимальная ширина node
minimum size=⟨dimension⟩
для квадратных и круглых форм
shape aspect=⟨aspect ratio⟩
пропорции сжатия
shape border uses incircle=⟨boolean⟩
проверяет,чтобы внутрь фигуры вписывалась окружность
shape border rotate=⟨angle⟩
поворачивает контур фигуры, но не поворачивает текст
\nodepart[⟨options⟩]{⟨part name⟩}
это node состоящая из нескольких частей
\usetikzlibrary {shapes.multipart}
\begin{tikzpicture}
\node [circle split,draw,double,fill=red!20]
{
% No \nodepart has been used, yet. So, the following is put in the
% ``text'' node part by default.
$q_1$
\nodepart{lower} % Ok, end ``text'' part, start ``output'' part
$00$
}; % output part ended.
\end{tikzpicture}
для ее использования нужно применить circle split
и в \nodeparts
указать аргументы {text,lower}.
для нее же можно настроить стиль:
every ⟨part name⟩ node part
\usetikzlibrary {shapes.multipart}
\tikz [every lower node part/.style={red}]
\node [circle split,draw] {$q_1$ \nodepart{lower} $00$};
NODE TEXT
text=color
задает цвет текста
node font=⟨font commands⟩
\draw[node font=\itshape]
— задает шрифт в node
или font=⟨font commands⟩
если задать внутри node
\begin{tikzpicture}
\node [font=\itshape] {italic};
\end{tikzpicture}
align
- center
- left
- right
- align=flush left
- align=flush right — выравнивает без переноса слов
- align=fkush center
- align=justify
- align=none
\tikz[align=center] \node[draw] {This is a\\demonstration.};
text width=⟨dimension⟩
задает ширину текстового поля в node
text height=⟨dimension⟩
высоту текстового блока
text depth=⟨dimension⟩
глубина текста
badness warnings for centered text=⟨true or false⟩
система координат NODE
south тоже есть
anchor=⟨anchor name⟩
anchor= — по умолчанию это центр node, но можно задать любую координату и относительно ее будет идти привязка
относительные надписи
- above=⟨offset⟩
- below=⟨offset⟩
- left=⟨offset⟩
- right=⟨offset⟩
- above left
- above right
- below left
- below right
- centered
\tikz \fill (0,0) circle (2pt) node[above=2pt] {above};
библиотека positioning
\usetikzlibrary{positioning}
дает все тоже самое,но можно еще вычислять расстояния
\node at (1,1) [above=2pt+3pt,draw]
плюс у нее есть команда of
\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style=draw]
\draw[help lines] (0,0) grid (2,2);
\node (somenode) at (1,1) {some node};
\node [above=5mm of somenode.north east] {\tiny 5mm of somenode.north east};
\node [above=1cm of somenode.north] {\tiny 1cm of somenode.north};
\end{tikzpicture}
of
укажет относительно чего смещение
on grig
смещает node по сетке, а не относительно бордюра node
\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style=draw]
\draw[help lines] (0,0) grid (2,3);
% Not gridded
\node (a1) at (0,0) {not gridded};
\node (b1) [above=1cm of a1] {fooy};
\node (c1) [above=1cm of b1] {a};
% gridded
\node (a2) at (2,0) {gridded};
\node (b2) [on grid,above=1cm of a2] {fooy};
\node (c2) [on grid,above=1cm of b2] {a};
\end{tikzpicture}
смещает без on grid
относительно бордюра node
с on grid
смещает четко по сетке grid
node distance=⟨shifting part⟩
\begin{tikzpicture}[every node/.style=draw,node distance=5mm]
теперь все смещения будут на 5мм
Очень показательно как работает этот ключ
\usetikzlibrary {positioning}
\begin{tikzpicture}[every node/.style={draw,node distance=0mm}]
\draw[help lines] (0,0) grid (2,3);
% Not gridded
\node (a1) at (0,0) {not gridded};
\node (b1) [above=of a1] {fooy};
\node (c1) [above=of b1] {a};
% gridded
\node (a2) at (2,0) {gridded};
\node (b2) [on grid,above=of a2] {fooy};
\node (c2) [on grid,above=of b2] {a};
\end{tikzpicture}
node distance=0mm — показало смещение для on grid по центрам, а без grid от бордюра.
еще есть вариант [node distance=1 and 1]
К вышеперечисленной серии команд в библиотеке еще есть
- base left=⟨specification⟩
- base right
- mid left
- mid right
библиотека matrix и graphdrawing
о них отдельно
лучше позиционируют большие массивы node
fitting node
т.е. подгонка координат
\usetikzlibrary {fit,shapes.geometric}
\begin{tikzpicture}[level distance=8mm]
\node (root) {root}
child { node (a) {a} }
child { node (b) {b}
child { node (d) {d} }
child { node (e) {e} } }
child { node (c) {c} };
\node[draw=red,inner sep=0pt,thick,ellipse,fit=(root) (b) (d) (e)] {};
\node[draw=blue,inner sep=0pt,thick,ellipse,fit=(b) (c) (e)] {};
\end{tikzpicture}
библиотека fit и опция fit позволяет охватить место,чтобы в него могли войти нужные данные
Transformations
transform shape
\tikz[scale=3] \node[transform shape] {X};
т.е. я сначала сказал, что нужно сделать scale=3, а потом команда transform shape
выполнит это действие и я получу гигантскую X.
причем сказать можно в path или draw, а команда выполнится в node
\usepgfmodule {nonlineartransformations}\usetikzlibrary {curvilinear}
модули и библиотеки для трансформаций
transform shape nonlinear=⟨true or false⟩
будет рисовать по криволинейным траекториям подробнее https://tikz.dev/tikz-shapes
pos
указывает явно координату, где разместить node в path
\tikz \draw (0,0) -- (3,1)
node[pos=0]{0} node[pos=0.5]{1/2} node[pos=0.9]{9/10};
pos получает значение от 0 до 1 по длине пути
auto=⟨direction⟩
направление может быть left или right в зависимости от этого будет выбираться якорь в node для соединения
swap
если установлена опция auto то будет делать наоборот, для left будет искать right якорь
'
— апостроф отработает как swap
sloped
будет писать текст вдоль кривой
можно добавить [allow upside down]
или [rotate=180]
node[midway,sloped,below] {$y$};
allow upside down=⟨boolean⟩
перевернет надпись вверх ногами
midway имена точек в пути
- midway — напишет посередине линии
- near start — pos=0.25.
- near end — pos=0.75.
- very near start — pos=0.125.
- very near end — pos=0.875.
- at start — pos=0.
- at end — pos=1
label
это такая надпись в надписи
\usetikzlibrary {positioning}
\tikz [circle] {
\node [draw] (s) [label=below:$s$] {ф};
\node [draw] (a) [right=of s] {} edge (s);
\node [draw] (b) [right=of a] {} edge (a);
\node [draw] (t) [right=of b, label=$t$] {} edge (b);
}
направление метки словами left, right, below, above или градусы и двоеточие:
label=[⟨options⟩]⟨angle⟩:⟨text⟩
или \node [draw] (s) [label=100:$s$] {ф};
\tikz
\node [circle, draw,
label=default,
label=60:$60^\circ$,
label=below:$-90^\circ$,
label=3:$3^\circ$,
label=2:$2^\circ$,
label={[below]180:$180^\circ$},
label={[centered]135:$135^\circ$}] {my circle};
label distance=⟨distance⟩
установит дистанцию для label от меток
every label
настроит стиль для label
PIN
булавка — похожа на label, но с булавкой)
pin distance=⟨distance⟩
расстояние до текста в булавке
every pin
стиль булавки
pin position=⟨angle⟩
аналогично label position
every pin edge
настроит вид edge для pin
pin={[pin edge={blue,thick}]right:X},
Кавычки
Нужна библиотека \usetikzlibrary{quotes}
\usetikzlibrary {quotes}
\begin{tikzpicture}
\matrix [row sep=5mm] {
\node [draw, "label"] {A}; \\
\node [draw, "label" left] {B}; \\
\node [draw, "label" centered] {C}; \\
\node [draw, "label" color=red] {D}; \\
\node [draw, "label" {red,draw,thick}] {E}; \\
};
\end{tikzpicture}
текст в кавычках становится обычным label
quotes mean label
\usetikzlibrary {quotes}
\tikz
\node ["90:$90^\circ$", "left:$180^\circ$", circle, draw] {circle};
every label quotes
задать стиль
quotes mean pin
Connecting Nodes
Соединение Nodes
\begin{tikzpicture}
\path (0,0) node (x) {Hello World!}
(3,1) node[circle,draw](y) {$\int_1^2 x \mathrm d x$};
\draw[->,blue] (x) -- (y);
\draw[->,red] (x) -| node[near start,below] {label} (y);
\draw[->,orange] (x) .. controls +(up:1cm) and +(left:1cm) .. node[above,sloped] {label} (y);
\end{tikzpicture}
При соединении nodes стрелки будут проходить от границы node
EDGES
это ребро, которое будет добавлено после того, как будет нарисован основной путь.
\path … edge[⟨options⟩] ⟨nodes⟩ (⟨coordinate⟩) …;
\begin{tikzpicture}
\node foreach \name/\angle in {a/0,b/90,c/180,d/270}
(\name) at (\angle:1) {$\name$};
\path[->] (b) edge (a)
edge (c)
edge [-,dotted] (d)
(c) edge (a)
edge (d)
(d) edge (a);
\end{tikzpicture}
edge
— это просто ребра между координатами.
Внутри edge
можно вставлять node
every edge
назначить стиль для всех edge
quotes
для edge в библиотеке quotes также работает текст в кавычках, как label
\usetikzlibrary {quotes}
\tikz \draw (0,0) edge ["left", ->] (2,0);
every edge quotes
Стиль quotes
swap
к тексту с кавычками добавить '
расстояние между label и edge
определяется параметром inner sep=
\usetikzlibrary {quotes}
\tikz [tight/.style={inner sep=1pt}, loose/.style={inner sep=.7em}]
\draw (0,0) edge ["left" tight,
"right"' loose,
"start" near start] (4,0);
Ссылка на узлы за пределами текущего изображения
Это означает,что можно ссылаться из одной картинки в другую картинку на странице.
remember picture=⟨boolean⟩
этот параметр нужно назначить картинкам, которые будут друг на друга ссылаться
\tikzset{every picture/.append style={remember picture}}
этот стиль для всех картинок сразу.
overlay
эту опцию необходимо указать в свойствах path, которые будут ссылаться на другие изображения.
Да, я это видел и я это сделал. Все соединились стрелочками.
\tikz[remember picture] \node[circle,fill=red!50] (n1) {};
— это кружок в любом месте текста.
\tikz[remember picture] \node[fill=blue!50] (n2) {};
— это квадратик, в другом месте.
\begin{tikzpicture}[remember picture,overlay]
\draw[->,very thick] (n1) -- (n2);
\end{tikzpicture}
а это линия,которая соединит кружок с квадратиком
все так и произошло.
\begin{tikzpicture}[remember picture]
\node (c) [circle,draw] {Big circle};
\draw [overlay,->,very thick,red,opacity=.5]
(c) to[bend left] (n1) (n1) -| (n2);
\end{tikzpicture}
Это красная линия с еще более сложным маршрутом.
Абсолютные координаты страницы
на каждой странице присутствует node — current page
и у нее есть полный набор ancher
: west,east,north,south,center…
для размещения в любом месте страницы нужно в свойствах указать:
\begin{tikzpicture}[remember picture,overlay]
Поздний код
\path … node also[⟨late options⟩](⟨name⟩) …;
— добавляет опции к узлу позже.
Обязательно нужно указать имя node и не должно быть указано текста. Только опции.
\begin{tikzpicture}
\node [draw,circle] (a) {Hello};
\node also [label=above:world] (a);
\end{tikzpicture}
\tikzlastnode
этот макрос подобен командам append after command
и prefix after command
late options=⟨options⟩
это еще один аналог node also
\begin{tikzpicture}
\node [draw,circle] (a) {Hello};
\path [late options={name=a, label=above:world}];
\end{tikzpicture}