So zeichnen Sie in TikzPicture innerhalb eines Knotens mit einer Kante

So zeichnen Sie in TikzPicture innerhalb eines Knotens mit einer Kante

Bildbeschreibung hier eingeben

Wie kann ich solche Grafiken mit zeichnen tikzpicture?

Antwort1

Definition picsnach Kapitel 18 destikzHandbuch ist definitiv der richtige Weg. Der folgende Code definiert zwei Bilder 2boxund 3boxdie Boxen, die jeweils zwei oder drei Kreise oder Quadrate enthalten. Das 2boxist etwas einfacher, da es nur vier Argumente benötigt: die Beschriftungen in den beiden Kreisen und die Beschriftungen über und unter den Pfeilen. Damit können Sie die obere Box zeichnen mit

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

Es picwerden die folgenden nützlichen Knoten definiert:

  • rafür die gesamte Kiste
  • ra-rfür den ersten Kreis
  • ra-afür den zweiten Kreis

Dies dient teilweise zum Zeichnen des Bildes und teilweise zum späteren Zeichnen der Pfeile. Das 3boxBild ist ähnlich, benötigt aber sieben Argumente: die drei Knotenbeschriftungen und die vier Beschriftungen über und unter den beiden Pfeilen.

Wenn diese vorhanden sind, müssen Sie nur noch die Kästen zeichnen, und verwenden 2boxund 3boxdann die Kanten zeichnen. Zuerst dachte ich daran, die positioningBibliothek zum Platzieren der Knoten zu verwenden, aber leider funktionieren picsund positioningnicht gut zusammen, also habe ich alles von Hand platziert, um Folgendes zu erstellen:

Bildbeschreibung hier eingeben

Um die Änderung zu erleichtern, habe ich eine großzügige Portion Styling angewendet. Hier ist der vollständige Code:

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

Wie Sie sehen können, sind die Definitionen von 2boxund 3boxnur kleine Teile von ziemlich ähnlichentikzCode. Innerhalb der Definition picswerden die relativen Koordinaten verwendet. Die \deltaBeschriftungen habe ich als Übung stehen gelassen.

verwandte Informationen