![TikZ 3.0---`pic` 的多個參數](https://rvso.com/image/286982/TikZ%203.0---%60pic%60%20%E7%9A%84%E5%A4%9A%E5%80%8B%E5%8F%83%E6%95%B8.png)
如何為 提供多個參數pic
?
giraffe
包含兩個顏色參數,#1
和#2
。我希望能夠將這些提供為giraffe={pink, yellow}
或giraffe={colorA=pink, colorB=yellow}
。語法並不重要。
\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=#1, width=15ex]{test1}
\umlbasicstate[x=1.5, y=0, fill=#2, 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={pink, yellow}}; % below final
\draw pic[above of = initial] {giraffe={blue, green}}; % above initial
\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}
\end{tikzpicture}
\end{document}
在手冊中,pic
是在18.3 定義新的圖片類型。這與另一個問題有關,其中有人建議 pic
作為答案。
我也檢查過這個問題,但我很難將其應用於我的問題pic
。
答案1
當命令有點複雜時,您想要使用通用語法
\tikzset{pics/giraffe/.style={code={....with #1...}}}
它/.style
是處理程序機制的一部分pgfkeys
,它有一個直接的類似物,帶有兩個參數,即/.style 2 args
。所以你可以寫
\tikzset{pics/giraffe/.style 2 args={code={
\umlbasicstate[x=-1.5,y=0,fill=#1,width=15ex]{test1}
\umlbasicstate[x=-1.5,y=0,fill=#2,width=15ex]{test2}}}}
被稱為\draw pic {giraffe={pink}{yellow}}
.類似地/.style n args={5}{code={...}}
,將定義一個具有 5 個參數的版本。
但是,還有其他可用的語法。如果這只是您設定的顏色那麼您可能想寫
\draw pic {giraffe=pink/yellow};
這可以透過以下方式實現
\tikzset{
pics/giraffe/.style args={#1/#2}{
code = {
\umlbasicstate[x=-1.5, y=0, fill=#1, width=15ex]{test1}
\umlbasicstate[x=1.5, y=0, fill=#2, width=15ex]{test2}
}}}
第一個參數/.style args
提供了一個模式,用於提取要在程式碼中使用的參數。
在您的範例中,這將為您提供:
\documentclass[border=3mm]{standalone}
\usepackage{tikz}
\usepackage{tikz-uml}
\usetikzlibrary{arrows,positioning,shapes}
\begin{document}
\tikzset{
pics/giraffe/.style args={#1/#2}{
code = {
\umlbasicstate[x=-1.5, y=0, fill=#1, width=15ex]{test1}
\umlbasicstate[x=1.5, y=0, fill=#2, 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=pink/yellow}; % below final
\draw pic[above of = initial] {giraffe=blue/green}; % above initial
\umltrans{initial}{a}
\umltrans{a}{b}
\umltrans{b}{c}
\umltrans{c}{final}
\end{tikzpicture}
\end{document}