Betreff
> bestehende mit zufällig gleichem Namen sind mir egal.
Das halte ich für falsch: unter Umständen überschreibt man damit einen Befehl, der von einem Paket bereitgestellt wird, ohne es zu merken und nachher funktioniert dann irgendwas nicht und man muss sich erst mühsam auf die Suche nach der Ursache machen. Wenigstens sollte man sich eine Warnung oder Info in die log-Datei schreiben lassen. Hier ist ein Vorschlag, mit dem das passieren würde:
würde. Er definiert einen Befehl `\definecommand` mit der gleichen Syntax wie `\newcommand`, `\renewcommand` und `\providecommand`:
\documentclass{article}
\makeatletter
% erst mal auf optionalen Stern testen, siehe http://texwelt.de/wissen/fragen/12
% und jenachdem Version mit oder ohne Stern wählen:
\newcommand\definecommand{%
\@ifstar
{\define@command@star}
{\define@command@nostar}}
% einmal mit Stern:
\newcommand\define@command@star[1]{%
\@ifundefined{\expandafter\@gobble\string#1}
{\newcommand*{#1}}
{%
\@latex@warning@no@line{Redefining \string#1!}%
\renewcommand*{#1}%
}}
% und einmal ohne:
\newcommand\define@command@nostar[1]{%
\@ifundefined{\expandafter\@gobble\string#1}
{\newcommand{#1}}
{%
\@latex@warning@no@line{Redefining \string#1!}%
\renewcommand{#1}%
}}
\makeatother
\newcommand\eins{eins}
\definecommand\eins{Eins}
\definecommand\zwei[1]{Zwei #1}
\definecommand*\drei{Drei}
\begin{document}
% \show\befehl schreibt die Definition von \befehl ins log:
\show\eins
\show\zwei
\show\drei
\end{document}
Dieses Beispiel gibt im log folgende Ausgabe:
LaTeX Warning: Redefining \eins!.
(./test.aux)
> \eins=\long macro:
->Eins.
l.36 \show\eins
> \zwei=\long macro:
#1->Zwei #1.
l.37 \show\zwei
> \drei=macro:
->Drei.
l.38 \show\drei
Es gibt also eine Warnung über die Neudefinition und auch die Stern- und die Nicht-Sterndefinition und die Parameter funktionieren wie gewünscht.
Noch eine Erklärung zur Zeile
\@ifundefined{\expandafter\@gobble\string#1}
Der Befehl `\@ifundefined{<befehlsname>}{<wahr>}{<falsch>}` erwartet einen Befehlsnamen _ohne_ Backslash. Dafür wird der Befehlsname, der in `#1` steckt erst einmal in eine Reihe Zeichen mit Kategorie-Code 12 verwandelt (`\string#1`) und vom Ergebnis das erste Zeichen mit `\@gobble` entfernt. Damit die diese Anweisungen in der richtigen Reihenfolge stimmt, geschehen, ist das `\expandafter` nötig.