使用以下 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}