`\IfSubStr` in einem Tikz-Stil

`\IfSubStr` in einem Tikz-Stil

Ich versuche, ein zu erstellen, picdas ein Argument akzeptiert, das kodiert, welche Elemente in picin 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 IfSubStrdie Füllung nicht. Wie kann ich die Fülleigenschaft von Parametern abhängig machen?

Antwort1

Das Hauptproblem besteht darin, dass Sie keinen Code wie \IfSubStrin einem Stil soder in einem Wertschlüssel haben können fill.

Ich schlage vor, sich selbst in einen Schlüssel umzuwandeln s, der Code verarbeitet und \tikzsetEinstellungen aufruft fill, aber ich bezweifle, dass das \IfSubStrwirklich 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 twird 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}

Bildbeschreibung hier eingeben

verwandte Informationen