如果将 csv 列表存储在宏中以供以后使用 \forcsvlist 会出现问题

如果将 csv 列表存储在宏中以供以后使用 \forcsvlist 会出现问题

我需要存储一个 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}

相关内容