鉴于\def\CSVList{a,b,c}
,使用\dolistloop{\CSVList}
似乎没有\CSVList
按预期处理:
也许我不理解它\dolistloop
应该如何工作,但这个例子几乎直接来自文档:
问题:
- 我该如何使用
\dolistloop
才能获得期望的结果?
代码:
\documentclass{article}
\usepackage{etoolbox}
\def\CSVList{a,b,c}%
\begin{document}
\par\noindent
\verb|\dolistloop| results:
\begin{itemize}
\renewcommand*{\do}[1]{\item #1.}%
\dolistloop{\CSVList}%
\end{itemize}
\par\noindent
Expected results:
\begin{itemize}
\item a.
\item b.
\item c.
\end{itemize}
\end{document}
答案1
我对问题的第二部分一无所知,但第一部分可以通过切换到手册中描述的建立列表的程序(不幸的是,在我看来相当笨拙)来回答。我不是这方面的专家,我几乎所有的列表都是用它做的\pgffor
(当然也有缺点),所以如果有真正的答案出现,我很乐意删除我的答案。无论如何,这是可行的程序。
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\CSVList}{}
\listadd{\CSVList}{a}
\listadd{\CSVList}{b}
\listadd{\CSVList}{c}
\begin{document}
\par\noindent
\verb|\dolistloop| results:
\begin{itemize}
\renewcommand*{\do}[1]{\item #1.}%
\dolistloop{\CSVList}%
\end{itemize}
\par\noindent
Expected results:
\begin{itemize}
\item a.
\item b.
\item c.
\end{itemize}
\end{document}
答案2
etoolbox
有两种列表概念:(1) 由 和 朋友构建并使用 和 朋友进行迭代的内部列表。\listadd
以及(2) 没有构建命令并使用 和 进行迭代的 CSV 列表。通常,当手册中提到列表时,指的是内部列表。\dolistloop
\forlistloop
\docsvlist
\forcsvlist
etoolbox
土拨鼠的回答展示了如何使用内部列表(这是我在这里首选的解决方案),所以这个答案将展示如何使用 CSV 列表。
\docsvlist\CSVList
由于扩展问题而无法工作,因此您需要\expandafter\docsvlist\expandafter{\CSVList}
。
\documentclass{article}
\usepackage{etoolbox}
\def\CSVList{a,b,c}%
\begin{document}
\par\noindent
\verb|\docsvlist| results:
\begin{itemize}
\renewcommand*{\do}[1]{\item #1.}%
\expandafter\docsvlist\expandafter{\CSVList}%
\end{itemize}
\par\noindent
Expected results:
\begin{itemize}
\item a.
\item b.
\item c.
\end{itemize}
\end{document}
答案3
列表etoolbox
不是逗号分隔的列表。但是,输入逗号分隔的列表并将其转换为列表并不困难etoolbox
:
\documentclass{article}
\usepackage{etoolbox}
\newcommand{\defineetoolboxlist}[2]{%
\def\do##1{\listadd{#1}{##1}}%
\docsvlist{#2}%
}
\defineetoolboxlist\CSVList{a,b,c}
\begin{document}
\noindent
\verb|\dolistloop| results:
\begin{itemize}
\renewcommand*{\do}[1]{\item #1.}
\dolistloop{\CSVList}
\end{itemize}
\noindent
Expected results:
\begin{itemize}
\item a.
\item b.
\item c.
\end{itemize}
\end{document}