使用titlesec
宏包指定titleformat
时出现影响了\nameref
命令的引用行为,下面的例子说明了这一点。应该如何修复?
正常情况下,无论使用\section
还是\section*
命令均可正确\nameref
:
\documentclass{ctexart}
\usepackage{nameref}
\begin{document}
\section{第一章AAA}\label{sec:A}
我要引用section C: \nameref{sec:C}
\section*{第二章BBB}\label{sec:B}
我要引用section A: \nameref{sec:A}
\section{第三章CCC}\label{sec:C}
我要引用section B: \nameref{sec:B}
\end{document}
而使用titlesec
宏包修改样式后,无法正确\nameref
到\section*
的内容。
\documentclass{ctexart}
\usepackage{nameref}
\usepackage{xcolor}
\usepackage{titlesec}
\titleformat{\section}[frame]
{\normalfont\color{magenta}}
{\footnotesize \enspace \Large \textcolor{magenta}{\S \,\thesection}\enspace}{6pt}
{\Large\filcenter \bf \songti }
\begin{document}
\section{第一章AAA}\label{sec:A}
我要引用section C: \nameref{sec:C}
\section*{第二章BBB}\label{sec:B}
我要引用section A: \nameref{sec:A}
\section{第三章CCC}\label{sec:C}
我要引用section B: \nameref{sec:B}
\end{document}
进一步测试还发现只要加载titlesec
宏包即会影响\nameref
对\section*
等 star version 命令的正确索引。
这种情况下如何处理是所谓的最佳实践(Best Practice!)
其实这是一位群友的问题,按照惯例来自答一下...
一个可能的答案来自 link 。
进行如下设置即可:
\makeatletter
\def\ttl@useclass#1#2{%
\@ifstar
{\ttl@labelfalse\@dblarg{#1{#2}}}% {\ttl@labelfalse#1{#2}[]}%
{\ttl@labeltrue\@dblarg{#1{#2}}}}
\makeatother
下面是实现的效果:
\documentclass{ctexart}
\usepackage{nameref}
\usepackage{xcolor}
\usepackage{titlesec}
\titleformat{\section}[frame]
{\normalfont\color{magenta}}
{\footnotesize \enspace \Large \textcolor{magenta}{\S \,\thesection}\enspace}{6pt}
{\Large\filcenter \bf \songti }
\makeatletter
\def\ttl@useclass#1#2{%
\@ifstar
{\ttl@labelfalse\@dblarg{#1{#2}}}% {\ttl@labelfalse#1{#2}[]}%
{\ttl@labeltrue\@dblarg{#1{#2}}}}
\makeatother
\begin{document}
\section{第一章AAA}\label{sec:A}
我要引用section C: \nameref{sec:C}
\section*{第二章BBB}\label{sec:B}
我要引用section A: \nameref{sec:A}
\section{第三章CCC}\label{sec:C}
我要引用section B: \nameref{sec:B}
\end{document}
这个titleformat
感觉有点子眼熟,fncychap
宏包提供了类似的样式..如下
但是点击引用的位置跳转不到被引用的位置,好像出现了这个问题,