Sie sind hier

Wie kann man eine eigene Klasse auf Basis von scrbook erstellen ?

Hallo,

seit einiger Zeit versuche ich verzweifelt, eine "eigene" Klasse auf Basis der Komascript-Klasse scrbook zu erstellen.
Sinn der Übung ist die Verwendung eines vorgegebenen CI's, allein durch die Wahl der Dokumentenklasse zu ermöglichen.

m.a. Worten: bei der späteren Verwendung soll vor dem

\begin{document}

lediglich noch die gewünschte Dokumentenklasse mit ein paar Optionen gesetzt werden.

Zu diesem Zweck habe ich mir eine Klasse mit dem Namen "cibook.cls" im Projektverzeichnis erstellt, die alle benötigten Anweisungen enthalten soll, um das Layout den Anforderungen des CI anzupassen. Im Sinne des Minimalbeispiels sieht die gekürzte Fassung zur Verdeutlichung der Fehler wiefolgt aus:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{cibook}[2011/11/18 v 0.1 CI-Klasse für Dokumentationen]
\LoadClass[headinclude]{scrbook}
 
\DeclareOption{cihead}{
	\AtBeginDocument{
		\setheadwidth{textwithmarginpar} %gibt einen Fehler
		\setheadtopline[head]{1pt}       %gibt einen Fehler
	}
}
\DeclareOption*{\typeout{Unbekannte Klassenoption: "\CurrentOption"}}
\ProcessOptions\relax

Diese Klasse wird dann von meiner Hauptdatei namens "main.tex" in folgender Weise verwendet:

\documentclass[cihead]{cibook}
\begin{document}
	\chapter{Minimalbeispiel}
		Lorem ipsum dolor sit amet, consectetur, adipisci velit …
\end{document}

Da ich irgendwo einen grundlegenden Denkfehler beim Erstellen der Klasse habe, schlägt das Kompilieren des Dokumentes mit Fehlermeldungen bei den Komascript Anweisungen fehl.

! Undefined control sequence.
\@begindocumenthook ...on \caption \setheadwidth {textwithmarginpar} \sethe...

Wo liegt mein Denkfehler bei der Erstellung der Klasse?
Wie muss die Klasse "cibook" prinzipiell aussehen, damit die Anweisungen der geladenen Klasse "scrbook" zur Verfügung stehen und verwendet werden können?

Bild von Markus Kohm

Wenn Du Befehle eines Pakets verwendest, das von den KOMA-Script-Klassen nicht automatisch geladen wird, dann musst Du das selbst laden:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{cibook}[2011/11/18 v 0.1 CI-Klasse für Dokumentationen]
\PassOptionsToPackage{headinclude}{typearea}
\LoadClass{scrbook}
\RequirePackage{scrpage2}% stellt u. a. \setheadwidth bereit
\pagestyle{scrheadings}% damit \setheadwidth auch wirkt 
\DeclareOption{cihead}{
	\AtBeginDocument{
		\setheadwidth{textwithmarginpar} %gibt einen Fehler
		\setheadtopline[head]{1pt}       %gibt einen Fehler
	}
}
\DeclareOption*{\typeout{Unbekannte Klassenoption: "\CurrentOption"}}
\ProcessOptions\relax

Außerdem ist headinclude keine Option der Klasse, sondern eine Option des Pakets typearea. Optionen von \LoadClass sind im Gegensatz zu Optionen von \documentclass keine globalen Optionen, sondern lokale Optionen nur für die geladene Klasse.

Falls übriges die Optionen von \documentclass an scrbook weitergereicht werden sollen, muss \LoadClassWithOptions verwendet werden. Alles ein wenig kompliziert und manchmal auch ein wenig nervig, aber so ist es von den LaTeX-Autoren vorgesehen.

Die Fehlerbehandlung für unbekannte Optionen kannst Du Dir übrigens schenken. Damit würden beispielsweise Paket-Optionen, die man nicht bei mehreren Paketen angeben will und deshalb bei \documentclass angibt, als unbekannte Klassenoption gemeldet. Darüber hinaus solltest Du Dir mal die Anweisungen \ClassInfo, \ClassWarning, \ClassError etc. im clsguide anschauen.

Damit komme ich nun schon ein gutes Stück weiter. Besten Dank für die ausführliche Hilfe.

Comments for "Wie kann man eine eigene Klasse auf Basis von scrbook erstellen ?" abonnieren