我有这个{C/4/a/n,D/4/b/n,E/4/c/n}
以下是我使用 foreach 进行迭代的方法:
\foreach \x\y\w\z in {C/4/a/n,D/4/b/n,E/4/c/n} {
\x - \y - \w - \z
}
但我需要用 forloop 来实现。能够分离 x、y、w 和 z 并且不使用必须在 overleaf 中安装的包(例如 expl3 或类似包)非常重要。
答案1
下面定义了一个函数来循环遍历具有两种不同模式的列表。第一个是一个简单的逗号分隔值列表,并#1
引用当前列表项(这只是一个\clist_map_inline:n
)。
第二种模式将子列表的分隔符作为可选参数,如果指定了分隔符,则可以使用 访问子成员#1{<n>}
,使用 访问完整列表#2
。整个过程无需组(与 不同\foreach
),因此我希望它对您有用。
\documentclass{article}
\ExplSyntaxOn
\int_new:N \g__arturo_nested_level_int
\NewDocumentCommand \ForEach { +o +m +m }
{
\IfNoValueTF {#1}
{ \clist_map_inline:nn {#2} {#3} }
{ \__arturo_foreach:nnn {#1} {#2} {#3} }
}
\cs_new_protected:Npn \__arturo_foreach:nnn #1#2#3
{
\int_gincr:N \g__arturo_nested_level_int
\__arturo_foreach_aux:ccnnn
{ __arturo_foreach_code_ \int_use:N \g__arturo_nested_level_int :nn }
{ l__arturo_foreach_items_ \int_use:N \g__arturo_nested_level_int _seq }
{#1} {#2} {#3}
\int_gdecr:N \g__arturo_nested_level_int
}
\cs_new_protected:Npn \__arturo_foreach_aux:NNnnn #1#2#3#4#5
{
\cs_set:Npn #1 ##1 ##2 {#5}
\seq_clear_new:N #2
\clist_map_inline:nn {#4}
{
\seq_set_split:Nnn #2 {#3} {##1}
#1 { \seq_item:Nn #2 } {##1}
}
}
\cs_generate_variant:Nn \__arturo_foreach_aux:NNnnn { cc }
\ExplSyntaxOff
\begin{document}
\ForEach{a,b,c,d}{#1\par}
\ForEach[/]{C/4/a/n,D/4/b/n,E/4/c/n}{#1{1} - #1{2} - #1{3} - #1{4} (from #2)\par}
\end{document}
答案2
这是一个 TeX 解决方案。我不明白你到底想做什么,但你可以从这里开始。
\bgroup
\def\for#1\endfor{\def\body{#1}\iterate}
\def\iterate{\body\let\next=\iterate\else\let\next=\relax\fi\next}
\newcount\n
\n=0
% Example usage
\for
\advance\n by1
\number\n,
\ifnum\n<30
\endfor
\egroup
\bye
递归和 if 语句使编程语言图灵完备。