同时使用 functional 和 siunitx 包

同时使用 functional 和 siunitx 包

我正在尝试使用功能用于进行计算的包(\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

相关内容