我的索引术语是超链接(指向外部文件 - 请参阅下面列出的问题),因此页码实际上不是有用的信息。因此我希望能够删除页码(以及页码前面的逗号)。
下面的 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
更新答案
我针对两个索引处理器来回答这个问题:makeindex
和texindy
。两个示例都使用该包imakeidx
来简化编译。
特辛迪
您texindy
必须使用该选项进行编译shell-escape
。
首先我设置texindy
包的选项imakeidx
来指定索引处理器。
\makeindex[program=texindy,options=-M mystyle.xdy]
指定options
将作为参数传递给的内容texindy
。该选项-M mystyle.xdy
表示texindy
使用样式文件mystyle.xdy
。
算法
在解释代码之前,我想解释一下我使用的算法。
- 索引条目和页码之间的逗号是样式的简单预定义运算符
texindy
。所以我可以通过在样式文件中设置它们来更改它。 索引条目的每个页码都可以用命令包围和修改。为了抑制页码的输出,我可以使用 LaTeX 内核命令,
\@gobble
该命令的定义如下\def\@gobble#1{}
这些修改必须在索引处理器的排序算法之后执行。因此您无法删除 的页面\indexentry
。
现在实施。
索引处理器texindy
(以及makeindex
)无法处理带有@
符号的 LaTeX 命令,因为@
是索引处理器的特殊字符。因此,我定义了一个命令,相当于\@gobble
\let\mygobble\@gobble
用法将在后面解释。接下来我必须操纵命令,以便修改\index
命令的每个页码。因此,您可以使用扩展。例如,要打印粗体页码,您可以使用。是索引处理器的预定义属性。我使用属性。提供的命令有一个可选参数,因此我建议使用包提供的宏,而不是index
|
\index{foo|textbf}
textbf
textbf
gobble
\index
imakeidx
\LetLtxMacro
letltxmacro
\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}}
与 不同texindy
,makeindex
不适用于属性。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}