Пользовательский узел в TikZ

Пользовательский узел в TikZ

Извините за простой вопрос, но я новичок в TikZ, и у меня возникли большие проблемы с определением даже простого узла...

У меня получился следующий код:

\begin{tikzpicture}
 \draw (0,0) -- (1,-1) -- (2,0) -- (2,2) -- (0,2) -- (0,0);
\end{tikzpicture}

Все, что мне нужно, — это определить форму с помощью кода, чтобы иметь возможность использовать ее в такой ситуации:

\begin{tikzpicture}[node distance = 2cm, auto]
    % Place nodes
    \node [block] (init) {initialize model};
    \node [cloud, left of=init] (expert) {expert};
    \node [cloud, right of=init] (system) {system};
    \node [block, below of=init] (identify) {identify candidate models};
    \node [block, below of=identify] (evaluate) {evaluate candidate models};
    \node [block, left of=evaluate, node distance=3cm] (update) {update model};
    \node [decision, below of=evaluate] (decide) {is best candidate better?};
    \node [block, below of=decide, node distance=3cm] (stop) {stop};
    % Draw edges
    \path [line] (init) -- (identify);
    \path [line] (identify) -- (evaluate);
    \path [line] (evaluate) -- (decide);
    \path [line] (decide) -| node [near start] {yes} (update);
    \path [line] (update) |- (identify);
    \path [line] (decide) -- node {no}(stop);
    \path [line,dashed] (expert) -- (init);
    \path [line,dashed] (system) -- (init);
    \path [line,dashed] (system) |- (evaluate);
\end{tikzpicture}

... где вместо, например, «блок» я мог бы написать «пользовательский узел» (или что-то, что я определил сам) и это бы отображалось таким же образом, на такой же диаграмме, с текстом внутри.

Большое спасибо

решение1

В TikZ есть много предопределенных символов. Тот, о котором вы спрашиваете, очень похож на signalсимвол в shapes.symbolsбиблиотеке (раздел 67.4 в документации). cloudТам также определен символ.

\documentclass[border=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.symbols}
\begin{document}
\begin{tikzpicture}[
node distance = 3cm, auto,
block/.style={signal, draw, signal to=south}]
\node [block] (init) {initialize model};
\node [cloud,draw, left of=init] (expert) {expert};
\end{tikzpicture}
\end{document}

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

решение2

Tikz picsотлично подходят для таких вещей. Они подробно описаны в разделе 18.2 руководства tikz (версия 3.0.1a).

Например, код:

\documentclass{article}
\usepackage{tikz}

\tikzset{
  pics/mynode/.style args={#1,#2,#3}{
     code={
       \draw (0,0) -- (1,-1) -- (2,0) -- (2,2) -- (0,2) -- (0,0);
       \node[#3] (#1) at (1,1) {#2};
     }
  }
}

\begin{document}

  \begin{tikzpicture}
      \draw (0,0) pic{mynode={A, Hi, blue}};
      \draw (0,3) pic{mynode={B, Hello, red}};
      \draw (2,1.5) pic{mynode={C, Bye,}};
      \draw[thick, blue] (A)--(B)--(C)--(A);
  \end{tikzpicture}

\end{document}

создает диаграмму:

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

Я определил ваш "пользовательский узел" как pic mynode. Он принимает три аргумента: метку узла, текст узла и стиль для узла (все три аргумента должны быть указаны, но их можно оставить пустыми). pic рисует вашу пользовательскую форму и, как часть этого, помещает "реальный" узел внутри нее, на который затем можно ссылаться, используя метку узла, как в MWE.

решение3

Определение новых форм узлов не обязательно является базовым вопросом. Но в этом случае можно немного схитрить, используя форму single arrowиз shapes.arrowsбиблиотеки.

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

\documentclass[border=5mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.arrows}

\tikzset{
  mycustomnode/.style={
    draw,
    single arrow,
    single arrow head extend=0,
    shape border uses incircle,
    shape border rotate=-90,
  }
}

\begin{document}
\begin{tikzpicture}
\node [mycustomnode] {};
\node [mycustomnode] at (2,0) {abc};
\end{tikzpicture}
\end{document}

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