![TikZ 3.0 --- Mehrere Argumente für „pic“](https://rvso.com/image/286982/TikZ%203.0%20---%20Mehrere%20Argumente%20f%C3%BCr%20%E2%80%9Epic%E2%80%9C.png)
Wie gebe ich mehrere Argumente für an pic
?
giraffe
enthält zwei Argumente für Farben #1
und . Ich möchte diese als oder #2
bereitstellen 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 pic
stehtAbschnitt 18.3 Neue Bildtypen definieren. Dies steht im Zusammenhang mit einer anderen Frage, bei der jemandempfohlen pic
als 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 /.style
ist Teil des pgfkeys
Handler-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 args
stellt ein Muster bereit, das zum Extrahieren der im Code zu verwendenden Argumente verwendet wird.
In Ihrem Beispiel erhalten Sie dadurch:
\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}