该qtree
包允许使用如下语法绘制句法树:
\ex. \Tree [.S [.NP This ] [.VP [.V is ] [.NP an example ]]]
该linguex
包使用类似的语法来排版括号表达式:
\exi. [S [NP This ] [VP [V is ] [NP an example. ]]]
如您所见,唯一的区别是命令中的标签\Tree
(S、NP、VP 等)前面有一个点。现在,我想编写一个宏,它获取这样的参数,并首先生成一个带有 的括号表达式,\exi.
然后生成一个带有 的树\Tree
。为了实现这一点,我尝试定义以下宏,它会在 [ 括号后添加点:
\newcommand{\dotify}[1]{\catcode`[=13 \def[{\[.} {#1} \catcode`[=12}
但是,这不起作用。有人能帮我解决这个问题吗?或者也许有更简单的方法来实现我的目标?
答案1
新答案:您想要进行“输入替换”,而不是“输出替换”。也就是说,您想要将其替换[
为[.
.tex 文件中的材料,而不是可打印的材料。更准确地说,您不想让括号“在执行过程中”自行替换,因为命令\Tree
会一次性吸收它们,并且不允许在解析所写内容之前执行它们,而这些内容尚未插入点。
简而言之,您需要进行字符串替换,用 替换[
,[.
将结果保存在宏中,然后可以\Tree
对其进行扩展以提供正确的语法。为此,该stringstrings
软件包似乎是理想的选择。以下是一份最基本的文档,展示了如何定义宏来自动执行整个过程:
\documentclass{article}
\usepackage{stringstrings,qtree,linguex}
\newcommand*\dotify[1]{%
\convertchar[q]{#1}{[}{[.}%
}
\newcommand*\doboth[1]{%
\dotify{#1}%
\ex. \expandafter\Tree\thestring
\exi. #1
}
\begin{document}
\doboth{[S [NP This ] [VP [V is ] [NP an example ]]]}
\end{document}
旧答案:如果你确实想用 catcode 方法做这样的事情,你仍然会遇到一些问题。最关键的是,你不能对已经读取的宏参数进行 catcode 更改,所以你应该不是声明\dotify
为具有参数。相反,您应该使用括号来分隔其“参数”,以包含“设置”正确解析上下文的组;请参阅这个有趣的答案对于这个技巧的来源(对我来说)。该组自然也会限制 catcode 更改的范围;这是一个奖励。
您的另一个问题是,这\[
意味着\begin{equation}
,而不是左括号。我相信已经有一个命令可以做到这一点,但您可以使用 定义自己的命令\let\lb[
。
经过这些更改后,正确的代码将是:
\documentclass{article}
\def\activebrace{\catcode`\[=\active}
\let\lb[
{\activebrace \global\def[{\lb.}}
\def\dotify#{%
\bgroup
\activebrace
\let\next=%
}
\begin{document}
\dotify{[a[b[c]]]}
\end{document}
输出[.a[.b[.c]]]
。
答案2
这是一个\doubletree
带有 的宏l3regex
。我显示两个输入以供比较。
\documentclass{article}
\usepackage{qtree,linguex,xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\doubletree}{m}
{
\ariel_do_double_tree:n { #1 }
}
\tl_new:N \l__ariel_tree_tl
\cs_new_protected:Npn \ariel_do_double_tree:n #1
{
%% print the first representation
\exi.~#1\par
%% change it for \Tree
\tl_set:Nn \l__ariel_tree_tl { #1 }
\regex_replace_all:nnN { \[ } { \[\. } \l__ariel_tree_tl
\tl_put_left:Nn \l__ariel_tree_tl { \Tree }
\tl_use:N \l__ariel_tree_tl
}
\ExplSyntaxOff
\begin{document}
\exi. [S [NP This ] [VP [V is ] [NP an example. ]]]
\Tree [.S [.NP This ] [.VP [.V is ] [.NP an example ]]]
\bigskip
\doubletree{[S [NP This ] [VP [V is ] [NP an example. ]]] }
\end{document}
这是一个没有的(效率较低)版本l3regex
,但输出相同。
\documentclass{article}
\usepackage{qtree,linguex,xstring}
\newcommand{\doubletree}[1]{%
\exi. #1\par
\saveexpandmode
\noexpandarg
\StrSubstitute{#1}{[}{[.}[\temp]
\expandafter\Tree\temp
\restoreexpandmode}
\begin{document}
\exi. [S [NP This ] [VP [V is ] [NP an example. ]]]
\Tree [.S [.NP This ] [.VP [.V is ] [.NP an example ]]]
\bigskip
\doubletree{[S [NP This ] [VP [V is ] [NP an example. ]]] }
\end{document}