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?
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 tree
si 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}
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}
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 label
estilo 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}
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 postscripts
agregará 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}
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 label
anteriormente.
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!20
y 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}