通过使用不同高度的节点框,仅允许水平边缘(带标签)

通过使用不同高度的节点框,仅允许水平边缘(带标签)

我想利用 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 的位置手动调整。

相关内容