我试图在树的各个部分周围画出方框,但我找不到可以这样做的命令。我试过包qtree
,它有!qframesubtree
可以完成这项工作的,但只适用于完整的子树。我想要做的是在树的上部(包括 IP)周围画一个方框,在树的其余部分(包括 VP)周围画另一个方框。
\begin{exe}
\ex \Tree [.IP Spec [.I\1 I [.VP Spec [.V\1 V XP ] ] ] ]
\end{exe}
关于如何做到这一点有什么提示吗?
我附上了所需结果的简单绘图。
编辑:通过以下评论,我现在已经解决了这个问题。这是我最终得到的代码:
\documentclass{minimal}
\usepackage{forest}
\forestset{
sn edges/.style={for tree={parent anchor=south, child anchor=north,align=center,base=bottom{}}},
background tree/.style={for tree={text opacity=0.2,draw opacity=0.2,}},
}
\begin{document}
\begin{forest} sn edges,
[IP, tikz={\node [draw, fit=()(Spec)(Ibar)(I)]{};}, s sep=3em,
[{Spec}, name=Spec]
[I',name=Ibar, l sep=2em, s sep=6.5em,
[I, name=I ]
[VP, tikz={\node [draw, inner sep=0.03em, fit=()(!1)(!ll)]{};}
[Spec]
[V',
[V]
[XP]] ]] ]
\end{forest}
\end{document}
答案1
如果你能接受forest
而不是qtree
,很容易做一些类似于你想要的事情。
tikz={\node [draw, red, fit=()(!1)(!ll)]{};}
是一个选项,它调用TiKZ
绘制一个适合当前节点、其第一个子节点和最后一个孙节点的节点。
绿色方块也可以写成tikz={\node [draw, green, fit to tree]{};}
\documentclass[border=3mm]{standalone}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={s sep=5mm, fit=band}
[IP, tikz={\node [draw, red, fit=()(!1)(!ll)]{};},
[Spec]
[I` [I]
[VP, tikz={\node [draw, green, fit=()(!1)(!ll)]{};}
[Spec]
[V' [V]
[XP]]]]]
\end{forest}
\end{document}
答案2
虽然我自己会建议使用forest
上面的解决方案,但这里有一种方法可以tikz-qtree
使用fit
随附的库tikz
将tikz
节点放入盒子中。
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{fit}
\begin{document}
\begin{tikzpicture}
\Tree [.\node(ip){IP}; \node(specip){Spec}; [.\node(ibar){I$'$}; \node(i){I}; [.\node(vp){VP}; \node(specvp){Spec}; [.V$'$ V \node(xp){XP}; ] ] ] ]
\node[draw,fit=(vp)(specvp)(xp)]{};
\node[draw,fit=(ip)(specip)(ibar)(i)]{};
\end{tikzpicture}
\end{document}
编辑:我已编辑代码以解决您在评论中提出的问题。请注意,也可以使用它tikzset
来调整树节点之间的距离,以阻止框接触它们不应该接触的节点。