
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 esP0
, entonces el nodo debe tener el contenido tipográficoO. P0
; - nivel 1: el contenido debe tener como prefijo
O.n
dónden
está el número del hijo, por ejemplo, si los nodos en el primer nivel se especifican comoP1
yP3
, entonces deben escribirse comoO.1 P1
yO.2 P3
; - nivel 2: el contenido debe tener el prefijo
O.n.m
donden
está el número secundario del padre ym
es el número secundario del nodo, por ejemplo, siP1
tiene un hijoP2
, este último debe aparecer comoO.1.1 P2
y siP3
tiene un hijoP4
, este último debe escribirse comoO.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!
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 where
s por if
s.
where
se define como where/.style n args={3}{for tree={if={#1}{#2}{#3}}}
, por lo que contiene implícitamente un for tree
bucle.