.png)
Связанный:Проблема с «добавить после команды» и «вставить путь», но я не понял, как применить предложенные там решения в моем случае.
Я определяю простой стиль tikz, который использует append after command
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,fit}
\begin{document}
\begin{tikzpicture}[
fit after/.style={
append after command={%
node[draw, inner sep=0pt, fit=(\tikzlastnode)] {}
}
}
]
\node[fit after] {A};%%%% WORKS
\node {B} child { node[fit after] {C} }; %%%% FAILS
\end{tikzpicture}
\end{document}
На первом узле ( A
) все работает нормально и рисует вокруг него прямоугольник.
Однако на C
узле я получаю следующее сообщение об ошибке:
Package pgf Error: No shape named is known.
Это \tikzlastnode
не ошибка, так как даже жесткое кодирование имени узла в данном child
случае все равно приводит к сбою.
Операция child
path мешает append after command
? Есть ли обходной путь?
Контекст: Я пытаюсь создать triangle fit whole subtree
команду, которая рисует треугольник, охватывающий все узлы поддерева.
решение1
Если forest
есть опция, то достаточно просто определить стиль fit whole subtree
. Я не рекомендую треугольную форму. Хотя я немного поэкспериментировал, это неизбежно выглядело очень уродливо. Однако fit whole subtree
можно передать любые параметры, которые вы хотите, чтобы задать стиль узлу. По умолчанию он рисует прямоугольник красного цвета.
Обратите внимание, что многократное использование fit whole subtree
, включая вложенное использование, работает нормально.
\documentclass[tikz,border=10pt,multi]{standalone}
\usepackage{forest}
\usetikzlibrary{fit}
\begin{document}
\newcommand*\makenodename[1]{(#1)}
\forestset{
declare toks={fit these}{},
fit whole subtree/.style={
delay={
temptoksa=,
for tree={%
temptoksa+/.wrap pgfmath arg={ (##1)}{name()},
},
fit these/.register=temptoksa,
delay={
tikz+={
\node [draw=red, fit=\foresteoption{fit these}, inner sep=0pt, #1] {};
},
},
},
},
}
\begin{forest}
for tree={
fit=band,
child anchor=parent,
parent anchor=children,
}
[A
[B
[C, fit whole subtree
[D]
[E
[X]
[Y
[Z]
]
]
[F]
[G]
]
[H
[I
[J]
[K]
[L]
]
]
]
[M, fit whole subtree={thick, draw=blue, rounded corners}
[N
[O
[R]
]
[P]
[Q]
]
[S, fit whole subtree={green, densely dashed, rounded corners}
[T]
[U]
[V]
[W]
]
]
]
\end{forest}
\end{document}