我目前有命令\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
在写这个问题的时候,我做了一些挖掘,并得出了以下解决方案calculator
和ifthen
。
\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
才能不出错。另外:需要%
在括号后面加上和\%
以防止宏前后出现不必要的空格。