Ich habe einen Befehl, um einen Text in ein Feld mit abgerundeten Ecken und Hintergrundfarbe einzufügen. Er verwendet einen Tikz-Knoten:
\newcommand\mybox[1]{\tikz[overlay]\node[fill=blue!20, rectangle, rounded corners=2pt]{#1};}
Wenn ich dieses Feld in einem Gesamtstrukturknoten verwende, wird der Knoten nicht angezeigt. Können Sie mir bitte den Grund dafür nennen? Und wie erreiche ich den gleichen Effekt in einer Gesamtstruktur und habe trotzdem schöne Formatierungsoptionen wie 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}
Antwort1
Wie erwähnt vonAboAmmar, der Trick dabei ist,Wald, um das gewünschte Ergebnis zu erhalten.
Der Einfachheit halber können wir einen TikZ-Stil und einen entsprechendenWaldeins.
\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,
}
}
AlsAboAmmar zeigt, der TikZ-Stil kann übergeben werden, for tree
wenn die Einstellungen einfach für jeden Knoten des Baums als solchen gelten sollen.
\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}
Oder Sie verwenden dieWaldStil, um einfach den Inhalt der Beschriftungen anzugeben, die links neben bestimmten Knoten im Baum erstellt werden sollen.
\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}
In einigen Fällen können die Beschriftungen auch automatisch basierend auf Informationen über die Position des Knotens usw. im Baum hinzugefügt werden. Beispielsweise basierend auf der Ebene oder Platzierung des Knotens im Verhältnis zu seinen Geschwistern oder in diesem Fall basierend auf dem internen Knoten id
.
Diese Standardbezeichnung kann dann für bestimmte Knoten mit dem my blue label
zuvor verwendeten Stil überschrieben werden.
\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}
Eine andere, ähnliche Möglichkeit besteht darin, die Beschriftungen mit TikZ-Code hinzuzufügen, nachdem der Baum gezeichnet wurde. Wir können noch ein paar weitere hinzufügenWaldStile, um dies zu erleichtern.
\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)},
}
}
Anschließend auto blue postscripts
wird das Etikett bzw. die Etiketten wie bisher automatisch hinzugefügt. Außerdem my blue postscript=<content>
wird ein spezielles Etikett hinzugefügt, wenn die automatische Beschriftung nicht aktiviert ist oder wenn die automatische Beschriftung im Einzelfall überschrieben werden soll.
Dann
\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}
Da ich in diesem Fall jedoch keinen wirklichen Vorteil dieser komplexeren Option erkennen kann, würde ich die label
oben beschriebene Methode empfehlen.
Vollständiger Code:
\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}
Antwort2
Fügen Sie Ihren Baumoptionen einfach Folgendes hinzu: und der von Ihnen erstellte Befehl rounded corners=2pt, fill=blue!20
wird nicht mehr benötigt .\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}