\XXX ist mal dieser oder jener Befehl, je nach Paketen, scheint dann ein Konflikt zwischen Paketen oder einem Paket und der Klasse sein. Hat sich immer durch Herausnehmen eines Pakets lösen lassen. Wenn ich ein bestimmtes Paket dennoch haben will, lässt sich das Problem im Allgemeinen irgendwie lösen? Egal ob ich jetzt eine Version eines doppelt definierten Makros "verliere" - gerade wenn ich dieses gar nicht brauche.
Wenn Du das Makro in Version eins sicher nicht brauchst, reicht in der Regel \let\XXX\relax bevor man das Paket lädt, das die zweite Version definiert. In Ausnahmefällen (wenn z.B. etwas at begin document passiert) muss man ein klein wenig kreativer werden.
\XXX ist dabei das bemängelte Makro. Das \makeatletter und \makeatother wird nur gebraucht, wenn es ein interner Befehl ist, der das Zeichen @ enthält.
Die Konflikte zwischen Paketen können zahlreich sein. Selbst wenn wir uns darauf beschränken, dass es sich um gleich benannte Makros handelt, können die Auswirkungen unterschiedlich sein. Ein Fall wie der genannte, in dem es die Fehlermeldung
Code, hier editierbar zum Übersetzen:
1
2
3
4
5
! LaTeX Error: Command \foo already defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Ob das immer funktioniert, hängt aber vom konkreten Einzelfall ab. (Vielleicht ist die „unschädlich“ gemachte Version essentiell wichtig für Paket Nummer eins...?)
Wenn man die erste Version speichern möchte, nur für den Fall, dann kann man meistens etwas wie \let\OLDfoo\foo einsetzen, bevor man \foo auf \relax setzt:
Und nicht zu vergessen: Auch \let funktioniert nicht bei Makros mit optionalen Argumenten (und, lese ich gerade, bei Macros, die mit \DeclareRobustCommand definiert wurden). Heiko Oberdieks letltxmacro hilft dann in vielen Fällen, aber leider auch nicht immer weiter.
Stimmt. Aber da es ja so viele verschiedene Fälle gibt, in denen der oben beschriebene Ansatz nicht funktioniert, hab ich das absichtlich nicht mit in meine Antwort genommen
Wenn Du das Makro in Version eins sicher nicht brauchst, reicht in der Regel
\let\XXX\relax
bevor man das Paket lädt, das die zweite Version definiert. In Ausnahmefällen (wenn z.B. etwas at begin document passiert) muss man ein klein wenig kreativer werden.