Wie kann ich die Sortierreihenfolge bei der Ausgabe ändern? Angenommen ich habe:

Öffne in Overleaf
\documentclass{scrartcl}
\usepackage[split,makeindex]{splitidx}
\newindex[Personenverzeichnis]{Personen}
\makeindex
\begin{document}
Wilhelm Meister\sindex[Personen]{Wilhelm Meister}
\printsubindex[Personen]
\end{document}

Kann ich nun in der Ausgabe des Index statt Wilhelm Meister auch Meister, Wilhelm bekommen, möglichst ohne die Reihenfolge der Namensteile selbst ändern zu müssen. Das soll natürlich möglichst auch bei mehr als einem Vornamen funktionieren. Kann ich also die Ausgabe unabhängiger von der Eingabe machen?

gefragt 20 Mär '19, 17:40

Tischa's gravatar image

Tischa
1.4k27102128
Akzeptiert-Rate: 15%

bearbeitet 21 Mär '19, 12:20

saputello's gravatar image

saputello
11.1k154365

Ich habe mir erlaubt, mal die wichtigsten Informationen aus einem Deiner Kommentare in die Frage einzubauen. Du kannst das aber gerne selbst nachbearbeiten.

(21 Mär '19, 12:21) saputello

Auch bei dieser Frage ist mir wieder nicht klar, was du haben willst. Bitte bemühe dich künftig, etwas genauer anzugeben, was das Ergebnis sein soll. Jedenfalls kann man selbstverständlich im Index auch „Meister, Wilhelm” eintragen:

Öffne in Overleaf
\documentclass{scrartcl}
\usepackage[split,makeindex]{splitidx}% Option split nur, wenn man splitindex nicht verwendet.
\newindex[Personenverzeichnis]{Personen}
\makeindex
\begin{document}
Wilhelm Meister\sindex[Personen]{Meister, Wilhelm Otto} und
Friedrich Kleister\sindex[Personen]{Kleister, Friedrich Peter}
\printsubindex[Personen]
\end{document}

Ergibt dann:

alt text

Oder willst du vielleicht:

Öffne in Overleaf
\documentclass{scrartcl}
\usepackage[split,makeindex]{splitidx}% Option split nur, wenn man auf den Komfort von splitindex verzichtet.
\newindex[Personenverzeichnis]{Personen}
\makeindex
\begin{document}
Wilhelm Meister\sindex[Personen]{Meister, Wilhelm Otto@Wilhelm Otto Meister} und
Friedrich Kleister\sindex[Personen]{Kleister, Friedrich Peter@Friedrich Peter Kleister}
\printsubindex[Personen]
\end{document}

alt text

Näheres zur Syntax mit @ zwischen Anzeige- und Sortierterm ist der MakeIndex-Anleitung zu entnehmen. Es ist zu beachten, dass Zeichen @ nur die Voreinstellung ist und vom Index-Stil (aka ist-Datei) abhängen kann. Auch dazu sei auf die MakeIndex-Anleitung verwiesen.

Ich finde es ja komfortabler, nicht Option split zu verwenden und die Aufteilung automatisch von splitindex erledigen zu lassen, statt für jede Index-Datei eigens makeindex aufrufen zu müssen. Im Folgenden verwende ich daher nicht mehr die Option split.

Liegen die Namen aus unerfindlichen Gründen nur in der Form „Vorname Nachname” vor und eine Änderung in die sinnvolle Form „Nachname, Vorname” kommt aus ebenso unerfindlichen Gründen nicht in Frage, dann muss man die Namen vor dem Setzen des Index-Eintrags gegebenenfalls erst noch in Vorname und Nachname aufspalten. Es gibt dafür verschiedene Heuristiken. Ich verwende hier einmal die einfache Annahme, dass der Teil hinter dem letzten Leerzeichen der Nachname ist und alles davon der Vorname. Dann kann die Aufteilung mit einem einfachen regulären Ausdruck erfolgen. Hierfür bietet sich das LaTeX3-Kernel-Modul l3regex an (siehe „The LaTeX3 interface”):

Öffne in Overleaf
\documentclass{scrartcl}
\usepackage[makeindex]{splitidx}
\usepackage{xparse}% lädt auch expl3 mit l3regex

\ExplSyntaxOn

\regex_const:Nn \c_lastspace_regex { \A(.*)\s([^\s]*)\Z }

% #1 = Tokenlistenvariable für den Vornamen
% #2 = Tokenlistenvariable für den Nachnamen
% #3 = "Vorname Nachname"
\cs_new:Npn \__splitatlastspacetoken:NNn #1#2#3
  {
    \tl_set:Nn #2 { #3 } % Zuerst den Namen
    \tl_trim_spaces:N #2 % von Leerzeichen am Anfang und Ende befreien
    \regex_replace_once:NnNTF \c_lastspace_regex { \2 } #2 % und den Nachnamen behalten.
      { % Wenn es Leerzeichen gab,
        \tl_set:Nn #1 { #3 } % erneut den Namen
        \tl_trim_spaces:N #1 % von Leerzeichen am Anfang und Ende befreien,
        \regex_replace_once:NnN \c_lastspace_regex { \1 } #1 % dieses Mal ab den Vornamen behalten.
      }
      { % Wenn es kein Leerzeichen gab,
        \tl_clear:N #1 % gibt es keinen Vornamen.
      }
  }

\NewDocumentCommand \AddPersonToIndex { m }
  {
    \__splitatlastspacetoken:NNn \l_tmpa_tl \l_tmpb_tl { #1 }
    \tl_if_empty:NTF \l_tmpa_tl
      { % Eine Person ohne Vorname, nur mit Nachnamen.
        \sindex[Personen]{ \l_tmpb_tl }
      }
      { % \l_tmpb_tl ist der Nachname, \l_tmpa_tl der Vorname.
        \sindex[Personen]{ \l_tmpb_tl , ~ \l_tmpa_tl }
      }
  }

\ExplSyntaxOff

\newindex[Personenverzeichnis]{Personen}

\begin{document}
Wilhelm Meister\AddPersonToIndex{Wilhelm Meister} und
Otto Friedrich Leister\AddPersonToIndex{Otto Friedrich Leister} und als
Specialguest Alf\AddPersonToIndex{Alf}
\printsubindex[Personen]
\end{document}

alt text

Auch hier kann man natürlich die Ausgabe im Index von der Sortierreihenfolge abkoppeln. Dazu muss nur die zweite \sindex-Anweisung entsprechend dem zweiten Beispiel oben mit Hilfe des @-Operators abgeändert werden.

Es sei darauf hingewiesen, dass die hier verwendete Heuristik, Namen wie „Otto Graf von Mysterium” oder „Ben van Verratichnich”, abhängig von den Anforderungen nicht hinreichend gut erfasst, da dabei „Otto Graf von” bzw. „Ben van” als Vornamen behandelt wird. Ggf. ist also je nach Anforderung eine aufwändigere Aufspaltung des Namens in einzelne Bestandteile und auch eine aufwändigere Weiterbehandlung der Bestandteile notwendig. Ggf. kann der Aufwand mit TeX sogar mit LaTeX3 dafür auch sehr hoch sein, so dass eine Nachbearbeitung der Indexdatei mit einem zusätzlichen Programm eventuell besser sein könnte. Das war aber hier nicht die Frage, weshalb ich es auch nicht zu behandeln gedenke. Außerdem ist irgendwann dann die Grenze erreicht, bei der das Problem besser von der Eingabeseite zu lösen ist. Das kann bis zur Verwendung von bib2gls zur Erzeugung des Personenindex gehen.

Permanenter link

beantwortet 20 Mär '19, 18:58

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 21 Mär '19, 12:09

Ich habe das Problem, dass ich meine Einträge alle mit Vorname Nachname eingetragen habe. Nun versuch ich, aber auch aus ganz grundsätzlichem Interesse, herauszufinden, wie ich die Ausgabe der Einträge - je nach Anwendungsfall bzw. Ausgabewunsch - unabhängig von der Eingabe anpassen kann.

(20 Mär '19, 20:56) Tischa

@Tischa Das sagt leider noch immer nicht, wie sie dann im Index stehen sollen. Interessiert mich jetzt aber auch nicht mehr. Ich habe eine Lösung zur Aufspaltung hinzugefügt. Sollte dir das nicht genügen, überlasse ich den Rest dir.

(21 Mär '19, 11:44) gast3
1

@Tischa Bitte füge wichtige Informationen in die Frage ein und verstecke sie nicht in einem Kommentar zu einer Antwort. Und bitte bemühe Dich etwas mehr, um vollständige Fragen. Natürlich kann man Nachfragen nicht immer ganz vermeiden, aber Deine Fragen sind leider häufig recht unklar. Nachdem Du nun schon so lange dabei bist, bin ich sicher, dass Du das kannst. Einfach am Ende die Frage noch einmal durchlesen und Dich selbst fragen, was daran unklar sein könnte.

(21 Mär '19, 12:15) saputello
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:

×16
×11
×9
×8
×2

gestellte Frage: 20 Mär '19, 17:40

Frage wurde gesehen: 3,833 Mal

zuletzt geändert: 30 Apr '19, 20:19