summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/koma-script/scrkbase.dtx')
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkbase.dtx854
1 files changed, 645 insertions, 209 deletions
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx b/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
index 87583206fd1..88d138a1c80 100644
--- a/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
+++ b/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
@@ -1,8 +1,8 @@
-% \CheckSum{989}
+% \CheckSum{1213}
% \iffalse meta-comment
% ======================================================================
% scrkbase.dtx
-% Copyright (c) Markus Kohm, 2002-2007
+% Copyright (c) Markus Kohm, 2002-2008
%
% This file is part of the LaTeX2e KOMA-Script bundle.
%
@@ -20,7 +20,7 @@
% This work consists of all files listed in manifest.txt.
% ----------------------------------------------------------------------
% scrkbase.dtx
-% Copyright (c) Markus Kohm, 2002-2007
+% Copyright (c) Markus Kohm, 2002-2008
%
% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
% Version 1.3b, verteilt und/oder veraendert werden.
@@ -58,11 +58,16 @@
%%% From File: scrkbase.dtx
%<*driver>
% \fi
-\ProvidesFile{scrkbase.dtx}[2007/10/03 v2.97d KOMA-Script (basics)]
+\ProvidesFile{scrkbase.dtx}[2008/05/28 v3.00 KOMA-Script (basics)]
% \iffalse
%</driver>
-%<package&option>\ProvidesPackage{scrkbase}[%
-%<package&option> \KOMAScriptVersion\space package (basics and keyval use)]
+%<package&option>\ProvidesPackage{%
+%<package&option&base> scrbase%
+%<package&option&koma> scrkbase%
+%<package&option>}[%
+%<package&option> \KOMAScriptVersion\space package
+%<package&option&base> (KOMA-Script-independent basics and keyval usage)]
+%<package&option&koma> (KOMA-Script-dependent basics and keyval usage)]
%<*driver>
\documentclass{scrdoc}
\usepackage[english,ngerman]{babel}
@@ -98,12 +103,13 @@
% werden hier Erweiterungen vorgenommen, die von \KOMAScript-Klassen
% und \KOMAScript-Paketen verwendet werden können.
%
-% Darüber hinaus werden immer mehr Teile von \KOMAScript{} von mehr
-% als einem Paket oder von Paketen und Klassen verwendet. Diese
-% grundlegenden Dinge wurden daher in ein eigenes Paket,
-% \textsl{scrkbase}, ausgegliedert. Dadurch werden die Pakete und
-% Klassen selbst kleiner und die können trotzdem unabhängig
-% voneinander verwendet werden. Selbstverständlich kann man dieses
+% Darüber hinaus werden immer mehr Teile von \KOMAScript{} von mehr als einem
+% Paket oder von Paketen und Klassen verwendet. Diese grundlegenden Dinge
+% wurden daher in zwei Pakete, \textsf{scrbase} (für Dinge, die auch von
+% anderen Klassen und Paketen genutzt werden können) und \textsf{scrkbase}
+% (für Dinge, die \KOMAScript vorbehalten bleiben), ausgegliedert. Dadurch
+% werden die Pakete und Klassen selbst kleiner und die können trotzdem
+% unabhängig voneinander verwendet werden. Selbstverständlich kann man dieses
% Paket auch ohne den Rest von \KOMAScript{} zum Einsatz bringen.
%
% \StopEventually{\PrintIndex\PrintChanges}
@@ -124,16 +130,22 @@
%<*option>
% \fi
%
+% \subsection{Der abhängige Teil lädt den unabhängigen Teil}
+%
+% \begin{macrocode}
+%<koma>\RequirePackage{scrbase}[\KOMAScriptVersion]
+% \end{macrocode}
+%
% \subsection{Laden von \textsf{keyval}}
%
% Hier wird nicht nur das Paket geladen, was ruckzuck mit:
% \begin{macrocode}
-\RequirePackage{keyval}
+%<base>\RequirePackage{keyval}
% \end{macrocode}
% erledigt ist.
%
%
-% \subsection{Anweisungen zur Abarbeitung von Optionen}
+% \subsection{Test von Anweisungen}
%
% \begin{macro}{\scr@ifundefinedorrelax}
% \changes{v2.95c}{2006/08/12}{neu (intern)}
@@ -144,6 +156,7 @@
% ein undefiniertes Makro nicht als \cs{relax}. Es muss bereits hier definiert
% werden, weil es gleich verwendet wird.
% \begin{macrocode}
+%<*base>
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname ifcsname\endcsname\relax
\newcommand{\scr@ifundefinedorrelax}[1]{%
@@ -167,6 +180,7 @@
\fi
}
\fi
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -180,6 +194,80 @@
% Schlüssel jedes anderen Teils ausführen kann -- sobald sie definiert
% sind.
%
+% \begin{macro}{\DefineFamily}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% \begin{macro}{\DefineFamilyMember}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% \begin{macro}{\DefineFamilyKey}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% \begin{macro}{\scr@if@family}
+% \changes{v3.00}{2008/04/30}{Neu (intern)}
+% \begin{macro}{\scr@if@familymember}
+% \changes{v3.00}{2008/04/30}{Neu (intern)}
+% Familie, Familienmitglied und \textsf{keyval}-Schlüssel für ein
+% Familienmitglied definieren. Dabei wird als Familienmitglied per Default der
+% (Datei-)Name des aktuellen Pakets bzw. der aktuellen Klasse verwendet.
+% \begin{macrocode}
+%<*base>
+\newcommand*{\DefineFamily}[1]{%
+ \scr@ifundefinedorrelax{#1@key@familylist}{%
+ \@namedef{#1@key@familylist}{}%
+ }{}%
+}
+\newcommand*{\scr@if@family}[2]{%
+ \scr@ifundefinedorrelax{#1@key@familylist}{%
+ \PackageError{scrbase}{%
+ unknown family `#1'%
+ }{%
+ You've tried to #2 for family `#1'.\MessageBreak
+ This my be done only for previous defined families.\MessageBreak
+ You should call `\string\DefineFamily{#1}' first.%
+ }%
+ }%
+}
+\newcommand*{\DefineFamilyMember}[2][.\@currname.\@currext]{%
+ \scr@if@family{#2}{define a family member}{%
+ \edef\reserved@a{%
+ \noexpand\in@{#2#1,}{\csname #2@key@familylist\endcsname}}%
+ \reserved@a
+ \ifin@\else
+ \expandafter\edef\csname #2@key@familylist\endcsname{%
+ \@nameuse{#2@key@familylist}#2#1,}%
+ \fi
+ }%
+}
+\newcommand*{\scr@if@familymember}[3]{%
+ \scr@if@family{#2}{#3}{%
+ \edef\reserved@a{%
+ \noexpand\in@{#2#1,}{\csname #2@key@familylist\endcsname}}%
+ \reserved@a
+ \ifin@
+ \expandafter\@firstofone
+ \else
+ \PackageError{scrbase}{%
+ unknown member `#1' at family `#2'%
+ }{%
+ You've tried to #3 for member `#1' of family `#2'.\MessageBreak
+ This my be done only for previous defined family members.\MessageBreak
+ You should call `\string\DefineFamilyMember[{#1}]{#2}' first.%
+ }%
+ \expandafter\@gobble
+ \fi
+ }%
+}
+\newcommand*{\DefineFamilyKey}[2][.\@currname.\@currext]{%
+ \scr@if@familymember{#1}{#2}{define a key}{%
+ \define@key{#2#1}%
+ }%
+}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\KOMA@key}
% \changes{v2.97c}{2007/04/19}{neues optionales Argument}
% \begin{macro}{\KOMA@key@familylist}
@@ -187,12 +275,12 @@
% definiert, damit auch die Familie korrekt gesetzt und ggf. der Liste der
% Familien (\cs{KOMA@key@familylist}) hinzugefügt wird.
% \begin{macrocode}
+%<*koma>
\newcommand*{\KOMA@key}[1][.\@currname.\@currext]{%
- \edef\reserved@a{\noexpand\in@{KOMA#1,}{\KOMA@key@familylist}}\reserved@a
- \ifin@\else\xdef\KOMA@key@familylist{\KOMA@key@familylist KOMA#1,}\fi
- \define@key{KOMA#1}%
+ \DefineFamilyMember{KOMA}%
+ \DefineFamilyKey[#1]{KOMA}%
}
-\newcommand*{\KOMA@key@familylist}{}
+%</koma>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -216,6 +304,7 @@
% werden, weil ihr Defaultwert verwendet werden soll), wird hier ein eigenes
% Makro definiert.
% \begin{macrocode}
+%<*base>
\newcommand*{\@globaloptionslist}{}
\let\@globaloptionslist\@classoptionslist
\scr@ifundefinedorrelax{XKV@classoptionslist}{}{%
@@ -223,21 +312,24 @@
\let\@globaloptionslist\XKV@classoptionslist
\fi
}
+%</base>
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\KOMAProcessOptions}
-% \changes{v2.97c}{2007/04/18}{neu}
+% \begin{macro}{\FamilyProcessOptions}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}%
% Diese Anweisung führt alle Optionen, sowohl normal deklarierte als auch
-% keyval-Optionen eines Pakets bzw. einer Klasse in der Reihenfolge, in der
-% sie verwendet wurden aus -- zuerst gloable Optionen, dann lokale
-% Optionen. Das entspricht der Verwendung von \cs{ProcessOptions*} mit dem
-% Unterschied, dass eben auch die keyval-Optionen abgearbeitet
-% werden. keyval-Optionen, die keiner einzelnen Klasse und keinem einzelnen
-% Paket zugeordnet werden, werden dabei vor gleichnamigen eigenen
-% keyval-Optionen ausgeführt.
+% \textsf{keyval}-Optionen für eine angegebene Familie (2. Argument) und das
+% aktuelle Mitglied (1. optionales Argument) in der Reihenfolge, in der sie
+% verwendet wurden aus -- zuerst globale Optionen, dann lokale Optionen. Das
+% entspricht der Verwendung von \cs{ProcessOptions*} mit dem Unterschied,
+% dass eben auch die \textsf{keyval}-Optionen abgearbeitet
+% werden. \textsf{keyval}-Optionen, die keinem Mitglied zugeordnet, sondern
+% universell sind, werden dabei vor gleichnamigen \textsf{keyval}-Optionen
+% des aktuellen Mitglieds ausgeführt.
% \begin{macrocode}
-\newcommand*{\KOMAProcessOptions}[1][KOMA]{%
+%<*base>
+\newcommand*{\FamilyProcessOptions}[2][.\@currname.\@currext]{%
\let\ds@\@empty
\edef\@curroptions{\@ptionlist{\@currname.\@currext}}%
\ifx\@currext\@clsextension\else
@@ -248,14 +340,14 @@
\@use@ption
\expandafter\let\csname ds@\CurrentOption\endcsname\@empty
\else
- \KOMA@optiontest{#1}\CurrentOption{}{%
+ \scr@optiontest{#2}\CurrentOption{}{%
\@use@ption
- \@expandtwoargs\setkeys{#1}%
+ \@expandtwoargs\setkeys{#2}%
\CurrentOption
}%
- \KOMA@optiontest{#1.\@currname.\@currext}\CurrentOption{}{%
+ \scr@optiontest{#2#1}\CurrentOption{}{%
\@use@ption
- \@expandtwoargs\setkeys{#1.\@currname.\@currext}%
+ \@expandtwoargs\setkeys{#2#1}%
\CurrentOption
}%
\fi
@@ -265,20 +357,20 @@
\@for\CurrentOption:=\@curroptions\do{%
\@use@ption
\scr@ifundefinedorrelax{ds@\CurrentOption}{%
- \KOMA@optiontest{#1}\CurrentOption{%
- \KOMA@optiontest{#1.\@currname.\@currext}\CurrentOption{%
+ \scr@optiontest{#2}\CurrentOption{%
+ \scr@optiontest{#2#1}\CurrentOption{%
\default@ds
}{%
- \let\scr@sr@co\CurrentOption
- \@expandtwoargs\setkeys{#1.\@currname.\@currext}%
- \CurrentOption
- \let\CurrentOption\scr@sr@co
+ \edef\reserved@a{%
+ \noexpand\setkeys{#2#1}{\CurrentOption}%
+ \noexpand\def\noexpand\CurrentOption{\CurrentOption}%
+ }\reserved@a
}%
}{%
- \@expandtwoargs\setkeys{#1}%
+ \@expandtwoargs\setkeys{#2}%
\CurrentOption
- \KOMA@optiontest{#1.\@currname.\@currext}\CurrentOption{}{%
- \@expandtwoargs\setkeys{#1.\@currname.\@currext}%
+ \scr@optiontest{#2#1}\CurrentOption{}{%
+ \@expandtwoargs\setkeys{#2#1}%
\CurrentOption
}%
}%
@@ -291,50 +383,62 @@
\let\@fileswith@pti@ns\@@fileswith@pti@ns
\AtEndOfPackage{\let\@unprocessedoptions\relax}%
}
-\@onlypreamble\KOMA@process@options
-\@onlypreamble\KOMAProcessOptions
+\@onlypreamble\FamilyProcessOptions
% \end{macrocode}
-% \begin{macro}{\KOMA@optiontest}
+% \begin{macro}{\scr@optiontest}
% \changes{v2.97c}{2007/04/18}{neu (intern)}
-% \begin{macro}{\KOMA@pti@ntest}
+% \begin{macro}{\scr@pti@ntest}
% \changes{v2.97c}{2007/04/18}{neu (intern)}
% Es werden zwei interne Makros benötigt, um zu testen, ob eine entsprechende
% keyval-Option definiert ist. Grund der Übung ist, dass sowohl das
% Familienargument als auch die Options selbst expandiert werden muss.
% \begin{macrocode}
-\newcommand*{\KOMA@optiontest}[2]{%
- \edef\reserved@a{\noexpand\KOMA@pti@ntest{#1}#2=\noexpand\@nil}%
+\newcommand*{\scr@optiontest}[2]{%
+ \edef\reserved@a{\noexpand\scr@pti@ntest{#1}#2=\noexpand\@nil}%
\reserved@a
}
-\newcommand*{\KOMA@pti@ntest}{}
-\def\KOMA@pti@ntest#1#2=#3\@nil{\scr@ifundefinedorrelax{KV@#1@#2}}
+\newcommand*{\scr@pti@ntest}{}
+\def\scr@pti@ntest#1#2=#3\@nil{\scr@ifundefinedorrelax{KV@#1@#2}}
+%</base>
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \begin{macro}{\scr@sr@co}
-% \changes{v2.96}{2006/08/20}{neu (intern)}
-% Da das \texttt{xkeyval}-Paket leider \cs{CurrentOption} vernichtet, das aber
-% innerhalb von \cs{ProcessOptions} und \cs{KOMAProcessOptions} nach dem
-% Ausführen der Option noch benötigt wird, muss die Anweisung gesichert
-% werden. Dafür wird ein Hilfsmakro benötigt.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KOMAProcessOptions}
+% \changes{v2.97c}{2007/04/18}{neu}
+% \changes{v3.00}{2008/04/30}{kein optionales Argument mehr}
+% Diese Anweisung führt alle Optionen, sowohl normal deklarierte als auch
+% keyval-Optionen eines Pakets bzw. einer Klasse in der Reihenfolge, in der
+% sie verwendet wurden aus -- zuerst globale Optionen, dann lokale
+% Optionen. Das entspricht der Verwendung von \cs{ProcessOptions*} mit dem
+% Unterschied, dass eben auch die keyval-Optionen abgearbeitet
+% werden. keyval-Optionen, die keiner einzelnen Klasse und keinem einzelnen
+% Paket zugeordnet werden, werden dabei vor gleichnamigen eigenen
+% keyval-Optionen ausgeführt.
% \begin{macrocode}
-\newcommand*{\scr@sr@co}{}
+%<*koma>
+\newcommand*{\KOMAProcessOptions}{\FamilyProcessOptions{KOMA}}
+\@onlypreamble\KOMAProcessOptions
+%</koma>
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{option}{internalonly}
% \changes{v2.96}{2006/11/26}{neu}
% \changes{v2.97c}{2007/06/20}{geht auch ohne Argument}
% \begin{macro}{\dont@let@as@internal@defined}
-% \changes{2.96}{2006/11/26}{neu (intern)}
+% \changes{v2.96}{2006/11/26}{neu (intern)}
% Anweisungen, die mit einem internen und einem Anwendername vorhanden sind,
% können vor dem Anwender optional verborgen werden. Wird kein Argument
% angegeben, so werden alle Anweisungen verborgen.
% \begin{macrocode}
+%<*base>
\newcommand*{\dont@let@as@internal@defined}{/}
\newif\if@let@as@internalonly@defined\@let@as@internalonly@definedfalse
-\KOMA@key{internalonly}[\relax]{%
+\DefineFamily{KOMA}
+\DefineFamilyMember{KOMA}
+\DefineFamilyKey{KOMA}{internalonly}[\relax]{%
\ifx\relax#1\relax
\@let@as@internalonly@definedtrue
\else
@@ -345,6 +449,7 @@
\ifin@\else\g@addto@macro\dont@let@as@internal@defined{#1/}\fi
\fi
}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{option}
@@ -353,7 +458,8 @@
% \changes{v2.97c}{2007/04/18}{Optionen werden mit \cs{KOMAProcessOptions}
% abgearbeitet}
% \begin{macrocode}
-\KOMAProcessOptions\relax
+%<koma>\KOMAProcessOptions\relax
+%<base>\FamilyProcessOptions{KOMA}\relax
% \end{macrocode}
%
% \iffalse
@@ -372,10 +478,12 @@
% unterschiedlich verhalten, je nachdem, ob sie in der Präambel oder
% danach aufgerufen werden.
% \begin{macrocode}
+%<*base>
\newif\if@atdocument
\AtBeginDocument{\@atdocumenttrue}
\@onlypreamble\@atdocumentrue
\@onlypreamble\@atdocumentfalse
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -394,6 +502,7 @@
% dokumentierten Makros wird als Parameter übergeben. Dies wird gleich
% benötigt.
% \begin{macrocode}
+%<*base>
\newcommand*{\let@as@internal@defined}[1]{%
\begingroup
\if@let@as@internalonly@defined
@@ -404,7 +513,7 @@
\expandafter\endgroup
\ifin@
\PackageInfo{%
- scrkbase%
+ scrbase%
}{%
\expandafter\string\csname #1\endcsname\space excluded from being
defined%
@@ -423,7 +532,7 @@
\expandafter\ifx\csname #1\expandafter\endcsname
\csname scr@#1\endcsname
\else
- \PackageWarning{scrkbase}{%
+ \PackageWarning{scrbase}{%
\expandafter\string\csname #1\endcsname\space was
redefined\MessageBreak
at the document preamble.\MessageBreak
@@ -436,20 +545,21 @@
\fi
}{%
\PackageInfo{%
- scrkbase%
+ scrbase%
}{%
\expandafter\string\csname #1\endcsname\space already
defined.\MessageBreak
If \expandafter\string\csname #1\endcsname\space does not behave
like\MessageBreak
it was described at the KOMA-Script manual, try to\MessageBreak
- load `scrkbase.sty' earlier or find out at which\MessageBreak
+ load `scrbase.sty' earlier or find out at which\MessageBreak
package or class \expandafter\string\csname #1\endcsname\space
was defined before\@gobble
}%
}%
\fi
}
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -460,7 +570,9 @@
% Dieses Makro arbeitet wie \cs{@ifundefined}, definiert dabei aber
% ein undefiniertes Makro nicht als \cs{relax}.
% \begin{macrocode}
+%<*base>
\let@as@internal@defined{ifundefinedorrelax}
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -471,6 +583,7 @@
% ist es ganz nützlich, auch das zu haben. Dieses Makro heißt nicht
% \cs{ifdefined}, weil \eTeX\ bereits ein solches Primitiv bietet.
% \begin{macrocode}
+%<*base>
\scr@ifundefinedorrelax{ifcsname}{%
\newcommand{\ifnotundefined}[1]{%
\begingroup\expandafter\expandafter\expandafter\endgroup
@@ -489,6 +602,7 @@
\fi
}%
}
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -497,6 +611,7 @@
% Dieses Makro vergleicht zwei Tokenfolgen. Eigentlich müsste es also
% eher \cs{ifequal} oder ähnlich heißen.
% \begin{macrocode}
+%<*base>
\newcommand\ifstr[2]{%
\begingroup\edef\@tempa{#1}\edef\@tempb{#2}%
\ifx\@tempa\@tempb
@@ -505,6 +620,7 @@
\endgroup\expandafter\@secondoftwo
\fi
}
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -513,6 +629,7 @@
% ganze Zahl ist. Ist dies der Fall, wird der zweite Parameter
% ausgeführt, sonst der dritte.
% \begin{macrocode}
+%<*base>
\newcommand\ifnumber[1]{%
\begingroup\@tempswafalse\let\scr@next\test@number
\expandafter\scr@next#1\scr@next
@@ -557,6 +674,7 @@
% \begin{macrocode}
\newcommand*{\gobble@till@scr@next}{}
\def\gobble@till@scr@next#1\scr@next{}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -567,6 +685,7 @@
% ist und führt in Abhängigkeit davon den zweiten oder dritten
% Parameter aus.
% \begin{macrocode}
+%<*base>
\newcommand{\ifdimen}[1]{%
\begingroup\@tempswatrue\let\scr@next\test@posdimen
\expandafter\test@dimen#1\scr@next
@@ -650,6 +769,7 @@
}%
}%
}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -665,10 +785,12 @@
% \changes{v2.95}{2002/08/19}{neu (intern)}
% If-then-else-Konstrukt, um zu testen, ob pdf\TeX{} verwendet wird.
% \begin{macrocode}
+%<*base>
\newcommand{\scr@ifpdftex}{\ifnotundefined{pdftexversion}}
\let@as@internal@defined{ifpdftex}
\BeforePackage{pdfcprot}{\let\ifpdftex\relax}
\AfterPackage{pdfcprot}{\let@as@internal@defined{ifpdftex}}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -681,8 +803,10 @@
% \changes{v2.97c}{2007/06/20}{umdefiniert von \cs{scr@ifvtex}}
% If-then-else-Konstrukt, um zu testen, ob V\TeX{} verwendet wird.
% \begin{macrocode}
+%<*base>
\newcommand{\scr@ifVTeX}{\ifnotundefined{VTeXversion}}
\let@as@internal@defined{ifVTeX}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -702,6 +826,7 @@
% ausgegeben wird oder nicht, Befehle auszuführen. Dieses Makro wird
% für die Deklaration der Option \texttt{pagesize} benötigt.
% \begin{macrocode}
+%<*base>
\newcommand{\scr@ifpdfoutput}{%
\scr@ifundefinedorrelax{pdfoutput}{%
\scr@ifundefinedorrelax{OpMode}{%
@@ -722,6 +847,7 @@
}%
}%
\let@as@internal@defined{ifpdfoutput}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -734,6 +860,7 @@
% If-then-else-Konstrukt, um abhängig davon, ob früher oder später
% \texttt{ps} ausgegeben wird oder nicht, Befehle auszuführen.
% \begin{macrocode}
+%<*base>
\newcommand*{\scr@ifpsoutput}{%
\ifnotundefined{if@dvips}{%
\if@dvips
@@ -754,6 +881,7 @@
}%
}
\let@as@internal@defined{ifpsoutput}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -766,6 +894,7 @@
% If-then-else-Konstrukt, um abhängig davon, ob \texttt{dvi}
% ausgegeben wird oder nicht, Befehle auszuführen.
% \begin{macrocode}
+%<*base>
\newcommand*{\scr@ifdvioutput}{%
\scr@ifundefinedorrelax{pdfoutput}{%
\scr@ifundefinedorrelax{OpMode}{%
@@ -786,6 +915,7 @@
}%
}
\let@as@internal@defined{ifdvioutput}
+%</base>
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -795,12 +925,14 @@
% Gibt Material aus, erzeugt dabei aber nur Höhe und Breite, jedoch keine
% Tiefe.
% \begin{macrocode}
+%<*base>
\newcommand*{\scr@smashdp}[1]{%
\begingroup
\def\finsm@sh{\dp\z@\z@\box\z@}%
\smash{#1}%
\endgroup
}
+%</base>
% \end{macrocode}
% \end{macro}
%
@@ -808,66 +940,248 @@
% \changes{v2.97d}{2007/10/03}{neu}
% Arbeitet wie \cs{PackageInfo} aber ohne Ausgabe der Zeilennummer.
% \begin{macrocode}
+%<*base>
\providecommand*{\PackageInfoNoLine}[2]{%
\PackageInfo{#1}{#2\@gobble}%
}
+%</base>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClassInfoNoLine}
+% \changes{v2.98c}{2008/02/15}{neu}
+% Arbeitet wie \cs{ClassInfo} aber ohne Ausgabe der Zeilennummer.
+% \begin{macrocode}
+%<*base>
+\providecommand*{\ClassInfoNoLine}[2]{%
+ \ClassInfo{#1}{#2\@gobble}%
+}
+%</base>
% \end{macrocode}
% \end{macro}
%
% \subsection{Definition von KOMA-\textsf{keyval}-Schlüsseln (Hauptteil)}
%
-% \begin{macro}{\KOMAExecuteOptions}
-% \changes{v2.97c}{2007/04/19}{neu (nur für Klassen- und Paketautoren)}
-% Liste von Optionen ausführen
+% \begin{macro}{\FamilyExecuteOptions}
+% \changes{v3.00}{Neue Anweisung}
+% Entspriche \cs{ExecuteOptions} jedoch \textsf{keyval}-Optionen.
% \begin{macrocode}
-\newcommand*{\KOMAExecuteOptions}[2][KOMA]{%
+%<*base>
+\newcommand*{\FamilyExecuteOptions}[3][.\@currname.\@currext]{%
\def\reserved@a##1\@nil{%
- \@for\KOMA@key@atlist:=#2\do{%
- \expandafter\KOMA@key@split@name@value\KOMA@key@atlist==\@nil
- \scr@ifundefinedorrelax{KV@#1@\KOMA@key@name}{}{%
- \edef\reserved@a{\noexpand\setkeys{#1}{\KOMA@key@atlist}%
+ \@for\scr@key@atlist:=#3\do{%
+ \expandafter\scr@key@split@name@value\scr@key@atlist==\@nil
+ \scr@ifundefinedorrelax{KV@#2@\scr@key@name}{}{%
+ \edef\reserved@a{\noexpand\setkeys{#2}{\scr@key@atlist}%
}%
\reserved@a
}%
- \scr@ifundefinedorrelax{KV@#1.\@currname.\@currext @\KOMA@key@name}{}{%
+ \scr@ifundefinedorrelax{KV@#2#1@\scr@key@name}{}{%
\edef\reserved@a{%
- \noexpand\setkeys{#1.\@currname.\@currext}{\KOMA@key@atlist}%
+ \noexpand\setkeys{#2#1}{\scr@key@atlist}%
}%
\reserved@a
}%
- \let\CurrentOption\KOMA@key@atlist
+ \let\CurrentOption\scr@key@atlist
\csname ds@\CurrentOption\endcsname
}%
\edef\CurrentOption{##1}%
}%
\expandafter\reserved@a\CurrentOption\@nil
}
+\@onlypreamble\FamilyExecuteOptions
+%</base>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\KOMAExecuteOptions}
+% \changes{v2.97c}{2007/04/19}{Neue Anweisung}
+% \changes{v3.00}{2008/04/30}{Kein optionales Argument mehr}
+% Liste von Optionen ausführen
+% \begin{macrocode}
+%<*koma>
+\newcommand*{\KOMAExecuteOptions}{\FamilyExecuteOptions{KOMA}}
\@onlypreamble\KOMAExecuteOptions
+%</koma>
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\FamilyOptions}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% Es werden Schlüssel einer Familie verwendet. Existiert ein Schlüssel nicht,
+% so wird eine Fehlermeldung ausgegeben.
+% \begin{macrocode}
+%<*base>
+\newcommand*{\FamilyOptions}[2]{%
+ \Family@Options{#1}{#2}{%
+ \PackageError{scrbase}{%
+ option `\scr@key@name' unknown at family `#1'%
+ }{%
+ You have used \string\FamilyOptions{#1} to set
+ `\scr@key@atlist',\MessageBreak
+ but family `#1' does not know any option named
+ `\scr@key@name'.\MessageBreak
+ See the manual for the package or class using family `#1' for
+ more\MessageBreak
+ informations about options and their values.%
+ }%
+ }%
+}
+% \begin{macro}{\Family@Options}
+% \changes{v3.00}{2008/04/30}{Neues Makro (intern)}
+% Das interne Macro \cs{Family@Options} macht die eigentliche Arbeit. Das
+% erste Argument ist dabei die Familie. Das zweite Argument ist die Liste der
+% Optionen, das zweite Code, der im Fehlerfall ausgeführt werden soll. Dabei
+% sind die Makros \cs{scr@key@atlist}, \cs{scr@key@name} und
+% \cs{scr@key@value} gültig und können verwendet werden.
+%
+% Anmerkung: Es wird nicht auf \textsf{xkeyval} und den dortigen Befehl
+% \cs{setkeys+} gesetzt, weil dieser die Optionen nicht in der Reihenfolge der
+% Optionen, sondern in der Reihenfolge der Familien ausführt. Das passt mir
+% aber hier gar nicht.
+%
+% In einer Schleife über alle Optionen werden die Optionen zunächst in Option
+% und Wert aufgespaltet.
+% \begin{macrocode}
+\newcommand*{\Family@Options}[3]{%
+ \@for\scr@key@atlist:=#2\do{%
+ \expandafter\scr@key@split@name@value\scr@key@atlist==\@nil
+% \end{macrocode}
+% Dann wird in einer Schleife über alle Familien festgestellt, ob die Option
+% in einer Familie bekannt ist und ggf. ausgeführt.
+% \begin{macrocode}
+ \scr@key@found@false
+ \edef\@tempa{\csname #1@key@familylist\endcsname}%
+ \@for\@tempa:=\@tempa\do{%
+ \scr@ifundefinedorrelax{KV@\@tempa @\scr@key@name}{}{%
+ \scr@key@found@true
+ \edef\reserved@a{\noexpand\setkeys{\@tempa}{\scr@key@atlist}%
+ \noexpand\edef\noexpand\@tempa{\@tempa}%
+ \noexpand\edef\noexpand\scr@key@atlist{\scr@key@atlist}%
+ \noexpand\edef\noexpand\scr@key@name{\scr@key@name}%
+ \noexpand\edef\noexpand\scr@key@value{\scr@key@value}%
+ }%
+ \reserved@a
+ }%
+ }%
+ \ifscr@key@found@\else#3\fi
+ }%
+}
+% \end{macrocode}
+% \begin{macro}{\ifscr@key@found@}
+% \changes{v2.97c}{2007/04/19}{Neuer Schalter (intern)}
+% \changes{v3.00}{2008/04/30}{umbenannt von \cs{ifKOMA@key@found}}
+% \begin{macro}{\scr@key@atlist}
+% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
+% \changes{v3.00}{2008/04/30}{umbenannt von \cs{KOMA@key@atlist}}
+% \begin{macro}{\scr@key@name}
+% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
+% \changes{v3.00}{2008/04/30}{umbenannt von \cs{KOMA@key@name}}
+% \begin{macro}{\scr@key@value}
+% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
+% \changes{v3.00}{2008/04/30}{umbenannt von \cs{KOMA@key@value}}
+% \begin{macro}{\scr@key@split@name@value}
+% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
+% \changes{v2.97e}{2007/11/10}{verwendet \cs{KV@@sp@def} zur Entsorgung von
+% Leerzeichen}
+% \changes{v3.00}{2008/04/30}{umbenannt von \cs{KOMA@key@split@name@value}}
+% \begin{macrocode}
+\newif\ifscr@key@found@
+\newcommand*{\scr@key@atlist}{}
+\newcommand*{\scr@key@name}{}
+\newcommand*{\scr@key@value}{}
+\newcommand*{\scr@key@split@name@value}{}
+\def\scr@key@split@name@value#1=#2=#3\@nil{%
+ \KV@@sp@def\scr@key@name{#1}%
+ \KV@@sp@def\scr@key@value{#2}%
+}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\FamilyOption}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% \begin{macro}{\Family@Option}
+% \changes{v3.00}{2008/04/30}{Neu (intern)}
+% Im Gegensatz zu \cs{FamilyOptions} kann man mit dieser Anweisung nur eine
+% einzige Option setzen. Dafür kann man gleich mehrere durch Komma getrennte
+% Argumente für diese Option setzen. Das erste obligatorische Argument ist
+% wieder die Familie, das zweite obligatorische Argument ist die Option, das
+% dritte, obligatorische Argument ist die Liste der Werte für diese Option.
+% \begin{macrocode}
+%<*base>
+\newcommand*{\FamilyOption}[3]{%
+ \Family@Option{#1}{#2}{#3}{%
+ \PackageError{scrbase}{%
+ unknown option `\scr@key@name' for familie `#1'%
+ }{%
+ You have used \string\FamilyOption{#1} to set
+ `\scr@key@name',\MessageBreak
+ but family '#1' does not know any option named
+ `\scr@key@name'.\MessageBreak
+ See the the manual of the class or package, that provides
+ family\MessageBreak
+ `#1' for more informations about options and their values.%
+ }%
+ }%
+}
+\newcommand*{\Family@Option}[4]{%
+ \expandafter\KV@@sp@def\expandafter\scr@key@name\expandafter{#2}%
+ \scr@key@found@false
+ \edef\@tempa{\csname #1@key@familylist\endcsname}%
+ \@for\@tempa:=\@tempa\do{%
+ \scr@ifundefinedorrelax{KV@\@tempa @\scr@key@name}{}{%
+ \scr@key@found@true
+ \let\@tempb\@tempa
+ }%
+ }%
+ \ifscr@key@found@
+ \let\reserved@a\@empty
+ \@for\@tempa:=#3\do{%
+ \expandafter\KV@@sp@def\expandafter\@tempa\expandafter{\@tempa}%
+ \edef\reserved@a{\reserved@a,\scr@key@name=\@tempa}%
+ }%
+ \ifx\reserved@a\@empty
+ \edef\reserved@a{\noexpand\setkeys{\@tempb}{\scr@key@name}}%
+ \else
+ \edef\reserved@a{%
+ \noexpand\setkeys{\@tempb}{\expandafter\@gobble\reserved@a}}%
+ \fi
+ \reserved@a
+ \else
+ #4
+ \fi
+}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\KOMAoptions}
% \changes{v2.96}{2006/08/20}{Neuer Hook nach den Optionen}
% \changes{v2.97c}{2007/04/19}{Optionen aller KOMA-Familien abarbeiten}
-% \begin{macro}{\post@kopt@hook}
-% \changes{v2.96}{2006/08/20}{Neuer Hook nach den Optionen}
-% \begin{macro}{\AfterKOMAoptions}
-% \changes{v2.96}{2006/08/20}{Neuer Hook nach den Optionen}
% Es werden Schlüssel verwendet und ggf. danach noch Dinge ausgeführt.
% \begin{macrocode}
+%<*koma>
\newcommand*{\KOMAoptions}[1]{%
\let\post@kopt@hook\@empty
\KOMA@options{#1}{%
-% Wenn der Schlüssel für keine der bekannten Familien definiert ist, wird ein
-% Fehler ausgegeben.
+% \end{macrocode}
+% Wenn der Schlüssel für keines der bekannten Familienmitglieder definiert
+% ist, wird ein Fehler ausgegeben.
% \begin{macrocode}
\PackageError{scrkbase}{%
- unknown KOMA option `\KOMA@key@name'%
+ unknown KOMA option `\scr@key@name'%
}{%
You have used \string\KOMAoptions\space to set
- `\KOMA@key@atlist',\MessageBreak
+ `\scr@key@atlist',\MessageBreak
but KOMA-Script does not know any option named
- `\KOMA@key@name'.\MessageBreak
+ `\scr@key@name'.\MessageBreak
See the KOMA-Script manual for more informations about options
and\MessageBreak
their values.%
@@ -892,53 +1206,17 @@
% In einer Schleife über alle Optionen werden die Optionen zunächst in Option
% und Wert aufgespaltet.
% \begin{macrocode}
-\newcommand*{\KOMA@options}[2]{%
- \@for\KOMA@key@atlist:=#1\do{%
- \expandafter\KOMA@key@split@name@value\KOMA@key@atlist==\@nil
-% \end{macrocode}
-% Dann wird in einer Schleife über alle Familien festgestellt, ob die Option
-% in einer Familie bekannt ist und ggf. ausgeführt.
-% \begin{macrocode}
- \KOMA@key@found@false
- \@for\@tempa:=\KOMA@key@familylist\do{%
- \scr@ifundefinedorrelax{KV@\@tempa @\KOMA@key@name}{}{%
- \KOMA@key@found@true
- \edef\reserved@a{\noexpand\setkeys{\@tempa}{\KOMA@key@atlist}%
- \noexpand\edef\noexpand\@tempa{\@tempa}%
- \noexpand\edef\noexpand\KOMA@key@atlist{\KOMA@key@atlist}%
- \noexpand\edef\noexpand\KOMA@key@name{\KOMA@key@name}%
- \noexpand\edef\noexpand\KOMA@key@value{\KOMA@key@value}%
- }%
- \reserved@a
- }%
- }%
- \ifKOMA@key@found@\else#2\fi
- }%
-}
+\newcommand*{\KOMA@options}{\Family@Options{KOMA}}
+%</koma>
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\ifKOMA@key@found@}
-% \changes{v2.97c}{2007/04/19}{Neuer Schalter (intern)}
-% \begin{macro}{\KOMA@key@atlist}
-% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
-% \begin{macro}{\KOMA@key@name}
-% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
-% \begin{macro}{\KOMA@key@value}
-% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
-% \begin{macro}{\KOMA@key@split@name@value}
-% \changes{v2.97c}{2007/04/19}{Neues Makro (intern)}
-% \changes{v2.97e}{2007/11/10}{verwendet \cs{KV@@sp@def} zur Entsorgung von
-% Leerzeichen}
+% \end{macro}
+%
+% \begin{macro}{\post@kopt@hook}
+% \begin{macro}{\AfterKOMAoptions}
+% Eine Option kann dafür sorgen, dass nach den Optionen noch etwas passiert.
% \begin{macrocode}
-\newif\ifKOMA@key@found@
-\newcommand*{\KOMA@key@atlist}{}
-\newcommand*{\KOMA@key@name}{}
-\newcommand*{\KOMA@key@value}{}
-\newcommand*{\KOMA@key@split@name@value}{}
-\def\KOMA@key@split@name@value#1=#2=#3\@nil{%
- \KV@@sp@def\KOMA@key@name{#1}%
- \KV@@sp@def\KOMA@key@value{#2}%
-}
+%<*koma>
\newcommand*{\post@kopt@hook}{}
\let\post@kopt@hook\relax
\newcommand*{\AfterKOMAoptions}{%
@@ -954,7 +1232,11 @@
\fi
\post@kopt@hook
}
+%</koma>
% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\l@addto@macro}
% \changes{v2.8p}{2001/09/22}{neu (intern)}
% Damit \cs{AfterKOMAoptions} lokal möglich ist, wird eine lokal arbeitende
@@ -963,6 +1245,7 @@
% Erweiterung um Makrodefinitonen mit Argumenten wie \cs{g@addto@macro}
% verhält}
% \begin{macrocode}
+%<*base>
\scr@ifundefinedorrelax{unexpanded}{%
\newcommand*{\g@addto@macro@temp}{}%
\newcommand{\l@addto@macro}[2]{%
@@ -977,34 +1260,123 @@
\edef#1{\unexpanded\expandafter{#1#2}}%
}%
}
+%</base>
% \end{macrocode}
% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
+%
+% \begin{macro}{\KOMAoption}
+% \changes{v2.98c}{2008/03/12}{Neue Anweisung}
+% Im Gegensatz zu \cs{KOMAoptions} kann man mit dieser Anweisung nur eine
+% einzige Option setzen. Dafür kann man gleich mehrere durch Komma getrennte
+% Argumente für diese Option setzen. Das erste obligatorische Argument ist die
+% Option, das zweite, obligatorische Argument ist die Liste der Werte für
+% diese Option.
+% \begin{macrocode}
+%<*koma>
+\newcommand*{\KOMAoption}[2]{%
+ \let\post@kopt@hook\@empty
+ \Family@Option{KOMA}{#1}{#2}{%
+ \PackageError{scrkbase}{%
+ unknown KOMA option `\scr@key@name'%
+ }{%
+ You have used \string\KOMAoption\space to set
+ `\scr@key@name',\MessageBreak
+ but KOMA-Script does not know any option named
+ `\scr@key@name'.\MessageBreak
+ See the KOMA-Script manual for more informations about options
+ and\MessageBreak
+ their values.%
+ }%
+ }%
+ \post@kopt@hook\let\post@kopt@hook\relax
+}
+%</koma>
+% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\KOMA@unknown@keyval}
+% \begin{macro}{\FamilyUnknownKeyValue}
% Dieses Makro berichtet über Fehler wegen unbekannter Wertübergabe an
-% einen Schlüssel. Das erste Argument ist der Schlüssel, das zweite
-% der Wert und das dritte die Liste der möglichen Werte.
+% einen Schlüssel. Das erste Argument ist die Familie, das zweit der
+% Schlüssel, das dritte der Wert und das vierte die Liste der möglichen
+% Werte.
% \begin{macrocode}
-\newcommand*{\KOMA@unknown@keyval}[3]{%
+%<*base>
+\newcommand*{\FamilyUnknownKeyValue}[4]{%
\PackageError{%
- scrkbase%
+ scrbase%
}{%
- KOMA option `#1' has no value `#2'%
+ option `#2' of family `#1' has no value `#3'%
}{%
- You've tried to set option `#1' to value `#2'.\MessageBreak
+ You've tried to set option `#2' of family '#1' to value `#3'.\MessageBreak
But allowed values are only:\MessageBreak
- #3.\MessageBreak
- See the KOMA-Script manual for more information.%
+ #4\FamilyElseValues.\MessageBreak
+ See the manual of the class or package, that provides family
+ `#1'\MessageBreak
+ for more information about options and their values.%
+ }%
+}
+%</base>
+% \end{macrocode}
+% \begin{macro}{\FamilyElseValues}
+% \changes{v3.00}{2008/05/02}{Neue Anweisung}
+% Diese Anweisung kann vor dem Setzen eines Wertes definiert werden, um bei
+% einer etwaigen Fehlermeldung weitere Werte als erlaubt auszugeben. Am Ende
+% von \cs{FamilySetBool} und \cs{FamilySetNumerical} wird die Anweisung
+% automatisch zu \cs{@empty}. Es ist zu beachten, dass bei der Definition der
+% Anweisung als erstes ein Komma und ein Leerzeichen zu setzen ist!
+% \begin{macrocode}
+%<*base>
+\newcommand*{\FamilyElseValues}{}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\FamilyBoolKey}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% Dieses Makro definiert einen Schlüssel für eine Familie. Dieser Schlüssel
+% ist ein Schalter, der über diverse Werte geschaltet werden kann.
+% Das erste, optionale Argument ist das Familienmitglied, das zweite,
+% obligatorische Argument ist die Familie, das dritte der Name des Schlüssels,
+% das vierte der Schalter.
+% \begin{macrocode}
+%<*base>
+\newcommand*{\FamilyBoolKey}[4][.\@currname.\@currext]{%
+ \@ifundefined{if#4}{%
+ \expandafter\newif\csname if#4\endcsname
+ }{}%
+ \DefineFamilyKey[{#1}]{#2}{#3}[true]{\FamilySetBool{#2}{#3}{#4}{##1}}%
+}
+\newcommand*{\FamilySetBool}[4]{%
+ \ifstr{#4}{true}{\@nameuse{#3true}}{%
+ \ifstr{#4}{on}{\@nameuse{#3true}}{%
+ \ifstr{#4}{yes}{\@nameuse{#3true}}{%
+ \ifstr{#4}{false}{\@nameuse{#3false}}{%
+ \ifstr{#4}{off}{\@nameuse{#3false}}{%
+ \ifstr{#4}{no}{\@nameuse{#3false}}{%
+ \FamilyUnknownKeyValue{#1}{#2}{#3}{%
+ `true', `on', `yes', `false', `off', `no'%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
}%
+ \let\FamilyElseValues\@empty
}
+%</base>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\KOMA@unknown@keyval}
+% Dieses Makro berichtet über Fehler wegen unbekannter Wertübergabe an
+% einen Schlüssel. Das erste Argument ist der Schlüssel, das zweite
+% der Wert und das dritte die Liste der möglichen Werte.
+% \begin{macrocode}
+%<*koma>
+\newcommand*{\KOMA@unknown@keyval}{\FamilyUnknownKeyValue{KOMA}}
+%</koma>
% \end{macrocode}
% \end{macro}
%
@@ -1017,12 +1389,9 @@
% des Schküssels grundsätzlich "`true"' ist. Das erste Argument ist
% der Name des Schlüssels, der zweite ist der Name des Schalters.
% \begin{macrocode}
-\newcommand*{\KOMA@ifkey}[2]{%
- \@ifundefined{if#2}{%
- \expandafter\newif\csname if#2\endcsname
- }{}%
- \KOMA@key{#1}[true]{\KOMA@set@ifkey{#1}{#2}{##1}}%
-}
+%<*koma>
+\newcommand*{\KOMA@ifkey}{\FamilyBoolKey{KOMA}}
+%</koma>
% \end{macrocode}
% \begin{macro}{\KOMA@set@ifkey}
% Die eigentliche Arbeit bei der ganzen Sache wird von diesem internen
@@ -1030,70 +1399,61 @@
% Name des Schalters zu Argument 2 und der Wert des Schlüssels wird
% Argument 3.
% \begin{macrocode}
-\newcommand*{\KOMA@set@ifkey}[3]{%
- \ifstr{#3}{true}{\@nameuse{#2true}}{%
- \ifstr{#3}{on}{\@nameuse{#2true}}{%
- \ifstr{#3}{yes}{\@nameuse{#2true}}{%
- \ifstr{#3}{false}{\@nameuse{#2false}}{%
- \ifstr{#3}{off}{\@nameuse{#2false}}{%
- \ifstr{#3}{no}{\@nameuse{#2false}}{%
- \KOMA@unknown@keyval{#1}{#3}{%
- `true', `on', `yes', `false', `off', `no'%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
-}
+%<*koma>
+\newcommand*{\KOMA@set@ifkey}{\FamilySetBool{KOMA}}
+%</koma>
% \end{macrocode}
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\KOMA@ncmdkey}
-% Ein ähnliches Makro definiert einen Schlüssel, der ein nummerisches
-% Makro auf einen bestimmten Wert setzt. Dabei können auch
-% verschiedene symbolische Werte auf denselben nummerischen Wert
-% abgebildet werden. Das erste Argument ist obligatorisch und der Name
-% des Schlüssels. Das zweite Argument ist optional und der Defaultwert
-% für den Schlüssel. Das dritte Argument ist obligatorisch und der
-% Name des Makros, das definiert werden soll. Der Defaultwert dafür
-% ist 0. Das vierte Argument ist obligatorisch und die Liste der
-% symbolischen und nummerischen Wert. Die Liste hat die Form:
+% \begin{macro}{\FamilyNumericalKey}
+% \changes{v3.00}{2008/04/30}{Neue Anweisung}
+% \begin{macro}{\Family@Numerical@Key}
+% \changes{v3.00}{2008/05/28}{Neu (intern)}
+% Ein ähnliches Makro definiert einen Schlüssel, der ein nummerisches Makro
+% auf einen bestimmten Wert setzt. Dabei können auch verschiedene symbolische
+% Werte auf denselben nummerischen Wert abgebildet werden. Das erste,
+% optionale Argument ist das Familienmitglied, das zweite, obligatorische
+% Argument ist die Familie, das dritte, obligatorische Argument ist der Name
+% der Option, das vierte, optionale Artument ist der Defaultwert für den
+% Schlüssel, das fünfte, obligatorische Argument ist der Name des Makros, das
+% (in der Voreinstellung als 0) definiert werden soll, das sechste,
+% obligatorische Argument ist die Liste der symbolischen und nummerischen
+% Werte. Die Liste hat die Form:
% \{\emph{Symbol}\}\{\emph{Wert}\},\{\emph{Symbol}\}\{\emph{Wert}\}\dots
-% \begin{macro}{\KOMA@@ncmdkey}
-% Da nicht das erste, sondern das zweite Argument optional ist, wird
-% ein Hilfsmakro benötigt.
+% Das interne Makro wird benötigt, um das vierte, optionale Argument zu
+% ermöglichen. Dabei ist dann das erste Argument nicht mehr optional, sondern
+% obligatorisch.
% \begin{macrocode}
-\newcommand*{\KOMA@ncmdkey}[1]{%
+%<*base>
+\newcommand*{\FamilyNumericalKey}[3][.\@currname.\@currext]{%
\@ifnextchar [%]
- {\KOMA@@ncmdkey{#1}}{\KOMA@@ncmdkey{#1}[]}%
+ {\Family@Numerical@Key{#1}{#2}{#3}}{\Family@Numerical@Key{#1}{#2}{#3}[]}%
}
-\newcommand*{\KOMA@@ncmdkey}{}
-\def\KOMA@@ncmdkey#1[#2]#3#4{%
- \ifx\relax#2\relax\else
- \@namedef{KV@KOMA@#1@default\expandafter}\expandafter{%
- \csname KV@KOMA@#1\endcsname{#2}%
- }%
+\newcommand*{\Family@Numerical@Key}{}
+\def\Family@Numerical@Key#1#2#3[#4]#5#6{%
+ \@ifundefined{#5}{\@namedef{#5}{0}}%
+ \ifx\relax#4\relax
+ \DefineFamilyKey[{#1}]{#2}{#3}{\FamilySetNumerical{#2}{#3}{#5}{#6}{##1}}%
+ \else
+ \DefineFamilyKey[{#1}]{#2}{#3}[{#4}]{%
+ \FamilySetNumerical{#2}{#3}{#5}{#6}{##1}}%
\fi
- \@ifundefined{#3}{\@namedef{#3}{0}}%
- \KOMA@key{#1}{\KOMA@set@ncmdkey{#1}{#3}{#4}{##1}}%
}
% \end{macrocode}
-% \begin{macro}{\KOMA@set@ncmdkey}
+% \begin{macro}{\FamilySetNumerical}
% Die eigentliche Arbeit dabei wird von diesem Makro erledigt. Dabei
-% wird der Name des Schlüssels zu Argument 1, der Name des Makros,
-% das definiert werden soll zu Argument 2, die Liste zu Argument 3 und
-% der Wert, auf den gesetzt werden soll, zu Argument 4.
+% wird die Familie zu Argument 1, der Name des Schlüssels zu Argument 2, der
+% Name des Makros, das definiert werden soll zu Argument 3, die Liste zu
+% Argument 4 und der Wert, auf den gesetzt werden soll, zu Argument 5.
% \begin{macrocode}
-\newcommand*{\KOMA@set@ncmdkey}[4]{%
+\newcommand*{\FamilySetNumerical}[5]{%
\begingroup
- \edef\@searched{#4}%
+ \edef\@searched{#5}%
\let\@tempa=\@empty
\let\@tempb=\@empty
\@tempswafalse
- \@for\@valuelist:=#3\do{%
+ \@for\@valuelist:=#4\do{%
\if@tempswa\else
\edef\@tempc{\expandafter\@firstoftwo\@valuelist}%
\edef\@tempa{\@tempa\@tempb`\@tempc'}%
@@ -1106,40 +1466,100 @@
}%
\if@tempswa
\edef\@tempa{\endgroup
- \noexpand\@namedef{#2}{\@tempa}%
+ \noexpand\@namedef{#3}{\@tempa}%
}%
\else
- \KOMA@unknown@keyval{#1}{#4}{\@tempa}%
+ \FamilyUnknownKeyValue{#1}{#2}{#5}{\@tempa}%
\let\@tempa=\endgroup
\fi
\@tempa
+ \let\FamilyElseValues\@empty
}
+%</base>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KOMA@ncmdkey}
+% Ein ähnliches Makro definiert einen Schlüssel, der ein nummerisches
+% Makro auf einen bestimmten Wert setzt. Dabei können auch
+% verschiedene symbolische Werte auf denselben nummerischen Wert
+% abgebildet werden. Das erste Argument ist obligatorisch und der Name
+% des Schlüssels. Das zweite Argument ist optional und der Defaultwert
+% für den Schlüssel. Das dritte Argument ist obligatorisch und der
+% Name des Makros, das definiert werden soll. Der Defaultwert dafür
+% ist 0. Das vierte Argument ist obligatorisch und die Liste der
+% symbolischen und nummerischen Wert. Die Liste hat die Form:
+% \{\emph{Symbol}\}\{\emph{Wert}\},\{\emph{Symbol}\}\{\emph{Wert}\}\dots
+% \begin{macrocode}
+%<*koma>
+\newcommand*{\KOMA@ncmdkey}{\FamilyNumericalKey{KOMA}}
+%</koma>
+% \end{macrocode}
+% \begin{macro}{\KOMA@set@ncmdkey}
+% Die eigentliche Arbeit dabei wird wahlweise von diesem Makro erledigt. Dabei
+% wird der Name des Schlüssels zu Argument 1, der Name des Makros,
+% das definiert werden soll zu Argument 2, die Liste zu Argument 3 und
+% der Wert, auf den gesetzt werden soll, zu Argument 4.
+% \begin{macrocode}
+%<*koma>
+\newcommand*{\KOMA@set@ncmdkey}{\FamilySetNumerical{KOMA}}
+%</koma>
% \end{macrocode}
-% \end{macro}
% \end{macro}
% \end{macro}
%
+%
% \begin{macro}{\KOMA@DeclareObsoleteOption}
% \changes{v2.96}{2006/08/20}{\cs{CurrentOption wir geschützt}}
+% \begin{macro}{\KOMA@@DeclareObsoleteOption}
+% \changes{v2.98c}{2008/02/18}{neu (intern)}
+% \begin{macro}{\KOMA@@@DeclareObsoleteOption}
+% \changes{v2.98c}{2008/02/18}{neu (intern)}
+% \begin{macro}{\KOMA@iv@DeclareObsoleteOption}
+% \changes{v2.98c}{2008/02/18}{neu (intern)}
% Mit Hilfe dieses Makros kann eine Option definiert werden, die
% eigentlich obsolete ist. Statt dieser Option wird dann ein Schlüssel
% verwendet. Das erste Argument ist optional und muss dann entweder
-% \cs{PackageInfo}, \cs{PackageInfoNoLine}, \cs{PackageWarning} oder
-% \cs{PackageWarningNoLine} sein. Das zweite Argument ist der Name der
-% Option. Das dritte Argument ist das Setzen des gewünschten Schlüssels.
+% \cs{PackageInfo}, \cs{PackageInfoNoLine}, \cs{PackageWarning},
+% \cs{PackageWarningNoLine} oder das gleiche für Klassen sein. Das zweite
+% Argument ist ebenfalls optional und der Name des Pakets oder der Klasse. Das
+% dritte Argument ist der Name der Option. Das vierte Argument ist das Setzen
+% des gewünschten Schlüssels.
% \begin{macrocode}
-\newcommand*{\KOMA@DeclareObsoleteOption}[3][\@gobbletwo]{%
- \DeclareOption{#2}{\KOMA@UseObsoleteOption{#1}{#2}{#3}}%
+%<*koma>
+\newcommand*{\KOMA@DeclareObsoleteOption}{%
+ \@ifnextchar [%]
+ {\KOMA@@DeclareObsoleteOption}%
+ {\KOMA@@DeclareObsoleteOption[\@gobbletwo]}%
+}
+\newcommand*{\KOMA@@DeclareObsoleteOption}{}
+\def\KOMA@@DeclareObsoleteOption[#1]{%
+ \@ifnextchar [%]
+ {\KOMA@@@DeclareObsoleteOption{#1}}%
+ {\KOMA@@@DeclareObsoleteOption{#1}[]}%
+}
+\newcommand*{\KOMA@@@DeclareObsoleteOption}{}
+\def\KOMA@@@DeclareObsoleteOption#1[#2]#3#4{%
+ \ifstr{#2}{}{%
+ \KOMA@iv@DeclareObsoleteOption{#1}{\@currname}{#3}{#4}%
+ }{%
+ \KOMA@UseObsoleteOption{#1}{#2}{#3}{#4}%
+ }%
+}
+\newcommand*{\KOMA@iv@DeclareObsoleteOption}[4]{%
+ \DeclareOption{#3}{\KOMA@UseObsoleteOption{#1{#2}}{#3}{#4}}%
}
% \end{macrocode}
% \begin{macro}{\KOMA@UseObsoleteOption}
% \changes{v2.97c}{2007/04/19}{neu (intern)}
% Die eigentliche Arbeit wird von diesem Makro erledigt. Die Argumente sind
-% dieselben.
+% 1. Meldungsbefehl, 2. obsolete Option, 3. Setzen des Schlüssels.
% \begin{macrocode}
\newcommand*{\KOMA@UseObsoleteOption}[3]{%
\let\scr@sr@co\CurrentOption
- #1{scrkbase}{%
+ #1{%
You've used obsolete option `#2'.\MessageBreak
\protect\KOMAExecuteOptions{#3} will be\MessageBreak
used instead.\MessageBreak
@@ -1150,6 +1570,20 @@
\let\CurrentOption\scr@sr@co
}
% \end{macrocode}
+% \begin{macro}{\scr@sr@co}
+% \changes{v2.96}{2006/08/20}{neu (intern)}
+% Da das \texttt{xkeyval}-Paket leider \cs{CurrentOption} vernichtet, das aber
+% innerhalb von \cs{ProcessOptions} und \cs{KOMAProcessOptions} nach dem
+% Ausführen der Option noch benötigt wird, muss die Anweisung gesichert
+% werden. Dafür wird ein Hilfsmakro benötigt.
+% \begin{macrocode}
+\newcommand*{\scr@sr@co}{}
+%</koma>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
% \end{macro}
% \end{macro}
%
@@ -1163,6 +1597,7 @@
% definierte Makro selbst hat Schaltercharakter, ist also nicht
% \cs{long} und versteht auch keine Argumente.
% \begin{macrocode}
+%<*koma>
\newcommand*{\KOMA@newobsoletecommand}[3][\@gobbletwo]{%
\newcommand*{#2}{\KOMA@UseObsoleteCommand{#1}{\string#2}{#3}}%
}
@@ -1182,6 +1617,7 @@
}%
\KOMAoptions{#3}%
}
+%</koma>
% \end{macrocode}
% \end{macro}
% \end{macro}