我如何提供多个参数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
作为答案。
我也检查过了这个问题,但我很难将它应用到我的问题上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}