包含 tikz 节点的新命令

包含 tikz 节点的新命令

我正在使用 tikz-qtree 绘制二叉树。由于我需要标记它们,所以我想使用以下在普通 tikz 中工作的宏:

\newcommand{\A}[1]{\node(a#1){Activity #1};}

然而,这不起作用;错误在于节点是一个未定义的控制序列。

当然,这个宏是在 内部使用的tikzpicture,所以基本上我只想转储\node(a1){Activity 1};是否\A{1}被调用。我很确定这与我的 TeXnic 有关。。。也许是扩展?

请注意,tikz-qtree 手册指出

\Tree特别注意令牌\node;不要使用\path node或其他等效物。

这是一个简单的例子:

\documentclass{minimal}
\usepackage{tikz,tikz-qtree}
\newcommand{\A}[1]{\node(a#1){Activity #1};}
\begin{document}
Works:\
\tikz\A{1};
\hfill
Works:
\Tree [.\node(a1){A1}; 1 2 ]
\hfill
Doesn't Work:
% \begin{tikzpicture}
%   \Tree [.\A{1} b c ]
% \end{tikzpicture}
\end{document}

谢谢,

答案1

正如您所怀疑的,问题与扩展有关:\Tree首先扩展,然后在扩展之前查找其参数。如果首先扩展,\A则可以解决该问题。原语允许您这样做:序列\A\expandafter

\expandafter<token1><token2>

被替换为

<token1><expansion of token2>

并且扩展处理器会重新检查此替换。

由于您还必须考虑令牌[,因此.您需要三个\expandafter命令:

\documentclass{article}
\usepackage{tikz,tikz-qtree}

\newcommand{\A}[1]{\node(a#1){Activity #1};}

\begin{document}

\expandafter\Tree \expandafter[\expandafter.\A{A} 1 2 ]

\begin{tikzpicture}
  \expandafter\Tree \expandafter[\expandafter.\A{1} b c ]
\end{tikzpicture}

\end{document}

相关内容