\renewcommand Thema ist als GELÖST markiert
- Stefan Kottwitz
- Admin
- Beiträge: 2541
- Registriert: Di 8. Jul 2008, 00:39
- Kontaktdaten:
Makro-Redefinition versus Klassenoption
Hallo Matze,
mit \renewcommand redefiniert man zunächst mal ein Makro, ob man nun den Inhalt eines schlichten Textmakros ändern möchte oder etwa einen workaround beabsichtigt, weil die ursprüngliche Definition ein Problem verursacht.
Oft enthalten Makros wie obengenanntes \contentsname einen voreingestellten Text wie "Contents". Um diesen einer anderen Sprache anzupassen oder eben einfach etwas zu verändern, nimmt man \renewcommand. Kannst Du Dir sämtliche denkbaren Textmakros als Klassenoptionen oder Paketoptionen vorstellen? Dann geht es weiter mit Schriftformatmakros usw.
Multilinguale Pakete wie babel redefinieren solche gewisse bekannte und übliche Makros, verwenden teils \def statt \renewcommand.
Mehr Optionen können natürlich solche direkten Redefinitionen erübrigen, das versuchen auch einige Pakete.
Viele Grüße,
Stefan
mit \renewcommand redefiniert man zunächst mal ein Makro, ob man nun den Inhalt eines schlichten Textmakros ändern möchte oder etwa einen workaround beabsichtigt, weil die ursprüngliche Definition ein Problem verursacht.
Oft enthalten Makros wie obengenanntes \contentsname einen voreingestellten Text wie "Contents". Um diesen einer anderen Sprache anzupassen oder eben einfach etwas zu verändern, nimmt man \renewcommand. Kannst Du Dir sämtliche denkbaren Textmakros als Klassenoptionen oder Paketoptionen vorstellen? Dann geht es weiter mit Schriftformatmakros usw.
Multilinguale Pakete wie babel redefinieren solche gewisse bekannte und übliche Makros, verwenden teils \def statt \renewcommand.
Mehr Optionen können natürlich solche direkten Redefinitionen erübrigen, das versuchen auch einige Pakete.
Viele Grüße,
Stefan
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.
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.
goLaTeX-Knigge (mit Minimalbeispiel und »So stellst Du Deine Frage richtig«)
Wie kann ich Code in meinem Beitrag hervorheben?
Wie hänge ich ein Bild an meine Frage?
KOMA-Script
Wie kann ich Code in meinem Beitrag hervorheben?
Wie hänge ich ein Bild an meine Frage?
KOMA-Script