PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Index: Problem mit Befehlsexpansion



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

Schweinebacke
02-04-2010, 11:12
\ifthenelse ist bezüglich der Expansion sehr problematisch. Ich habe deshalb lieber eine Lösung gebastelt, die mit der e-TeX-Anweisung \ifcsname arbeitet. Da ich mich mit multind nicht auskenne, habe ich außerdem auf splitidx zurückgegriffen:
\documentclass[10pt, a4paper, oneside]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[makeindex]{splitidx}


% \ActualBook entspricht grob gesagt einem Counter, der die erforderlichen
% Indizes in der gewünschten Reihenfolge enthält
\makeatletter
\newcommand*{\i@cnt@Bli}{1}
\newcommand*{\i@cnt@Bla}{2}
\newcommand*{\i@cnt@Blu}{3}
\newcommand*{\i@cnt@Blo}{4}
\newcommand*{\i@cnt@Foo}{5}
\newcommand*{\i@cnt@Bar}{6}
\makeatother

% \ActualBookNum setzt die Stelle im Indexeintrag in einen Zahlenwert um,
% nach welchem sich dann die Index-Einträge korrekt sortieren lassen
\newcommand{\ActualBookNum}[1]{%
\ifcsname i@cnt@#1\endcsname \csname i@cnt@#1\endcsname\else 0\fi
}

% 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\sindex[Books]{\ActualBookNum{#1}@#1}}

\newindex[Verzeichnis der Schriften]{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]

\end{document}Das lässt sich bei Bedarf sicher auch an andere Index-Pakete anpassen.

uzahnd
09-04-2010, 15:13
@Schweinebacke: herzlichen Dank für Deine Lösung, klappt wie gewünscht!

Der Vollständigkeit halber hier noch die Version mit multind:



\documentclass[10pt, a4paper, oneside]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{multind}


% \ActualBook entspricht grob gesagt einem Counter, der die erforderlichen
% Indizes in der gewünschten Reihenfolge enthält
\makeatletter
\newcommand*{\i@cnt@Bli}{01}
\newcommand*{\i@cnt@Bla}{02}
\newcommand*{\i@cnt@Blu}{03}
\newcommand*{\i@cnt@Blo}{04}
\newcommand*{\i@cnt@Foo}{05}
\newcommand*{\i@cnt@Bar}{06}
\makeatother

% \ActualBookNum setzt die Stelle im Indexeintrag in einen Zahlenwert um,
% nach welchem sich dann die Index-Einträge korrekt sortieren lassen
\newcommand{\ActualBookNum}[1]{%
\ifcsname i@cnt@#1\endcsname \csname i@cnt@#1\endcsname\else 0\fi
}

% 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\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}

\end{document}

gruss u