Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Index: Problem mit Befehlsexpansion

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.12.2007
    Beiträge
    5

    Index: Problem mit Befehlsexpansion

    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:

    Code:
    \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:

    Code:
    \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:

    Code:
    \indexentry{\ActualBookNum {Blo}@Blo}{1}
    Erwarten würde ich

    Code:
    \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

  2. #2
    Registrierter Benutzer
    Registriert seit
    31.03.2010
    Beiträge
    1.039
    \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:
    Code:
    \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.

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.12.2007
    Beiträge
    5
    @Schweinebacke: herzlichen Dank für Deine Lösung, klappt wie gewünscht!

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

    Code:
    \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

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •