使用 newcommand 在生成的列表上使用 \docsvlist

使用 newcommand 在生成的列表上使用 \docsvlist

晚上好,

我尝试改编示例代码,etoolbox但无法使其工作。下面这个示例可能更容易理解:

尽管

\begin{itemize}
\renewcommand*{\do}[1]{\item #1}
\docsvlist{item1, item2, item3}
\end{itemize}

文档中给出的工作原理很好,我不明白为什么这

\newcommand{\test}{item1, item2, item3}

\begin{itemize}
\renewcommand*{\do}[1]{\item #1}
\docsvlist{\test}
\end{itemize}

不会将列表处理为 3 个项目,而只处理 1 个。

我在更复杂的情况下需要它,但我的基本问题就在这里。(\test在我的例子中,在其他地方定义了,但我认为它不相关)。

抱歉,如果我的英语和/或 LaTeX 有点不稳定,我都不是母语人士......

提前致谢

答案1

\test没有展开,即它不被视为具有三个项目的 csv 列表,而是被视为单个实体。

解决方案:使用\expandafter\docsvlist\expandafter{\test}

第一个\expandafter告诉TeX \docsvlist,必须有另一个\expandafter才能看然后{展开\test

\documentclass{article}


\usepackage{etoolbox}

\newcommand{\test}{item1,item2,item3}


\begin{document}
\begin{itemize}
\renewcommand*{\do}[1]{\item #1}
\expandafter\docsvlist\expandafter{\test}
\end{itemize}
\end{document}

expl3通过使用将列表存储到\clist变量中并“防止”扩展问题的功能:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\clist_new:N \l_sandrine_item_clist 
\NewDocumentCommand{\SetMyList}{+m}{
  \clist_set:Nn \l_sandrine_item_clist {#1}
}

\NewDocumentCommand{\listmapper}{}{%
  \clist_map_inline:Nn \l_sandrine_item_clist {\item ##1}
}

\ExplSyntaxOff
\begin{document}
\SetMyList{item 1,item 2,item 3}

\begin{itemize}
\listmapper
\end{itemize}

\end{document}

相关内容