这是我的第一篇文章,所以对任何礼仪上的失误表示歉意。出于不值得深入讨论的原因,我想将一大堆 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}