Como posso rotular os nós da floresta automaticamente, adicionando rótulos como prefixos ao conteúdo dos nós exatamente uma vez?

Como posso rotular os nós da floresta automaticamente, adicionando rótulos como prefixos ao conteúdo dos nós exatamente uma vez?

Eu estava tentando descobrir como você poderia forestrotular os nós em um diagrama como o apresentado emessa questãoautomaticamente. Então, a ideia é que:

  • nível 0: o conteúdo do nó deve ser prefixado com O., ou seja, se o conteúdo especificado for P0, então o nó deve ser composto com o conteúdo O. P0;
  • nível 1: o conteúdo deve ser prefixado com O.nonde nestá o número do filho, por exemplo, se os nós no primeiro nível forem especificados como P1e P3, então eles devem ser compostos como O.1 P1e O.2 P3;
  • nível 2: o conteúdo deve ser prefixado com O.n.monde nestá o número filho do pai e mé o número filho do nó, por exemplo, se P1tiver um filho P2, então o último deve aparecer como O.1.1 P2e se P3tiver um filho, P4então o último deve ser escrito como O.2.1 P4.

O nível 0 não é problema. Posso fazer isso usando content={O. #1}. Também posso construir e incluir os rótulos relevantes nos nós dos níveis 1 e 2. No entanto, o que não consigo descobrir é como adicionar isso ao conteúdo de cada nó exatamente uma vez. Faça o que fizer, acabo sem o prefixo ou com um prefixo ilegível ou vazio ou com várias cópias do prefixo correto.

Este é o mais próximo que cheguei, eu acho:

\documentclass[tikz, border=5pt]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\begin{document}

\forestset{
  tree node/.style = {align=center, inner sep=2pt, rounded corners = 2pt, text centered, font=\sffamily, rectangle, draw=black},
}
\begin{forest}
  for tree={
    parent anchor=south,
    child anchor=north,
    tree node,
    l sep+=5pt,
    edge path={
      \noexpand\path [-{Stealth[]}, \forestoption{edge}, thick]
        (!u.parent anchor) -- +(0,-5pt) -| (.child anchor)\forestoption{edge label};
    },
  },
  set node label/.style={
    content/.wrap 2 pgfmath args={O.##1 ##2}{n()}{content()},
  },
  set node super label/.style={
    content/.wrap 3 pgfmath args={O.##1.##2 ##3}{n("!u")}{n()}{content()},
  },
  before typesetting nodes={
    for tree={
      where level=0{
        content={O. #1},
      }{
        where level=1{
          set node label,
        }{
          where level=2{
            set node super label,
          }{
          },
        },
      },
    },
  }
  [P0
    [P1
      [P2
      ]
    ]
    [P3
      [P4
      ]
    ]
  ]
  ;
\end{forest}
\end{document}

Isso constrói os prefixos corretamente, mas os adiciona com muita frequência aos nós!

muitos rótulos!

Também tentei armazenar o conteúdo original em uma macro e depois usá-lo na especificação do content. No entanto, nesse caso, perco completamente o conteúdo original.

Responder1

Substitua todos os wheres por ifs.

whereé definido como where/.style n args={3}{for tree={if={#1}{#2}{#3}}}, portanto contém implicitamente um for treeloop.

informação relacionada