5
3

Ich habe eine ganze Reihe sehr ähnlicher Dokumente zu erstellen (in meinem Fall Übungsblätter), die alle die gleiche Grundklasse laden (hier scrartcl), die alle die gleichen Schrift- und Spracheinstellungen verwenden, die alle die gleichen zehn spezielleren Pakete laden (u.a. amsmath und pgfplots ...), die alle den gleiche Typ Kopf- und Fußzeilen enthalten usw. Unterscheiden tun sie sich natürlich in den Aufgaben und im Titel und Datum.

Zunächst habe ich mir die Präambel immer von einem Dokument zum nächsten kopiert, ziemlich schnell aber diese Präambel in eine tex Datei kopiert, die ich mit input einbinde. Allerdings scheint mir, dass die ideale Lösung eine eigene Dokumentenklasse (nennen wir sie uebungsblatt) wäre, die die Präambel sozusagen vorlädt. Wie kann ich das umsetzen?

Die Anweisungen und Erklärungen im clsguide fand ich eher verwirrend als hilfreich. Vielleicht könnte mir jemand ein Grundgerüst zeigen, am besten mit Erklärungen, was die einzelnen Befehle und Schritte tun.

gefragt 26 Aug '13, 15:11

cgnieder's gravatar image

cgnieder
22.1k253463
Akzeptiert-Rate: 60%


Eigentlich geht das ganz einfach:

  • Kopiere die komplette Präambel in eine Datei mit Endung .cls.

  • Setze als erste Zeile:

    \ProvidesClass{uebungsblatt}[2013/08/26 v0.1 Uebungsblaetterklasse von Clemens]
    
  • Ändere \documentclass in \LoadClass.

  • Ändere \usepackage in \RequirePackage.

  • Kopiere alle Optionen, die keine Optionen der Klasse sind oder die auch von Paketen verarbeitet werden sollen in das optionale Argument der entsprechenden \RequirePackage-Anweisungen. Für KOMA-Script-Optionen bietet es sich stattdessen an, diese nach dem Laden aller KOMA-Script-Pakete mit \KOMAoptions zu setzen, weil man dann gar nicht erst wissen muss, welches Paket welche Option verarbeitet. Allerdings überschreiben dann ggf. die Optionen, die man in der Wrapper-Klasse setzt, die Optionen von \documentclass. Siehe dazu das Beispiel scrartcl-wrapper Version 0.1b unten.

  • Entferne Pakete wie inputenc, die eher vom Dokument/Editor abhängen als von der Dokumentart. Diese sollten weiterhin besser im Dokument geladen werden.

  • Entferne alle \makeatletter und \makeatother außerhalb von Umgebungs- und Makro-Definitionen.

  • Füge ein \ProcessOptions\relax hinzu.

Das sollte es für eine einfache Wrapper-Klasse gewesen sein. Etwas mehr Aufwand wird es, wenn die Wrapper-Klasse Optionen verarbeiten soll. Der einfachste Fall dabei wäre, dass die zugrunde liegende Klasse mit den Optionen geladen werden soll, mit der Deine Wrapper-Klasse bei \documentclass geladen wird. Dazu muss man \LoadClassWithOptions statt \LoadClass verwenden. Diese Anweisung hat selbst allerdings kein optionales Argument. Hatte man zuvor \LoadClass mit optionalem Argument verwendet, so kann man die dort angegebenen Optionen nun stattdessen per \PassOptionsToClass (vor \LoadClassWithOptions) oder per \ExecuteOptions (vor \ProcessOptions) ausführen. Via \PassOptionsToClass kann man auch Optionen explizit weiterreichen, beispielsweise als:

\DeclareOption{twoside}{\PassOptionsToClass{twoside}{foo}}

oder

\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{foo}}

wobei hier foo die zugrunde liegende Basisklasse ist.

Eine ganz einfache Wrapper-Klasse für scrartcl könnte also beispielsweise so aussehen:

\ProvidesClass{scrartcl-wrapper}[2013/08/26 v0.1a demo wrapper class]
\PassOptionsToPackage{twoside,DIV=calc}{typearea}% Diese beiden Optionen sollen Voreinstellung sein
% und werden bei KOMA-Script nicht von der Klasse, sondern von typearea verarbeitet.
\LoadClassWithOptions{scrartcl}
\ProcessOptions\relax
\RequirePackage{xcolor}% Die Wrapper-Klasse soll immer auch das Paket xcolor laden.

