首先是 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.cls
4.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
并且在目录和索引中都有相同的点(但间距更窄)。
或者将\leaders
Index 宏和 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}