如何将控制序列作为参数传递给需要参数后有空格的宏?

如何将控制序列作为参数传递给需要参数后有空格的宏?

考虑以下宏定义:

\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 所指出的,空组将成为这里争论的一部分。

enter image description here

这是避免空组的方法

\documentclass{article}
\usepackage[T1]{fontenc}
\def\mac#1 .{\detokenize\expandafter{#1}}
\begin{document}
\expandafter\mac\expandafter\relax\space.
\end{document}

enter image description here

答案3

您必须按正确的顺序进行标记,例如

\def\mac#1 .{}%
\long\def\firstofone#1{#1}
\firstofone{\mac\relax} .%
\bye

相关内容