考虑以下 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
:
- “非贪婪”:先
\b five
作为 的参数进行匹配\a
,\b five\par
用 [\b five] 替换。然后five]
作为 的参数进行匹配\b
,five]\par
用替换(five])
。 - “贪婪”:首先
\b five\par
作为 的参数进行匹配\a
,\b five\par\par
用替换[\b five\par]
。然后five
作为 的参数进行匹配\b
,five\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
或者再次,避免创建一个团体并变得疯狂以避免脱掉牙套#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
答案2
以下内容适用于您的示例:
\def\a{\expandafter\@a}
\def\@a#1\par{[#1]}
显然,如果试图概括这一点,很多事情都可能出错。但要判断这一点,我们需要知道你想要实现什么。