Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 6

31 Aug '13, 17:36

cgnieder's gravatar image

cgnieder
22.1k253463

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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 5

31 Aug '13, 14:55

cgnieder's gravatar image

cgnieder
22.1k253463

Du kannst `\@namedef{<befehlsname>}{<definition>}` verwenden, das vom LaTeX-Kernel bereitgestellt wird. Allerdings hat es ein @ im Namen, weswegen man [`\makeatletter` und `\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] `\\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
Klicke auf Einblenden/Ausblenden von Überarbeitungen 4

31 Aug '13, 14:42

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 3

31 Aug '13, 14:41

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 2

31 Aug '13, 14:37

cgnieder's gravatar image

cgnieder
22.1k253463

Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

31 Aug '13, 14:30

cgnieder's gravatar image

cgnieder
22.1k253463

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×