Развернуть макрос только на месте вызова

Развернуть макрос только на месте вызова

Я хочу нарисовать дерево, где каждое ребро имеет определенный вес, визуализируемый как через толщину линии, так и через метку на ребре. Используя TikZ, это довольно просто:

\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}

Поскольку дерево, которое я хочу нарисовать, довольно большое, я хочу вынести код ребра за скобки, т.е. я хотел бы иметь макрос вроде

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

К сожалению, LaTeX жалуется на \edgeкоманду, когда я вызываю этот макрос, что, как я предполагаю, происходит из-за того, что он появляется вне \Treeкоманды. Есть ли способ исправить это?

решение1

Добавление следующего кода в преамбулу решает проблему:

\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

Это решение принадлежит Дэвиду Карлайлу и взято изздесь. Поздравляю парня, который написал детектор связанных вопросов, он привел меня прямо в нужное место!

Связанный контент