Ich verwende TikZ und lade jetzt zusätzlich xcolor mit der table-Option und erhalte eine Fehlermeldung.

Dieses Minimalbeispiel

\documentclass{article}
\usepackage{tikz}
\usepackage[table]{xcolor}
\begin{document}
text
\end{document}

gibt

! LaTeX Error: Option clash for package xcolor.

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

l.4 \begin
          {document}

Die beiden Pakete vertragen sich wohl nicht. Wie behebe ich so ein Problem im allgemeinen?

gefragt 25 Aug '13, 11:51

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

bearbeitet 29 Aug '13, 11:14

saputello's gravatar image

saputello
11.1k174365


Ein option clash geschieht, wenn ein Paket zweimal mit unterschiedlicher Optionenliste geladen wird. Oft geschieht das, weil ein Paket von einem anderen geladen wird, ohne dass man das weiß, so wie in Deinem Beispiel.

Zwei Fälle sollte man hier unterscheiden:

  1. einmal wird das Paket ohne Optionen und einmal mit Optionen geladen. Hier genügt es, die Ladereihenfolge zu vertauschen, so dass der Aufruf mit Optionen zuerst erfolgt. Also statt

    \documentclass{article}
    \usepackage{xcolor}% vielleicht versteckt in einem anderen Paket
    \usepackage[table]{xcolor}
    \begin{document}
     Fehler
    \end{document}
    

    die andere Reihenfolge:

    \documentclass{article}
    \usepackage[table]{xcolor}
    \usepackage{xcolor}% vielleicht versteckt in einem anderen Paket
    \begin{document}
     Kein Fehler
    \end{document}
    

    Das ist daher auch in der Regel die erste Maßnahme, die man ausprobiert.

  2. Das Paket wird zweimal mit Optionen geladen, aber mit unterschiedlichen:

    \documentclass{article}
    \usepackage[svgnames]{xcolor}
    \usepackage[table]{xcolor}% vielleicht versteckt in einem anderen Paket
    \begin{document}
     Fehler
    \end{document}
    

    In einem solchen Fall kann man anstatt das Paket ein zweites Mal zu Laden, die Optionen an das Paket weiterreichen. Dafür gibt es den Befehl \PassOptionsToPackage{<Optionen>}{<Paket>}:

    \documentclass{article}
    \PassOptionsToPackage{svgnames}{xcolor}
    \usepackage[table]{xcolor}% vielleicht versteckt in einem anderen Paket
    \begin{document}
     Kein Fehler
    \end{document}
    

    Diese Maßnahme hätte auch im ersten Fall funktioniert. \PassOptionsToPackage muss übrigens vor dem ersten Laden des betreffenden Pakets eingesetzt werden. Setzt man es daher vor \documentclass, dann ist man auf der sicheren Seite.

Oft hilft es auch, die zusätzliche Option global einzusetzen, das heißt, sie der Klasse mitzugeben:

\documentclass[svgnames]{article}
\usepackage[table]{xcolor}% vielleicht versteckt in einem anderen Paket
\begin{document}
 Kein Fehler
\end{document}

Diese letzte Maßnahme funktioniert in der Regel auch, wenn das betreffende Paket nicht von anderen Paket sondern von der Dokumentenklasse geladen wird. (So lädt die beamer-Klasse z.B. ebenfalls das xcolor Paket):

\documentclass[svgnames,table]{beamer}
\begin{document}
\begin{frame}
 \textcolor{Goldenrod}{Kein Fehler}

 \begin{tabular}{|l|c|}
  \rowcolor[gray]{.9}
  eins & zwei\\
  \rowcolor[gray]{.5}
  drei & vier
 \end{tabular}
\end{frame}
\end{document}

Wenn alle Stricke reißen, kann man das betreffende Paket auch vor der Klasse zu laden (mit \RequirePackage statt \usepackage), oder (wie oben schon vorgeschlagen) eben den Aufruf \PassOptionsToPackage vor \documentclass zu setzen. Nötig kann das z.B. sein, da der Einsatz als globale Option an alle Pakete weitergereicht wird, die die Option kennen, was manchmal unerwünscht sein kann. Vorsicht: nicht jedes Paket kann erfolgreich vor der Klasse geladen werden! Diese Maßnahme sollte man nur in Ausnahmefällen verwenden, wenn man weiß, was man tut.

Permanenter link

beantwortet 25 Aug '13, 12:35

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%

bearbeitet 10 Dez '13, 09:50

Die beamer-Klasse bietet übrigens extra Optionen an, Optionen an automatisch geladene Pakete weiterzugeben, also

\documentclass[xcolor={svgnames,table}]{beamer}

Im Manual ist das im Abschnitt „2.6 Compatibility with Other Packages and Classes” beschrieben (für color sowie für xcolor).

