我有一個命令,用於將文字放入帶有背景顏色的圓角框中。它使用 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,
}
}
作為阿博阿瑪爾表演for tree
,如果設定應該簡單地應用於樹的每個節點,則可以傳入 TikZ 樣式。
\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}
或者您可以使用森林style 可以輕鬆指定要在樹中特定節點左側建立的標籤的內容。
\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}