通过去掉或消耗";-";来简单实现abs函数;?
我希望构建一个(简单的)abs实现。我尝试了\fabs,但小数点后有很多零。我可以用FP round函数去掉它们,但是我不知道小数位数。我认为字符串操作方法更好。我可
解答动态
您可以使用xfp(这个包非常短,它只包含两个定义来创建围绕\fp的包装器)_评估:n和\内景_评估:n):
\documentclass{article}\usepackage{xfp}\begin{document}\fpeval{abs(-12.3)}\end{document}
它是可扩展的,这意味着您可以将它输入\num进行格式化。这里我把句点改成a命令:
\documentclass{article}\usepackage{xfp,siunitx}\sisetup{locale=DE}\begin{document}\num{\fpeval{abs(-12.3)}\end{document}
我确信您很快就能得到一个最新的x3解决方案,而且我真的不认为基于字符串的解决方案是您在这里能做的最好的,但是当您在这里等待的时候是一个问题简单的、基于参数的解决方案。
该解决方案是不可扩展的,这可能有点破坏交易,具体取决于您想做什么(但是:请参见下文)。
主要思想是使用分隔参数(TeX如何查找分隔参数?)从字符串中去掉字符。为了不在这里遇到麻烦,我们首先检查字符是否实际存在。
\ifstrstartswith通过定义一个helper宏来工作\fstr@ifstrstartswith@i如果我们现在将字符串传递给\fstr@ifstrstartswith@i以gt;,TeX的参数解析规则使#1变为空。为了避免错误,我们总是打电话\fstr@ifstrstartswith@i与\fstr@ifstrstartswith@igt;gt;lt;stringlt;字符,我们仍然使用正确的参数签名调用宏。
字符剥离现在的工作方式类似。我们检查gt;是否以要删除的lt;characters to removeamp; 调用为时,从gt;的开头剥离lt;字符串amp;.
\documentclass[british]{article}\usepackage[T1]{fontenc}\usepackage{babel}\usepackage{etoolbox}\makeatletter%{gt;}{gt;}\newrobustcmd*{\ifstrstartswith}[2]{%\def\fstr@ifstrstartswith@i##1#1##2amp;}%{gt;}{gt;}\newrobustcmd*{\stripfromstart}[2]{%\def\fstr@stripfromstart@i#1##如果strStartsWith{1}{2},则为1amp;}{2}}\makeatother\newcommand*{\mybs}{\stripfromstart{-}\begin{document}\mybs{4.5}\mybs{-4.5}\end{document}
当然你不想尝试\mybs{-4.5-5}或\mybs{-4.5+5}.
edit想想看,如果我们硬编码-,我们可以使它可扩展。不过,字符串操作并不是解决这个问题的最佳方法。
\documentclass[british]{article}\usepackage[T1]{fontenc}\usepackage{babel}\usepackage{etoolbox}\makeatletter\newcommand*{\fstr@ifstrstartswithminus@i}{}%仅保留名称\def\fstr@ifstrstartswithminus@i#1-#2和;{\ifblank{{1}}\newcommand*{\ifstrstartswithminus}[1]{%\fstr@ifstrstartswithminus@i#1-amp;{1}\newcommand*{\stripmusinusfromstart}[1]{%\ifstrstartswithminus{1}{\fstr@stripmusinusfromstart@i#1lt;\z@\@firstoftwo\fi#1}\makeatother 例如
\gobbleminus 12.3%扩展到12.3\gobbleminus-12.3%扩展到12.3\gobbleminus-0.1000%扩展到0.1000 如果您的数据是通过扩展某个对象生成的,那么您当然需要确保它在另一个问题是
\gobbleminus.123%会引发错误 。不是减号或数字。尽管我觉得有人可以让它也容忍这种情况,但通过将定义改为to
\makeatletter\def\gobbleminus#1{\ifdim#17pt<;\z@\@firstoftwo\fi#1}\makeatother,您可以用这个定义\gobbleminus方式:
\def\gobbleminus#1{\ifx-#1\else#1\fi}%测试:\gobbleminus-12\gobbleminus 1234\gobbleminus.24- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。