使用 titletoc/titlesec 时 hyperref 和 pdf 书签目标错误,但 toc 编号正确

使用 titletoc/titlesec 时 hyperref 和 pdf 书签目标错误,但 toc 编号正确

使用以下 mwe:

% vim: spell spelllang=en ft=tex
\documentclass[12pt,twoside,openright,english]{book}
\usepackage{hyperref}
\usepackage{lipsum}
\usepackage[explicit]{titlesec}
\usepackage{titletoc}

\renewcommand{\thechapter}{\Roman{chapter}}
\newcommand\periodafter[1]{#1.}

\titleformat{\chapter}[display]
  {\normalfont\large\filcenter}{\filcenter\MakeUppercase{\chaptertitlename\ \periodafter{\thechapter}}}{0pt}{\periodafter{\uppercase{#1}}}

\titleformat{\subsection}
  {\normalfont\small}{}{0em}{\hangindent=0.25in#1}

\titlecontents{chapter}
[0em]
{\filcenter\normalfont\scshape}
{\MakeUppercase{\chaptertitlename\ \thecontentslabel}\\\addvspace{5pt}\uppercase}
{\MakeUppercase{\thecontentslabel}\\\addvspace{5pt}\uppercase}
{}[\addvspace{5pt}]

\titlecontents{section}
[0em]
{\hangindent=0.25in\small}
{\contentslabel{0em}}
{\contentslabel{0em}}
{\titlerule*[1em]{.}\contentspage}[\addvspace{5pt}]

\titlecontents{subsection}
[0em]
{\hangindent=0.25in\small}
{}
{}
{\titlerule*[1em]{.}\contentspage}[\addvspace{5pt}]

\setcounter{secnumdepth}{0}
\hypersetup{
    bookmarksdepth=1
}

\begin{document}
    \tableofcontents
    \frontmatter
    \chapter{Foreword}
    \mainmatter
    \chapter{A}
    \subsection{\lipsum[1]}
    \chapter{B}
    \subsection{\lipsum[1]}
    \backmatter
    \chapter{C}
    \subsection{1}
    \lipsum[10]
    \newpage
    \subsection{2}
    \lipsum[10]
\end{document}

C.1 和 C.2 节展示,在目录中,正确的页码(分别为 5 和 6)。但是,单击红色框中的任一两个都带您进入第 5 页。

问题的答案和评论表明这是一个与版本有关的问题,并表示已在 titletoc 2.11 中修复;但是我的(撰写本文时刚刚更新和升级的)texlive 安装(使用 lualatex 1.17.0(TeX Live 2023))有 titletoc/titlesec 的 v2.14 版本和 hyperref 的 v7.00y 版本。

按原样使用已接受答案中的 MWE 似乎会产生同样的问题。

答案1

由于该小节没有编号,因此没有目标,正如文档中提到的,hyperref 不完全支持 titlesec(并且 hyperref 不会在这里改变,我们避免向 hyperref 添加更多补丁,titlesec 应该增加对目标的支持)。

您可以添加一个例如

\titleformat{\subsection}{\normalfont\small}{}{0em}{\hangindent=0.25in\MakeLinkTarget[subsection]{}#1}

相关内容