\foo
我有一个对其参数执行算术运算的宏:
\documentclass{article}
\newcommand{\foo}[1]{
\newcount\tmpR
\tmpR=#1
\advance\tmpR by -1
R{\number\tmpR}
}
\begin{document}
\foo{10}
\begin{figure*}
\caption{\foo{99}}
\end{figure*}
\end{document}
编译时没有错误。但是,如果我注释掉对的第一次调用\foo{10}
,我会从标题中的宏调用中收到以下错误:
$ pdflatex mwe.tex
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/W32TeX)
restricted \write18 enabled.
entering extended mode
(./mwe.tex
LaTeX2e <2011/06/27>
Babel <3.9g> and hyphenation patterns for 78 languages loaded.
(c:/texlive/2013/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(c:/texlive/2013/texmf-dist/tex/latex/base/size10.clo)) (./mwe.aux)
! Undefined control sequence.
<argument> \tmpR
l.15 \caption{\foo{99}}
此错误的原因是什么?我该如何修复?有没有更好的方法来编写此宏?
答案1
\tmpR
当前,每次调用 时都会创建计数器\foo
。创建一次即可外部的定义\foo
。此外,您必须记住,中的条目\caption
构成移动参数的一部分,因为它被写入.aux
并且可能最终出现在 LoF 中。因此,您要么需要\protect
它(这会阻止完全扩展),要么使用 将其声明为强大的命令\DeclareRobustCommand
。这是对您的 MWE 的看法
\documentclass{article}
\newcounter{tmpR}
\DeclareRobustCommand{\foo}[1]{%
\setcounter{tmpR}{#1}% Set counter
\addtocounter{tmpR}{-1}% Subtract from counter
R\thetmpR% Print counter
}
\begin{document}
\foo{10}
\begin{figure*}
\caption{\foo{99}}
\end{figure*}
\end{document}
\foo
这里有一个不使用计数器就能达到相同效果的定义:
\DeclareRobustCommand{\foo}[1]{%
R\number\numexpr#1-1\relax% Print R<counter-1>
}