使用 titlesec 的部分标签存在问题

使用 titlesec 的部分标签存在问题

我使用titlesec来定义标题的布局。它正常工作,但是当我使用包来定义 的布局时遇到了问题\part
当我尝试引用用\part定义的时titlesec,使用\nameref会得到错误的标题。

有人知道解决这个问题的方法吗?或者我做错了什么?我举了这个例子来说明我在说什么:

\documentclass{report}
\usepackage{titlesec}
\usepackage{hyperref}

% If you uncomment the following 5 lines the nameref in line 16 will refer to "Chapter title 2" instead of "Part title 2"
%\titleformat{\part}[display]
%   {\Huge\filcenter}
%   {\partname{} \thepart}
%   {0em}
%   {\hrule}

\begin{document}

\part{Part title 1}
\chapter{Chapter title 1}
Hello have a look at \autoref{part:part_2} \nameref{part:part_2}
\chapter{Chapter title 2}

\part{Part title 2}\newpage
\label{part:part_2}
\chapter{Chapter title 3}

\end{document}

期待听到您的意见。

答案1

由于某种原因,在使用 重新定义部分时,保存部分名称的内部命令\@currentlabelname不会更新titlesec。解决此问题的一种方法是重新定义命令\part以强制进行此更新。由于\part语法有点复杂(它具有星号形式并且可以接受可选参数),代码有点冗长,以便考虑所有情况:

\makeatletter
\let\titlesec@part\part
\renewcommand{\part}{\@ifstar\part@star\part@nostar}
\def\part@star#1{\NR@gettitle{#1}\titlesec@part*{#1}}
\def\part@nostar{\@ifnextchar[\part@nostar@opt\part@nostar@nopt}
\def\part@nostar@nopt#1{\NR@gettitle{#1}\titlesec@part{#1}}
\def\part@nostar@opt[#1]#2{\NR@gettitle{#2}\titlesec@part[#1]{#2}}
\makeatother

此代码必须位于\titleformat{\part}命令之后,如以下完整示例所示:

\documentclass{report}
\usepackage{titlesec}
\usepackage{hyperref}

\titleformat{\part}[display]
   {\Huge\filcenter}
   {\partname{} \thepart}
   {0em}
   {\hrule}
\makeatletter
\let\titlesec@part\part
\renewcommand{\part}{\@ifstar\part@star\part@nostar}
\def\part@star#1{\NR@gettitle{#1}\titlesec@part*{#1}}
\def\part@nostar{\@ifnextchar[\part@nostar@opt\part@nostar@nopt}
\def\part@nostar@nopt#1{\NR@gettitle{#1}\titlesec@part{#1}}
\def\part@nostar@opt[#1]#2{\NR@gettitle{#2}\titlesec@part[#1]{#2}}
\makeatother

\begin{document}

\part{Part title 1}
\chapter{Chapter title 1}
Hello have a look at \autoref{part:part_2} \nameref{part:part_2}
\chapter{Chapter title 2}

\part{Part title 2}\label{part:part_2}
\chapter{Chapter title 3}

Other tests:

\part*{Part title 3}\label{part:part_3}

\part[Short part title 4]{Part title 4}\label{part:part_4}

\nameref{part:part_3}, \nameref{part:part_4}

\end{document}

相关内容