![迭代可选参数列表](https://linux22.com/image/253071/%E8%BF%AD%E4%BB%A3%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%E5%88%97%E8%A1%A8.png)
我正在定义一个新命令,它应该采用可选的参数列表(整数或范围):
\doit[3,5-7,9]{something}
我目前拥有的:
\def\doit{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]#2{
...
}
\def\@without#1{
}
在这种with
情况下,我该如何迭代可选参数?如何区分整数和范围?我需要手动进行解析吗?或者有工具可以帮助我吗?
答案1
如果将-
角色更改为对您而言是可行的,那么,...,
您可以直接轻松地受益于pgffor
TikZ/PGF
。请查看手册以了解受支持的其他类型。以下是包含非数字列表的示例:
\documentclass{article}
\usepackage{pgffor}
\makeatletter
\def\doit{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]#2{
#2 have the following list:%
\foreach \x in {#1}{
\x,%
}
}
\def\@without#1{
#1, I have no optional arguments.
}
\makeatother
\begin{document}
\doit[1,...,5,7]{I}
\doit{Ahem}
\doit[1,3$\pi$,4$\pi$,...$\pi$,7$\pi$,e,f,...,i]{Also I}
\end{document}
答案2
您可以使用提供的拆分参数功能xparse
:
\documentclass{article}
\usepackage{xparse}
\newcommand{\doittemp}{}
\NewDocumentCommand{\doit}{>{\SplitList{,}}om}{%
\renewcommand\doittemp{#2}%
\IfNoValueTF{#1}
{\par (main argument \doittemp)}
{\ProcessList{#1}{\doitauxi}}%
}
\NewDocumentCommand{\doitauxi}{>{\SplitArgument{1}{-}}m}{\doitauxii #1}
\NewDocumentCommand{\doitauxii}{mm}{%
\IfNoValueTF{#2}
{\par Single number #1 (main argument \doittemp)}
{\par Range #1--#2 (main argument \doittemp)}%
}
\begin{document}
\doit{No optional argument}
\bigskip
\doit[1,2]{Two single numbers}
\bigskip
\doit[1,3-5]{Single number and range}
\bigskip
\doit[1-3,5-10]{Two ranges}
\end{document}