`\edef`(`\xdef`)和`\write`(`\messge`)之外的`\noexpand`的实际用途?

`\edef`(`\xdef`)和`\write`(`\messge`)之外的`\noexpand`的实际用途?

经过阅读(和搜索),TeXbyTopic.pdf我的印象是,的实际使用\noexpand属于以下三种情况之一,

  1. \edef或内部\xdef,包括定义宏以便在上下文中使用的情况\edef,例如

    \def\protect{\noexpand\protect\noexpand}

  2. 内部\write\message,包括 LaTeX 中可移动文本的大小写

  3. 在专项建设方面\if\noexpand#1\relax

还有其他实际用途吗\noexpand?除了上面列出的第 3 个之外,还有什么实际用途\noexpand不在仅扩展上下文中?我对 plain 还不熟悉,希望通过了解 的各种用法来更好地理解 plain(尤其是仅扩展上下文)\noexpand

答案1

有很多 tex 原语可以扩展标记来寻找参数,例如\if\ifcat\noexpand对它们中的任何一个都会产生类似的效果,但无论是否有用很难说。

例如

\def\zz{hello}

\input s\noexpand\zz

\bye

输入文件s.tex然后hello排版

\def\zz{hello}

\input s\zz

\bye

生产

! I can't find file `shello'.

但是您可以更轻松地在后面使用空格s\noexpand停止对文件名的扫描。

正如 Henri 在评论中所指出的,也可以使用在输入或\scantokens

\edef\zz{\scantokens{z}}

是错误

! File ended while scanning definition of \zz.

\edef\zz{\scantokens{z\noexpand}}

或者

\everyeof{\noexpand}
\edef\zz{\scantokens{z}}

没有错误。

相关内容