我编写了一个 fp 宏来计算吉他琴颈上琴格之间的距离:
\def\ScaleLength{25.5}
\def\ScaleFactor{0.1}
\def\FretDist#1{\FPmul\resulta{-1}{#1}%
\FPdiv\resulta{\resulta}{12}%
\FPpow\resulta{2}{\resulta}%
\FPsub\resulta{1}{\resulta}%
\FPmul\resulta{25.5}{\resulta}
\FPmul\resulta{\resulta}{\ScaleFactor}
\resulta
}
并把类似的东西
\FretDist{3}
在乳胶中给出适当的浮点值。
当我尝试在类似这样的包中使用该值时
\put(3,\FretDist{3}){\circle{3}}
我收到错误“缺少数字,视为零”,但如果我这样做
\put(3,3){\circle{3}}
工作正常
答案1
您可以使用xfp
,它具有可扩展性,并允许更简洁的运算语法。小数位数与 提供的数字不同fp
,但对于大多数应用程序(包括此应用程序)来说,这应该无关紧要。
\documentclass{article}
\usepackage{pict2e}
\usepackage{fp} % for the old method
\usepackage{xfp} % for the new method
\newcommand\ScaleLength{25.5}
\newcommand\ScaleFactor{0.1}
\newcommand\FretDist[1]{\FPmul\resulta{-1}{#1}%
\FPdiv\resulta{\resulta}{12}%
\FPpow\resulta{2}{\resulta}%
\FPsub\resulta{1}{\resulta}%
\FPmul\resulta{\ScaleLength}{\resulta}
\FPmul\resulta{\resulta}{\ScaleFactor}
\resulta
}
\newcommand{\xFretDist}[1]{%
\fpeval{
\ScaleLength*\ScaleFactor*(1-exp(-(#1/12)*ln(2)))
}
}
\begin{document}
\FretDist{9}
\xFretDist{9}
\FretDist{3} % now \resulta contains the value
\xFretDist{3}
\bigskip
\fbox{\begin{picture}(10,10)
\put(3,\resulta){\circle{3}}
\end{picture}}
\fbox{\begin{picture}(10,10)
\put(3,\xFretDist{3}){\circle{3}}
\end{picture}}
\end{document}
如您所见,图片是相同的。
旧答案
您不能将其用作\FretDist{3}
参数\put
,因为此命令需要一个数字,而不是一整套指令来打印它。将的定义更改\FretDist
为如下
\def\FretDist#1{\FPmul\resulta{-1}{#1}%
\FPdiv\resulta{\resulta}{12}%
\FPpow\resulta{2}{\resulta}%
\FPsub\resulta{1}{\resulta}%
\FPmul\resulta{25.5}{\resulta}
\FPmul\resulta{\resulta}{\ScaleFactor}
}
这样,调用它之后,你就可以\resulta
使用数字了:
\FretDist{3} % store the number in \resulta
\put(3,\resulta){\circle{3}}
答案2
和functional
包中,棘手的参数扩展可以用直观的函数组合来代替,这与其他编程语言(如)类似Lua
。复合函数的求值是从内到外的。
\documentclass{article}
\usepackage{pict2e}
\usepackage{functional}
\def\ScaleLength{25.5}
\def\ScaleFactor{0.1}
\PrgNewFunction \FretDist {m} {%
\FpEval{(1-2^(((-1)*(#1))/12))*\ScaleLength*\ScaleFactor}%
}
\PrgNewFunction \FunPut {mmm} {\put(#1,#2){#3}}
\begin{document}
\FretDist{3}
\begin{picture}(40,30)
\put(3,0.405714141103028){\circle{3}}
\end{picture}
\begin{picture}(40,30)
\FunPut{3}{\FretDist{3}}{\circle{3}}
\end{picture}
\end{document}