Erstellen Sie ein einfaches Latex-Makro, das das Format auf Sequenz erweitert

Erstellen Sie ein einfaches Latex-Makro, das das Format auf Sequenz erweitert

Ich brauche ein einfaches Latex-Makro, das ein Format nimmt und daraus eine Sequenz erstellt. Zum Beispiel:

\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

Bildbeschreibung hier eingeben

Antwort1

Wenn Sie bereit sind, schriftlich \Nfür den Austausch des Symbols zu sorgen, kann ich Ihnen die folgende Lösung anbieten.

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

Ergebnis

Antwort2

Sie können ein Hilfsmakro definieren und den Ersatz durchführen.

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

Das optionale Argument (Standard N) wird im zweiten Argument durch ersetzt #1, sodass wir darauf basierend ein Makro definieren und verwenden können.

Bildbeschreibung hier eingeben

Ich würde jedoch einen anderen Ansatz bevorzugen: Im zweiten Argument, das Sie #1für den „variablen Teil“ verwenden:

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

Beachten Sie im letzten Fall die notwendigen Klammern.

Bildbeschreibung hier eingeben

Bei der Verwendung ganzzahliger Exponenten lassen sich die „kleinen“ Fälle besser bewältigen.

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

Bildbeschreibung hier eingeben

Antwort3

Diese Lösung ist eine reine (e-)TeX-Lösung. Sie verwendet dieselbe Idee wie Οὖτις's, erfordert aber nicht, dass die Eingabe eine Steuersequenz ist (die Eingabe muss ein Zeichen sein). Ich habe das optionale Argument entfernt, weil ich seinen Zweck nicht verstehe, aber wenn es so gedacht war, wie ich egreges verwende, können Sie einfach das \defin ein ändern \newcommand, dessen optionales Argument standardmäßig ist 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)}$$

Gibt:

Makroverwendung

Antwort4

Was ist damit?

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

Bildbeschreibung hier eingeben

verwandte Informationen