我想运行一些代码来装饰一个节点,并且我想通过 TikZ 样式来控制它。我还希望 tikz 样式能够获取一些参数(例如表单中的参数)mystyle={arg1=val1, arg2=val2}
,并将它们传递给绘图代码。
这是我正在尝试的:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\tikzset{
% Give a initial value "init" to mystyle/arg
mystyle/arg/.initial=init,
% Define a key that actually does the drawing
mystyle/draw stuff/.code={
% Just some arrows pointing to the node that use the argument value
\foreach \angle in {0, 60, ..., 300} {
\draw[<-] (\tikzlastnode) -- ++(\angle:1cm)
node {\pgfkeysvalueof{/tikz/mystyle/arg}};
}
},
% Now define the style
mystyle/.style={
% Append code that triggers the key that draws
append after command=[mystyle/draw stuff],
% "enter mystyle"
mystyle/.cd,
% Import whatever the user specified
#1
}
}
\node [mystyle={arg=bar}] {foo};
\end{tikzpicture}
\end{document}
据我了解,当mystyle={arg=bar}
被调用时,#1
是{arg=bar}
并且它在 内被导入mystyle
,因此应该设置/mystyle/arg
为bar
。所以它应该生成类似这样的内容:
我得到的却是:
所以\pgfkeysvalueof{/tikz/mystyle/arg}
永远不会更新到bar
。
考虑到这种语法在 TikZ 中广泛使用,这听起来应该很容易做到,但我不知道如何让它工作。是否#1
需要以某种方式扩展?
答案1
您尝试的方法几乎有效。但是,我强烈建议将附加路径放在pic
为此而制作的 中。您也可以通过以下方式处理选项:
\tikzset{/tikz/mystyle/.cd,#1}
由于您正在创建其他节点,我建议通过以下方式将原始节点保存在宏中
\let\myln\tikzlastnode
结果如下:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\tikzset{
% Give a initial value "init" to mystyle/arg
mystyle/arg/.initial=init,
% Define a key that actually does the drawing
pics/mystyle/draw stuff/.style={code={
% Just some arrows pointing to the node that use the argument value
\let\myln\tikzlastnode
\tikzset{/tikz/mystyle/.cd,#1}
\foreach \angle in {0, 60, ..., 300} {
\draw[<-] (\myln) -- ++(\angle:1cm)
node[anchor=\angle+180] {\pgfkeysvalueof{/tikz/mystyle/arg}};
}
}},
% Now define the style
mystyle/.style={
% Append code that triggers the key that draws
append after command={pic{mystyle/draw stuff={#1}}},
% "enter mystyle"
mystyle/.cd,
% Import whatever the user specified
#1
}
}
\path node [mystyle={arg=bar}] {foo} (4,0) node[mystyle={arg=purr}]{cat};
\end{tikzpicture}
\end{document}
请注意,在这种情况下,您可以避免pic
使用而改用edge
s。