我曾经amsmidx
创建一个单独的符号索引。
\usepackage{amsmidx}
\makeindex{idx}
\makeindex{nidx}
\newcommand{\idx}[1]{\index{idx}{#1}}
\newcommand{\nidx}[1]{\index{nidx}{#1}}
我需要索引像$\int_{\mathcal{D}}$
,这样的符号$\int^{\underline{\mathcal{D}}}$
(即结尾、丰富的 coend)。但这样做会破坏一切。如果我输入
\nidx{$\int^{\mathcal{C}}$}
然后运行makeindex nidx
,它会接受,但在下一次传递时,我被告知缺少$
。事实上,当我查看文件时,nidx.ind
我看到
\item ^{\mathcal {C}}$, 6
我认为问题可能是makeindex
不知道如何按字母顺序排列这些条目,但是
\nidx{int@$\int^{\mathcal{C}}$}
导致makeindex nidx
拒绝该条目。(但至少其他一切都可以编译。)
知道发生什么问题了吗?
答案1
宏\index
尽量不扩展其参数,但如果您将其作为参数提供给另一个命令,则此保护不再起作用;您应该这样做
\newcommand{\idx}{\index{idx}}
\newcommand{\nidx}{\index{nidx}}
这样调用\nidx{int@$\int$}
将首先转换为
\index{nidx}{int@$\int$}
但没有吸收主要论点;现在\index
将正确应用其保护机制。
当然,如果\nidx{int@$\int$}
被埋没作为另一个命令的参数,问题可能会再次出现;在这种情况下,我希望很少见,用\protect\int
代替\int
。
如果索引条目出现在命令的参数中,还有哪些命令需要这种保护?很难列出清单;当然\mathcal
不需要,但\int
确实\underline
需要。只需查看生成的idx
文件,就会很明显地知道哪些命令需要保护。