我疯狂地尝试使用 tikz-qtree 包绘制句法树。以下是我得出的结论:
\begin{figure}
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S
[.{NP\\($\uparrow$~{\sc subj})~=~$\downarrow$}
[.{N\\$\uparrow$~=~$\downarrow$}
[. John
]
]
]
[.{VP\\$\uparrow$~=~$\downarrow$}
[.V
[.{saw\\$\uparrow$~=~$\downarrow$}]
]
[.{NP\\($\uparrow$~{\sc obj})~=~$\downarrow$}
[.{DET\\($\uparrow$~{\sc def})~=~+}
]
[.{N\\$\uparrow$~=~$\downarrow$}
[. boy
]
]
]
]
]
\end{tikzpicture}
\caption{test}
\end{figure}
但是,tex 一直抱怨参数失控,我似乎无法发现我做错了什么。我觉得我需要使用花括号,因为树上的标签跨越多行。有什么想法吗?
答案1
您遇到了qtree
/用户经常遇到的一个错误tikz-qtree
:包语法要求所有右括号前面都必须有空格。如果您添加空格(或换行符,如杰西的回答在结束括号之前锯节点,你的 MWE 编译没有错误:
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S
[.{NP\\($\uparrow$~{\sc subj})~=~$\downarrow$}
[.{N\\$\uparrow$~=~$\downarrow$}
[. John
]
]
]
[.{VP\\$\uparrow$~=~$\downarrow$}
[.V
[.{saw\\$\uparrow$~=~$\downarrow$} ] % the space before the closing bracket is crucial
]
[.{NP\\($\uparrow$~{\sc obj})~=~$\downarrow$}
[.{DET\\($\uparrow$~{\sc def})~=~+}
]
[.{N\\$\uparrow$~=~$\downarrow$}
[. boy
]
]
]
]
]
\end{tikzpicture}
\caption{test}
\end{figure}
\end{document}
编辑
下面我对您的代码做了一些额外的改进:
- 将弃用的更改
\sc
为\textsc{}
cfr 建议的 - 更改
every node
为every tree node
并添加anchor=north
,使 V 节点的顶部与 NP 节点的顶部垂直对齐 - 将层距增加限制在第二层及以下,以便 S 与其子层之间的垂直空间不会太大
\documentclass{article}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}[every tree node/.style={align=center,anchor=north},level 2+/.style={level distance=1.5cm}] % changed "every node" to "every tree node" and added "anchor=north" so that the top of the V node is vertically aligned with the top of the NP node; increased the level distance for only the 2nd level and lower
\Tree [.S
[.{NP\\($\uparrow$~\textsc{subj})~=~$\downarrow$} % changed \sc to \textsc{}
[.{N\\$\uparrow$~=~$\downarrow$}
[. John
]
]
]
[.{VP\\$\uparrow$~=~$\downarrow$}
[.V
[.{saw\\$\uparrow$~=~$\downarrow$} ]
]
[.{NP\\($\uparrow$~\textsc{obj})~=~$\downarrow$} % changed \sc to \textsc{}
[.{DET\\($\uparrow$~\textsc{def})~=~+} % changed \sc to \textsc{}
]
[.{N\\$\uparrow$~=~$\downarrow$}
[. boy
]
]
]
]
]
\end{tikzpicture}
\caption{test}
\end{figure}
\end{document}
答案2
这是调试后的结果。发现的错误以<---表示。
编辑:有两种方法可以做到这一点。新的在顶部,旧的在后面。将两个支架放在一起后即可找到新的。
代码
\documentclass[]{standalone}
\usepackage{graphicx}
\usepackage{tikz-qtree}
\usetikzlibrary{trees}
\begin{document}
%\begin{figure}
new solution
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S
[.{NP\\($\uparrow$~{\scshape subj})~=~$\downarrow$}
[.{\strut N\\$\uparrow$~=~$\downarrow$}
[. John
]
]
]
[.{VP\\$\uparrow$~=~$\downarrow$}
[.V
[.{ saw\\$\uparrow$~=~$\downarrow$}
]] % <--- this is how it work,
[.{NP\\($\uparrow$~{\scshape obj})~=~$\downarrow$}
[.{DET\\($\uparrow$~{\scshape def})~=~+}
]
[.{N\\$\uparrow$~=~$\downarrow$}
[. boy
]
]
]
]
]
\end{tikzpicture}
% Old solution
\centering
\begin{tikzpicture}[every node/.style={align=center},level distance=1.5cm]
\Tree [.S
[.{NP\\($\uparrow$~{\scshape subj})~=~$\downarrow$}
[.{N\\$\uparrow$~=~$\downarrow$}
[. John
]
]
]
[.{VP\\$\uparrow$~=~$\downarrow$}
[.V
[.{saw\\$\uparrow$~=~$\downarrow$} % <---
]
[.{NP\\($\uparrow$~{\scshape obj})~=~$\downarrow$}
[.{DET\\($\uparrow$~{\scshape def})~=~+}
]
[.{N\\$\uparrow$~=~$\downarrow$}
[. boy
]
]
]
]
]
] %<---
\end{tikzpicture}
%\caption{test}
%\end{figure}
\end{document}
答案3
这个forest
版本利用了一些新命令,使树的编码稍微简单一些。(tikz-qtree
当然,您也可以将这些命令与解决方案一起使用。)
\upit{arg}
接受一个强制参数,arg
。它排版一个向上的箭头,后跟arg
小写字母,全部用括号括起来。
\updown{arg}
接受一个可选参数arg
,但允许您使用{}
而不是[]
,这样您就不必将所有内容都括在花括号中,以避免将参数读为新节点。如果未指定任何参数,它将排版一个向上箭头、一个等号和一个向下箭头。否则,它将排版为arg
as \upit
,添加一个等号并以向下箭头结束。
我包含了基本树的代码:
还有一个似乎很常见的变体:
代码中唯一的区别是添加了
if n children=0{tier=terminal}{},
第二种情况是树形配置。
\documentclass[tikz, border=5pt, varwidth, multi]{standalone}
\usepackage{forest, mathtools, xparse}
\standaloneenv{forest}
\begin{document}
\newcommand*\upit[1]{\ensuremath{(\uparrow\,\text{\scshape #1})}}
\NewDocumentCommand\updown { g }{%
\IfNoValueTF{#1}{%
\ensuremath{\uparrow\,=\,\downarrow}%
}{%
\ensuremath{(\uparrow\,\text{\scshape #1})\,=\,\downarrow}%
}}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
align=center,
base=top,
}
[S
[NP\\\updown{subj}
[N\\\updown
[John
]
]
]
[VP\\\updown
[V
[saw\\\updown
]
]
[NP\\\updown{obj}
[DET\\{$\upit{def} = +$}
[the
]
]
[N\\\updown
[boy
]
]
]
]
]
\end{forest}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
align=center,
base=top,
if n children=0{tier=terminal}{},
}
[S
[NP\\\updown{subj}
[N\\\updown
[John
]
]
]
[VP\\\updown
[V
[saw\\\updown
]
]
[NP\\\updown{obj}
[DET\\{$\upit{def} = +$}
[the
]
]
[N\\\updown
[boy
]
]
]
]
]
\end{forest}
\end{document}