![TikZ 3.0---Múltiples argumentos para "pic"](https://rvso.com/image/286982/TikZ%203.0---M%C3%BAltiples%20argumentos%20para%20%22pic%22.png)
¿Cómo proporciono múltiples argumentos a favor pic
?
giraffe
contiene dos argumentos para los colores #1
y #2
. Me gustaría poder proporcionarlos como giraffe={pink, yellow}
o giraffe={colorA=pink, colorB=yellow}
. La sintaxis realmente no 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}
En el manual,pic
está enSección 18.3 Definición de nuevos tipos de imágenes. Esto está relacionado con otra pregunta en la que alguiensugirió pic
como respuesta.
También lo he comprobadoesta pregunta, pero tengo dificultades para aplicarlo a mi problema con pic
.
Respuesta1
Cuando el comando es un poco más complicado, entonces desea utilizar la sintaxis general.
\tikzset{pics/giraffe/.style={code={....with #1...}}}
Es /.style
parte del pgfkeys
mecanismo del controlador y tiene un análogo directo con dos argumentos, a saber /.style 2 args
. Entonces podrías escribir
\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 llamado como \draw pic {giraffe={pink}{yellow}}
. De manera similar existe /.style n args={5}{code={...}}
que definirá una versión con 5 argumentos.
Sin embargo, hay otras sintaxis disponibles. Si solo está configurando los colores, entonces tal vez le gustaría escribir
\draw pic {giraffe=pink/yellow};
Esto se puede lograr con
\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}
}}}
El primer argumento /.style args
proporciona un patrón que se utiliza para extraer los argumentos que se utilizarán en el código.
En tu ejemplo esto te da:
\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}