uzahnd
01-04-2010, 20:35
Hallo
Makeindex kennt bekanntlich nur zwei alpha-numerische Sortierschlüssel, was ziemlich mühsam ist, wenn man gerne nach anderen Kriterien sortieren würde, ohne dies bei jedem einzelnen Index-Eintrag festhalten zu müssen (also jedesmal \index{foo@bar}).
Da es mir momentan um eine genau definierte Anzahl von Index-Einträgen geht (sämtliche Werke eines Autors, die nicht alphabetisch, sondern nach Erscheinungsjahr geordnet werden sollen), habe ich folgendes versucht:
\documentclass[10pt, a4paper, oneside]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{ifthen}
\usepackage{multind}
\newcounter{BookLoop}
% \ActualBook entspricht grob gesagt einem Counter, der die erforderlichen
% Indizes in der gewünschten Reihenfolge enthält
\newcommand{\ActualBook}{%
\ifcase\value{BookLoop}\or Bli\or Bla\or Blu\or Blo\or Foo\or Bar\fi}
% \ActualBookNum setzt die Stelle im Indexeintrag in einen Zahlenwert um,
% nach welchem sich dann die Index-Einträge korrekt sortieren lassen
\newcommand{\ActualBookNum}[1]{%
\setcounter{BookLoop}{0}%
\whiledo{\value{BookLoop}<7}{%
\ifthenelse{\equal{#1}{\ActualBook}}{\theBookLoop} {}%
\stepcounter{BookLoop}}}
% mit \BRef kann im Fliesstext auf ein Buch Verweisen werden:
% Der Titel erscheint im Print-Text, zugleich wird ein Indexeintrag erstellt,
% der - so die Idee - als Alias den oben ermittelten Zahlenwert erhält.
\newcommand{\BRef}[1]{#1\protect\index{Books}{\ActualBookNum{#1}@#1}}
\makeindex{Books}
\begin{document}
Lorem ipsum (\BRef{Foo}) dolor sit amet, (\BRef{Blo}) consetetur
sadipscing elitr(\BRef{Bla}) , sed diam nonumy eirmod tempor invidunt
(\BRef{Bli}) ut labore et dolore magna aliquyam erat
\verb+\ActualBookNum+ selber funktioniert, zB hier: \ActualBookNum{Bla}
\newpage
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
rebum. (\BRef{Foo}) Stet clita kasd gubergren, no sea takimata sanctus est
Lorem ipsum dolor sit amet. Lorem ipsum dolor (\BRef{Bli}) sit amet,
consetetur sadipscing elitr (\BRef{Bar}), sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat
\newpage
sed diam voluptua (\BRef{Blo}). At vero eos et accusam et justo duo
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est
\printindex{Books}{Verzeichnis der Schriften}Foo
\end{document}
In dieser Form erhalte ich eine Reihe von Fehlermeldungen (in Verbindung mit ledmac 'Missing \endcsname inserted' und 'Undefined control sequence \?'; im vorliegenden Minimalbeispiel 'Illegal parameter number in definition of \@gtempa')
Definiere ich hingegen \BRef mit einem \protect vor \ActualBookNum, also:
\newcommand{\BRef}[1]{#1\protect\index{Books}{\protect\ActualBookNum{#1 }@#1}}
dann läuft alles sauber durch, aber der Index wird dennoch alphabetisch geordnet, weil das \ActualBookNum-Makro im Index nicht mehr expandiert wird und entsprechend in der Books.idx-Datei Einträge folgenden Formats stehen:
\indexentry{\ActualBookNum {Blo}@Blo}{1}
Erwarten würde ich
\indexentry{4@Blo}{1}
Ich habe die Sache vorläufig so gelöst, dass ich ein sed-Script über die Books.idx-Datei laufen lasse, welches mir die entsprechenden Änderungen vornimmt, fände es aber schöner, dies in LaTeX selber lösen zu können.
Danke insofern für jeden Hinweis!
gruss u
Makeindex kennt bekanntlich nur zwei alpha-numerische Sortierschlüssel, was ziemlich mühsam ist, wenn man gerne nach anderen Kriterien sortieren würde, ohne dies bei jedem einzelnen Index-Eintrag festhalten zu müssen (also jedesmal \index{foo@bar}).
Da es mir momentan um eine genau definierte Anzahl von Index-Einträgen geht (sämtliche Werke eines Autors, die nicht alphabetisch, sondern nach Erscheinungsjahr geordnet werden sollen), habe ich folgendes versucht:
\documentclass[10pt, a4paper, oneside]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{ifthen}
\usepackage{multind}
\newcounter{BookLoop}
% \ActualBook entspricht grob gesagt einem Counter, der die erforderlichen
% Indizes in der gewünschten Reihenfolge enthält
\newcommand{\ActualBook}{%
\ifcase\value{BookLoop}\or Bli\or Bla\or Blu\or Blo\or Foo\or Bar\fi}
% \ActualBookNum setzt die Stelle im Indexeintrag in einen Zahlenwert um,
% nach welchem sich dann die Index-Einträge korrekt sortieren lassen
\newcommand{\ActualBookNum}[1]{%
\setcounter{BookLoop}{0}%
\whiledo{\value{BookLoop}<7}{%
\ifthenelse{\equal{#1}{\ActualBook}}{\theBookLoop} {}%
\stepcounter{BookLoop}}}
% mit \BRef kann im Fliesstext auf ein Buch Verweisen werden:
% Der Titel erscheint im Print-Text, zugleich wird ein Indexeintrag erstellt,
% der - so die Idee - als Alias den oben ermittelten Zahlenwert erhält.
\newcommand{\BRef}[1]{#1\protect\index{Books}{\ActualBookNum{#1}@#1}}
\makeindex{Books}
\begin{document}
Lorem ipsum (\BRef{Foo}) dolor sit amet, (\BRef{Blo}) consetetur
sadipscing elitr(\BRef{Bla}) , sed diam nonumy eirmod tempor invidunt
(\BRef{Bli}) ut labore et dolore magna aliquyam erat
\verb+\ActualBookNum+ selber funktioniert, zB hier: \ActualBookNum{Bla}
\newpage
sed diam voluptua. At vero eos et accusam et justo duo dolores et ea
rebum. (\BRef{Foo}) Stet clita kasd gubergren, no sea takimata sanctus est
Lorem ipsum dolor sit amet. Lorem ipsum dolor (\BRef{Bli}) sit amet,
consetetur sadipscing elitr (\BRef{Bar}), sed diam nonumy eirmod tempor
invidunt ut labore et dolore magna aliquyam erat
\newpage
sed diam voluptua (\BRef{Blo}). At vero eos et accusam et justo duo
dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est
\printindex{Books}{Verzeichnis der Schriften}Foo
\end{document}
In dieser Form erhalte ich eine Reihe von Fehlermeldungen (in Verbindung mit ledmac 'Missing \endcsname inserted' und 'Undefined control sequence \?'; im vorliegenden Minimalbeispiel 'Illegal parameter number in definition of \@gtempa')
Definiere ich hingegen \BRef mit einem \protect vor \ActualBookNum, also:
\newcommand{\BRef}[1]{#1\protect\index{Books}{\protect\ActualBookNum{#1 }@#1}}
dann läuft alles sauber durch, aber der Index wird dennoch alphabetisch geordnet, weil das \ActualBookNum-Makro im Index nicht mehr expandiert wird und entsprechend in der Books.idx-Datei Einträge folgenden Formats stehen:
\indexentry{\ActualBookNum {Blo}@Blo}{1}
Erwarten würde ich
\indexentry{4@Blo}{1}
Ich habe die Sache vorläufig so gelöst, dass ich ein sed-Script über die Books.idx-Datei laufen lasse, welches mir die entsprechenden Änderungen vornimmt, fände es aber schöner, dies in LaTeX selber lösen zu können.
Danke insofern für jeden Hinweis!
gruss u