我有以下这个最小(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}
这些参赛作品并没有被拒绝。