我正在编写一份技术报告,其中使用整合了大量代码listings
。
我想keywords
在列表中添加使用的索引(使用index=[1][keywords]
),但在索引中仅报告第一的提到该关键词的页面——因为我在文中就是在那里介绍它的。
考虑一下这个MWE:
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{listings}
\usepackage{makeidx}
\makeindex
\lstdefinelanguage{minion}{ % define the "minion language", known for its semantic complexity
morekeywords={bello,banana} % keywords for the "minion language"
}
\lstset{language=minion, % settings for the language
frame=single, % box arround the code
keywordstyle=\color{YellowOrange},
index=[1][keywords]% index the keywords
}
\begin{document}
We introduce the commands \lstinline!bello! and \lstinline!banana!
\begin{lstlisting}
say(bello)
eat(banana)
\end{lstlisting}
\newpage
\begin{lstlisting}
bello
\end{lstlisting}
\printindex
\end{document}
使用makeidx
并\printindex
创建索引每一页其中列表中提到了给定的关键字(例如,bello
在索引的第 1 页和第 2 页中报告)。
我想显示仅包含第一的其中提到任何给定关键字的页面(即,bello
在banana
示例中仅在第 1 页)。
我很确定一定有一个简单的解决方案,但却找不到。
答案1
应该有一个解决方案indexstyle
,但是手册对这个问题的描述相当隐晦。
\documentclass{article}
\usepackage[dvipsnames]{xcolor}
\usepackage{listings}
\usepackage{imakeidx}
\makeindex
\lstdefinelanguage{minion}{ % define the "minion language", known for its semantic complexity
morekeywords={bello,banana} % keywords for the "minion language"
}
\lstset{language=minion, % settings for the language
frame=single, % box around the code
keywordstyle=\color{YellowOrange},
index=[1][keywords]% index the keywords
}
\renewcommand{\lstindexmacro}[1]{%
\ifcsname alreadyindexed#1\endcsname
% do nothing, the keyword has already been indexed
\else
% globally define the stopper macro
\global\expandafter\let\csname alreadyindexed#1\endcsname\empty
% index the keyword
\index{#1@\texttt{#1}}%
\fi
}
\begin{document}
We introduce the commands \lstinline!bello! and \lstinline!banana!
\newpage
\begin{lstlisting}
say(bello)
eat(banana)
\end{lstlisting}
\newpage
\begin{lstlisting}
bello
\end{lstlisting}
\printindex
\end{document}
这是生成的.idx
文件
\indexentry{bello@\texttt {bello}}{1}
\indexentry{banana@\texttt {banana}}{1}