\renewcommand Thema ist als GELÖST markiert

Fragen und Probleme, die nicht den obigen Kategorien zugeordnet werden können


matze

\renewcommand

Beitrag von matze »

...
Zuletzt geändert von matze am Mo 19. Sep 2011, 00:34, insgesamt 1-mal geändert.

Benutzeravatar
Stefan Kottwitz
Admin
Admin
Beiträge: 2541
Registriert: Di 8. Jul 2008, 00:39
Kontaktdaten:

Makro-Redefinition versus Klassenoption

Beitrag von Stefan Kottwitz »

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

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

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.

Antworten