我用xindy
它来为一本被翻译成多种语言的手册生成索引。不幸的是,hyperref
它们xindy
并不喜欢很好地协同工作。我发现一些较旧的邮件列表主题表明修复这个问题xindy
需要太多的努力。
我的问题是:如何才能让xindy
和hyperref
很好地协同工作。解决这种不兼容性的最佳方法是什么?
示例文档将演示该问题:
\documentclass{article}
\usepackage{lipsum}
\usepackage{makeidx}
\usepackage{hyperref}
\makeindex
\begin{document}
\index{single}
\index{range|(}
\lipsum
\index{range|)}
\printindex
\end{document}
我使用和编译此文档(名为x.tex
):xelatex
xindy
xelatex x
xindy -C utf8 -M texindy -L english x.idx
xelatex x
xelatex x
索引中缺少属于某个范围的页码:
输出xindy
结果有一些抱怨:
WARNING: Found no :close-range matching an already opened one!
Location-reference is 1 in keyword (range).
Maybe I lost some of the regular location-references.
WARNING: Found a :close-range in the index that wasn't opened before!
Location-reference is 2 in keyword (range)
I'll continue and ignore this.
当我们查看文件时,这些错误是有意义的x.idx
:
\indexentry{single|hyperpage}{1}
\indexentry{range|(hyperpage}{1}
\indexentry{range|)}{2}
hyperpage
近距离进入时不使用这个命令。
按照偏好顺序,以下是我想要的结果:
xindy
并hyperref
完美地协同工作并生成带有超链接页码的索引,无需任何外部处理。xindy
并且hyperref
可以在外部脚本的帮助下生成带有超链接页码的索引,以便在将索引文件通过 xindy 之前/之后对其进行预处理或后处理。(如果可以简化事情,我目前没有对页码使用任何特殊格式。)xindy
可以通过从页码中删除超链接来平息(使用或不使用外部脚本)。
或者,是否有不同的索引程序可以处理 UTF-8 编码的文件,hyperref
并且知道如何整理各种语言?
答案1
简单范围
在hyperref
2012/11/06 v6.83m 中,如果没有明确给出结束范围条目,则将重复封装命令。然后,在简单范围的情况下,Makeindex
和都xindy
应该令人满意:
\index{...|(}
\index{...|)}
该.idx
文件将包含hyperpage
两种情况。
格式化命令
来自手册页xindy
:
对于 LaTeX 语法中的原始索引条目,
\index{aaa|bbb}
解释方式有所不同。对于 MakeIndexbbb
,这是作为此页码的 LaTeX 标记输出的标记。对于 xindy,这是一个位置属性,一个抽象标识符,稍后将与应为该属性输出的标记相关联。对于直接使用,当
bbb
是或类似时,我们提供模仿行为的textbf
位置属性定义。MakeIndex
对于更复杂的用法,当
bbb
不是标识符时,不存在这样的兼容性定义,也可能未使用当前的 创建xindy
。具体而言,这意味着默认情况下 LaTeX 包hyperref
将创建无法使用 处理的原始索引文件xindy
。这不是错误,这是故意不兼容的不幸结果。目前无法同时获取 的hyperref
索引链接并使用xindy
。据报道,LaTeX 类也存在类似的情况
memoir
。了解 Common Lisp 和 Lex 并希望找到补救措施的程序员请联系作者。
广告 3.
简单来说,hyperref
索引重新定义被抑制
\usepackage[hyperindex=false]{hyperref}
也许有一种方法可以\hyperpage
在其中插入链接的页码xindy
。
最小页面范围
Xindy
使页面范围从三连续页码。这可以通过设置:min-page-range
为 来更改1
(默认为2
)。以下文件mypagerange.xdy
还包括page-ranges.xdy
范围分隔符的定义:
; File mypagerange.xdy
(require "page-ranges.xdy")
(define-location-class "arabic-page-numbers"
("arabic-numbers") :min-range-length 1)
然后xindy
使用选项进行调用-M mypagerange.xdy
。
答案2
这是对我有用的解决方案(基于 Heiko 和 michal 的回复)。
\documentclass{article}
\usepackage{lipsum}
\usepackage[xindy]{imakeidx}
\usepackage[hyperindex=false]{hyperref}
\def\xindyopt{-M indexstyle}
\makeindex[options=\xindyopt]
\begin{filecontents*}{indexstyle.xdy}
(require "page-ranges.xdy")
(define-location-class "arabic-page-numbers"
("arabic-numbers") :min-range-length 1)
(markup-locref :open "\hyperpage{" :close "}")
\end{filecontents*}
\begin{document}
\index{single}
\index{range|(}
\lipsum
\index{range|)}
\printindex
\end{document}
答案3
广告2)
perl -pi -e 's/\|\)/\|hyperpage\)/g' myfile.idx
第一次通话后latex
,通话前xindy
。