在宏中获取“贪婪”模式匹配

在宏中获取“贪婪”模式匹配

考虑以下 TeX 输入:

This is TeX, Version 3.1415926 (TeX Live 2013)
**\def\a#1\par{[#1]}

*\def\b#1\par{(#1)}

*\a\b five\par\par

*\end

两个定义具有相同的分隔符,因此原则上 TeX 有两种解析方式\a\b five\par\par

  1. “非贪婪”:先\b five作为 的参数进行匹配\a\b five\par用 [\b five] 替换。然后five]作为 的参数进行匹配\bfive]\par用替换(five])
  2. “贪婪”:首先\b five\par作为 的参数进行匹配\a\b five\par\par用替换[\b five\par]。然后five作为 的参数进行匹配\bfive\par用替换(five)

上述代码的结果是“非贪婪”的结果:

在此处输入图片描述

我的问题是是否有某种方法可以重新定义\a\b获得“贪婪”的结果(不改变它们具有相同分隔符的事实)。

一位评论者指出,我可以使用括号来对参数进行分组。我们假设这样做对我来说也很不方便。例如,我已经有一个包含five示例中任意文本的大型文档,我不想逐一浏览并将所有内容分组。

答案1

事实上,如果不改变,就不可能某物。我不知道以下是否适用于你的情况:

\long\def\a #1\par\a {[#1]}
\def\b #1\par{(#1)}
\a\b five\par\par\a

\bye

贪婪的

上述方法可以精确定位 \par处理\a。但是,如果你总是确信\a接下来会 \par那么

\def\a #1\par {\aa{#1\par}}
\long\def\aa #1\par {[#1]}

\def\b #1\par{(#1)}

\a\b five\par\par

\a\b five\par six\par

\bye

greedy2

或者再次,避免创建一个团体并变得疯狂以避免脱掉牙套#2(周围的牙套#1已经被视为邪恶而被排除在外)。

\def\a #1\par {\aa{#1\par}\space}
\long\def\aa #1#2\par {[#1\romannumeral0#2]}

\def\b #1\par{(#1)}

\a\b five\par\par

\a\b five\par six\par

\a\b five\par {\let\x\empty}\par { \tt\meaning\x} 

\bye

greedy3

答案2

以下内容适用于您的示例:

\def\a{\expandafter\@a}
\def\@a#1\par{[#1]}

显然,如果试图概括这一点,很多事情都可能出错。但要判断这一点,我们需要知道你想要实现什么。

相关内容