
Respuesta1
Si está dispuesto a escribir \N
para que se reemplace el símbolo, puedo ofrecerle la siguiente solución.
\documentclass{article}
\usepackage{amsmath}
\newcommand{\macro}[2][]{
\def\N{1} #2
+
\def\N{2} #2
+\cdots+
\def\N{#1} #2
}
\begin{document}
\verb|\macro[N]{x^\N y^\N}| gives $\macro[N]{x^\N y^\N}$
\bigskip\verb|\macro[N]{x^\N y_\N}| gives $\macro[N]{x^\N y_\N}$
\bigskip\verb|\macro[M]{(x^\N y_\N)^2}| gives $\macro[M]{(x^\N y_\N)^2}$
\end{document}
Respuesta2
Puede definir una macro auxiliar y realizar el reemplazo.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\tl_new:N \l__akkapelli_makesum_template_tl
\cs_generate_variant:Nn \cs_set_protected:Nn { NV }
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\tl_set:Nn \l__akkapelli_makesum_template_tl { #2 }
\tl_replace_all:Nnn \l__akkapelli_makesum_template_tl { #1 } { {##1} }
\cs_set_protected:NV \__akkapelli_makesum_do:n \l__akkapelli_makesum_template_tl
\__akkapelli_makesum_do:n { 1 } + \__akkapelli_makesum_do:n { 2 } + \dots + \__akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^Ny^N}$
$\makesum{x^Ny_N}$
$\makesum[M]{(x^M y_M)^2}$
\end{document}
El argumento opcional (predeterminado N
) se sustituye en el segundo argumento por #1
, para que podamos definir una macro basada en él y usarlo.
Sin embargo, preferiría un enfoque diferente: en el segundo argumento se utiliza #1
para la "parte variable":
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\cs_set_protected:Nn \__akkapelli_makesum_do:n { #2 }
\__akkapelli_makesum_do:n { 1 } + \__akkapelli_makesum_do:n { 2 } + \dots + \__akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^#1y^#1}$
$\makesum{x^#1y_#1}$
$\makesum[M]{(x^#1 y_#1)^2}$
$\makesum[100]{(x^{#1} y_{#1})^2}$
\end{document}
Tenga en cuenta las llaves necesarias en el último caso.
Si se utilizan exponentes enteros, es mejor abordar los casos “pequeños”.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\makesum}{O{N}m}
{
\akkapelli_makesum:nn { #1 } { #2 }
}
\cs_new_protected:Nn \akkapelli_makesum:nn
{
\cs_set_protected:Nn \__akkapelli_makesum_do:n { #2 }
\regex_match:nnTF { \A [0-9]* \Z } { #1 }
{% numeric argument
\int_case:nnF { #1 }
{
{0}{0}
{1}{\__akkapelli_makesum_do:n { 1 }}
{2}{\__akkapelli_makesum_do:n { 1 } + \__akkapelli_makesum_do:n { 2 }}
{3}{\__akkapelli_makesum_do:n { 1 } + \__akkapelli_makesum_do:n { 2 } + \__akkapelli_makesum_do:n { 3 }}
}
{ \__akkapelli_makesum_generic:n { #1 } }
}
{ \__akkapelli_makesum_generic:n { #1 } }
}
\cs_new_protected:Nn \__akkapelli_makesum_generic:n
{
\__akkapelli_makesum_do:n { 1 } + \__akkapelli_makesum_do:n { 2 } + \dots + \__akkapelli_makesum_do:n { #1 }
}
\ExplSyntaxOff
\begin{document}
$\makesum{x^#1y^#1}$
$\makesum{x^#1y_#1}$
$\makesum[M]{(x^#1 y_#1)^2}$
$\makesum[1]{x^{#1} y_{#1}}$
$\makesum[2]{x^{#1} y_{#1}}$
$\makesum[3]{x^{#1} y_{#1}}$
$\makesum[4]{x^{#1} y_{#1}}$
$\makesum[100]{(x^{#1} y_{#1})^2}$
\end{document}
Respuesta3
Esta solución es puramente (e-)TeX. Utiliza la misma idea que Οὖτις
's, pero no requiere que la entrada sea una secuencia de control (la entrada debe ser un carácter). Me deshice del argumento opcional porque no entiendo su propósito, pero si estaba previsto que egreg
lo usara, simplemente puede cambiarlo \def
a \newcommand
cuyo argumento opcional sea por defecto N
.
\def\macro#1#2{{%
\everyeof={}% So nothing weird happens at the end of \scantokens
\catcode`#1=\active% Make the parameter an active character
\scantokens{% Retokenize the following code so that #1's catcode is changed
\def#1{1}#2\def#1{2}+#2% Print a_1+a_2
}%
+\cdots+#2% Print +...+a_N
}}
$$\macro{N}{x^Ny^N}$$
$$\macro{N}{x^Ny_N}$$
$$\macro{M}{(x^My_M)}$$
Da: