我想利用 tikz-qtree 的间距算法来绘制以下形式的(水平)树
S _ C
---| |---------
| | B
|a|---------
| | A _ U
|_|---| |---
|b| V
|_|---
其中
* 节点和边都可以标记
* 所有边都是水平的
* 节点由不同高度的盒子组成。
实际上,我还想将其扩展到不再是树的图,如以下示例所示
S _ C
---| |---------------
| | B _
|a|---------| | V
| | A _ U |c|---
|_|---| |---|_|
|b|
|_|---------
X
有什么想法可以在这方面扩展 tikz-qtree 吗?也许其他与 tikz 相关的软件包更适合此目的,如果是的话,请告诉我。
答案1
我建议使用我的基于 tikz 的树绘图包forest
。(可在 CTAN 获得。)
不过,我承认绘制你想要的东西并不是一件容易的事。首先是代码和结果,然后是注释。
\documentclass{standalone}
\usepackage{forest}
\begin{document}
\forestset{
horizontal/.style={
edge node/.style={edge label={node[midway,above,font=\scriptsize]{##1}}},
for tree={grow'=0,anchor=center,draw,s sep=3ex,align=center,
if n children=0{tier=leaf}{},
parent anchor=east,
edge path={\noexpand\path[\forestoption{edge}](!u.parent anchor|-.child anchor)--(.child anchor)\forestoption{edge label};},
before typesetting nodes={where content={}{coordinate}{}},
fit=rectangle,
}
}
}
\begin{forest} horizontal
[
[a,minimum height=12ex
[,edge node=C]
[,edge node=B]
[b,minimum height=7ex,edge node=A
[,edge node=U]
[,edge node=V]
]
]
]
\end{forest}
\quad
\begin{forest} horizontal,
[
[a,minimum height=12ex,s sep=1ex
[,edge node=C]
[\phantom{c},name=c1,tier=c,node options'={},edge node=B,s+=2ex
[,edge node=V,before computing xy={s-=3ex}]
]
[b,minimum height=7ex,edge node=A
[\phantom{c},edge node=U,name=c2,tier=c,node options'={},
[,phantom]
]
{\node[fit=(c1)(c2),draw,inner sep=0]{c};}
[,edge node=X]
]
]
]
\end{forest}
\end{document}
关于第一张图片。horizontal
一开始定义的样式将使绘制树变得相当容易(它使边缘水平,定义edge node
绘制标签的样式,使所有叶子对齐,并使空节点协调),但不会自动计算节点的最小高度。(这似乎是一个共同的愿望,所以我在想如何做到这一点。)
关于非树。该包实际上并不是为这些而设计的...因此这张图片必然是作为“黑客”完成的:边 B 和 U 以“幻影”节点 c1 和 c2 结束;一个额外的节点适合两者;边 V(正式属于 c1 节点)和 B 的位置手动调整。