考虑以下宏定义:
\def\mac#1 .{}
有没有办法将\mac
控制序列作为参数传递?我不知道该怎么做,因为 TeX 扫描器会“吞掉”控制序列后的所有空格,而 TeX“核心”不会意识到那里曾经有空格。
例如,以下尝试:
\def\mac#1 .{}%
\mac\relax .%
\bye
导致错误消息:
Runaway argument?
\relax .
! Forbidden control sequence found while scanning use of \mac.
<inserted text>
\par
<to be read again>
\bye
l.3 \bye
答案1
可以用括号将参数括起来。这些括号不会成为参数的一部分:
\def\mac#1 .{\message{[[#1]]}}%
\mac{\relax} .%
\bye
答案2
在宏后应用一个空组{}
将允许识别后续空格。
\documentclass{article}
\def\mac#1 .{\detokenize\expandafter{#1}}
\begin{document}
\mac\relax{} .
\end{document}
然而,正如 Harald 所指出的,空组将成为这里争论的一部分。
这是避免空组的方法
\documentclass{article}
\usepackage[T1]{fontenc}
\def\mac#1 .{\detokenize\expandafter{#1}}
\begin{document}
\expandafter\mac\expandafter\relax\space.
\end{document}
答案3
您必须按正确的顺序进行标记,例如
\def\mac#1 .{}%
\long\def\firstofone#1{#1}
\firstofone{\mac\relax} .%
\bye