迭代预先未知的列表的标记(\@for + \csname)

迭代预先未知的列表的标记(\@for + \csname)

如果我想迭代标记,\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}

相关内容