迭代可选参数列表

迭代可选参数列表

我正在定义一个新命令,它应该采用可选的参数列表(整数或范围):

\doit[3,5-7,9]{something}

我目前拥有的:

\def\doit{\@ifnextchar[{\@with}{\@without}}
\def\@with[#1]#2{
  ...
}
\def\@without#1{
}

在这种with情况下,我该如何迭代可选参数?如何区分整数和范围?我需要手动进行解析吗?或者有工具可以帮助我吗?

答案1

如果将-角色更改为对您而言是可行的,那么,...,您可以直接轻松地受益于pgfforTikZ/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}

在此处输入图片描述

相关内容