Karten zwischen verwurzelten Bäumen mithilfe von Wald (und TiKz)

Karten zwischen verwurzelten Bäumen mithilfe von Wald (und TiKz)

Ich musste verwurzelte (nach oben gerichtete) Bäume (mit Blättern) zeichnen. Ich fand das PaketWaldnützlich, obwohl die von mir verwendeten Workarounds höchstwahrscheinlich nicht wirklich optimal sind. Ein Beispiel für einen solchen Baum könnte das Folgende sein.

\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{forest}
%opening
\title{}
\author{}
\date{}

\begin{document}
\begin{center}
 \begin{forest}
for tree={grow'=north, circle, draw, minimum width=0.7cm,anchor=center,fit=rectangle,
    edge={>=stealth,-,shorten >=1pt,shorten <=1pt,line width=0.5pt},
    scale=0.75,font=\sffamily\small\bfseries}
    %
 [, node options'
  [$l$, edge label={node[midway,right,font=\scriptsize]{a}}
    [$l'$, edge label={node[midway,left,font=\scriptsize]{b}}
      [, node options', edge label={node[midway,left,font=\scriptsize]{e}}]
      [, node options', no edge
    ]
      [, node options', edge label={node[midway,right,font=\scriptsize]{f}}]
    ]
    [, node options', no edge
    ]
    [, node options', edge label={node[midway,left,font=\scriptsize]{c}}
    ]
    [, node options', no edge
    ]
    [$l''$, edge label={node[midway,right,font=\scriptsize]{d}}
    ]
  ]
 ]
\end{forest}\end{center}
\end{document}

Frage.Wie kann ich einen Pfeil von einem verwurzelten Baum zu einem anderen zeichnen, wie es (mit xypic) auf Seite 7 dieses Dokuments [1] geschieht?

[1]http://arxiv.org/pdf/math/0701293v2.pdf

Antwort1

Eine weitere Option, die vielleicht eine feinere Kontrolle über die Pfeile ermöglicht, fallscfrLösungnicht direkt verwendbar ist, besteht darin, die Bäume in TikZs \nodes zu platzieren und dann die Namen der Knoten zu verwenden, um die Pfeile zu zeichnen.

Der sicherere Weg hierfür wäre, zuerst die Bäume in eine Box einzuordnen und dann die Boxen innerhalb eines zu verwenden tikzpicture. Im folgenden Beispiel habe ich dreimal denselben Baum verwendet, aber dieselbe Idee kann auch für verschiedene Bäume angewendet werden, indem für jeden Baum eine andere Box verwendet wird.

Bildbeschreibung hier eingeben

Der Code:

\documentclass[a4paper,10pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{forest}
\usetikzlibrary{positioning}

\newsavebox\boxa% we define a new box

% we fill the box
\savebox\boxa{%
\begin{forest}
for tree={grow'=north, circle, draw, minimum width=0.7cm,anchor=center,fit=rectangle,
    edge={>=stealth,-,shorten >=1pt,shorten <=1pt,line width=0.5pt},
    scale=0.75,font=\sffamily\small\bfseries}
    %
 [, node options'
  [$l$, edge label={node[midway,right,font=\scriptsize]{a}}
    [$l'$, edge label={node[midway,left,font=\scriptsize]{b}}
      [, node options', edge label={node[midway,left,font=\scriptsize]{e}}]
      [, node options', no edge
    ]
      [, node options', edge label={node[midway,right,font=\scriptsize]{f}}]
    ]
    [, node options', no edge
    ]
    [, node options', edge label={node[midway,left,font=\scriptsize]{c}}
    ]
    [, node options', no edge
    ]
    [$l''$, edge label={node[midway,right,font=\scriptsize]{d}}
    ]
  ]
 ]
\end{forest}%
}

\begin{document}

\begin{center}
\begin{tikzpicture}[node distance=0.5cm and 0.5cm]
\node[inner sep=0pt] (uc)
  {\usebox\boxa};
\node[inner sep=0pt,below left=of uc] (ll)
  {\usebox\boxa};
\node[inner sep=0pt,below right=of uc] (lr)
  {\usebox\boxa};
\begin{scope}[shorten >=10pt,shorten <=10pt]
\draw[->]
  (ll.north) -- node[auto] {$\partial_{v}$} (uc);  
\draw[->]
  (lr.north) -- node[swap,auto] {$\partial_{w}$} (uc);  
\end{scope}
\end{tikzpicture}
\end{center}

\end{document}

Antwort2

Eine Möglichkeit besteht darin, die Bäume als einen einzigen Baum mit einem Phantom-Wurzelknoten zu zeichnen:

\documentclass[tikz,border=5pt]{standalone}
\usepackage[utf8]{inputenc}% just for this example as my editor uses this encoding
\usepackage[T1]{fontenc}
\usepackage{forest}

\begin{document}
\begin{forest}
for tree={grow'=north, circle, draw, minimum width=0.7cm,anchor=center,fit=rectangle,
    edge={>=stealth,-,shorten >=1pt,shorten <=1pt,line width=0.5pt},
    scale=0.75,font=\sffamily\small\bfseries}
    %
[,phantom, l sep=0pt, s sep+=20pt
  [, node options'
    [$l$, edge label={node[midway,right,font=\scriptsize]{a}}
      [$l'$, edge label={node[midway,left,font=\scriptsize]{b}}
        [, node options', edge label={node[midway,left,font=\scriptsize]{e}}]
        [, node options', no edge
      ]
        [, node options', edge label={node[midway,right,font=\scriptsize]{f}}]
      ]
      [, node options', no edge
      ]
      [, node options', edge label={node[midway,left,font=\scriptsize]{c}}
      ]
      [, node options', no edge
      ]
      [$l''$, edge label={node[midway,right,font=\scriptsize]{d}}, name=node1
      ]
    ]
  ]
  [, node options'
    [$l$, edge label={node[midway,right,font=\scriptsize]{a}}
      [$l'$, edge label={node[midway,left,font=\scriptsize]{b}}, name=node2
        [, node options', edge label={node[midway,left,font=\scriptsize]{e}}]
        [, node options', no edge
      ]
        [, node options', edge label={node[midway,right,font=\scriptsize]{f}}]
      ]
      [, node options', no edge
      ]
      [, node options', edge label={node[midway,left,font=\scriptsize]{c}}
      ]
      [, node options', no edge
      ]
      [$l''$, edge label={node[midway,right,font=\scriptsize]{d}}
      ]
    ]
  ]
]
  \draw [->, >=stealth, shorten >=10pt, shorten <=10pt, thick] (node1.east) -- (node2.west);
\end{forest}
\end{document}

Phantomwurzel

verwandte Informationen