我们知道
\stop
将导致 LaTeX 停止解析并输出到该命令为止所处理的内容。
但后来我发现了另一种使用它的方法,如这个最小工作示例所示:
\documentclass{article}
\def\demo#1-#2\stop{#2}
\begin{document}
\def\sample{foo-bar}
\expandafter\demo\sample\stop
There's the Word 'bar' above this text and
this made it into the output despite a stopping command.
\end{document}
这里如何\stop
使用以及为什么它实际上没有中断 LaTeX?
答案1
上面的内容中实际上从未读出的含义\stop
。它只是用作分隔符标记。在这种情况下,绝对任何内容都可以:
\documentclass{article}
\def\demo#1-#2\StopInTheNameOfTeX{#2}
\begin{document}
\def\sample{foo-bar}
\expandafter\demo\sample\StopInTheNameOfTeX
There's the Word 'bar' above this text and
this made it into the output despite a stopping command.
\end{document}
简单\show\StopInTheNameOfTeX
来说,这没有意义,但在这种情况下,无意义本身就是无意义的。
答案2
您正在定义一个带有分隔参数的宏,这是原始命令\def
、\gdef
和可以执行但\edef
不能执行的操作。\xdef
\newcommand
让我们来看看:
\def\demo#1-#2\stop{#2}
这参数文本由以下标记组成
#1 • - • #2 • \stop
这里我使用 • 仅来分隔标记,空格是为了易读性;在参数文本的上下文中,通常#1
仅将其视为一个标记。
这意味着 的第一个参数将\demo
是\demo
直到(不包括)第一个-
标记之后的所有内容,并且在同一括号级别;第二个参数将是-
直到(不包括)之后的所有内容\stop
,同样在同一括号级别。因此,如果调用是
\demo 1{2-3}4-5\stop
TeX 将设置#1 <- 1{2-3}4
并#2 <- 5
分隔符的含义是绝不展开后再看\demo
:TeX 只匹配模式,取最短的匹配。例如,
\demo--\stop
我们将有一个空的#1
并且#2
将被改变成-
。
您甚至可以使用未定义的标记作为分隔符:
\def\demo#1-#2\nobodydarestodefinethistoken{#2}
并且 TeX 不会抱怨:模式已匹配,参数将被找到的参数替换,并且用于匹配的标记将被丢弃。
有一个例外:替换文本开头的左括号也可以用作分隔符,语法很特别:如果你说
\def\demo#1-#2#{#2}
进而
\demo ABC-DEF{}
第二个参数是DEF
左括号必须跟随不会被丢弃。