Ich möchte Komponenten in einem Zustandsdiagramm mit TikZ-UML wiederverwenden können. Ich habe einen savebox
Knoten \giraffe
mit 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-uml
ist 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 tikzpicture
um 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}
Antwort2
Mit TiKZ 3.0
können Sie deklarieren und verwenden pics
. Ein pic
ist ein kurzes Bild, das Sie in Ihrem Diagramm mehrmals wiederverwenden können. Der nächste Code zeigt, wie man es giraffe
als 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}
Wie Sie sehen, unterscheidet sich das Ergebnis von Stevens Lösung, aber ich kenne kein tikz-uml
Positionierungssystem, 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
.