森林树木中的奇怪物品

森林树木中的奇怪物品

我的一些树的输出非常奇怪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/tikzfit

OP 的定义bnode不起作用,因为它尝试fit一个forest节点,即一个由 定位的节点forest。此外,它尝试根据自身调整大小/定位:fit=()在排版节点时进行处理并()引用当前forest节点,即“调用”节点本身。(请注意,即使没有自引用,代码也不会工作,因为每个节点都是“单独”排版的,并且稍后才会定位到正确的位置。排版节点时forest不能引用其他节点。)forestforest

tikz's/tikz/fitforest'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}]{};
  }
},

相关内容