问题
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}