![TikZ 3.0 --- Vários argumentos para `pic`](https://rvso.com/image/286982/TikZ%203.0%20---%20V%C3%A1rios%20argumentos%20para%20%60pic%60.png)
Como forneço vários argumentos para pic
?
giraffe
contém dois argumentos para cores #1
e #2
. Eu gostaria de poder fornecê-los como giraffe={pink, yellow}
ou giraffe={colorA=pink, colorB=yellow}
. A sintaxe realmente não importa.
\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}
No manual, pic
está emSeção 18.3 Definindo novos tipos de imagens. Isto está relacionado com outra questão em que alguémsugerido pic
como resposta.
Eu também verifiqueiessa questão, mas estou tendo dificuldade em aplicá-lo ao meu problema com pic
.
Responder1
Quando o comando é um pouco mais complicado, você deseja usar a sintaxe geral
\tikzset{pics/giraffe/.style={code={....with #1...}}}
Faz /.style
parte do pgfkeys
mecanismo do manipulador e possui um análogo direto com dois argumentos, a saber /.style 2 args
. Então você poderia escrever
\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}}}}
ser chamado como \draw pic {giraffe={pink}{yellow}}
. Da mesma forma /.style n args={5}{code={...}}
, definirá uma versão com 5 argumentos.
No entanto, existem outras sintaxes disponíveis. Se forem apenas as cores que você está definindo, talvez você queira escrever
\draw pic {giraffe=pink/yellow};
Isto pode ser conseguido com
\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}
}}}
O primeiro argumento /.style args
fornece um padrão que é usado para extrair os argumentos a serem usados no código.
No seu exemplo, isso lhe dá:
\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}