!\qsetw 命令在复杂的 LF 树中是强制性的吗?

!\qsetw 命令在复杂的 LF 树中是强制性的吗?

我一直在研究语义学家编写的 Latex 教程,并且一直在努力编写此 LF 表示的代码(使用qtree)。我非常认真地研究了复杂树的示例代码,并为新的 LF 表示构建了自己的代码。我很确定这应该是正确的代码。然而 Latex 不想编译。

我唯一没有从教程文件中采用的是!\qsetw{}用于操纵树宽度的命令。

但是据我从其他教程中了解qtree,使用此命令不是强制的,即 Latex 能够按原样计算树的间距。

不过我又不太确定,是不是 Latex 需要我使用!\qsetw{}后才能编译?

以下是代码:

\documentclass[twoside=semi,BCOR=8mm,headsepline,headings=normal,openright]{scrreprt}
\usepackage{linguex} 
\usepackage[center]{qtree} 
\usepackage{tree-dvips} 
\makeatletter
\def\qroof#1.#2 {{%
    \setbox\@qrscratchbox = \hbox{\let\qtreepadding=\qroofpadding
            \qshow@text[l]{\qleafhook}{#1}}%
        \def\qtreepadding{0pt}%
    \begin{tabular}{@{}c@{}}
\setbox\@tempboxa = \hbox{\qshow@text{\qlabelhook}{#2}}%
\ifdim\wd\@tempboxa>0pt \box\@tempboxa \\ \fi
\unitlength=\wd\@qrscratchbox \qdraw@roof \\[-0.6ex]
\box\@qrscratchbox
\end{tabular}}}
\makeatother
\qroofy=1
\qroofx=2
\begin{document}
\ex.
\Tree 
[.$_{\langle v,t\rangle}$ {\textit {Floyd} \\ $_{\langle e \rangle}$} 
[. $_{\langle e, \langle v,t \rangle\rangle}$ 
[.$_{\langle \langle r,t \rangle, \langle e, \langle v,t \rangle \rangle}$ {\textit {AUG-SPEED} \\ $_{\langle \langle\langle e, \langle v,t \rangle \rangle, \langle \langle r,t \rangle \langle e, \langle v,t \rangle\rangle\rangle}$} 
\qroof{walk}.$_{\langle e, \langle v,t, \rangle\rangle}$
] 
\qroof{quickly}.$_{\langle r,t \rangle}$
]
]
\par 
\end{document}

答案1

这是您的树的一个版本,其中各种内容都已清理。首先,手动输入所有语义类型会使源树非常难以阅读,也更容易出错。您还滥用下标命令使类型字体变小。所以我首先定义了一个宏来引入类型。(感谢 David Carlisle 和 egreg 在聊天中提供的帮助。)

\newcommand{\type}[1]{\ensuremath{\substack{\langle#1\rangle}}}

这允许您使用\type{e,t}来生成正确括号内的类型。请注意 <> 不是类型(但是是),并且不应括在尖括号中。

我还删除了重新定义,\qroof据我所知它没有任何作用。

现在,这是带有 的树qtree。如您所见,!\qsetw不需要 的实例,尽管树的间距不是很漂亮。

\documentclass[twoside=semi,BCOR=8mm,headsepline,headings=normal,openright]{scrreprt}
\usepackage[center]{qtree} 
\usepackage{amsmath} % for \substack command
\newcommand{\type}[1]{\ensuremath{\substack{\langle#1\rangle}}}

\qroofy=1
\qroofx=2
\begin{document}

\Tree 
[.\type{v,t} 
    {\textit {Floyd}\\$e$} 
    [.\type{e,\type{v,t}} 
        [.\type{\type{r,t},\type{e,\type{v,t}}} 
            [.{\textit{AUG-SPEED} \\ \type{\type{e,\type{v,t}},\type{\type{r,t},\type{e,\type{v,t}}}}}  ]
\qroof{walk}.{\type{e,\type{v,t}}} 
] 
\qroof{quickly}.\type{r,t} ]
]


\end{document}

output of code

这是对这个问题更一般的回答。由于间距问题,qtree 我建议切换到tikz-qtreeforest可能是复杂树的首选解决方案。

qtree

!\qsetw命令在qtree树中从来都不是必需的。手动调整节点的宽度可能很有用,但由于这是手动干预,因此广泛使用会变得乏味。以下是带有的示例树qtree

\documentclass[margin=3pt,varwidth=11in]{standalone}
\usepackage{qtree}
\begin{document}
Tree using \texttt{qtree} without using \verb|!\qsetw|:

\Tree 
[.S      \qroof{this is a big noun phrase}.NP 
        [.VP
        [.VP 
             \qroof{this is big noun phrase}.NP 
            [.V\1 
                [.V\\shows ]
                [.NP\\something ]
            ]
        ]
        \qroof{with an adverbial phrase}.PP
        ]
]
\end{document}

qtree tree

如您所见,qtree它本身并不能很好地压缩树。因此,为了使树更紧凑,我们需要使用!\qsetw命令来手动修复宽度。这是调整后的树:

\documentclass[margin=3pt,varwidth=11in]{standalone}
\usepackage{qtree}
\begin{document}

Tree using \texttt{qtree} adjusted using \verb|!\qsetw|:

\Tree 
[.S      \qroof{this is a big noun phrase}.NP 
        [.VP !\qsetw{-3cm}
        [.VP 
             \qroof{this is big noun phrase}.NP 
            [.V\1 
                [.V\\shows ]
                [.NP\\something ]
            ]
        ]
        !\qsetw{4cm}
        \qroof{with an adverbial phrase}.PP
        ]
]

adjusted tree

tikz-qtree

如果我们使用该包,我们可以自动获得更紧凑的树tikz-qtree。此包使用与完全相同的语法来指定树,qtree但使用强大的 TikZ 包来渲染树。您可以看到,这棵树在垂直方向上比树更紧凑qtree,但在水平方向上仍然不是特别紧凑。

\documentclass[margin=3pt,varwidth=11in]{standalone}
\usepackage{tikz-qtree,tikz-qtree-compat}
\tikzset{every tree node={align=center,anchor=north}}
\begin{document}

Tree using \texttt{tikz-qtree}:

\Tree 
[.S     [.NP \edge[roof]; {this is a big noun phrase} ]
        [.VP
        [.VP 
            [.NP \edge [roof]; {this is big noun phrase} ]
            [.V\1 
                [.V\\shows ]
                [.NP\\something ]
            ]
        ]
        [.PP \edge[roof]; {with an adverbial phrase} ]
        ]
]
\end{document}

tikz-qtree tree

forest

我们可以使用该包来实现最紧凑的树forest。它也使用 TikZ,并且树语法略有不同:节点标签不需要前缀.(在qtree和中都需要前缀),但终端节点也需要用括号括起来(在和tikz-qtree中不需要)。qtreetikz-qtree

qtree您可以在这里看到,该树在水平方向上比或树紧凑得多tikz-qtree,因为forest其目的是使树尽可能紧凑。

\documentclass[margin=3pt,varwidth=11in]{standalone}
\usepackage[linguistics]{forest}
\def\1{$'$}
\begin{document}

Tree using \texttt{forest}:

\begin{forest}
[S      [NP [{this is a big noun phrase}, roof] ] 
        [VP
        [VP 
            [NP [{this is a big noun phrase}, roof]  ]
            [V\1 
                [V\\shows ]
                [NP\\something ]
            ]
        ]
        [PP [{with an adverbial phrase},roof] ]
        ]
]
\end{forest}

\end{document}

forest tree

相关内容