在自己的宏内进行简单的浮点计算和比较

在自己的宏内进行简单的浮点计算和比较

我目前有命令\aeq{}可以轻松打印实验部分中化学反应中使用的当量。我使用四舍五入到小数点后一位的数字。

但是,在某些反应中,我需要小于 0.1 的数字,并且我希望执行\aeq{}以下操作:乘以 100 并打印结果,然后摩尔%

\documentclass{scrbook} 

\usepackage{chemmacros} % this loads xparse, which supplies \NewDocumentCommand{func}{argspec}{code}

\NewDocumentCommand{\aeq}{m}{#1~eq.} % equivalents

\begin{document}
\aeq{2.5} % prints 2.5~eq.

\aeq{0.03} % prints 0.03~eq., but I want to have it print 3~mol-%
\end{document}

答案1

您可以使用的浮点模块expl3(与一起加载xparse):

\documentclass{scrbook}

\usepackage{chemmacros} % this loads xparse, which supplies \NewDocumentCommand{func}{argspec}{code}

\ExplSyntaxOn

\NewDocumentCommand{\aeq}{m}
 {
  \fp_compare:nTF { #1 < 1 }
   {
    \fp_eval:n { #1 * 100 }\nobreakspace\textnormal{mol-\%}
   }
   {
    #1\nobreakspace eq\@.
   }
 }

\ExplSyntaxOff

\begin{document}

\aeq{2.5} % prints 2.5~eq.

\aeq{0.03} % prints 3~mol-%

\end{document}

在此处输入图片描述

答案2

这种化合物\def会起作用。

编辑以处理整数参数以及不确定数量的小数。

\documentclass{scrbook} 
\usepackage{chemmacros} % this loads xparse, which supplies \NewDocumentCommand{func}{argspec}{code}

\makeatletter
\newcommand\aeq[1]{\aeqaux#1\relax.\relax.\aeqauxend}
\def\aeqaux#1.#2#3.\aeqauxend{%
  \ifx\relax#2#1~eq.\else
    \expandafter\ifx\expandafter\relax\@firstoftwo#3#1.#2~eq.\else\aeqauxaux#3~mol-\%\fi%
  \fi%
}
\def\aeqauxaux#1#2.{#1\ifx#2\relax\else.#2\fi}
\makeatother

\begin{document}
\aeq{12}\par
\aeq{5}\par
\aeq{3.}\par
\aeq{2.5}\par
\aeq{0.3}\par
\aeq{0.03}\par
\aeq{0.003}\par
\aeq{0.0003}\par
\aeq{0.00023}
\end{document}

在此处输入图片描述

答案3

在写这个问题的时候,我做了一些挖掘,并得出了以下解决方案calculatorifthen

\documentclass{scrbook} 

\usepackage{xparse}
\usepackage{calculator}
\usepackage{ifthen}

\NewDocumentCommand{\aeq}{m}{%
    \ifthenelse{\lengthtest{#1pt > 0.1pt}}{#1~eq.}{%
        \MULTIPLY{#1}{100}{\myaeq} % multiply #1 by 100 and store into \myaeq
        \ROUND[0]{\myaeq}{\myaeq} % round \myaeq to 0 decimal places, because \multiply does weird calculations
        \myaeq~mol-\%% print result
    }%
} % equivalents

\begin{document}
\aeq{2.5} % prints 2.5~eq

\aeq{0.03} % prints 3~mol-\%

\aeq{0.9} % prints 0.9~eq

\aeq{0.1} % prints 10~mol-\%
\end{document}

这将给你

在此处输入图片描述

如您所见,所有大于 0.1 的数字都会打印为 ,后跟~eq.,而 0.1 及更小的数字会乘以 100,四舍五入到小数点后 0 位,并打印为~mol-%*

注意:您必须将测试作为\lengthtest因为\ifthenelse不适用于浮点值而\lengthtest您需要附加pt才能不出错。另外:需要%在括号后面加上和\%以防止宏前后出现不必要的空格。

相关内容