我正在尝试定义一个返回计算长度的宏,但是使参数可选会破坏宏(错误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