我的一些树的输出非常奇怪forest
。下面是一个简单的例子:
\documentclass{article}
\usepackage[linguistics]{forest}
\usepackage{amsmath}
\newcommand{\trace}[1]{$\langle\text{#1}\rangle$}
\usetikzlibrary{positioning}
\usepackage{gb4e}
\forestset{
bnode/.style=
{draw=red,
thick,fit=(),
circle,
label=right:{\itshape bounding node}},
default preamble={for tree={inner sep=0pt,s sep=.25in}},
}
\begin{document}
\begin{forest}
[CP [DP\\{Who_{i}},name=SPEC ] [\ibar{C} [C\\was_{j} ] [TP,bnode [{DP_{k}},name=SUBJ,bnode [D\\{a} ] [NP [N\\story ] [PP [P\\about ] [DP\\{\trace{who}},name=TRACE ] ] ] ] [\ibar{T} [T\\t_{j} ] [VP [VP [V\\written ] [DP\\t_{k} ] ] [PP [P\\by ] [DP\\John ] ] ] ] ] ] ]
\draw[->,thick,dashed,red] (TRACE.south) to [bend left=120] node[rotate=45] {{\large\textbf{=}}} (SPEC.south);
\end{forest}
\end{document}
答案1
fit
是命名空间tikz
中的键/tikz
。在命名空间中Forest
实现,它指向给定节点行走中访问的节点。fit to
/tikz
fit
OP 的定义bnode
不起作用,因为它尝试fit
一个forest
节点,即一个由 定位的节点forest
。此外,它尝试根据自身调整大小/定位:fit=()
在排版节点时进行处理并()
引用当前forest
节点,即“调用”节点本身。(请注意,即使没有自引用,代码也不会工作,因为每个节点都是“单独”排版的,并且稍后才会定位到正确的位置。排版节点时forest
不能引用其他节点。)forest
forest
tikz
's/tikz/fit
和forest
's都/tikz/fit to
适用于“普通”tikz
节点,即节点不是由 定位forest
。因此 的定义bnode
应如下。
bnode/.style={
tikz+={
\node[draw=red,thick,fit=(),circle,
label=right:{\itshape bounding node}]{};
}
},
这是可行的,因为tikz
代码是在节点已经绘制后执行的(实际上,所有节点都是如此)。但forest
知道代码来自哪个森林节点,并()
引用该节点。(请注意,forest
侵入tikz
隐式坐标系使此引用成为可能;包选项tikzcshack
禁用了这种侵入。)
在这个例子中,“正常”fit
已经足够了,但fit to
也可以使用,如下所示:
bnode/.style={
tikz+={
\node[draw=red,thick,fit to=current,circle,
label=right:{\itshape bounding node}]{};
}
},
这可以轻松修改为让圆圈同时包含节点及其父节点,例如:
bnode/.style={
tikz+={
\node[draw=red,thick,fit to={current,parent},circle,
label=right:{\itshape bounding node}]{};
}
},