自定义目录中的各种功能

自定义目录中的各种功能

因此,我所在机构的委员会对论文有一些荒谬的格式要求,我应该按照他们的要求对 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}

产生以下内容!

输出1

现在,这一大段代码只是\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}

现在产生了这个!

输出2

现在,第 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一部分。该软件包因更改章节标题的格式而非常流行,并且与此接口非常好,因此我将其添加为单独的答案,尽管示例代码中没有使用它。titlesectitlepstitlesectitletoctitlesec

\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}

代码输出

相关内容