我需要存储一个 csv 列表,以便稍后在环境的最终代码部分使用。有人能解释一下以下示例中出了什么问题吗?
\documentclass{article}
\usepackage{etoolbox}
\usepackage{ifthen}
\newcommand*\mycsv{1,2,3}
\newcommand*\printnumbers[1]{
\ifthenelse{\equal{#1}{1}}{one, }{}
\ifthenelse{\equal{#1}{2}}{two, }{}
\ifthenelse{\equal{#1}{3}}{three, }{}
}
\newcommand*\doprint[1]{\forcsvlist\printnumbers{#1}}
\begin{document}
\doprint{1,2,3} % does work
\doprint{\mycsv} % does not work
\end{document}
如果列表存储在宏中,它似乎不再是一个列表,\forcsvlist
而是一个单个标记。还有其他解决方案可以解决我的问题吗?
答案1
由于#1
不能同时全部为1
,,2
因此OP 的 效率不高。这里有一个替代解决方案。3
\printnumbers
\documentclass{article}
\usepackage{loops}
\newcommand*\comma{\ifforeachlastitem.\else, \fi}
\newcommand*\doprint[1]{%
\newforeach [expand list once] \x in {#1} {%
\skvifcase\skvxifstrcmpTF\x
{1}{one\comma}
{2}{two\comma}
{3}{three\comma}
\elsedo
\@latex@error{\string\doprint: no match}\@ehd
\endif
}%
}
\begin{document}
\doprint{1,2,3}
\par
\doprint{} % empty list
\par
\newcommand*\mylist{1,2,3}
\doprint{\mylist}
\end{document}
该解决方案可以推广到以外的其他列表类型{1,2,3}
。