¿Cómo puedo etiquetar los nodos del bosque automáticamente, agregando etiquetas como prefijos al contenido de los nodos exactamente una vez?

¿Cómo puedo etiquetar los nodos del bosque automáticamente, agregando etiquetas como prefijos al contenido de los nodos exactamente una vez?

Estaba tratando de descubrir cómo podrías conseguirforest etiquetar los nodos en un diagrama como el que aparece enesta preguntaautomáticamente. Entonces, la idea es que:

  • nivel 0: el contenido del nodo debe tener el prefijo O.ie, si el contenido especificado es P0, entonces el nodo debe tener el contenido tipográfico O. P0;
  • nivel 1: el contenido debe tener como prefijo O.ndónde nestá el número del hijo, por ejemplo, si los nodos en el primer nivel se especifican como P1y P3, entonces deben escribirse como O.1 P1y O.2 P3;
  • nivel 2: el contenido debe tener el prefijo O.n.mdonde nestá el número secundario del padre y mes el número secundario del nodo, por ejemplo, si P1tiene un hijo P2, este último debe aparecer como O.1.1 P2y si P3tiene un hijo P4, este último debe escribirse como O.2.1 P4.

El nivel 0 no es ningún problema. Puedo hacerlo usando content={O. #1}. También puedo construir e incluir las etiquetas relevantes en los nodos para los niveles 1 y 2. Sin embargo, lo que no puedo entender es cómo agregar esto al contenido de cada nodo exactamente una vez. Haga lo que haga, termino sin el prefijo o con un prefijo confuso o vacío o con múltiples copias del prefijo correcto.

Esto es lo más cerca que tengo, creo:

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

¡Esto construye los prefijos correctamente pero los agrega con demasiada frecuencia a los nodos!

¡Demasiadas etiquetas!

También intenté almacenar el contenido original en una macro y luego usarlo en la especificación de content. Sin embargo, en ese caso, pierdo por completo el contenido original.

Respuesta1

Reemplace todas las wheres por ifs.

wherese define como where/.style n args={3}{for tree={if={#1}{#2}{#3}}}, por lo que contiene implícitamente un for treebucle.

información relacionada