您建议通过什么方式访问
- 标签文本
稍后在同一个 tikzpicture 中命名节点?
小例子:
\begin{tikzpicture}
\node (curve0) at (0,0) [] {curve $C_0$};
\node (alaternodeinwhichlabeltextofcurveoughttobeused) at (0,2) { The following is a label text of a node we already defined: (curve0.label text) };
\end{tikzpicture}
当然,上面使用“(curve0.label text)”是不允许的,但与“(curve0.center)”等现有特征类似。
这肯定是很常见的,但我没有读到相关文献。
如果“标签文本”不是此特定实体的正确技术术语,请随意更正(我是从 tikz 生成的某个错误消息中获取的)。
编辑:就像评论中推荐的那样,一种解决方法是使用单独的宏。例如:
\begin{tikzpicture}
\newcommand{\labeltextofcurve0}{curve $C_0$};
\node (curve0) at (0,0) [] {\labeltextofcurve0};
\node (alaternodeinwhichlabeltextofcurve0oughttobeused) at (0,2) { An isotopy from \labeltextofcurve0 to the curve $C_\infty$ is the following: ... };
\end{tikzpicture}
然而,这至少存在两个问题:
定量:此解决方案需要为每个标签文本单独编写一行代码。(在引发此问题的问题中,有许多节点,我希望访问每个节点的标签文本。想象一下(curve0)、(curve1)、......、(curve 17),每个节点都有一个单独的 \newcommand{\labeltextof...}...)在节点内容中定义标签文本似乎更自然。
定性:存在决定确定 \newcommmand{\labeltextofcurve0} 的放置位置。当然,在 (curve0) 的定义之前放置似乎是一个规范的选择,但存在“范围”问题,这些问题似乎过于复杂和混乱,无法在此描述。
因此,如果有一种方法可以表达(curve0.label text),并且只要在代码中的其他地方定义(curve0),它就能发挥作用,这样不是更好吗?
关于是否使用附加
\newcommand{\labeltextofcurve0}{curve $C_0$};
比尝试获取“(curve0.label text)”功能更受欢迎。
答案1
您可以侵入 TikZ 代码并在宏中捕获节点内容。
\documentclass{article}
\usepackage{tikz}
\makeatletter
\protected\def\tikz@fig@main#1{%
\expandafter\gdef\csname labeltextof@\tikz@fig@name\endcsname{#1}%
\iftikz@node@is@pic%
\tikz@node@is@picfalse%
\tikz@subpicture@handle{#1}%
\else%
\tikz@@fig@main#1\egroup%
\fi}
\makeatother
\newcommand\labeltextof[1]{\csname labeltextof@#1\endcsname}
\begin{document}
\begin{tikzpicture}
\node (curve0) at (0,0) [] {curve $C_0$};
\node (alaternodeinwhichlabeltextofcurve0oughttobeused) at (0,2) {
An isotopy from \labeltextof{curve0} to the curve
$C_\infty$ is the following: ... };
\end{tikzpicture}
\end{document}
答案2
TikZ 在解析节点语法时,获取括号对内容并将其放入 ahbox
或 a中minipage
,然后将其忘记。因此它不会记住内容。记住内容很难,因为它可以是任何东西,包括表格或图像。因此分配给一个键绝非那么简单。
但是您可以使用宏作为注释和Henri的答案提到或使用node contents
,name
和at
键来定义节点。
\documentclass{article}
\usepackage{tikz}
\tikzset{nodelist/.is family,
nadd/.code 2 args= {%
\tikzset{node contents=#1,name=#2}%
\begingroup\globaldefs=1\relax%
\pgfkeyssetvalue{/nodelist/#2}{#1}%
\endgroup%
}
}
\begin{document}
\begin{tikzpicture}[]
\node[nadd={My text}{a},at={(4,2)}]; % Add this to "my remembered nodes list"
\node[draw] at (1,1) {\pgfkeysvalueof{/nodelist/a}};
\end{tikzpicture}
\end{document}
但请注意,如果您使用node contents
key,那么您将不会对内容使用括号语法,并且 TikZ 使用不同的方式查找参数。因此,您会得到一些不同的行为。但在我看来,从长远来看,这并不像您想象的那么高效。