\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
。或者至少有更好的文档记录。