我正在尝试定义一个宏,将 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}