我正在编写一个包含 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{}
\example
first_script_ex.py
first ̇script ̇ex.py@first_script_ex.py]
显然,我对 (La)TeX 的了解不足以解决这个难题,所以我的问题是:有没有办法将代码条目移动到 Listings 索引中,而不需要 LaTeX 源代码出现在 Listing 标题、(Listings) Listings(或任何其他副作用)中?
(PS:作为一种解决方法,我切换了命名和未命名索引,但我正在寻找合适的解决方案)。