如果我想迭代标记,\myList
我可以简单地做
\def\myList{one,two,three}
\makeatletter
\newcommand{\iterateThroughMyList}{%
\@tempswafalse
\@for\next:=\myList\do{%
\if@tempswa//\else\@tempswatrue\fi\next%
}%
}
\makeatother
\iterateThroughMyList
正确打印:
一二三
但是,如果我想遍历任何事先不知道名单?
如果我尝试以下代码,
\def\myList{one,two,three}
\makeatletter
\newcommand{\iterateThroughSomeList}[1]{%
\@tempswafalse
\@for\next:=\csname #1\endcsname\do{%
\if@tempswa//\else\@tempswatrue\fi\next%
}%
}
\makeatother
\iterateThroughSomeList{myList}
打印的内容是:
一二三
(这意味着不会发生迭代,因为逗号保持不变)
我猜想一定存在某种\expandafter
缺失的组合,但我不知道哪种组合才是正确的。
答案1
您可以先扩展 csname,尽管这样很多expl3
clist
这里使用起来更简单,expl3
有一个预先构建的clist
逗号列表数据类型、用于迭代项目或(如此处)在项目之间插入标记的现有函数,以及用于生成c
变体函数的通用机制,该变体函数通过名称而不是命令标记来执行命令。
\documentclass{article}
\begin{document}
\def\myList{one,two,three}
\makeatletter
\newcommand{\iterateThroughSomeList}[1]{%
\@tempswafalse
\expandafter\@for
\expandafter\next
\expandafter:%
\expandafter=%
\csname #1\endcsname\do{%
\if@tempswa//\else\@tempswatrue\fi\next%
}%
}
\makeatother
\iterateThroughSomeList{myList}
\end{document}
生产
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\clist_new:N\l_my_list
\clist_set:Nn\l_my_list{one,two,three}
\clist_use:Nn\l_my_list{//}% by command token
\par
\clist_use:cn{l_my_list}{//}% by name
\ExplSyntaxOn
\end{document}