In order to use section numbers instead of page numbers it is necessary to redefine the way, the index entry is written to \jobname.idx
. That is basically easy, if the package imakeidx
is used.
In its manual, imakeidx
the author writes, that \imki@wrindexentry
should be redefined to apply for other styles. Looking into the package, there is a similar command used with \thepage
as argument, so redefined it, using \thesection
.
However, makeindex
as external processor complains about the new format if \thesection
writes its numbers as 1.1
etc., i.e. with dots. Using xindy
solves this problem, by applying a new alphabet or location-class, this is done in sectionindex_xindy.xdy
, as well as removing the ,
separator and inserting -----
instead.
Content of sectionindex_xindy.xdy
(markup-locclass-list :open " ----- " :sep "")
( define-location-class "numericsections"
("arabic-numbers" :sep "." "arabic-numbers"))
( define-location-class "numericchapteralphasections"
("arabic-numbers" :sep "." "ALPHA"))
\documentclass[paper=a4,12pt]{scrbook}
\usepackage{letltxmacro}
\usepackage[xindy]{imakeidx}
%\usepackage{hyperref}% Leads to linking to wrong positions%
\makeatletter
% Global redefinition of indexentry to section instead of page%
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname#1@idxfile\endcsname{}%
{\string\indexentry{#2}{\thesection}}%
}%
\LetLtxMacro{\LaTeXStandardFigure}{\figure}
\let\LaTeXStandardEndFigure\endfigure%
\renewenvironment{figure}[1][tpb]{%
%redefine the index write command to use figure number instead of section number
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname##1@idxfile\endcsname{}%
{\string\indexentry{##2}{\thefigure}}
}%
\LaTeXStandardFigure[#1]%
}{%
\LaTeXStandardEndFigure%
}%
\LetLtxMacro{\LaTeXStandardTable}{\table}
\let\LaTeXStandardEndTable\endtable%
\renewenvironment{table}[1][tpb]{%
%redefine the index write command to use table number instead of section number
\renewcommand{\imki@wrindexentrysplit}[3]{%
\expandafter\protected@write\csname##1@idxfile\endcsname{}%
{\string\indexentry{##2}{\thetable}}
}%
\LaTeXStandardTable[#1]%
}{%
\LaTeXStandardEndTable%
}%
\makeatother
\makeindex[options=-M sectionindex_xindy.xdy]
\renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}}%
\renewcommand{\thesection}{\arabic{chapter}.\Alph{section}}%
\renewcommand{\thetable}{\arabic{chapter}.\arabic{table}}%
\begin{document}
\listoffigures
\listoftables
\chapter{First}
\begin{figure}
\caption{A first figure with index entry, say Figure\index{Figure!First}}
\end{figure}
\section{First section of chapter~\arabic{chapter}}
Here is a table (well, the environment actually)
\begin{table}
\centering
\begin{tabular}{lll}
\hline
A & dummy & table \tabularnewline
\hline
\end{tabular}
\caption{A table with some index entry in it: \index{Table}{First}}
\end{table}
See also the keyword Index\index{Index}
\chapter{Two}
\section{First}
Index\index{Index} and its usage\index{usage}
\begin{figure}
\caption{A dummy figure with an index entry, say DummyFigure\index{Figure!DummyFigure}}
\end{figure}
\printindex
\end{document}
In order to make this work for figures/tables, I just redefined the command again within wrappers for figure
and table
environment. You have redefine \thefigure
and \thetable
explicitly, since it seems, that they introduce a trailing \relax
command just before the figure/table number.
Please note, that this does not work correctly with hyperlinks so far,regarding the figure/table index entries.
Enabling --shell-escape is mandatory.