Crie uma macro Latex simples que expanda o formato para sequência

Crie uma macro Latex simples que expanda o formato para sequência

Preciso de uma macro de látex simples que assuma algum formato e crie uma sequência a partir dele. Por exemplo,

\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

insira a descrição da imagem aqui

Responder1

Se você estiver disposto a escrever \Npara que o símbolo seja substituído, posso oferecer a seguinte solução.

\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

Responder2

Você pode definir uma macro auxiliar e fazer a substituição.

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

O argumento opcional (default N) é substituído no segundo argumento por #1, para que possamos definir uma macro com base nele e utilizá-la.

insira a descrição da imagem aqui

Porém, eu preferiria uma abordagem diferente: no segundo argumento você usa #1para a “parte variável”:

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

Observe os colchetes necessários no último caso.

insira a descrição da imagem aqui

Se forem usados ​​expoentes inteiros, é melhor lidar com os casos “pequenos”.

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

insira a descrição da imagem aqui

Responder3

Esta solução é puramente (e-)TeX. Ele usa a mesma ideia de Οὖτις', mas não exige que a entrada seja uma sequência de controle (a entrada deve ser um caractere). Eu me livrei do argumento opcional porque não entendo seu propósito, mas se foi planejado para ser egregusado, você pode simplesmente alterar \defpara um \newcommandcujo argumento opcional é por padrão 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)}$$

Dá:

uso de macro

Responder4

E quanto a isso?

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

insira a descrição da imagem aqui

informação relacionada