\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.
这可能是您想要考虑的事情。