TikZ-UML を使用して状態図のコンポーネントを再利用できるようにしたいと思います。 内部に 2 つのコンポーネントを含む を作成しsavebox
、\giraffe
これらを最初のノードの上と最後のノードの下に配置したいと思います。 コードでは必要な結果が得られないようです。 理由をご存知ですか?
\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}
注: 上記のコードはコンパイル可能ですが、tikz-uml
非標準パッケージです。以下からダウンロードできます。ここ。
答え1
うまくいけば、これはあなたのニーズに適応できるでしょう。ここでの鍵は、別 tikzpicture
コンポーネントを配置するボックスを保管します。
\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}
答え2
を使用するとTiKZ 3.0
、 を宣言して使用できますpics
。 はpic
、ダイアグラム内で何度も再利用できる短い画像です。 次のコードは、giraffe
としてを使用する方法を示しています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}
ご覧のとおり、結果は Steven のソリューションとは異なりますが、それを実行する位置決めシステムがわかりません。構文 (非推奨だと思います)tikz-uml
を置き換えようとしましたが、コンポーネントの内部構成も変更されました。below of=
below = of
umlbasicstate