私は、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}
どうやら、tikz は塗りつぶしの を好まないようですIfSubStr
。塗りつぶしプロパティをパラメータに依存させるにはどうすればよいですか?
答え1
主な問題は、\IfSubStr
スタイル内s
や値キー内にコードを含めることができないことですfill
。
私は、コードを処理し、設定をs
呼び出すキーに変えることを提案しますが、それが本当に必要なことかどうかは疑問です。\tikzset
fill
\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のパッケージ一覧カンマリストの項目をチェックするためのインフラストラクチャを提供します。
\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}
しかし、choice-keys は、choice-value に (誤って) カンマが含まれている場合、奇妙な動作をします。
例では、t
-key は の choice-sub-keys を定義するために使用されていますs
。
問題は、これを -environment のようなローカル スコープの外部で使用できずtikzpicture
、-key の呼び出しでローカル スコープをネストできないことですt
。これは、既に定義されている choice-sub-keys が上書きされないためです。
答え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}