晚上好,
我尝试改编示例代码,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}