Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Abfrage von Argumenten

  1. #1
    Registrierter Benutzer
    Registriert seit
    13.03.2014
    Ort
    Berlin
    Beiträge
    21

    Abfrage von Argumenten

    Guten Morgen,

    ich hänge an einem Problem fest, wo ich nicht recht voran komme.

    Für die Weiterarbeiten eines Namens habe ich folgendes Kommando definiert:

    Code:
    \newcommand*{\Name}[2]{\textsc{#1 #2\index[Person]{\textsc{#2}, #1}}}
    Aufgerufen wird es mit:

    Code:
    \Name{Vorname}{Nachname}
    Wenn ich den Text setze, wird der Name in Kapitälchen gesetzt, außerdem in der Reihenfolge "Name, Vorname" im "Personenregister" gespeichert, wobei der Nachname dort ebenfalls in Kapitälchen ausgegeben wird.

    Soweit funktioniert es. Gerne hätte ich eine Abfrage, ob eines der beiden Felder leer ist, um in diesem Fall kein Komma auszugeben. Momentan führt die Angabe von
    Code:
    \Name{}{Mustermann}
    im Personenregister zu "Mustermann, , Seitenangabe" und im Text selbst zu einem weiteren Leerzeichen.

    Vielen Dank.
    Gruss Latexberlin

  2. #2
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    Die brandaktuelle KOMA-Script-Version 3.19 hat in scrbase.sty (wird von allen KOMA-Script-Klassen und den meisten KOMA-Script-Paketen automatisch geladen) ein: \IfArgIsEmpty{<Arg>}{<Dann>}{<Sonst>}. Damit könnte man etwas machen wie (mangels vollständigem Minimalbeispiel ungetestet):
    Code:
    \newcommand*{\Name}[2]{\textsc{#1\IfArgIsEmpty{#2}{}{ #2}}\index[Person]{#2, #1@\IName{#1}{#2}}}%
    \DeclareRobustCommand*{\IName}[2]{\textsc{\IfArgIsEmpty{#2}{}{#2, }#1}}%
    Die Schreibweise <SortKey>@<Text> ist zu empfehlen, damit die Sortierreihenfolge korrekt bleibt. Es soll ja nicht nach "\IName{Maier, Karl}", sondern nach "Maier, Karl" sortiert werden. Ggf, ist die Fallunterscheidung auch noch auf das ganze \index anzuwenden, damit "ESA" nicht als ", ESA" einsortiert wird.

    Ähnliche Anweisungen finden sich auch schon in älteren Versionen von KOMA-Script, beispielsweise \ifstr. Ebenso gibt es nutzbare Anweisungen in Paketen wie xstring, ifthen u. v. m.

    Eigentlich sollte man die Formatierung der Einträge im Namensregister IMHO nicht per \index hinein schreiben, sondern als Teil der Definition des Index-Stils (aka ist-Datei) setzen.
    Geändert von klops (30-09-2015 um 07:42 Uhr)

  3. #3
    Registrierter Benutzer
    Registriert seit
    13.03.2014
    Ort
    Berlin
    Beiträge
    21
    Danke für Deine Antwort.

    Hier das Minimalbeispiel mit Deinem Code:

    Code:
    %Definition des Dokumentes "Buch"
    \documentclass[11pt,a4paper,twoside,bibliography=totoc]{scrbook}
    
    
    %Verzeichnisse
    \usepackage{imakeidx}
    \makeindex[name=Person, title=Personenverzeichnis]
    
    %neu definierte Befehle
    \newcommand*{\Name}[2]{\textsc{#1\IfArgIsEmpty{#2}{}{ #2}}\index[Person]{#2, #1@\IName{#1}{#2}}}%
    \DeclareRobustCommand*{\IName}[2]{\textsc{\IfArgIsEmpty{#2}{}{#2, }#1}}%
    
    %Beginn des Dokuments
    \begin{document}
    
    Ein Satz.
    
    \Name{Max}{Mustermann}
    
    \printindex[Person]
    
    \end{document}
    Leider bringt mit Latex die Meldung:

    20 Undefined control sequence- Max\IfArgIsEmpty{Mustermann}{}{Mustermann} I.20 \Name{Max}{Mustermann}

  4. #4
    Registrierter Benutzer
    Registriert seit
    09.12.2005
    Beiträge
    1.326
    imakeindex hat offenbar Probleme mit robust deklarierten Befehlen:
    Code:
    \documentclass[11pt,a4paper,twoside,bibliography=totoc]{scrbook}
    
    
    %Verzeichnisse
    \usepackage{imakeidx}
    \makeindex[name=Person, title=Personenverzeichnis]
    
    %neu definierte Befehle
    \newcommand*{\Name}[2]{\textsc{#1\IfArgIsEmpty{#2}{}{ #2}}\index[Person]{#2,
        #1@\string\IName{#1}{#2}}}%
    \newcommand*{\IName}[2]{\textsc{\IfArgIsEmpty{#2}{}{#2, }#1}}%
    
    %Beginn des Dokuments
    \begin{document}
    
    Ein Satz.
    
    \Name{Max}{Mustermann}
    
    \Name{Karl}{}
    
    \printindex[Person]
    
    \end{document}
    funktioniert mit KOMA-Script 3.19. Wenn du noch nicht das aktuelle KOMA-Script installiert hast, gibt es \IfArgIsEmpty wie gesagt noch nicht. Dann musst Du den Vergleich auf andere Weise durchführen. Entsprechende Alternativen habe ich Dir genannt.
    Geändert von klops (30-09-2015 um 10:15 Uhr)

  5. #5
    Registrierter Benutzer
    Registriert seit
    13.03.2014
    Ort
    Berlin
    Beiträge
    21
    Ok, Danke für's Reindenken. Falls ich nicht weiter komme, arbeite ich vielleicht vorrübergehend mit 2 Befehlen. Verwundert war ich, dass man bei Google nirgendwo etwas zu "\IfArgIsEmpty" findet. Viele Grüße, Latexberlin

  6. #6
    Registrierter Benutzer
    Registriert seit
    19.05.2009
    Beiträge
    4.045
    Ich würde ja eher ein optionales Argument für den Vornamen benutzen.
    Code:
    \documentclass[11pt,a4paper,twoside,bibliography=totoc]{scrbook}
    
    
    %Verzeichnisse
    \usepackage{imakeidx}
    \makeindex[name=Person, title=Personenverzeichnis]
    
    \usepackage{xparse}
    
    \NewDocumentCommand\Name{ o m }
     {%
      \IfNoValueTF{#1}
       {\textsc{#2}\index[Person]{#2@\textsc{#2}}}
       {\textsc{#1 #2}\index[Person]{#2, #1@\textsc{#2}, #1}}%
     }
    
    
    %Beginn des Dokuments
    \begin{document}
    
    Ein Satz.
    \Name{Cicero}
    
    \Name[Max]{Mustermann}
    
    \printindex[Person]
    
    \end{document}

  7. #7
    Registrierter Benutzer
    Registriert seit
    13.03.2014
    Ort
    Berlin
    Beiträge
    21
    Dir auch vielen Dank für die Mühe. Das hat auch mit meinem (offensichtlich nicht ganz aktuellen) KOMA-Skript geklappt. Xparse muss ich mir mal näher ansehen, vielleicht löst sich damit auch mein anderes Problem.

Lesezeichen

Berechtigungen

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