计算预定义列表中元素的数量

计算预定义列表中元素的数量

请考虑以下示例:

\documentclass{article}

\usepackage{xparse}

% http://tex.stackexchange.com/a/246924/15874
\ExplSyntaxOn
  \NewDocumentCommand{\countlist}{m}{\clist_count:n{#1}}
\ExplSyntaxOff

\newcommand*\liste{
  \marsvin,
  \hund,
  \kat,
  \hoens,
  \hest,
  \fisk,
  \fugl,
  \kanin,
  \oerkenrotte,
  \slange,
  \gris,
  \hamster
}
\newcommand*\str{\countlist{\liste}}

\begin{document}

% data
\def\marsvin{1}
\def\hund{12}
\def\kat{14}
\def\hoens{2}
\def\hest{5}
\def\fisk{3}
\def\fugl{2}
\def\kanin{2}
\def\oerkenrotte{1}
\def\slange{1}
\def\gris{1}
\def\hamster{1}

Number of elements: \str

\end{document}

在这个例子中\str打印了数字1,但我希望它打印12

猜测问题在于函数计算列表的数量而不是列表中元素的数量。

我该如何解决这个问题?

PS如果我使用

\newcommand*\str{\countlist{
  \marsvin,
  \hund,
  \kat,
  \hoens,
  \hest,
  \fisk,
  \fugl,
  \kanin,
  \oerkenrotte,
  \slange,
  \gris,
  \hamster
}}

一切安好。

答案1

您要求计算作为参数传递的逗号分隔列表中的项目数:在这种情况下\countlist{\liste}只有一个项目。

如果你要计算元素的列表总是包含在宏中,那么你需要

\NewDocumentCommand{\countlist}{m}
 {
  \clist_count:N #1
 }

经过这一改变,你的代码将得到

在此处输入图片描述

不过,我更喜欢\countlist*-variant 来定义“隐式列表”。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\countlist}{sm}
 {
  \IfBooleanTF{#1}
   {
    \clist_count:o { #2 }
   }
   {
    \clist_count:n { #2 }
   }
 }
\cs_generate_variant:Nn \clist_count:n { o }
\ExplSyntaxOff

\newcommand*\liste{
  \marsvin,
  \hund,
  \kat,
  \hoens,
  \hest,
  \fisk,
  \fugl,
  \kanin,
  \oerkenrotte,
  \slange,
  \gris,
  \hamster
}

\begin{document}

% data
\def\marsvin{1}
\def\hund{12}
\def\kat{14}
\def\hoens{2}
\def\hest{5}
\def\fisk{3}
\def\fugl{2}
\def\kanin{2}
\def\oerkenrotte{1}
\def\slange{1}
\def\gris{1}
\def\hamster{1}

Number of elements: \countlist*{\liste}

Number of elements: \countlist{
  \marsvin,
  \hund,
  \kat,
  \hoens,
  \hest,
  \fisk,
  \fugl,
  \kanin,
  \oerkenrotte,
  \slange,
  \gris,
  \hamster
}

\end{document}

在此处输入图片描述

这里我使用o变体,因为\liste它实际上不是一个 clist 变量;但它很挑剔。

相关内容