Titlesec 在目录中为带星号的部分创建条目

Titlesec 在目录中为带星号的部分创建条目

我有以下代码,创建以“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}

相关内容