Ich möchte einen Index anlegen, aber nicht die Seitenzahlen zeigen, sondern den jeweiligen Unterabschnitt (also bspsweise 3.1 oder 5.2).

Hier ist ein Minimalprogramm, mit dem ich einen Index mit Seitenzahlen anlegen kann. Wie muss ich das anpassen? Ich dachte mir, da müsste es doch eine einfach Lösung geben.

Öffne in Overleaf
 \documentclass[a4paper,index=totoc]{scrartcl} 
\usepackage{makeidx}
\makeindex
\begin{document}
\section{Erstes Kapitel}
\subsection{Erster Abschnitt}
\subsection{Zweiter Abschnitt}
Definition Gruppe\index{Gruppe}
\section{Zweites Kapitel}
\subsection{Erster Abschnitt}
Definition Ring\index{Ring}
\printindex
\end{document}

In diesem Beispiel wird derzeit ein Index ausgegeben mit den Begriffen "Gruppe" und "Ring" und beide Male eine "1" dahinter für die Seitenzahl. Ich hätte aber gerne die Ausgabe "Gruppe, 1.2" und "Ring, 2.1" oder alternativ (das wäre perfekt) "Gruppe, Abschnitt 1.2" und "Ring, Abschnitt 2.1".

Vielen Dank schon einmal!

gefragt 25 Mär '19, 20:00

Annegret's gravatar image

Annegret
6648
Akzeptiert-Rate: 0%

In der splitidx-Anleitung gibt es in Abschnitt 3.4 Beispielcode dafür.

(25 Mär '19, 22:42) saputello

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 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

Öffne in Overleaf
\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

Öffne in Overleaf
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

Öffne in Overleaf
\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

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:

Öffne in Overleaf
\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

Natürlich ist es etwas lästig, für jeden Eintrag derart lange Befehle zu nutzen. Also definieren wir uns eine Abkürzung:

Öffne in Overleaf
\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:

Öffne in Overleaf
\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

Dem 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.

Permanenter link

beantwortet 26 Mär '19, 09:28

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 26 Mär '19, 09:37

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×12
×1
×1
×1

gestellte Frage: 25 Mär '19, 20:00

Frage wurde gesehen: 4,717 Mal

zuletzt geändert: 26 Mär '19, 09:37