Hallo,
ich habe den Beitrag leider erst jetzt entdeckt, antworte aber trotzdem, vielleicht nützt es noch was.
IrenaSekuta hat geschrieben:Habe deinen Code in eine für mich etwas lesbarere Fassung gebracht:
\makeatletter
\newcommand*{\Quelle}{%
\@ifnextchar{[}{\Quell@}{\Qu@lle}
}
\def\Qu@lle#1{\cite{#1}\xspace}
\def\Quell@[#1]#2{\cite[S.~#1]{#2}\xspace}
\makeatother
Vorsicht vor solchen "Verbesserungen", wenn du nicht genau verstehst, was vor sich geht! In diesem Fall funktioniert das zwar, aber auch nur aufgrund eines Implementierungsdetails von \@ifnextchar. Ich würde deshalb raten, weiterhin meine ursprüngliche Version zu benutzen.
Durch probieren habe ich herausgefunden, dass folgende Zeilen Code quasi dasselbe tun:
\def\Qu@lle#1{\cite{#1}\xspace}
und
\newcommand{\Qu@lle}[1]{\cite{#1}\xspace}
Ja, diese Definitionen sind nahezu völlig äquivalent. Die einzigen Unterschiede sind, dass der zweite Code auch Absatzenden als Argument zulässt (was in der Regel nicht erwünscht ist und mit \newcommand* verhindert werden kann), und dass ein eventuell schon vorhandener Befehl nicht überschrieben wird.
Aber komischerweise funktioniert es bei folgender Codeänderung
nicht:
\def\Quell@[#1]#2{\cite[S.~#1]{#2}\xspace}
\newcommand{\Quell@}[2]{\cite[S.~#1]{#2}\xspace}
Warum funktioniert der zweite von mir erstellte Code nicht?
Weil die Syntax anders ist. \Quell@ erwartet genau eine öffnende eckige Klammer, einen Parameter, eine schließende eckige Klammer und noch einen Parameter. Dies lässt sich mit \newcommand nicht darstellen.
Und noch eine allgemeine Frage:
Hat deine Schreibweise gegenüber meiner irgendwelche Vor-/Nachteile oder ist dein Code "besser", weil er eventuell andere Probleme vermeidet, die ich momentan aufgrund meines rudimentären Latex-Programmier-Wissens nicht erkennen?
Generell sollte man auf der obersten möglichen Ebene arbeiten, d.h. \newcommand benutzen. Da dies hier nicht möglich ist, muss man auf TeX-Primitven zurückgreifen. (Das experimentelle xparse-Paket bietet weitere Möglichkeiten, mit denen sich auch Befehle wie der hier besprochene sehr komfortabel definieren lassen.)
Generell sollte man nicht erwarten, bei internen Befehlen wie \@ifnextchar (erkennbar am @ im Befehlsnamen) Klammer nach Belieben weglassen oder hinzufügen zu können.
Essentiell ist die Beachtung von Leerzeichen: TeX fügt bei fast jedem Zeilenende (außer dieser beendet einen Absatz oder ein Steuernamenstoken ist das letzte Token auf der Zeile) ein Leerzeichen ein, egal ob im Text oder in Befehlsdefinitionen. Deswegen sollten die problematischen Zeilenumbrüche in Befehlsdefinitionen mit einem Kommentarzeichen maskiert werden (so wie ich das bei meinen Definitionen auch gemacht habe).