Ich versuche eine Wrapper-Klasse zu schreiben. Ich habe dabei das Problem, dass die Unused-options-Warnung nicht wie gewünscht funktioniert. Ich habe dabei sowohl mit kvoptions als auch mit scrbase gearbeitet.

Bei meinem Minimalbeispiel bekomme ich unerwünschte Warnungen für Optionen von scrartcl bzw. typearea, obwohl diese anscheinend korrekt angewendet werden.

Open in Online-Editor
\begin{filecontents}{mwe.cls}
\ProvidesClass{mwe}[2015/12/15 non sense class]%
\LoadClassWithOptions{scrartcl}%
\RequirePackage{mwe}
\DefineFamily{mwe}% Key Family with scrbase
\DefineFamilyMember{mwe}% add \@currname.\currfile to family
\FamilyBoolKey{mwe}{foo}{mwe@foo}% create bool option foo
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{scrartcl}}
\FamilyProcessOptions{mwe}\relax
%\FamilyProcessOptions[.scrartcl.cls]{KOMA}\relax
\ifmwe@foo
    \setkomafont{disposition}{\rmfamily}
\fi
\end{filecontents}
\documentclass[twoside,foo,bar]{mwe}
\begin{document}
\blinddocument
\end{document}

Die Warnung lautet

Unused global option(s): [twoside,bar].

Kommentiere ich die folgende Zeile ein,

Open in Online-Editor
\FamilyProcessOptions[.scrartcl.cls]{KOMA}\relax

erhalte ich

Unused global option(s): [foo,bar].

Wenn ich hingegen

Open in Online-Editor
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{scrartcl}}

einkommentiere bekomme ich gar keine Warnung mehr, obwohl die Option bar nicht definiert ist.

gefragt 15 Dez '15, 09:15

sudo's gravatar image

sudo
2.0k51521
Akzeptiert-Rate: 39%

bearbeitet 15 Dez '15, 09:32

Ich hab jetzt zwar eine Lösung gefunden. Wenn aber jemand noch erklären könnte, was in welchem Fall genau passiert, wäre ich dafür dankbar.

Warum das (erneute) abarbeiten der scrartcl-Optionen die Option foo wieder in die Liste der unused options schreibt, hab ich nach wie vor nicht verstanden.

(15 Dez '15, 09:37) sudo

Sehr schöne Frage! Mit der Verarbeitung von Optionen durch \LoadClass und \LoadClassWithOptions tun sich einige Paketautoren schwer.

(15 Dez '15, 09:49) saputello

Das Verhalten ist korrekt. Ohne die Zeile

Open in Online-Editor
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{scrartcl}}

bekommt scrartcl die Optionen zwar zu sehen, allerdings bevor in Deiner Klasse die Optionen verarbeitet werden und alle Optionen.

Mit der Zeile jedoch, verwendet aus LaTeX-Sicht Deine Klasse diese Optionen bereits. Also werden sie aus der Liste der unbenutzten Optionen gestrichen. Gleichzeitig bekommt aber scrartcl die Optionen tatsächlich nie zu Gesicht, weil es zu dem Zeitpunkt bereits geladen ist. Die Klasse kann also auch nicht mehr an LaTeX melden, dass es Option bar gar nicht kennt.

Was ist also die Lösung? Die Lösung besteht darin, die grundlegende Klasse erst zu laden, nachdem man die eigenen Optionen abgearbeitet hat. Damit die grundlegende Klasse dann nur die Optionen bekommt, die von der eigenen Klasse nicht bereits verarbeitet wurden, darf man sie natürlich nicht mit \LoadClassWithOptions laden, sondern nur mit \LoadClass:

Open in Online-Editor
\RequirePackage{filecontents}
\begin{filecontents}{mwe.cls}
\ProvidesClass{mwe}[2015/12/15 non sense class]%
\RequirePackage{mwe}
\RequirePackage{scrbase}
\DefineFamily{mwe}% Key Family with scrbase
\DefineFamilyMember{mwe}% add \@currname.\currfile to family
\FamilyBoolKey{mwe}{foo}{mwe@foo}% create bool option foo
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{scrartcl}}
\FamilyProcessOptions{mwe}\relax
\LoadClass{scrartcl}%
\end{filecontents}
\documentclass[twoside,foo,bar]{mwe}
\begin{document}
\blinddocument
\end{document}

Das ergibt korrekt die Meldung:

LaTeX Warning: Unused global option(s):
    [bar].

Dass ein nachgeschobenes \FamilyProcessOptions für die KOMA-Script-Klassen nicht wie erhofft funktioniert liegt schlicht daran, dass in dem Fall eben nicht die Optionen verarbeitet werden, die beim Laden der KOMA-Script-Klasse aktuell waren, sondern die Optionen, die während dem Laden Deiner Klasse aktuell sind. Es werden also wieder alle Optionen ganz neu verarbeitet, also auch die für scrartcl unbekannten Optionen. Ich glaube auch nicht, dass es vorgesehen ist, dass man einfach mal eben die Optionen eines fremden Besitzers noch einmal ausführt.

Permanenter link

beantwortet 15 Dez '15, 09:45

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 15 Dez '15, 09:55

Jetzt hab ich doch noch eine Lösung gefunden.

Es ist natürlich Unsinn die Klasse zu laden und hinterher mit \PassOptionsToClass Optionen an sie zu übergeben.

\LoadClassWithOptions übergibt alle Optionen an die Klasse. Optionen die in scrartcl nicht existieren ergeben damit eine Warnung.

Es müssen als erstes die Optionen der Wrapper-Klasse definiert und abgearbeitet werden, bevor die Klasse (scrartcl) mit \LoadClass geladen wird.

Open in Online-Editor
\begin{filecontents}{mwe.cls}
\ProvidesClass{mwe}[2015/12/15 non sense class]%
\RequirePackage{scrbase}
\RequirePackage{mwe}
\DefineFamily{mwe}% Key Family with scrbase
\DefineFamilyMember{mwe}% add \@currname.\currfile to family
\FamilyBoolKey{mwe}{foo}{mwe@foo}% create bool option foo
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{scrartcl}}
\FamilyProcessOptions{mwe}\relax
\LoadClass{scrartcl}%
\ifmwe@foo
    \setkomafont{disposition}{\rmfamily}
\fi
\end{filecontents}
\documentclass[twoside,foo,bar]{mwe}
\begin{document}
\blinddocument
\end{document}

Dieses Beispiel gibt korrekt die Warnung

Unused global option(s): [bar].

Permanenter link

beantwortet 15 Dez '15, 09:31

sudo's gravatar image

sudo
2.0k51521
Akzeptiert-Rate: 39%

2

Uups. Ich hatte Deine eigene Lösung glatt übersehen. Ich lasse meine Antwort jetzt trotzdem stehen, weil ich darin noch versucht habe, ein paar Hintergründe anzureißen.

(15 Dez '15, 10:35) saputello
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:

×23
×1

gestellte Frage: 15 Dez '15, 09:15

Frage wurde gesehen: 8,070 Mal

zuletzt geändert: 15 Dez '15, 10:35