我很好奇,是否可以绘制如下的多显性树\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
已更新 已更新答案
此版本支持append
3 个以上父级。但是,如果偏移量为负数且为厘米的几分之一,则必须改为指定毫米。(即使直接'+
赋值也是如此。)如果有人知道原因,请告诉我。
\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}