在下面的示例文档中,第二个索引条目产生警告
!! Input index error (file = j.idx, line = 2):
-- Extra `@' at position 11 of first argument.
运行makeglossaries
对应
\indexentry{A@\( \mathbb A \)}{1}
\indexentry{R@\( \math@bb R \)}{1}
\indexentry{B@\( B \)}{1}
在.idx
文件中。结果,第二个条目被拒绝,并且不会出现在.ind
文件或索引中。
如第一项所示,一种解决方法是将\index
命令移出\emph
。但将fourier
包替换为amssymb
表明通常没有必要这样做。
有没有办法修改包的行为fourier
以便这样的索引条目在里面起作用\emph
?
\documentclass{article}
\usepackage{fourier}
%\usepackage{amssymb}
\usepackage{makeidx}
\makeindex
\begin{document}
The \index{A@\( \mathbb A \)}%
\emph{\index{R@\( \mathbb R \)}%
\index{B@\( B \)}real numbers \( \mathbb R \)}.
\printindex
\end{document}
答案1
由于某些原因,fourier.sty
不做
\DeclareSymbolFontAlphabet{\mathbb}{Ufutm}
但
\DeclareSymbolFontAlphabet{\math@bb}{Ufutm}
\AtBeginDocument{%
\let\mathbb\math@bb
[...<code omitted>...]
}
因此第一级扩展\mathbb
变为\protect\math@bb
,并且后者宏名写入.idx
文件中。
解决方法:
\documentclass{article}
\usepackage{fourier}
\makeatletter
\AtBeginDocument{\protected\def\mathbb{\math@bb}}
\makeatother
\usepackage{makeidx}
\makeindex
\begin{document}
The \index{A@\( \mathbb{A} \)}%
\emph{\index{R@\( \mathbb{R} \)}%
\index{B@\( B \)}real numbers \( \mathbb{R} \)}.
\printindex
\end{document}
这是.idx
文件
\indexentry{A@\( \mathbb{A} \)}{1}
\indexentry{R@\( \mathbb {R} \)}{1}
\indexentry{B@\( B \)}{1}
\index
但是请注意,对于宏参数内的命令,您通常会面临不同的输入风险。
如果可以的话,避免这样做。否则
\newcommand{\asindex}[1]{\index{#1}}
或者当命令位于另一个命令的参数中时,将其添加到\string
参数中的控制序列前面。\index
答案2
您可以使用
\emph{\index{R@\( \protect\mathbb R \)}%
通常\index
是逐字读取的,但这在另一个命令的参数中不起作用。