我正在尝试从一本书中重新创建下图:
我尝试使用 tikz 的graphdrawing
包:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary {graphs, quotes, graphdrawing} \usegdlibrary{trees}
%\usetikzlibrary {arrows.meta,graphs,graphdrawing} \usegdlibrary {layered}
\begin{document}
\begin{tikzpicture}
\graph [
tree layout,
% layered layout,
grow down, branch right,
nodes={circle ,draw, minimum size=.65cm, inner sep=0pt, very thick},
level/.style={
sibling distance = .15cm,
sibling sep = 0.25cm,
level distance = 0cm,
level sep = 0.1cm
},
level 3/.style={
sibling distance = .0cm,
sibling sep = 0.6cm,
level distance = 0cm,
level sep = 0.1cm
}
] {
1--2--{3,4--{6,7},5--{8--{10,11},9}}
};
\end{tikzpicture}
\end{document}
首先尝试树布局引擎:
然后我尝试了分层布局引擎:
它们非常接近,但都没有达到预期效果。原始布局似乎是两者的混合。请注意,以 5 为根的子图是如何布局为二叉树的,而 1-2-4 链则是使用分层布局得到的。
我还注意到,在原始版本中,节点 4 的位置比其兄弟节点略低。而在分层布局中,由于某种原因,在级别 3 中使用不同的兄弟节点分隔会使节点 4 相对于节点 2 略微偏离中心。
庞大的 tikz 手册没有告诉我如何:
- 每个节点的控制级别预距离
- 在布局之间切换(可能不可行),或者
- 或者,手动轻推最左边的子节点,以便树的其余部分正确对齐。
感谢提供建议(包括使用除 tikz 之外的 illustrator 以外的其他工具更轻松地实现此目的)
答案1
如果您可以考虑使用forest
,那么这个任务相当简单。您只需更改calign
树中的 即可。在此示例中,我们可以设置
for tree={calign child=2}
(或calign=last
在此示例中)在从 开始的子树中4
。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={circle, minimum size=.65cm, inner sep=0pt,draw,thick}
[1
[2
[3]
[4,for tree={calign child=2}
[5]
[6]
]
[5
[8
[10]
[11]
]
[9]
]
]
]
\end{forest}
\end{document}
2
具有垂直对齐和节点的另一个版本4
。
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={circle, minimum size=.65cm, inner sep=0pt,draw,thick}
[1
[2
[3]
[4,for tree={calign child=2},for current={calign with current edge}
[5]
[6]
]
[5
[8
[10]
[11]
]
[9]
]
]
]
\end{forest}
\end{document}
答案2
感谢@user238301 建议使用该forest
包,我能够重新创建精确的布局。
请注意原始布局的细节:
- 2 但必须位于 3 和 5 之间
- 4-7 必须直接与 1-2 对齐
- 6 和 7 必须向左“推”,以便 7 位于 4 下方,而 8 和 9 必须对称地放置在 5 周围(及下方)
做好这件事比想象的要难。
以下是复制品和原始品的并排对比(哪个是哪个?:-)):
代码如下:
\documentclass{article}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={circle, minimum size=.65cm, inner sep=0pt,draw, very thick,edge={line width=1.5pt}}
[1,for tree={l sep=0.15cm, l=0cm}
[2,calign=center, for tree={l sep=0.05cm, s sep=0.3cm}
[3]
[4, before computing xy={s=0mm},for tree={calign=last, s sep=0.05cm}
[6]
[7]
]
[5,for tree={calign=center, s sep=0.05cm}
[8
[10]
[11]
]
[9]
]
]
]
\end{forest}
\end{document}
\end{document}