我正在尝试使用功能用于进行计算的包(\fpAdd
),然后使用希尼奇包来格式化结果(\num
)。
这是一个很小的例子。
\documentclass{article}
\usepackage{siunitx}
\usepackage{functional}
\IgnoreSpacesOn
\fpNew \Total
\fpAdd \Total {5.5}
\IgnoreSpacesOff
\begin{document}
My number: \fpUse \Total. % This works.
%My number: \num{\fpUse \Total}. % This does not work.
\end{document}
取消注释最后一行会出现以下错误。
! Package siunitx Error: Invalid number '\fpUse \s__fp \__fp_chk:w
(siunitx) 10{1}{5500}{0000}{0000}{0000};'.
有人知道如何正确地做到这一点吗?
感谢您的帮助。
答案1
由于它们违反了 TeX 语言,试图将其变成不同的东西,因此其中的命令functional
不可扩展。
宏扩展是“由外向内”的,而functional
想要实现相反的策略,就必须避免宏扩展。不是判断,只是描述。
但是,\num
想要完全扩展其主要参数以便有一个明确的数字来操作,functional
命令就无法起作用。
如果您只需要操作浮点变量,请定义自己的等效变量:
\documentclass{article}
\usepackage{siunitx}
\ExplSyntaxOn
\NewDocumentCommand{\newfp}{mo}
{
\fp_new:c { l_francesco_var_#1_fp }
\IfValueT { #2 }
{
\fp_set:cn { l_francesco_var_#1_fp } { #2 }
}
}
\NewDocumentCommand{\setfp}{mm}
{
\fp_set:cn { l_francesco_var_#1_fp } { #2 }
}
\NewDocumentCommand{\addfp}{mm}
{
\fp_add:cn { l_francesco_var_#1_fp } { #2 }
}
\NewExpandableDocumentCommand{\usefp}{m}
{
\fp_use:c { l_francesco_var_#1_fp }
}
\ExplSyntaxOff
\newfp{Total}[5.5]
\newfp{Weird}
\setfp{Weird}{pi^2-exp(3)}
\begin{document}
My number: \usefp{Total}.
My number: \num[output-decimal-marker={,}]{\usefp{Total}}.
My number: \num{\usefp{Weird}}.
\end{document}
注意其优点\fpNew\Total
:您不需要关心是否\Total
已定义,因为\newfp{Total}
定义的控制序列不太可能已用于其他目的。
您也不必担心空格:比较
\fpUse\Total\ is a nice number
\usefp{Total} is a nice number