如何在没有 tocloft 的情况下向目录添加前导符?

如何在没有 tocloft 的情况下向目录添加前导符?

我正在使用基于 的第三方非标准文档类book。不管类是什么,我想在目录中为章节、节和小节添加点引线。如果我包括tocloft,它会以不良方式更改目录的布局。该tocstyle包似乎还用于切换高级样式等。

因此,我想添加点引线,但又不彻底改变目录的布局。有人知道如何实现吗?

我也调查了titletoc包不会改变原始 ToC 布局。但是,我发现添加引线的唯一方法是使用以下命令:

 \titlecontents{<section>}[<left>]{<above>}{<before with label>}{<before without label>}{<filler and page>}[<after>]

我可以直接插入leader填充选项,但我必须重新定义 ToC 的整个样式才能实现这一点。

我很尴尬地说我已经花了大约一个小时的时间(我想 LaTeX 有时会让你谦虚)。我通过 Google 找到的所有答案都只是说使用tocloft。想知道是否有人有更好的主意?

答案1

book定义与 ToC 相关的分段命令如下:

\newcommand*\l@chapter[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}
\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\newcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\newcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}
\newcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}

以上内容归结为为\section、、和添加虚线目录线(如果目录中允许;通过设置)。但它不为。但是,的定义可以融入其中。以下是取自的定义\subsection\subsubsection\paragraph\subparagraphtocdepth\chapter\@dottedtocline\l@chapterlatex.ltx

\def\@dottedtocline#1#2#3#4#5{%
  \ifnum #1>\c@tocdepth \else
    \vskip \z@ \@plus.2\p@
    {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
     \parindent #2\relax\@afterindenttrue
     \interlinepenalty\@M
     \leavevmode
     \@tempdima #3\relax
     \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
     {#4}\nobreak
     \leaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hfill
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}%
     \par}%
  \fi}

这导致以下选择\l@chapter

\renewcommand*\l@chapter[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak
      \xleaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hfill%
      \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}

以下是完整的 MWE:

在此处输入图片描述

\documentclass{book}

\makeatletter
\renewcommand*\l@chapter[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak
      \xleaders\hbox{$\m@th
        \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
        mu$}\hfill%
      \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\renewcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}
\renewcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}
\makeatother

\begin{document}
\tableofcontents
\chapter{First chapter}
\section{First section}
\subsubsection{A subsubsection}
\section{Second section}
\section{Last section}
\chapter{Second chapter}
\section{First section}
\section{Second section}
\section{Last section}
\chapter{Last chapter}
\section{First section}
\section{Second section}
\section{Last section}
\end{document}

我使用了\xleaders而不是\leaders,但这可能是个人偏好。有关差异的讨论请参见想要用重复的字符串填充行

相关内容