我已经修改了文档中的示例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 xsep
inner sep=0pt
ysep
其他一些修改
我没有
\\[]
在终端节点手动插入负命令,而是创建了一个将\word
终端节点提高 3pt 的新命令;您可以使用其可选参数指定不同的值。没有必要将树中的每个节点都设为 TikZ
\node
;仅当满足以下条件时,使用显式 TiKZ 节点才更简单:- 您需要修改节点的属性(例如设置
inner sep
或在它周围放置一个框) - 您需要标记节点,以便可以绘制指向或从该节点的箭头
- 您需要修改节点的属性(例如设置
更新由于(我猜)TikZ 发生了变化,原始代码中的级别距离值似乎不再起作用。将它们更改为25pt
和35pt
似乎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}