Tikz-Knoten werden nicht im Wald angezeigt

Tikz-Knoten werden nicht im Wald angezeigt

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?

Bildbeschreibung hier eingeben

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 treewenn 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}

gestaltete Knoten

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}

spezifische Etiketten

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 labelzuvor 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}

automatische Beschriftung mit optionaler Übersteuerung

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 postscriptswird 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}

automatisierte Beschriftung mit Override-Option direkt durch Verwendung von TikZ-Code

Da ich in diesem Fall jedoch keinen wirklichen Vorteil dieser komplexeren Option erkennen kann, würde ich die labeloben 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!20wird 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}

Bildbeschreibung hier eingeben

verwandte Informationen