这里提出一个问题 如何在没有超链接的情况下获取倒数第二页的数字? 有一个答案,这个答案被接受了,而且当时一定起作用了:
\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}
请注意,此版本(与旧版本一样)假定页码为阿拉伯数字。如果您切换到罗马数字,它也会出错,对于这种情况,您必须定义一个新属性。