Oder ohne das Wissen bezüglich der Verarbeitung von twoside und DIV=calc:

\ProvidesClass{scrartcl-wrapper}[2013/08/26 v0.1b demo wrapper class]
\LoadClassWithOptions{scrartcl}
\KOMAoptions{twoside,DIV=calc}
\ProcessOptions\relax
\RequirePackage{xcolor}% Die Wrapper-Klasse soll immer auch das Paket xcolor laden.

Allerdings hat diese zweite Fassung den Nachteil, dass es nichts nützt, wenn man Option twoside=false bei \documentclass angibt, da das \KOMAoptions der Wrapper-Klasse nach dem Laden der Klasse scrartcl und damit nach dem Laden von typearea ausgeführt wird. Ich empfehle daher, die erste Version.

Und wie macht man das, wenn die Auswahl der Basisklasse per Option erfolgen soll? Auch kein Problem:

\begin{filecontents}{koma-wrapper.cls}
\ProvidesClass{koma-wrapper}[2013/08/26 v0.1 demo wrapper class]
\newcommand*{\BaseClass}{scrartcl}%
\DeclareOption{book}{\renewcommand*{\BaseClass}{scrbook}}
\DeclareOption{report}{\renewcommand*{\BaseClass}{scrreprt}}
\DeclareOption{article}{\renewcommand*{\BaseClass}{scrartcl}}
\DeclareOption*{\expandafter\PassOptionsToClass\expandafter{\CurrentOption}{\BaseClass}}
\ProcessOptions\relax
\LoadClass{\BaseClass}
\RequirePackage{xcolor}% Die Wrapper-Klasse soll immer auch das Paket xcolor laden.
\end{filecontents}
\documentclass[book,titlepage,oneside]{koma-wrapper}
\usepackage{blindtext}
\begin{document}
\title{Titel}
\author{Ich}
\maketitle
\blinddocument
\end{document}

Übrigens: Sehr allgemeine Namen wie "uebungsblaetter" für eine Klasse oder ein Paket zu verwenden ist meist nur sinnvoll, wenn die Klasse bzw. das Paket auch wirklich sehr allgemein angelegt ist. Wobei es dann sinnvoller wäre, einen englischen Namen zu wählen und das ganze auf CTAN bereit zu stellen. Für ganz spezielle Klassen und Pakete sollte man möglichst auch sehr spezielle Namen wie "uebblatt-inf-uni-dingens" verwenden. Wenn nämlich jeder Fachbereich seine spezielle Klasse für Übungsblätter "uebungsblaetter" nennt, dann haben wir bald einige hundert gleich benannte aber unterschiedliche Klassen und niemand blickt mehr durch.

Permanenter link

beantwortet 26 Aug '13, 17:02

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 26 Aug '13, 18:50

Ich dachte mir fast schon, dass Du eine bessere Antwort geben würdest, als ich sie gegeben hätte. Einiges von dem, was Du erwähnst, hätte ich vergessen!

(26 Aug '13, 18:14) cgnieder

@Clemens Ich habe bestimmt auch noch einiges vergessen, was erwähnenswert wäre. Die Frage ist halt auch sehr allgemein. So kann ich mir beispielsweise nicht vorstellen, dass jemand den clsguide überhaupt nicht versteht. Einige Erklärungen wie die zu \ProvidesClass sind ziemlich klar. Übrigens habe ich \NeedsTeXFormat bewusst weg gelassen, da das AFAIK ohnehin nur von LaTeX bereitgestellt wird, also weitgehend nutzlos ist.

(26 Aug '13, 18:44) saputello

Ich nehme an, \NeedsTeXFormat war nützlich, als der Umstieg von 2.09 auf 2e noch neu war... da das aber vor meiner Zeit war, kann ich nur spekulieren. Beim clsguide bin ich mir nicht so sicher. Viele können zwar gut Englisch, aber doch nicht alle. Eine deutsche Erklärung hielt ich deshalb für eine gute Idee.

(26 Aug '13, 18:49) 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:

×13

gestellte Frage: 26 Aug '13, 15:11

Frage wurde gesehen: 21,612 Mal

zuletzt geändert: 19 Feb '22, 13:17