Du kannst `\@namedef{<befehlsname>}{<definition>}` verwenden, das vom LaTeX-Kernel bereitgestellt wird. Allerdings hat es ein @ im Namen, weswegen man [`\makeatletter` [`\\makeatletter` und `\makeatother`][1] `\\makeatother`][1] einsetzen muss. Außerdem testet es nicht, ob ein Makro bereits definiert ist, was `\newcommand` ja macht. Hier wäre eine Möglichkeit, die `\@ifdefinable` verwendet (den Test, der auch von `\newcommand` durchgeführt wird):
\makeatletter
\newcommand{\erzeuge}[2]{%
\expandafter\@ifdefinable\csname#1\endcsname
{\@namedef{#1}{#2}}%
}
\makeatother
Einfacher wäre aber vielleicht, den Befehlsnamen mit `\csname ...\endcsname` zu erzeugen und dann von `\newcommand` definieren zu lassen:
\newcommand{\erzeuge}[2]{%
\expandafter\newcommand\csname#1\endcsname{#2}}
Wenn kein Absatz in der Definition vorkommen wird, [wäre es übrigens von Vorteil][2]
\newcommand*{\erzeuge}[2]{ ... }
zu verwenden.
Das [`etoolbox`][3] Paket stellt übrigens eine ganze Reihe zu `\@namedef` ähnlicher Befehle bereit (`\csdef` wäre das direkte Äquivalent).
`\csname bla\endcsname` ist nach einer Expansion gleichbedeutend mit dem Aufruf `\bla` mit dem Unterschied, dass `\bla` [die Bedeutung `\\relax`][4] bekommt, wenn es vorher nicht definiert war. Damit kann also kein _undefined control sequence_ Fehler passieren. `\@namedef{bla}` ist eine Hülle für `\expandafter\def\csname bla\endcsname`.
[1]: http://texwelt.de/wissen/fragen/1/was-machen-eigentlich-makeatletter-und-makeatother
[2]: http://texwelt.de/wissen/fragen/12/was-ist-der-unterschied-zwischen-newcommand-und-newcommand
[3]: http://www.ctan.org/pkg/etoolbox
[4]: http://texwelt.de/wissen/fragen/894/was-macht-relax