我想构造一个命令,该命令至少需要一个(强制)参数,最多可以有多个(很少,比如 10 个或 50 个)可选参数。如果存在任何可选参数,我希望该命令包含不同的代码。
\NewDocumentCommand \myDummy { m o }{
\IfNoValueTF {#2}
{ \DoSomethingJustWithMandatoryArgument {
publication \hyperref[#1]{ \#\,\ref{#1}}
}
}
{ \DoSomethingWithBothArguments {
publications \hyperref[#1]{ \#\,\ref{#1}}, \hyperref[#2]{\#\,\ref{#2}}
}
}
}
\mydummy{a}
这与和配合良好\mydummy{a}{b}
,产生了所需的结果。
如何使其与更多参数一起工作,比如说 3 个或 10 个?
就语法而言,如何
\mydummy
在内使用多个参数 进行调用{}
,例如\mydummy{a}
或\mydummy{a,b,c,d,e,f}
?
答案1
此方法使用xparse
参数处理器(请参阅文档第 3.2 节)来实现所描述的行为。我用 代替\textbf
并\ref
省略了\hyperref
。
\documentclass{article}
\usepackage{xparse}
\newcounter{NumberOfArgs}
\setcounter{NumberOfArgs}{0}
\NewDocumentCommand \myDummy { >{\SplitList{,}} m} {%
\setcounter{NumberOfArgs}{0}%
\ProcessList{#1}{\Count}%
\ifnum\value{NumberOfArgs}>1 Publications \else Publication \fi
\setcounter{NumberOfArgs}{1}\ProcessList{#1}{\reference}%
}
\NewDocumentCommand \Count {m} {\addtocounter{NumberOfArgs}{1}}
\NewDocumentCommand \reference {m} {%
\ifnum\value{NumberOfArgs}>1 ,\space\else\relax\fi
\#\,\textbf{#1}%
\addtocounter{NumberOfArgs}{1}%
}
\begin{document}
\myDummy{a,b,c}
\myDummy{a}
\myDummy{a,b,c,d,e,f,g}
\end{document}