我想我以前见过这个问题,但我找不到。问题很简单;在为节点分配名称之前,我想知道该名称是否已被使用。
我认为当创建一个节点时\node (name) {label};
会定义一些宏name
。
答案1
名称为 的 PGF/TikZ 节点<name>
定义宏\pgf@sh@ns@<name>
(例如,名称为 )。此宏定义节点形状(ns),例如\csname pgf@sh@ns@#1\endcsname
。其他定义的宏是(节点点)、(节点变换矩阵)和(节点图片 ID)。#1
rectangle
\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
}