tikz 스타일의 `\IfSubStr`

tikz 스타일의 `\IfSubStr`

다른 색상으로 그려야 하는 pic항목을 인코딩하는 인수를 허용하는 를 만들려고 합니다 . pic그러나 문제는 pic; 그러므로 나는 MNWE를 생각해 냈습니다.

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

IfSubStr분명히 tikz는 충전물 을 좋아하지 않습니다 . 채우기 속성이 매개변수에 종속되도록 하려면 어떻게 해야 합니까?

답변1

주요 문제는 \IfSubStr스타일 s이나 값 키와 같은 코드를 가질 수 없다는 것입니다 fill.

코드를 처리하고 설정을 s호출하는 키로 전환하는 것이 좋습니다 . 하지만 이것이 실제로 원하는 것인지 의심됩니다 .\tikzsetfill\IfSubStr

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

Expl3의 패키지l3clist쉼표 목록 항목을 확인하기 위한 인프라를 제공합니다.

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

채우기 색상 매핑을 구현할 수도 있습니다.

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

아마도 선택 키를 선호할 것입니다.

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

그러나 선택 값에 (잘못) 쉼표가 포함되어 있으면 선택 키가 이상하게 동작합니다.
예제에서 t-key는 에 대한 선택 하위 키를 정의하는 데 사용됩니다 s.
문제는 이것을 -environment와 같은 로컬 범위 외부에서 사용할 수 없으며 이미 정의된 선택 하위 키가 재정의되지 tikzpicture않으므로 -key에 대한 호출로 로컬 범위를 중첩 할 수 없다는 것입니다.t

답변2

다음과 같이 할 수 있지만 이에 대한 더 나은 해결책이 있을 수 있으므로 실제로 수행하려는 작업을 설명할 수 있다면 더 좋을 것입니다.

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

여기에 이미지 설명을 입력하세요

관련 정보