Eigene Klasse mit keyval-Optionen

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Eigene Klasse mit keyval-Optionen

von Noch so einer » Di 4. Nov 2014, 11:06

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.

von Besserwisser » Di 4. Nov 2014, 10:35

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.

von Leopold » Di 4. Nov 2014, 09:49

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?

von Leopold » Mo 3. Nov 2014, 18:00

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.

von Johannes_B » Mo 3. Nov 2014, 17:51

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.

von Leopold » Mo 3. Nov 2014, 17:26

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

von Johannes_B » Mo 3. Nov 2014, 17:23

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.

Eigene Klasse mit keyval-Optionen

von Leopold » Mo 3. Nov 2014, 17:00

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?

Nach oben