节点创建后执行代码

节点创建后执行代码

我想定义一个 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{}

相关内容