我想创建一个可以将连续整数相乘的命令(如果它尚不存在)。
我如何创建一个命令,比如说\multiply{<first_number>}{<last_number>}
,使用 LaTeX3,将所有整数从<first_number>
乘以 到<last_number>
?
例如:我想\multiply{4}{9}
执行乘法4*5*6*7*8*9
并返回其值60480
。
不幸的是,我甚至无法为你创建一些“起始”代码(抱歉!)因为我还没有学习 L3 语法。因此,我知道这是一个“请为我完成所有工作”的问题。:-(
答案1
该名称\multiply
已定义(将寄存器的值乘以数字并将结果存储在该寄存器中的原语),因此我将其用于\product
以下用途。否则,如果您知道相关的 L3 函数,这将非常简单:
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand \product { m m }
{ \svendtveskaeg_multiply:nn {#1} {#2} }
\cs_new:Npn \svendtveskaeg_multiply:nn #1#2
{
\int_eval:n
{ 1 \int_step_function:nnN {#1} {#2} \__svendtveskaeg_multiply:n }
}
\cs_new:Npn \__svendtveskaeg_multiply:n #1 { * #1 }
\ExplSyntaxOff
\begin{document}
\product{4}{9}
\typeout{\product{4}{9}}
\end{document}
将会把 60480 打印到文档中并将其写入日志。
答案2
答案3
我们可以用 OpTeX 做什么:
\def\multiply#1#2{\expr[0]{#1\fornum #1+1..#2\do{*##1}}}
\multiply{4}{9}
\multiply{4}{15}
\bye
注意三个特点:
- 该宏只需要一行代码。
- 我们可以重新定义 TeX 原语
\multiply
而不会丢失任何内部宏的功能,因为我们是在用户名空间中执行此操作。 - 该
\expr
宏通过Lua表达式实现,数字限制为2^63,而TeX数字限制为2^31。
答案4
这是一个基于 LuaLaTeX 的解决方案。(请注意,我选择了\Multiply
作为宏名称,因为已经有一个名为的宏\multiply
。)
观察代码是否正确处理\Multiply{4}{4}
。如果第二个参数小于第一个参数,则返回字符串“NIL”。
% !TEX TS-program = lualatex
\documentclass{article}
\newcommand\Multiply[2]{\directlua{
if #2<#1 then tex.sprint ( "NIL" )
else j=#1; for i=#1+1,#2 do j = j*i end; tex.sprint (j)
end}}
\begin{document}
\Multiply{4}{9}, \Multiply{4}{4}.
\end{document}