\@indexfile 未定义

\@indexfile 未定义

csname在、、和其他各种 sty 文件\@indexfile中使用。但每次我尝试访问它时,它都是未定义的。如您所见,我正在使用和。我遗漏了什么?source2emakeidxhyperrefamsidx\makeindex\makeatletter

\documentclass{book}
\usepackage{imakeidx}
\makeindex
%\usepackage{hyperref}

\newcounter{subindex}[page]
\renewcommand{\thesubindex}{\thepage\alph{subindex}}

\makeatletter
\def\@wrindex#1{%
  \refstepcounter{subindex}%
  \protected@write\@indexfile{}%
     {\string\indexentry{#1}{\thesubindex}}%
\endgroup\@esphack}% started by \index
\makeatother

\begin{document}
Some text and \index{indexed term}
\end{document}

答案1

由于imakeidx允许多个索引文件,文件句柄\@indexfile不是唯一的(我不在splitindex这里处理该选项)

相关的启动命令是\imki@startidxsplit

\def\imki@startidxsplit#1{%
\if@filesw
\def\index{\@bsphack
\@ifnextchar [{\@index}{\@index[\imki@jobname]}}
\expandafter\newwrite\csname #1@idxfile\endcsname
\immediate\openout \csname #1@idxfile\endcsname #1.idx\relax
\typeout{Writing index file #1.idx}%
\fi}

它将创建一个\#1@idxfile文件句柄,即文件句柄名称取决于name=#1中使用的参数\makeindex

如果\makeindex使用时没有可选参数和name=...选项,则索引文件句柄为。(当然\jobname@idxfile是在扩展之后)例如\jobname\foo@idxfile

以下是文档的摘录imakeidx

name 是索引的符号名称;如果未指定此键,则默认为 \jobname 控制序列的值,换句话说,当前主 .tex 文件的名称,即 \inputs 和/或 \includes 完整文档的所有文件的文件。此符号名称仅在执行多个索引时才是必要的,并与 \index 命令一起使用以指向正确的索引。

相关内容