使用 titletoc 将章节目录条目重新定义为部分编号 + 章节

使用 titletoc 将章节目录条目重新定义为部分编号 + 章节

我正在尝试获取附加到该部分中的章节的部件号。例如,我想获取:

I Part One
   I.1 Chapter One
   I.2 Chapter Two
II Part Two
   II.3 Chapter Three
   II.4 Chapter Four

我使用titlesec选项newparttoctitletoc。我读到如果我想让 titletoc 能够访问其组件,则应该用 titlesec 重新定义该部分,所以我这样做了。

我应该提到我不想改变整个文档的格式(即重新定义\thechapter)。

我将章节目录条目重新定义为:

\titlecontents{chapter}[1.5em]
{\vspace{1.2em}\bfseries}
{\thepart\thecontentslabel\hspace{1.5em}}
{}
{\hfill\contentspage}

但好像没什么效果,结果是: mwe_输出

我非常感激任何想法。

我的 MWE 是:

\documentclass[a4paper, twoside, openright, 12pt]{book}

%% Titles
%
\usepackage[newparttoc]{titlesec}
\titleformat{\chapter}[display]
  {\vspace{3pc}\raggedleft\scshape\huge\bfseries}
  {\chaptertitlename~\thechapter}
  {0.2em}
  {\raggedleft\normalfont\scshape\huge}
  [\vspace{2pc}]

\titleformat{\part}[display]
  {\titlerule[2pt]\centering\scshape\bfseries\Huge}
  {Part \thepart}
  {0.5em}
  {\centering\normalfont\itshape\Huge}
  [\titlerule\vspace{1em}]


\usepackage{titletoc}
\titlecontents{chapter}[1.5em]
{\vspace{1.2em}\bfseries}
{\thepart\thecontentslabel\hspace{1.5em}}
{}
{\hfill\contentspage}%[\hfill]%[ ]

\pagestyle{empty}

\title{ToC Test}

\begin{document}
\frontmatter
\maketitle

\mainmatter
\tableofcontents
\part{Part One}

\chapter{Chapter One}
\chapter{Chapter Two}

\part{Part Two}
\chapter{Chapter Three}
\chapter{Chapter Four}

\end{document}

答案1

