我正在尝试创建一个pgf
键,该键将使用概述的方法实现具有从左到右条纹的多色节点这里。
不过,我想提供一种更方便的用法,也许是这样的:
\node[colorstripes={.3:yellow,.5:red,1.:blue}]{hello world};
将节点左侧的 30% 设为黄色,接下来的 20% 设为红色,右半部分设为蓝色。
为此,我尝试采用以下策略这里循环遍历某个pgf
键的值。但是,我并没有取得很大进展。以下是我目前尝试的方法:
\pgfkeys{
apply to key/.style n args={2}{@body loop/.code={#1},@body loop/.list/.expanded=\pgfkeysvalueof{#2}},
colorstripes/.initial = {},
}
\pgfkeys{
apply to key={%
($(path picture bounding box.north west)!#1!(path picture bounding box.south west)$)
rectangle
($(path picture bounding box.north east)!#1!(path picture bounding box.south east)$);
}{colorstripes}}
}
但是,我还不知道如何将参数拆分#1
为“宽度”和“颜色”部分,并且我还需要访问“最后”项来计算条纹的实际宽度。而且即使现在,TikZ 也不喜欢我的代码,因为它会抱怨Extra }
,所以我显然不明白我在这里做什么。
如有任何建议、解释或现成的解决方案,我们将不胜感激。
答案1
可能像这样吗?
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{calc}
\def\atchar{@}
\tikzset{%
background stripes/.style={%
path picture={%
\pgfnodealias{@}{path picture bounding box}%
\tikzset{.. background stripes={0|#1,@:@,;}}%
}
},
.. background stripes/.code args={#1|#2:#3,#4;}{%
\def\tmp{#2}%
\ifx\tmp\atchar%
\else%
\fill [#3] ($(@.north west)!#1!(@.south west)$)
rectangle ($(@.north east)!#1+#2!(@.south east)$);
\tikzset{.. background stripes={#1+#2|#4;}}%
\fi%
}
}
\begin{document}
\begin{tikzpicture}
\node [draw, align=center, background stripes={
.20:red, .30:yellow, .10:pink, .05: green, .05:orange, .20:purple, .10:blue
}] { Some text \\ with a \\ stripy \\ background };
\end{tikzpicture}
\end{document}