KOMA 书:索引的超链接正确吗?

KOMA 书:索引的超链接正确吗?

因此,我正在使用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}

相关内容