TikZ 3.0 --- Mehrere Argumente für „pic“

TikZ 3.0 --- Mehrere Argumente für „pic“

Wie gebe ich mehrere Argumente für an pic?

giraffeenthält zwei Argumente für Farben #1und . Ich möchte diese als oder #2bereitstellen können . Die Syntax ist nicht wirklich wichtig.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}

Im Handbuch picstehtAbschnitt 18.3 Neue Bildtypen definieren. Dies steht im Zusammenhang mit einer anderen Frage, bei der jemandempfohlen picals Antwort.

Ich habe auch überprüftdiese Frage, aber ich habe Schwierigkeiten, es auf mein Problem mit anzuwenden pic.

Antwort1

Wenn der Befehl etwas komplizierter ist, verwenden Sie die allgemeine Syntax

\tikzset{pics/giraffe/.style={code={....with #1...}}}

Das /.styleist Teil des pgfkeysHandler-Mechanismus und hat ein direktes Analogon mit zwei Argumenten, nämlich /.style 2 args. Sie könnten also schreiben

\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}}}}

aufgerufen werden als \draw pic {giraffe={pink}{yellow}}. Ähnlich gibt es /.style n args={5}{code={...}}das, das eine Version mit 5 Argumenten definiert.

Es gibt jedoch auch andere Syntaxen. Wenn Sie nur die Farben festlegen möchten, schreiben Sie am besten

\draw pic {giraffe=pink/yellow};

Dies kann erreicht werden mit

\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}
    }}}

Das erste Argument /.style argsstellt ein Muster bereit, das zum Extrahieren der im Code zu verwendenden Argumente verwendet wird.

In Ihrem Beispiel erhalten Sie dadurch:

Beispielausgabe

\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}

verwandte Informationen