这段代码有什么问题?

这段代码有什么问题?
\def\totalobjects@putlabel{%
 \addtocounter{totalpage}{\c@page}
 \immediate\write\@auxout{\string
   \newlabel{reftotaltables}{{}{\refstepcounter{totalpage}}{\relax }{}{}}}
}
\AtEndDocument{\totalobjects@putlabel}

或者我如何才能完成下一步工作:

\def\totalobjects@putlabel{%
 \addtocounter{totalpage}{\c@page}
 \refstepcounter{totalpage}\label{reftotalpages}
}
\AtEndDocument{\totalobjects@putlabel}

我正在使用 XeLaTeX。使用第二个代码片段后,标签不起作用(当我引用它时,我看到了“??”)。使用第一个代码片段后,我收到编译错误。

答案1

对文件的写入.aux发生在页面被发送出去时,除非\write前面有\immediate,就像在您的第一个代码中一样。

但是,第一个代码无法工作,因为除非 LaTeX 正在发送一页或刚刚发送了一页,否则页码是不可预测的:页码计数器在发送过程结束时进行步进。因此\immediate\write不能保证可靠地工作。

对于第二个代码,您使用\label,这反过来又依赖于写入文件.aux但没有\immediate,因此相应的\newlabel命令只能在下一次发货时写出。但是有输入代码后即可下次发货\AtEndDocument

您可以使用该atveryend包来解决这个问题;但是如果您所需要的只是在文件中写入一些内容.aux以获取某些计数器的最终值,那么该totcount包已经为您完成了。

\usepackage{totcount}
\regtotcounter{section}

在文档序言中,您可以\total{section}在任何需要打印文档中最高章节编号的地方键入内容。

要引用最后一页的页码,请执行以下操作

\usepackage{lastpage}

\pageref{LastPage}并在需要最后一页页码的地方使用。或者使用zref具有高度可扩展机制的。

相关内容