有人能帮忙吗?我需要知道如何在 Latex 上计算值 S(n) = 0+1+2+3+4...+(n-1)+n 的总和(例如:0+1+2+3 = 6、0+1+2+3+4+5+6+7 = 28 等等)
答案1
当然,困难的任务是生成序列的项,而不是计算和;我提供了一个宏,可以打印所有项或仅打印和。您可以定义不同的起点和另一个差值(默认为 0 和 1)。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\arithmeticsequence}{sO{}m}
{
\group_begin:
\keys_set:nn {rudstep/arseq} { #2 }
\IfBooleanTF{#1}
{ \rudstep_arseq_sum:n { #3 } }
{ \rudstep_arseq_full:n { #3 } }
\group_end:
}
\keys_define:nn { rudstep/arseq }
{
diff .int_set:N = \l_rudstep_diff_int,
start .int_set:N = \l_rudstep_start_int,
diff .initial:n = 1,
start .initial:n = 0,
}
\seq_new:N \l_rudstep_terms_seq
\cs_new_protected:Npn \rudstep_arseq_full:n #1
{
\seq_clear:N \l_rudstep_terms_seq
\int_step_inline:nnnn
{ \l_rudstep_start_int } % start
{ \l_rudstep_diff_int } % step
{ \l_rudstep_start_int + #1*\l_rudstep_diff_int } % end
{ \seq_put_right:Nn \l_rudstep_terms_seq { ##1 } }
$\seq_use:Nn \l_rudstep_terms_seq { + } = \rudstep_arseq_sum:n { #1 }$
}
\cs_new:Npn \rudstep_arseq_sum:n #1
{
\int_eval:n { (#1+1)*(2*\l_rudstep_start_int+#1*\l_rudstep_diff_int)/2 }
}
\ExplSyntaxOff
\begin{document}
Just the sum of five terms after 0: \arithmeticsequence*{5}
The whole sequence: \arithmeticsequence{3}
Or: \arithmeticsequence{4}
Start from 1: \arithmeticsequence[start=1]{3}
\bigskip
A big example:
\arithmeticsequence[start=81297,diff=198]{180}
\end{document}
当然,如果你知道如何用 Lisp 来做这件事,那么方法如下:
\documentclass{article}
\usepackage{lisp-on-tex}
\begin{document}
\lispinterp{
(\define \intsum
(\lambda (\n)
(\lispif (\= \n :0 ) :0
(\+ (\intsum (\- \n :1)) \n))))}
\lispinterp{(\texprint(\intsum:100))}
\end{document}
众所周知,
5050
注:厚颜无耻地改编自的文档lisp-on-tex
。
相同想法的 e-TeX 版本,使用递归,可以
\documentclass{article}
\newcommand{\Sn}[1]{%
\number\numexpr #1
\ifnum\numexpr#1-1>0
+\expandafter\Sn\expandafter{\number\numexpr#1-1}
\fi
\relax
}
\begin{document}
\Sn{10}
\Sn{100}
\end{document}
请注意,这是完全可扩展的。宏\Sn
从参数开始,如果参数大于 1,则要求将\Sn
参数减少 1 进行扩展。也可以从 0 开始,但我将其留给感兴趣的读者作为练习。
答案2
\documentclass{article}
\newcommand\foo[1]{\the\numexpr((#1)*(#1+1))/2\relax}
% or if you want to print the terms
\newcommand\foob[1]{$\fooc{#1}{0}=\foo{#1}$}
\newcommand\fooc[2]{\the\numexpr#2\relax\ifnum#1=#2\relax\else+\fooc{#1}{\numexpr#2+1\relax}\fi}
\begin{document}
\foo{8} and \foo{5}
\foob{8} and \foob{5}
\end{document}
答案3
在这种情况下,使用 Lua 可能有点过度,但它展示了如何轻松地将 Lua 集成到 LaTeX 中。
对于刚接触 LaTeX 的程序员来说,代码可能也更容易掌握;)
% !TEX TS-program = lualatex
% !TEX encoding = UTF-8 Unicode
\documentclass{article}
\usepackage[utf8]{luainputenc}
\usepackage{luacode}
% The code won't work as-is if you move it into \directlua{}.
% If you do so, be sure to replace "~" (in i ~= startInt) by \string~
\begin{luacode}
function calcSum(startInt, endInt)
local sum = 0
for i=startInt, endInt do
sum = sum + i
end
return sum
end
function writeSum(startInt, endInt)
local sum = 0
local tex = ""
for i=startInt, endInt do
if i ~= startInt then
tex = tex .. " + "
end
sum = sum + i
tex = tex .. i
end
tex = tex .. " = " .. sum
return tex
end
\end{luacode}
\def\calcSum#1#2{\directlua{
tex.print(calcSum(tonumber(#1), tonumber(#2)))
}}
\def\writeSum#1#2{\directlua{
tex.print(writeSum(tonumber(#1), tonumber(#2)))
}}
\begin{document}
\noindent
The sum of the numbers \(0, 1, 2, \ldots, 28\) is \(\calcSum{0}{28}\).\\
Another sum: \(\writeSum{100}{103}\).
\end{document}
答案4
使用我的包calculator
,您可以轻松地进行算术计算。此代码解决了您的问题:
\documentclass{article}
\usepackage{ifthen}
\usepackage{calculator}
\newcounter{n}
\newcommand{\sumZeroToN}[2]{%
\COPY{0}{#2}
\whiledo{\not{\value{n}>#1}}{%
\ADD{#2}{\value{n}}{#2}\stepcounter{n}}}
\begin{document}
\sumZeroToN{100}{\sol}
\[
\sum_{n=0}^{100} n = \sol
\]
\end{document}