因此,我正在使用scrbook
,并且在目录中,索引的链接略微超出了应有的范围,如所述这里。不幸的是,其中描述的解决方案适用于book
类,并且不适用于scrbook
(*)。
现在,我可以解决这个问题(通过添加index=totoc
文档选项,如本文所述)其他链接)。但我在制定了 MWE 之后才发现后面这个链接。此外,使用我的 MWE,后面链接中提出的另一种解决方案——使用\phantomsection
——确实不是工作:TOC 的索引链接仍然太远。有人能帮忙吗?谢谢。
这是MWE:
\documentclass[oneside]{scrbook}
\usepackage{makeidx}
\usepackage{hyperref}
\makeindex
\newcommand{\nist}{%
NIST%
\index{National Institute of Standards and Technology}}
\begin{document}
\tableofcontents
\chapter{Introduction}
Lorem ipsum \nist.
\cleardoublepage
\phantomsection
\addcontentsline{toc}{chapter}{\indexname}
\printindex
\end{document}
(*) — 特别是,patch 命令失败,因为scrbook
的\theindex
命令定义没有使用twocolumn
。
答案1
正确的方法确实是使用index=totoc
,但为什么呢?让我们看看内部原理。
落实到实施层面
theindex
在book和scrbook中如何定义环境?
书籍目录
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\twocolumn[\@makeschapterhead{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\columnseprule \z@
\columnsep 35\p@
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
简体中文:
\newenvironment{theindex}{%
\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\columnseprule \z@
\columnsep 35\p@
\setchapterpreamble{\index@preamble}%
\idx@heading%
\thispagestyle{\indexpagestyle}\parindent\z@
\setlength{\parskip}{\z@ \@plus .3\p@}%
\setlength{\parfillskip}{\z@ \@plus 1fil}%
\let\item\@idxitem
}{%
\if@restonecol\onecolumn\else\clearpage\fi
}
如您所见,两者的作用基本相同。检查一列/两列模式,设置标题,更改 parskip 和 -indent。Heiko 之前解释了标准书的作用:
[它] 受到 可选参数的副作用的影响
\twocolumn
。在单列模式下,可选参数中的标题放在页面顶部,但在双列模式下,页面的当前内容(锚点设置)会停滞并添加到标题之后。
另一方面,KOMA 却有\idx@heading
这样的定义:
\if@openright\cleardoublepage\else\clearpage\fi%
\twocolumn[%
\@chaptertolistsfalse
\idx@@heading{\indexname}]%
\@mkboth{\MakeMarkcase{\indexname}}{\MakeMarkcase{\indexname}}%
它进行常规检查并发布单页或双页。它使用\twocolumn
可选参数(如标准类一样)并设置标题。\@chaptertolostsfalse
防止章节标题进入图表列表和表格列表。下一行将我们引向此代码
\KOMA@key{index}{%
\KOMA@set@ncmdkey{index}{@tempa}{%
{notoc}{0},{nottotoc}{0},{default}{0},{plainheading}{0},%
{totoc}{1},{toc}{1},{notnumbered}{1}%
}{#1}%
\ifx\FamilyKeyState\FamilyKeyStateProcessed
\ifcase \@tempa\relax
\renewcommand*{\idx@@heading}{%
\chapter*
}%
\or
\renewcommand*{\idx@@heading}{%
\addchap
}%
\fi
\fi
}
如果没有为 赋值index
,则 scrbook 的使用方式\chapter*
与标准书籍相同(如果notoc
给出了 和 类似的值,也是如此)。如果您明确决定索引应转到目录,addchap
则使用 。addchap
调用\@addchap
调用\addchaptertocentry
调用addtocentrydefault
调用tocbasic@addxcontentsline
最终调用\addcontentsline
中的常用tocbasic.sty
方法。所有这些仍然发生在 的可选参数中twocolumn
。
如您所见,Markus Kohm 几乎考虑了所有可能的情况。一切都以某种方式设计,即一次更改会导致整个文档不断更改。所有机制都由命令共享。
总而言之,偶尔查看一下 KOMA 脚本文档可以帮你省去寻找黑客漏洞的麻烦。
\documentclass[oneside
,index=totoc
]{scrbook}
\usepackage{makeidx}
\usepackage{hyperref}
\makeindex
\newcommand{\nist}{%
NIST%
\index{National Institute of Standards and
Technology}
}
\begin{document}
\tableofcontents
\chapter{Introduction}
Lorem ipsum \nist.
%\cleardoublepage
%\phantomsection
%\addcontentsline{toc}{chapter}{\indexname}
\printindex
\end{document}