因此,我所在机构的委员会对论文有一些荒谬的格式要求,我应该按照他们的要求对 LaTeX 生成的默认目录进行更正。它们是:
标题必须写明:目录,而不是目录(目前写明目录)
目录中的每一项,甚至章节标题,都必须以点号开头(目前,章节标题对应的页面不是以点号开头的)
页码,所有页码,都不能用粗体显示(目前,我的只有与章节标题对应的页码是用粗体显示的)
章节标题必须完整引用,这意味着如果是第 1 章:简介,而不是简单的条目说“简介”,则必须是:第 1 章:简介。
我对如何继续操作一无所知,因为我对那些自定义目录的包非常不熟悉。请帮忙!
答案1
我确信这不是最好的解决方案,而且,这里还有更精明的人可以指出一个可以全局处理东西的正确包。但是,这个对于book
需要补丁的普通类来说工作得很好,所以就这样吧!
\documentclass{book}
\makeatletter
\renewcommand*{\l@chapter}[2]{% % Chapter label format
\ifnum \c@tocdepth > \m@ne % Check: Maximum depth > -1
\addpenalty{-\@highpenalty}% % Encourage prior line breaking
\vskip 1.0em \@plus\p@% % Prior vertical whitespace
\setlength\@tempdima{1.5em}% % Set temporary length
\begingroup % Begin closed group
\parindent\z@ % No paragraph indentation
\rightskip\@tocrmarg % Reserved right whitespace
\parfillskip -\@tocrmarg % Prevent box from moving
\leavevmode % Force horizontal mode
\advance\leftskip\@tempdima % Left whitespace
\hskip -\leftskip % First line alignment
{\bfseries Chapter #1}% % Chapter name and format
\nobreak % Avoid lineskip
\leaders\hbox{$% % Command to replicate dots
\m@th % Math mode for alignment
\mkern\@dotsep mu % Whitespace before a dot
\hbox{.}% % Dot separator
\mkern\@dotsep mu % Whitespace after a dot
$}%
\hfill % Flush to the right
\nobreak\hb@xt@\@pnumwidth{% % Chapter page’s number box
\hss #2% % Page number with buffer
}%
\par % Insert line skip
\penalty\@highpenalty % Return to default penalty
\endgroup % End closed group
\fi
}
\makeatother
\renewcommand\contentsname{Table of Contents} % Table name
\begin{document}
\tableofcontents
\chapter{One}
\section{One-one}
\subsection{One-one-one}
\chapter{Two}
\section{Two-one}
\subsection{Two-one-one}
\chapter{Three}
\section{Three-one}
\subsection{Three-one-one}
\end{document}
产生以下内容!
现在,这一大段代码只是\l@chapter
负责创建目录条目的命令的一个补丁。所有内容都已注释,以便您可以跟进,但值得注意的部分如下。
第 16 行保存条目及其格式,它位于括号内,因此粗体不会转义到页码。
第 21 行将分隔符设置为点。您可以更改它,但如果我们这样做,我们必须对所有其他条目也这样做,所以……它保留为点。
第 26 行保存页码,如果您需要格式化它,这里就是。
第 34 行位于 big blob 之外,只是将内容名称重新定义为目录。同样,您可以将其更改为任何内容。
我还想不出什么,但我正在尝试:正确的“章节编号:某事”带有冒号。在这个解决方案中,这不是那么容易实现的,因为参数#1
将加载“ [Number] [Chapter name]
”作为整个块。我正在研究它,但希望在我所剩的时间里,这能满足您的需要!
编辑
我找到了冒号问题的解决方案!但是……这意味着我们必须修补另一段代码,所以这里是完整版本!
\documentclass{book}
\makeatletter
\def\@chapter[#1]#2{% % Regular chapter command
\ifnum \c@secnumdepth > \m@ne % Check: Maximum depth > -1
\if@mainmatter % Verify if at the main matter
\refstepcounter{chapter} % Ch. counter +1. Nested to 0
\addcontentsline{toc}{chapter}{% % Add to the Table of Contents
\protect\numberline{\thechapter:}#1%% Contents and format
}
\else % Not at the main matter
\addcontentsline{toc}{chapter}{% % Add to the Table of Contents
#1% % Only optional text
}
\fi
\else % If above maximum depth
\addcontentsline{toc}{chapter}{% % Add to the Table of Contents
#1% % Only optional text
}
\fi
\chaptermark{#1}% % Store optional title
\addtocontents{lof}{% % Add to the List of Figures
\protect\addvspace{10\p@}% % Vertical whitespace
}
\addtocontents{lot}{% % Add to the List of Tables
\protect\addvspace{10\p@}% % Vertical whitespace
}
\if@twocolumn % For two-columned documents
\@topnewpage[% % Occupy both columns
\@makechapterhead{#2}% % Generate the contents
]
\else % For one-columned documents
\@makechapterhead{#2}% % Generate the contents
\@afterheading % Line skip after a heading
\fi
}
\renewcommand*{\l@chapter}[2]{% % Chapter label format
\ifnum \c@tocdepth > \m@ne % Check: Maximum depth > -1
\addpenalty{-\@highpenalty}% % Encourage prior line breaking
\vskip 1.0em \@plus\p@% % Prior vertical whitespace
\setlength\@tempdima{1.5em}% % Set temporary length
\begingroup % Begin closed group
\parindent\z@ % No paragraph indentation
\rightskip\@tocrmarg % Reserved right whitespace
\parfillskip -\@tocrmarg % Prevent box from moving
\leavevmode % Force horizontal mode
\advance\leftskip\@tempdima % Left whitespace
\hskip -\leftskip % First line alignment
{\bfseries Chapter #1}% % Chapter name and format
\nobreak % Avoid lineskip
\leaders\hbox{$% % Command to replicate dots
\m@th % Math mode for alignment
\mkern\@dotsep mu % Whitespace before a dot
\hbox{.}% % Dot separator
\mkern\@dotsep mu % Whitespace after a dot
$}%
\hfill % Flush to the right
\nobreak\hb@xt@\@pnumwidth{% % Chapter page’s number box
\hss #2% % Page number with buffer
}%
\par % Insert line skip
\penalty\@highpenalty % Return to default penalty
\endgroup % End closed group
\fi
}
\makeatother
\renewcommand\contentsname{Table of Contents} % Table name
\begin{document}
\tableofcontents
\chapter{One}
\section{One-one}
\subsection{One-one-one}
\chapter{Two}
\section{Two-one}
\subsection{Two-one-one}
\chapter{Three}
\section{Three-one}
\subsection{Three-one-one}
\end{document}
现在产生了这个!
现在,第 4 行到第 36 行的所有这些奇怪的东西都直接来自默认的LaTeX2e 类文档。大部分内容未受影响,只是按原样粘贴,以避免破坏预期的功能。
这个 blob 上唯一的补丁是第 9 行,如您所见,它包含冒号!(原始代码没有,这就是为什么在最后的代码 #1 中将章节称为“ [Number] [Chapter name]
”,而现在冒号位于它们之间!
再次,如果这看起来有点混乱,请原谅,但是有了手头的所有功能,也许您可以根据您的需要进行修改!
答案2
LaTeX 的一大优势是,如果您需要做某件事,很可能有人已经编写了相应的软件包。在这种情况下,软件包tocloft
提供了一整套内容代码接口,因此您可以非常轻松地根据自己的需要对其进行修改。与破解大量代码相比,这确实是首选方法。
\documentclass{book}
\usepackage{tocloft}
\usepackage{calc}
\renewcommand{\contentsname}{Table of Contents}
% if using babel (substitute english with the main language name)
%\addto\extrasenglish{\renewcommand{\contentsname}{Table of Contents}}
\renewcommand\cftchappresnum{Chapter\space} % name before title
\setlength{\cftchapnumwidth}{\widthof{Chapter XX: }}% calculate width to leave enough room
\renewcommand{\cftchapdotsep}{\cftdotsep}% add dots to chapter level
\renewcommand\cftchapaftersnum{:}% add colon after chapter number
\renewcommand\cftchappagefont{\normalfont}% make chapter page numbers not bold
\renewcommand{\cftchapleader}{\cftdotfill{\cftchapdotsep}}% make chapter dots not bold
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\chapter{One}
\section{One-one}
\subsection{One-one-one}
\chapter{Two}
\section{Two-one}
\subsection{Two-one-one}
\chapter{Three}
\section{Three-one}
\subsection{Three-one-one}
\end{document}
答案3
另一个可以让你完全控制目录格式的软件包是软件包,它是软件包套件的titletoc
一部分。该软件包因更改章节标题的格式而非常流行,并且与此接口非常好,因此我将其添加为单独的答案,尽管示例代码中没有使用它。titlesec
titleps
titlesec
titletoc
titlesec
\documentclass{book}
\usepackage{titletoc}
\usepackage{calc}
\renewcommand{\contentsname}{Table of Contents}
% if using babel (substitute english with the main language name)
%\addto\extrasenglish{\renewcommand{\contentsname}{Table of Contents}}
\dottedcontents{section}[3.8em]{}{2.3em}{.7pc}
\dottedcontents{subsection}[6.1em]{}{3.2em}{.7pc}
\contentsmargin{2.5em}
\titlecontents{chapter}
[0em]
{}
{\bfseries Chapter \thecontentslabel: }
{}
{\titlerule*[.7pc]{.}\contentspage}
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\chapter{One}
\section{One-one}
\subsection{One-one-one}
\chapter{Two}
\section{Two-one}
\subsection{Two-one-one}
\chapter{Three}
\section{Three-one}
\subsection{Three-one-one}
\end{document}