\docsvlist 的参数编号非法

\docsvlist 的参数编号非法

我正在尝试定义一个宏,将 CSV 列表作为输入并创建一个项目列表。 etoolbox这很方便,我正在使用的宏是

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

\participants要获取的项目的 CSV 列表在哪里itemize

我的问题是,当我将此宏作为新命令定义插入时,如

\newcommand{\listparticipants}{
   \begin{itemize}
 \renewcommand*{\do}[1]{\item[] #1}
 \expandafter\docsvlist\expandafter{\participants}
   \end{itemize}
}

我收到以下错误消息

! Illegal parameter number in definition of \listparticipants.
<to be read again> 
               1
l.29 }

我错过了什么?

答案1

您可以使用以下定义\listparticipants

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\listparticipants}[1]{
   \begin{itemize}
     \renewcommand*{\do}[1]{\item[] ##1}
     \docsvlist{#1}
   \end{itemize}
}
\begin{document}
\listparticipants{Tom,Dick,Harry}
\end{document}

请注意,您正在另一个命令中重新定义一个命令。为了正确引用参数文本,您需要将参数文本#s 加倍。因此,#1指的是 的参数\listparticipants,而##1指的是 的参数\do

即使你不需要\listparticipants采取论点,这个惯例仍然适用:

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\listparticipants}{
   \begin{itemize}
     \renewcommand*{\do}[1]{\item[] ##1}
     \expandafter\docsvlist\expandafter{\participants}
   \end{itemize}
}
\begin{document}
\def\participants{Tom,Dick,Harry}
\listparticipants
\end{document}

请注意,第一个 MWE 可能是一种更好的方法,因为它允许您格式化参与者列表(例如,使用\textbf{Tom},\textit{Dick},\textsf{Harry}),而第二个 MWE 由于扩展而无法正常处理此类定义。

答案2

你可以\docsvlist通过切换到来避免xparse

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand{\listparticipants}{ >{\SplitList{,}}m}
 {%
  \begin{itemize}
  \ProcessList{#1}\lpitem
  \end{itemize}
 }
\NewDocumentCommand{\lpitem}{m}{\item #1} % just to allow for further customization

\begin{document}
\listparticipants{Tom,Dick,Harry}
\end{document}

您可以用逗号拆分作为参数给出的列表;然后\ProcessList{#1}\lpitem依次执行\lpitem{Tom}\lpitem{Dick}\lpitem{Harry}

答案3

为了完整起见,您可以使用另一个方便的宏etoolbox\DeclareListParser

\documentclass{article}

\usepackage{etoolbox}

\DeclareListParser*{\iterateparticipants}{,}

\newcommand{\listparticipants}[1]{%
\begin{itemize}
  \iterateparticipants{\item}{#1}
\end{itemize}
}

\begin{document}

\listparticipants{Tom,Dick,Harry}

\end{document}

输出

就这样。:)

答案4

处理逗号分隔列表的另一种方法是使用 PGF 的\foreach宏:

在此处输入图片描述

\documentclass{article}
\usepackage{pgffor}

\newcommand{\listparticipants}[1]{
   \begin{itemize}
        \foreach \particpant in {#1} {%
            \item \particpant
        }
   \end{itemize}
}

\begin{document}
    \listparticipants{Tom,Dick,Harry}
\end{document}

相关内容