我可以轻松地在森林中绘制具有水平(方形)边缘的树tikz-qtree
(参见 MWE)。forest
但是,对于我的目的而言,该软件包是一个更好的选择。但是,每次尝试在森林中绘制具有方形边缘的水平或垂直树都会被忽略,或者导致编译失败(例如将线插入\tikzset
森林树)。这可能吗?
在此我们将非常感激您的帮助。
\documentclass[10pt,twoside,a4paper]{memoir}
\usepackage{graphicx}
\usepackage{forest}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\tikzset{edge from parent/.style={draw,edge from parent path={(\tikzparentnode.south)-- +(0,-8pt)-| (\tikzchildnode)}}}
\Tree [.ZZ
[.Bax
[.X
[.Y [.A ] [.B ] ]
[.Z [.C ] [.D ] ] ]
[.F
[.M [.E ] [.F ] ]
[.G [.G ] [.H ] ] ] ]
[.A
[.B
[.S [.I P R T V U ] [.J ] ]
[.I [.K ] [.L ] ] ]
[.M
[.L [.M ] [.N ] ]
[.A [.O ] [.P ] ] ] ] ] ]
\end{tikzpicture}
\begin{forest}
[ZZ
[Bax
[X
[Y [A ] [B ] ]
[Z [C ] [D ] ] ]
[F
[M [E ] [F ] ]
[G [G ] [H ] ] ] ]
[A
[B
[S [I [P][R][T][V][U]] [J ] ]
[I [K ] [L ] ] ]
[M
[L [M ] [.N ] ]
[A [O ] [P ] ] ] ] ] ]
\end{forest}
\end{document}
答案1
您需要做\begin{forest} for tree={edge path=<your path>}}
(无需[]
!)。
我稍微调整了一下距离,最好使用一半的水平距离而不是固定距离。
你也可以使用我的paths.ortho
库(需要tikzlibarypaths.ortho.code.tex
和tikzlibarypaths.ortho.tex
)并且可以用来|-|
代替--
。
代码
\documentclass[10pt,twoside,a4paper]{memoir}
\usepackage{graphicx}
\usepackage{forest}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\tikzset{edge from parent/.style={draw,edge from parent path={(\tikzparentnode.south)-- +(0,-8pt)-| (\tikzchildnode)}}}
\Tree [.ZZ
[.Bax
[.X
[.Y [.A ] [.B ] ]
[.Z [.C ] [.D ] ] ]
[.F
[.M [.E ] [.F ] ]
[.G [.G ] [.H ] ] ] ]
[.A
[.B
[.S [.I P R T V U ] [.J ] ]
[.I [.K ] [.L ] ] ]
[.M
[.L [.M ] [.N ] ]
[.A [.O ] [.P ] ] ] ] ] ]
\end{tikzpicture}
\begin{forest} for tree={
edge path={\noexpand\path[\forestoption{edge}] (\forestOve{\forestove{@parent}}{name}.parent anchor) -- +(0,-12pt)-| (\forestove{name}.child anchor)\forestoption{edge label};}
}
[ZZ
[Bax
[X
[Y [A ] [B ] ]
[Z [C ] [D ] ] ]
[F
[M [E ] [F ] ]
[G [G ] [H ] ] ] ]
[A
[B
[S [I [P][R][T][V][U]] [J ] ]
[I [K ] [L ] ] ]
[M
[L [M ] [.N ] ]
[A [O ] [P ] ] ] ] ] ]
\end{forest}
\end{document}
输出
答案2
edges
对于当前的森林,加载库并添加forked edges
到树的序言是一个简单的问题。
\documentclass[border=10pt]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
forked edges,
[ZZ
[Bax
[X
[Y [A ] [B ] ]
[Z [C ] [D ] ] ]
[F
[M [E ] [F ] ]
[G [G ] [H ] ] ] ]
[A
[B
[S [I [P][R][T][V][U]] [J ] ]
[I [K ] [L ] ] ]
[M
[L [M ] [.N ] ]
[A [O ] [P ] ] ] ] ] ]
\end{forest}
\end{document}
如果您只有 Forest 的 1 版,则此方法无效。在这种情况下,您应该进行更新。如果无法更新,请注意,诸如此类的宏旨\forestove
在作为内部实现的一部分,应避免在最终用户代码中使用,因为它们在更新时很容易中断。相反,请使用 Forest 为此目的提供的包装器,这些包装器更有可能经受住 Forest 内部的任何更改。
\documentclass[border=10pt]{standalone}
\usepackage{forest}% version 1
\begin{document}
\begin{forest}
for tree={
parent anchor=south,
edge path={
\noexpand\path [\forestoption{edge}] (!u.parent anchor) -- ++(0,-5pt) -| (.child anchor)\forestoption{edge label};
}
}
[ZZ
[Bax
[X
[Y [A ] [B ] ]
[Z [C ] [D ] ] ]
[F
[M [E ] [F ] ]
[G [G ] [H ] ] ] ]
[A
[B
[S [I [P][R][T][V][U]] [J ] ]
[I [K ] [L ] ] ]
[M
[L [M ] [N ] ]
[A [O ] [P ] ] ] ] ] ]
\end{forest}
\end{document}