# Loop newcommand with variable arguments

Following my previous question, I would like to know how to have variable inputs for a newcommand in order to do the following

\documentclass{article}
\newcommand*{\repsum}[VARIABLE NUMBER]{
\foreach \i in{1,...,#1}{
\ifnum\i>1
+#2_{\i}#3_{#4\i}   % This should be able to change according to the input, see below
\else
#2_{\i}#3_{#4\i}    % This should be able to change according to the input, see below
\fi
}}
\begin{document}

The CUF Refined theory expands the summation as

$$u=\repsum{4}{F}{u}=F_\tau u_\tau$$

where the last expression exploits the Einstein notation. If we include nodes

$$u=\repsum{4}{F}{u}{N}=F_\tau N_i u_{\tau i}$$

\end{document}


Thank you!

• optional arguments in latex should use [] not {} – David Carlisle Sep 5 '18 at 11:49

## 1 Answer

Rather than defining new macros with several arguments, I propose a different syntax, where the second mandatory argument contains the format of the summands, with #1 standing for the current summation index.

The *-form of \xrepsum will print the full expression without ellipsis.

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\xrepsum}{sO{3}mm}
{% #1 = star; if present, print the full summation
% #2 = optional number of starting summands
% #3 = final number
% #4 = summands
\cs_set_protected:Nn \__mascolo_repsum_summand:n { #4 }
\cs_set_protected:Nn \__mascolo_repsum_summand_pre:n { + #4 }
\cs_set_protected:Nn \__mascolo_repsum_summand_post:n { #4 + }
\bool_lazy_or:nnTF { #1 } { \int_compare_p:n { #3 - #2 < 3 } }
{% print the full summation either because we want it (*-form) or
% there are too few summands
\__mascolo_repsum_summand:n { 1 }
\int_step_function:nnN { 2 } { #3 } \__mascolo_repsum_summand_pre:n
}
{
\int_step_function:nN { #2 } \__mascolo_repsum_summand_post:n
\dotsb
\int_step_function:nnN { #3 - 1} { #3 } \__mascolo_repsum_summand_pre:n
}
}
\ExplSyntaxOff

\begin{document}

Full summation: $\xrepsum*{9}{F_{#1}u_{#1}}$

First test: $\xrepsum{9}{F_{#1}u_{#1}}$

Second test: $\xrepsum[2]{6}{F_{#1}u_{#1}}$

Third test: $\xrepsum{5}{F_{#1}u_{x#1}}$

Fourth test: $\xrepsum{3}{F^{#1}u_{#1}}$

Fifth test: $\xrepsum{2}{F_{#1}u_{#1x}}$

Sixth test: $\xrepsum{1}{F_{#1}u_{#1}}$

The CUF Refined theory expands the summation as

$$u=\xrepsum{4}{F_{#1}u_{x#1}}=F_\tau u_\tau$$
where the last expression exploits the Einstein notation. If we include nodes
$$u=\xrepsum{4}{F_{#1}N_{#1}u_{x#1}}=F_\tau N_i u_{\tau i}$$

\end{document}


As an aside, avoid blank lines before displayed equations: they are always wrong. A blank line after displayed equation should be added only if the following text starts a new paragraph.

• Thank you very much. This solves all my requests, even though it is way beyond my comprehension level. Specifically, I understand everything it is written inside and how it is working, but I would not be able to replicate it. Once I take my degree I'll focus on these advanced commands. Thank you! – L Mascolo Sep 5 '18 at 13:41
• @LMascolo \int_step_function:nN does a cycle passing to a one-argument function the integers from 1 to the mandatory argument. The variant \int_step_function:nnN accepts the starting point and the end point; more generally, \int_step_function:nnnN accepts the starting point, the step and the end point. The main trick in the code is defining helper one-argument functions based on the stated template. – egreg Sep 5 '18 at 14:04
• Thank you, I'll study the topic more. But thanks for your help :) You've been really kind – L Mascolo Sep 5 '18 at 14:05