
State tree structure (STS)
s sind spezielle Diagrammtypen und gehören zur state chart
s-Familie.
Ein typisches Beispiel STS
könnte wie folgt dargestellt werden:
Die Anzahl der Zweigstellen, Staatsbezeichnungen und Kreuz- bzw. Gewerkschaftssymbole kann je nach Absicht des Designers in einer beliebigen Struktur gestaltet werden.
Vielleicht tikz-trees
wäre das eine Annäherung, aber als ich es überprüft habe, hatte ich nicht das Gefühl, dass es im Allgemeinen in der Lage ist, etwas wie die Abbildung zu erzeugen.
Gibt es für bestimmte Dinge eine spezialisierte Bibliothek TikZ
?!
Antwort1
Hier ist eine Version, die einen Forest-Stil definiert, state tree
um Bäume dieses Typs zu formatieren. Die Annahmen, basierend auf dem Beispiel, sind, dass
- Kinder sollten gleichmäßig verteilt werden;
- das erste und das letzte Kind sollten gleich weit vom Elternteil entfernt sein;
- Kanten sollten nur für das erste und letzte Kind gezeichnet werden;
- Der Inhalt der Knoten sollte im Mathematikmodus gesetzt werden.
Der Stil kann geändert werden, wenn eine oder mehrere dieser Annahmen geändert werden müssen.
Hier ist der Code für den Baum, der eine leichte Anpassung vonIgnasis:
\begin{forest}
state tree,
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}]
[x_{112}]
]
[\times]
[x_{12}
[x_{121}]
[\dot{\cup}]
[x_{122}]
]
]
[\dot{\cup}]
[x_2]
[\dot{\cup}]
[x_3
[x_{31}]
[\dot{\cup}]
[x_{32}]
[\dot{\cup}]
[x_{33}]
]
]
\end{forest}
state tree
legt den Stil fest. Der Rest erfolgt automatisch, daher ist kein Bedarf für no edge
usw. vorhanden.
Dies führt zu folgendem Ergebnis:
Vollständiger Code:
\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage{forest}
% ateb: addaswyd o ateb Ignasi: https://tex.stackexchange.com/a/351690/
\forestset{%
state tree/.style={%
for tree={
math content,
parent anchor=children,
child anchor=parent,
tier/.option=level,
calign=center,
},
where={>On>{n children}{2}}{
for nodewalk={
filter={children}{>On=!On=!&{n}{1}{n'}{1}}
}{no edge}
}{},
before computing xy={
where={isodd(n_children)}{
tempdima/.process={OOOw3+d{!n=1.s}{!n'=1.s}{n children}{(##2-##1)/(##3-1)}},
tempdimb/.option={!n=1.s},
for children={
s/.process={RROw3+d{tempdima}{tempdimb}{n}{##2+(##1*(##3-1))}}
},
}{},
},
},
}
\begin{document}
\begin{forest}
state tree,
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}]
[x_{112}]
]
[\times]
[x_{12}
[x_{121}]
[\dot{\cup}]
[x_{122}]
]
]
[\dot{\cup}]
[x_2]
[\dot{\cup}]
[x_3
[x_{31}]
[\dot{\cup}]
[x_{32}]
[\dot{\cup}]
[x_{33}]
]
]
\end{forest}
\end{document}
Antwort2
Sie könnten es auch mit versuchen forest
, obwohl ich nicht weiß, wie man einige untergeordnete Elemente richtig verteilt:
\documentclass [multi=forest, border=2mm]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}, no edge]
[x_{112}]]
[\times, no edge]
[x_{12}
[x_{121}]
[\dot{\cup}, no edge]
[x_{122}]]]
[\dot{\cup}, no edge]
[x_2, no edge]
[\dot{\cup}, no edge]
[x_3
[x_{31}]
[\dot{\cup}, no edge]
[x_{32}, no edge]
[\dot{\cup}, no edge]
[x_{33}]]]
\end{forest}
\end{document}
Update: Mit dem Vorschlag von JLDiaz sieht das Ergebnis besser aus, immer noch nicht perfekt, aber besser.
\documentclass [multi=forest, border=2mm]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={math content}
[x_0
[x_1
[x_{11}
[x_{111}]
[\dot{\cup}, no edge]
[x_{112}]]
[\null, no edge] %<-------------
[\times, no edge]
[x_{12}
[x_{121}]
[\dot{\cup}, no edge]
[x_{122}]]]
[\null, no edge] %<-------------
[\dot{\cup}, no edge]
[x_2, no edge]
[\dot{\cup}, no edge]
[x_3
[x_{31}]
[\dot{\cup}, no edge]
[x_{32}, no edge]
[\dot{\cup}, no edge]
[x_{33}]]]
\end{forest}
\end{document}
Antwort3
Ein erster Versuch wäre der folgende. Ich habe nicht viel Erfahrung im Zeichnen von Bäumen, daher gibt es vielleicht einen besseren Weg, dies zu tun. Der entscheidende Punkt ist jedoch die Platzierung der Knoten zwischen den untergeordneten Elementen, und die calc
Bibliothek ist dafür perfekt:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\rootname{root}
\newcommand{\stnode}[3]{\node at ($(#1)!0.5!(#2)$) { #3 }}
\newcommand{\stnodec}[3]{\node at ($(#1.center)!0.5!(#2.center)$) { #3 }}
\newcommand{\stnoderootc}[3]{\node at ($(\rootname-#1.center)!0.5!(\rootname-#2.center)$) { #3 }}
\begin{document}
\begin{tikzpicture}
[
level 1/.style = {sibling distance = 3cm},
level 2/.style = {sibling distance = 2cm}
]
\node (root) { $x_0$ }
child { node { $x_1$ }
child { node { $x_3$ } }
child { node { $x_4$ } }
}
child { node { $x_2$ }
child { node { $x_5$ } }
child { node { $x_6$ } }
}
;
place the annotation nodes between the children
\stnode{root-1.center}{root-2.center}{$\times$};
\stnodec{root-1-1}{root-1-2}{$\times$};
\stnoderootc{2-1}{2-2}{$\times$};
\end{tikzpicture}
\end{document}
Sie können eines der drei Makros ( \stnode
, \stnodec
(Ceingeben), \stnoderootc
(automatischer Stammknoten, Mitte)), um die Anmerkungsknoten zu platzieren. Der Stammname muss neu definiert werden, um den tatsächlichen Namen des Stammknotens darzustellen. Für maximale Flexibilität verwenden Sie einfach \stnode
.
Die Argumente sind #1: erster Knoten, #2: zweiter Knoten, #3: Knotentext.
Natürlich sollten die jeweiligen Knoten die gleiche Y-Platzierung haben. Wenn dies nicht der Fall ist, funktioniert es zwar auch, sieht aber seltsam aus.