
Eu estava tentando descobrir como você poderia forest
rotular 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 forP0
, então o nó deve ser composto com o conteúdoO. P0
; - nível 1: o conteúdo deve ser prefixado com
O.n
onden
está o número do filho, por exemplo, se os nós no primeiro nível forem especificados comoP1
eP3
, então eles devem ser compostos comoO.1 P1
eO.2 P3
; - nível 2: o conteúdo deve ser prefixado com
O.n.m
onden
está o número filho do pai em
é o número filho do nó, por exemplo, seP1
tiver um filhoP2
, então o último deve aparecer comoO.1.1 P2
e seP3
tiver um filho,P4
então o último deve ser escrito comoO.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!
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 where
s por if
s.
where
é definido como where/.style n args={3}{for tree={if={#1}{#2}{#3}}}
, portanto contém implicitamente um for tree
loop.