TikZ 3.0 --- Vários argumentos para `pic`

TikZ 3.0 --- Vários argumentos para `pic`

Como forneço vários argumentos para pic?

giraffecontém dois argumentos para cores #1e #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, picestá emSeção 18.3 Definindo novos tipos de imagens. Isto está relacionado com outra questão em que alguémsugerido piccomo 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 /.styleparte do pgfkeysmecanismo 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 argsfornece um padrão que é usado para extrair os argumentos a serem usados ​​no código.

No seu exemplo, isso lhe dá:

Exemplo de saí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}

informação relacionada