%%
%% repeatindex.sty
%%
%% Copyright 2001  Harald Harders (h.harders@tu-bs.de)
%% License is LPPL.
%%
%%
%% This Package repeats item of an index if a page or column
%% break occurs within a list of subitems. 
%% This helps to find out to which main item a subitem belongs.
%%
%% Example:
%%
%%    Main Item A, 1, 3, 6             Main Item A...
%%       Subitem a, 1                      Subitem g, 1
%%       Subitem b, 1                      Subitem h, 1
%%       Subitem c, 2                      Subitem i, 1
%%       Subitem d, 3                      Subitem j, 1
%%       Subitem d, 1                  Main Item B, 3, 6
%%       Subitem e, 4                      Subitem a, 3
%%       Subitem f, 2                      Subitem b, 4
%%
%% To get that behaviour you have to include the package into your
%% document using  \usepackage{repeatindex}, and you have to produce
%% the .ind file in a special format in which the entries of the \item
%% are enclosed in [...] (example:   \item [Main Item A], 1, 3, 6  ).
%% This can be achieved using repeatindex.ist:
%%     makeindex -s repeatindex  file
%%
%% Problems:
%% - When an item is repeated a small vertical space is included two
%%   items later
%% - If the last item is a subitem and the only entry on the last page
%%   of the index the repeation is omitted
%%
%% This package has not been tested much, yet. Please help me to find
%% more problems and if possible solutions to my problems.
%% I have had much trouble in solving the problem that the code
%% defined in afterpage is executed with a delay.
%%
%% Harald Harders, 2001/10/13
%% h.harders@tu-bs.de
%%
\ProvidesPackage{repeatindex}[2001/10/13 v0.01 Repeats index entries]
% Write text at page and column breaks
\RequirePackage{afterpage}
% Include Index stuff
\RequirePackage{makeidx}

% Command that replaces all contents of afterpage
\long\def\hhafterpage#1{%
  \gdef\AP@{{#1\par}}%
  \global\output{%
    \the\AP@output
    \ifnum\outputpenalty>-\@Mi
      \global\output\expandafter{\the\AP@output}%
      \aftergroup\AP@@
    \fi}%
}

% Entry to be repeated
% temporary variable
\def\@entry{}%
% final variable
\def\@@entry{}%

\def\@hhempty{\@empty}

\def\entryprefix{\itshape}
\def\entrypostfix{\dots}

\AtBeginDocument{%
  % Save original item commands
  \let\orig@idxitem\@idxitem
  \let\orig@subitem\subitem
  \let\orig@subsubitem\subsubitem
  %
  % New \item command, has to be used "\item [entry], pages"
  \renewcommand{\@idxitem}[1][\@empty]{%
    % call original command
    \orig@idxitem #1%
    % save entry in \@arg
    \def\@arg{#1}%
    \ifx\@arg\@hhempty
    \else
      % if entry not empty (which is the case if called by \subitem or
      % \subsubitem) copy entry to \@entry
      \xdef\@entry{#1}%
      % Delete the contents to be repeated
      \hhafterpage{}%
    \fi
  }%
  %
  % New \subitem command, to be used as usual
  \renewcommand{\subitem}{%
    % call original command
    \orig@subitem
    % set the contents to be repeated on the next page
    \expandafter\hhafterpage\expandafter{\expandafter\par\expandafter{%
        \expandafter\expandafter\entryprefix\@@entry\entrypostfix}}%
    % copy \@entry to \@@entry. This is done to delay the entry to be
    % put onto the page, due to a strange behaviour of afterpage (some
    % text of the next page is executed before the afterpage text is
    % put onto the page).
    \xdef\@@entry{\@entry}%
  }%
  %
  % New \subsubitem command, to be used as usual
  \renewcommand{\subsubitem}{%
    % call original command
    \orig@subsubitem
    % set the contents to be repeated on the next page
    \expandafter\hhafterpage\expandafter{\expandafter\par\expandafter{%
        \expandafter\expandafter\itshape\@@entry\dots}}%
    % copy \@entry to \@@entry. This is done to delay the entry to be
    % put onto the page, due to a strange behaviour of afterpage (some
    % text of the next page is executed before the afterpage text is
    % put onto the page).
    \xdef\@@entry{\@entry}%
  }%
  %
  % Copy original end of the theindex environment
  \let\orig@endtheindex\endtheindex
  % Redefine end of the theindex environment
  \renewcommand{\endtheindex}{%
    % switch off repeation
    \hhafterpage{}%
    % call original command
    \orig@endtheindex
  }%
%
}

\endinput
