我试图foo
在 中使用 listofitems 项的长度(参见 )whiledo
。循环将一直执行,直到计数器值达到相同的值。
这是有效的:
\newcommand{\dummy}[1]{
\setsepchar{,}
\readlist*\foo{#1}
\setcounter{cnt}{1}
\whiledo{5>\value{cnt}}{
\arabic{cnt} \\
\stepcounter{cnt}
}
}
但是这个不是(未定义的控制序列):
\newcommand{\dummy}[1]{
\setsepchar{,}
\readlist*\foo{#1}
\setcounter{cnt}{1}
\whiledo{\foolen>\value{cnt}}{
\arabic{cnt} \\
\stepcounter{cnt}
}
}
为什么以及怎样解决?
答案1
按照您提供的方式使构造工作没有问题。也许您的未定义序列是由于没有加载ifthen
提供 的包\whiledo
。但是,我建议使用 的本机构造listofitems
,即循环构造\foreachitem
,如下面的第二个序列所示。
这样,就不需要ifthen
包裹,也不cnt
需要柜台。
\documentclass{article}
\usepackage{listofitems,ifthen}
\newcounter{cnt}
\begin{document}
With the \verb|\whiledo| construct:
\newcommand{\dummy}[1]{
\setsepchar{,}
\readlist*\foo{#1}
\setcounter{cnt}{1}
\whiledo{\foolen>\value{cnt}}{% OR \whiledo{\listlen\foo[]>\value{cnt}}
\arabic{cnt} \\
\stepcounter{cnt}
}
}
\dummy{a,b,c,d,e}
With the \verb|\foreachitem| construct:
\renewcommand{\dummy}[1]{
\setsepchar{,}
\readlist*\foo{#1}
\foreachitem\z\in\foo{%
\ifnum\zcnt<\listlen\foo[]\relax\zcnt\\\fi
}
}
\dummy{a,b,c,d,e}
\end{document}