该.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
前缀相当于一)。