Карты между укорененными деревьями с использованием леса (и TiKz)

Карты между укорененными деревьями с использованием леса (и TiKz)

Мне нужно было нарисовать укорененные (направленные вверх) деревья (с листьями). Я нашел пакетлесполезно, хотя, скорее всего, обходные пути, которые я использовал, не являются оптимальными в каком-либо правильном смысле. Примером такого дерева может быть следующее.

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

Вопрос.Как нарисовать стрелку от одного корневого дерева к другому, как это сделано (с помощью xypic) на странице 7 этой статьи [1]?

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

решение1

Другой вариант, позволяющий, возможно, более точно управлять стрелками в случаеcfrрешениеневозможно использовать напрямую, то пришлось бы поместить деревья в \nodes TikZ, а затем использовать имена узлов для рисования стрелок.

Более безопасный способ сделать это — сначала поместить деревья в рамку, а затем использовать рамки внутри tikzpicture; в следующем примере я использовал одно и то же дерево три раза, но эту же идею можно применить и к разным деревьям, используя разные рамки для каждого из деревьев.

введите описание изображения здесь

Код:

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

решение2

Один из способов — нарисовать деревья как единое дерево с фантомным корневым узлом:

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

фантомный корень

Связанный контент