
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
Responder1
Se você estiver disposto a escrever \N
para 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}
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.
Porém, eu preferiria uma abordagem diferente: no segundo argumento você usa #1
para 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.
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}
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 egreg
usado, você pode simplesmente alterar \def
para um \newcommand
cujo 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á: