如何按照 Heim & Kratzer(1998)的风格绘制短语圣诞树?

如何按照 Heim & Kratzer(1998)的风格绘制短语圣诞树?

我正在尝试弄清楚如何绘制简单的句法树,就像 Heim & Kratzer 的《语义与生成语法》中出现的一样。我不想包含诸如 NP、VP 等标签,而且我还需要能够包含比此处所示示例更多的分支。感谢您的帮助!

示例图像

答案1

由于我手边正好有一本 Heim 和 Kratzer 的书,所以你的问题就更加神秘了,因为他们的大多数树都有标签(尽管有些没有标签),而且都是二叉树。下面是使用该forest软件包绘制的一棵树,供你入门:

我使用了nice empty nodes样式来允许无标签节点,并pad为非常小的节点(如1节点)创建了样式。DPcalign with current节点的添加使 VP 树变得扁平(没有它,树看起来会很丑陋)。[感谢 cfr 提供该代码。]

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em}}
\begin{document}
\begin{forest}nice empty nodes
[S  
    [ {every linguist} ] 
    [ [1,pad ]  [S [ John ] 
                [   [T,pad ]  
                    [VP [V\\introduced ] 
                        [DP\\$t_{1}$,calign with current ] 
                        [PP\\{to Mary}]]]]]]
\end{forest}
\end{document}

代码输出

或者,如果您不介意空节点分支有多直,那么您可以对空节点使用略有不同的定义。这对于非二叉树来说可能更好。(并且不需要在 DP 节点中进行手动修复。)

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em},
    empty nodes/.style={
            delay={where content={}{shape=coordinate,for parent={
                  for children={anchor=north}}}{}}
}}
\begin{document}
\begin{forest} empty nodes
[S  
    [ {every linguist} ] 
    [ [1,pad]  [S [ John ] 
                [   [T,pad]  
                    [VP [V\\introduced, ] 
                        [DP\\$t_{1}$ ] 
                        [PP\\{to Mary}]
                    ]]]]]
\end{forest}
\end{document}

代码输出

答案2

“更多分支”的含义不明确。你可能是指某些节点需要有 2 个以上的子节点,也可能是指你只需要更多二进制分支。

在第二种情况下,只需使用linguisticswith 库nice empty nodes就可以为你的树做很多事情。然而,在第一种情况下,nice empty nodes会引起问题。如果你的树主要是二进制的,就像 AlanMunn 的例子一样,那么在特别指定基础是一个合理的选择。但是,如果分歧太大,你最好nice empty nodes根本不要在这里使用。

这是艾伦 (Alan) 的例子的改编,它演示了这个问题。

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{pad/.style={minimum width=5em}}
\begin{document}
\begin{forest}
  nice empty nodes
  [S
    [{every linguist}
    ]
    [
      [1, pad
      ]
      [Additional thing]
      [Other thing]
      [S
        [ John
        ]
        [
          [T, pad
          ]
          [VP
            [V\\introduced
            ]
            [DP\\$t_{1}$, calign with current
            ]
            [PP\\{to Mary}
            ]
          ]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

不是很二进制

在这种情况下,calign with current没有太大的帮助,因为我们会得到

没有更好的

也没有更好

这里有两个问题。一是子节点数量为偶数,因此没有中间子节点与父节点对齐。二是非二叉树的分支不限于树的终端节点。

在这种情况下,尝试将 设为空节点less ugly而不是可能会更好nice。例如,

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage[linguistics]{forest}
\forestset{%
  pad/.style={minimum width=5em},
  less ugly empty nodes/.style={%
    nice empty nodes,
    before typesetting nodes={%
      where={(n_children())>2}{%
        if={isodd(n_children())}{%
          for n={int((n_children()+1)/2)}{calign with current},
        }{%
          for n={int((n_children())/2)}{insert after={[,phantom,calign with current]}},
        },
        if nodewalk valid={uu}{%
          if={(n_children("!u")<3)&&(n_children("!uu")>2)}{!u.calign=midpoint}{},
        }{%
          if nodewalk valid=u{%
            !u.calign=midpoint,
          }{},
        },
      }{},
    },
  }
}
\begin{document}
\begin{forest}
  less ugly empty nodes
  [S
    [{every linguist}
    ]
    [
      [1, pad
      ]
      [Additional\\thing]
      [Other\\thing]
      [S
        [ John
        ]
        [
          [T, pad
          ]
          [VP
            [V\\introduced
            ]
            [DP\\$t_{1}$
            ]
            [PP\\{to Mary}
            ]
          ]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

更少丑陋的空节点

即使树木看上去非常奇怪,效果也不会太糟糕。

看起来很疯狂的树

\begin{forest}
  less ugly empty nodes
  [S
    [{every linguist}
    ]
    [wants]
    [
      [1, pad
      ]
      [Additional\\thing]
      [Other\\thing]
      [S
        [ John
        ]
        [
          [T, pad
          ]
          [VP
            [V\\introduced
            ]
            [DP\\$t_{1}$
            ]
            [PP\\{to Mary}
            ]
          ]
        ]
      ]
    ]
    [to be
      [a]
      [philosopher
        [every philosopher
          [wants]
          [
            [to]
            [be]
            [a
              [mathematician]
            ]
          ]
        ]
      ]
    ]
  ]
\end{forest}

理想情况下,我猜代码会测试疯狂并自动调整。然而,这个问题的答案需要一个不同的、希望更清晰的问题。

相关内容