
Das Wort "variadisch" wird für Funktionen und Befehle verwendet, die eine beliebige Anzahl von Eingabeargumenten akzeptieren können.
Unten sehen wir ein Beispiel für einen benutzerdefinierten Befehl mit drei Eingaben:
\newcommand{\mycmd}[3]{ {{e^{#1}}^{#2}}^{#3}}
\mycmd{1}{2}{3}
Das Problem ist, dass der Befehl, für den ich einen kleinen Teil des Quellcodes bereitgestellt habe, immer genau drei Eingaben hat.
Wie erstellen wir einen variadischen Befehl, der 0 Eingaben, 1 Eingabe, 2 Eingaben, 3 Eingaben usw. zulässt?
Antwort1
Im Folgenden wird die Argumentstruktur wie in meinem Kommentar dargelegt implementiert, wobei auch die Randbemerkung von @Teepeemm berücksichtigt wird.
\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}
Antwort2
Es gibt Dutzende von Fragen auf der Website, die nach „Befehlen mit einer variablen Anzahl von Argumenten“ fragen. SieMaitu es, aber es ist besser, es nicht zu tun.
Eine Syntax wie \cmd[1,2,3]
ist viel einfacher.
Hier gibt es die kleine Komplikation, dass Sie jeden Exponenten stützen müssen: Sie müssen
e^{1^{2^{3}}}
Wir können uns aber die Tatsache zunutze machen, dass \bgroup
und \egroup
in dieser Situation anstelle von Klammern vollkommen sicher sind.
\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}
Nur aus akademischem Interesse:
\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}