当 index 命令位于 align 环境中时,为什么 .ind 为空(尽管使用了 makeindex,但仍然显示来自 xindy 的错误消息)?

当 index 命令位于 align 环境中时,为什么 .ind 为空(尽管使用了 makeindex,但仍然显示来自 xindy 的错误消息)?

使用 编译以下 MWE 时texi2dvi -p,第二个\index{}命令失败并显示错误消息ERROR: CHAR: index 0 should be less than the length of the string (似乎是因为xindy虽然imakeidx有默认值makeindex)。生成的 PDF 看起来很好(但事实并非如此;请参阅下面的“背景”),但文件.ind是空的。

我究竟做错了什么?

\documentclass{scrartcl}
\usepackage{bm}
\usepackage{amsmath}
\usepackage{filecontents}
\begin{filecontents*}{makeindexstyle.ist}
headings_flag 1
heading_prefix "{\\sffamily\\bfseries{"
heading_suffix "}}\\nopagebreak\n\\nopagebreak"
\end{filecontents*}
\usepackage{imakeidx}
\makeindex[intoc, options=-s makeindexstyle.ist]

\begin{document}
\index{$\bm{X}$}% works well
\begin{align}
  \Pi(\bm{u})=\prod_{j=1}^du_j,\quad\bm{u}\in[0,1]^d,\label{def:pi}\index{$\Pi$}% produces "ERROR: CHAR: index 0 should be less than the length of the string" and "/usr/local/bin/texi2dvi: texindy failed"
\end{align}
\printindex
\end{document}

背景:我有一个包含大量\index{}命令的大型文档,这些命令在使用编译时运行良好texi2dvi -p(即使使用复杂的符号作为参数)。由于另一个问题,我不得不升级到较新版本的texi2dvifrom https://ftp.gnu.org/gnu/texinfo/,然后我意识到(另请参阅我上面的内联注释)texindy使用的是 而不是makeindex(尽管makeindex是 的默认设置imakeidx)。除了错误之外,整个索引看起来不错,显示正确的页码,但超链接(未包含在上面的 MWE 中)指向错误的页面。我(也)想知道这是否与 的不兼容性有关xindy(我不明白为什么使用它而不是“makeindex”)hyperref,或者具体与上述错误有关。

texi2dvi -p这是在 macOS 10.14.1 上安装 pdfTeX,版本 3.14159265-2.6-1.40.19 (TeX Live 2018) 的情况。设置后使用 进行编译PDFLATEX=pdflatex --shell-escape -synctex=1 -file-line-error

答案1

ERROR: CHAR: index 0 should be less than the length of the string

当 Xindy 遇到空排序值时,会出现此错误消息。在 的情况下,\index{$\Pi$}实际值为$\Pi$。由于在这种情况下没有指定排序值,因此排序值是从实际值中获取的,但 、${的所有命令和实例}都被删除。这意味着$\Pi$最终会变成一个空字符串,而 Xindy 无法知道如何对其进行排序,这就是它生成错误并失败的原因。

解决方案是为 Xindy 提供一个可以接受的排序值。例如,\index{P@$\Pi$}将排序值设置为P

在 的情况下\index{$\bm{X}$},实际值为 ,$\bm{X}$因此排序值最终为X,这是有效的,因此不会导致问题。

对于makeindex,排序值(如果未提供)也取自实际值,但不进行任何调整,因此\index{$\Pi$}排序值为$\Pi$,从makeindex的角度来看,它是一个由五个字符组成的字符串:$ \ P i$。在这种情况下不会发生错误,并且该术语最终位于符号组中,因为它以非字母 ( $) 开头。

但是,文档构建过程中可能存在另一个冲突源。imakeidxmakeindex使用 shell 转义和您提供的样式文件自动运行,但在 LaTeX 调用之后进行的makeindexstyle.ist后续调用会覆盖由 创建的文件,并且无法识别样式文件。一旦上述问题得到解决并且调用不再失败,则该文件将被运行的下一个 LaTeX 调用覆盖。因此,您最终会得到一个冗余调用,最终的索引文件是通过shell 转义创建的。texindy.indmakeindextexindy.indmakeindextexindymakeindex

您可以使用选项阻止imakeidx自动运行。在这种情况下,您的文件变得多余,您需要定义。例如:makeindexnoautomaticmakeindexstyle.ist\lettergroup

\newcommand*\lettergroup[1]{%
    \par\textbf{\sffamily#1}\par
    \nopagebreak
} 

这一变化texi2dvi似乎源于以下行的替换:

run $makeindex $index_files

  if $TEXINDY --version >&6 2>&1; then
    run $TEXINDY $index_files
  else
    run $MAKEINDEX $index_files
  fi

如果已安装,则强制使用texindy。据我所知,似乎没有任何方法可以改变这一点。

相关内容