PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfrage von Argumenten



latexberlin
30-09-2015, 05:43
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:


\newcommand*{\Name}[2]{\textsc{#1 #2\index[Person]{\textsc{#2}, #1}}}

Aufgerufen wird es mit:


\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
\Name{}{Mustermann} im Personenregister zu "Mustermann, , Seitenangabe" und im Text selbst zu einem weiteren Leerzeichen.

Vielen Dank.
Gruss Latexberlin

klops
30-09-2015, 06:39
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):
\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.

latexberlin
30-09-2015, 07:11
Danke für Deine Antwort.

Hier das Minimalbeispiel mit Deinem 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- <argument> Max\IfArgIsEmpty{Mustermann}{}{Mustermann} I.20 \Name{Max}{Mustermann}

klops
30-09-2015, 09:13
imakeindex hat offenbar Probleme mit robust deklarierten Befehlen:
\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 (http://www.komascript.de/current) 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.

latexberlin
30-09-2015, 11:34
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

u_fischer
30-09-2015, 19:19
Ich würde ja eher ein optionales Argument für den Vornamen benutzen.
\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}

latexberlin
30-09-2015, 21:52
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.