Ich versuche, ein zu erstellen, pic
das ein Argument akzeptiert, das kodiert, welche Elemente in pic
in einer anderen Farbe gezeichnet werden sollen. Das Problem scheint jedoch nicht beim zu liegen pic
; daher habe ich mir das MNWE ausgedacht:
\documentclass{article}
\usepackage{tikz,xstring}
\begin{document}
\tikzset{t/.style={
s/.style={fill=\IfSubStr{##1}{#1}{black}{}}
}}
\begin{tikzpicture}[t={a,b}]
\node[s={a}] {};
\node[s={b}] {};
\node[s={c}] {};
\end{tikzpicture}
\end{document}
anscheinend gefällt Tikz IfSubStr
die Füllung nicht. Wie kann ich die Fülleigenschaft von Parametern abhängig machen?
Antwort1
Das Hauptproblem besteht darin, dass Sie keinen Code wie \IfSubStr
in einem Stil s
oder in einem Wertschlüssel haben können fill
.
Ich schlage vor, sich selbst in einen Schlüssel umzuwandeln s
, der Code verarbeitet und \tikzset
Einstellungen aufruft fill
, aber ich bezweifle, dass das \IfSubStr
wirklich das ist, was Sie wollen:
\documentclass{article}
\usepackage{tikz,xstring}
\begin{document}
\tikzset{t/.style={
s/.code={\IfSubStr{#1}{##1}{\tikzset{fill=green}}{\tikzset{fill=red}}}
}}
\begin{tikzpicture}[t={a,b}]
\node[s={a,}] at (0,0) {`a,' is in `a,b'};
\node[s={,}] at (0,1) {`,' is in `a,b'};
\node[s={,b}] at (0,2) {`,b' is in `a,b'};
\node[s={a,b}] at (0,3) {`a,b' is in `a,b'};
\node[s={a}] at (0,4) {`a' is in `a,b'};
\node[s={b}] at (0,5) {`b' is in `a,b'};
\node[s={c}] at (0,6) {`c' is not in `a,b'};
\end{tikzpicture}
\end{document}
Expl3s Paketl3clistbietet Infrastruktur zum Überprüfen von Elementen von Kommalisten:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\ExplSyntaxOn
\tikzset{t/.style={
s/.code={\clist_if_in:nnTF{#1}{##1}{\tikzset{fill=green}}{\tikzset{fill=red}}}
}}
\ExplSyntaxOff
\begin{tikzpicture}[t={a,b}]
\node[s={a,}] at (0,0) {`a,' is not an element of the list `a,b'};
\node[s={,}] at (0,1) {`,' is not an element of the list `a,b'};
\node[s={,b}] at (0,2) {`,b' is not an element of the list `a,b'};
\node[s={a,b}] at (0,3) {`a,b' is not an element of the list `a,b'};
\node[s={a}] at (0,4) {`a' is an element of the list `a,b'};
\node[s={b}] at (0,5) {`b' is an element of the list `a,b'};
\node[s={c}] at (0,6) {`c' is not an element of the list `a,b'};
\end{tikzpicture}
\end{document}
Sie können auch die Zuordnung von Füllfarben implementieren:
\documentclass{article}
\usepackage{tikz}
\ExplSyntaxOn
\tl_new:N \l__mymodule_scratch_tl
\cs_new:Nn \__mymodule_map_kvpair:Nnnn {\tl_put_right:Nn #1 {{#3}{\tikzset{#2#4}}}}
\cs_new:Nn \__mymodule_i_iii_ii:nnn {#1{#3}{#2}}
\cs_new:Nn \__mymodule_tl_braces:nn {#1 {{#2}}}
\cs_generate_variant:Nn \__mymodule_tl_braces:nn { nV }
\tikzset{
t/.code~2~args={
\group_begin:
\tl_set:Nn \l__mymodule_scratch_tl { \tl_clear:N \l__mymodule_scratch_tl }
\clist_map_tokens:nn {#1} {
\tl_put_right:Nn \l__mymodule_scratch_tl {\__mymodule_map_kvpair:Nnnn \l__mymodule_scratch_tl {fill=} }
\__mymodule_i_iii_ii:nnn { \tl_map_tokens:nn } { \__mymodule_tl_braces:nn { \tl_put_right:Nn \l__mymodule_scratch_tl } }
}
\tl_use:N \l__mymodule_scratch_tl
\__mymodule_tl_braces:nV {\tl_set:Nn\l__mymodule_scratch_tl} \l__mymodule_scratch_tl
\tl_put_left:Nn \l__mymodule_scratch_tl { \str_case:nnF {##1} }
\tl_put_right:Nn \l__mymodule_scratch_tl {\tikzset{fill=#2} }
\__mymodule_tl_braces:nV {\tl_set:Nn\l__mymodule_scratch_tl} \l__mymodule_scratch_tl
\tl_put_left:Nn \l__mymodule_scratch_tl { s/.code= }
\__mymodule_tl_braces:nV {\tl_set:Nn\l__mymodule_scratch_tl} \l__mymodule_scratch_tl
\tl_put_left:Nn \l__mymodule_scratch_tl {\group_end: \tikzset }
\tl_use:N \l__mymodule_scratch_tl
},
t={{a}{cyan},{c}{green}}{none},
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\node[s={a,}] at (0,0) {`a,' is not mapped, thus fill=none is used.};
\node[s={,}] at (0,1) {`,' is not mapped, thus fill=none is used.};
\node[s={,b}] at (0,2) {`,b' is not mapped, thus fill=none is used.};
\node[s={a,b}] at (0,3) {`a,b' is not mapped, thus fill=none is used.};
\node[s={a}] at (0,4) {`a' is mapped to fill=cyan.};
\node[s={b}] at (0,5) {`b' is not mapped, thus fill=none is used.};
\node[s={c}] at (0,6) {`c' is mapped to fill=green.};
\end{tikzpicture}
\vfill
\begin{tikzpicture}[t={{a}{green},{b}{blue}}{none}]
\node[s={a,}] at (0,0) {`a,' is not mapped, thus fill=none is used.};
\node[s={,}] at (0,1) {`,' is not mapped, thus fill=none is used.};
\node[s={,b}] at (0,2) {`,b' is not mapped, thus fill=none is used.};
\node[s={a,b}] at (0,3) {`a,b' is not mapped, thus fill=none is used.};
\node[s={a}] at (0,4) {`a' is mapped to fill=green.};
\node[s={b}] at (0,5) {`b' is mapped to fill=blue.};
\node[s={c}] at (0,6) {`c' is not mapped, thus fill=none is used.};
\end{tikzpicture}
\vfill
\begin{tikzpicture}[t={{a}{orange},{b}{green},{c}{cyan}}{red}]
\node[s={a,}] at (0,0) {`a,' is not mapped, thus fill=red is used.};
\node[s={,}] at (0,1) {`,' is not mapped, thus fill=red is used.};
\node[s={,b}] at (0,2) {`,b' is not mapped, thus fill=red is used.};
\node[s={a,b}] at (0,3) {`a,b' is not mapped, thus fill=red is used.};
\node[s={a}] at (0,4) {`a' is mapped to fill=orange.};
\node[s={b}] at (0,5) {`b' is mapped to fill=green.};
\node[s={c}] at (0,6) {`c' is mapped to fill=cyan.};
\end{tikzpicture}
\vfill
\end{document}
Wahrscheinlich bevorzugen Sie Auswahlschlüssel:
\documentclass{article}
\usepackage{tikz}
\tikzset{
/utils/exec=\newcommand*\codephrase{.code},
s/.is choice,
s/.unknown/.code={\tikzset{fill=none}},
t/MyForbiddenPath/.unknown/.code={%
\tikzset{s/\ifx\pgfkeyscurrentname\codephrase .unknown\else\pgfkeyscurrentname\fi/.code={\tikzset{fill=#1}}}%
},
t/.code={\tikzset{t/MyForbiddenPath/.cd, #1}}
}
\begin{document}
\begin{tikzpicture}[t={a=orange,b=green,c=cyan,.unknown=red}]
\node[s=a] at (0,0) {`a' is mapped to fill=orange.};
\node[s=b] at (0,1) {`b' is mapped to fill=green.};
\node[s=c] at (0,2) {`c' is mapped to fill=cyan.};
\node[s=d] at (0,3) {`d' is not mapped, thus mapping to default .unknown=red.};
\end{tikzpicture}
\end{document}
Auswahlschlüssel verhalten sich jedoch seltsam, wenn der Auswahlwert (fälschlicherweise) ein Komma enthält.
Im Beispiel t
wird der -Schlüssel zum Definieren der Auswahlunterschlüssel für verwendet s
.
Das Problem ist, dass Sie dies nicht außerhalb eines lokalen Bereichs wie einer tikzpicture
-Umgebung verwenden können und Sie lokale Bereiche nicht mit Aufrufen des t
-Schlüssels verschachteln können, da bereits definierte Auswahlunterschlüssel nicht überschrieben werden.
Antwort2
Sie könnten etwa Folgendes tun, es wäre aber besser, wenn Sie erklären würden, was Sie wirklich versuchen, da es hierfür möglicherweise eine bessere Lösung gibt.
\documentclass[border=10pt]{standalone}
\usepackage{tikz, xstring}
\colorlet{mycolor}{black}
\def\mycolorlist{}
\begin{document}
\tikzset{
t/.code={\def\mycolorlist{#1}},
s/.code={
\IfSubStr{\mycolorlist}{#1}{
\colorlet{mycolor}{black}
}{
\colorlet{mycolor}{red}
}
\tikzset{fill=mycolor}
}
}
\begin{tikzpicture}[t={a,b}]
\node[s={a}] at (0,0) {};
\node[s={b}] at (1,0) {};
\node[s={c}] at (2,0) {};
\end{tikzpicture}
\end{document}