使用森林格式化特定的终端节点并删除它们和它们的父节点之间的线

使用森林格式化特定的终端节点并删除它们和它们的父节点之间的线

使用时forest包来绘制语言语法树,如何才能防止在特定的终端节点和它们的父节点之间画线,同时仍然将它们保持为由forest/看到的单独“节点” TikZ,以方便程序格式化?

以下是所需输出的示例(使用我当前的解决方法生成,如下面的 MWE 中所示):

示例所需输出树

我目前的解决方法包括以下内容,但需要太多的手动干预:

  • 我通过创建一个单个节点,然后强制在句法类别(如果存在)和它的词汇实现(如果存在)之间换行,来删除“终端节点”和它的“父节点”之间的行,例如[DP\\the apple]
  • 具有词汇项的终端节点会通过使用xcolor包着色来手动装饰这些词项(例如[DP\\\textcolor{blue}{the apple}]

理想情况下,我希望能够以编程方式在环境中应用类似以下代码forest

for tree={
    if n children=0{
        text=blue
    }{},
}

但是,添加上述代码片段会产生以下不必要的输出:

示例-不需要的输出树

我认为解决方案可能与设置“词汇终端节点”类型有关(即终端节点属于词汇类型,而不是空或句法类别),然后仅将文本修饰应用于该类型的节点。但是,我不确定如何在 中执行此操作forest,或者这是否是好的/最佳的解决方案。

最小工作示例(当前的解决方法)

\documentclass[a4paper]{article}

% ----- Package Imports -----
\usepackage{amsmath, amssymb, amsthm, mathtools} % Math enhancements
\usepackage{newpxtext, newpxmath} % Palatino fonts (load after amssymb)
\usepackage[svgnames]{xcolor} % Custom colours
%\usepackage[style=ieee]{biblatex} % Bibliography
\usepackage[linguistics]{forest} % Linguistic syntax trees

\begin{document}
\begin{forest}
    [CP
        [\phantom{X}]
        [C'
            [C]
            [TP 
                [\phantom{X},name=TP-spec]
                [T'
                    [T\\\textcolor{blue}{$\varnothing_{\text{past}}$},name=TP-head]
                    [VoiceP 
                        [DP\\\textcolor{blue}{Bill}]
                        {\draw[->] () to[out=south west,in=west,distance=2cm] (TP-spec);}
                        [Voice' 
                            [Voice\\\textcolor{blue}{$\varnothing_{\text{active}}$}]
                            [VP 
                                [DP]
                                [V'
                                    [V\\{[}FORM preterite{]}\\\textcolor{blue}{ate}]
                                    [DP\\\textcolor{blue}{the apple}]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
\end{forest}
\end{document}

答案1

应用于no edge节点可防止绘制其父节点的边。

l sep=0父节点和子节点上的组合l=0使它们在垂直方向上彼此靠近。

我发现如果我在子项上另外设置inner ysep=0(这会使类别和词汇内容更加接近),并且用TikZ 的:覆盖 Forest 的align(将节点内容放在 tabular环境中,从而创建一些额外的垂直空间),结果会最令人满意。align\forestset{align/.style={/tikz/align={#1}}}

\documentclass[a4paper]{article}

% ----- Package Imports -----
\usepackage[svgnames]{xcolor} % Custom colours
\usepackage{amsmath, amssymb, amsthm, mathtools} % Math enhancements
\usepackage{newpxtext, newpxmath} % Palatino fonts (load after amssymb)
%\usepackage[style=ieee]{biblatex} % Bibliography
\usepackage[linguistics]{forest} % Linguistic syntax trees

\forestset{align/.style={/tikz/align={#1}}}

\begin{document}
\begin{forest}
  for tree={
    if n children=1{
      l sep=0,
      for 1={no edge, l=0, inner ysep=0, blue}
    }{},
  }
    [CP
        [\phantom{X}]
        [C'
            [C]
            [TP 
                [\phantom{X},name=TP-spec]
                [T'
                    [T[$\varnothing_{\text{past}}$,name=TP-head]]
                    [VoiceP 
                        [DP[Bill]
                          {\draw[->] () to[out=south west,in=west,distance=2cm] (TP-spec);}
                        ]
                        [Voice' 
                            [Voice[$\varnothing_{\text{active}}$]]
                            [VP 
                                [DP]
                                [V'
                                    [V\\{[}FORM preterite{]}[ate]]
                                    [DP[the apple]]
                                ]
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ]
\end{forest}
\end{document}

修改对排版树的影响

相关内容