"anexar após comando" em uma árvore (operação de caminho filho)

"anexar após comando" em uma árvore (operação de caminho filho)

Relacionado:Problema com “acrescentar após comando” e “inserir caminho”, mas não entendi como aplicar as soluções aí no meu caso.

Estou definindo um estilo tikz simples que usa 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}

No primeiro nó ( A), funciona bem e desenha um retângulo ao seu redor.

No Cnó, entretanto, recebo a seguinte mensagem de erro:

Package pgf Error: No shape named  is known.

A \tikzlastnodeculpa não é disso, pois mesmo a codificação do nome do nó ainda falha no childcaso.

A childoperação do caminho está atrapalhando append after command? Existe uma solução alternativa?

Contexto: Estou tentando fazer um triangle fit whole subtreecomando que desenha um triângulo que se ajusta a todos os nós da subárvore.

Responder1

Se forestfor uma opção, é razoavelmente simples definir um fit whole subtreeestilo. Não recomendo uma forma triangular. Embora eu tenha experimentado um pouco, isso inevitavelmente parecia muito feio. Porém, fit whole subtreepodem ser passadas quaisquer opções que você deseje para estilizar o nó. Por padrão, ele desenha um retângulo em vermelho.

Observe que vários usos de fit whole subtree, incluindo usos aninhados, funcionam bem.

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

subárvores ajustadas aninhadas

informação relacionada