我想定义一个 TikZ 键,在创建节点后自动执行一些代码。
例如,我想定义stuff
这样的
\node[stuff] (Test) {Test};
将执行
\coordinate (eastSide) at (Test.east);
然后。
请注意execute at end node
(或其内部等效项\tikz@atend@node
)在这里没有帮助,因为当执行给定的代码时execute at end node
,节点尚不存在。(我们得到错误Package pgf Error: No shape named eastSide is known.
)
一个最小的工作示例:
\documentclass{article}
\usepackage{tikz,etoolbox}
\begin{document}
\begin{tikzpicture}
\makeatletter
\def\afterNodeCode{%
\coordinate (eastSide) at (\previousNodeName.east);
}
\tikzset{%
stuff/.code=
\appto\tikz@atend@node{%
\xdef\previousNodeName{\tikz@fig@name}%
% \afterNodeCode % does not work, too early to refer to the node
}%
}
\node[draw,stuff] (Test) {Test};
\afterNodeCode % I would like to remove this line
\node at (eastSide) {X}; % Just for testing
\end{tikzpicture}
\end{document}
在这个例子中,我想删除命令\afterNodeCode
后的调用\node
,并且我希望该stuff
键自动执行\afterNodeCode
。
编辑: append after command
也不是我想要的。append after command
仅评估路径,而我需要在中执行任意 TiKZ/TeX 代码\afterNodeCode
。
答案1
append after command
这可以通过密钥完成
\begin{tikzpicture}[stuff/.style={
append after command={coordinate (#1) at (\tikzlastnode.east)}
}
]
\node[stuff=eastSide] (Test) {Test};
\node at (eastSide) {X};
\end{tikzpicture}
但我认为你是在重新发明轮子,因为这只是一个label=0:X
节点Test
。
答案2
我错过了 Dominik 的评论,所以我根据以下内容写了一个答案Tikz:创建节点后不触及路径就执行代码
如果您不想插入任何路径,您可以使用\pgfextra ... \endpgfextra
:
mystyle/.style={
append after command={\pgfextra%
any code you want%
\endpgfextra}}
}
(请注意,使用该\endpgfextra
语法会完全禁用 tikz 解析策略,因此我猜它比更安全\pgfextra{}
)