Antwort1
Definition pics
nach Kapitel 18 destikzHandbuch ist definitiv der richtige Weg. Der folgende Code definiert zwei Bilder 2box
und 3box
die Boxen, die jeweils zwei oder drei Kreise oder Quadrate enthalten. Das 2box
ist 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 pic
werden die folgenden nützlichen Knoten definiert:
ra
für die gesamte Kistera-r
für den ersten Kreisra-a
für den zweiten Kreis
Dies dient teilweise zum Zeichnen des Bildes und teilweise zum späteren Zeichnen der Pfeile. Das 3box
Bild 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 2box
und 3box
dann die Kanten zeichnen. Zuerst dachte ich daran, die positioning
Bibliothek zum Platzieren der Knoten zu verwenden, aber leider funktionieren pics
und positioning
nicht gut zusammen, also habe ich alles von Hand platziert, um Folgendes zu erstellen:
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 2box
und 3box
nur kleine Teile von ziemlich ähnlichentikzCode. Innerhalb der Definition pics
werden die relativen Koordinaten verwendet. Die \delta
Beschriftungen habe ich als Übung stehen gelassen.