エッジを使用して tikzpicture のノード内に描画する方法

エッジを使用して tikzpicture のノード内に描画する方法

ここに画像の説明を入力してください

どのようにすればこのようなグラフを描くことができますかtikzpicture?

答え1

pics第18章の定義ティックズ手動で行うのが間違いなく最善の方法です。以下のコードは、それぞれ2つまたは3つの円または四角形を含むボックスの2つの画像とを定義します2box3boxは、2box2つの円のラベルと矢印の上下のラベルの4つの引数だけを取るので、少し簡単です。これを使用して、上部のボックスを次のように描画できます。

\pic at (0,0) {2box={r,a,1{\mid}0,01}};

pic、次の便利なノードを定義します。

  • ra箱全体
  • ra-r最初のサークル
  • ra-a2番目の円

これは、一部は画像を描画するためであり、一部は後で矢印を描画するためです。pic は3box似ていますが、7 つの引数 (3 つのノード ラベルと、2 つの矢印の上下の 4 つのラベル) が必要です。

2boxこれらを配置したら、と を使用してボックスを描画し、エッジを描画するだけです3box。 最初はpositioningライブラリを使用してノードを配置しようと思いましたが、残念ながらpicsと はpositioningうまく連携しないため、すべてを手動で配置して次のように作成しました。

ここに画像の説明を入力してください

変更しやすくするために、スタイルを多めに適用しました。完全なコードは次のとおりです。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\tikzset{
  arrow/.style = {-{LaTeX}, thick},
  label/.style = {pos=0.4, font=\scriptsize},
  mynode/.style = {fill=white, inner sep=3pt, thick, draw=black},
  onode/.style = {circle, mynode},
  snode/.style = {rectangle, mynode},
  box/.style = {thick, fill=gray!50, draw=black, anchor=south west},
  pics/2box/.style args = {#1,#2,#3,#4}{% a,b,top,bot
    code = {
        \node[box, minimum width=2cm, minimum height=1cm](#1#2) at (0,0){};
        \node[onode] (#1#2-#1) at (0.4,0.5){#1};
        \node[onode] (#1#2-#2) at (1.6,0.5){#2};
        \draw[arrow](#1#2-#1) -- node[label,above]{$#3$}
                                 node[label,below]{$#4$} (#1#2-#2);
    }
  },
  pics/3box/.style args = {#1,#2,#3,#4,#5,#6,#7}{% a,b,c,top,bot,top,bot}
    code = {
        \node[box, minimum width=2cm, minimum height=2cm](#1#2#3) at (0,0){};
        \node[snode] (#1#2#2-#1) at (0.4,1.5){#1};
        \node[snode] (#1#2#2-#2) at (0.4,0.5){#2};
        \node[onode] (#1#2#2-#3) at (1.6,1){#3};
        \draw[arrow](#1#2#2-#1.east) to[out=20, in=135]
            node[label,above]{$#4$} node[label,below]{$#5$} (#1#2#2-#3);
        \draw[arrow](#1#2#2-#2.east) to[out=-20, in=225]
            node[label,above]{$#6$} node[label,below]{$#7$} (#1#2#2-#3);
    }
  },
}

\begin{document}

  \begin{tikzpicture}
    \pic at (0,9) {2box={r,a,1{\mid}0,01}};
    \pic at (0,6) {3box={b,q,m,1{\mid}0,02,2{\mid}0,02}};
    \pic at (1,4) {2box={q,b,1{\mid}0,03}};
    \pic at (0,2) {2box={e,p,1{\mid}2,04}};
    \pic at (0,0) {2box={q,e,1{\mid}0,05}};
    \draw[arrow] (ra.south)--(bqm.north);
    \draw[arrow] (bqm.south)--(qb.north);
    \draw[arrow] (bqm) to[out=250, in=120](ep);
    \draw[arrow] (ep.south)--(qe.north);
    \draw[arrow] (qe.south)--++(0,-0.5);
    \draw[thick](0.5,10.6) -- ++(0,-0.1)--++(1,0)--++(0,0.1);
    \draw[{LaTeX}-,thick](ra.north)--++(0,0.5);
    \draw[arrow,rounded corners]
    (2.5,4)--++(0,-0.3)--++(1,0)--++(0,6.65)--++(-2,0)--++(0,-0.35);
  \end{tikzpicture}

\end{document}

ご覧のとおり、との定義は、2boxかなり3box似たような小さな断片にすぎません。ティックズコード。内部では相対座標の定義が使用されています。ラベルは練習問題としてpics残しておきました。\delta

関連情報