我遇到了以下代码的扩展问题:
\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,...}