Expandir macro somente no site de chamada

Expandir macro somente no site de chamada

Quero desenhar uma árvore onde cada aresta tenha um certo peso visualizado tanto na largura da linha quanto em um rótulo na aresta. Usando o TikZ, isso é muito fácil:

\documentclass{standalone}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}[
        clabel/.style = { fill=white, circle, inner sep=1pt,font=\scriptsize},
    ]
    \Tree [.O
        \edge [line width = 2] node [clabel] {2}; L
        \edge [line width = 4] node [clabel] {4}; R
    ]
\end{tikzpicture}
\end{document}

Como a árvore que quero desenhar é bastante grande, quero fatorar o código da borda, ou seja, gostaria de ter uma macro como

\def\edgeweight#1{\edge [line width = #1] node [clabel] {#1}; }

Infelizmente, o LaTeX reclama do \edgecomando quando eu chamo essa macro, o que presumo ser porque ela aparece fora do \Treecomando. Existe uma maneira de corrigir isso?

Responder1

Adicionar o seguinte código ao preâmbulo corrige o problema:

\makeatletter
\let\old@@children\@@children
\def\@@children{\futurelet\my@next\my@@children}
\def\my@@children{%
\ifx\my@next\edgeweight\else
\expandafter\@gobble
\fi
\expandafter\old@@children}
\makeatother

Esta solução é devida a David Carlisle e é retirada deaqui. Parabéns ao cara que escreveu o detector de perguntas relacionadas, isso me levou direto ao lugar certo!

informação relacionada