fp“缺失数字”宏的问题

fp“缺失数字”宏的问题

我编写了一个 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}

相关内容