我想让 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。
使用etoolbox
patch\@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}