\documentclass[ngerman,12]{dtk}

\author{Heiko Oberdiek\and Herbert Voß}
\title{Index mit Fortsetzungsanzeige}

\address{Herbert}{Voß}{Wasgenstraße 21\\14129 Berlin\\\protect\url{herbert@dante.de}}
\address{Heiko}{Oberdiek}%
        {Kroppenstück 9\\77880 Sasbach\\
         \protect\url{heiko.oberdiek@googlemail.com}}


\begin{document}
\maketitle

\begin{abstract}
Mit den Paketen \Package{fancyhdr} oder \Package{scrpage2} kann für einen Index in der Kopfzeile
der jeweilige Buchstabenbereich der Seite ausgegeben werden. Wenn zusätzlich auf einer Seite
angegeben werden soll, dass es eine Fortsetzung des Buchstabens der vorhergehenden Seite ist,
so ist einiger Aufwand zu treiben.
\end{abstract}


\section{Stildatei für den Index}
Normalerweise bekommen Stildateien für die Anwendung von \Program{makeindex} die
Endung \texttt{ist}. Handelt es sich jedoch um spezielle Anwendungs- oder
Testfälle, so empfiehlt es sich, die Möglichkeit einer \texttt{mst}-Variante
zu nutzen; existiert im aktuellen Dokumentverzeichnis eine Datei mit gleichem Basisnamen
und der Endung \texttt{mst} so wird diese automatisch von \Program{makeindex} 
berücksichtigt, ohne dass diese über den Parameter \texttt{-s} explizit beim
Aufruf von \Program{makeindex} anzugeben ist. Die hier zu verwendende Stildatei
wird daher auch einfach über die Umgebung \Environment{filecontents} herausgeschrieben:

\begin{lstlisting}
\begin{filecontents}{Voss0-demo.mst}
headings_flag 1
heading_prefix "\\IndexHead{"
heading_suffix "}"
\end{filecontents}
\end{lstlisting}


Für den Index ist standardmäßig das Paket \Package{makeidx} zu laden und anschließend 
 der Befehls \Macro{makeindex} auszuführen:

\begin{lstlisting}
\usepackage{makeidx}
\makeindex
\end{lstlisting}



\frame{\includegraphics[page=8,width=0.33\linewidth]{voss/Voss0-demo}}\hfill
\frame{\includegraphics[page=9,width=0.33\linewidth]{voss/Voss0-demo}}\hfill
\frame{\includegraphics[page=10,width=0.33\linewidth]{voss/Voss0-demo}}




\section{Kopfzeilen}

Das obige Beispiel wurde mit dem Paket \Package{fancyhdr} realisiert, obwohl Gleiches
auch mit dem Paket \Package{scrpage2} aus dem KOMA-Script-Projekt möglich wäre. Hier
wird nur die Definition für die Kopfzeile des Index vorgenommen. Soll sich diese auf eine im normalen Text
vorhandene Kopfzeile beziehen, so ist der folgende Code entsprechend zu ändern. Die Fußzeile
wird nicht verändert.

\begin{lstlisting}
\cleardoublepage
\pagestyle{fancy}
\fancyhead{}
\fancyhead[C]{\IndexHeadLine}%
\fancypagestyle{plain}{%
  \fancyhead{}%
  \fancyhead[C]{\IndexHeadLine}}
\let\indexname\IndexName
\printindex
\end{lstlisting}


\section{Index}

Die Angabe zum Fortsetzungstext wird in \Macro{Contname} gespeichert. Die
Überschrift für den Index wird ebenfalls in der Kopfzeile verwendet und daher 
gesondert festgelegt.

\begin{lstlisting}
\newcommand\ContName{Forts. }
\newcommand\IndexName{Personenverzeichnis}

\makeatletter
\newcommand*\IndexHeadWrite{%
  \protected@write\@auxout{}{%
    \string\@IndexHead{\@CurrentIndexHead}{\noexpand\the\value{page}}}}
