带有可选参数的宏返回计算的长度

带有可选参数的宏返回计算的长度

我正在尝试定义一个返回计算长度的宏,但是使参数可选会破坏宏(错误Missing number, treated as zero.):

\documentclass{article}

\usepackage{xfp}
\usepackage{numprint}

\newcommand{\testa}[1]{\fpeval{#1*0.03}\linewidth}
\newcommand{\testb}[1][1]{\fpeval{#1*0.03}\linewidth}

\begin{document}

\lenprint[pt]{\testa{1}}% prints 10,34958 pt

\lenprint[pt]{\testa{2}}% prints 20,69915 pt

\lenprint[pt]{\testb}% gives ERROR and prints 0.030 pt

\lenprint[pt]{\testb[2]}% gives ERROR and prints 0.060 pt

\end{document}

你能帮助理解为什么吗?

有没有办法让参数成为可选的而不破坏工作宏?

NB:上面的 MWE 使用了\lenprint,但我要求一个一般性的工作解决方案,或者至少可以使用\addtolength,因为我的现实世界需要是使用宏作为的参数\addtolength

答案1

你可以定义\testb为可扩展的宏。例如:

\long\def\testb#1{\ifx[#1\afterfi{\testbA[}\else\afterfi{\testbA[1]#1}\fi}
\def\testbA[#1]{\fpeval{#1*0.03}\linewidth}
\long\def\afterfi#1#2\fi{\fi#1}

它并非在所有情况下都有效,但您的情况有效:

\lenprint[pt]{\testb}% works

\lenprint[pt]{\testb[2]}% works

相关内容