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:
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
Code, hier editierbar zum Übersetzen:
1
2
3
4
5
6
\documentclass{article}
\usepackage{xcolor}% vielleicht versteckt in einem anderen Paket
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>}:
Code, hier editierbar zum Übersetzen:
1
2
3
4
5
6
\documentclass{article}
\PassOptionsToPackage{svgnames}{xcolor}
\usepackage[table]{xcolor}% vielleicht versteckt in einem anderen Paket
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:
Code, hier editierbar zum Übersetzen:
1
2
3
4
5
\documentclass[svgnames]{article}
\usepackage[table]{xcolor}% vielleicht versteckt in einem anderen Paket
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):
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.
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")
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...)
@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.
@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...
@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
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...