У меня есть команда для помещения текста в закругленный угловой блок с 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}
Однако в данном случае я не вижу никаких реальных преимуществ этого более сложного варианта, поэтому я бы рекомендовал метод, описанный 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}