\newcommand*\IndexHead[1]{%   
  \def\@CurrentIndexHead{#1}%
  \IndexHeadWrite%
  \def\@CurrentIndexHead{\IndexContinuedName#1}}
\protected\def\IndexContinuedName{\ContName\@}%
\newcommand*\@IndexLastPages{}
\newcommand*\@IndexLastTestPages{}
\newcommand*\@IndexHead[2]{%
  \@ifundefined{ih@first@#2}{\expandafter\xdef\csname ih@first@#2\endcsname{#1}}{}%
  \@ifundefined{ih@last@#2}{\g@addto@macro\@IndexLastPages{,#2}}{}% 
  \expandafter\xdef\csname ih@last@#2\endcsname{#1}}
\newcommand*\@IndexHeadTest[2]{%
  \@ifundefined{ih@first@#2}{%
    \global\@IndexRerunWarningtrue
  }{%
    \@ifundefined{ih@lasttest@#2}{%
      \g@addto@macro\@IndexLastTestPages{,#2}%
    }{}%
    \expandafter\xdef\csname ih@lasttest@#2\endcsname{#1}%
  }%
}
\newif\if@IndexRerunWarning
\usepackage{atveryend}
\AfterLastShipout{%
  \let\@IndexHead\@IndexHeadTest
  \global\@IndexRerunWarningfalse}
\AtVeryEndDocument{%
  \ifx\@IndexLastPages\@IndexLastTestPages
    \begingroup
      \@for\x:=\@IndexLastPages\do{%
        \expandafter\ifx\csname ih@last@\x\expandafter\endcsname
                        \csname ih@lasttest@\x\endcsname
        \else\global\@IndexRerunWarningtrue
        \fi}%
    \endgroup%
  \else\global\@IndexRerunWarningtrue%
  \fi%
  \if@IndexRerunWarning
    \@latex@warning@no@line{%
      Index headers have changed.\MessageBreak Rerun LaTeX}%
  \fi%
}
\g@addto@macro\theindex{%
  \expandafter\def\expandafter\item\expandafter{%
    \item\hspace*{0pt}\IndexHeadWrite}%
  \expandafter\def\expandafter\subitem\expandafter{%
    \subitem\IndexHeadWrite}%
  \expandafter\def\expandafter\subsubitem\expandafter{%
    \subsubitem\IndexHeadWrite}%
}
\usepackage{auxhook}
\AddLineBeginAux{\string\providecommand\string\@IndexHead[2]{}}
\newcommand*\IndexHeadLine{%
  \IndexName~
    \@ifundefined{ih@first@\the\value{page}}{\textbf{??}}{\@nameuse{ih@first@\the\value{page}}}%
    --%
    \begingroup%
      \def\ContName{}%
%      \let\IndexContinuedName\relax%
      \@ifundefined{ih@last@\the\value{page}}{\textbf{??}}{\@nameuse{ih@last@\the\value{page}}}%
    \endgroup}
\makeatother
\end{lstlisting}


Die Ausgabe des Beispiels bezieht sich auf 

\begin{lstlisting}[basicstyle=\footnotesize\ttfamily]
Hallo Welt
\index{Anton}\index{Berta}\index{Dora}\index{Emil}\index{Egon}\clearpage\null
\index{Rudolf}\index{Hans}\index{Harmin}\index{Harmin!Irmin}\clearpage\null
\index{Harmin!Hans}\index{Harmin!Irmhilde}\index{Harmin!Clothilde}\clearpage\null
\index{Henry}\index{Heiko}\index{Heiner}\index{Heinrich}\index{Holger}\clearpage\null
\index{Horst}\index{Hugo}\index{Xaver}\index{Erasmus}\index{Klaus}\clearpage\null
\index{Volker}\index{Viko}\index{Zacharias}\index{Uwe}\index{Martin}\clearpage\null
\index{Xanthippe}\index{Yve}\index{Yvette}\index{Valentina}\index{Valerie}\index{Willi}
\end{lstlisting}


%\nocite{*}
\begingroup
%\renewcommand\refname{Literatur und Software}
%\bibliography{\jobname}
\endgroup




\end{document}


