잎이 수렴하는 가지에 연결된 트리 다이어그램을 어떻게 그릴 수 있습니까?
\documentclass{article}
\usepackage{fullpage}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows,shapes,positioning,shadows,trees}
\usetikzlibrary{arrows.meta}
\usepackage{mdframed}
\usepackage{boxedminipage}
\usepackage{forest}
\begin{document}
\begin{forest}
% Styling
for tree={
align=center,
parent anchor=south,
child anchor=north,
edge={thick, -{Stealth[]}},
l sep+=10pt,
edge path={
\noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- +(0,-10pt) -| (.child anchor)\forestoption{edge label};
},
if level=0{
inner xsep=-15pt,
tikz={\draw [thick] (.south east) -- (.south west);}
}{}
}
%
[Alphabet
[a
[b]
[c] ]
[b
[d]
[e] ]
]
\end{forest}
\end{document}
아래 스케치에 표시된 방식으로 모든 가지를 어떻게 연결할 수 있습니까?
답변
3 AndréC
업데이트 2 : 노드 워크 사양이있는 노드 간 화살표
두 노드를 연결 하는 모든 추가 화살표 (포레스트에서 기본적으로 구축되지 않음) 는 짧은 노드 걷기 구문 을 사용하여 트리에 배치됩니다 . 이것은 이전과 같이 노드 이름을 지정하지 않고 (실제 스타일 연습) . 이 화살표의 시각화를 허용하기 위해 빨간색으로 채색했습니다 .
나는 매뉴얼을 인용한다.
노드 워크는 노드 관계를 간결하게 표현하는 방법입니다. 단일 문자로 표시되는 단계의 문자열입니다. 여기서 u 는 상위 노드 (up)를 나타냅니다. 이전 형제의 경우 p ; 다음 형제의 경우 n ; 이야 에 대한 (이진 나무에 유용) 형제; 1 , 2 ,. . . 9 첫 번째, 두 번째. . . 아홉 번째 아이; l, 마지막 자식 등. 전체 사양은 섹션 3.8.7을 참조하십시오 .
\documentclass[border=5mm]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\useforestlibrary{linguistics}
\begin{document}
\begin{forest}
% Styling
for tree={
align=center,
parent anchor=south,
child anchor=north,
edge={thick, -{Stealth[]}},
l sep+=10pt,
edge path={\noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- +(0,-10pt) -| (.child anchor)\forestoption{edge label};
},
if level=0{inner xsep=-15pt,tikz={\draw [thick] (.south east) -- (.south west);}
}{}
}
%
[Alphabet
[a
[b]
[c,s sep=10,
[f,s sep=30,
[,phantom]
[z,edge={white}]
{\draw[thick,red,-{Stealth[]}] (!rllN.south east) -- +(0,-10pt) -| (!c); %<-- arrow from g to z
\draw[thick,red] (!uss.south west) -- +(0,-10pt) -| (!c) ;%<-- arrow from f to z
}
]{\draw[thick,red,shorten >=3pt] (!us.south) -- +(0,-10pt) -| (!c) ;}%<-- arrow from b to f
[,phantom]
]
]
[b
[d]
[e,s sep=9
[g]{\draw[thick,red,shorten >=3pt] (!us.south) -- +(0,-10pt) -| (!c) ;}%<-- arrow from d to g
[,phantom]
]
]
]
\end{forest}
\end{document}
업데이트에 대한 응답
이 결과를 얻기 위해 많은 수정 작업을 수행했기 때문에 우아하게 코딩했는지 확신 할 수 없습니다. 산림 전문가가 오면 어떤 개선이 필요한지 듣고 있습니다.
\documentclass[border=5mm]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\useforestlibrary{linguistics}
\begin{document}
\begin{forest}
% Styling
for tree={
align=center,
parent anchor=south,
child anchor=north,
edge={thick, -{Stealth[]}},
l sep+=10pt,
edge path={\noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- +(0,-10pt) -| (.child anchor)\forestoption{edge label};
},
if level=0{inner xsep=-15pt,tikz={\draw [thick] (.south east) -- (.south west);}
}{}
}
%
[Alphabet
[a
[b,name=b]
[c,s sep=10,
[f,name=f,s sep=30,
[,phantom]
[z,name=z,edge={white}]
]
[,phantom]
]
]
[b
[d,name=d]
[e,s sep=9
[g,name=g]
[,phantom]
]
]
]
\draw[thick,shorten >=2pt] (b.south) -- +(0,-10pt) -| (f.north);
\draw[thick,shorten >=2pt] (d.south) -- +(0,-10pt) -| (g.north);
\draw[thick,shorten >=2pt] (g.south east) -- +(0,-10pt) -| (z.north);
\draw[thick,-{Stealth[]}] (f.south west) -- +(0,-10pt) -| (z.north);
\end{forest}
\end{document}
이전 답변
더 우아한 해결책이있을 수 있지만 여기에 제 제안이 있습니다.
\documentclass[border=5mm]{standalone}
\usepackage{forest}
\usetikzlibrary{arrows.meta}
\useforestlibrary{linguistics}
%\usepackage{fullpage}
%\usepackage[utf8]{inputenc}
%\usepackage{tikz}
%\usetikzlibrary{arrows,shapes,positioning,shadows,trees}
%\usepackage{mdframed}
%\usepackage{boxedminipage}
\begin{document}
\begin{forest}
% Styling
for tree={
align=center,
parent anchor=south,
child anchor=north,
edge={thick, -{Stealth[]}},
l sep+=10pt,
edge path={\noexpand\path [draw, \forestoption{edge}] (!u.parent anchor) -- +(0,-10pt) -| (.child anchor)\forestoption{edge label};
},
if level=0{inner xsep=-15pt,tikz={\draw [thick] (.south east) -- (.south west);}
}{}
}
%
[Alphabet
[a
[b,name=b]
[c,name=c
[,phantom]
[z,name=z]
]
]
[b
[d,name=d]
[e,name=e]
]
]
\draw[thick,shorten >=2pt] (b.south) -- +(0,-10pt) -| (z.north);
\draw[thick,shorten >=2pt] (d.south) -- +(0,-10pt) -| (z.north);
\draw[thick,shorten >=2pt] (e.south) -- +(0,-10pt) -| (z.north);
\end{forest}
\end{document}