fp 包的重载函数

fp 包的重载函数

我有一个文档,其中包含几个命令,这些命令将数字变量存储在一个额外的宏中。这个额外的宏将突出显示该文本,以便我可以在打印的文档中跟踪它们。如下所示:

\newcommand{\ScriptValue}[1]{\colorbox[gray]{0.8}{#1}}

\newcommand{\HTwoA}{\ScriptValue{10.3}}
\newcommand{\HTwoB}{\ScriptValue{11.3}}
\newcommand{\HTwoC}{\ScriptValue{10.7}}

我在文本中大量使用了它们,并使用fpintcalc包来计算新值。这些新计算的值应继续用自动突出显示\ScriptValue

为了做到这一点,我将 fp 包中的命令更新为\ScriptValue本地设置为空宏的版本。这在很大程度上是基于这里的答案也. 像这样:

\documentclass[article,draft]{memoir}

\usepackage{color}
\usepackage{fp}

\newcommand{\ScriptValue}[1]{\colorbox[gray]{0.8}{#1}}
\let\RealScriptValue\ScriptValue

\newcommand{\HTwoA}{\ScriptValue{10.3}}
\newcommand{\HTwoB}{\ScriptValue{11.3}}
\newcommand{\HTwoC}{\ScriptValue{10.7}}

\let\RealFPmin\FPmin
\renewcommand{\FPmin}[3]{%
  \renewcommand{\ScriptValue}[1]{##1}%
  \RealFPmin{\UnmarkedResult}{#2}{#3}%
  \renewcommand{\ScriptValue}{\RealScriptValue}%
  \FPset{#1}{\ScriptValue{\UnmarkedResult}}%
}

\FPmin{\HTwoAB}{\HTwoA}{\HTwoB}

\begin{document}
  Min of A and B is \HTwoAB{}
\end{document}

到目前为止,它运行良好。但是,当我想再次在重载宏中使用这些新计算的值时,我遇到了问题。例如,上面的重载\FPmin失败了:

\FPmin{\result}{\HTwoA}{\HTwoB}
\FPmin{\HMinAll}{\result}{\HTwoC}

这肯定是因为我搞乱了重载,因为如果\ScriptValue一开始就没有,一切都会正常工作。下面的代码可以完美运行:

\documentclass[article,draft]{memoir}

\usepackage{fp}

\newcommand{\HTwoA}{10.3}
\newcommand{\HTwoB}{11.3}
\newcommand{\HTwoC}{10.7}

\FPmin{\result}{\HTwoA}{\HTwoB}
\FPmin{\HMinAll}{\result}{\HTwoC}

\begin{document}
  Min of all is \HMinAll{}
\end{document}

我认为问题出在我调用的那一行\FPset。我尝试了lets、expandafters、defss、csedefs 等多种不同的方法,但仍然没有得到可靠的结果。

如何才能正确完成这项工作?我希望这项工作“隐形”地进行。关键是让与我一起处理文档的其他人不必担心。当他们从和\ScriptValue调用函数时,事情就像他们“只是”处理数字变量一样工作。fpintcalc

值得一提的是,我已经在使用etoolboxif 来简化问题。

答案1

您从未恢复定义(周围没有本地范围\renewcommand。这似乎可以做您想要的事情:

\documentclass[article,draft]{memoir}

\usepackage{color}
\usepackage{fp}

\newcommand{\ScriptValue}[1]{\colorbox[gray]{0.8}{#1}}
\let\RealScriptValue\ScriptValue

\newcommand{\HTwoA}{\ScriptValue{10.3}}
\newcommand{\HTwoB}{\ScriptValue{11.3}}
\newcommand{\HTwoC}{\ScriptValue{10.7}}

\let\RealFPmin\FPmin
\renewcommand{\FPmin}[3]{%
  \renewcommand{\ScriptValue}[1]{##1}%
  \RealFPmin{\UnmarkedResult}{#2}{#3}%
  \edef#1{\noexpand\ScriptValue{\UnmarkedResult}}%
  \let\ScriptValue\RealScriptValue
}

\FPmin{\HTwoAB}{\HTwoA}{\HTwoB}

\FPmin{\result}{\HTwoA}{\HTwoB}
\FPmin{\HMinAll}{\result}{\HTwoC}

\begin{document}
  Min of A and B is \HTwoAB{}

  Min of A and B is \HMinAll{}
\end{document}

答案2

这不是一个真正的答案,而是一个建议:您可能试图重载fp命令,因为它们很笨拙且难以管理。这是一个更好的界面。

\documentclass[article,draft]{memoir}

\usepackage{xcolor}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\printvalue}{m}
 {
  \colorbox[gray]{0.8}{ \fp_eval:n { #1 } }
 }
\ExplSyntaxOff

\newcommand{\HTwoA}{10.3}
\newcommand{\HTwoB}{11.3}
\newcommand{\HTwoC}{10.7}

\begin{document}
Min of A and B is \printvalue{ min(10.3,11.3) }

Max of A and C is \printvalue{ max(\HTwoA,\HTwoC) }
\end{document}

的浮点模块具有expl3非常自然的语法,并且比旧fp包支持更多的功能。

在此处输入图片描述

相关内容