我有以下代码,创建以“Section [number]”开头的章节标题,正如我所希望的那样:
\documentclass{article}
\usepackage[hidelinks]{hyperref}
\usepackage[explicit]{titlesec}
\newcommand\sectiontext{}
\titleformat{\section}%
{\refstepcounter{section}%
\renewcommand\sectiontext{Section \thesection. #1}%
\Large\bfseries}
{}
{0pt}
{\sectiontext}
[\addcontentsline{toc}{section}{\sectiontext}]
\begin{document}
\tableofcontents
\section*{A section}
\section*{Another section}
\end{document}
(使用宏sectiontext
是为了清楚起见。)此外,目录中的各个部分按我想要的方式显示(除了内容本身,但我知道如何解决这个问题),并hyperref
创建完全正确的链接:
% Contents entry for the contents itself left out
\contentsline {section}{Section 2. A section}{1}{section.2}
\contentsline {section}{Section 3. Another section}{1}{section.3}
(不要介意目录条目,它被编号为第一部分。)请注意,必须使用带星号的部分。总结一下,这里没有问题。
当我对零件而不是节使用完全类似的代码时,出现了一个问题:
\documentclass{article}
\usepackage[hidelinks]{hyperref}
\usepackage[explicit]{titlesec}
\newcommand\parttext{}
\titleformat{\part}%
{\refstepcounter{part}%
\renewcommand\parttext{Part \thepart. #1}%
\Huge\bfseries}
{}
{0pt}
{\parttext}
[\addcontentsline{toc}{part}{\parttext}]
\begin{document}
\tableofcontents
\part*{A part}
\part*{Another part}
\end{document}
使用此功能后,ToC 文件变为:
% Contents entry for the contents itself left out
\contentsline {part}{Part I. A part}{1}{part.1}
\contentsline {part}{A part}{1}{part.1}
\contentsline {part}{Part II. Another part}{1}{part.2}
\contentsline {part}{Another part}{1}{part.2}
如您所见,titlesec
为每个部分创建一个额外的条目。(当我不加载时也是如此hyperref
。)
这真的很奇怪,因为它几乎与部分的代码相同。我该如何删除这些条目?
答案1
主要原因是titlesec
只是处理方式\part
与文档中所有其他部分单元不同。它设置了一个单独的处理程序来管理标题和目录相关条目,总是为 编写后者\part
。因此,您在“后置代码”中添加 ToC 相关条目后,\part
也会titlesec
编写该条目,因此 ToC 中会出现双重条目。
如何获得你想要的输出?补丁\ttl@part@i
(借助etoolbox
\parttext
)将您的作为其自然 ToC 写作的一部分插入并删除手动写作:
\documentclass{article}
\usepackage[hidelinks]{hyperref}
\usepackage[explicit]{titlesec}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\ttl@part@i}% <cmd>
{{#1}{#3}}% <search>
{{#1}{Part \thepart. #3}}% <replace>
{}{}% <success><failure>
\makeatother
\newcommand\parttext{}
\titleformat{\part}%
{\refstepcounter{part}\Huge\bfseries}
{}
{0pt}
{\parttext}
[]
\newcommand\sectiontext{}
\titleformat{\section}%
{\refstepcounter{section}%
\renewcommand\sectiontext{Section \thesection. #1}%
\Large\bfseries}
{}
{0pt}
{\sectiontext}
[\addcontentsline{toc}{section}{\sectiontext}]
\begin{document}
\tableofcontents
\part*{A part}
\part*{Another part}
\section*{A section}
\section*{Another section}
\end{document}