我正在尝试获取附加到该部分中的章节的部件号。例如,我想获取:
I Part One
I.1 Chapter One
I.2 Chapter Two
II Part Two
II.3 Chapter Three
II.4 Chapter Four
我使用titlesec
选项newparttoc
和titletoc
。我读到如果我想让 titletoc 能够访问其组件,则应该用 titlesec 重新定义该部分,所以我这样做了。
我应该提到我不想改变整个文档的格式(即重新定义\thechapter
)。
我将章节目录条目重新定义为:
\titlecontents{chapter}[1.5em]
{\vspace{1.2em}\bfseries}
{\thepart\thecontentslabel\hspace{1.5em}}
{}
{\hfill\contentspage}
我非常感激任何想法。
我的 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
,而不是使用\thechapter
in\titleformat
并要求目录表现不同,我们将修改并使用\thechapter
in 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
或至少采取一些措施来为目录中的标签腾出足够的空间。