Exponer un nuevo comando para cada elemento de una lista

Exponer un nuevo comando para cada elemento de una lista

Tengo una macro lVars, definida usando foreachdel pgfforpaquete (parte dePGF) como:

\newcommand{\lVars}[1]{\foreach \x [count=\ii] in {#1}{
  \ifnum\ii=1{} \else {,} \fi \lVar[\x]}
}

El uso previsto es en términos como \exists \lVars{a, b, c, d}, que produce el resultado \exists \lVar[a], \lVar[b], \lVar[c], \lVar[d]. El comando \lVar[a]es otro comando personalizado con el formato \newcommand{\lVar}[1][x]{\textsc{#1}}, pero puede volverse más complejo en breve. Luego utilizo los \lVarelementos recién cuantificados dentro de foros más grandes.

Sin embargo, soy extremadamente vago. Me gustaría que esta macro expusiera cada elemento de la lista como un nuevo comando del formulario \lA, \lBetc., que a su vez se expanda al subyacente real \lVar[A], \lVar[B].... Estos nuevos comandos harían que mi notación de fórmula sea significativamente menos detallada. Estos nuevos comandos deberían durar hasta la próxima vez que ase b,utilicen en el parámetro de lista de la lVarsmacro. Entonces, el uso general será situaciones como:

\begin{displaymath}
  \begin{array}{l}
    \exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
    \lC = 0 \implies \lA = 0
    \exists \lVars{a, b}.~ \lA \neq \lB
  \end{array}
\end{displaymath}

And, as we see in the term $\lA = \lB$, the implication...

He experimentado con varias permutaciones en \newcommandy \defdentro del cuerpo del foreach, sin suerte. ¿Algún consejo o sugerencia?

Respuesta1

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand{\lVars}{m}
 {
  % cycle through the argument
  \clist_map_inline:nn { #1 }
   {
    % print the variable
    \lVar[##1]
    % if the variable is a, define \lA
    \tl_to_uppercase:n
     {
      \cs_gset_protected:cpn { \c_wright_prefix_tl ##1 }
     }
     { \lVar[##1] }
   }
 }
% We need to store the `l' prefix in a control sequence to hide it from \uppercase
\tl_const:Nn \c_wright_prefix_tl { l }
\ExplSyntaxOff

\newcommand{\lVar}[1][x]{\textsc{#1}}

\begin{document}
\begin{displaymath}
  \begin{array}{l}
    \exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
    \lC = 0 \implies \lA = 0
    \exists \lVars{a, b}.~ \lA \neq \lB
  \end{array}
\end{displaymath}

And, as we see in the term $\lA = \lB$, the implication...
\end{document}

Sin embargo, la definición de \lCsobrevivirá para siempre; si planea usarlo en diferentes celdas de una arraydefinición global, es necesaria.

ingrese la descripción de la imagen aquí


Una versión que acepta variables de varias letras y define \lFoodesde \lVars{foo}:

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\lVars}{m}
 {
  % cycle through the argument
  \clist_map_inline:nn { #1 }
   {
    % print the variable
    \lVar[##1]
    % build the name with the first letter uppercase
    \wright_make_var_name:n { ##1 }
    \cs_gset_protected:cpn { \l__wright_var_name_tl } { \lVar[##1] }
   }
 }
\tl_const:Nn \c_wright_prefix_tl { l }
\cs_new:Npn \wright_make_var_name:n #1
 {
  % get the first letter and uppercase it
  \tl_to_uppercase:n
   {
    \tl_set:Nx \l__wright_var_name_tl { \tl_head:n {#1} }
   }
  % add the rest
  \tl_put_right:Nx \l__wright_var_name_tl { \tl_tail:n {#1} }
  % add the prefix
  \tl_put_left:Nx \l__wright_var_name_tl { \c_wright_prefix_tl }
 }
\ExplSyntaxOff
\newcommand{\lVar}[1][x]{\textsc{#1}}

\begin{document}
\begin{displaymath}
  \begin{array}{l}
    \exists \lVars{a, b, c}.~ \lA = \lB \implies \lA = \lC \\
    \lC = 0 \implies \lA = 0
    \exists \lVars{a, b}.~ \lA \neq \lB
  \end{array}
\end{displaymath}

And, as we see in the term $\lA = \lB$, the implication...

Now $\forall\lVars{foo}\;\lFoo=0$
\end{document}

ingrese la descripción de la imagen aquí

información relacionada