我正在使用 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}