我经常在文档中添加注释来提醒我数字的来源:
\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}