这些天,我正在使用 排版很多树(图论意义上的)pst-jtree
,它本质上是 上的宏集合pstricks
。因此,我可能有以下内容。
\jtree
\! = {A}! .
\! = <left>[xunit=5em]{B}!b ^<right>[xunit=5em]{E}!c .
\!b = : {m} {C} : {n} {D} : {o} {p} .
\!c = : {q} {F} : {r} {G} : {s} {t} .
\endjtree
这些是简单的情况。有时我需要在相距一定距离的节点之间绘制一个顶点。我通常使用 来做到这一点\nccurve
,这很巧妙,因为我可以使用@
标签(或\rnode
)来定义贝塞尔曲线的起点和终点,然后使用 、 和 来对其angleA
进行angleB
操作ncurv
。
\jtree
\! = {A}! .
\! = <left>[xunit=5em]{B}!b ^<right>[xunit=5em]{E}!c .
\!b = : {m} {C} : {n} {D}@D !d .
\!c = : {q} {F} : {r} {G} : {s} {t}@t .
\!d = <left>{o} .
\endjtree
\nccurve[angleA=-45,angleB=90,ncurvA=1.2,ncurvB=1.6]{-}{D:b}{t:t}
然而,当树达到一定复杂程度时,我希望对曲线有比我能得到的更多的控制\nccurve
(例如,\nccurve
有时我必须在穿过节点标签的曲线(呃)或具有非常紧密和长弧的曲线(呃再次)之间进行选择)。
对我来说,显而易见的解决方案是tikz
定义一组 n 个点,然后让它在其上绘制一条平滑的曲线。
\begin{tikzpicture}
\draw plot [smooth,tension=1] coordinates { (0,0) (1,1) (2,-2) (3,0)};
\end{tikzpicture}
但是,我不知道如何将这两种策略结合起来。主要问题是(据我所知)\draw
需要我定义(x,y)
坐标,而不是引用@
或\rnode
标签。有办法解决这个问题吗?具体来说,我希望能够编写类似
\begin{tikzpicture}
\draw plot [smooth,tension=1] coordinates { (D:b) (1,1) (2,-2) (t:t)};
\end{tikzpicture}
这个想法是,将(0,0)
设置为标签的底部D
,(t:t)
设置(x,y)
相对于的任意坐标(0,0)
,然后(1,1)
和(2,-2)
相对于设置(0,0)
,像往常一样。
答案1
如果使用forest
,您可以通过将其指定为树的一部分来绘制曲线。在这里,我使用当前节点的父锚点 ( (.parent anchor)
) 作为 的值,shift
以便可以相对于该锚点指定绘图的坐标。然后,我使用命名节点的子锚点t
( (t.child anchor)
) 来指定曲线的终点。
\documentclass[tikz,border=20pt]{standalone}
\usepackage{forest}
\begin{document}
\newlength\myex
\settoheight{\myex}{X}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
anchor=mid,
text height=\myex,
tier/.wrap pgfmath arg={tier #1}{level()},
s sep+=15pt,
}
[A
[B
[m]
[C
[n]
[D, tikz={
\draw [shift=(.parent anchor)] plot [smooth,tension=1] coordinates { (0,0) +(1.25,-.5) +(2.5,1) (t.child anchor)};
}
[o]
[,phantom]
]
]
]
[E
[q]
[F
[r]
[G
[s]
[t, name=t]
]
]
]
]
\end{forest}
\end{document}
的手册forest
很好,但有时有点紧张。第二部分可以找到简要介绍我的答案相关问题。这解释了如何使用括号表示法指定树,并介绍了该包的一些基本功能。