下面的操作符合你的要求(更改用箭头指出%% <-----

\documentclass[a4paper, twoside, openright, 12pt]{book}

%% Titles
%
\usepackage[newparttoc]{titlesec}
\let\oldthechapter\thechapter    %% <----------  
\def\thechapter{\thepart.\oldthechapter}  %% <--------
\titleformat{\chapter}[display]
  {\vspace{3pc}\raggedleft\scshape\huge\bfseries}
  {\chaptertitlename~\oldthechapter}  %% <----------
  {0.2em}
  {\raggedleft\normalfont\scshape\huge}
  [\vspace{2pc}]

\titleformat{\part}[display]
  {\titlerule[2pt]\centering\scshape\bfseries\Huge}
  {Part \thepart}
  {0.5em}
  {\centering\normalfont\itshape\Huge}
  [\titlerule\vspace{1em}]


\usepackage{titletoc}
\titlecontents{chapter}[1.5em]
{\vspace{1.2em}\bfseries}
{\thecontentslabel\hspace{1.5em}}   %% <---------
{}
{\hfill\contentspage}%[\hfill]%[ ]

\pagestyle{empty}

\title{ToC Test}

\begin{document}
\frontmatter
\maketitle

\mainmatter

\tableofcontents

\part{Part One}
\chapter{Chapter One}
\chapter{Chapter Two}

\part{Part Two}
\chapter{Chapter Three}
\chapter{Chapter Four}

\end{document}

解释:由于您没有重新定义\thechapter,因此在\chapter{Chapter One}写入.toc文件时它会写入

\contentsline {chapter}{\numberline {1}Chapter One}{5}%

当读回写入目录时,该值将\thecontentslabel被替换1\thepart空的,就形成了你所看到的结果。

换句话说:调用\titlecontents控制如何格式化.toc文件中写入的内容,但是不是文件内容是如何.toc写入的。当您调用\tableofcontents它时,它位于第一个之前\part,因此\thepart不返回任何内容。

为了使章节标题能够与目录一起显示不同的内容\titleformat,而不是使用\thechapterin\titleformat并要求目录表现不同,我们将修改并使用\thechapterin TOC 并要求\titleformat表现不同。当然,这意味着任何带有章节编号的运行标题也会与部分一起显示。(\oldthechapter如果您不满意,您应该编辑它们以改为使用。)

为了使第 5 章正常工作,您可以在下一章之前\let\thechapter\oldthechapter调用\chapter{Chapter Five}并再次调用。\def\thechapter{\thepart.\oldthechapter}

答案2

解决方案\counterwithin。我没有测试标题,不知道你想要它们,但如果有任何问题,应该很容易解决。

\documentclass[a4paper, twoside, openright, 12pt]{book}

%% Titles
\usepackage[newparttoc, explicit]{titlesec}
\titleformat{\chapter}[display]
  {\counterwithin{chapter}{part}\vspace{3pc}\raggedleft\scshape\huge\bfseries}
  {\chaptertitlename~\arabic{chapter}}
  {0.2em}
  {\raggedleft\normalfont\scshape\huge #1}
  [\vspace{2pc}]

\titleformat{\part}[display]
  {\titlerule[2pt]\centering\scshape\bfseries\Huge}
  {Part \thepart}
  {0.5em}
  {\centering\normalfont\itshape\Huge#1}
  [\titlerule\vspace{1em}]

\usepackage{titletoc}
\titlecontents{chapter}[1.5em]
{\vspace{1.2em}\bfseries}
{\thecontentslabel\hspace{1.5em}}
{}
{\hfill\contentspage}%[\hfill]%[ ]

\pagestyle{empty}
\author{My Self}
\title{ToC Test}

\begin{document}
\frontmatter
\maketitle

\mainmatter
\tableofcontents
\part{Part One}

\chapter{Chapter One}
\chapter{Chapter Two}

\part{Part Two}
\chapter{Chapter Three}
\chapter{Chapter Four}

\end{document} 

在此处输入图片描述

答案3

OP 的评论澄清说,唯一应该改变的是目录列表,而不是其他内容。所以我的其他答案并非最佳选择,因为无论何时\thechapter使用计数器,显示的内容都会受到影响。特别是,当标签写入文件时,.aux它还将包括零件信息,使其在调用时也显示出来\ref

在这种情况下,最简单的做法就是亲自动手,创建一个新的章节命令,添加零件信息仅有的添加到.toc文件中,其他方面的行为与普通的 完全相同\chapter。为此,您可以首先深入研究您正在使用的文档类(即book.cls),并查看 的\chapter定义

\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
                    \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
                       \if@mainmatter
                         \refstepcounter{chapter}%
                         \typeout{\@chapapp\space\thechapter.}%
                         \addcontentsline{toc}{chapter}%
                                   {\protect\numberline{\thechapter}#1}%
                       \else
                         \addcontentsline{toc}{chapter}{#1}%
                       \fi
                    \else
                      \addcontentsline{toc}{chapter}{#1}%
                    \fi
                    \chaptermark{#1}%
                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
                    \if@twocolumn
                      \@topnewpage[\@makechapterhead{#2}]%
                    \else
                      \@makechapterhead{#2}%
                      \@afterheading
                    \fi}

当然,构建命令还涉及其他命令\chapter,但我们关心的是写入 ToC 条目的命令,即调用命令的\@chapter位置\addcontentsline。具体来说,它读取

\addcontentsline{toc}{chapter}%
       {\protect\numberline{\thechapter}#1}%

因此,我们需要做的就是创建一个新命令,该命令的功能与 完全相同,只是\chapter将位替换\numberline{\thechapter}\numberline{\thepart.\thechapter}。如果您始终想在 ToC 中使用这种特定格式,我们可以\@chapter通过重新定义它来修补。但我们也希望\chapter{Chapter Five}它不显示零件信息。因此,我们将定义一个名为 的新命令,除了这个小的添加之外,它的\pchapter功能与 完全相同\chapter

以下代码进行了此更改。(请注意,为方便起见,我删除了titlesec和 的格式化命令titletoc;它们不应受到代码的影响,因为titlesec补丁\@makechapterhead实现了格式化,我们仍在新的 中调用它\@pchapter。)

\documentclass[a4paper, twoside, openright, 12pt]{book}

\usepackage[newparttoc]{titlesec}

\makeatletter
% The \pchapter command differs from \chapter only in changing to call 
% to \@chapter to \@pchapter
\newcommand\pchapter{\if@openright\cleardoublepage\else\clearpage\fi
            \thispagestyle{plain}%
                    \global\@topnum\z@
                    \@afterindentfalse
                    \secdef\@pchapter\@schapter}
% As discussed above, the \@pchapter command only changes in how it calls 
% \addcontentsline
\def\@pchapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
                       \if@mainmatter
                         \refstepcounter{chapter}%
                         \typeout{\@chapapp\space\thechapter.}%
                         \addcontentsline{toc}{chapter}%
                                   {\protect\numberline{\thepart.\thechapter}#1}%
                       \else
                         \addcontentsline{toc}{chapter}{#1}%
                       \fi
                    \else
                      \addcontentsline{toc}{chapter}{#1}%
                    \fi
                    \chaptermark{#1}%
                    \addtocontents{lof}{\protect\addvspace{10\p@}}%
                    \addtocontents{lot}{\protect\addvspace{10\p@}}%
                    \if@twocolumn
                      \@topnewpage[\@makechapterhead{#2}]%
                    \else
                      \@makechapterhead{#2}%
                      \@afterheading
                    \fi}
\makeatother

\pagestyle{empty}

\title{ToC Test}

\begin{document}
\frontmatter
\maketitle

\mainmatter

\tableofcontents

\part{Part One}
% Calls to \pchapter records I.1 and I.2 in the ToC
\pchapter{Chapter One}
\pchapter{Chapter Two}

\part{Part Two}
\pchapter{Chapter Three}
\pchapter{Chapter Four}

% Call to \chapter records 5 in the ToC
\chapter{Chapter Five}
\end{document}

您可能仍需要使用titletoc或至少采取一些措施来为目录中的标签腾出足够的空间。

相关内容