makeindex 和 fourier 的 mathbb

makeindex 和 fourier 的 mathbb

在下面的示例文档中,第二个索引条目产生警告

!! 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是逐字读取的,但这在另一个命令的参数中不起作用。

相关内容