
Слово "вариативный" используется для функций и команд, которые могут принимать любое количество входных аргументов.
Ниже мы видим пример пользовательской команды, которая имеет три входа:
\newcommand{\mycmd}[3]{ {{e^{#1}}^{#2}}^{#3}}
\mycmd{1}{2}{3}
Проблема в том, что команда, для которой я привел небольшой фрагмент исходного кода, всегда имеет ровно три входа.
Как создать вариативную команду, которая допускает 0 входов, 1 вход, 2 входа, 3 входа и т. д.?
решение1
Ниже представлена структура аргумента, изложенная в моем комментарии, с учетом примечания, сделанного @Teepeemm.
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand \mycmd { O{} }
{
e
\clist_map_function:nN {#1} \__idlecustard_exponent_chain:nw
\use_none:n \__idlecustard_exponent_chain_mark:
}
\cs_new:Npn \__idlecustard_exponent_chain:nw
#1 #2 \__idlecustard_exponent_chain_mark:
{ \sp { #1 #2 \__idlecustard_exponent_chain_mark: } }
\ExplSyntaxOff
\begin{document}
$\mycmd$
$\mycmd[1]$
$\mycmd[1, 2]$
$\mycmd[1, 2, 3]$
\end{document}
решение2
На сайте есть десятки вопросов по теме «команды с переменным числом аргументов». Выможетделайте это, но лучше этого не делать.
Такой синтаксис \cmd[1,2,3]
гораздо проще.
Здесь есть небольшое осложнение, которое заключается в том, что вам нужно заключить в скобки каждую экспоненту: вам нужно получить
e^{1^{2^{3}}}
но мы можем воспользоваться этим фактом \bgroup
и \egroup
быть в полной безопасности в этой ситуации вместо брекетов.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\mycmd}{o}
{
e\IfValueT{#1}{\idle_exponents:n{#1}}
}
\cs_new_protected:Nn \idle_exponents:n
{
\clist_map_function:nN { #1 } \__idle_exponents:n
\prg_replicate:nn { \clist_count:n { #1 } } { \egroup }
}
\cs_new_protected:Nn \__idle_exponents:n
{
^\bgroup\scriptstyle #1
}
\ExplSyntaxOff
\begin{document}
$\mycmd+\mycmd[1]+\mycmd[1,2]+\mycmd[1,2,3]$
\end{document}
Просто для академического интереса:
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\mycmd}{}
{
\seq_clear:N \l__idle_exponents_seq
e\idle_exponents_gather:
}
\seq_new:N \l__idle_exponents_seq
\cs_new_protected:Nn \idle_exponents_gather:
{
\peek_catcode:NTF \c_group_begin_token
{
\__idle_exponents_add:n
}
{
\__idle_exponents_deliver:
}
}
\cs_new_protected:Nn \__idle_exponents_add:n
{
\seq_put_right:Nn \l__idle_exponents_seq { #1 }
\idle_exponents_gather:
}
\cs_new_protected:Nn \__idle_exponents_deliver:
{
\seq_map_function:NN \l__idle_exponents_seq \__idle_exponents:n
\prg_replicate:nn { \seq_count:N \l__idle_exponents_seq } { \egroup }
}
\cs_new_protected:Nn \__idle_exponents:n
{
^\bgroup\scriptstyle #1
}
\ExplSyntaxOff
\begin{document}
$\mycmd+\mycmd{1}+\mycmd{1}{2}+\mycmd{1}{2}{3}$
\end{document}