生成索引时出错

生成索引时出错

.ilg文件充满错误,并且不\index接受任何命令。

This is makeindex, version 2.15 [TeX Live 2011] (kpathsea + Thai support).
Scanning input file thesis.idx...
!! Input index error (file = thesis.idx, line = 1):
   -- Illegal page number \thepage.
...
   -- Illegal page number \thepage.
!! Input index error (file = thesis.idx, line = 28):
   -- Illegal page number \thepage.
done (0 entries accepted, 28 rejected).
Nothing written in thesis.ind.
Transcript written in thesis.ilg.

\makeindex在 document 之前发出,并且\printindex重新定义命令(并在 之后的末尾发出\bibliography)。

\let\my@prnt@nd@x\printindex
\renewcommandx\printindex{%
  \cleardoublepage%
  \addcontentsline{toc}{chapter}{\indexname}%
  \my@prnt@nd@x%
}

.idx文件包含以下行(以及其他内容):

...
\indexentry{oscila\textcommabelow tie,~ecua\textcommabelow tie}{\thepage }
\indexentry{natural~numbers}{\thepage }
\indexentry{category,!balanced~definition}{\thepage }
...

由于某些原因,在课堂上.dtx,我重新定义了\protected@write似乎被使用的内容\@wrindex

% \begin{macro}{\protected@write}
% \begin{macro}{\protected@write@immediate}
% \begin{macro}{\immediateaddtocontents}
% \begin{macro}{\addtocontentsline}
%    \begin{macrocode}
% redefine \protected@write to use \protected@write@immediate below
\long\def\protected@write#1#2#3{\protected@write@immediate#1{#3}[#2]}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Code borrowed from `multitoc.dtx' CTAN /macros/latex/contrib/ms %%
%%% Copyright [1998..1999]  Martin Schr\"oder. All rights reserved. %%
% \write with appropriate handling of |\protect| and |\thepage|; args:
% an output stream, some text to write, and some initialization code.
\newcommandx*\protected@write@immediate[3][3]{%
  \begingroup
    \let\thepage\relax
    #3%
    \let\protect\string
    \edef\reserved@a{\immediate\write#1{#2}}%
    \reserved@a
  \endgroup
  \if@nobreak\ifvmode\nobreak\fi\fi%
}
%%%                                                                 %%
%%%                                                                 %%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}

参考书目后只有一个空白页,通常我会在下一页中列出所有索引条目,但是什么都没有生成;非常感谢任何帮助或修复。谢谢。

答案1

应该有非常好为什么要进行全部写入的原因\immediate。出于多种原因,这通常是错误的做法。以下是其中之一。

假设您要制作目录,这在 LaTeX 文档中很常见。假设目录中的列表深度至少为 1,以便包含章节。假设在 TeX 尚未完成一页时找到了章节标题,但当它完成与此操作相关的任务时,它意识到必须将章节标题移动到下一页。

问题在于:辅助文件中的目录条目已经写入。并且它将错误的,落后一分。

对于延迟写入,只有当章节标题实际出现在页面中时才会写入条目。因此,执行所有写入\immediate显然是错误的;索引也会出现同样的情况,因为 TeX 可能会在最终出现在下一页的行中找到要索引的条目。

如果你读过 的文档multitoc,你会看到 的代码\immediateaddtocontents(使用\protected@write@immediate)是为了添加一些东西没有页码。这就是 Martin Schröder 这样做的原因\let\thepage\relax:标记\thepage变得不可扩展,并且将被逐字写入辅助文件(并且连续使用的宏将吞噬它)。

对于索引生成来说必须是可扩展的,否则你会得到(正如你确实得到的\thepage.idx,这毫无用处:您将失去条目和页码之间的关联。但删除该指令是不够的:写入操作必须不是立即。


顺便说一下,有一种更简单的方法可以使所有写入操作立即执行:

\let\@@write\write
\def\write{\immediate\@@write}

(双\immediate前缀相当于一)。

相关内容