我想在依赖关系树中绘制某些边,其中一条线指向上方,如下图所示:
其代码如下:
\documentclass{article}
\usepackage{forest}
\forestset{
dg edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word,edge=dotted,calign with current edge}{}}},
}
\begin{document}
\begin{forest}
dg edges
[V,l sep=2\baselineskip
[N
[D [the] ]
[child] ]
[Adv,name=often [often]]
[reads]
[N
[D [the] ]
[book] ]
[Adv,name=slowly [slowly]] ]
\draw (often.north)--($(often.north)+(0,.3)$);
\draw (slowly.north)--($(slowly.north)+(0,.3)$);
\end{forest}
\end{document}
手册中forest
有不同的边缘样式(第 33 页)。我想为这样的边缘定义一种样式,这样我就可以写[Adv, edge=adjunct]
。完美的解决方案还应考虑绘制向上线所需的空间,这样我就可以放弃l sep
上面的规范。
答案1
您可以使用第 33 页中介绍的选项。edge path
它包含生成边的代码。默认情况下,它是
edge path={\noexpand\path[\forestoption{edge}](!u.parent anchor)--(.child anchor)\forestoption{edge label};}
我们可以对其进行修改(基于每个节点),以在子节点之上产生一个额外的位:
edge path={\noexpand\path[\forestoption{edge}](!u.parent anchor)--(.child anchor)-- +(0,10pt)\forestoption{edge label};}
这里10pt
是任意的。
然后可以将其捆绑成一种样式adjunct
并按如下方式使用它:
\documentclass{article}
\usepackage{forest}
\forestset{
dg edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom,where n children=0{tier=word,edge=dotted,calign with current edge}{}}},
adjunct/.style={edge path={\noexpand\path[\forestoption{edge}]
(!u.parent anchor)--(.child anchor)-- +(0,#1)\forestoption{edge label};}},
adjunct/.default=10pt
}
\begin{document}
\begin{forest}
dg edges
[V,l sep=2\baselineskip
[N
[D [the] ]
[child] ]
[Adv,adjunct [often]]
[reads]
[N
[D [the] ]
[book] ]
[Adv,adjunct=20pt [slowly]] ] % 20pt just for demonstration
\end{forest}
\end{document}
来自手册:
节点定位算法对边敏感,即它将避免节点与边重叠或两个边重叠。但是,定位算法总是表现得好像具有
edge path
默认值 —改变edge path
不影响包装! 对不起。
因此似乎没有简单的方法来forest
意识到这些边缘中的额外位,因此必须手动调整间距。