使用 tikz-qtree 在句法树的各个部分周围绘制框架或框

使用 tikz-qtree 在句法树的各个部分周围绘制框架或框

我试图在树的各个部分周围画出方框,但我找不到可以这样做的命令。我试过包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随附的库tikztikz节点放入盒子中。

\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来调整树节点之间的距离,以阻止框接触它们不应该接触的节点。

相关内容