2
1

Hallo, noch mal, ich habe noch eine Index-Frage. Es ist kein gravierendes Problem, sondern die Frage, ob meine Lösung die beste Lösung ist oder unnötig kompliziert.

Wenn in meinem Text von einer Sache oder Person verschiedene Schreibweisen oder Namensvarianten vorkommen, möchte ich beide in den Index aufnehmen, aber dabei die eine Varinte als Hauptstichwort betrachten und von dem Nebenstichwort auf das Hauptstichwort verweisen. Also so:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\begin{document}
George H. W. Bush\index[pers]{George H. W. Bush}\\
George W. Bush\index[pers]{George W. Bush}\\
\newpage
George Bush senior\index[pers]{George Bush senior|see{George H. W. Bush}}\\
George Bush junior\index[pers]{George Bush junior|see{George W. Bush}}
\printindex[pers]
\end{document}

Problem: Unter dem Hauptstichwort stehen dann nur die Seitenzahlen der Fundstellen des Hauptstichworts. Ich möchte, dass auch die Fundstellen des Nebenstichworts dort aufgeführt werden, denn sonst scheint mir der Verweis irreführend.

Ich habe diese Lösung gefunden:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\begin{document}
George H. W. Bush\index[pers]{George H. W. Bush}\\
George W. Bush\index[pers]{George W. Bush}\\
\newpage
George Bush senior\index[pers]{George Bush senior|see{George H. W. Bush}}\index[pers]{George H. W. Bush}\\
George Bush junior\index[pers]{George Bush junior|see{George W. Bush}}\index[pers]{George W. Bush}\\
\printindex[pers]
\end{document}

Das bringt das gewünschte Ergebnis, aber ich finde den Code für einen kleinen Indexeintrag auffallend kompliziert. Lässt sich das einfacher und eleganter lösen oder muss ich damit leben?

Vielen Dank für eure Aufmerksamkeit!

gefragt 31 Okt '17, 23:01

Portokali's gravatar image

Portokali
9659
Akzeptiert-Rate: 0%

Wer hindert Dich daran, per \newcommand einen passenden Befehl zu definieren, der beide Indexeinträge auf einmal erstellt?

