请考虑以下示例:
\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 变量;但它很挑剔。