Узел Tikz не отображается в лесу

Узел Tikz не отображается в лесу

У меня есть команда для помещения текста в закругленный угловой блок с bg-color. Она использует узел tikz:

\newcommand\mybox[1]{\tikz[overlay]\node[fill=blue!20, rectangle, rounded corners=2pt]{#1};}

Когда я использую этот ящик внутри узла леса, узел не появляется. Пожалуйста, не могли бы вы сказать мне причину? и как добиться того же эффекта в лесу и при этом иметь хорошие параметры форматирования, такие как tikz?

введите описание изображения здесь

МВЭ:

\documentclass{article}
\usepackage{forest}
\newcommand\mybox[1]{\tikz[overlay]\node[fill=blue!20, rectangle, rounded corners=2pt]{#1};}

\begin{document}

\tikz\node[fill=blue!20,rectangle, rounded corners=2pt]{123}; 

\mybox{inside box}

\begin{forest}
for tree={align=center, parent anchor=south, child anchor=north, l sep=5mm}
[\tikz\node{eee}; node1  
 [\mybox{2} node2
  [\mybox{3} node3]
  [\mybox{4} node4]
 ]
]
\end{forest}

\end{document}

решение1

Как упоминалосьАбоАммар, трюк здесь в том, чтобы использоватьлесКлючи к достижению желаемого результата.

Для удобства мы можем определить стиль TikZ и соответствующий емулесодин.

\tikzset{
  my blue box/.style={fill=blue!20, rectangle, rounded corners=2pt},
}
\forestset{
  my blue label/.style={
    label={[my blue box]left:#1},
    s sep+=10pt,
  }
}

КакШоу АбоАммар, стиль TikZ можно передать, for treeесли настройки должны просто применяться к каждому узлу дерева как таковому.

\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    my blue box,
  }
  [eee node1
    [2 node2
     [3 node3]
     [4 node4]
    ]
  ]
\end{forest}

стилизованные узлы

Или вы можете использоватьлесстиль для простого указания содержимого меток, которые будут созданы слева от определенных узлов в дереве.

\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
  }
  [node1, my blue label=eee
    [node2, my blue label=2
     [node3, my blue label=3]
     [node4, my blue label=4]
    ]
  ]
\end{forest}

конкретные метки

В некоторых случаях метки также могут добавляться автоматически на основе информации о местоположении узла и т. д. в дереве. Например, на основе уровня узла или размещения относительно его братьев и сестер или, в данном случае, на основе внутреннего id.

Эту метку по умолчанию затем можно переопределить для определенных узлов, используя my blue labelстиль, использованный ранее.

\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    label/.wrap pgfmath arg={% specify default label for nodes
      {[my blue box]left:#1}
    }{int(id()-1)},
    s sep+=10pt,
  }
  [node1, my blue label=eee% override default label for this node
    [node2
     [node3]
     [node4]
    ]
  ]
\end{forest}

автоматическая маркировка с возможностью переопределения

Другой, похожий вариант — добавить метки с помощью кода TikZ после того, как дерево нарисовано. Мы можем добавить еще парулесстили, облегчающие это.

\forestset{
  ...
  my blue postscript/.style={
    tikz={\node [my blue box, anchor=east] at (.west) {#1};},
    s sep+=10pt,
  },
  auto blue postscripts/.style={
    my blue postscript/.wrap pgfmath arg={##1}{int(id()-1)},
  }
}

Затем auto blue postscriptsметка или метки будут добавлены автоматически, как и раньше, а также my blue postscript=<content>будет добавлена ​​конкретная метка, если автоматическая маркировка не активирована или если автоматическую метку необходимо переопределить в конкретном случае.

Затем

\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    auto blue postscripts,
  }
  [node1, my blue postscript=eee
    [node2
     [node3]
     [node4]
    ]
  ]
\end{forest}

автоматическая маркировка с возможностью переопределения с использованием кода TikZ напрямую

Однако в данном случае я не вижу никаких реальных преимуществ этого более сложного варианта, поэтому я бы рекомендовал метод, описанный labelвыше.

Полный код:

\documentclass[tikz, border=10pt, multi]{standalone}
\usepackage{forest}
\begin{document}
\tikzset{
  my blue box/.style={fill=blue!20, rectangle, rounded corners=2pt},
}
\forestset{
  my blue label/.style={
    label={[my blue box]left:#1},
    s sep+=10pt,
  },
  my blue postscript/.style={
    tikz={\node [my blue box, anchor=east] at (.west) {#1};},
    s sep+=10pt,
  },
  auto blue postscripts/.style={
    my blue postscript/.wrap pgfmath arg={##1}{int(id()-1)},
  }
}
\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    my blue box,
  }
  [eee node1
    [2 node2
     [3 node3]
     [4 node4]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
  }
  [node1, my blue label=eee
    [node2, my blue label=2
     [node3, my blue label=3]
     [node4, my blue label=4]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    label/.wrap pgfmath arg={
      {[my blue box]left:#1}
    }{int(id()-1)},
    s sep+=10pt,
  }
  [node1, my blue label=eee
    [node2
     [node3]
     [node4]
    ]
  ]
\end{forest}
\begin{forest}
  for tree={
    align=center,
    parent anchor=south,
    child anchor=north,
    l sep=5mm,
    auto blue postscripts,
  }
  [node1, my blue postscript=eee
    [node2
     [node3]
     [node4]
    ]
  ]
\end{forest}
\end{document}

решение2

Просто добавьте в дерево параметров следующее: и созданная вами команда rounded corners=2pt, fill=blue!20больше не понадобится .\mybox{}

\documentclass{article}
\usepackage{forest}
\begin{document}

\begin{forest}
for tree={align=center, parent anchor=south, child anchor=north, l sep=5mm, rounded corners=2pt, fill=blue!20}
[node1  
 [ node2
  [ node3]
  [ node4]
 ]
]
\end{forest}

\end{document}

введите описание изображения здесь

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