使用内部项目列表的长度,而不起作用

使用内部项目列表的长度,而不起作用

我试图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}

在此处输入图片描述

相关内容