O nó Tikz não aparece na floresta

O nó Tikz não aparece na floresta

Eu tenho um comando para colocar um texto em uma caixa de canto arredondado com cor bg. Ele usa o nó tikz:

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

Quando uso esta caixa dentro de um nó de floresta, o nó não aparece. Por favor, você poderia me dizer o motivo? e como conseguir o mesmo efeito na floresta e ainda ter ótimas opções de formatação como o tikz?

insira a descrição da imagem aqui

MWE:

\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}

Responder1

Como mencionado porAboAmmar, o truque aqui é usarflorestachaves para obter o resultado desejado.

Por conveniência, podemos definir um estilo TikZ e um estilo correspondenteflorestaum.

\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,
  }
}

ComoAboAmmar mostra, o estilo TikZ pode ser passado for treese as configurações forem simplesmente aplicadas a cada nó da árvore como tal.

\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}

nós estilizados

Ou você pode usar oflorestaestilo para especificar facilmente o conteúdo dos rótulos a serem criados à esquerda de nós específicos na árvore.

\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}

rótulos específicos

Em alguns casos, os rótulos também podem ser adicionados automaticamente com base nas informações sobre a localização do nó, etc., na árvore. Por exemplo, com base no nível ou posicionamento do nó em relação aos seus irmãos ou, neste caso, no nível interno do nó id.

Esse rótulo padrão pode então ser substituído por nós específicos usando o my blue labelestilo usado anteriormente.

\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}

rotulagem automática com substituição opcional

Outra opção semelhante é adicionar os rótulos usando o código TikZ depois que a árvore for desenhada. Podemos adicionar mais algunsflorestaestilos para facilitar isso.

\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)},
  }
}

Em seguida auto blue postscripts, adicionará o rótulo ou rótulos automaticamente, como antes, e my blue postscript=<content>adicionará um rótulo específico, se a rotulagem automática não estiver ativada ou se o rótulo automático precisar ser substituído em um caso específico.

Então

\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}

rotulagem automatizada com opção de substituição usando código TikZ diretamente

No entanto, não há nenhuma vantagem real nesta opção mais complexa que eu possa ver neste caso, então eu recomendaria o método mencionado labelacima.

Código completo:

\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}

Responder2

Basta adicionar o seguinte às opções da sua árvore: rounded corners=2pt, fill=blue!20e não há necessidade do \mybox{}comando que você criou.

\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}

insira a descrição da imagem aqui

informação relacionada