tikz-uml이 포함된 \usebox

tikz-uml이 포함된 \usebox

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. A는 pic다이어그램에서 여러 번 재사용할 수 있는 짧은 그림입니다. 다음 코드 giraffepic.

\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보시다시피 결과는 Steven의 솔루션과 다르지만 이를 수행할 위치 지정 시스템을 모르겠습니다 . below of=구문(더 이상 사용되지 않는 것 같습니다)을 대체하려고 시도했지만 구성 요소 below = of의 내부 구성도 수정되었습니다 umlbasicstate.

관련 정보