我有一个文档,其中包含几个命令,这些命令将数字变量存储在一个额外的宏中。这个额外的宏将突出显示该文本,以便我可以在打印的文档中跟踪它们。如下所示:
\newcommand{\ScriptValue}[1]{\colorbox[gray]{0.8}{#1}}
\newcommand{\HTwoA}{\ScriptValue{10.3}}
\newcommand{\HTwoB}{\ScriptValue{11.3}}
\newcommand{\HTwoC}{\ScriptValue{10.7}}
我在文本中大量使用了它们,并使用fp
和intcalc
包来计算新值。这些新计算的值应继续用自动突出显示\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
。我尝试了let
s、expandafter
s、defs
s、csedef
s 等多种不同的方法,但仍然没有得到可靠的结果。
如何才能正确完成这项工作?我希望这项工作“隐形”地进行。关键是让与我一起处理文档的其他人不必担心。当他们从和\ScriptValue
调用函数时,事情就像他们“只是”处理数字变量一样工作。fp
intcalc
值得一提的是,我已经在使用etoolbox
if 来简化问题。
答案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
包支持更多的功能。