(25 Aug '13, 22:42) Qrrbrbirlbel

@Qrrbrbirlbel dann ist beamer ein schlechtes Beispiel für die Antwort, weil sie in dieser Hinsicht doch ziemlich untypisch ist.

(25 Aug '13, 22:45) cgnieder

Der folgende expl3 Code definiert \usepackage um, sodass die Namen aller Pakete, die über \usepackage geladen werden sollen, sowie alle sukzessive gegebenen Optionen, gespeichert werden. Im \AtBeginDocument Hook werden die Pakete dann tatsächlich geladen. (Bitte diesen Code nicht benutzen! Der "Option clash" hat schon seine Daseinsberechtigung. Das hier ist nur "Proof of Concept")

Open in writeLaTeX
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_case:nnTF { nV }
\tl_new:N \g_felix_packages_tl
\seq_new:N \g_felix_packages_seq

\cs_set_eq:NN \felix_saveusepackage:wn \usepackage

\cs_new_protected:Npn \felix_usepackage:nn #1#2
 {
  \felix_saveusepackage:wn [ #1 ] { #2 }
 }
\cs_generate_variant:Nn \felix_usepackage:nn { vn }

\cs_new_protected:Npn \felix_addpackage:nn #1#2
 {
  \str_case:nVTF { #2 } \g_felix_packages_tl
   {
    \tl_gput_right:cn { g_felix_#2_tl } { #1, }
   }
   {
    \tl_new:c { g_felix_#2_tl }
    \tl_gput_right:cn { g_felix_#2_tl } { #1, }
    \tl_gput_right:Nn \g_felix_packages_tl { {#2}{} }
    \seq_gput_right:Nn \g_felix_packages_seq { #2 }
   }
 }

\cs_new_protected:Npn \felix_loadpackages:
 {
  \seq_map_inline:Nn \g_felix_packages_seq
   {
    \felix_usepackage:vn { g_felix_##1_tl } { ##1 }
   }
 }

\RenewDocumentCommand \usepackage { O{} m }
 {
  \felix_addpackage:nn { #1 } { #2 }
 }

\AtBeginDocument
 {
  \felix_loadpackages:
 }
\ExplSyntaxOff
\usepackage{xcolor}
\usepackage[dvipsnames]{xcolor}
\usepackage[breaklinks]{hyperref}
\usepackage[unicode]{hyperref}
\begin{document}
\end{document}
Permanenter link

beantwortet 18 Sep '14, 23:03

Henri's gravatar image

Henri
15.7k133943
Akzeptiert-Rate: 46%

bearbeitet 19 Sep '14, 20:40

1

Das übliche und empfohlene Vorgehen ist, Funktionen erst mit n- oder N-Argumenten zu definieren, und danach Varianten zu generieren: \cs_new_protected:Npn \felix_usepackage:nn #1#2 { \felix_saveusepackage:w [{#1}] {#2} } und \cs_generate_variant:Nn \felix_usepackage:nn { v }. (Ich würde außerdem \felix_saveusepackage:w als \felix_saveusepackage:wnw definieren: es hat ja drei Argumente...)

(19 Sep '14, 00:25) cgnieder

@Clemens Vielen Dank! Müsste es nach Deiner Methode nicht \felix_saveusepackage:wnwn sein? Ich habe mich für \felix_saveusepackage:wn entschieden, da meiner Meinung die [, ] keine Argumente sind sondern eher Bestandteil des ersten Arguments sind.

(19 Sep '14, 20:42) Henri
1

@Henri hat \usepackage nicht drei Argumente? Ein optionales für Optionen (weird), ein obligatorisches fürs Paket (normal) und ein optionales für die Version (weird)? Demnach würde wnw doch ganz gut passen...

(23 Sep '14, 18:19) cgnieder

@Henri Die Idee an sich ist nicht schlecht. Allerdings verhindert sie, dass man die Pakete bereits in der Präambel nutzen kann, beispielsweise um Konfigurationen via via \hypersetup vorzunehmen o. ä. Ich würde daher eine zusätzliche Benutzeranweisung (z. B. \LoadPackages) vorschlagen, bei der die Pakete dann tatsächlich geladen werden und dafür \usepackage danach Warnungen ausgibt. Außerdem müsste man ev. tiefer bei \RequirePackage ansetzen, weil natürlich auch Pakete, Pakete mit (unterschiedlichen) Optionen laden können, so dass das Problem nur bis zum Laden der Pakete verschoben wird

(23 Sep '14, 18:39) gast3

Das erinnert mich spontan daran, dass es seit nicht allzu langer Zeit ein Paket pkgloader gibt, das angeblich solche Probleme löst. Ich hab's aber noch nie verwendet...

(23 Sep '14, 18:45) 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:

×731
×128
×48
×14
×11

gestellte Frage: 25 Aug '13, 11:51

Frage wurde gesehen: 64,552 Mal

zuletzt geändert: 23 Sep '14, 18:45