我如何知道某个节点是否已定义?

我如何知道某个节点是否已定义?

我想我以前见过这个问题,但我找不到。问题很简单;在为节点分配名称之前,我想知道该名称是否已被使用。

我认为当创建一个节点时\node (name) {label};会定义一些宏name

答案1

名称为 的 PGF/TikZ 节点<name>定义宏\pgf@sh@ns@<name>(例如,名称为 )。此宏定义节点形状(ns),例如\csname pgf@sh@ns@#1\endcsname。其他定义的宏是(节点点)、(节点变换矩阵)和(节点图片 ID)。#1rectangle\pgf@sh@np@<name>\pgf@sh@nt@<name>\pgf@sh@pi@<name>

您可以使用例如\@ifundefined{pgf@sh@ns@#1}{<node does not exists>}{<node exists>}来测试具有该名称的节点是否已在文档中定义(节点是否已全局声明)。

如果你想测试该节点是否已被使用在当前图片中,您最好也测试一下图片 id 是否与当前图片 id 匹配(\pgfpictureid例如pgfid1,用于\ifx比较)。

这里有一些此类宏的可能实现(尚未测试):

\def\@nodeundefined#1{%
    \@ifundefined{pgf@sh@ns@#1}%
}
% or
\long\def\@nodedefined#1#2#3{%
    \@ifundefined{pgf@sh@ns@#1}{#3}{#2}%
}

\def\@nodedefinedcurrpic#1{%   
   \expandafter\ifx\csname pgf@sh@pi@#1\endcsname\pgfpictureid
      \expandafter\@firstoftwo
   \else
      \expandafter\@secondoftwo
   \fi
}

相关内容