使用 pgfkeys/.store 中的宏作为 tikzset .style 中的节点名称

使用 pgfkeys/.store 中的宏作为 tikzset .style 中的节点名称

这是我的第一篇文章,所以对任何礼仪上的失误表示歉意。出于不值得深入讨论的原因,我想将一大堆 tikz 节点的定义与它们的最终位置分离。我想让 LaTeX 宏为每个节点定义单独的 .styles,定义它们的内容、名称等(以及其他内容,但在本 MWE 中跳过)。但是,我在使节点命名工作时遇到了问题。附加的 MWE 似乎可以正常工作,但如果我随后取消注释倒数第三行的 \draw 命令,我会得到

错误:包 pgf 错误:没有已知名为 A 的形状。

我尝试name=\nodename用类似的 pgfkeys 调用构造来替换我用来使“节点内容”部分工作的构造,但随后出现了 TeX 容量超出的情况。

任何指点都将不胜感激。如果答案很容易在其他地方找到而我却错过了,请见谅。

\documentclass[tikz]{standalone}

\newcommand{\nodename}{}
\pgfkeys{mine/.cd, name/.store in=\nodename}

\newcommand{\makenodetype}[1]{%
  \pgfkeys{mine/.cd,#1}
  \tikzset{\nodename/.style={%
      name=\nodename,
      rectangle,
      draw,
      node contents={\pgfkeys{mine/.cd,#1}\nodename}}}}

\makenodetype{name=A}
\makenodetype{name=B}

\begin{document}
\begin{tikzpicture}
\node at (0,0) [A];
\node at (1,0) [B];
% \draw (A) -- (B);
\end{tikzpicture}
\end{document}

答案1

这里的问题是,\nodename在定义样式时不会展开,因此在name=\nodename执行时,它只会使用使用样式时的任何值\nodename。因此永远不会有名为的形状A,因为在A执行样式时\nodename被定义为B

通过在\makenodetype{name=B}命令之间插入,\node示例可以正常工作。但这不是一种非常方便的工作方式,虽然可以使用\expandafter,或一个或两个额外的辅助宏,但值得一提的是,整个过程可以用键完成:

\documentclass[tikz,border=5]{standalone}
\tikzset{%
  my node/.style={
    shape=rectangle,
    draw,
    name=#1,
    node contents=#1
  },
  declare my node/.style={
    #1/.style={my node=#1}
  }
}
\tikzset{
  declare my node=A,
  declare my node=B
}
\begin{document}
\begin{tikzpicture}
\node at (0,0) [A];
\node at (1,0) [B];
\draw (A) -- (B);
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容