¿Cómo se crea un nuevo comando variado?

¿Cómo se crea un nuevo comando variado?

La palabra "variado" se utiliza para funciones y comandos que pueden aceptar cualquier número de argumentos de entrada.


A continuación, vemos un ejemplo de un comando personalizado que tiene tres entradas:

\newcommand{\mycmd}[3]{ {{e^{#1}}^{#2}}^{#3}}

\mycmd{1}{2}{3}   

captura de pantalla de ((e^1)^2)^3

El problema es que el comando para el que proporcioné una pequeña cantidad de código fuente siempre tiene exactamente tres entradas.

¿Cómo creamos un comando variado que permite 0 entradas, 1 entrada, 2 entradas, 3 entradas, etc.?


NÚMERO
DE
ENTRADAS
LLAMADO O INVOCACIÓN IMAGEN
0 \mycmd Imagen de la letra "e" sin exponente.
1 \mycmd{1} foto de ALGO
2 \mycmd{1}{2} foto de ALGO
3 \mycmd{1}{2}{3} foto de algo

Respuesta1

Lo siguiente implementa la estructura del argumento tal como se establece en mi comentario, considerando también la nota al margen realizada por @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}

ingrese la descripción de la imagen aquí

Respuesta2

Hay decenas de preguntas en el sitio que solicitan "comandos con un número variable de argumentos". TúpuedeHazlo, pero es mejor no hacerlo.

Una sintaxis como \cmd[1,2,3]es mucho más simple.

Aquí existe la pequeña complicación de que necesitas reforzar cada exponente: necesitas obtener

e^{1^{2^{3}}}

pero podemos aprovechar el hecho de que \bgroupy \egroupestamos perfectamente seguros en esta situación en lugar de aparatos ortopédicos.

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

ingrese la descripción de la imagen aquí

Sólo por interés académico:

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

información relacionada