如果使用 thmtools,pageref 会出现错误页面

如果使用 thmtools,pageref 会出现错误页面

我不知道以下问题是否与已提出的任何其他问题相关。我的问题和最低限度看起来非常简单。

\documentclass{book}

\usepackage{hyperref}
\usepackage{amsthm}
\usepackage{thmtools}
\declaretheorem{theorem}

\begin{document}

\ldots \\[18cm] \ldots

% Insert another \ldots here.... dots remain on previous page, page number for theorem is corrent
% \ldots

\begin{theorem}
\label{th:1}
\ldots
\end{theorem}

Page of theorem: \pageref{th:1}.

\end{document}

如您所见,\pageref引用了错误的页面(1 而不是 2)。如果包括注释\ldots,则引用是正确的。也许一些专业知识可以帮助我理解这里发生的事情。

提前致谢!

答案1

这不应该发生。然而它似乎发生了,这绝对是一个错误功能。

如何补救?不要在旁边输入标签\begin{theorem},而是在语句中的第一个单词后面输入。我知道这是一个糟糕的解决方法。

\documentclass{book}

\usepackage{amsthm}
\usepackage{thmtools}
\declaretheorem{theorem}
\usepackage{hyperref}

\begin{document}

\ldots \\[18cm] \ldots

\begin{theorem}
Text\label{th:1} of the theorem
\end{theorem}

Page of theorem: \pageref{th:1}.

\end{document}

在此处输入图片描述

答案2

情况(LaTeX 发生了什么)

当 LaTeX 决定分页符的最佳位置时,您对该页面的引用就会被设置。

LaTeX 通常会先读取下一页的大部分内容,然后再决定分页符应设在何处。但这意味着,在将扩展的文本/格式放到页面上之前,您认为属于下一页的标记会被读取和扩展。本质上,引用标记的读取时间早于分页符的设置时间。

此过程可产生最佳的分页效果,但有时页面引用效果不太好。

好消息是,这通常仅适用于pageref靠近页面顶部的情况(足够接近,以至于在将引用写入文件时会将其视为上一页aux)。要解决这个问题,您可以强制分页。

虽然这看起来不是最理想的,但当您的文档处于最后阶段并且您确定分页符将在何处发生时,您可以纠正它。

我有太多潜在的页面引用,无法手动修复

我必须考虑一下。但我认为有几种方法可以技巧LaTeX 可以更好地分配页面引用。

  1. 您可以提供一个环绕功能\label,检查页面上剩余的空间,并在页面结束前强制分页。我不建议仅仅为了使页码引用正确而这样做;这样做可能会破坏许多其他功能并抢占更优化的解决方案。
  2. 您可以分析 LaTeX 代码\label并做一些技巧,例如确定目录章节和部分的正确页码。这需要使用\noexpand\save。我不确定我是否能写出这样的东西。
  3. 更好地了解 TeX 和 LaTeX 如何做出页面决策。您需要让 LaTeX 在定理之前设置一个好的分页符。作为作者,您可以这样做。例如,在您上面概述的情况下,您可以在定理\vspace{\fill}\par\hspace*{\fill}前再添加一行。这足以欺骗 LaTeX 认为它已经接近分页符的良好点。显然,这不是您想在每个段落前做的事情。

我会选择方法 3。最初你可能不喜欢它。但是,如果你提供的 MWE 更接近于你认为 LaTeX 等待太长时间来决定分页符应该落在哪里的上下文,我(或其他人)可以指出如何更好地编写代码来解决这个问题。

尝试运行此版本的文档:

\documentclass{book}
\usepackage[showframe,textheight=550pt,textwidth=345pt]{geometry}
\usepackage{hyperref}
\usepackage{amsthm}
\usepackage{thmtools}
\declaretheorem{theorem}
\usepackage{lipsum}
\usepackage{blindtext}
\begin{document}

\Blindtext
\Blindtext
\Blindtext
\Blindtext
\Blindtext

\begin{theorem}
\label{th:1}
\ldots
\end{theorem}

Page of theorem: \pageref{th:1}.

\end{document}

这看起来并不完全像您的文档,但我已经设置了textwidthtextheight以匹配您正在做的事情。因此,关于如何以及何时进行分页的决定应该是相同的。请注意,在第 6 页上,页面底部留有一点空间。这就是您的罪魁祸首。LaTeX 看到这一点并决定页面上还有空间需要填充。直到它读完您的文档后,\label它才决定必须忍受那个空白。

您可能想要查看的本网站其他页面包括

  1. 避免在章节/小节标题后立即分页
  2. 我可以设置可调节的行距以避免出现孤行和寡行吗?

我确信@DavidCarlisle(以及其他人)看到这个时会提出比我更好的建议。

相关内容