当前最佳实践与最后一页的交叉引用

当前最佳实践与最后一页的交叉引用

我正在/曾经使用pageslts,我知道它不应该与当前的 LaTeX 兼容。据我所知,没有其他替代方案提供相同的功能,但我至少想找到一种方法来获取对文档最后一页的引用。

无论是否hyperref加载以及是否fancyref使用cleveref,我都需要它能够工作。

我一直在尝试将标签放入或中enddocumentshipout/lastpage在这两者中,shipout/lastpage似乎效果更好一些,但我完全不相信我的方法。

还有\g_shipout_readonly_int/\ReadOnlyShipoutCounter\g_shipout_totalpages_int/,totalpages但是据我所知,如果hyperref加载了,则不会为我提供超链接目标。

新的 shipout 例程和钩子的文档解释了如何替换各种包,但我找不到有关lastpage或的任何具体内容pageslts

我不确定我使用的钩子是否正确。我不确定我是否应该使用钩子。我真的不确定我是否应该使用\phantomsection。我完全不确定使用pageslts是否更好,即使它并不真正兼容。(对于基本用法,它似乎仍然可以工作,然后它会找出将标签放在哪里。)

\documentclass{book}
\usepackage{kantlipsum}
\AddToHook{begindocument}{\ProvideDocumentCommand \phantomsection {}{}}
\usepackage{bookmark}
\usepackage{cleveref}
\AddToHook {enddocument} {\phantomsection\label{enddocument:lastpage}}
\AddToHook {shipout/lastpage} {\phantomsection\label{shipout-lastpage:lastpage}}
\begin{document}
\frontmatter
The last page of this document is \pageref{enddocument:lastpage}.

The last page of this document is \pageref{shipout-lastpage:lastpage}.

The last page of this document is \cpageref{endocument:lastpage,shipout-lastpage:lastpage}.

\mainmatter
\kant[1-10]

\backmatter
The last page of this document is \thepage.


\end{document}

现在推荐采用什么方法来实现这一点?

答案1

实际上没有必要设置锚点,因为 hyperref 会将锚点添加到所有页面:

\documentclass{book}
\usepackage{kantlipsum}
\usepackage{bookmark}
\usepackage{cleveref}
\makeatletter
\AddToHook {shipout/lastpage} {\gdef\@currentHref{\@currentHpage}\label{shipout-lastpage:lastpage}}
\makeatother
\begin{document}
\frontmatter

The last page of this document is \pageref{shipout-lastpage:lastpage}.

The last page of this document is \cpageref{shipout-lastpage:lastpage}.

\mainmatter
\kant[1-10]

\backmatter
The last page of this document is \thepage.
\end{document}

此接口需要当前版本的 LaTeX 和 hyperref。无需加载 hyperref,如果不存在\@currentHpage则为空。如果使用 加载 hyperref,则自然不会有锚点pageanchor=false,在这种情况下,您应该手动添加一个,例如使用 \MakeLinkTarget,请参阅 hyperref-linktarget.pdf。

您还可以使用属性标记和引用pageanchor,这自然需要新的引用命令:

\documentclass{book}
\usepackage{kantlipsum}
\usepackage{bookmark}
\AddToHook {shipout/lastpage} {\RecordProperties{shipout-lastpage:lastpage}{page,pagetarget}}

\begin{document}
\frontmatter

The last page of this document is \hyperlink{\RefProperty{shipout-lastpage:lastpage}{pagetarget}}{\RefProperty{shipout-lastpage:lastpage}{page}}.


\mainmatter
\kant[1-10]

\backmatter
The last page of this document is \thepage.
\end{document}

相关内容