我怎样才能让 hyperref 和 xindy 顺利地一起合作呢?

我怎样才能让 hyperref 和 xindy 顺利地一起合作呢?

我用xindy它来为一本被翻译成多种语言的手册生成索引。不幸的是,hyperref它们xindy并不喜欢很好地协同工作。我发现一些较旧的邮件列表主题表明修复这个问题xindy需要太多的努力。

我的问题是:如何才能让xindyhyperref很好地协同工作。解决这种不兼容性的最佳方法是什么?

示例文档将演示该问题:

\documentclass{article}

\usepackage{lipsum}
\usepackage{makeidx}
\usepackage{hyperref}

\makeindex

\begin{document}

\index{single}
\index{range|(}
\lipsum
\index{range|)}

\printindex

\end{document}

我使用和编译此文档(名为x.tex):xelatexxindy

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近距离进入时不使用这个命令。

按照偏好顺序,以下是我想要的结果:

  1. xindyhyperref完美地协同工作并生成带有超链接页码的索引,无需任何外部处理。
  2. xindy并且hyperref可以在外部脚本的帮助下生成带有超链接页码的索引,以便在将索引文件通过 xindy 之前/之后对其进行预处理或后处理。(如果可以简化事情,我目前没有对页码使用任何特殊格式。)
  3. xindy可以通过从页码中删除超链接来平息(使用或不使用外部脚本)。

或者,是否有不同的索引程序可以处理 UTF-8 编码的文件,hyperref并且知道如何整理各种语言?

答案1

简单范围

hyperref2012/11/06 v6.83m 中,如果没有明确给出结束范围条目,则将重复封装命令。然后,在简单范围的情况下,Makeindex和都xindy应该令人满意:

\index{...|(}
\index{...|)}

.idx文件将包含hyperpage两种情况。

格式化命令

来自手册页xindy

对于 LaTeX 语法中的原始索引条目, \index{aaa|bbb}解释方式有所不同。对于 MakeIndex bbb,这是作为此页码的 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

相关内容