뿌리가 있는(위쪽을 향하는) 나무(잎 포함)를 그려야 했습니다. 패키지를 찾았어요숲유용하지만 내가 사용한 해결 방법은 적절한 의미에서 실제로 최적이 아닐 가능성이 높습니다. 그러한 트리의 예는 다음과 같습니다.
\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}
질문.이 백서 [1]의 7페이지에서 설명한 것처럼(xypic을 사용하여) 하나의 뿌리 트리에서 다른 트리로 화살표를 어떻게 그릴 수 있습니까?
답변1
또 다른 옵션으로, 만약의 경우 화살표를 더 세밀하게 제어할 수 있습니다.CFR님의 솔루션직접 사용할 수 없는 경우 TikZ의 s에 나무를 배치한 \node
다음 노드 이름을 사용하여 화살표를 그리는 것입니다.
이를 수행하는 더 안전한 방법은 먼저 나무를 상자에 넣은 다음 내부 상자를 사용하는 것입니다 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}