问题

问题

问题

xparse是否可以获取并存储实际传递给声明参数/环境的可选参数的数量?

目的

无论提供多少个参数(根据情况任意),我都希望使用给出的最后一个参数做一些非常具体的事。因为这是一个变量数,所以我需要检索给定的参数的数量,并结合该数量#对该变量执行某些操作。

代码

\documentclass{article}
\usepackage{fontspec}
\usepackage{xparse}

\DeclareDocumentEnvironment{myenv}{O{}O{}O{}O{}O{}O{}O{}O{}O{}O{}} % 10 optional args
{startcode}
{endcode}

\DeclareDocumentCommand{\mycom}{O{}O{}O{}O{}O{}O{}O{}O{}O{}O{}}{% 10 optional args
}%

\begin{document}

\mycom[a][b][c] % Count 3
% Do something special with #3

\begin{myenv}[a][b][c][d] % Count 4
% Do something special with #4
\end{myenv}

\end{document}

答案1

您不应该[]以这种方式使用重复的参数。使用逗号分隔的列表来表示任意参数语法。

在此处输入图片描述

\documentclass{article}

\usepackage{xparse,expl3}

\ExplSyntaxOn
\DeclareDocumentEnvironment{myenv}{O{}} 
{\doargs:n{#1}}
{}

\DeclareDocumentCommand{\mycom}{O{}}{
\doargs:n{#1}
}%
\clist_new:N\arglist

\cs_new_protected:Nn\doargs:n{{
\clist_set:Nn\arglist{#1}
[there ~are ~\clist_count:N\arglist{} ~ arguments]
[the ~last ~one ~is ~\clist_item:Nn\arglist{\clist_count:N\arglist}]
}}
\ExplSyntaxOff

\begin{document}

\mycom[a,b,c] % Count 3
% Do something special with #3

\begin{myenv}[a,b,c,d] % Count 4
% Do something special with #4
\end{myenv}

\end{document}

相关内容