在 \caption 中使用 \newcount 宏时出现问题

在 \caption 中使用 \newcount 宏时出现问题

\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>
}

相关内容