(02 Nov '17, 10:04) saputello

Wie von saputello in seinem Kommentar bereits erwähnt, bietet es sich an, hierfür eine eigene Anweisung zu definieren, beispielsweise:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\newcommand*{\seeindex}[2]{%
  \index[pers]{#1|see{#2}}\index[pers]{#2}%
}

\begin{document}
George H. W. Bush\index[pers]{George H. W. Bush}\\
George W. Bush\index[pers]{George W. Bush}\\
\newpage
George Bush senior\seeindex{George Bush senior}{George H. W. Bush}\\
George Bush junior\seeindex{George Bush junior}{George W. Bush}\\
\printindex[pers]
\end{document}

Es wird also ein Befehl mit zwei Argumenten definiert. Das erste Argument ist der Name, der einen siehe-Eintrag auf den Namen des zweiten Arguments erhalten soll. Gleichzeitig wird für das zweite Argument ein normaler Indexeintrag erzeugt.

Natürlich kann man das noch einen Schritt weiter treiben und auch gleich den Namen ausgeben lassen:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\newcommand*{\AliasPerson}[2]{%
  #1\index[pers]{#1|see{#2}}\index[pers]{#2}%
}

\begin{document}
George H. W. Bush\index[pers]{George H. W. Bush}\\
George W. Bush\index[pers]{George W. Bush}\\
\newpage
\AliasPerson{George Bush senior}{George H. W. Bush}\\
\AliasPerson{George Bush junior}{George W. Bush}\\
\printindex[pers]
\end{document}

Man könnte jetzt an dieser Stelle auch noch im Text selbst einen entsprechenden Hinweis ausgeben, beispielsweise als Randnotiz:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\newcommand*{\AliasPerson}[2]{%
  #1\marginline{$\rightarrow$ #2}\index[pers]{#1|see{#2}}\index[pers]{#2}%
}

\begin{document}
George H. W. Bush\index[pers]{George H. W. Bush}\\
George W. Bush\index[pers]{George W. Bush}\\
\newpage
\AliasPerson{George Bush senior}{George H. W. Bush}\\
\AliasPerson{George Bush junior}{George W. Bush}\\
\printindex[pers]
\end{document}

Wenn man an der Stelle ist, stellt sich natürlich die Frage, ob man nicht auch gleich generell für Personen eine Anweisung verwenden sollte. Dann könnte man auch zusätzlich einen Mechanismus implementieren, um Aliase halbautomatisch zu erfassen:

Öffne in Overleaf
\documentclass[ngerman]{scrartcl}
\usepackage{imakeidx}
\makeindex[intoc,name=pers,title=Index der Personennamen,columns=1]
\renewcommand{\seename}{siehe}

\makeatletter
\newcommand*{\defAliasPerson}[2]{%
  \@namedef{AliasPerson@\detokenize{#1}}{#2}%
  \expandafter\expandafter\expandafter\show\@nameuse{AliasPerson@\detokenize{#1}}%
}
\newcommand*{\Person}[1]{%
  #1%
  \scr@ifundefinedorrelax{AliasPerson@\detokenize{#1}}{%
    \index[pers]{#1}%
  }{%
    \marginline{$\rightarrow$ \@nameuse{AliasPerson@\detokenize{#1}}}%
    \index[pers]{#1|see{\@nameuse{AliasPerson@\detokenize{#1}}}}%
    \index[pers]{\@nameuse{AliasPerson@\detokenize{#1}}}%
  }%
}
\makeatother
\newcommand*{\AliasPerson}[2]{%
  \defAliasPerson{#1}{#2}\Person{#1}%
}
\defAliasPerson{George Bush senior}{George H. W. Bush}

\begin{document}
\Person{George H. W. Bush}\\
\Person{George W. Bush}\\
\newpage
\Person{George Bush senior}\\
\AliasPerson{George Bush junior}{George W. Bush}\\
\printindex[pers]
\end{document}

Bei dieser Version werden mit \defAliasPerson Aliasnamen für eine Person definiert. Dabei ist das erste Argument der Aliasname, das zweite ist der Hauptname. Für jeden Aliasnamen wird ein neues Makro definiert, dessen Befehlsname sich aus AliasPerson@ gefolgt vom Aliasnamen zusammensetzt. Inhalt des Makros ist der Hauptname. Wird nun per \Person auf eine Person zugegriffen, so wird geprüft, ob ein solches Makro für die angegebene Person vorhanden ist. Ist das nicht der Fall, so wird nach Ausgabe des Namens nur ein Hauptindexeintrag erzeugt. Ist es jedoch der Fall, so wird nach dem Namen eine Randnotiz mit dem Hauptnamen ausgegeben und die beiden Indexeinträge erzeugt.

Zusätzlich habe ich wieder die Anweisung \AliasPerson definiert. Dieses mal verwendet diese Anweisung aber einfach \defAliasPerson, um einen Alias zu definieren, und greift dann auf \Person zurück, um die Person auszugeben und die Index-Einträge zu erzeugen.

Das \detokenize in der Definition dient übrigens dazu, bei Namen, die Befehle wie \" oder \^ enthalten, nicht gleich Fehlermeldungen zu produzieren. Man kann das leicht beispielsweise mit \AliasPerson{M\"uller}{Schmidt} ausprobieren. ;-)

Permanenter link

beantwortet 02 Nov '17, 14:01

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 03 Nov '17, 13:33

Danke vielmals für diese ausführliche und rundum großartige Antwort!

(02 Nov '17, 23:48) Portokali
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:

×28
×16
×11
×4

gestellte Frage: 31 Okt '17, 23:01

Frage wurde gesehen: 4,877 Mal

zuletzt geändert: 02 Nov '17, 23:48