\forcsvlist 和扩展

\forcsvlist 和扩展

我遇到了以下代码的扩展问题:

\def\sizes{huge, LARGE, Large, large, normalsize, small, footnotesize, scriptsize, tiny}
\forcsvlist\sampletext{\sizes}

我的问题是,\sizes在传递给之前应该先扩展\forcsvlist,否则\sampletext只会收到列表而不知道如何解析它。

我怎样才能使它\sizes扩大呢?

笔记:在调用中将列表硬编码是\sampletext可行的,但我不想这样做,因为我可能会\sizes用其他值覆盖。

答案1

这是标准方法:

\expandafter\forcsvlist\expandafter\sampletext\expandafter{\sizes}

第一个\expandafter扩展第二个,第二个又扩展第三个,最后一个完成扩展 的工作。在导致其后的第二个标记扩展之后,\sizes原语扩展为空;在检查 的操作时,只需跳过一个标记。当有参数时,情况会稍微复杂一些,但和不接受它们。 执行的扩展只有一步:之后\expandafter\expandafter\expandafter\sizes\expandafter

\def\y{\z} \def\z{a}

\expandafter\x\y

就像说

\x\z

在你的情况下,三个\expandafter命令消失了,但是 TeX 现在有

\forcsvlist\sampletext{huge,LARGE,...}

并从这里继续扩展。

另一个技巧是

\begingroup\edef\x{\endgroup\noexpand\forcsvlist\noexpand\sampletext{\sizes}}\x

之所以有效,是因为 的扩展\sizes由字符组成;如果\sizes定义为

\def\sizes{\huge,\LARGE,...}

相关内容