我想使用该forest
包更改图表中特定子节点的位置。
我想要一个按如下方式组织的图表,其中子节点位于根节点的左侧/右侧:
到目前为止,我得到了以下信息。我似乎无法将子节点直接移动到根节点的左侧/右侧:
如何得到想要的结果?
以下是 MWE:
\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree = {
text width=30mm,
if level=0{fill=gray!70}{fill=gray!20},
if level=1{fill=gray!50}{},
forked edge,
}
[Blah Blah Blah
[Should be left of the root node, grow'=west
[Blah Blah Blah
]
]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]]
]
\end{forest}
\end{document}
答案1
更新
不需要手动放置节点的更通用的解决方案是现已推出。
旧解决方案:
森林不是为这种建筑设计的,所以你必须进行一些手动放置:
对于两个特殊节点(left of root
和right of root
),使用手动调整坐标。如果您更改树中的其他间距因子,before computing xy={l=0,s=±3.75cm}
请更改。s
然后使用no edge
来防止以您不想要的方式绘制边,而是name
您想要连接的节点。最后,使用\draw
命令添加额外的边。
我还调整了开头的s sep
和l sep
,使绘制的两条水平边与垂直自动边的长度相同。最后,我添加了fork sep
分叉发生在l sep
长度的一半处。
\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
for tree = {
text width=30mm,
if level=0{fill=gray!70}{fill=gray!20},
if level=1{fill=gray!50}{},
forked edge,
s sep=5mm, l sep=5mm,
fork sep=2.5mm
}
[Root,name=n1
[West of root,before computing xy={l=0,s=-3.75cm},no edge,grow=west,name=n2
[Far west
]
]
[Blah Blah Blah
[Blah Blah Blah
]]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]
[Blah Blah Blah
[Blah Blah Blah
]]
[East of root,before computing xy={l=0,s=3.75cm},no edge,grow=east,name=n3
[Far east
]]
]
\draw(n1)--(n2) (n1)--(n3);
\end{forest}
\end{document}
答案2
我建议采用以下方法。让Should be left of the root node
节点成为“根”的父节点,而Blah Blah Blah
其左侧的节点又成为其父节点(因此是树的实际根)。然后可以通过设置grow=east
这些特殊的“子节点”来实现所需的树几何形状;而且无论如何,很容易将它们的样式设置为我们想要的样式。
relative level
在新的层次结构下,最简单的方法是通过( )设置旧根的“普通子项”的样式>
。另请注意,forked edge
现在应仅为旧根的实际后代设置。
\documentclass[border=2mm]{standalone}
\usepackage[edges]{forest}
\begin{document}
\begin{forest}
level0/.style={fill=gray!70},
level1/.style={fill=gray!50},
level2/.style={fill=gray!20},
for tree={
text width=30mm, anchor=center,
},
[Blah Blah Blah, grow=east, level2,
[Should be left of the root node, grow=east, level1,
[Blah Blah Blah,
level0,
for relative level={1}{level1},
for relative level>={2}{level2},
for descendants={forked edge},
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
[Blah Blah Blah
]]]]
]]]
\end{forest}
\end{document}