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?
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 tree
se 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}
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}
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 label
estilo 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}
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}
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 label
acima.
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!20
e 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}