Создайте простой макрос Latex, который расширяет формат до последовательности

Создайте простой макрос Latex, который расширяет формат до последовательности

Мне нужен простой латексный макрос, который берет какой-то формат и создает из него последовательность. Например,

\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

введите описание изображения здесь

решение1

Если вы готовы написать заявление \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}

Результат

решение2

Вы можете определить вспомогательный макрос и выполнить замену.

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

Необязательный аргумент (default N) заменяется во втором аргументе на #1, поэтому мы можем определить макрос на его основе и использовать его.

введите описание изображения здесь

Однако я бы предпочел другой подход: во втором аргументе вы используете #1для «переменной части»:

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

Обратите внимание на необходимые скобки в последнем случае.

введите описание изображения здесь

Если используются целые показатели степени, то лучше справляться с «малыми» случаями.

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

введите описание изображения здесь

решение3

Это решение чисто (e-)TeX. Оно использует ту же идею, что Οὖτιςи , но не требует, чтобы ввод был управляющей последовательностью (ввод должен быть символом). Я избавился от необязательного аргумента, потому что не понимаю его назначения, но если он был задуман так, как egregон использовался, вы можете просто изменить \defна , \newcommandнеобязательный аргумент которого по умолчанию равен 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)}$$

Дает:

использование макроса

решение4

Как насчет этого?

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

введите описание изображения здесь

Связанный контент