我正在尝试使用该包计算阶乘xfp
。在文档中(http://ctan.cs.uu.nl/macros/latex/contrib/l3packages/xfp.pdf),我发现函数名称是fact
。我的代码如下:
\documentclass{article}
\usepackage{xfp}
\begin{document}
\fpeval{fact(4)}
\end{document}
但是,我收到以下错误:
! Undefined control sequence.
<argument> \LaTeX3 error:
Unknown fp word fact.
l.4 \fpeval{fact(4)}
虽然其他功能确实有效(例如\fpeval{16*4^3}
或 没有错误\fpeval{cosd(60)*45}
)
我做错了什么?我正在使用 TeXstudio。
更新
在序言中,我将 \usepackage{xfp}[2019/08/25]
在文档中找到的日期设置在方括号之间。
我收到与之前相同的错误并出现以下警告:
You have requested, on input line 3, version `2019/08/25' of package xfp,
but only version `2018-09-24 L3 Floating point unit' is available.
当我设置时 \usepackage{xfp}[2018/09/24]
,我收到相同的错误(并且没有警告)。
在任何情况下(带或不带方括号中的日期),我都会在日志文件中看到以下几行:
Package: expl3 2018-09-24 L3 programming layer (code)
Package: xparse 2018-09-24 L3 Experimental document command parser
Package: xfp 2018-09-24 L3 Floating point unit
我通过公司服务器远程使用 Texworks,因此无法访问包管理器或其他任何东西。也不能使用 texdoc。有没有办法从 Texworks 内部强制更新包?(可能不行……)
答案1
您确实应该更新您的 L3 软件包。但是,如果出于某种原因您不希望这样做,那么您可以从文档中复制更新的软件包中的相关代码,以便使用新代码。
梅威瑟:
\documentclass{article}
\usepackage{xfp}
\makeatletter
\ExplSyntaxOn
\long \def \__kernel_primitive:NN #1#2
{
\tex_global:D \tex_let:D #2 #1
}
\__kernel_primitive:NN \numexpr \tex_numexpr:D
\cs_new_eq:NN \int_value:w \tex_number:D
\cs_new_eq:NN \__fp_int_eval:w \tex_numexpr:D
\cs_new:Npn \__fp_parse_word_fact:N
{ \__fp_parse_unary_function:NNN \__fp_fact_o:w ? }
\int_const:Nn \c__fp_fact_max_arg_int { 3248 }
\cs_new:Npn \__fp_fact_o:w #1 \s__fp \__fp_chk:w #2#3#4; @
{
\if_case:w #2 \exp_stop_f:
\__fp_case_return_o:Nw \c_one_fp
\or:
\or:
\if_meaning:w 0 #3
\exp_after:wN \__fp_case_return_same_o:w
\fi:
\or:
\__fp_case_return_same_o:w
\fi:
\if_meaning:w 2 #3
\__fp_case_use:nw { \__fp_invalid_operation_o:fw { fact } }
\fi:
\__fp_fact_pos_o:w
\s__fp \__fp_chk:w #2 #3 #4 ;
}
\cs_new:Npn \__fp_fact_pos_o:w #1;
{
\__fp_small_int:wTF #1;
{ \__fp_fact_int_o:n }
{ \__fp_invalid_operation_o:fw { fact } #1; }
}
\cs_new:Npn \__fp_fact_int_o:n #1
{
\if_int_compare:w #1 > \c__fp_fact_max_arg_int
\__fp_case_return:nw
{
\exp_after:wN \exp_after:wN \exp_after:wN \__fp_overflow:w
\exp_after:wN \c_inf_fp
}
\fi:
\exp_after:wN \__fp_sanitize:Nw
\exp_after:wN 0
\int_value:w \tex_numexpr:D
\__fp_fact_loop_o:w #1 . 4 , { 1 } { } { } { } { } { } ;
}
\cs_new:Npn \__fp_fact_loop_o:w #1 . #2 ;
{
\if_int_compare:w #1 < 12 \exp_stop_f:
\__fp_fact_small_o:w #1
\fi:
\exp_after:wN \__fp_ep_mul:wwwwn
\exp_after:wN 4 \exp_after:wN ,
\exp_after:wN { \int_value:w \__fp_int_eval:w #1 * (#1 - 1) }
{ } { } { } { } { } ;
#2 ;
{
\exp_after:wN \__fp_fact_loop_o:w
\int_value:w \__fp_int_eval:w #1 - 2 .
}
}
\cs_new:Npn \__fp_fact_small_o:w #1 \fi: #2 ; #3 ; #4
{
\fi:
\exp_after:wN \__fp_ep_mul:wwwwn
\exp_after:wN 4 \exp_after:wN ,
\exp_after:wN
{
\int_value:w
\if_case:w #1 \exp_stop_f:
1 \or: 1 \or: 2 \or: 6 \or: 24 \or: 120 \or: 720 \or: 5040
\or: 40320 \or: 362880 \or: 3628800 \or: 39916800
\fi:
} { } { } { } { } { } ;
#3 ;
\__fp_ep_to_float_o:wwN 0
}
\ExplSyntaxOff
\makeatother
\begin{document}
\fpeval{fact(4)}
\end{document}
请注意,这可能会在某个时候中断,我测试了几种情况,但可能存在我没有复制的代码,这些代码被调用用于我未测试的其他情况。因此,如果可以,请更新。