使用小代码后因未对文档最后一页进行编号而出错

使用小代码后因未对文档最后一页进行编号而出错

我正在使用exam文档类为我的学生创建一些测试。通常在每个测试中,最后一页都是学生的笔记,所以我不想将这一页包含在总测试页数中。为此,我在序言中包含了这段代码,只是为了不给最后一页编号:

\makeatletter
\def\numpages{\@ifundefined{exam@lastpage}  
  {\mbox{\normalfont\bf ??}}  
  \the\numexpr\exam@lastpage-1\relax}  
\makeatother

虽然它确实有效,但当我编译整个代码时首次我收到以下错误:

您不能\numexpr' in restricted horizontal mode. ^^I\part { Undefined control sequence. ^^I\part { You can't use在受限水平模式下使用 \numexpr'。\end{document} 未定义的控制序列。\end{document}

当我再次编译时,错误消失,我收到一条Process exited normally消息,并且代码执行了它应该做的事情:最后一页没有编号。

还有一个细节:当我第一次编译代码时,如果没有上面的小代码,当然不会出现错误,如果我在第一次编译后粘贴它,错误就不会出现。pdflatex、lualatex 和 xelatex 中也会发生同样的情况。有没有办法避免这个错误?

我提供了一个最小(我所能做的最小)的例子:

\documentclass[12pt]{exam}  
\usepackage{calc}  
\usepackage[a4paper, total={180mm,247mm},left=15mm,top=20mm]{geometry}  
\usepackage{fontenc}  
\pagestyle{headandfoot}  
\firstpageheader{}{}{}  
\runningheader{}{}{}  
\runningheadrule  
\lfoot{}  
\cfoot{}  
\rfoot{Page \thepage\ of \numpages}  
\setlength\dottedlinefillheight{9mm}  

\makeatletter  
\def\numpages{\@ifundefined{exam@lastpage}%  
    {\mbox{\normalfont\bf ??}}%  
    \the\numexpr\exam@lastpage-1\relax}%  
\makeatother  

\begin{document}  
    
    This is the fist page of the exam  
    
    \newpage  
    
    this is the second page of the exam  
    
    \newgeometry{body={185mm,257mm},centering}  
    
    \raggedright{\textbf{\underline{Student Notes:}}  
        
        \fillwithdottedlines{\stretch{2}}    
        
        \thispagestyle{empty}   
        
    \end{document}  

\newgeometry{body={185mm,257mm},centering}我注意到这也与我的代码中的命令,或者该命令与小代码的交互有关。

答案1

代码\numpages

\def\numpages{\@ifundefined{exam@lastpage}%
  {\mbox{\normalfont\bfseries ??}}%
  \exam@lastpage
}% numpages

由于\exam@lastpage是一个单一的标记,因此可以省略其周围的括号(尽管我认为这是不好的风格)。

解决方法如下:

\makeatletter  
\renewcommand\numpages{\@ifundefined{exam@lastpage}%
    {\mbox{\normalfont\bfseries ??}}%
    {\the\numexpr\exam@lastpage-1\relax}%
}
\makeatother  

避免\bf已被弃用约 30 年的情况。

相关内容