\newcommand 中的 \index 破坏了 MakeIndex

\newcommand 中的 \index 破坏了 MakeIndex

当我使用 \index 时,一切正常,但是当我使用 \newcommand 时,一些大符号无法显示:

\documentclass[a4paper,openany,12pt]{amsbook}
\usepackage{imakeidx}
\makeindex[name = index, title = Special Index, columns = 3]
%--------------------------------------------------------
\newcommand{\khm}[1]{#1\index[index]{{#1}}}
%--------------------------------------------------------
\begin{document}
\khm{$\bigcup$} \khm{$<$}
\printindex[index]
\end{document}

以上只是展示$<$ not $\bigcup$。你能帮忙吗?

答案1

如果你查看index.idxLaTeX 写出的内容(稍后由 MakeIndex 处理),你会发现

\indexentry{{$\DOTSB \bigcup@ \slimits@ $}}{1}
\indexentry{{$<$}}{1}

会发生什么?当\index位于外层时,它会进入“半逐字”模式,因此\index{$\bigcup$}可以这样写

\indexentry{$\bigcup$}{1}

具体来说,传递给最终\write操作的是字符串\bigcup,而不是命令。

而你的情况是,标记$\bigcup$已经形成,“半逐字”模式什么都做不了。而且 TeX 会在 期间执行宏扩展\write

解决方案:

\documentclass[a4paper,openany,12pt]{amsbook}
\usepackage{imakeidx}

\makeindex[name = index, title = Special Index, columns = 3]

\newcommand{\khm}[1]{#1\index[index]{\unexpanded{\unexpanded{#1}}}}

\begin{document}

\khm{$\bigcup$} \khm{$<$}

\printindex[index]

\end{document}

您需要两个\unexpanded,因为 TeX 会尝试扩展两次。

该文件的内容.idx现在是

\indexentry{$\bigcup $}{1}
\indexentry{$<$}{1}

并且.ind文件将是

\begin{theindex}

  \item $<$, 1
  \item $\bigcup $, 1

\end{theindex}

关于\exists!,您必须考虑到这!是 MakeIndex 的特殊字符,必须加引号。您可能会选择

\newcommand{\khm}[1]{%
  \begingroup\mathcode`"="8000\relax
  \begingroup\lccode`~=`"\lowercase{\endgroup\let~}\relax
  #1\endgroup\index[index]{\unexpanded{\unexpanded{#1}}}}

以便

\khm{$\exists"!$}

会按预期工作。但对于这种特殊情况,这样做更容易、更可靠

$\exists!$\index[index]{$\exists"!$}

相关内容