如何对 \Tree 和 \exi 使用相同的参数

如何对 \Tree 和 \exi 使用相同的参数

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}

相关内容