csname在、、和其他各种 sty 文件\@indexfile
中使用。但每次我尝试访问它时,它都是未定义的。如您所见,我正在使用和。我遗漏了什么?source2e
makeidx
hyperref
amsidx
\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 命令一起使用以指向正确的索引。