很简单。我有一个列表,{0,1,54,1,3}
作为正在制作的命令的输入参数。我如何获取这个列表的长度?比如
\length(#1)
#1
列表在哪里?
答案1
我的第一个 LaTeX3 答案!太棒了!:)
该l3clist
软件包有很多内置命令来处理逗号分隔的列表。以下是尝试:
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \countItems { m } {
\clist_count:N #1
}
\NewDocumentCommand \countInlineItems { m } {
\clist_count:n {#1}
}
\ExplSyntaxOff
\begin{document}
\def\mylist{0,1,54,1,3}
This list has \countInlineItems{0,1,54,1,3} elements.
And the same list has \countItems{\mylist} elements.
\end{document}
请注意,我们有两种不同的用法:一种用于存储列表(例如\mylist
),一种用于内联列表。感谢 Joseph 指出我的代码中的缺陷。:)
希望能帮助到你。:)
答案2
一个循环和一个计数器:
代码
\documentclass{article}
\makeatletter
\newcommand*{\length}[1]{%
\@tempcnta\z@
\@for\@tempa:=#1\do{\advance\@tempcnta\@ne}%
The length of the list #1 is \the\@tempcnta.%
}
\makeatother
\begin{document}
\length{0,1,54,1,3}
\def\mylist{0,1,54,1,3}
\length\mylist
\end{document}
输出
列表 0,1,54,1,3 的长度为 5。
答案3
包xstring
,计算空元素
使用包的解决方案xstring
。它还计算空元素的数量:
\documentclass{article}
\usepackage{xstring}
\newcommand*{\commalength}[1]{%
\StrCount{#1,}{,}%
}
\begin{document}
\verb|{0,1,54,1,3}| has length \commalength{0,1,54,1,3}.
\verb|{,,}| has length \commalength{,,}.
\end{document}
包kvsetkeys
,计数非空元素
\comma@parse
包的解析器kvsetkeys
删除条目前后的可选空格并删除空条目。
\documentclass{article}
\usepackage{kvsetkeys}
\makeatletter
\newcommand*{\commalength}[1]{%
\begingroup
\count@=0 %
\comma@parse{#1}{%
\advance\count@ by 1 %
\@gobble
}%
\the\count@
\endgroup
}
\makeatother
\begin{document}
\verb|{0,1,54,1,3}| has length \commalength{0,1,54,1,3}.
\verb|{,,}| has length \commalength{,,}.
\end{document}
答案4
咱们试试吧etoolbox
。
这使用循环和计数器方法。
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcounter{itemcounter}%
\newcommand{\length}[1]{%
\setcounter{itemcounter}{0}%
\renewcommand*{\do}[1]{\stepcounter{itemcounter}\@gobble{##1}}%
\docsvlist{#1}%
\theitemcounter%
}
\makeatother
\begin{document}
\length{1}\qquad \length{1,2}\qquad \length{1,2,3,f,t,w,x,y,z}
\end{document}
该命令\@gobble
丢弃其参数。