如何在 siunitx 中执行算术运算?

如何在 siunitx 中执行算术运算?

我经常在文档中添加注释来提醒我数字的来源:

\SI{39.68}{\milli\metre} deep % 0.31 * 128

我希望 LaTeX 能够自行计算乘积。我编写了一个函数来执行此操作fp,并且它可以工作(尽管我希望它更短一些)。但它在 中不起作用\SI

\newcommand{\mult}[2]{%
    \FPmul{\tempSum}{#1}{#2}%
    \FPround\roundedSum\tempSum2%
    \roundedSum%
}

\mult{0.31}{128} mm deep % works

\SI{\mult{0.31}{128}}{\milli\metre} deep % does not work

如何解决这个问题?

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! siunitx error: "invalid-number"
! 
! Invalid numerical input '\edef {\FP@mul \tempSum 0.31..\relax 128..\relax
! }\edef {\FP@round \roundedSum ..\relax }{2}'.
! 
! See the siunitx documentation for further information.
! 
! For immediate help type H <return>.
!...............................................

答案1

siunitx使用一些选项解析数字输入。但是,数字输入在操作之前不会扩展。要在第一个强制参数中使用标记,您可以使用选项parse-numbers=false

如果您定义了 的可扩展版本,\mult则可以将其用作 的有效输入\SI。在下面的示例中,这是由\DeclareExpandableDocumentCommand提供的xparse

\documentclass{article}
\usepackage{siunitx}
\usepackage{xparse} 
\ExplSyntaxOn
\DeclareExpandableDocumentCommand \mult {  m m  }
 {
  \fp_eval:n { round( #1 * #2  ,2 ) }
 }
\ExplSyntaxOff
\begin{document}
\mult{0.31}{128}

\SI[parse-numbers=false]{\mult{0.31}{128}}{\milli\metre} deep

\SI{\mult{0.31}{128}}{\milli\metre} 
\end{document} 

在此处输入图片描述


使用模块,l3fp您可以非常轻松地定义算术函数。在上面的示例中,我使用了您的定义和两个强制参数。但是,您也可以使用:

\NewDocumentCommand \Func { O{2} m   }
 {
  \fp_eval:n { round( #2   , #1 ) }
 }

现在\Func有两个参数,第一个是可选的,指定舍入。第二个传递给fp_eval

\Func{0.38*4}

相关内容