我试图在forest
树中与根节点距离相等的两个节点之间画一条水平线(因此是兄弟或 n 度堂兄弟)。
使用手册第 3.5 节中给出的相对节点名称forest
,实际上可以很容易地为兄弟节点实现这一点。这是我取得的进展:
\documentclass[
,crop=true
,varwidth=\maxdimen
]{standalone}
\usepackage{forest}
\forestset{
<--/.style={ % draw horizontal line to predecessor
before drawing tree={tikz+={\draw[dashed](!)--(!p);}}},
-->/.style={ % draw horizontal line to successor
before drawing tree={tikz+={\draw[dashed](!)--(!n);}}},
-->>/.style={ % draw horizontal line to successor cousin
before drawing tree={tikz+={\draw[dashed](!)--(!>);}}},
}
\begin{document}
\Forest{
[,phantom
[S,--> [NP,-->>,tier=cousin1th [D [the]]]]
[S,--> [NP,-->>,tier=cousin1th [A [absent]]]]
[S, [NP,tier=cousin1th [N [student]]]]
]
}
\end{document}
我定义了选项<--
和-->
以便绘制到上一个或下一个兄弟节点的水平边。但是,当尝试将其扩展到 n 度相邻的堂兄弟节点(参见-->>
)时,我必须tier
在相应节点中明确指定。有没有不使用 来实现这一点的方法tier
?例如,在 MWE 中,我想以类似的方式连接两个 NP 节点,即不使用tier=cousin1th
。
答案1
似乎是一件很奇怪的事情......这让我怀疑这是否真的是你在这里想做的事情。
“表亲”的概念似乎没有明确的定义,除非它仅适用于满足未指明的结构限制的树。
例如,当祖先有不同数量的子女时会发生什么?堂兄弟是水平方向还是垂直方向更接近?
换句话说,到底什么才算与根“距离相等”?根的第 3 个子节点的第 4 个子节点的第 11 个子节点与根的第 4 个子节点的第 2 个子节点的第 2 个子节点的第 7 个子节点的距离相等吗?它是 22 的第 11 个子节点还是 11 的第 11 个子节点有关系吗?或者它只是到根的步数?那么同一层上的所有节点都是堂兄弟吗?
尽管如此,以下实现A“堂兄弟”的概念。这个概念与问题中的例子一致,但它是否与任何有意或有用的概念相一致则更值得怀疑。
\Forest{
[,phantom
[S, [NP, [D, [the, ]]]]
[S, twp [NP, twp [N, twp [student, twp]]]]
]
}
\Forest{
[,phantom
[S, twn [NP, twn [D, twn [the, twn]]]]
[S, [NP, [N, [student, ]]]]
]
}
\Forest{
[,phantom
[S, twn [NP, twn [D, [the, twn]]]]
[S, twp [NP, [N, twp [student, ]]]]
]
}
请注意,如果您请求显示节点与不存在的“表兄弟”之间的关系,代码将默认失败。
还有类似
\Forest{
[,phantom
[S, [NP, [D, [the, twn ]]]]
[S, [A, [absent, twn ]]]
[S, twp [NP, twp [N, twp [student]]]]
]
}
\Forest{
[,phantom
[S, [A, [absent, ]]]
[S, [NP, [D, [the, ]]]]
[S, twp [NP, twp [N, twp [student, twp]]]]
]
}
会产生类似下面的结果
这可能不是我们所期望的。(但是,那又是什么呢?)
显然,以上内容是语言上的胡言乱语。至少,如果不是这样,那将是令人惊讶的。尽管如此,代码还是可以编译的。这是否是一个优势又是另一回事。
\documentclass[border=10pt]{standalone}
\usepackage{forest}
\forestset{
conn/.style n args=2{
no edge,
tikz+={\draw [dashed] (#1) -- (#2);}
},
twn/.style={
before drawing tree={
temptoksa=,
tempcounta/.option=level,
if nodewalk valid={n}{conn={}{!n}}{
for nodewalk={
while nodewalk valid={u}{
tempcountb/.option=n,
u,
if={> OR>{n children}{tempcountb} }{
tempcountc/.register=tempcountb,
tempcountc'+=1,
n/.register=tempcountc,
while nodewalk valid={1}{
1,
if={ > OR= {level}{tempcounta} }{
temptoksa/.option=name,
break=1
}{}
}
}{}
}
}{},
if temptoksa={}{}{conn/.process={_R {}{temptoksa}}}
},
},
},
twp/.style={
before drawing tree={
temptoksa=,
tempcounta/.option=level,
if nodewalk valid={p}{conn={}{!p}}{
for nodewalk={
while nodewalk valid={u}{
u,
if n=1{}{
p,
while nodewalk valid={1}{
1,
if={ > OR= {level}{tempcounta} }{
temptoksa/.option=name,
break=1
}{}
}
},
}
}{},
if temptoksa={}{}{conn/.process={_R {}{temptoksa}}}
},
},
},
}
\begin{document}
\Forest{
[,phantom
[S, [NP, [D, [the, ]]]]
[S, twp [NP, twp [N, twp [student, twp]]]]
]
}
\Forest{
[,phantom
[S, twn [NP, twn [D, twn [the, twn]]]]
[S, [NP, [N, [student, ]]]]
]
}
\Forest{
[,phantom
[S, twn [NP, twn [D, [the, twn]]]]
[S, twp [NP, [N, twp [student, ]]]]
]
}
\end{document}