我如何才能创建一个\newcommand
计算三个数字(可以是数字或数字变量)之间的平均值?
用法是
\numberavg{<A>}{<B>}{<C>}
应该可以扩展到三个以上的参数,例如
\numberavg{<A>}{<B>}{<C>}...{<n>}
答案1
另一个xparse
/expl3
解决方案具有与 Christian Hupfer 的答案相同的界面。它的工作原理类似,但避免使用临时变量以保持可扩展性。这使得在进一步计算中使用结果变得更容易。如果列表为空,它还会返回明确定义的结果 (0)。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Nn\__avercalc_plus:n{
+ ( #1 )
}
\NewExpandableDocumentCommand{\avercalc}{O{1}+m}{%
\fp_eval:n {
round(
( 0 \clist_map_function:nN { #2 } \__avercalc_plus:n ) / max(1, \clist_count:n { #2 })
, #1
)
}
}
\ExplSyntaxOff
\begin{document}
How I can make to create a newcommand to calculate an average between three numbers (can be numbers or numeric variables)
\def\foo{4.75}
\def\foobar{3.80}
\def\foobarfoo{10.3}
\avercalc{1.5, 3.5, 4}
\avercalc{}
\avercalc[4]{\foobar,\foo,\foobarfoo}
\end{document}
答案2
我建议使用xparse
和expl3
功能,它应用逗号分隔列表来计算总和,然后除以元素数量。(它还不是万无一失的,因为到目前为止它还没有检查空列表。)
可选参数用于对数字进行四舍五入。
请注意,我的\avercalc
宏不可扩展。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\avercalc}{O{1}+m}{%
\clist_set:Nn \l_tmpa_clist {#2}%
\fp_zero:N \l_tmpa_fp
\clist_map_inline:Nn \l_tmpa_clist {
\fp_add:Nn \l_tmpa_fp {##1}
}
\fp_eval:n { round(\l_tmpa_fp/\clist_count:N \l_tmpa_clist, #1)}
}
\ExplSyntaxOff
\begin{document}
How I can make to create a newcommand to calculate an average between three numbers (can be numbers or nume
ric variables)
\def\foo{4.75}
\def\foobar{3.80}
\def\foobarfoo{10.3}
\avercalc{1.5, 3.5, 4}
\avercalc[2]{\foobar,\foo,\foobarfoo}
\avercalc[3]{\foobar,\foo,\foobarfoo}
\avercalc[4]{\foobar,\foo,\foobarfoo}
\end{document}