从索引条目中删除页码

从索引条目中删除页码

我的索引术语是超链接(指向外部文件 - 请参阅下面列出的问题),因此页码实际上不是有用的信息。因此我希望能够删除页码(以及页码前面的逗号)。

下面的 MWE 生成左侧的图像,但我希望它生成右侧的图像:

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

如果一个解决方案适用于所有软件包,那就太好了,但特定于软件包的解决方案也可以。我正在使用,imakeidx所以这对我最有帮助。

参考:

代码:imakeidx

\documentclass{article}
\usepackage{imakeidx}
\usepackage{hyperref}

\makeindex[columns=1]

\begin{document}
  Test\index{foo}
  \index{bar}
  \printindex
\end{document}

代码:makeidx

\documentclass{article}
\usepackage{makeidx}
\usepackage{hyperref}
\makeindex

\begin{document}
  Test\index{foo}
  \index{bar}
  \printindex
\end{document}

答案1

更新答案

我针对两个索引处理器来回答这个问题:makeindextexindy。两个示例都使用该包imakeidx来简化编译。


特辛迪

texindy必须使用该选项进行编译shell-escape

首先我设置texindy包的选项imakeidx来指定索引处理器。

\makeindex[program=texindy,options=-M mystyle.xdy]

指定options将作为参数传递给的内容texindy。该选项-M mystyle.xdy表示texindy使用样式文件mystyle.xdy

算法

在解释代码之前,我想解释一下我使用的算法。

  1. 索引条目和页码之间的逗号是样式的简单预定义运算符texindy。所以我可以通过在样式文件中设置它们来更改它。
  2. 索引条目的每个页码都可以用命令包围和修改。为了抑制页码的输出,我可以使用 LaTeX 内核命令,\@gobble该命令的定义如下

    \def\@gobble#1{}
    

这些修改必须在索引处理器的排序算法之后执行。因此您无法删除 的页面\indexentry

现在实施。

索引处理器texindy(以及makeindex)无法处理带有@符号的 LaTeX 命令,因为@是索引处理器的特殊字符。因此,我定义了一个命令,相当于\@gobble

\let\mygobble\@gobble

用法将在后面解释。接下来我必须操纵命令,以便修改\index命令的每个页码。因此,您可以使用扩展。例如,要打印粗体页码,您可以使用。是索引处理器的预定义属性。我使用属性。提供的命令有一个可选参数,因此我建议使用包提供的宏,而不是index|\index{foo|textbf}textbftextbfgobble\indeximakeidx\LetLtxMacroletltxmacro\let

\LetLtxMacro\OldIndex\index
\renewcommand{\index}[1]{\OldIndex{#1|gobble}} 

通过此重新定义,每个索引命令都会获得属性gobble。此属性在运行的样式文件中定义texindy

(define-attributes (("gobble" "default")))
(markup-locref  :open "\mygobble{" :close "}" :attr "gobble")
(markup-locclass-list :open "" :sep "")

在第一行中,我定义了一个新属性。在第二行中,我说明了该属性应该做什么。这里使用了命令\mygobble。第三行将分隔符定义为空""

附注:texindy样式文件中的注释以;. 开头。

总的来说,我们得到以下例子:

%% !TEX program  = pdflatex --shell-escape
\documentclass{article}
\usepackage{xcolor}
\usepackage{imakeidx}
\makeindex[program=texindy,options=-M mystyle.xdy]
\usepackage{letltxmacro}
\usepackage{filecontents}
\makeatletter
\let\mygobble\@gobble
\LetLtxMacro\OldIndex\index
\renewcommand{\index}[1]{\OldIndex{#1|gobble}} 
\makeatother
\begin{filecontents*}{mystyle.xdy}
;;; xindy style file
(define-attributes (("gobble" "default")))
(markup-locref  :open "\mygobble{" :close "}" :attr "gobble")
(markup-locclass-list :open "" :sep "")
\end{filecontents*}
\begin{document}
Test\index{foo}
\index{bar}
\printindex
\end{document}

结果是:


制作索引

以下makeindex是该包的选项imakeidx

\makeindex[program=makeindex,options=-s mystyle.ist]

必须将选项options设置为,-s mystyle.ist因为通过这种方式您将样式文件传递给索引处理器makeindex

makeindex使用相同的算法。所以这些线条几乎完全相同

\let\mygobble\@gobble
\LetLtxMacro\OldIndex\index
\renewcommand{\index}[1]{\OldIndex{#1|mygobble}} 

与 不同texindymakeindex不适用于属性。mygobble不带反斜杠的命令将作为 的参数传递\index给处理器。处理器将写入\mygobble{\thepage}

必须在样式文件内重新定义分隔符。

quote '+'
delim_0 " "
delim_1 " "
delim_2 " "
delim_n " "

delim_0等是不同层的分隔符。

旁注:makeindex样式文件中的注释以与 LaTeX 中的相同的方式引入%

因此我们得到以下例子makeindex

\documentclass{article}
\usepackage{xcolor}
\usepackage{imakeidx}
\makeindex[program=makeindex,options=-s mystyle.ist]
\usepackage{letltxmacro}
\usepackage{filecontents}
\makeatletter
\let\mygobble\@gobble
\LetLtxMacro\OldIndex\index
\renewcommand{\index}[1]{\OldIndex{#1|mygobble}} 
\makeatother
\begin{filecontents*}{mystyle.ist}
quote '+'
delim_0 " "
delim_1 " "
delim_2 " "
delim_n " "
\end{filecontents*}
\begin{document}
Test\index{foo}
\index{bar}
\printindex
\end{document}

超链接支持

imakeidx记得先加载hyperref

hyperref与的方法结合makeindex使用不需要任何特殊处理。如果texindy与 hyperref 结合使用,则必须*.xdy按以下方式更改样式文件:

(markup-locclass-list :open "" :sep "")
(markup-range :sep "")

在文档主体中,您必须按如下方式更改索引的打印以吞噬页码:

\begingroup
\def\hyperpage#1{}
\printindex
\endgroup

以下是完整的 MWE:

\documentclass{article}
\usepackage{xcolor}
\usepackage{imakeidx}
\makeindex[program=texindy,options=-M mystyle.xdy]
\usepackage{letltxmacro}
\usepackage{hyperref}
\usepackage{filecontents}
\begin{filecontents*}{mystyle.xdy}
;;; xindy style file
(markup-locclass-list :open "" :sep "")
(markup-range :sep "")
\end{filecontents*}
\begin{document}
Test\index{foo}
\index{bar}

\begingroup
\def\hyperpage#1{}
\printindex
\endgroup
\end{document}

相关内容