von KOMA » Di 7. Jul 2009, 09:35
Die Verwendung von \renewcommand wurde von den LaTeX-Entwicklern als unterste Ebene zur Änderung von Makros vorgesehen. Wie man an den Standardklassen sieht, war das dabei eigentlich weniger dazu gedacht, ganz normale Einstellungen vorzunehmen. Sonst hätten sie beispielsweise für die Titelei nicht extra Anweisungen \title{...}, \author{.,,}, \date{...} vorgesehen, um damit die internen Makros \@title, \@author und \@date zu ändern und so die Titelei einzustellen. Dann hätten sie auch gleich in \title, \author und \date den entsprechenden Inhalt ablegen und dokumentieren können, dass man den mit Hilfe von \renewcommand*{\title}{...} etc. ändert.
Mit der Zeit hat sich dann aber eine Art zusätzliche Schicht bei LaTeX etabliert. Auf dieser Schicht sind in Klassen und Paketen Einstellungen angesiedelt, die im Normalfall vom Autor nicht geändert werden müssen, die aber vom Designer, Typografen, Layouter oder Setzer (wir lassen hier einmal außen vor, dass das inzwischen alles Bereiche sind, in denen sich auch die Autoren bewegen oder bewegen müssen) leicht geändert werden können. Auf dieser Ebene ist es Standard, dass Einstellungen auch mit \renewcommand vorgenommen werden. Es gibt aber auch Klassen, die auch auf dieser Ebene versuchen, Implementierungsdetails hinter Markup zu verbergen ─ weniger, um die Implementierung zu verschleiern (der dokumentierte Source beweist das Gegenteil), als um definierte Schnittstellen zu Code zu schaffen, der ggf. Änderungen unterworfen ist. KOMA-Script bietet im (allgemein verwendbaren) Paket scrbase beispielsweise mit \newcaptionname, \renewcaptionname, \providecaptionname Befehle, um unabhängig vom verwendeten Sprachpaket Sprach-Makros definieren und ändern zu können.
Daneben gibt es einfach Dinge, die in den Klassen und Paketen nicht vorgesehen sind. Wenn eine Klasse oder ein Paket keine definierte Schnittstelle für eine Änderung bietet, dann bleibt als erstes Mittel eben die im LaTeX-Kern vorgesehene Schnittstelle zum Ändern von Makros und das ist \renewcommand. Nicht selten muss man dann aber auch ganz schnell noch eine Ebene tiefer greifen, und auf TeX-Anweisungen wie \let zurückgreifen. In einigen Fällen ist es sogar erforderlich \def, \edef und ähnliche statt der in LaTeX vorgesehenen \renewcommand (für Anwender und Paketautoren), \g@addto@macro (für Paketautoren), \protected@edef (für Paketautoren) etc. zu verwenden. Teilweise kann man \def, \edef, \g@addto@macro u. v. m. auch vermeiden, wenn man als Anwender oder Paketautor Pakete wie
etoolbox verwendet.
Ob es ein Mangel des Pakets bzw. der Klasse ist, wenn etwas nicht per vom Paket bzw. der Klasse vorgesehener Anweisung bzw. Option eingestellt werden kann, oder ob es schlicht ein Mangel des Autors ist, ein Paket oder eine Klasse in nicht vorgesehener Weise verwenden zu wollen, sei dahin gestellt. In der Regel kann man sich an den Autor wenden, wenn man der Meinung ist, dass eine Einstellmöglichkeit etabliert werden sollte. Der wird dann entscheiden, ob das wirklich sinnvoll ist oder beispielsweise die \renewcommand-Möglichkeit ausreichend ist. Vielleicht wird er diese dann auch als das Mittel der Wahl dokumentieren. Ich bin sicher, dass beispielsweise in KOMA-Script weit mehr als die Hälfte aller Möglichkeiten auf Zuruf durch die Anwender entstanden sind. Ich brauche nur ganz wenige Möglichkeiten von KOMA-Script selbst. Axel hat mal erwähnt, dass das bei caption ganz ähnlich ist. Auch er hat nur wenig Bedarf für die Möglichkeiten des eigenen Pakets.
Die Verwendung von \renewcommand wurde von den LaTeX-Entwicklern als unterste Ebene zur Änderung von Makros vorgesehen. Wie man an den Standardklassen sieht, war das dabei eigentlich weniger dazu gedacht, ganz normale Einstellungen vorzunehmen. Sonst hätten sie beispielsweise für die Titelei nicht extra Anweisungen \title{...}, \author{.,,}, \date{...} vorgesehen, um damit die internen Makros \@title, \@author und \@date zu ändern und so die Titelei einzustellen. Dann hätten sie auch gleich in \title, \author und \date den entsprechenden Inhalt ablegen und dokumentieren können, dass man den mit Hilfe von \renewcommand*{\title}{...} etc. ändert.
Mit der Zeit hat sich dann aber eine Art zusätzliche Schicht bei LaTeX etabliert. Auf dieser Schicht sind in Klassen und Paketen Einstellungen angesiedelt, die im Normalfall vom Autor nicht geändert werden müssen, die aber vom Designer, Typografen, Layouter oder Setzer (wir lassen hier einmal außen vor, dass das inzwischen alles Bereiche sind, in denen sich auch die Autoren bewegen oder bewegen müssen) leicht geändert werden können. Auf dieser Ebene ist es Standard, dass Einstellungen auch mit \renewcommand vorgenommen werden. Es gibt aber auch Klassen, die auch auf dieser Ebene versuchen, Implementierungsdetails hinter Markup zu verbergen ─ weniger, um die Implementierung zu verschleiern (der dokumentierte Source beweist das Gegenteil), als um definierte Schnittstellen zu Code zu schaffen, der ggf. Änderungen unterworfen ist. KOMA-Script bietet im (allgemein verwendbaren) Paket scrbase beispielsweise mit \newcaptionname, \renewcaptionname, \providecaptionname Befehle, um unabhängig vom verwendeten Sprachpaket Sprach-Makros definieren und ändern zu können.
Daneben gibt es einfach Dinge, die in den Klassen und Paketen nicht vorgesehen sind. Wenn eine Klasse oder ein Paket keine definierte Schnittstelle für eine Änderung bietet, dann bleibt als erstes Mittel eben die im LaTeX-Kern vorgesehene Schnittstelle zum Ändern von Makros und das ist \renewcommand. Nicht selten muss man dann aber auch ganz schnell noch eine Ebene tiefer greifen, und auf TeX-Anweisungen wie \let zurückgreifen. In einigen Fällen ist es sogar erforderlich \def, \edef und ähnliche statt der in LaTeX vorgesehenen \renewcommand (für Anwender und Paketautoren), \g@addto@macro (für Paketautoren), \protected@edef (für Paketautoren) etc. zu verwenden. Teilweise kann man \def, \edef, \g@addto@macro u. v. m. auch vermeiden, wenn man als Anwender oder Paketautor Pakete wie [url=http://ctan.org/pkg/etoolbox]etoolbox[/url] verwendet.
Ob es ein Mangel des Pakets bzw. der Klasse ist, wenn etwas nicht per vom Paket bzw. der Klasse vorgesehener Anweisung bzw. Option eingestellt werden kann, oder ob es schlicht ein Mangel des Autors ist, ein Paket oder eine Klasse in nicht vorgesehener Weise verwenden zu wollen, sei dahin gestellt. In der Regel kann man sich an den Autor wenden, wenn man der Meinung ist, dass eine Einstellmöglichkeit etabliert werden sollte. Der wird dann entscheiden, ob das wirklich sinnvoll ist oder beispielsweise die \renewcommand-Möglichkeit ausreichend ist. Vielleicht wird er diese dann auch als das Mittel der Wahl dokumentieren. Ich bin sicher, dass beispielsweise in KOMA-Script weit mehr als die Hälfte aller Möglichkeiten auf Zuruf durch die Anwender entstanden sind. Ich brauche nur ganz wenige Möglichkeiten von KOMA-Script selbst. Axel hat mal erwähnt, dass das bei caption ganz ähnlich ist. Auch er hat nur wenig Bedarf für die Möglichkeiten des eigenen Pakets.