Cree una macro Latex simple que expanda el formato para secuenciar

Cree una macro Latex simple que expanda el formato para secuenciar

Necesito una macro de látex simple que tome algún formato y cree una secuencia a partir de ella. Por ejemplo,

\macro[N]{x^N y^N} => x^1 y^1 + x^2 y^2 + \dots + x^N y^N
\macro[N]{x^N y_N} => x^1 y_1 + x^2 y_2 + \dots + x^N y_N
\macro[N]{(x^N y_N)^2} => (x^1 y_1)^2 + (x^2 y_2)^2 + \dots + (x^N y_N)^2

ingrese la descripción de la imagen aquí

Respuesta1

Si está dispuesto a escribir \Npara 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}

Resultado

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.

ingrese la descripción de la imagen aquí

Sin embargo, preferiría un enfoque diferente: en el segundo argumento se utiliza #1para 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.

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

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 egreglo usara, simplemente puede cambiarlo \defa \newcommandcuyo 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:

uso de macros

Respuesta4

¿Qué pasa con esto?

\documentclass{article}
\usepackage{pgffor}

\newcommand{\macro}[2]{%
  \foreach \n in {1,...,#1}{%
    #2%
    \ifnum\n<#1 + \fi
  }%
}

\begin{document}

$\macro{5}{x^\n y^\n}$

$\macro{5}{(x^\n y_\n)^2}$

\end{document}

ingrese la descripción de la imagen aquí

información relacionada