如何在森林树中的表亲之间绘制水平边(不使用明确的层级)

如何在森林树中的表亲之间绘制水平边(不使用明确的层级)

我试图在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}

相关内容