当在 newcommand 中使用数学模式时,makeindex“在第一个参数的位置 n 处有额外的 `@'”

当在 newcommand 中使用数学模式时,makeindex“在第一个参数的位置 n 处有额外的 `@'”

我长期使用 LaTeX,多年来这个论坛一直非常有用。我总是在这里找到答案,除了这一次。

我正在尝试创建一个新命令来定义一些数学符号。该命令定义了一个宏,当使用该符号时,该宏会使用 \index{}。它在大多数情况下都有效。但是,有些数学符号会生成额外的 @ 字符,makeindex 无法识别这些符号。

我知道这个问题与以下问题类似(但不同)问题 254977,但我无法使该解决方案适应这种情况。

这是一个示例 test.tex 文件:

% arara: pdflatex: { synctex: on } 
% arara: makeindex 
% arara: pdflatex: { synctex: on } 
\documentclass{article}
\usepackage{amsmath,amssymb,mathrsfs,makeidx}
\makeindex

\newcommand{\MKMathSymbol}[4]{%
    \expandafter\newcommand\csname #1\endcsname{\ensuremath{#2}\index{#4!#3@\ensuremath{#2}}}
        %%% More stuff in here (glossaries, etc.)
}

\MKMathSymbol{TestOne}{\widehat{\varphi}}{phi}{Type A}
\MKMathSymbol{TestTwo}{\widehat{\mathscr{A}}}{A}{Type A}
\MKMathSymbol{TestThree}{\widehat{d_C}}{dCw}{Type B}
\MKMathSymbol{TestFour}{{\prod}}{P}{Type B}

\begin{document}
Outside math mode (\TestOne, \TestTwo, \TestThree, \TestFour). 
\clearpage 
Inside math mode  ($\TestOne$, $\TestTwo$, $\TestThree$, $\TestFour$). 
\clearpage 
Inside macro: (\emph{\TestOne, \TestTwo, \TestThree, \TestFour}).

Let now print the index:
\printindex
\end{document}

makeindex(test.ilg 文件)的输出包含以下内容:

This is makeindex, version 2.15 [MiKTeX 2.9.6100 64-bit] (kpathsea + Thai support).
Scanning input file test.idx...
!! Input index error (file = test.idx, line = 1):
   -- Extra `@' at position 36 of first argument.
 . . .
 . . .
done (0 entries accepted, 12 rejected).
Nothing written in test.ind.
Transcript written in test.ilg.

文件 text.idx 将包含如下条目:

\indexentry{Type A!phi@\ensuremath  {\setbox \z@ \hbox {\frozen@everymath \@emptytoks \mathsurround \z@ $\textstyle \varphi $}\mathaccent "0362{\varphi }}}{1}
\indexentry{Type A!A@\ensuremath  {\setbox \z@ \hbox {\frozen@everymath \@emptytoks \mathsurround \z@ $\textstyle \mathscr  {A}$}\mathaccent "0362{\mathscr  {A}}}}{1}
\indexentry{Type B!dCw@\ensuremath  {\setbox \z@ \hbox {\frozen@everymath \@emptytoks \mathsurround \z@ $\textstyle d_C$}\mathaccent "0362{d_C}}}{1}
\indexentry{Type B!P@\ensuremath  {{\DOTSB \prod@ \slimits@ }}}{1}

生成的 pdf 文件不会打印索引,因为 test.ind 为空。那么,问题是我该如何实现它?我尝试了几种方法,但似乎都不起作用。

答案1

使用\unexpanded

\documentclass{article}
\usepackage{amsmath,amssymb,mathrsfs,makeidx}
\makeindex

\newcommand{\MKMathSymbol}[4]{%
  \expandafter\newcommand\csname #1\endcsname{%
    \ensuremath{#2}\index{#4!#3@\unexpanded{\unexpanded{\ensuremath{#2}}}}%
    %%% More stuff in here (glossaries, etc.)
  }%
}

\MKMathSymbol{TestOne}{\widehat{\varphi}}{phi}{Type A}
\MKMathSymbol{TestTwo}{\widehat{\mathscr{A}}}{A}{Type A}
\MKMathSymbol{TestThree}{\widehat{d_C}}{dCw}{Type B}
\MKMathSymbol{TestFour}{\prod}{P}{Type B}

\begin{document}
Outside math mode (\TestOne, \TestTwo, \TestThree, \TestFour). 
\clearpage 
Inside math mode  ($\TestOne$, $\TestTwo$, $\TestThree$, $\TestFour$). 
\clearpage 
Inside macro: (\emph{\TestOne, \TestTwo, \TestThree, \TestFour}).

Let now print the index:
\printindex
\end{document}

.idx以下是文件的内容

\indexentry{Type A!phi@\ensuremath {\widehat {\varphi }}}{1}
\indexentry{Type A!A@\ensuremath {\widehat {\mathscr {A}}}}{1}
\indexentry{Type B!dCw@\ensuremath {\widehat {d_C}}}{1}
\indexentry{Type B!P@\ensuremath {\prod }}{1}
\indexentry{Type A!phi@\ensuremath {\widehat {\varphi }}}{2}
\indexentry{Type A!A@\ensuremath {\widehat {\mathscr {A}}}}{2}
\indexentry{Type B!dCw@\ensuremath {\widehat {d_C}}}{2}
\indexentry{Type B!P@\ensuremath {\prod }}{2}
\indexentry{Type A!phi@\ensuremath {\widehat {\varphi }}}{3}
\indexentry{Type A!A@\ensuremath {\widehat {\mathscr {A}}}}{3}
\indexentry{Type B!dCw@\ensuremath {\widehat {d_C}}}{3}
\indexentry{Type B!P@\ensuremath {\prod }}{3}

答案2

您正在查看 latex 书中术语中命令“移动参数中的脆弱命令”的内部扩展。使用

\MKMathSymbol{TestOne}{\protect\widehat{\varphi}}{phi}{Type A}
\MKMathSymbol{TestTwo}{\protect\widehat{\mathscr{A}}}{A}{Type A}
\MKMathSymbol{TestThree}{\protect\widehat{d_C}}{dCw}{Type B}
\MKMathSymbol{TestFour}{{\protect\prod}}{P}{Type B}

然后索引

\indexentry{Type A!phi@\ensuremath  {\widehat {\varphi }}}{1}
\indexentry{Type A!A@\ensuremath  {\widehat {\mathscr  {A}}}}{1}
\indexentry{Type B!dCw@\ensuremath  {\widehat {d_C}}}{1}
\indexentry{Type B!P@\ensuremath  {{\prod }}}{1}
\indexentry{Type A!phi@\ensuremath  {\widehat {\varphi }}}{2}
\indexentry{Type A!A@\ensuremath  {\widehat {\mathscr  {A}}}}{2}
\indexentry{Type B!dCw@\ensuremath  {\widehat {d_C}}}{2}
\indexentry{Type B!P@\ensuremath  {{\prod }}}{2}
\indexentry{Type A!phi@\ensuremath  {\widehat {\varphi }}}{3}
\indexentry{Type A!A@\ensuremath  {\widehat {\mathscr  {A}}}}{3}
\indexentry{Type B!dCw@\ensuremath  {\widehat {d_C}}}{3}
\indexentry{Type B!P@\ensuremath  {{\prod }}}{3}

相关内容