Gibt es eine Bibliothek zum Zeichnen von Zustandsbaumstrukturen in TikZ?

Gibt es eine Bibliothek zum Zeichnen von Zustandsbaumstrukturen in TikZ?

State tree structure (STS)s sind spezielle Diagrammtypen und gehören zur state charts-Familie.

Ein typisches Beispiel STSkönnte wie folgt dargestellt werden:

Bildbeschreibung hier eingeben

Die Anzahl der Zweigstellen, Staatsbezeichnungen und Kreuz- bzw. Gewerkschaftssymbole kann je nach Absicht des Designers in einer beliebigen Struktur gestaltet werden.

Vielleicht tikz-treeswä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 treeum 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 treelegt den Stil fest. Der Rest erfolgt automatisch, daher ist kein Bedarf für no edgeusw. vorhanden.

Dies führt zu folgendem Ergebnis:

Staatsbaum

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}

Bildbeschreibung hier eingeben

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}

Bildbeschreibung hier eingeben

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 calcBibliothek 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.

Das Ergebnis ist folgendes: Ergebnis

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.

verwandte Informationen