如何在索引开始处提供一条导航行,其中包含指向索引中存在的每个组的链接?

如何在索引开始处提供一条导航行,其中包含指向索引中存在的每个组的链接?

语境:这里被视为文档的电子版(PDF)版本。)

当索引变得很长时,目录条目或指向其第一页的书签是不够的,因为读者可能需要以不可预测的次数转到下一页。

为每个索引字母添加子书签可能会有所帮助,如这个问题但对于没有注意到书签或至少是隐藏的子书签的读者来说,这是没用的。

更有用的功能是glossaries软件包提供的listhypergroup样式:词汇表开头的导航行,其中包含词汇表中每个组的链接(请参阅下面 MWE 中的“B | F”行)。我知道glossaries提供索引功能,但出于某些原因(主要是自定义.xdy索引样式文件),我需要使用自定义索引包,例如imakeidx

您是否知道如何在索引的开头提供一条导航行,其中包含指向索引中存在的每个组的链接(glossaries包中的相应代码非常丑陋:)?

\documentclass{article}
\usepackage[colorlinks]{hyperref}
\usepackage[xindy]{glossaries}
\makeglossaries
%
\newglossaryentry{foo}%
{%
  name={foo},%
  description={Foo}%
}
\newglossaryentry{bar}%
{%
  name={bar},%
  description={Bar}
}
%
\begin{document}
\Gls{foo} and \gls{bar}.
%
\printglossary[style=listhypergroup]
\end{document}

在此处输入图片描述

答案1

首先,您需要打开标题(如链接问题中所示)。这可用于设置超链接目标并提供字母组标题:

\documentclass{article}

\usepackage{filecontents}
\usepackage[colorlinks]{hyperref}
\usepackage{makeidx}

\begin{filecontents}{\jobname.ist}
headings_flag 1
heading_prefix "\\indexheading{"
heading_suffix "}\n"
\end{filecontents}

\makeindex

\newcommand*{\indexheading}[1]{\item\hypertarget{idx:#1}{\textbf{#1}}}

\begin{document}

Foo\index{foo}. Bar\index{bar}.

\printindex

\end{document}

这为每个字母组提供了目标名称idx:。例如idx:F对于F字母组。标题的格式非常简单,但只是为了说明。

接下来是索引开头的导航,这有点复杂。让我们提供\indexnavigation包含导航链接的命令。这需要放在索引前言中,但如何完成取决于您使用的索引包。例如,使用imakeidx,这可以用 完成\indexprologue{\indexnavigation},而使用需要重新定义环境makeidxtheindex

为了简单起见,我只会\indexnavigation在之后添加\begin{theindex},它不会跨越多列索引,但这只是为了说明:

\begin{filecontents}{\jobname.ist}
headings_flag 1
heading_prefix "\\indexheading{"
heading_suffix "}\n"
preamble "\\begin{theindex}\\indexnavigation\n"
\end{filecontents}

现在的问题是并非所有字母组都可用。(在此示例中,只有两个组BF。)但是,在索引处理完成之前无法判断哪些组可用,因此这意味着将信息保存到文件中.aux(这是glossaries您提供的 MWE 中所做的)。

\indexheading命令可以调整以将所需信息写入文件.aux

\newcommand*{\indexheading}[1]{\item\hypertarget{idx:#1}{\textbf{#1}}%
  \protected@write\@auxout{}{\string\@indexgroup{idx:#1}{#1}}%
}

这意味着该.aux文件现在将包含:

\@indexgroup{idx:B}{B}
\@indexgroup{idx:F}{F}

\@indexgroup需要定义这个新的内部命令来将字母组添加到\indexnavigation。该etoolbox包使事情变得更容易一些:

\newcommand*{\@indexgroup}[2]{%
  \ifdefempty\indexnavigation
  {\gdef\indexnavigation{\hyperlink{#1}{\textbf{#2}}}}%
  {\gappto\indexnavigation{ \textbar\ \hyperlink{#1}{\textbf{#2}}}}%
}

请注意,全局版本\gdef\gappto是必需的。

完整代码如下:

\documentclass{article}

\usepackage{filecontents}
\usepackage{etoolbox}
\usepackage[colorlinks]{hyperref}
\usepackage{makeidx}

\begin{filecontents}{\jobname.ist}
headings_flag 1
heading_prefix "\\indexheading{"
heading_suffix "}\n"
preamble "\\begin{theindex}\\item\\indexnavigation\n"
\end{filecontents}

\makeindex

\newcommand{\indexnavigation}{}

\makeatletter
\newcommand*{\indexheading}[1]{\item\hypertarget{idx:#1}{\textbf{#1}}%
  \protected@write\@auxout{}{\string\@indexgroup{idx:#1}{#1}}%
}
\newcommand*{\@indexgroup}[2]{%
  \ifdefempty\indexnavigation
  {\gdef\indexnavigation{\hyperlink{#1}{\textbf{#2}}}}%
  {\gappto\indexnavigation{ \textbar\ \hyperlink{#1}{\textbf{#2}}}}%
}
\makeatother

\begin{document}

Foo\index{foo}. Bar\index{bar}.

\printindex

\end{document}

请注意,这需要在创建索引后运行两次 LaTeX,makeindex以确保导航链接是最新的。

带导航线的索引图像

相关内容