imakeidx \index 扩展宏;makeindex 拒绝一切

imakeidx \index 扩展宏;makeindex 拒绝一切

我有以下这个最小(ish)示例。这是一本技术书籍,其中包含大量代码示例和大量出现在运行文本中的代码关键字。因此,我有以下目标:

  • \code{foo}用于在运行文本中排版代码关键字的宏。我listings始终使用该包来排版代码。我也使用该underscore包,这样我就不必在代码中转义下划线了。
  • 我使用该hyperref包进行交叉引用,加上章节标题中出现的大量代码关键字;所以我\texorpdfstring在定义中使用\code
  • 两个索引:一个主要的“索引”用于英语单词和概念,另一个是“代码示例索引”。我听说这个imakeidx包是这方面的最标准选择,所以我正在使用它。如果它们能解决我的问题,我愿意接受其他选择。
  • 许多复杂的索引词。有些词必须用 排版\code{foo}。有些必须是次要条目,例如“ iterator, std::vector::: 参见vector::iterator”。

麦克埃特克斯

\documentclass[ebook,10pt,oneside,final]{memoir}

\usepackage{imakeidx}
\makeindex[name=mce,intoc,columns=2]
\makeindex[name=code,intoc,columns=2,name=code,title=Index of code samples]

\usepackage[final]{listings}
\usepackage{hyperref}
\usepackage{underscore}

\newcommand{\code}[1]{\texorpdfstring{\mbox{\lstinline[basicstyle=\ttfamily]`#1`}}{#1}}

\newcommand{\codeblockdefines}[1]{\index[code]{#1@\code{#1}}}  % for example, \codeblockdefines{list_of_int}
\newcommand{\codeindex}[1]{\index{#1@\code{#1}}}  % for example, \codeindex{const_iterator}
\newcommand{\codeindexstd}[1]{\index{namespace std@\code{namespace std}!#1@\code{#1}}}  % for example, \codeindexstd{vector}

\begin{document}

\tableofcontents

Here's an example of using \code{std::vector}.
\codeindexstd{vector}
\codeindex{std::vector}
\codeblockdefines{vector}

\index{std@\code{std}|see {namespace std@\code{namespace std}}}

\printindex[mce]
\printindex[code]

\end{document}

我看到的问题是,\code也许一些其他宏在 .idx 文件中被扩展了。当我 cat 这些文件时,我看到了以下内容:

目录

\indexentry{namespace std@\unhbox \voidb@x \hbox {\lstinline [basicstyle=\ttfamily  ]`namespace std`}!vector@\unhbox \voidb@x \hbox {\lstinline [basicstyle=\ttfamily  ]`vector`}|hyperpage}{1}
\indexentry{std::vector@\unhbox \voidb@x \hbox {\lstinline [basicstyle=\ttfamily  ]`std::vector`}|hyperpage}{1}
\indexentry{std@\code{std}|hyperindexformat{\see {namespace std@\code{namespace std}}}}{1}

代码.idx

\indexentry{vector@\unhbox \voidb@x \hbox {\lstinline [basicstyle=\ttfamily  ]`vector`}|hyperpage}{1}

我怎样才能使\index其余的便利宏(\codeblockdefines、、 )\codeindex按照\codeindexstd我的要求运行?

答案1

imakeidx应该加载 hyperref。但是,你的\code命令是非常虽然它使用起来很脆弱\lstinline,但应该“坚固”。

\documentclass[ebook,10pt,oneside,final]{memoir}

\usepackage[final]{listings}
\usepackage{imakeidx}
\usepackage{underscore}
\usepackage{etoolbox}
\usepackage{hyperref}

\makeindex[name=mce,intoc,columns=2]
\makeindex[name=code,intoc,columns=2,name=code,title=Index of code samples]

\newrobustcmd{\code}[1]{\texorpdfstring{\mbox{\lstinline[basicstyle=\ttfamily]{#1}}}{#1}}

\newcommand{\codeblockdefines}[1]{\index[code]{#1@\code{#1}}}  % for example, \codeblockdefines{list_of_int}
\newcommand{\codeindex}[1]{\index[mce]{#1@\code{#1}}}  % for example, \codeindex{const_iterator}
\newcommand{\codeindexstd}[1]{\index[mce]{namespace std@\code{namespace std}!#1@\code{#1}}}  % for example, \codeindexstd{vector}

\begin{document}

\tableofcontents

Here's an example of using \code{std::vector}.
\codeindexstd{vector}
\codeindex{std::vector}
\codeblockdefines{vector}

\index{std@\code{std}|see {namespace std@\code{namespace std}}}

\printindex[mce]
\printindex[code]

\end{document}

我改变了\codeindex\codeindexstd命令以指向定义的索引。

code.idx文件将包含

\indexentry{vector@\code {vector}|hyperpage}{1}

mce.idx包含

\indexentry{namespace std@\code {namespace std}!vector@\code {vector}|hyperpage}{1}
\indexentry{std::vector@\code {std::vector}|hyperpage}{1}

这些参赛作品并没有被拒绝。

相关内容