Eigene Klasse mit keyval-Optionen

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


Leopold

Eigene Klasse mit keyval-Optionen

Beitrag von Leopold »

Liebe Latex-Experten,

ich will derzeit eine eigene Klasse entwickeln. Diese soll Optionen im keyval-Format empfangen können, wofür ich das Paket scrbase benutzen möchte. Das ist mein Minimalbeispiel:
testklasse.cls:
\ProvidesClass{testklase}[2014/11/03 v0.1 Testklasse]

\LoadClass[a4paper,10pt]{scrartcl}

\RequirePackage{scrbase}

\DefineFamily{keys}
\DefineFamilyMember{keys}
\DefineFamilyKey{keys}{nummer}{\newcommand{\nummer}{#1}}
\DefineFamilyKey{keys}{titel}{\newcommand{\titel}{#1}}

\renewcommand{\maketitle}{\begin{center}%
\textbf{\large{Nr. \nummer -- \textit{\titel}}}%
\end{center}%
}
test.tex:
\documentclass[nummer=5,titel=Beispiel]{testklasse}

\begin{document}
\maketitle
\end{document}
Ich hätte gern, dass nun zentriert und fett "Nr 5. - Beispiel" ausgegeben wird. Stattdessen erhalte ich jedoch immer die Fehler, dass die Befehle "\nummer" und "\titel" nicht existieren. Weiß jemand Rat?

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

as beantwortet deine Frage zwar in keinster Weise, aber schau dir doch mal das Paket titlepage an.
Ein erstes kleines Beispiel siehst du in How to do a titlepage gaaanz am Schluss.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Leopold

Beitrag von Leopold »

Das ist ja nur ein Minimalbeispiel. Die vollständige Klasse kann deutlich mehr.

Benutzeravatar
Johannes_B
Moderator
Moderator
Beiträge: 5079
Registriert: Do 1. Nov 2012, 14:55
Kontaktdaten:

Beitrag von Johannes_B »

So, ich bin mal meinem Rat gefolgt und habe in das Paket titlepage geschaut ->
\begin{filecontents}{\jobname.cls}
\ProvidesClass{\jobname}[2014/11/03 v0.1 Testklasse]

\LoadClass[a4paper,10pt]{scrartcl}

\newcommand{\titel}[1]{}
\newcommand{\nummer}[1]{}
\DefineFamily{testclass}
\DefineFamilyMember{testclass}
\DefineFamilyKey{testclass}{nummer}{\renewcommand{\nummer}{#1}}
\DefineFamilyKey{testclass}{titel}{\renewcommand{\titel}{#1}}

\FamilyProcessOptions{testclass}
\renewcommand{\maketitle}{\begin{center}%
	\textbf{\large{Nr. \nummer -- \textit{\titel}}}%
\end{center}%
} 
\endinput
\end{filecontents}
\documentclass[nummer=5,titel=Beispiel]{\jobname}
\begin{document}
\maketitle
\end{document}
Ich werde das aber später noch mal ganz gemütlich im KOMA-Script Buch nachlesen.
TeXwelt - Fragen und Antworten Schaut vorbei und stellt Fragen.
LaTeX-Vorlagen?

Der Weg zum Ziel: Ruhe bewahren und durchatmen, Beiträge und unterstützende Links aufmerksam lesen, Lösungsansätze verstehen und ggf. nachfragen.

Leopold

Beitrag von Leopold »

Jetzt funktioniert es; die Zeile "\FamilyProcessOptions{testclass}" hat gefehlt. Das habe ich in der Hilfe zu den Koma-Skripten leider übersehen. Vielen Dank für Deine Hilfe.

Leopold

Beitrag von Leopold »

Jetzt ist doch ein Problem aufgetreten. Abermals das Minimalbeispiel:

testklasse.cls
\ProvidesClass{testklase}[2014/11/03 v0.1 Testklasse]

\LoadClass[a4paper,10pt]{scrartcl}

\RequirePackage{scrbase}

\DefineFamily{keys}
\DefineFamilyMember{keys}
\DefineFamilyKey{keys}{nummer}{\newcommand{\nummer}{#1}}
\DefineFamilyKey{keys}{titel}{\newcommand{\titel}{#1}}
\FamilyProcessOptions{keys} 

\renewcommand{\maketitle}{\begin{center}%
\textbf{\large{Nr. \nummer -- \textit{\titel}}}%
\end{center}%
} 
test.tex
\documentclass[nummer=5,titel={Titel mit , und =}]{testklasse}

\begin{document}
\maketitle
\end{document}
Beim Kompilieren erhalte ich 194 Fehler. Es scheint, als ob die geschweiften Klammern ein Problem darstellen. Jedoch ist dies vom keyval-Paket so vorgesehen, auf das scrbase zurückgreift. Existiert hierfür ebenfalls eine Lösung?

Besserwisser

Beitrag von Besserwisser »

Du solltest grundsätzlich keine Strings über \documentclass definieren, weil LaTeX an dieser Stelle beispielsweise die Eingabecodierung noch nicht kennt. Außerdem macht LaTeX mit dem Argument von \documentclass einige seltsame Dinge, noch bevor die Klasse oder ein Paket überhaupt darauf Einfluss nehmen kann. Daher:
%\RequirePackage{filecontents}
\begin{filecontents}{testklasse.cls}
\ProvidesClass{testklasse}[2014/11/03 v0.1 Testklasse]

\LoadClass[a4paper,10pt]{scrartcl}

\RequirePackage{scrbase}

\DefineFamily{keys}
\DefineFamilyMember{keys}
\FamilyStringKey{keys}{nummer}{\nummer}
\FamilyStringKey{keys}{titel}{\titel}
\FamilyProcessOptions{keys}\relax
\newcommand*{\ClassOptions}{\FamilyOptions{keys}}

\renewcommand{\maketitle}{%
  \begin{center}%
    \textbf{\large{Nr. \nummer\ -- \textit{\titel}}}%
  \end{center}%
}
\end{filecontents}

\documentclass{testklasse}
\usepackage{selinput}
\SelectInputMappings{
  adieresis={ä},
  germandbls={ß},
}

\ClassOptions{nummer=5,titel={Titel mit , und =}}

\begin{document}
\maketitle
\end{document}
Ansonsten würde ich zu solch implementierungsspezifischen Dingen zu KOMA-Script eher auf komascript.de als hier fragen.

Übrigens hast du den Status "Rückfrage" falsch verwendet. Bitte schau dir die Status-Bedeutung einmal an.

Noch so einer

Beitrag von Noch so einer »

Wenn Du unbedingt darauf bestehst, entgegen dem korrekten Hinweis von Besserwisser die Option bei \documentclass anzugeben, dann musst Du nur korrekt klammern:
%\RequirePackage{filecontents}
\begin{filecontents}{testklasse.cls}
\ProvidesClass{testklasse}[2014/11/03 v0.1 Testklasse]

\LoadClass[a4paper,10pt]{scrartcl}

\RequirePackage{scrbase}

\DefineFamily{keys}
\DefineFamilyMember{keys}
\FamilyStringKey{keys}{nummer}{\nummer}
\FamilyStringKey{keys}{titel}{\titel}
\FamilyProcessOptions{keys}\relax
\newcommand*{\ClassOptions}{\FamilyOptions{keys}}

\renewcommand{\maketitle}{%
  \begin{center}%
    \textbf{\large{Nr. \nummer\ -- \textit{\titel}}}%
  \end{center}%
}
\end{filecontents}

\documentclass[nummer=5,{titel=Titel mit , und =}]{testklasse}
\begin{document}
\maketitle
\end{document}
Das Problem ist nämlich, dass sonst geprüft wird, ob titel={Titel mit , und =} in der normalen Liste der Optionen ist. Das dafür (bereits von LaTeX) verwendete Makro \@in verkraftet aber keine geschweiften Klammern. Das liegt daran, dass dabei mit delimeted arguments gearbeitet wird und das in diesem Fall schief geht. Genau dasselbe Problem gibt es dann noch einmal mit LaTeX's \@removeelement.

Es würde vermutlich auch wenig bringen, wenn \FamilyProcessOptions so geändert würde, dass es geschweifte Klammern verträgt. Das nächste Paket, das das ganz normale \ProcessOptions verwendet, hat dann dasselbe Problem mit den globalen Optionen.

Antworten