包 lastpage 和 refcount 和 hyperref 缺少数字,视为零。 \begingroup

包 lastpage 和 refcount 和 hyperref 缺少数字,视为零。 \begingroup

这里提出一个问题 如何在没有超链接的情况下获取倒数第二页的数字? 有一个答案,这个答案被接受了,而且当时一定起作用了:

\documentclass[a5paper]{article}
\usepackage{lastpage}
\usepackage{hyperref}
\usepackage{refcount}
\usepackage{lipsum}

\newcommand*{\thesecondlastpage}{%
  \the\numexpr(\getrefbykeydefault{LastPage}{page}{0})-1\relax
}
\AtBeginDocument{\refused{LastPage}}

\begin{document}
The second last page is \thesecondlastpage.

\lipsum
\end{document}

但是,它不再起作用 - 第一次排版后,PDF 的第一行是“倒数第二页是 -1。” 但在第二次排版后,它出现错误“缺少数字,视为零。” \begingroup

我认为这要么是因为 2023-07-25 对 LastPage 包的更新,要么是因为 2023-07-09 对 hyperref 包的更新。

有人能建议需要对这个 MWE 进行哪些更改才能使其再次发挥作用吗?

答案1

仅在使用 lastpage 包的 2023-07-24 v2.0c 版本时才会出现此问题。更新至 lastpage 包的 2023-10-06 v2.0d 版本,一切即可正常运行。


除了以下答案之外大卫·卡莱尔(只需将其用于包含纯阿拉伯数字的简洁文档即可)乌尔丽克·菲舍尔

如果您使用不同的页码方案和一些“花哨”的方案(而不是简单的阿拉伯数字 1、2、3……),您可以使用:

\documentclass[a5paper]{article}
\pagenumbering{Roman}% Roman page numbering, for example
\usepackage{lastpage}
\usepackage{hyperref}
\usepackage{refcount}
\usepackage{lipsum}

\makeatletter
\def\thesecondlastpage{??}

\AddToHook{cmd/lastpage@putl@bel/after}{%
    \addtocounter{page}{-2}%
      \protected@iwrite\@auxout{}{\string\gdef\string\thesecondlastpage{%
        \string\begingroup\string\pdfstringdefDisableCommands{%
        \string\let\string\TextOrMath\string\@firstoftwo}%
        \thepage\string\endgroup}}%
      \addtocounter{page}{+2}%
}

\makeatother

\begin{document}
The second last page is \thesecondlastpage.

\lipsum

\pagenumbering{fnsymbol}% foot-note-symbol-page-numbering, for example
\lipsum
\end{document}

这只适用于最近的 TeX 格式和最近的 lastpage。我太累了,无法再包含最近性测试。

如果您对最后一页和倒数第二页使用不同的页码方案,那么只需\pagebreak\pagenumbering{在最后一页之前放置一个标签}并引用该标签(当然,或者在这里提出一个新问题)。

答案2

它需要运行两次,但第二次运行的结果为 2:

\documentclass[a5paper]{article}

\usepackage{lipsum}

\begin{document}

The second last page is \the\numexpr\PreviousTotalPages -1\relax

\lipsum
\end{document}

答案3

该错误是由于 lastpage 中的更改造成的。如果使用 hyperref,它会将 lastpage 标签像这样写入 aux 文件中:

\newlabel{LastPage}{{}{\begingroup\pdfstringdefDisableCommands{\let\TextOrMath\@firstoftwo}1\endgroup}{}{page.1}{}}

refcount 没有机会从中提取数字。作为替代方案,您可以使用 zref:

\documentclass[a5paper]{article}
\usepackage{zref-lastpage}
\usepackage{hyperref}
\usepackage{lipsum}

\makeatletter
\newcommand*{\thesecondlastpage}{%
  \inteval{\zref@extractdefault{LastPage}{page}{0}-1}}
\AtBeginDocument{\zref@refused{LastPage}}
\makeatother

\begin{document}
The second last page is \thesecondlastpage.

\lipsum
\end{document}

请注意,此版本(与旧版本一样)假定页码为阿拉伯数字。如果您切换到罗马数字,它也会出错,对于这种情况,您必须定义一个新属性。

相关内容