超链接打印正常但跳转到错误的目标

超链接打印正常但跳转到错误的目标

当我使用 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,但没有成功:

  1. 将声明替换\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}
    
  2. 我无法将 git diff 文件与TeXLive 2022 中aliascntr.dtx现有的版本进行匹配。aliascntr.dtx

  3. 除了#1中指出的更改之外,我还添加了\counterwithin3中的语句:

     \counterwithin{proposition}{chapter}
     \counterwithin{example}{chapter}
    

现在跳跃似乎是正确的!

考虑到本书及其源文件的规模和复杂性,我需要继续采样链接跳转以验证一切是否正常。

答案1

看看aux文件输出,我怀疑你遇到了相同(或至少非常相似)的错误我在之前的回答中诊断过

虽然补丁已经签入 Git 仓库,但发布已经不是已在 CTAN 上发布(当前版本发布日期为 2020 年 8 月)。如果我是你,我会尝试一些不同的事情:

  1. 首先尝试看看改变一切thmtools语法有助于。我不太相信这能解决你的问题。
  2. 如果你对处理软件包内部结构有信心:复制以下文件aliasctr.stythmtools到你的工作目录中,然后应用Git 提交中指出的更改修复了此错误
  3. 或者,如果您没有信心,我建议您尝试以下解决方法:
    • 步骤 1:将 的声明更改propositionthmtools语法。(这很重要,此解决方法取决于 的\declaretheorem工作方式,并且会因 而失败\newtheorem。)
    • proposition第 2 步:在声明和之后添加example以下两行(有关为什么这可能有效的解释,请参阅上面我的诊断的第一个链接)
    \counterwithin{proposition}{chapter}
    \counterwithin{example}{chapter}
    
  4. 或者:您也可以完全使用amsthm语法而不是重写所有内容thmtools。的语法amsthm当然比较笨重,但代码确实适用于cleveref。(我thmtools现在一般都避免使用。)

相关内容