Tengo una macro lVars
, definida usando foreach
del pgffor
paquete (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 \lVar
elementos 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
, \lB
etc., 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 a
se b,
utilicen en el parámetro de lista de la lVars
macro. 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 \newcommand
y \def
dentro 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 \lC
sobrevivirá para siempre; si planea usarlo en diferentes celdas de una array
definición global, es necesaria.
Una versión que acepta variables de varias letras y define \lFoo
desde \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}