Tikz 節點未出現在森林中

Tikz 節點未出現在森林中

我有一個命令,用於將文字放入帶有背景顏色的圓角框中。它使用 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}

直接使用 TikZ 程式碼進行帶有覆蓋選項的自動標記

然而,在這種情況下,我可以看到這個更複雜的選項沒有真正的優勢,所以我建議依賴上面的方法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}

在此輸入影像描述

相關內容