Sie sind hier

Erweiterung bestehender Optionen des KOMA-Scriptes

Hallo liebe KOMA-Community,

ich bin gerade dabei, auf Basis der KOMA-Klassen eigene Klassen für eine Vorlage zu entwerfen. Bei folgendem Problem benötige ich Hilfe bzw. einen Hinweis. Ich möchte gerne einen Schlüssel, der im KOMA-Script bereits definiert ist, um weitere Werte ergänzen.

Im Speziellen möchte ich für den Schlüssel abstract (welcher ja mit \FamilyBoolKey definiert wird) neben den möglichen Werten on und off einen dritten Wert new zuweisen können. Gibt es eine Möglichkeit, die Definition des Schlüssels abstract mit \FamilyNumericalKey zu überschreiben?

Vielen Dank für eure Hilfe
Falk

forum: 
Bild von Markus Kohm

Das sollte theoretisch möglich sein oder bekommst Du beim Versuch eine Fehlermeldung?

Ratsam ist es aber nicht. Die Familie KOMA ist ausdrücklich mir vorbehalten. Da sollte man keine Schlüssel hinzufügen oder umdefinieren. Stattdessen solltest Du in Deiner Klasse eine eigene Familie mit eigenen Mitgliedern definieren. Für diese kannst Du dann selbst auch einen Schlüssel abstract definieren, der wiederum ggf. Optionen für KOMA-Script setzt.

ich habe genau das versucht. Leider wird mir nicht ganz klar, wie ich genau die Standardeinstellung überschreiben soll. Mein erster Versuch sieht folgendermaßen aus:

\RequirePackage{filecontents}
\begin{filecontents}{myclass.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myclass}
\LoadClassWithOptions{scrreprt}
 
\DefineFamily{FAM}
\DefineFamilyMember{FAM}
\FamilyNumericalKey{FAM}{abstract}[true]{@fam@temp}{%
	{false}{0},{off}{0},{no}{0},%
	{true}{1},{on}{1},{yes}{1},%
	{new}{2}%
}
\FamilyProcessOptions{FAM}
\ifcase\@fam@temp
	\def\foo{aus}%
\or%
	\def\foo{an}%
\else%
	\def\foo{neu}%
\fi%
\endinput
\end{filecontents}
 
\documentclass[abstract=new]{myclass}
\begin{document}
\begin{abstract}
\foo
\end{abstract}
\end{document}

Solange ich für abstract boolesche Werte verwende, funktioniert alles wie gewollt. Sobald ich jedoch die Option abstract=new setze, erhalte ich die Fehlermeldung:

Package scrbase Error: option `abstract' of family `KOMA' has no value `@abstrt'.

Hat jemand einen Vorschlag für mich, wie ich das ganze anpacken könnte? Vielen dank für die Hilfe.
Grüße
Falk

Bild von Markus Kohm

OK, bzw. nicht OK, die Fehlermeldung ist an der Stelle ein Missstand. Ich brauche allerdings ein wenig Zeit, um darüber nachzudenken und eine Lösung anzubieten, bzw. scrbase zu ändern. Auf die Schnelle – das wäre also eine Notlösung – könnte man natürlich scrreprt mit \LoadClass statt \LoadClassWithOptions laden und dann entweder alle relevanten Optionen per \KOMAoptions setzen, aber das wäre tatsächlich sehr umständlich und nicht im Sinne des Erfinders …

Dessen ungeachtet solltest Du beachten, dass Dinge wie die \ifcase-Geschichte so nicht gemacht werden sollten. Eines der Features von Optionen dieser Art ist, dass man sie auch noch später setzen kann. Also sollten alle Teile so implementiert werden, dass die notwendige Fallunterscheidung nicht zur Ladezeit des Pakets respektive der Klasse gemacht wird, sondern zur Laufzeit. In diesem einfachen Demo-Fall, der sicher nicht der Realität entspricht, sollte die Definition von \foo also innerhalb der Definition der Option erfolgen.

Bild von Markus Kohm

Ich habe das Problem jetzt noch einmal analysiert und vor allem noch einmal genau analysiert wie sich LaTeX selbst hier bei normalen Optionen verhält. Das hat dazu geführt, dass ich die Implementierung so geändert habe, dass künftig in obigem Fall scrreprt keinen Fehler mehr meldet, sondern nur eine Info in die Log-Datei schreibt.

Würde man dann beispielsweise abstract=old zusätzlich als Option bei \documentclass angeben, würde auch nur eine unused global option gemeldet.

Allerdings ist das ganze in LaTeX selbst wenig einheitlich implementiert. Während das Beispiel:

\begin{filecontents}{\jobname.cls}
\ProvidesClass{\jobname}
\LoadClassWithOptions{article}
\DeclareOption{rosebud}{\typeout{option `rosebud' used}}
\ProcessOptions*
\endinput
\end{filecontents}
\documentclass[rosebud]{\jobname}
\begin{document}
Test
\end{document}

völlig korrekt und logisch weder Fehler noch Warnungen produziert, wird bei

\begin{filecontents}{\jobname.sty}
\ProvidesPackage{\jobname}
\RequirePackageWithOptions{ifthen}
\DeclareOption{rosebud}{\typeout{option `rosebud' used}}
\ProcessOptions*
\endinput
\end{filecontents}
\documentclass{article}
\usepackage[rosebud]{\jobname}
\begin{document}
Test
\end{document}

und auch bei

\begin{filecontents}{\jobname.sty}
\ProvidesPackage{\jobname}
\DeclareOption{rosebud}{\typeout{option `rosebud' used}}
\ProcessOptions*
\RequirePackageWithOptions{ifthen}
\endinput
\end{filecontents}
\documentclass{article}
\usepackage[rosebud]{\jobname}
\begin{document}
Test
\end{document}

der Fehler

LaTeX Error: Unknown option `rosebud' for package `ifthen'.

gemeldet.

Das bedeutet, dass konsequenter Weise für ein Paket, das ein anderes Paket lädt, um es um Optionen zu erweitern, \RequirePackageWithOptions nicht verwendet werden kann. Das gilt dann natürlich auch bei Verwendung von \FamilyProcessOptions statt \ProcessOptions.

Es funktioniert mittlerweile wie gewünscht.

Comments for "Erweiterung bestehender Optionen des KOMA-Scriptes" abonnieren