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, 11:31

Student's gravatar image

Student
4702578103
Akzeptiert: 96%

bearbeitet 01 Dez '13, 11: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, 11:34) Clemens

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, 11:34

Student's gravatar image

Student
4702578103

bearbeitet 01 Dez '13, 11: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, 12:24

Clemens's gravatar image

Clemens
19.0k113060

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.

(24 Dez '13, 20: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, 01:55) Clemens
Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×83
×40

Frage gestellt: 01 Dez '13, 11:31

Frage wurde angeschaut: 6,957 Mal

Zuletzt aktualisiert: 25 Dez '13, 01:56