![imakeidx \see 与 \backmatter 发生冲突](https://linux22.com/image/306844/imakeidx%20%5Csee%20%E4%B8%8E%20%5Cbackmatter%20%E5%8F%91%E7%94%9F%E5%86%B2%E7%AA%81.png)
我想知道是否有人可以解释以下 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
命令没有机会写入此文件,因为自处理该命令以来尚未发送任何页面。
如果你想在一个地方添加“查看”条目,解决方案是将它们放在前 \backmatter
noautomatic
,或者使用选项禁用 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