«добавить после команды» в дереве (операция дочернего пути)

«добавить после команды» в дереве (операция дочернего пути)

Связанный:Проблема с «добавить после команды» и «вставить путь», но я не понял, как применить предложенные там решения в моем случае.

Я определяю простой стиль 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случае все равно приводит к сбою.

Операция childpath мешает 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}

вложенные подходящие поддеревья

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