当我使用 pdflatex 处理一本书长度的文档时,在第 6 章中,同一章中几个指向类定理环境的独立链接在 pdf 输出中正确打印,但单击这些链接会将您带到不同章节中编号相同的项目!
具体来说,文本为“示例 6.9”的链接跳转到示例 1.9,文本为“命题 6.12”的链接跳转到“命题 6.12”。
错误跳转到的目标的标签肯定与预期目标的标签完全不同。
可能出了什么问题?
唉,到目前为止我还没法写出 MWE。序言被分成了十几个单独的文件。
为了帮助诊断,以下内容:
摘录自来源处,其中定义了相关标签并进行了交叉引用;
.aux 文件中的相应条目;以及
提取序言文件的部分,其中定义了类似定理的环境并设置了交叉引用(hyperref、cleveref、crossreftools 等)。
错误跳转#1 - 第 6 章中的源代码在 pdf 中正确打印为“示例 6.9”:
证明 \cref{ex:non-cr-quot-cr} 的商空间 $\mathbb{R} /!/ \mathbb{Q}$ 实际上不是豪斯多夫空间。
错误跳跃#1— 目标,同样在第 6 章中,如下(但链接跳转到 1.9):
Show that the quotient space $\mathbb{R} /\!/ \mathbb{Q}$
of \cref{ex:non-cr-quot-cr} is in fact not a Hausdorff space.
错误跳跃#1— 目标,同样在第 6 章中,如下(但链接跳转到 1.9):
\begin{example}
\label{ex:non-cr-quot-cr}
\index{line with two origins!separation properties@and separation properties}%
\index{line with two origins!quotient space@as quotient space}
The line with two origins ....
\end{example}
错误跳跃#1— .aux 提取:
\@@wrindexm@m{topology2}{Cartesian sum!completely regular space@and completely regular space|hyperpage}{589}
\@writefile{loe}{\contentsline {example}{\ifthmt@listswap \MakeUppercase {e}xample~6.9\else \numberline {6.9}\MakeUppercase {e}xample\fi }{590}{example.9}\protected@file@percent }
\newlabel{ex:non-cr-quot-cr}{{\M@TitleReference {6.9}{Completely regular spaces}}{590}{}{example.9}{}}
\newlabel{ex:non-cr-quot-cr@cref}{{[example][9][]6.9}{[1][590][]590}}
\@writefile{lla}{\contentsline {section}{\numberline {\crtrefnumber{ex:non-cr-quot-cr}}ex:non-cr-quot-cr}{590}{example.9}\protected@file@percent }
错误跳跃#2— 第 6 章中的来源在 pdf 中正确打印为“命题 6.12”:
Prove \cref{prop:closed-subspace-of-normal}: a closed subspace
of a normal space is itself normal.
错误跳跃#2— 目标,同样在第 6 章中,如下(但链接跳转到 2.12):
\begin{proposition}
\label{prop:closed-subspace-of-normal}
A closed subspace of a normal space is itself normal.
\end{proposition}
错误跳跃#2— .aux 提取:
\@@wrindexm@m{topology2}{subspace!normal space@of normal space|(hyperpage}{591}
\@writefile{loe}{\contentsline {proposition}{\numberline {6.12}Proposition}{591}{proposition.12}\protected@file@percent }
\newlabel{prop:closed-subspace-of-normal}{{\M@TitleReference {6.12}{Normal spaces}}{591}{}{proposition.12}{}}
\newlabel{prop:closed-subspace-of-normal@cref}{{[proposition][12][]6.12}{[1][591][]591}}
\@writefile{lla}{\contentsline {section}{\numberline {\crtrefnumber{prop:closed-subspace-of-normal}}prop:closed-subspace-of-normal}{591}{proposition.12}\protected@file@percent }
从序言中:
%% MATH & THEOREMS
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amsthm}
\RequirePackage{thmtools}
\swapnumbers % Invert numbers/labels
\newcommand{\thmlikefont}{\sffamily\bfseries}
\declaretheoremstyle[
headfont=\thmlikefont,
headpunct={\thmlikefont.},
postheadspace=0.5em,
notefont=\thmlikefont,
headformat=\NAME\NUMBER\let\thmt@space\@empty\NOTE,
bodyfont=\mdseries,
spaceabove=12pt,spacebelow=12pt,
hidealllines=true,
innerleftmargin=8pt,innerrightmargin=8pt,
postheadhook={%
\ifx\@empty\thmt@shortoptarg
\renewcommand\addcontentsline[3]{}
\fi}
]{thmstyle}
\theoremstyle{thmstyle}
\declaretheorem[name=Theorem,numberwithin=chapter]{theorem}
\newtheorem{proposition}[theorem]{Proposition}
\declaretheoremstyle[
headfont= \thmlikefont,
headpunct={\thmlikefont.},
postheadspace=0.5em,
notefont=\thmlikefont,
bodyfont=\normalfont,
spaceabove=12pt,spacebelow=12pt
]{defstyle}
\declaretheorem[
style=defstyle,
numberlike=theorem,
preheadhook=\renewcommand{\qedsymbol}{$\myDiamond$}\pushQED{\qed},
postfoothook=\popQED
]
{example}
%% CROSS-REFERENCING
\RequirePackage{xurl}
\usepackage{datetime2} % to satisfy the "\today" in \hypersetup
\DTMusemodule{english}{en-US}
\RequirePackage{hyperxmp} % to add metadata info into pdf
\usepackage{hyperref}
\hypersetup{
unicode,
pdfapart=2, pdfaconformance=u,
bookmarksnumbered,bookmarksopen=true,bookmarksopenlevel=3,
breaklinks=true,
colorlinks, citecolor=red, linkcolor=blue, urlcolor=blue,
linktocpage=true,linktoc=all,
pdftitle={Topology, Second Edition},
% ...(other entries re author, publication, etc.)...
pdfproducer=pdfTeX-1.40.23, %why needed ????????????
}
% Allow link to page with label -- patch by Martin Scharrer
% cf. https://tex.stackexchange.com/a/19416/9237
\let\orig@Hy@EveryPageAnchor\Hy@EveryPageAnchor
\def\Hy@EveryPageAnchor{%
\begingroup
\hypersetup{pdfview=Fit}%
\orig@Hy@EveryPageAnchor
\endgroup
}
% My commands to use that
% Usage: \crefpagetext{text-to-appar-in-link}{lbl} with usual \label{lbl} for target.
\newcommand{\crefpagetext}[2]{\hyperlink{page.\getpagerefnumber{#2}}{#1} on \cpageref{#2}}
\WithSuffix\newcommand\crefpagetext*[2]{\hyperlink{page.\getpagerefnumber{#2}}{#1}}
\AtBeginDocument{\addtocontents{toc}{\protect\hypersetup{hidelinks}}}
%% Allow ref to section n, not section m.n
% From "trickier version" by Christian Hupfer
% https://tex.stackexchange.com/a/383608/13492
\let\@xp\expandafter
%
% Stripping the dot from the 1.2 -like reference
\def\@@stripdot#1.#2\@nil{#2}
%
% Stripping the memoir stuff from the reference, i.e. \M@TitleReference {1.2}{FOO} and handing #1 (1.2) over to the \@@stripdot macro
\def\@stripdot\M@TitleReference #1#2\@nil{\@@stripdot#1\@nil}
%
%Macro, second level of expansion
\newcommand{\stripdot}[1]{%
\@xp\@stripdot#1\@nil
}
\newcommand{\crefsec}[1]{%
% Expand the argument first
\IfRefUndefinedExpandable{#1}{%
% Do nothing if #1 is not defined
}{%
\hyperlink{\getrefbykeydefault{#1}{anchor}{}}{\@xp\stripdot\@xp{\getrefnumber{#1}}}%
}%
}
\RequirePackage[nameinlink,noabbrev,capitalize]{cleveref}
\RequirePackage{crossreftools}
% Fix to crossreftools
% https://tex.stackexchange.com/a/512175/13492
\renewcommand{\@@crtextr@ct@ref}[2]{%
\expandafter\@@@crtextr@ct@ref\expandafter{\detokenize{#2}}{#1}%
}
\newcommand{\@@@crtextr@ct@ref}[2]{%
\expandafter\ifx\csname r@#1\endcsname\relax
\crt@refundefined%
\else
\expandafter\expandafter\csname crt@ref@splitter@#2\endcsname\csname r@#1\endcsname%
\fi
}
\crefname{proposition}{Proposition}{Propositions}
\Crefname{proposition}{Proposition}{Propositions}
\crefname{example}{Example}{Examples}
\Crefname{example}{Example}{Examples}
% Added 2020-03-17
% From https://tex.stackexchange.com/questions/1230/reference-name-of-description-list-item-in-latex
\def\namedlabel#1#2{\begingroup
#2%
\def\@currentlabel{#2}%
\phantomsection\label{#1}\endgroup
}
许多其他软件包都已加载,包括babel
,但我思考前面序言摘录中所示的是相关的。
添加了 2022-04-28 尝试修复的问题
我尝试了来自https://tex.stackexchange.com/a/642073/13492,但没有成功:
将声明替换
\newtheorem
为相应的声明thmtools
。因此我使用了以下内容,它确实不是消除错误跳跃:\declaretheorem[name=Theorem, style=thmstyle, numberwithin=chapter]{theorem} \declaretheorem[name=Proposition, style=thmstyle, numberlike=theorem]{proposition} \declaretheorem[name=Definition, style=defstyle, numberlike=theorem]{definition}
我无法将 git diff 文件与TeXLive 2022 中
aliascntr.dtx
现有的版本进行匹配。aliascntr.dtx
除了#1中指出的更改之外,我还添加了
\counterwithin
3中的语句:\counterwithin{proposition}{chapter} \counterwithin{example}{chapter}
现在跳跃似乎是正确的!
考虑到本书及其源文件的规模和复杂性,我需要继续采样链接跳转以验证一切是否正常。
答案1
看看aux
文件输出,我怀疑你遇到了相同(或至少非常相似)的错误我在之前的回答中诊断过。
虽然补丁已经签入 Git 仓库,但发布已经不是已在 CTAN 上发布(当前版本发布日期为 2020 年 8 月)。如果我是你,我会尝试一些不同的事情:
- 首先尝试看看改变一切
thmtools
语法有助于。我不太相信这能解决你的问题。 - 如果你对处理软件包内部结构有信心:复制以下文件
aliasctr.sty
:thmtools
到你的工作目录中,然后应用Git 提交中指出的更改修复了此错误。 - 或者,如果您没有信心,我建议您尝试以下解决方法:
- 步骤 1:将 的声明更改
proposition
为thmtools
语法。(这很重要,此解决方法取决于 的\declaretheorem
工作方式,并且会因 而失败\newtheorem
。) proposition
第 2 步:在声明和之后添加example
以下两行(有关为什么这可能有效的解释,请参阅上面我的诊断的第一个链接)
\counterwithin{proposition}{chapter} \counterwithin{example}{chapter}
- 步骤 1:将 的声明更改
- 或者:您也可以完全使用
amsthm
语法而不是重写所有内容thmtools
。的语法amsthm
当然比较笨重,但代码确实适用于cleveref
。(我thmtools
现在一般都避免使用。)