我希望能夠使用 TikZ-UML 重複使用狀態圖中的元件。我創建了一個內部有兩個元件的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
. Apic
是一張簡短的圖片,您可以在圖表中重複使用它多次。下一個程式碼展示如何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}
如您所見,結果與史蒂文的解決方案不同,但我不知道tikz-uml
定位系統可以做到這一點。我嘗試用below of=
語法(我認為它已被棄用)替換,但它也修改了組件below = of
的內部組成。umlbasicstate