我正在使用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 年的情况。