![处理 \ForEach 中的最后一项(forarray 包)](https://linux22.com/image/251129/%E5%A4%84%E7%90%86%20%5CForEach%20%E4%B8%AD%E7%9A%84%E6%9C%80%E5%90%8E%E4%B8%80%E9%A1%B9%EF%BC%88forarray%20%E5%8C%85%EF%BC%89.png)
以下命令数组包裹
\ForEach{,}{\thislevelitem(\the\thislevelcount) : }}{x,y,z}
产生输出
x(1) : y(2) : z(3) :
我想要获得相同的输出,但没有最后一个“:”。
这数组软件包没有提供任何命令\maxount
来测试是否\thislevelcount == \maxcount
。当然我可以测试第一个项目\thislevelcount == 0
,但如果由于某种原因无法完成,该怎么办?
如果项目数量可变或未知,我该如何单独处理最后一项?
答案1
你可以作弊,将:
除第一个之外的所有项目添加到前面
\documentclass{article}
\usepackage{forarray}
\begin{document}
\ForEach{,}{\ifnum\thislevelcount=1\else : \fi\thislevelitem(\the\thislevelcount)}{x,y,z}
\end{document}
或者您可以使用 totcount 包来获取数组中的项目数
\documentclass{article}
\usepackage{forarray}
\usepackage{totcount}
\begin{document}
\newtotcounter{myarray}
\ForEach{,}{\stepcounter{myarray}\thislevelitem(\the\thislevelcount)\ifnum\thislevelcount=\totvalue{myarray}\else : \fi}{x,y,z}
\end{document}
答案2
您还可以\indrisloop
使用期权包裹。
\documentclass{article}
\usepackage{catoptions}
\begin{document}
\def\do#1{%
#1(\indrisnr)\space\iflastindris\else:\space\fi
}
\indrisloop{x,y,x}\do
\end{document}
答案3
与我的评论类似pgffor:对 \foreach-list 中最后一项进行特殊处理这里的其他答案提供了完成手头任务的解决方案,但没有解决问题标题中的问题。
检测最后一个列表成员并对其进行不同处理的一种方法是在列表处理开始时计算成员的数量,并将其与\the\thislevelcount
知道何时到达最后一个成员进行比较:
笔记:
- 我在用包裹
xstring
对于数值比较,因为我更喜欢它的语法,但这可以很容易地适应而不需要该包。
参考:
- 这里的解决方案是改编的形式带有缩进的新行上显示的字符串数组。
- 访问计数器的正确方法是什么?
代码:
\documentclass{article}
\usepackage{forarray}
\usepackage{xstring}
\newcounter{TotalNumberOfListMembers}%
\newcommand{\SetTotalNumberOfListMembers}[1]{%
\setcounter{TotalNumberOfListMembers}{0}%
\ForEach{,}{\stepcounter{TotalNumberOfListMembers}}{#1}%
}%
\newcommand*{\ProcessListMembers}[1]{%
\SetTotalNumberOfListMembers{#1}
\ForEach{,}{%
\thislevelitem(\the\thislevelcount)%
\IfEq{\the\thislevelcount}{\the\value{TotalNumberOfListMembers}}{}{: }%
}{#1}%
}%
\begin{document}
\ProcessListMembers{x,y,z}
\end{document}