使用 titletoc 时,目录中的 Hyperref 链接指向错误位置

使用 titletoc 时,目录中的 Hyperref 链接指向错误位置

我修改了目录中子部分的格式,使它们出现在一行中,而不是单独的行中。为此,我使用了 titletoc 包。以下是 MWE:

\documentclass{scrbook}

\usepackage{titletoc}
\titlecontents*{subsection}%
    [3.8em]%
    {\small\itshape}%
    {\hyperlink{subsection.\thecontentslabel}{\thecontentslabel}\ }%
    {}%
    {\ \thecontentspage}%
    [,\ ]%
    [.]%

\usepackage[colorlinks=true,linktoc=all]{hyperref}

\begin{document}

\tableofcontents 

\chapter{Chapter}
\section{Section}
\subsection{Subsection}
\subsection{Another Subsection}
\clearpage
\section{Another Section}
\end{document}

这非常简单,但是存在两个问题:

  1. 链接中不包含子部分标签。此问题已在 MWE 中通过以下问题的答案进行了修复:全局目录、LOF、LOT 和 titletoc 部分目录的通用样式(带有 hyperref 和标题)
  2. 修改后的子节后面的节的链接指向错误的位置。在 MWE 中,“1.2 另一节”的链接指向“1.1.1 子节”。

我没有找到第二个问题的解决方案。我尝试过\phantomsection但没有任何成功。我读过这里titletoc 与 hyperref 存在一些不兼容性,并尝试使用 tocloft 包实现相同的行为。我设法得到了类似的结果,但不太正确。如果链接正常工作,tocloft 方法似乎更方便。

附注:我想要应用此功能的文档相当大,并且使用经典论文风格

我将非常感激针对此问题的任何提示或解决方案。

答案1

这似乎是一种变通方法(或破解方法;-)),但titletoc由于某些我至今尚未弄清楚的原因,它搞乱了各个部分的超链接。

我重新定义了\section命令,以便在部分开始后立即手动设置超链接和虚拟超目标。它适用于\section{}\section[]{}命令,但不适用于\section*{},但这不会向写入任何条目TOC,因此这是您可以忍受的(???)。

我还使用了\usepackage{classicthesis},它似乎在之前titletoc,否则不使用 toc 样式。

\documentclass{scrbook}

\usepackage[colorlinks=true,linktoc=all]{hyperref} % Normally last!!!
\usepackage{classicthesis}

\usepackage{titletoc}


\titlecontents*{subsection}%
    [3.8em]%
    {\small\itshape}%
    {\phantomsection\hyperlink{subsection::\arabic{chapter}.\arabic{section}.\arabic{subsection}}{\thecontentslabel}\ }%
    {}%
    {\ \thecontentspage}%
    [,\ ]%
    [.]%




\let\LaTeXStandardSection\section%

\makeatletter
\newcommand{\section@noopt}[1]{%
\LaTeXStandardSection[\protect\hyperlink{section::\thesection}{#1}]{#1}%
\phantomsection%
\hypertarget{section::\thesection}{}% Empty target
}%

\newcommand{\section@opt}[2][]{%
\LaTeXStandardSection[\protect\hyperlink{section::\thesection}{#1}]{#2}%
\phantomsection%
\hypertarget{section::\thesection}{}% Empty target
}%


\renewcommand{\section}{%
\@ifnextchar[{\section@opt}{\section@noopt}%
}%
\makeatother    

\begin{document}



\tableofcontents 

\chapter{First}

\chapter{Chapter}
\section{Section}
\newpage
\subsection{Subsection}
\subsection{Another Subsection}
\clearpage
\section{Another Section}%
\clearpage
\section[Yet Another Section]{Yet another section with a different short title}
\subsection{Yet another subsection}
\subsection{Yet another another subsection}%
\chapter{Next chapter}
\section[Yet Another Section]{Yet another section with a different short title}
\subsection{Yet another subsection}
\subsection{Yet another another subsection}%

\end{document}

答案2

问题似乎是 titletoc v1.6 与当前版本的 hyperref v6.83m 发生冲突。降级到 hyperref v6.82q 可以解决问题。但是,使用旧版本的 hyperref 可能会产生其他问题。

答案3

此问题已在 titletoc 2.11 版中修复;请参阅更新日志 https://github.com/jbezos/titlesec

当我切换到此版本的titletoc时,它为我解决了这个问题。

相关内容