\FPeval 在新命令中不起作用

\FPeval 在新命令中不起作用
\documentclass[10pt]{article}
\usepackage{calc}
\usepackage{fp}
\newcommand{\test}[1]{
\makeatletter
\setlength{\tempdimen}{\widthof{#1}}
\FPeval\‌​resultaP(70-\strip@pt\tempdimen)/2}
\makeatother}
\begin{document}
\test{5}
\end{document}

在文档中调用该命令时不起作用。但是,如果手动输入其内容,它似乎可以工作。有人能帮忙吗?

答案1

正如解释的那样Manuel 提出的问题,第一个问题是您不能\makeatletter ... \makeatother在宏的定义中使用。

\makeatletter
\newcommand{\test}[1]{
\setlength{\tempdimen}{\widthof{#1}}
\FPeval\‌​resultaP(70-\strip@pt\tempdimen)/2}
}
\makeatother

此外,\setlength如果不先创建长度,则无法获得长度。

\makeatletter
\newlength\tempdimen
\newcommand{\test}[1]{
  \setlength{\tempdimen}{\widthof{#1}}
  \FPeval\‌​resultaP(70-\strip@pt\tempdimen)/2}
}
\makeatother

如果我们正在处理您的代码,我们还需要消除奇怪的不可见字符。

\makeatletter
\newlength\tempdimen
\newcommand{\test}[1]{
  \setlength{\tempdimen}{\widthof{#1}}
  \FPeval\resultaP{(70-\strip@pt\tempdimen)/2}
  \FPprint‌\resultaP
}
\makeatother

然后它就可以正常工作了。(\FPprint\resultaP为了演示目的而添加。)

但是,此代码不一定能给出您想要的结果。例如,

Here is an example: \test{5}.

Here is another: \test{5}--\test{7809}.

生产

虚假空间

因为宏的定义告诉 TeX 在各个点插入空格 - 事实上,相当多的点。

为了避免这种情况,我们需要

\newcommand{\test}[1]{%
  \setlength{\tempdimen}{\widthof{#1}}%
  \FPeval\resultaP{(70-\strip@pt\tempdimen)/2}%
  \FPprint‌\resultaP
}

得到预期结果

预期结果

\documentclass[10pt]{article}
\usepackage{calc}
\usepackage{fp}
\makeatletter
\newlength\tempdimen
\newcommand{\test}[1]{%
  \setlength{\tempdimen}{\widthof{#1}}%
  \FPeval\resultaP{(70-\strip@pt\tempdimen)/2}%
  \FPprint‌\resultaP
}
\makeatother
\begin{document}
Here is an example: \test{5}.

Here is another: \test{5}--\test{7809}.
\end{document}

作为Heiko Oberdiek 指出,至少对于最小示例来说,\widthof不是必需的,也不calc需要使用。(事实上,我从未听说过\widthof,并且一直使用,\settowidth所以最初对其进行了测试。)

\documentclass[10pt]{article}
\usepackage{fp}
\makeatletter
\newlength\tempdimen
\newcommand{\test}[1]{%
  \settowidth\tempdimen{#1}%
  \FPeval\resultaP{(70-\strip@pt\tempdimen)/2}%
  \FPprint‌\resultaP
}
\makeatother
\begin{document}
Here is an example: \test{5}.

Here is another: \test{5}--\test{7809}.
\end{document}

我认为现在有比现在更容易使用的软件包fp。或者至少有更好的文档记录。

相关内容