
Я хочу нарисовать дерево, где каждое ребро имеет определенный вес, визуализируемый как через толщину линии, так и через метку на ребре. Используя 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
Это решение принадлежит Дэвиду Карлайлу и взято изздесь. Поздравляю парня, который написал детектор связанных вопросов, он привел меня прямо в нужное место!