在 tikz/pgfkeys 中,我如何复制(如)给定路径内的/styleA/*/.cp
所有键或单个键(如),比如在当前路径中,就像我手动复制所有键一样?/styleA/colorA/.cp
styleB
值得注意的是,这意味着如果我输入:
\node[styleA, styleB, styleC, colorA] {};
然后:
- 如果
styleC/colorA
存在,则colorA
从中取出styleC
,否则从中取出styleB
,否则styleA
… - 如果
styleC
调用一种样式,我们检查是否styleB
定义它,如果没有styleA
...当然,我不想对这个列表进行硬编码,styleD
因为顺序可能会在后面的调用中改变,比如\node[styleA, styleC, styleB, colorA] {};
。 styleA
包含在、 …中的样式styleB
应该可以轻松更改,而无需重新定义它们定义的所有其他样式。例如,我想重新定义 ,styleA/colorA/.style={}
而无需重新定义styleA/colorB/.style
。- 我想要一种简单的方法从给定的样式中选择一种颜色,例如将其包含在新样式中,
myNewStyle/.style={styleA/colorA}
而不采用中定义的其余键styleA
。
我尝试过的:目前我尝试了两种方法,但都不完美:
- 嵌套样式:它们非常适合解决问题 1 和 2,可以获得 3,但不是很优雅(特别是在深度嵌套样式上),而且我找不到如何获得 4。
.cd
和.family
,点 3 和 4 很容易获得,但我找不到获得 1 和 2 的方法:一旦我.cd
到达某个地方,所有先前定义的键都会丢失。即使在使用 时.search also
,搜索路径的顺序也是硬编码的,而且由于我无法知道稍后将使用的顺序,因此我无法获得点 3。
平均能量损失
\documentclass[]{article}
\usepackage{tikz}
\begin{document}
% Method 1: nested styles. Great to use, but hard to redefine style later.
\tikzset{
styleA/.style={
colorA/.style={fill=orange},
colorB/.style={fill=red},
colorC/.style={fill=yellow},
colorD/.style={fill=pink},
nice label/.style={label={\tiny I'm a label from style A}},
},
styleB/.style={
colorA/.style={%
fill=green,
nice label % to check point 2
},
colorB/.style={fill=blue},
},
}
\def\example#1{\tikz \node[#1, colorA] {A}; \tikz \node[#1, colorD] {D};}
\verb|styleA|: \example{styleA}
\verb|styleA, styleB|: \example{styleA, styleB}
Point 3: not very elegant to redefine \verb|styleB/colorA|?
\tikzset{
styleB/.append style={ % Would prefer: styleB/colorA/.style={fill=gray}
colorA/.style={
fill=gray
},
},
}
\verb|styleA, styleB|: \example{styleA, styleB}
Problem 4:
\tikzset{
myNewStyle/.style={
styleA %<---- I'd like to get only styleA/colorA, but can't find how to do
}
}
\tikz \node[styleB, myNewStyle, colorA] {A, should be orange}; \tikz \node[styleB, myNewStyle, colorB] {B, should be blue!!!};
\end{document}
答案1
使用此方法,A 将变成橙色,B 将变成蓝色。不多也不少。
但是,我必须说,总的来说,这段代码的设计确实很糟糕。为什么会colorA
根据按键的顺序产生不同的颜色?这会让用户感到困惑,并且会让人觉得不可预测。
\documentclass[]{article}
\usepackage{tikz}
\begin{document}
% Method 1: nested styles. Great to use, but hard to redefine style later.
\tikzset{
styleA/.style={
colorA/.style={fill=orange},
colorB/.style={fill=red},
colorC/.style={fill=yellow},
colorD/.style={fill=pink},
nice label/.style={label={\tiny I'm a label from style A}},
},
styleB/.style={
colorA/.style={%
fill=green,
nice label % to check point 2
},
colorB/.style={fill=blue},
},
}
\def\example#1{\tikz \node[#1, colorA] {A}; \tikz \node[#1, colorD] {D};}
\verb|styleA|: \example{styleA}
\verb|styleA, styleB|: \example{styleA, styleB}
Point 3: not very elegant to redefine \verb|styleB/colorA|?
\tikzset{
styleB/.append style={ % Would prefer: styleB/colorA/.style={fill=gray}
colorA/.style={
fill=gray
},
},
}
\verb|styleA, styleB|: \example{styleA, styleB}
Problem 4:
\tikzset{
myNewStyle/.style={
colorA/.code=\tikzset{styleA,colorA},
}
}
\tikz \node[styleB, myNewStyle, colorA] {A, should be orange}; \tikz \node[styleB, myNewStyle, colorB] {B, should be blue!!!};
\end{document}