使用 imakeidx 和宏在第二个索引中列出代码

使用 imakeidx 和宏在第二个索引中列出代码

我正在编写一个包含 Python 代码的 LaTeX 文档,我使用 Listings 包通过名为 的宏将其包含在内\example{}。它使用另一个名为 的宏,\code{}该宏也使用 Listings 包来完成基本操作\texttt{},但无需转义下划线(例如在文件名中)。 \example{base_name}{description}获取文件的基本名称和简短说明,然后将其扩展为完整文件名base_name_ex.py(用于代码示例;我有类似的宏来包含其他代码片段),在 中包含文件Python/base_name_ex.py,创建标题\code{base_name_ex.py}: description.并创建索引条目base_name_ex.py@\code{base_name_ex.py}。此外,我想创建一个(列表)列表。这在下面的最小工作示例中显示并且可以工作:first_script_ex.py显示在总索引和(清单)列表。

\documentclass{article}
\usepackage{listings}

\usepackage{imakeidx}
\makeindex[title=General index, options=-s mwe]   % Use Index style in mwe.ist
\makeindex[name=codidx, title=Index of Listings, options=-s mwe]

\newcommand{\code}[1]{\lstinline[basicstyle=\ttfamily]{#1}}  % Print code inline

% Include code example, create caption with file name and create index entry:
\newcommand{\example}[2]{\lstinputlisting[caption={\code{#1_ex.py}:
    #2.\index{\detokenize{#1_ex.py}@\code{#1_ex.py}}}]{Python/#1_ex.py}}

\begin{document}
\section{Test}

\example{first_script}{a first Python script}

Test entry 1\index{Test entry 1}  % General index
Test entry 2\index[codidx]{Test entry 2}  % Index of Listings
Test entry 3\index[codidx]{\code{Test entry 3}}  % Index of Listing, but as Symbol

\printindex[codidx]
\lstlistoflistings
\printindex
\end{document}

mwe.ist显示索引标题,告诉我某个条目是否列在正确的字母表字母下,或者符号

headings_flag 1 
heading_prefix "\\Huge\\rmfamily\\noindent\\textbf{"heading_suffix "}\\nopagebreak"
item_0 "\n \\item \\normalsize "

当我希望代码清单出现在第二个索引中时,就会出现问题(也许是为了替换清单列表,但我现在想要两者)。因此,我使用该imakeidx包并创建一个总索引以及列表索引,名为codidx。但是,当我在 的定义中[codidx]添加时,糟糕的事情就开始发生了。经过一次编译,条目从常规移动到 Listings 索引,如预期的那样,但文档正文中的 Listing 标题被添加到其中。经过第二次编译,Listings 中的条目在“script.”之后被添加“codidx”。\index{}\examplefirst_script_ex.pyfirst ̇script ̇ex.py@first_script_ex.py]

显然,我对 (La)TeX 的了解不足以解决这个难题,所以我的问题是:有没有办法将代码条目移动到 Listings 索引中,而不需要 LaTeX 源代码出现在 Listing 标题、(Listings) Listings(或任何其他副作用)中?

(PS:作为一种解决方法,我切换了命名和未命名索引,但我正在寻找合适的解决方案)。

相关内容