TikZ 3.0---Несколько аргументов для `pic`

TikZ 3.0---Несколько аргументов для `pic`

Как мне предоставить несколько аргументов для 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}

Связанный контент