Seite 1 von 1
Eigene Klasse mit keyval-Optionen
Verfasst: Mo 3. Nov 2014, 17:00
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?
Verfasst: Mo 3. Nov 2014, 17:23
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.
Verfasst: Mo 3. Nov 2014, 17:26
von Leopold
Das ist ja nur ein Minimalbeispiel. Die vollständige Klasse kann deutlich mehr.
Verfasst: Mo 3. Nov 2014, 17:51
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.
Verfasst: Mo 3. Nov 2014, 18:00
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.
Verfasst: Di 4. Nov 2014, 09:49
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?
Verfasst: Di 4. Nov 2014, 10:35
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.
Verfasst: Di 4. Nov 2014, 11:06
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.