当我使用 \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.idx
LaTeX 写出的内容(稍后由 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"!$}