多优势树与森林

多优势树与森林

我很好奇,是否可以绘制如下的多显性树\Forest

多支配树(目标)

我已经找到了使用qtree(的证据向多支配结构添加树或终端词),但如果可能的话,我希望能够做到这一点Forest

确定了如何让树中较高的句法终端附着到较低的成分上,例如:

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{
  nice nodes/.style={
    for tree={
      inner sep=0pt,
      fit=band,
    },
  },
  default preamble=nice nodes,
}
\begin{document}
\begin{forest}
sn edges
[L,name=L 
    [,name=D] 
        [ 
            [$\beta$] 
            [K 
                [$\gamma$,name=G] 
                [$\alpha$]
            ]
        ] 

]
\begin{pgfinterruptboundingbox}
\draw[-,looseness=1] (G) to [out=west,in=south] (D);
\end{pgfinterruptboundingbox}
\end{forest}
\end{document}

...结果如下:

多支配树(尝试)

但是,这些树显然非常不同。我对 LaTeX 还很陌生,所以我甚至不确定从哪里开始尝试。

答案1

我认为没有人花时间去想办法制作通用的多显性结构。因此,除非受到很大限制,否则它们总是需要某种人工干预,就像在描述的音位多显性例子中一样这里。但这forest确实使事情变得更容易一些,因为它使树中的每个节点都成为 TikZ 节点,因此将任意位连接在一起并不难。这是协调文献中典型的多支配结构的示例。我选择在节点之间使用直线连接,但可以根据您的喜好使用曲线进行调整。

这里的主要技巧是,多支配节点理想情况下应该连接到树本身(在本例中,我将其连接到节点\&),因为您不能将树嵌入树中。因此,如果可能的话,您想要连接的所有节点都必须是同一棵树的一部分。

