代码
\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 在以下情况下不会进行扩展
- 吸收宏的参数文本
- 寻找宏的参数
另一方面,
\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{ }
,并且不存在自动插入这样的标记的神奇过程。