imakeidx \see 与 \backmatter 发生冲突

imakeidx \see 与 \backmatter 发生冲突

我想知道是否有人可以解释以下 MWE 中发生了什么,其中使用\backmatter将使索引交叉引用(\see\seealso命令)消失;尝试取消注释\backmatter,您就会看到。我从未在使用旧的索引包时遇到过这个问题,但现在我正在享受imakeidx,解决这个问题会很好。提前谢谢!

%!TEX TS-program = xelatex
%!TEX encoding = UTF-8 Unicode

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

\begin{document}
bla bla \index{bla} bla

\newpage
 ...relativity\index{relativity} ... Einstein\index{Einstein, Albert}...bla bla \index{bla} bla bla more bla bla \index{bla} bla

And this is the end of the story.

%\backmatter
\index{scientist|see{Einstein, Albert}}

\printindex

\end{document}

答案1

当命令最终出现在.idx文件中的页面时,就会写入索引条目。\index

为了能够动态编译索引,即使用 MakeIndex 将文件转换.idx.ind包含 LaTeX 指令的文件,当 LaTeX 遇到时imakeidx关闭该文件。.idx\printindex

在您的示例中,\backmatter问题\cleardoublepage,因此 TeX 位于新页面上。该命令\index{scientist|see{Einstein, Albert}}不会在此页面上生成任何框。此后,\printindex关闭.idx文件,因此该\index命令没有机会写入此文件,因为自处理该命令以来尚未发送任何页面。

如果你想在一个地方添加“查看”条目,解决方案是将它们放在 \backmatternoautomatic,或者使用选项禁用 MakeIndex 的自动运行imakeidx(这需要手动运行 MakeIndex 然后重新运行 LaTeX)。

我可能会把它们放在之后\begin{document}或者放在外部文件\input之后\begin{document}

只是作为练习,但不要太认真,这里有一种在之前添加索引交叉引用的方法\printindex

\documentclass{book}
\usepackage{imakeidx}
\usepackage{etoolbox}

\makeindex

\makeatletter
\newenvironment{crossreferences}
 {\patchcmd{\protected@write}{\let\thepage\relax}{}{}{}%
  \patchcmd{\protected@write}{\write}{\immediate\write}{}{}}
 {}{}
\makeatother

\begin{document}
bla bla \index{bla} bla

\newpage
 ...relativity\index{relativity} ... Einstein\index{Einstein, Albert}...bla bla \index{bla} bla bla more bla bla \index{bla} bla

And this is the end of the story.

\backmatter
\begin{crossreferences}
\index{scientist|see{Einstein, Albert}}
\end{crossreferences}

\printindex

\end{document}

crossreferences环境中,\write被更改为,并且删除了\immediate\write的设置。不要在环境中添加“真实”索引条目(无论如何这都没有多大意义)。\protected@write\thepage

相关内容