Как можно автоматически маркировать узлы леса, добавляя метки в качестве префиксов к содержимому узлов только один раз?

Как можно автоматически маркировать узлы леса, добавляя метки в качестве префиксов к содержимому узлов только один раз?

Я пытался понять, как можно 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

Замените все wheres на ifs.

whereопределяется как where/.style n args={3}{for tree={if={#1}{#2}{#3}}}, поэтому он неявно содержит for treeцикл.

Связанный контент