反流过程是怎样的?

反流过程是怎样的?

\uppercase在与a 中的an 斗争了很长时间之后\csname ... \endcsname,我遇到了这个帖子提到论点是“反刍”,这意味着要将控制序列大写,你需要执行以下操作:

\uppercase{\expandafter\gdef\csname #1}#2\endcsname

这对我来说毫无意义。

什么是反流过程?它如何融入扩张过程?它是特定于\uppercase(和伴随\lowercase)的吗?

答案1

这个术语是 Knuth 在 TeXbook (第 24 章) 中使用的:

我们将研究 TeX 的消化过程,即 TeX 如何处理到达其“胃”的标记列表。第 7 章描述了输入文件在 TeX 的“嘴”中转换为标记列表的过程,第 20 章解释了可扩展标记如何在 TeX 的“食道”中通过类似反流的过程转换为不可扩展标记。当不可扩展标记最终到达 TeX 的胃肠道时,真正的排版活动就开始了,这就是我们将在这些总结章节中探讨的内容。

这是指什么?主要指扩展宏的活动:宏的定义存储在内存中,当需要扩展宏时,已经消化过的标记(在定义时)将返回到“口”进行进一步扩展。

类似的过程\uppercase也发生\lowercase不可扩张基元。它们的动作是将其参数发送到“胃”,在那里每个字符标记被替换为其大写或小写对应项,如数组和中的(当前)值所定义\uccode\lccode经过这次替换,标记被“反刍”到嘴里进行进一步处理,其中可能涉及宏扩展或定义或其他一切。换句话说,当\uppercase{<tokens>}找到时,TeX 暂停其活动,向下发送<tokens>,替换完成形成一个标记列表<TOKENS>,该列表被发送回嘴里,然后 TeX 重新开始检查,<TOKENS>就好像它从一开始就在那里一样。不是字符标记的标记保持完全相同。

因此如果你说

\uppercase{\expandafter\gdef\csname a}bc\endcsname

该过程将向 TeX 提供标记列表

\expandafter\gdef\csname Abc\endcsname

然后它将继续做

\gdef\Abc

不能

\expandafter\gdef\csname\uppercase{a}bc\endcsname

因为\uppercase在 里面是非法的\csname...\endcsname。唯一可以出现在 之后的不可扩展标记\csname是字符标记和\endcsname

一旦您理解了\uppercase不可扩展性以及其工作原理,那么您就会开始理解这种构造。


expl3可以用更直接的方式做同样的事情:

\documentclass{article}

\ExplSyntaxOn

\NewDocumentCommand{\mycommand}{m}
 {
  \cs_new:cpn { \str_uppercase:f { \str_head:n { #1 } } \str_tail:n { #1 } } { #1 }
 }

\ExplSyntaxOff

\mycommand{abc}

\show\Abc

这将显示

> \Abc=\long macro:
->abc.

这可能是您想要考虑的事情。

相关内容