为什么 \def@#1\space 不起作用?

为什么 \def@#1\space 不起作用?

代码

\documentclass{article}

\begin{document}
\begingroup
\catcode`@\active
\def@#1\par{<#1>}

@some text


\endgroup
\end{document}

运行完美。为什么当我用以下内容替换它时却不行呢?

\def@#1\space{<#1>}

答案1

\def@#1\space{<#1>}不起作用,除非 TeX\space在当前段落结束前找到标记。

回想一下,TeX 在以下情况下不会进行扩展

  1. 吸收宏的参数文本
  2. 寻找宏的参数

另一方面,

\def@#1 {<#1>}

可以。下面是 Plain TeX 示例(因此我将使用\tt):

\begingroup
\catcode`@\active
\def@#1 {{\tt<#1>}}

@some text

@some

\endgroup

\bye

在此处输入图片描述

但是,您可能希望使用行尾来分隔参数。请参阅在纯 Tex 宏中使用行尾分隔符对于这种情况。

\par和之间有着根本的区别\space。前者是原始的(除非重新定义);当 TeX\par在状态 下看到类别代码 5 的字符时,它会自动插入一个标记年代(行首),在标记化过程中。所以

\def\foo#1\par{Something with #1}

和电话

\foo xyz

something else after a blank line

将正确识别xyz(尽管带有尾随空格)为的参数\foo

\space由 定义\def\space{ },并且不存在自动插入这样的标记的神奇过程。

相关内容