\usebox mit tikz-uml

\usebox mit tikz-uml

Ich möchte Komponenten in einem Zustandsdiagramm mit TikZ-UML wiederverwenden können. Ich habe einen saveboxKnoten \giraffemit zwei Komponenten darin erstellt und möchte diese über dem Anfangsknoten und unter dem Endknoten platzieren. Der Code scheint nicht das gewünschte Ergebnis zu liefern. Irgendeine Idee, warum?

\documentclass{report}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\begin{tikzpicture}[auto]

\newsavebox{\giraffe}
\savebox{\giraffe}{
  \umlbasicstate[x=0, y=0, fill=pink, width=15ex]{test1}
  \umlbasicstate[x=3, y=0, fill=yellow, width=15ex]{test2}
}

\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\node [below of=final] {\usebox{\giraffe}};          % below final
\node [above of=initial] {\usebox{\giraffe}};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}
\end{document}

Hinweis: Der obige Code wird kompiliert, tikz-umlist aber kein Standardpaket. Er kann heruntergeladen werden vonHier.

Antwort1

Hoffentlich kann dies an Ihre Bedürfnisse angepasst werden. Der Schlüssel hier ist die Verwendung einesseparate tikzpictureum die Schachtel aufzubewahren, in der Sie die Komponenten platzieren.

\documentclass{report}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\newsavebox{\giraffe}
\savebox{\giraffe}{%
\begin{tikzpicture}[auto]
  \umlbasicstate[x=0, y=0, fill=pink, width=15ex]{test1}
  \umlbasicstate[x=3, y=0, fill=yellow, width=15ex]{test2}
\end{tikzpicture}%
}

\begin{tikzpicture}[auto]
\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\node [below of=final] {\usebox{\giraffe}};          % below final
\node [above of=initial] {\usebox{\giraffe}};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Mit TiKZ 3.0können Sie deklarieren und verwenden pics. Ein picist ein kurzes Bild, das Sie in Ihrem Diagramm mehrmals wiederverwenden können. Der nächste Code zeigt, wie man es giraffeals verwendet pic.

\documentclass[border=3mm]{standalone}

\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}

\tikzset{
    giraffe/.pic={
        \umlbasicstate[x=-1.5, y=0, fill=pink, width=15ex]{test1}
        \umlbasicstate[x=1.5, y=0, fill=yellow, width=15ex]{test2}
    }%
}


\begin{tikzpicture}[auto]
\umlstateinitial[x=0, y=11, name=initial]
\umlbasicstate[x=0, y=9, name=a, fill=white, width=15ex]{a}
\umlbasicstate[x=0, y=6, name=b, fill=white, width=15ex]{b}
\umlbasicstate[x=0, y=3, name=c, fill=white, width=15ex]{c}
\umlstatefinal[x=0, y=1, name=final]

\draw pic[below of = final] {giraffe};          % below final
\draw pic[above of =  initial] {giraffe};        % above initial

\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}

\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Wie Sie sehen, unterscheidet sich das Ergebnis von Stevens Lösung, aber ich kenne kein tikz-umlPositionierungssystem, um dies zu erreichen. Ich habe versucht, below of=die Syntax (ich glaube, sie ist veraltet) durch zu ersetzen below = of, aber dadurch wurde auch die interne Zusammensetzung der Komponenten geändert umlbasicstate.

verwandte Informationen