如何访问节点的标签文本?

如何访问节点的标签文本?

您建议通过什么方式访问

  • 标签文本

稍后在同一个 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 contentsnameat键来定义节点。

\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 contentskey,那么您将不会对内容使用括号语法,并且 TikZ 使用不同的方式查找参数。因此,您会得到一些不同的行为。但在我看来,从长远来看,这并不像您想象的那么高效。

相关内容