Das Problem besteht aus zwei Stufen. Zum einen muss man dafür sorgen, dass in die `idx`-Datei mit den Index-Rohdaten nicht mehr automatisch `\thepage` geschrieben wird, sondern die Nummer des Abschnitts. Das wird noch erschwert, wenn nicht einfach `\thesubsection` geschrieben werden kann, sondern das ganze auch noch funktionieren soll, wenn der Index in einem `\section` statt einem `\subsection` aufgerufen wird.
Wie `saputello` in einem Kommentar erwähnt, kann man diesen Teil recht einfach mit Hilfe von [`splitidx`](https://ctan.org/pkg/splitidx) erledigen. Das hat den Vorteil, dass man zum einen keine internen Anweisungen umdefinieren muss und zum anderen auch noch einen normalen Index verwenden kann.
Der zweite Teil des Problems besteht darin, dass MakeIndex normalerweise nicht mit Zahlen wie 1.1, 1.2, 2.3 etc. als *Seitenzahlen* umgehen kann. Würde man MakeIndex eine `idx`-Datei der Form
\indexentry{Gruppe}{1.2}
\indexentry{Ring}{2.1}
vorsetzen, so erhielte man Fehlermeldungen der Art:
> `!! Input index error (file = test.idx, line = 2):
-- Illegal Arabic digit: position 2 in 1.2.`
Das liegt daran, dass MakeIndex nicht weiß, wie es mit dem Punkt in der *Seitenzahl* umgehen soll. Allerdings kann MakeIndex sehr wohl mit zusammengesetzten Seitenzahlen umgehen. In der Voreinstellung erwartet es jedoch, dass als Trennzeichen zwischen den beiden Zahlen ein Minuszeichen `-` statt eines Punktes steht. Wie alle anderen Zeichen auch, ist das über den Index-Stil (aka `ist`-Datei) konfigurierbar. Mit der Einstellung
page_compositor "."
kann als Trennzeichen zwischen den beiden Zahlen der Punkt eingestellt werden (wie man unter dem von Ulrike in einem Kommentar angegebenen Link aber je nach TeX-Distribution auch aus der Manual-Page von MakeIndex erfährt). So erzeugt nun beispielsweise
\begin{filecontents*}{\jobname.mst}
page_compositor "."
\end{filecontents*}
\documentclass[a4paper,index=totoc]{scrartcl}
\usepackage[split,makeindex]{splitidx}
\newindex[\indexname]{idx}
\AtWriteToIndex{idx}{\let\thepage\thesuborsection}
\newcommand*{\thesuborsection}{%
\ifnum \value{subsection}=0 \thesection\else\thesubsection\fi
}
\begin{document}
\section{Erster Abschnitt mit Definitionen}\sindex[idx]{Definition}
\subsection{Erster Unterabschnitt}
\subsection{Zweiter Unterabschnitt}
Definition\sindex[idx]{Definition} Gruppe\sindex[idx]{Gruppe}
\section{Zweiter Abschnitt}
\subsection{Erster Unterabschnitt}
Definition\sindex[idx]{Definition} Ring\sindex[idx]{Ring}
\printindex[idx]
nach dem Aufruf `pdflatex test`, `makeindex test`, `pdflatex test` das Ergebnis:
[![Nur die Nummern][1]][2]
Ich habe hier als Endung des MakeIndex-Stils absichtlich `.mst` statt `.ist` gewählt. MakeIndex hat nämlich die schöne aber wenig bekannte Eigenschaft, dass es für eine `idx`-Datei `foo.idx` nach einer Stildatei `foo.mst` sucht und diese automatisch lädt. Man muss also die Stildatei nicht explizit per Option `-s` angeben. Damit muss man im Editor die Einstellung für den MakeIndex-Aufruf normalerweise nicht ändern um dafür zu sorgen, dass der Index-Stil auch wirklich verwendet wird. Aus demselben Grund habe ich im Beispiel beim Laden von `splitidx` Option `split` angegeben und die Standard-Index-Datei `idx` verwendet.
Die Definition von `\thesuborsection` sorgt dafür, dass solange der `subsection`-Zähler 0 ist, die Ausgabe der Nummer des Abschnitts (`\thesection`) verwendet wird, während bei anderen Werten für `subsection` die Ausgabe der Nummer des Unterabschnitts (`\thesubsection`) verwendet wird. Nach `\section` aber vor dem ersten `\subsection` wird damit die Nummer des Abschnitts statt des Unterabschnitts für den Index verwendet. Siehe die erste Nummer für den Eintrag „Definition”.
Zu den Optionen `makeindex` und den Befehlen `\newindex`, `\sindex`, `\printindex` und `\AtWriteToIndex` sei auf die Anleitung zum Paket `splitidx` verwiesen.
Nun stellt sich als drittes Problem die Frage, wie man das „Abschnitt” noch als Präfix für die Nummer bekommt. Dazu kann man die MakeIndex-Möglichkeit nutzen, eine *Seitenzahlformatierung* für den Indexeintrag anzugeben:
\begin{filecontents*}{\jobname.mst}
page_compositor "."
\end{filecontents*}
\documentclass[a4paper,index=totoc]{scrartcl}
\usepackage[split,makeindex]{splitidx}
\newindex[\indexname]{idx}
\AtWriteToIndex{idx}{\let\thepage\thesuborsection}
\newcommand*{\thesuborsection}{%
\ifnum \value{subsection}=0 \thesection\else\thesubsection\fi
}
\newcommand*{\sectionterm}[1]{Abschnitt~#1}
\begin{document}
\section{Erster Abschnitt mit Definitionen}\sindex[idx]{Definition|sectionterm}
\subsection{Erster Unterabschnitt}
\subsection{Zweiter Unterabschnitt}
Definition\sindex[idx]{Definition|sectionterm} Gruppe\sindex[idx]{Gruppe|sectionterm}
\section{Zweiter Abschnitt}
\subsection{Erster Unterabschnitt}
Definition\sindex[idx]{Definition|sectionterm} Ring\sindex[idx]{Ring|sectionterm}
\printindex[idx]
\end{document}
Und schon haben wir:
[![Mit Abschnitt-Präfix][3]][4]
Natürlich ist es etwas lästig, für jeden Eintrag derart lange Befehle zu nutzen. Also definieren wir uns eine Abkürzung:
\begin{filecontents*}{\jobname.mst}
page_compositor "."
\end{filecontents*}
\documentclass[a4paper,index=totoc]{scrartcl}
\usepackage[split,makeindex]{splitidx}
\newindex[\indexname]{idx}
\AtWriteToIndex{idx}{\let\thepage\thesuborsection}
\newcommand*{\thesuborsection}{%
\ifnum \value{subsection}=0 \thesection\else\thesubsection\fi
}
\newcommand*{\sectionterm}[1]{Abschnitt~#1}
\newcommand*{\idx}[1]{\sindex[idx]{#1|sectionterm}}
\begin{document}
\section{Erster Abschnitt mit Definitionen}\idx{Definition}
\subsection{Erster Unterabschnitt}
\subsection{Zweiter Unterabschnitt}
Definition\idx{Definition} Gruppe\idx{Gruppe}
\section{Zweiter Abschnitt}
\subsection{Erster Unterabschnitt}
Definition\idx{Definition} Ring\idx{Ring}
\printindex[idx]
\end{document}
Das Ergebnis ist das gleiche wie das zuletzt gezeigte. Man kann das auch noch erweitern, wenn man zusätzlich weiterhin Formatierungsmöglichkeiten für die *Seitenzahl* nutzen können will:
\begin{filecontents*}{\jobname.mst}
page_compositor "."
\end{filecontents*}
\documentclass[a4paper,index=totoc]{scrartcl}
\usepackage[split,makeindex]{splitidx}
\newindex[\indexname]{idx}
\AtWriteToIndex{idx}{\let\thepage\thesuborsection}
\newcommand*{\thesuborsection}{%
\ifnum \value{subsection}=0 \thesection\else\thesubsection\fi
}
\newcommand*{\sectionterm}[2][]{#1{Abschnitt~#2}}
\newcommand*{\idx}[2][]{\sindex[idx]{#2|sectionterm[#1]}}
\begin{document}
\section{Erster Abschnitt mit Definitionen}\idx[\textbf]{Definition}
\subsection{Erster Unterabschnitt}
\subsection{Zweiter Unterabschnitt}
Definition\idx{Definition} Gruppe\idx{Gruppe}
\section{Zweiter Abschnitt}
\subsection{Erster Unterabschnitt}
Definition\idx{Definition} Ring\idx{Ring}
\printindex[idx]
\end{document}
[![Mit fetter Nummer][5]][5]
Dem Aufmerksamen aufmerksamen Leser mag aufgefallen sein, dass ich immer *Seitenzahl* geschrieben habe, obwohl es sich doch um eine Abschnittsnummer handelt. Das liegt daran, dass MakeIndex üblicherweise eben Verweise auf Seitenzahlen verarbeitet und in Anleitungen daher in der Regel auch dieser Terminus verwendet wird. Daher habe ich den Begriff auch jeweils kursiv hervorgehoben.
[1]: https://texwelt.de/wissen/upfiles/test_20190326_083946.png
[2]: https://texwelt.de/wissen/upfiles/test_20190326_083946.png
[3]: https://texwelt.de/wissen/upfiles/test_20190326_085102.png
[4]: https://texwelt.de/wissen/upfiles/test_20190326_085102.png
[5]: https://texwelt.de/wissen/upfiles/test_20190326_085749.png