\documentclass{article}
\usepackage[linguistics]{forest}
\newcommand*\1{$'$}
\begin{document}
\begin{forest}
[\&P 
    [TP [DP\\Sam ] [T\1 [T ] [VP,name=VP1 [V\\caught ] [DP,phantom] ]]]
    [\&\1
        [\&\\and, [DP,no edge,l=1.25in,name=shared [D\\a ][NP\\fish ]]]
        [TP [DP\\Alex ] [T\1 [T] [VP,name=VP2 [V\\cooked ] ][DP,phantom ] ]]
    ]
]
\draw (VP1.south) -- (shared.north);
\draw (VP2.south) -- (shared.north);
\end{forest}

\end{document}

代码输出

对于曲线,想法是一样的,只需使用语法to[...]

\documentclass{article}
\usepackage[linguistics]{forest}
\newcommand*\1{$'$}
\begin{document}
\begin{forest}
[TP,name=TP [DP,phantom] 
    [T\1 [T [DP\\Alex,name=shared,l=.5in,no edge  ][XP,phantom]]
        [VP,name=VP [DP,phantom] [V\1  [V\\smokes ]  ]]]]
\draw (shared.north) to[out=80] (TP.south);
\draw (shared.north) to[out=-40] (VP.south);
\end{forest}

\end{document}

第二个代码的输出

将 cfr 的代码调整为更灵活的代码,我们可以定义一种multidom采用 6 个参数的样式:

multidom={<x-shift>}{<y-shift}{<out1>}{<node1>}{<out2>}{<node2>}

这使得这种风格的节点在X方向,并设置连接节点到其父节点的线的出位置。这种风格减少了前面例子中所需的 hack 数量。特别是,多支配节点本身实际上是其父节点之一的子节点,而不是附加到树中的某个任意节点。您仍然需要在第二个父节点的位置添加一个幻影节点,以便父节点的分支角度看起来正确。

这是一个完整的例子:

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{multidom/.style n args=6{%
    no edge,
    before drawing tree={%
      for tree={x'+=#1,y'+=#2},
      tikz+={%
        \draw [-] (.#3) to [out=#3,looseness=.5] (#4.south);
        \draw [-] (.#5) to [out=#5,looseness=.5] (#6.south);
      }
    },
  }
}
\newcommand*\1{$'$}
\begin{document}
\begin{forest}
[TP,name=TP [DP,multidom={-.5cm}{-2cm}{north}{TP}{east}{VP} [D\\the ][NP\\chimney ]] 
    [T\1 [T ]
        [VP,name=VP [DP,phantom] [V\1  [V\\smokes ]  ]]]]
\end{forest}
\end{document}

第三个代码的输出

答案2

已更新 已更新答案

此版本支持append3 个以上父级。但是,如果偏移量为负数且为厘米的几分之一,则必须改为指定毫米。(即使直接'+赋值也是如此。)如果有人知道原因,请告诉我。

多支配和多多支配

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{% addaswyd o ateb Alan Munn: https://tex.stackexchange.com/a/695600/ (addaswyd o fy ateb gwreiddiol)
  declare keylist={other parents}{},
  declare boolean register={inc multidom},
  not inc multidom,
  declare toks register={multidom toksa},
  multidom toksa={},
  declare toks register={multidom toksb},
  multidom toksb={},
  declare toks register={multidom toksc},
  multidom toksc={},
  declare toks register={multidom toksd},
  multidom toksd={},
  declare dimen register={multidom dimx},
  multidom dimx'=0pt,
  declare dimen register={multidom dimy},
  multidom dimy'=0pt,
  includes multidom/.style={%
    where={>{O_=!}{other parents}{}}{%
      split option={other parents}{,}{multidom aux},
    }{},
  },
  multidom aux/.style={%
    multidom toksa={},
    multidom toksb={},
    multidom toksc={},
    multidom toksd={},
    multidom dimx'=0pt,
    multidom dimy'=0pt,
    split={#1}{:}{multidom toksa,temptoksa,temptoksb,multidom toksb,multidom toksc,multidom toksd},
    if={>{R_=}{multidom toksd}{}}{% no sixth arg -> resplit -> multidoms
      split={#1}{:}{multidom toksa,multidom toksb,multidom toksc},
      multidoms/.process={RRR{multidom toksa}{multidom toksb}{multidom toksc}},      
    }{% sixth arg -> (first) multicom
      split={#1}{:}{multidom toksa,multidom dimx,multidom dimy,multidom toksb,multidom toksc,multidom toksd},
      typeout/.register=multidom dimx,
      multidom/.process={RRRRRR{multidom toksa}{multidom dimx}{multidom dimy}{multidom toksb}{multidom toksc}{multidom toksd}},
    },
  },
  multidoms/.style n args=3{%
    before typesetting nodes={%
      temptoksa/.option=content,
      for nodewalk={fake=current,name=#3}{#1/.expanded={[\foresteregister{temptoksa},phantom]}},
    },
    before drawing tree={% parametised from https://tex.stackexchange.com/a/249615/
      tikz+={%
        \draw [-] (.#2) to [out=#2,looseness=.5] (#3.south);
      },
    },
  },
  multidom/.style n args=6{%
    no edge,
    before typesetting nodes={%
      temptoksa/.option=content,
      for nodewalk={fake=current,name=#6}{#1/.expanded={[\foresteregister{temptoksa},phantom]}},
    },
    before drawing tree={% parametised from https://tex.stackexchange.com/a/249615/
      for tree={x'+=#2,y'+=#3},
      tikz+={%
        \draw [-] (.#4) to [out=#4,looseness=.5] (!u.south);
        \draw [-] (.#5) to [out=#5,looseness=.5] (#6.south);
      },
    },
  },
  multidom prepend/.style n args=5{multidom={prepend}{#1}{#2}{#3}{#4}{#5}},
  multidom append/.style n args=5{multidom={append}{#1}{#2}{#3}{#4}{#5}},
  default preamble+={%
    delay={%
      for tree={%
        if={>{O_=!}{other parents}{}}{inc multidom}{},
      },
    },
    before typesetting nodes={if inc multidom={includes multidom}{}},
  },
}
\newcommand*\1{$'$}
\begin{document}
\begin{forest}
  [TP,name=TP 
  [DP,multidom prepend={-.5cm}{-2cm}{north}{east}{VP} 
    [D\\the ]
    [NP\\chimney ]
    ] 
    [T\1
      [T ]
      [VP,name=VP  
        [V\1  
          [V\\smokes ] 
        ]
      ]
    ]
  ]
\end{forest}

\begin{forest}
  [TP,name=TP 
  [DP,other parents={prepend:-5mm:-2cm:north:east:VP,prepend:south east:V}
    [D\\the ]
    [NP\\chimney ]
    ] 
    [T\1
      [T ]
      [VP,name=VP  
        [V\1,name=V
          [V\\smokes ] 
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

更新答案

这是艾伦对我下面原始答案的修改。此版本消除了其中一个参数,并且不需要将幻像节点添加到另一个父节点。目前,代码假定幻像节点应始终添加到另一个父节点的前面。如果不是这种情况,可以使用第六个参数或第二种样式启用附加功能。我在这里没有这样做,因为我不知道这是否是必需的,或者如果是的话,哪种方法可能最方便。

\documentclass{article}
\usepackage[linguistics]{forest}
\forestset{% addaswyd o ateb Alan Munn: https://tex.stackexchange.com/a/695600/ (addaswyd o fy ateb gwreiddiol)
  multidom/.style n args=5{%
    no edge,
    before typesetting nodes={%
      temptoksa/.option=content,
      for nodewalk={fake=current,name=#5}{prepend/.expanded={[\foresteregister{temptoksa},phantom]}},
    },
    before drawing tree={% parametised from https://tex.stackexchange.com/a/249615/
      for tree={x'+=#1,y'+=#2},
      tikz+={%
        \draw [-] (.#3) to [out=#3,looseness=.5] (!u.south);
        \draw [-] (.#4) to [out=#4,looseness=.5] (#5.south);
      },
    },
  }
}
\newcommand*\1{$'$}
\begin{document}
\begin{forest}
  [TP,name=TP 
  [DP,multidom={-.5cm}{-2cm}{north}{east}{VP} 
    [D\\the ]
    [NP\\chimney ]
    ] 
    [T\1
      [T ]
      [VP,name=VP  
        [V\1  
          [V\\smokes ] 
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

输出结果(应该)与 Alan 的没有什么不同。

多域风格

原始概念验证

这是一个快速的概念验证,需要改进,但总体结构正确。如果有人感兴趣,我稍后可能会修改它。我使用相对节点名称 ( !r),但如果愿意,您也可以使用名称 ( G)。

\documentclass{standalone}
\usepackage[linguistics]{forest}
\forestset{
  nice nodes/.style={
    for tree={
      inner sep=0pt,
      fit=band,
    },
  },
  default preamble=nice nodes,
  dominated/.style n args=4{%
    no edge,
    before drawing tree={% parametised from https://tex.stackexchange.com/a/249615/
      for tree={x+=#1},
      tikz+={%
        \draw [-,looseness=1] (.#2) to [out=#2] (#3);
        \draw [-,looseness=1] (.#2) to [out=#2] (#4);
      }
    },
  },
}
\begin{document}
\begin{forest}
sn edges
[L,name=L 
    [,name=D,no edge] 
        [ 
            [$\beta$] 
            [K 
            [$\gamma$,name=G,dominated={-20mm}{east}{!r.south west}{!u.south},no edge[smoke]] 
                [$\alpha$[smoke]]
            ]
        ] 
]
\end{forest}
\end{document}

非树概念验证

相关内容