\dolistloop 的意外结果

\dolistloop 的意外结果

鉴于\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\forcsvlistetoolbox

土拨鼠回答展示了如何使用内部列表(这是我在这里首选的解决方案),所以这个答案将展示如何使用 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}

屏幕截图显示了两个相同的列表,分别有点“a.”、“b.”和“c”。

答案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}

在此处输入图片描述

相关内容