使用 编译以下 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
(即使使用复杂的符号作为参数)。由于另一个问题,我不得不升级到较新版本的texi2dvi
from 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
和$
。在这种情况下不会发生错误,并且该术语最终位于符号组中,因为它以非字母 ( $
) 开头。
但是,文档构建过程中可能存在另一个冲突源。imakeidx
包makeindex
使用 shell 转义和您提供的样式文件自动运行,但在 LaTeX 调用之后进行的makeindexstyle.ist
后续调用会覆盖由 创建的文件,并且无法识别样式文件。一旦上述问题得到解决并且调用不再失败,则该文件将被运行的下一个 LaTeX 调用覆盖。因此,您最终会得到一个冗余调用,最终的索引文件是通过shell 转义创建的。texindy
.ind
makeindex
texindy
.ind
makeindex
texindy
makeindex
您可以使用选项阻止imakeidx
自动运行。在这种情况下,您的文件变得多余,您需要定义。例如:makeindex
noautomatic
makeindexstyle.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
。据我所知,似乎没有任何方法可以改变这一点。