我长期使用 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}