LaTeX 的 \stop 命令的不同含义

LaTeX 的 \stop 命令的不同含义

我们知道

\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左括号必须跟随不会被丢弃。

相关内容