我使用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}