目录和索引中的点空格

目录和索引中的点空格

首先是 MWE 及其输出:

\documentclass[a4paper, 10pt]{book}

\usepackage{hyperref}
\usepackage{imakeidx}
\makeindex

\newcommand{\AddIndexLetterToTOC}[1]{\textbf{#1}\phantomsection\addcontentsline{toc}{section}{#1}}
\usepackage{filecontents}
\begin{filecontents*}[overwrite]{\jobname.mst}
headings_flag 1 %
heading_prefix "\\AddIndexLetterToTOC{"
    heading_suffix "}\\nopagebreak\n"
delim_0 "\\dotfill"
delim_1 "\\dotfill"
delim_2 "\\dotfill"
\end{filecontents*}

\begin{document}

\tableofcontents

\chapter{Test chapter}

\index{And}
\index{Book}
\index{Summer}
\index{Latex}

\pagebreak

\addcontentsline{toc}{chapter}{Index}
\printindex

\end{document}

在此处输入图片描述 在此处输入图片描述

如你所见,Contents 和 Index 中的点间距不同,因此

(问题1)有没有办法让Index中的点空间与Contents中的点空间相同,并且保持Contents中的点空间不变?

我知道一个答案借助tocloft我不想使用的软件包,因为它会更改我的.tex文件中的其他设置。或者

(问题2)有没有办法让Contents中的点空间与Index中的点空间相同,并且保持Index中的点空间不变?

顺便说一下,Contents 的定义\@dottedtocline如下:

\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

Index的定义\dotfill也如下:

\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill\kern\z@}%

但我读完之后不知道如何才能得到想要的结果。

答案1

生成重复点的 TeX 基元是

\leaders <box or rule> <glue>

如果使用了(这是您的情况,该框包含点),那么这个框会在拉伸的<box>区域中重复。<glue>

在您的第一个代码片段中,\leaders用作

\leaders \hbox {$\m@th \mkern \@dotsep mu\hbox {.}\mkern \@dotsep mu$} \hfill

此处的框构造方式比需要的更复杂(不幸的是,这在 LaTeX 的内部源中非常常见)。点是\hbox在数学模式下输入的,其周围的字距以单位表示mu(数学单位,1/18 em)。\@dotsep定义为book.cls4.5,因此我们在这里得到 4.5/18 = 0.25 em。同样的,可以在不使用数学模式的情况下表示为

\leaders \hbox{\kern.25em .\kern.25em} \hfill

点的宽度取决于所使用的字体。例如,如果使用 10pt 的 Computer Modern,则点的宽度为 2.7777pt,1em = 10pt。我们的框的宽度为 7.7777pt,我们可以通过以下公式来表示

\leaders \hbox to .7777em {\hss .\hss} \hfill

您可以看到索引中使用的点是由

\leaders \hbox to .6em {\hss .\hss} \hskip 0pt plus 1fill

注意\hfill是 的原始等价物\hskip 0pt plus 1fill。所以没有区别。区别在于重复框的宽度。

\hbox如果不知道点的宽度(这是字体相关值),我们就无法比较目录中使用的 宽度与索引中使用的 宽度。我建议在两种情况下使用相同的宽度,例如将\leaders目录宏中的 替换为

\leaders \hbox to .6em {\hss .\hss} \hfill

并且在目录和索引中都有相同的点(但间距更窄)。

或者将\leadersIndex 宏和 TOC 宏中的 替换为

\leaders \hbox to .77777em {\hss .\hss} \hfill

并且 TOC 和 Index 中的点是相同的(但间距更宽)。如上所述,\leaders不幸的是,TOC 宏中的原始用法被过度使用了。


以下内容由原帖编辑)因此,为了得到第一个问题中提出的问题,修改的定义\dotfill如下,这相当于@Jinwen 的旧答案

\makeatletter
\def\dotfill{\leaders\hbox to .7777em {\hss .\hss}\hfill\nobreak}%
\makeatother

\@dottedtocline而为了得到第二个问题中提出的问题,请在序言中按如下方式修改定义。

\makeatletter
\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 to .6em {\hss .\hss}\hfill
     \nobreak
     \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5%
                        \kern-\p@\kern\p@}%
     \par}%
  \fi}
\makeatother

答案2

如果您希望文档中所有地方都使用相同的点样式,您可以简单地定义自己的版本。例如,在我的文档类中,我有(当然颜色略有不同):

\titlerule*[.67em]{\textcolor{gray!55}{.}}

(我认为这是来自软件包titlesec或的命令titletoc,希望这些软件包不会破坏您现有的设置。无论如何,这只是一个指示,您可以定义自己的版本而无需使用任何其他软件包)

或简单形式

\leaders \hbox to .67em {\hss \textcolor{gray!55}{.} \hss} \hfill

(这种方法效果出奇地好,因为它可以产生完美的水平对齐)

文件中.mst有:

delim_0 "\\IndexDotfill " % Filler between section heading and page number
delim_1 "\\IndexDotfill " % Filler between subsection heading and page number

其中\IndexDotfill定义为

\newcommand*{\IndexDotfill}
  {
    \leaders \hbox to .67em {\hss \textcolor{main-text!15!paper}{.} \hss} \hfill
  }

在 ToC 的配置中,我有类似这样的内容:

\titlecontents{chapter}
      [2em] % 0em (part) + 2em
      {\addvspace{.5pc}\normalfont}
      {\contentslabel{2em}}
      {\hspace*{-2em}}
      {\titlerule*[1em]{\textcolor{gray!55}{.}}\contentspage}

结果如下:

在此处输入图片描述

在此处输入图片描述


旧答案

正如您在问题中指出的那样,如果您重新定义\dotfill

\def\dotfill{\leaders\hbox{$\m@th\mkern\@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill\nobreak}

然后你将获得与目录中相同的点:)

\documentclass[a4paper, 10pt]{book}

\usepackage{hyperref}
\usepackage{imakeidx}
\makeindex

\newcommand{\AddIndexLetterToTOC}[1]{\textbf{#1}\phantomsection\addcontentsline{toc}{section}{#1}}
\makeatletter
\def\dotfill{\leaders\hbox{$\m@th\mkern\@dotsep mu\hbox{.}\mkern \@dotsep mu$}\hfill\nobreak}%
\makeatother
\begin{filecontents*}[overwrite]{\jobname.mst}
headings_flag 1 %
heading_prefix "\\AddIndexLetterToTOC{"
    heading_suffix "}\\nopagebreak\n"
delim_0 "\\dotfill"
delim_1 "\\dotfill"
delim_2 "\\dotfill"
\end{filecontents*}

\begin{document}

\tableofcontents

\chapter{Test chapter}

\index{And}
\index{Book}
\index{Summer}
\index{Latex}

\pagebreak

\addcontentsline{toc}{chapter}{Index}
\printindex

\end{document}

在此处输入图片描述

在此处输入图片描述

相关内容