Wie in meiner früheren Frage kriege ich auch in anderen Fällen manchmal den Fehler

! LaTeX Error: Command \XXX already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.

\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.

gefragt 01 Dez '13, 17:31

Student's gravatar image

Student
5807779104
Akzeptiert-Rate: 82%

bearbeitet 01 Dez '13, 17:33

1

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.

(01 Dez '13, 17:34) cgnieder

Ich behelfe mich jetzt mit diesem Workaround direkt vor dem Laden des konfliktenden Pakets:

\makeatletter
\let\XXX\relax
\makeatother

\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.

Permanenter link

beantwortet 01 Dez '13, 17:34

Student's gravatar image

Student
5807779104
Akzeptiert-Rate: 82%

bearbeitet 01 Dez '13, 17:36

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

! 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.
Type  H <return>  for immediate help.

gibt, ist eigentlich ganz gut, dann weiß man wenigstens, was los ist. xparse bringt übrigens eine leicht veränderte Meldung:

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "xparse/command-already-defined"
! 
! Command '\foo' already defined!
! 
! See the LaTeX3 documentation for further information.
! 
! For immediate help type H <return>.
!...............................................

Wenn man weiß, dass man die eine Version nicht braucht, dann kann man sie meistens mit \let\foo\relax „unschädlich“ machen:

\documentclass{article}
\usepackage{newtxmath}
\let\vary\relax
\usepackage{exsheets}
\begin{document}
\end{document}

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:

\documentclass{article}
\usepackage{newtxmath}
\newcommand*\NTXvary{}
\let\NTXvary\vary
\let\vary\relax
\usepackage{exsheets}
\begin{document}
\end{document}

Damit wäre die ursprüngliche Bedeutung noch abrufbar. (Auch das kann schiefgehen und hängt wieder vom konkreten Einzelfall ab).

Das Paket savesym liefert dafür übrigens eine Schnittstelle, die manche vielleicht bequemer finden:

\documentclass{article}
\usepackage{savesym}
\usepackage{newtxmath}
\savesymbol{vary}% \vary als \origvary weiter verfügbar
\usepackage{exsheets}
\restoresymbol{exs}{vary}% \vary hat wieder vorige Bedeutung, neue jetzt als
                         % \exsvary gespeichert
\begin{document}
\end{document}

Nicht immer führen Konflikte übrigens zu Fehlermeldungen:

% arara: xelatex
\documentclass{article}
\usepackage{unicode-math}
\usepackage{exsheets}
\begin{document}
\begin{question}
  foo
\end{question}
\end{document}
Permanenter link

beantwortet 01 Dez '13, 18:24

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

2

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.

(25 Dez '13, 02:12) Speravir

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

(25 Dez '13, 07:55) cgnieder
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×127
×48

gestellte Frage: 01 Dez '13, 17:31

Frage wurde gesehen: 26,775 Mal

zuletzt geändert: 25 Dez '13, 07:56