Node TIKZ

Nodes и Edges, киты TIKZ в которых можно все писать и компоновать

Синтаксис 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};

foreach

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}

partnode

для ее использования нужно применить 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

coordinate

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}

grid

смещает без 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}

shift

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 позволяет охватить место,чтобы в него могли войти нужные данные

fitting

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

text

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);
}

label

направление метки словами 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 — это просто ребра между координатами.

Внутри 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}

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

overlay

все так и произошло.

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