imakeidx 带有章节名称而不是页码或节号

imakeidx 带有章节名称而不是页码或节号

我想让 imakeidx 显示章节名称(或章节、小节等),而不是页码。可以吗?

我以为这会很容易,改变部分\这一页在下面,但我找不到如何更改它。

\documentclass[a5paper,11pt]{book}

\makeatletter
\usepackage{imakeidx}
\renewcommand{\imki@wrindexentrysplit}[3]{%
 \expandafter\protected@write\csname#1@idxfile\endcsname{}%
    {\string\indexentry{#2}{s\arabic{section},p\thepage}}%
}
\makeatother
\makeindex

\begin{document}

\section{Name for the index}

Thanks \index{thanks}

\printindex

\end{document}

答案1

这是我的一点小小尝试。欢迎大家改进。

此方法仅在您有编号的章节和节时才有效。因为存储节名称的临时宏“ \tempsn\alph{chapter}\alph{section}”是根据章节和节的计数器命名的。并且章节总数和一章内的节数不超过 26。

使用etoolboxpatch\@sect命令定义一个宏来存储章节名称。宏的名称基于章节和章节的当前计数器(例如,当在第 2 章第 3 节中时,宏名称为\tampsnbc)。

然后\renewcommand{\imki@wrindexentrysplit},使用 用定义的宏替换页码\csname tampsn\alph{chapter}\alph{section}\endcsname。我还以“chapter.section”的形式更改了章节编号。我认为这更容易找到此索引属于哪个章节。现在索引如下所示:

在此处输入图片描述

代码:

\documentclass[a5paper,11pt]{book}
\usepackage{etoolbox}
\usepackage{imakeidx}


\makeatletter
\patchcmd{\@sect}{\csname #1mark\endcsname{#7}}{\csname #1mark\endcsname{#7}\expandafter\expandafter\def\csname tempsn\alph{chapter}\alph{#1}\endcsname{#7}}{}{}


\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname#1@idxfile\endcsname{}%
{\string\indexentry{#2}%
{s\thesection:\string\kern1ex\expandafter\string\csname tempsn\alph{chapter}\alph{section}\endcsname}}%
}
\makeatother
\makeindex

\begin{document}
\tableofcontents
\chapter{Example one}
\section{Name for the index}
Thanks\index{thank you}

\clearpage
\chapter{Example two}
\section{A Long Long Long Long Long Long Name for the index}
Test\index{Zeta}
\section{new section}
New Test\index{alph}
\clearpage

\printindex

\end{document}

相关内容