为什么节点样式 newcommand 在 tikz-qtree 中不起作用?

为什么节点样式 newcommand 在 tikz-qtree 中不起作用?

为了重用 中的标记节点样式tikz-qtree,我定义了
\newcommand{\lnode}[3]{\node [label = {#1} : {$#2$}] {#3};}
但是,\lnode不能像 中那样工作\Tree [.\lnode{above}{[1,5]}{$x$} ...

如何修复?

qtree-node-new命令

\documentclass[tikz]{standalone}

\usepackage{tikz-qtree}

\newcommand{\lnode}[3]{\node [label = {#1} : {$#2$}] {#3};}

\begin{document}
\begin{tikzpicture}[level distance = 40pt, sibling distance = 30pt,
  edge from parent/.style= {
    draw, edge from parent path={(\tikzparentnode) -- (\tikzchildnode)}}]
  \tikzset{every node/.style = {draw, circle}}

  % \lnode works here
  \lnode{above}{[1,5]}{$x$} 

  \begin{scope}[xshift = -2.5cm]
    \Tree [.\node[label = above : {$[1,5]$}]{$x$}; 
        [.\node[label = above : {$[1,1]$}] {$y$}; ] 
        [.\node[label = above : {$[3,5]$}] {$z$}; ]
      ]
  \end{scope}

  % \lnode does not work in qtree
  % \begin{scope}[xshift = 2.5cm]
  %   \Tree [.\lnode{above}{[1,5]}{$x$}
  %           [.\lnode{above}{[1,1]}{$y$} ]
  %           [.\lnode{above}{[3,5]}{$z$} ]
  %         ]
  % \end{scope}
\end{tikzpicture}
\end{document}

答案1

解析器tikzqtree确实在寻找显式的 \node。有问题的代码在\@label命令中:\@label ->\pgfutil@ifnextchar \node {\@litlabel }{\@@label }因此\pgfutil@ifnextchar\node检查下一个标记是否是文字\node标记。该位置的任何其他标记都不会被处理为标签,并在稍后在某些奇怪的上下文中展开。该\node命令在命令开头明确未定义,\Tree因此它不会做一些疯狂的事情,而只是抛出未定义的命令错误。

我通过在命令\tracingall前添加\Tree然后分析生成的日志文件来确定这一点。

相关内容