![在 tikz-qtree 中绘制到屋顶的移动箭头的更有效方法](https://linux22.com/image/476370/%E5%9C%A8%20tikz-qtree%20%E4%B8%AD%E7%BB%98%E5%88%B6%E5%88%B0%E5%B1%8B%E9%A1%B6%E7%9A%84%E7%A7%BB%E5%8A%A8%E7%AE%AD%E5%A4%B4%E7%9A%84%E6%9B%B4%E6%9C%89%E6%95%88%E6%96%B9%E6%B3%95.png)
在语言学中绘制句法表示时,通常使用三角形来表示内部结构无关的单位。这可以通过命令 来tikz-qtree
实现\edge[roof]; {John}
。
现在,有时我需要展示这种单元的运动,其内部结构与当前点无关。为此,我通常使用库positioning
,并定义一个相对于三角形上方节点的节点,如下所示:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{every tree node/.style={align=center, anchor=north}}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.\node(DP1-rel){DP}; \edge[roof]; {John} ]
[.T$'$
[.T ]
[.\emph{v}P
[.\node(DP2-rel){DP}; \edge[roof]; {$<$John$>$} ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\node (DP1) [below=1cm of DP1-rel] {};
\node (DP2) [below=1cm of DP2-rel] {};
\draw[->] (DP2)..controls +(south west:1) and +(south:1)..(DP1);
\draw[->] (V2)..controls +(south:1) and +(south:1)..(V1);
\end{tikzpicture}
\end{document}
有没有更简单/更好的方法来做到这一点,我不必每次需要移动内部结构无关的单元时都定义一个相对节点(IEtikz-qtree
,我使用命令\edge[roof]; {John}
)?用三角形表示其结构
答案1
您可以将屋顶的文本设为一个节点。(我还稍微简化了箭头语法。)
\documentclass{article}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node/.style={align=center, anchor=north}}
\begin{document}
\begin{tikzpicture}
\Tree
[.TP
[.DP \edge[roof]; \node (J) {John}; ]
[.T$'$
[.T ]
[.\emph{v}P
[.DP \edge[roof]; \node (Jtrace) {$<$John$>$}; ]
[.\emph{v}$'$
[.\emph{v}
[.V \node(V1){likes}; ]
[.\emph{v} ]
]
[.VP
[.V \node(V2){$<$likes$>$}; ]
[.DP \edge[roof]; {Mary} ]
]
]
]
]
]
\draw[->] (Jtrace) [in=-90,out=-90,looseness=1.5] to (J);
\draw[->] (V2) [in=-90,out=-90] to (V1);
\end{tikzpicture}
\end{document}
答案2
我不知道,tikz-qtree
但是forest
,您可以使用特殊!
语法访问树的节点。节点(!2211)
(在您的示例中为<John>
)是根的(TP
)第二个子节点的(T'
)第二个子节点的(vP
)第一个子节点的(DP
)第一个子节点的(<John>
)。
然后,总是有可能用通常的 TikZ 键给节点命名:(name
或者alias
如果您需要多个名称)。
还可以给出相对于另一个节点的节点(这实际上是语法的一般情况!
)。在这个例子中,我们转到u
p,然后转到l
ast 子节点,再转到其2
nd 子节点的1
st 子节点,从而得到(!ul21)
。
每种方法都有其优点,具体取决于树实际上的静态程度。如果您经常移动,最好为节点指定一个固定名称。如果一个节点始终相对于另一个节点保持固定,则可以使用相对节点名称。如果节点始终相对于根保持固定,则可以使用树后(即根节点后)的特殊相对语法。
在下面的代码中,我擅自定义了一种样式angled
,可自动将<
和>
添加到其内容中。我还使用了另一条路径进行连接(我认为这样看起来更好一些,但我不是语言学家)。
代码
\documentclass[tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{paths.ortho}% http://tex.stackexchange.com/a/110172/16595
\forestset{angled/.style={content/.expanded={$<$\forestov{content}$>$}}}
\begin{document}
\begin{forest} s sep*=3
[TP
[DP, tikz={\draw[blue, ->] () -- node[sloped, above] {\ttfamily !ul21} (!ul21);}
[John, triangle] ]
[T'
[T]
[\emph{v}P
[DP
[John, triangle, angled] ]
[\emph{v}'
[\emph{v}
[V
[likes, name=V1] ]
[\emph{v} ] ]
[VP
[V
[likes, angled, name=V2] ]
[DP
[Mary, triangle] ] ] ] ] ] ]
%
\path[rounded corners, du, -latex] (!2211) edge (!11)
(V2) edge (V1);
\end{forest}
\end{document}