定义用于连接森林中节点的特殊边缘样式

定义用于连接森林中节点的特殊边缘样式

我想在依赖关系树中绘制某些边,其中一条线指向上方,如下图所示:

在此处输入图片描述

其代码如下:

\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意识到这些边缘中的额外位,因此必须手动调整间距。

相关内容