El nodo Tikz no aparece en el bosque.

El nodo Tikz no aparece en el bosque.

Tengo un comando para poner un texto en un cuadro de esquina redondeada con color bg. Utiliza el nodo tikz:

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

Cuando uso este cuadro dentro de un nodo de bosque, el nodo no aparece. ¿Por favor podrías decirme el motivo? ¿Y cómo lograr el mismo efecto en el bosque y seguir teniendo buenas opciones de formato como tikz?

ingrese la descripción de la imagen aquí

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}

Respuesta1

Como lo mencionaAboAmmar, el truco aquí es usarbosqueLas claves para conseguir el resultado que deseas.

Por conveniencia, podemos definir un estilo TikZ y su correspondientebosqueuno.

\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 muestra, el estilo TikZ se puede pasar for treesi la configuración simplemente debe aplicarse a cada nodo del árbol 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}

nodos con estilo

O puedes usar elbosqueestilo para especificar fácilmente el contenido de las etiquetas que se crearán a la izquierda de nodos específicos en el árbol.

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

etiquetas específicas

En algunos casos, las etiquetas también se pueden agregar automáticamente en función de la información sobre la ubicación del nodo, etc. en el árbol. Por ejemplo, según el nivel o la ubicación del nodo en relación con sus hermanos o, en este caso, según el valor interno del nodo id.

Esta etiqueta predeterminada se puede anular para nodos específicos utilizando el my blue labelestilo utilizado 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}

etiquetado automático con anulación opcional

Otra opción similar es agregar las etiquetas usando el código TikZ después de dibujar el árbol. Podemos agregar un par másbosqueestilos para facilitar esto.

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

Luego auto blue postscriptsagregará la etiqueta o etiquetas automáticamente, como antes, y my blue postscript=<content>agregará una etiqueta específica, si el etiquetado automático no está activado o si la etiqueta automática debe anularse en un caso particular.

Entonces

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

etiquetado automatizado con opción de anulación utilizando el código TikZ directamente

Sin embargo, no veo ninguna ventaja real en esta opción más compleja en este caso, por lo que recomendaría el método mencionado labelanteriormente.

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}

Respuesta2

Simplemente agregue a las opciones de su árbol lo siguiente: rounded corners=2pt, fill=blue!20y no será necesario el \mybox{}comando que ha creado.

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

ingrese la descripción de la imagen aquí

información relacionada