如何使用 tikz-qtree 平衡二进制分支并修复 LFG 样式 c 树中的速记三角形

如何使用 tikz-qtree 平衡二进制分支并修复 LFG 样式 c 树中的速记三角形

我已经修改了文档中的示例tikz-qtree以形成这种 LFG 样式的 c 树,但在平衡二进制分支方面遇到了困难,尤其是在 IP 分支和屋顶/三角 DP“猫”方面。

我的问题是如何控制每个母节点和子节点之间的垂直距离,以便在逐级比较时使分支能够合理地彼此平行?以及如何修复倒置的速记 DP 三角形,并缩短两个三角形的宽度以更好地匹配文本宽度?非常感谢提出建议。

\documentclass[12pt]{article}
\usepackage{tikz-qtree}
\usepackage{tikz-qtree-compat}
\begin{document}
\tikzset{level 1/.style={level distance=10pt,sibling distance=10pt}}
\tikzset{level 2/.style={level distance=20pt,sibling distance=10pt}}
\tikzset{level 3/.style={level distance=40pt,sibling distance=15pt}}

\begin{tikzpicture}[level 1,level 2,level 3]
\tikzset{every tree node/.style={align=center,anchor=north}}
\tikzset{inner ysep=3pt,outer ysep=0pt}
\Tree%
    [. {IP} [.\node{Spec=|\\Subj=|\\[-2pt]DP}; \edge[roof]; {the cat} ]
            [.\node{U=D\\VP}; \node{U=D\\V\0\\[-4pt]sat};
                    [.\node{Pcase=|\\PP}; [.\node{U=D\\P\0\\[-5pt]on}; ]
                    [.\node{Obj=|\\DP}; \edge[roof]; {the mat} ] ] ]
    ]%
\end{tikzpicture}
\end{document}

@Alan Munn:是的,确实如此。我更希望“猫”的 DP 与 VP 水平对齐,就像你说的一样。一般来说,我想做的是使从 IP 到 DP 的左分支更短,但与其他向左的分支平行:即,与 VP 到 V-zero 和 PP 到 P-zero 的左分支平行,所有向右的分支也是如此。

我想我的问题是:如何缩短或延长 c 树从每个母节点到每个子节点的每个单个分支?

代码 [inner xsep=0pt] 等在减小三角形底线宽度方面效果很好:谢谢。但 DP 三角形“猫”仍然是倒置的。不幸的是,我无法将 c-tree 的 jpg 上传到此站点,因为 MikTeX 在我的计算机上生成了它。似乎每个节点中都有 LFG 句法理论风格的多级线会对二进制分支造成严重破坏。

答案1

这个问题不太容易解决,因为大多数自动树绘制包都假设内部节点的高度相同,但您的情况是内部节点的高度不同。不过,有了它,tikz就可以做很多神奇的事情。

处理不均匀的节点大小

基本思路如下:对于较大的节点,我们手动调整文本高度,这样实际的文本高度就不会用于确定节点的大小。这样可以向上移动节点。这就是实现两个大小不一的节点之间的对齐的方法。

移动节点文本后,我们需要缩短通向该节点的树的分支;我们使用命令[shorten]的选项来执行此操作\edge。参数的语法shorten是:

shorten >=length

表示>缩短行尾(<会缩短行首)。

修改屋顶尺寸

屋顶节点样式只是创建相对于父节点和子节点的路径。默认情况下,节点具有 和inner。因此,您可以通过为屋顶下的节点outer sep指定 0pt 来减小三角形的大小。(您也可以指定这也将减小该值,但这会使文本太靠近屋顶底部。)inner xsepinner sep=0ptysep

其他一些修改

  • 我没有\\[]在终端节点手动插入负命令,而是创建了一个将\word终端节点提高 3pt 的新命令;您可以使用其可选参数指定不同的值。

  • 没有必要将树中的每个节点都设为 TikZ \node;仅当满足以下条件时,使用显式 TiKZ 节点才更简单:

    1. 您需要修改节点的属性(例如设置inner sep或在它周围放置一个框)
    2. 您需要标记节点,以便可以绘制指向或从该节点的箭头

更新由于(我猜)TikZ 发生了变化,原始代码中的级别距离值似乎不再起作用。将它们更改为25pt35pt似乎45pt可以解决问题。您可以根据需要调整这些值。

代码

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz-qtree,tikz-qtree-compat}
\newcommand{\word}[2][3pt]{\raisebox{#1}{#2}}
\begin{document}
\tikzset{level 1/.style={level distance=25pt,sibling distance=10pt}}
\tikzset{level 2/.style={level distance=35pt,sibling distance=10pt}}
\tikzset{level 3/.style={level distance=45pt,sibling distance=10pt}}

\begin{tikzpicture}[level 1,level 2,level 3]
\tikzset{every tree node/.style={align=center,anchor=north}}

\Tree%
    [.IP
    \edge[shorten >=14pt];   [.\node[text height=2em]{Spec=|\\Subj=|\\DP};
    \edge[roof]; \node[inner xsep=0pt] {the cat}; ]
        [.{U=D\\VP} [.{U=D\\V\0\\\word{sat}} ]
                    [.{Pcase=|\\PP} [.{U=D\\P\0\\\word{on}} ]
                    [.{Obj=|\\DP} \edge[roof]; \node[inner xsep=0pt] {the mat}; ]]]]
    \end{tikzpicture}
\end{document}

代码输出

相关内容