
Я пытался понять, как можно forest
обозначить узлы на диаграмме, например, показанной на рисунке.этот вопросавтоматически. Итак, идея в том, что:
- уровень 0: содержимое узла должно иметь префикс ,
O.
т.е. если указано содержимоеP0
, то узел должен быть набран с содержимымO. P0
; - уровень 1: содержимое должно иметь префикс ,
O.n
гдеn
- номер дочернего элемента, например, если узлы на первом уровне указаны какP1
иP3
, то они должны быть набраны какO.1 P1
иO.2 P3
; - уровень 2: содержимое должно иметь префикс ,
O.n.m
гдеn
— номер потомка родителя, аm
— номер потомка узла, например, еслиP1
есть потомокP2
, то последний должен отображаться какO.1.1 P2
, а еслиP3
есть потомокP4
, то последний должен быть набран какO.2.1 P4
.
Уровень 0 не проблема. Я могу сделать это с помощью content={O. #1}
. Я также могу создать соответствующие метки и включить их в узлы для уровней 1 и 2. Однако я не могу понять, как добавить это к содержимому каждого узла ровно один раз. Что бы я ни делал, я либо остаюсь без префикса, либо с искаженным или пустым префиксом, либо с несколькими копиями правильного префикса.
Думаю, это самое близкое, что у меня есть:
\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}
Это правильно формирует префиксы, но добавляет их к узлам слишком часто!
Я также пробовал сохранять исходное содержимое в макросе, а затем использовать его в спецификации content
. Однако в этом случае я просто полностью теряю исходное содержимое.
решение1
Замените все where
s на if
s.
where
определяется как where/.style n args={3}{for tree={if={#1}{#2}{#3}}}
, поэтому он неявно содержит for tree
цикл.