Wie erstellt man einen variadischen neuen Befehl?

Wie erstellt man einen variadischen neuen Befehl?

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}   

Bildschirmaufnahme von ((e^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?


ANZAHL
DER
EINGÄNGE
Anruf oder Anrufung BILD
0 \mycmd Bild des Buchstabens "e" ohne Exponent
1 \mycmd{1} Bild von ETWAS
2 \mycmd{1}{2} Bild von ETWAS
3 \mycmd{1}{2}{3} Bild von etwas

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}

Bildbeschreibung hier eingeben

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 \bgroupund \egroupin 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}

Bildbeschreibung hier eingeben

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}

verwandte Informationen