summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-08-20 00:02:10 +0000
committerKarl Berry <karl@freefriends.org>2006-08-20 00:02:10 +0000
commit524b07990fd2040ab6ce24b015b9a2bd4544a3c1 (patch)
tree93d7c1e1089e6c5df66ce81b57ed93482321baaa /Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
parentaffc79c45bfab740028ac1e6b8480c5465a42b01 (diff)
koma-script 2.95b, using provided texmf zip
git-svn-id: svn://tug.org/texlive/trunk@1990 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/koma-script/scrkbase.dtx')
-rw-r--r--Master/texmf-dist/source/latex/koma-script/scrkbase.dtx1049
1 files changed, 1049 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx b/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
new file mode 100644
index 00000000000..894dea90cd6
--- /dev/null
+++ b/Master/texmf-dist/source/latex/koma-script/scrkbase.dtx
@@ -0,0 +1,1049 @@
+% \CheckSum{819}
+% \iffalse meta-comment
+% ======================================================================
+% scrkbase.dtx
+% Copyright (c) Markus Kohm, 2002-2006
+%
+% This file is part of the LaTeX2e KOMA-Script bundle.
+%
+% This work may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3b of the license.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3b or later is part of all distributions of LaTeX
+% version 2005/12/01 or later and of this work.
+%
+% This work has the LPPL maintenance status "author-maintained".
+%
+% The Current Maintainer and author of this work is Markus Kohm.
+%
+% This work consists of all files listed in manifest.txt.
+% ----------------------------------------------------------------------
+% scrkbase.dtx
+% Copyright (c) Markus Kohm, 2002-2006
+%
+% Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz,
+% Version 1.3b, verteilt und/oder veraendert werden.
+% Die neuste Version dieser Lizenz ist
+% http://www.latex-project.org/lppl.txt
+% und Version 1.3b ist Teil aller Verteilungen von LaTeX
+% Version 2005/12/01 oder spaeter und dieses Werks.
+%
+% Dieses Werk hat den LPPL-Verwaltungs-Status "author-maintained"
+% (allein durch den Autor verwaltet).
+%
+% Der Aktuelle Verwalter und Autor dieses Werkes ist Markus Kohm.
+%
+% Dieses Werk besteht aus den in manifest.txt aufgefuehrten Dateien.
+% ======================================================================
+% \fi
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \iffalse
+%%% From File: scrkbase.dtx
+%<*driver>
+% \fi
+\ProvidesFile{scrkbase.dtx}[2006/03/29 v1.0 KOMA-Script (basics)]
+% \iffalse
+%</driver>
+%<package&option>\ProvidesPackage{scrkbase}[%
+%<package&option> \KOMAScriptVersion\space package (basics and keyval use)]
+%<*driver>
+\documentclass{scrdoc}
+\usepackage[english,ngerman]{babel}
+\usepackage[latin1]{inputenc}
+\CodelineIndex
+\RecordChanges
+\GetFileInfo{scrkbase.dtx}
+\title{\KOMAScript{} \partname\ \texttt{\filename}%
+ \footnote{Dies ist Version \fileversion\ von Datei
+ \texttt{\filename}.}}
+\date{\filedate}
+\author{Markus Kohm}
+
+\begin{document}
+ \maketitle
+ \tableofcontents
+ \DocInput{\filename}
+\end{document}
+%</driver>
+% \fi
+%
+% \selectlanguage{ngerman}
+%
+% \changes{v1.0}{2002/07/06}{Beginn der ersten Version}
+%
+% \section{Grundlegenden \KOMAScript-Erweiterungen}
+%
+% Neue Versionen von \KOMAScript{} machen zunehmend Gebrauch vom
+% \textsf{keyval}-Paket. Das \textsf{keyval}-Paket ist Bestandteil des
+% \textsf{graphics}-Pakets und muss als solches auf allen
+% \TeX-Systemen mit \LaTeX{} enthalten sein. Es genügt jedoch in
+% einigen Punkten nicht den Anforderungen von \KOMAScript{}. Deshalb
+% 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
+% Paket auch ohne den Rest von \KOMAScript{} zum Einsatz bringen.
+%
+% \StopEventually{\PrintIndex\PrintChanges}
+%
+% \iffalse
+%<*option>
+% \fi
+%
+% \subsection{Optionen}
+% Derzeit gibt es keine Optionen in diesem Bereich.
+%
+% \iffalse
+%</option>
+%<*load>
+% \fi
+%
+% \subsection{Laden des Pakets}
+% Wer das Paket lädt, tut das allerdings in der Regel sogar bereits
+% vor der Definition der Optionen mit:
+% \begin{macrocode}
+\RequirePackage{scrkbase}[\KOMAScriptVersion]
+% \end{macrocode}
+%
+% \iffalse
+%</load>
+%<*body>
+% \fi
+%
+% \subsection{Laden von \textsf{keyval}}
+%
+% Die Überschrift ist reine Tiefstapelei. Hier wird nicht nur das
+% Paket geladen, was ruckzuck mit:
+% \begin{macrocode}
+\RequirePackage{keyval}
+% \end{macrocode}
+% erledigt ist.
+%
+% Im Anschluss an das Laden des Pakets werden auch noch diverse
+% Makros des Pakets umdefiniert. Diese Umdefinitionen wurden von mir
+% für das Paket vorgeschlagen, sind bisher\footnote{2002-07-06} aber
+% nicht realisiert (siehe dazu die \LaTeX{} Bugreport Database).
+%
+% Um Probleme zu vermeiden, wird jeweils getestet, dass die
+% Originaldefinition nicht inzwischen geändert wurde. Das bläht zwar
+% den Code auf, ist aber besser so.
+%
+% \begin{macro}{\KV@split}
+% Dieses Makro nimmt die Aufteilung in Schlüsselname und Argument
+% vor. Außerdem ruft es dann die Schlüsseldefinition auf oder gibt bei
+% fehlendem Schlüssel einen Fehler aus. Zunächst wird die Definition
+% getestet. Das geht aufgrund des Aufbaus nicht direkt mit
+% \cs{CheckCommand}. Aber es geht mit einem internen Makro, das auch
+% von \cs{CheckCommand} verwendet wird.
+% \begin{macrocode}
+\begingroup
+ \def\@tempa#1=#2=#3\relax{%
+ \KV@@sp@def\@tempa{#1}%
+ \ifx\@tempa\@empty\else
+ \expandafter\let\expandafter\@tempc
+ \csname\KV@prefix\@tempa\endcsname
+ \ifx\@tempc\relax
+ \KV@errx
+ {\@tempa\space undefined}%
+ \else
+ \ifx\@empty#3\@empty
+ \KV@default
+ \else
+ \KV@@sp@def\@tempb{#2}%
+ \expandafter\@tempc\expandafter{\@tempb}\relax
+ \fi
+ \fi
+ \fi}
+ \@check@eq\KV@split\@tempa
+\endgroup
+% \end{macrocode}
+% Dann wird es umdefiniert, wobei erstmal alles wie zuvor bleibt:
+% \begin{macrocode}
+\def\KV@split#1=#2=#3\relax{%
+ \KV@@sp@def\@tempa{#1}%
+ \ifx\@tempa\@empty\else
+ \expandafter\let\expandafter\@tempc
+ \csname\KV@prefix\@tempa\endcsname
+ \ifx\@tempc\relax
+% \end{macrocode}
+% Bis wir zum Fehlerfall kommen. Hier erlauben wir jedem Paket seine
+% eigenen Fehlermeldungen:
+% \begin{macrocode}
+ \scr@KV@errx{\@tempa}%
+% \end{macrocode}
+% Danach wieder wie gehabt:
+% \begin{macrocode}
+ \else
+ \ifx\@empty#3\@empty
+ \KV@default
+ \else
+ \KV@@sp@def\@tempb{#2}%
+ \expandafter\@tempc\expandafter{\@tempb}\relax
+ \fi
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\KV@default}
+% Dieses Makro ruft den Default-Wert ab oder gibt einen Fehler
+% aus. Zunächst wieder der Test. Diesmal aber direkt mit
+% \cs{CheckCommand}:
+% \begin{macrocode}
+\CheckCommand*{\KV@default}{%
+ \expandafter\let\expandafter\@tempb
+ \csname\KV@prefix\@tempa @default\endcsname
+ \ifx\@tempb\relax
+ \KV@err{No value specified for \@tempa}%
+ \else
+ \@tempb\relax
+ \fi}
+% \end{macrocode}
+% Danach wird wieder umdefiniert, wobei wieder nur die
+% Fehlergeschichte geändert wird:
+% \begin{macrocode}
+\renewcommand*{\KV@default}{%
+ \expandafter\let\expandafter\@tempb
+ \csname\KV@prefix\@tempa @default\endcsname
+ \ifx\@tempb\relax
+ \scr@KV@err{\@tempa}%
+ \else
+ \@tempb\relax
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\scr@KV@errx}
+% \begin{macro}{\scr@KV@err}
+% Jetzt brauchen wir natürlich die Makros zur Fehlerausgabe. Dabei
+% kann für jeden Schlüsselkennung jeweils eine eigene Fehlermeldung für
+% fehlende Schlüssel und fehlenden Defaultwert definiert
+% werden. Fehlende Schlüssel werden mit \cs{KV@\meta{Kennung}@nokey}
+% gemeldet, fehlende Defaultwerte mit \cs{KV@\meta{Kennung}@noval}.
+% Sind entsprechende Makros nicht definiert, erfolgt die Meldung auf
+% herkömmlichem Weg.
+% \begin{macrocode}
+\newcommand*{\scr@KV@errx}[1]{%
+ \expandafter\ifx\csname\KV@prefix nokey\endcsname\relax
+ \KV@errx{#1\space undefined}%
+ \else
+ \csname\KV@prefix nokey\endcsname{#1}%
+ \fi
+}
+\newcommand*{\scr@KV@err}[1]{%
+ \expandafter\ifx\csname\KV@prefix noval\endcsname\relax
+ \KV@err{No value specified for #1}%
+ \else
+ \csname\KV@prefix noval\endcsname{#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Das waren alle Änderungen.
+%
+%
+% \subsection{Häufig benötigte Befehle}
+%
+% \begin{macro}{\if@atdocument}
+% \changes{v2.95}{2002/12/05}{neuer Schalter}
+% \begin{macro}{\@atdocumenttrue}
+% \begin{macro}{\@atdocumentfalse}
+% Dieser Schalter wird bei \cs{begin}\texttt{\{document\}} wahr. Er
+% wird von \KOMAScript{} für Befehle verwendet, die sich
+% unterschiedlich verhalten, je nachdem, ob sie in der Präambel oder
+% danach aufgerufen werden.
+% \begin{macrocode}
+\newif\if@atdocument
+\AtBeginDocument{\@atdocumenttrue}
+\@onlypreamble\@atdocumentrue
+\@onlypreamble\@atdocumentfalse
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifundefined}
+% \changes{v2.95}{2002/08/21}{neu}
+% Dieses Makro arbeitet wie \cs{@ifundefined}, definiert dabei aber
+% ein undefiniertes Makro nicht als \cs{relax}.
+% \begin{macrocode}
+\newcommand{\ifundefined}[1]{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1\endcsname\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifnotundefined}
+% \changes{v2.95}{2002/08/21}{neu}
+% Dieses Makro arbeitet genau umgekehrt zu \cs{ifundefined}. Manchmal
+% 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}
+\newcommand{\ifnotundefined}[1]{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname #1\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifstr}
+% \changes{v2.95}{2004/07/20}{if- und then-Teil werden nicht gefressen}
+% Dieses Makro vergleicht zwei Tokenfolgen. Eigentlich müsste es also
+% eher \cs{ifequal} oder ähnlich heißen.
+% \begin{macrocode}
+\newcommand\ifstr[2]{%
+ \begingroup\edef\@tempa{#1}\edef\@tempb{#2}%
+ \ifx\@tempa\@tempb
+ \endgroup\expandafter\@firstoftwo
+ \else
+ \endgroup\expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifnumber}
+% Dieses Makro testet, ob ein übergebener Parameter eine positive,
+% ganze Zahl ist. Ist dies der Fall, wird der zweite Parameter
+% ausgeführt, sonst der dritte.
+% \begin{macrocode}
+\newcommand\ifnumber[1]{%
+ \begingroup\@tempswafalse\let\scr@next\test@number
+ \expandafter\scr@next#1\scr@next
+ \if@tempswa
+ \endgroup\expandafter\@firstoftwo
+ \else
+ \endgroup\expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\test@number}
+% Für den eigentlichen Test wird der erste Parameter Token für Token
+% gescannt und beurteilt.
+% \begin{macrocode}
+\newcommand*{\test@number}[1]{%
+ \ifx \scr@next#1
+ \let\scr@next\relax
+ \else
+% \end{macrocode}
+% Dabei wird für einen schnelleren Vergleich die Tatsache genutzt, dass
+% Ziffernzeichen immer im selben durchgängigen Bereich liegen
+% \begin{macrocode}
+ \@tempcnta=\expandafter\expandafter\expandafter\number
+ \expandafter`#1\relax
+ \ifnum \@tempcnta>47
+ \ifnum \@tempcnta<58
+ \@tempswatrue
+ \else\@tempswafalse\fi
+ \else\@tempswafalse\fi
+% \end{macrocode}
+% Das zeichenweise Scannen und Parsen kann natürlich nicht einfach
+% abgebrochen werden. Stattdessen ist der Parameterrest noch zu
+% entfernen.
+% \begin{macrocode}
+ \if@tempswa\else\let\scr@next\gobble@till@scr@next\fi
+ \fi
+ \scr@next
+}
+% \end{macrocode}
+% \begin{macro}{\gobble@tillscr@@next}
+% Das geschieht mit einem einzigen "`Leermacro"'.
+% \begin{macrocode}
+\newcommand*{\gobble@till@scr@next}{}
+\def\gobble@till@scr@next#1\scr@next{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifdimen}
+% Dieses Makro testet, ob ein übergebener Parameter eine Dimension
+% ist und führt in Abhängigkeit davon den zweiten oder dritten
+% Parameter aus.
+% \begin{macrocode}
+\newcommand{\ifdimen}[1]{%
+ \begingroup\@tempswatrue\let\scr@next\test@posdimen
+ \expandafter\test@dimen#1\scr@next
+ \if@tempswa
+ \endgroup\expandafter\@firstoftwo
+ \else
+ \endgroup\expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \begin{macro}{\test@dimen}
+% Als erste muss ein Vorzeichen entfernt werden.
+% \begin{macrocode}
+\newcommand*{\test@dimen}[1]{%
+ \ifx -#1\else\ifx +#1\else
+ \def\scr@next{\let\scr@next\test@posdimen\scr@next#1}\fi\fi
+ \scr@next
+}
+% \end{macrocode}
+% \begin{macro}{\test@posdimen}
+% Dann muss getestet werden, ob es sich beim Rest um eine Dimension
+% handelt. Dabei werden der Einfachheit halber mehrere Dezimalkomma
+% und -punkte erlaubt. Natürlich könnte man es auch wirklich richtig
+% machen, aber das wäre nochmal etwas aufwendiger. Ist das wirklich
+% notwendig?
+% \begin{macrocode}
+\newcommand*{\test@posdimen}[1]{%
+ \ifx \scr@next#1%
+ \@tempswafalse\let\scr@next\relax
+ \else
+ \if .#1\else\if ,#1\else
+ \@tempcnta=%
+ \expandafter\expandafter\expandafter\number\expandafter`#1\relax
+ \ifnum \@tempcnta>47
+ \ifnum \@tempcnta<58
+ \else\def\scr@next{\test@dimunt#1}\fi
+ \else\def\scr@next{\test@dimunt#1}\fi
+ \fi\fi
+ \fi
+ \scr@next
+}
+% \end{macrocode}
+% \begin{macro}{\testdimunt}
+% \begin{macro}{\test@trueunt}
+% Außer einer Gleitkomma- bzw. Gleitpunktzahl muss auch noch die Einheit
+% behandelt werden. Dabei sind sowohl die neun Standardeinheiten als auch
+% deren "`true"'-Variante zu berücksichtigen. Deshalb wird zuerst ein
+% eventuelles "`\texttt{true}"' weggeworfen.
+% \begin{macrocode}
+\newcommand*{\test@dimunt}{}
+\def\test@dimunt#1\scr@next{%
+ \expandafter\test@trueunt#1truetrue\test@trueunt
+}
+\newcommand*{\test@trueunt}{}
+\def\test@trueunt#1true#2true#3\test@trueunt{%
+ \edef\@tempa{#1}
+ \ifx\@tempa\@empty\test@@ifdimunt{#2}\else\test@@ifdimunt{#1}\fi
+}
+% \end{macrocode}
+% \begin{macro}{\test@@ifdimunt}
+% Anschließend wird dann getestet, ob es sich um eine der neun üblichen
+% Einheiten handelt.
+% \begin{macrocode}
+\newcommand*\test@@ifdimunt[1]{%
+ \@tempswafalse
+ \ifstr{#1}{pt}{\@tempswatrue}{%
+ \ifstr{#1}{pc}{\@tempswatrue}{%
+ \ifstr{#1}{in}{\@tempswatrue}{%
+ \ifstr{#1}{bp}{\@tempswatrue}{%
+ \ifstr{#1}{cm}{\@tempswatrue}{%
+ \ifstr{#1}{mm}{\@tempswatrue}{%
+ \ifstr{#1}{dd}{\@tempswatrue}{%
+ \ifstr{#1}{cc}{\@tempswatrue}{%
+ \ifstr{#1}{sp}{\@tempswatrue}{}%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\let@as@internal@defined}
+% \changes{v2.95}{2002/08/19}{neu (intern)}
+% Dieses Makro wird intern verwendet, um dokumentierte Makros mit der
+% Definition von internen Makros zu versehen, falls sie nicht bereits
+% definiert sind. Der Name des dokumentierten Makros wird als
+% Parameter übergeben. Dies wird gleich benötigt.
+% \begin{macrocode}
+\newcommand*{\let@as@internal@defined}[1]{
+ \@ifundefined{#1}{%
+ \begingroup
+ \expandafter\def\expandafter\@tempa
+ \expandafter{\csname scr@#1\endcsname}
+ \expandafter\def\expandafter\@tempb
+ \expandafter{\csname #1\endcsname}
+ \expandafter\expandafter\expandafter\endgroup
+ \expandafter\expandafter\expandafter\let\expandafter\@tempb\@tempa
+ }{%
+ \PackageInfo{%
+ scrkbase%
+ }{%
+ \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
+ package or class \expandafter\string\csname #1\endcsname\space
+ was defined before\@gobble
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifpdftex}
+% \changes{v2.95}{2002/08/19}{neu}
+% \begin{macro}{\scr@ifpdftex}
+% \changes{v2.95}{2002/08/19}{neu (intern)}
+% If-then-else-Konstrukt, um zu testen, ob pdf\TeX{} verwendet wird.
+% \begin{macrocode}
+\newcommand{\scr@ifpdftex}{\ifnotundefined{pdftexversion}}
+\let@as@internal@defined{ifpdftex}
+\BeforePackage{pdfcprot}{\let\ifpdftex\relax}
+\AfterPackage{pdfcprot}{\let@as@internal@defined{ifpdftex}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifvtex}
+% \changes{v2.95}{2002/08/19}{neu}
+% \begin{macro}{\scr@ifvtex}
+% \changes{v2.95}{2002/08/19}{neu}
+% If-then-else-Konstrukt, um zu testen, ob V\TeX{} verwendet wird.
+% \begin{macrocode}
+\newcommand{\scr@ifvtex}{\ifnotundefined{VTeXversion}}
+\let@as@internal@defined{ifvtex}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifpdfoutput}
+% \changes{v2.7g}{2001/04/17}{neu}
+% \changes{v2.8q}{2001/10/19}{\cs{pdfoutput} wird nicht mehr zu
+% \cs{relax}, wenn zuvor undefiniert}
+% \changes{v2.8q}{2001/10/19}{darf bereits definiert sein}
+% \changes{v2.8q}{2001/10/19}{Verwendung von \cs{scr@ifpdfoutput}}
+% \begin{macro}{\scr@ifpdfoutput}
+% \changes{v2.8q}{2001/10/19}{neu (intern)}
+% \changes{v2.8q}{2001/11/13}{funktioniert}
+% \changes{v2.95}{2002/08/21}{berücksichtigt V\TeX}
+% \changes{v2.95}{2004/07/20}{Expandierbarkeit verbessert}
+% If-then-else-Konstrukt, um abhängig davon, ob als \texttt{pdf}
+% ausgegeben wird oder nicht, Befehle auszuführen. Dieses Makro wird
+% für die Deklaration der Option \texttt{pagesize} benötigt.
+% \begin{macrocode}
+\newcommand{\scr@ifpdfoutput}{%
+ \ifundefined{pdfoutput}{%
+ \ifundefined{OpMode}{%
+ \expandafter\@secondoftwo%
+ }{%
+ \ifnum\OpMode=1
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }%
+ }{%
+ \ifnum\pdfoutput>0
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }%
+}%
+\let@as@internal@defined{ifpdfoutput}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifpsoutput}
+% \changes{v2.95}{2002/08/21}{neu}
+% \begin{macro}{\scr@ifpsoutput}
+% \changes{v2.95}{2002/08/21}{neu (intern)}
+% \changes{v2.95}{2004/07/20}{Expandierbarkeit verbessert}
+% 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}
+\newcommand*{\scr@ifpsoutput}{%
+ \ifnotundefined{if@dvips}{%
+ \if@dvips
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }{%
+ \ifnotundefined{OpMode}{%
+ \ifnum\OpMode=2
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }{%
+ \expandafter\@secondoftwo
+ }%
+ }%
+}
+\let@as@internal@defined{ifpsoutput}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ifdvioutput}
+% \changes{v2.95}{2002/08/21}{neu}
+% \begin{macro}{\scr@ifdvioutput}
+% \changes{v2.95}{2002/08/21}{neu (intern)}
+% \changes{v2.95}{2004/07/20}{Expandierbarkeit verbessert}
+% If-then-else-Konstrukt, um abhängig davon, ob \texttt{dvi}
+% ausgegeben wird oder nicht, Befehle auszuführen.
+% \begin{macrocode}
+\newcommand*{\scr@ifdvioutput}{%
+ \ifundefined{pdfoutput}{%
+ \ifundefined{OpMode}{%
+ \expandafter\@firstoftwo
+ }{%
+ \ifnum\OpMode=0
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }%
+ }{%
+ \ifnum\pdfoutput=0
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ }%
+}
+\let@as@internal@defined{ifdvioutput}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Abarbeitung von Optionen}
+%
+% \begin{macro}{\DeclareKeyValOption}
+% Dieses Makro deklariert alle bisher definierten Schlüssel eines
+% Bereichs (erste Argument) als Optionen. Das optionale Argument
+% erlaubt außerdem die Deklaration einer
+% \cs{DeclareOption*}-Auswertung. \cs{DeclareOption*} darf nicht
+% zusammen mit dieser Anweisung verwendet werden. Diese Anweisung darf
+% je Paket oder Klasse nur einmal verwendet werden.
+% \begin{macrocode}
+\newcommand*{\DeclareKeyValOption}[2][%
+ \ifx\@currext\@clsextension\OptionNotUsed\else\@unkownoptionerror\fi
+]{%
+ \DeclareOption*{
+ \expandafter\let\expandafter\@KV@saved@nokey
+ \csname KV@#2@nokey\endcsname
+ \@namedef{KV@#2@nokey}{#1\@gobble}%
+ \@expandtwoargs\setkeys{#2}\CurrentOption
+ \expandafter\let\csname KV@#2@nokey\endcsname\@KV@saved@nokey
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ProcessKeyValOptions}
+% Alternativ dazu, alle bisher definierten Schlüssel eines Bereichs
+% (1. Argument) als Option zu deklarieren, können auch die Schlüssel eines
+% Bereichs als Option interpretiert werden. Dies scheint nur oberflächlich
+% dieselbe Funktionalität zu sein. Es spielt jedoch bezüglich der
+% Verarbeitungsreihenfolge eine Rolle. Außerdem hat dieses alternative
+% Vorgehen keinen Einfluss auf \cs{DeclareOption*}.
+%
+% \begin{macro}{\Pr@cessL@calKeyValOptions}
+% Zunächst ein Hilfsmakro um alle lokalen Optionen abzuarbeiten.
+% \begin{macrocode}
+\newcommand*{\Pr@cessL@calKeyValOptions}[1]{%
+ \edef\@curroptions{\@ptionlist{\@currname.\@currext}}%
+ \ifx\@curroptions\@empty\else
+ \expandafter\let\expandafter\@KV@saved@nokey\csname KV@#1@nokey\endcsname
+ \@namedef{KV@#1@nokey}{\in@false\@gobble}%
+ \@for\CurrentOption:=\@curroptions\do{%
+ \ifx\CurrentOption\@empty\else
+ \in@true\@expandtwoargs\setkeys{#1}\CurrentOption
+ \ifin@
+% \end{macrocode}
+% Bei Aufruf aus einer Klasse, ist diese Option ggf. aus der Liste der
+% unbenutzten globalen Option zu löschen. Bei Paketen hingegen aus der Liste
+% der Paketoptionen
+% \begin{macrocode}
+ \ifx\@currext\@clsextension
+ \@expandtwoargs\@removeelement\CurrentOption
+ \@unusedoptionlist\@unusedoptionlist
+ \else
+ \@expandtwoargs\@removeelement\CurrentOption
+ \@curroptions\@curroptions
+ \fi
+ \fi
+ \fi
+ }%
+ \let\CurrentOption\@empty
+% \end{macrocode}
+% Bei Paketen muss die Liste der Paketoptionen noch neu gesetzt werden.
+% \begin{macrocode}
+ \ifx\@currext\@clsextension\else
+ \expandafter\let\csname opt@\@currname.\@currext\endcsname\@curroptions
+ \fi
+ \expandafter\let\csname KV@#1@nokey\endcsname\@KV@saved@nokey
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Pr@cessGl@balKeyValOptions}
+% Wenn diese Hilfsmakro von einem Paket aufgerufen wird, versucht es alle
+% Klassenoptionen als Schlüssel eines Bereichs (Argument 1)
+% auszuwerten. Diese Anweisung darf mehrfach verwendet werden.
+% \begin{macrocode}
+\newcommand*{\Pr@cessGl@balKeyValOptions}[1]{%
+ \ifx\@currext\@clsextension\else
+ \expandafter\let\expandafter\@KV@saved@nokey
+ \csname KV@#1@nokey\endcsname
+ \@namedef{KV@#1@nokey}{\in@false\@gobble}%
+ \@for\CurrentOption:=\@classoptionslist\do{%
+ \ifx\CurrentOption\@empty\else
+ \in@true\@expandtwoargs\setkeys{#1}\CurrentOption
+ \ifin@
+ \@expandtwoargs\@removeelement\CurrentOption
+ \@unusedoptionlist\@unusedoptionlist
+ \fi
+ \fi
+ }%
+ \let\CurrentOption\@empty
+ \expandafter\let\csname KV@#1@nokey\endcsname\@KV@saved@nokey
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Insgesamt werden zunächst die globalen und dann die lokalen Optionen
+% bearbeitet.
+% \begin{macrocode}
+\newcommand*{\ProcessKeyValOptions}[1]{%
+ \Pr@cessGl@balKeyValOptions{#1}%
+ \Pr@cessL@calKeyValOptions{#1}%
+}
+% \end{macrocode}
+% Es wird empfohlen \cs{ProcessKeyValOptions} \emph{vor}
+% \cs{ProcessOptions} oder \cs{ProcessOptions*} aufzurufen.
+% \end{macro}
+%
+% \begin{macro}{\ProcessAllOptions}
+% \begin{macro}{\@Pr@cessAll@pti@ns}
+% \begin{macro}{\Pr@cessAll@pti@ns}
+% Da der Anwender bekanntlich faul ist hier ein Makro, das sowohl für normale
+% Optionen als auch Schlüsseloptionen arbeitet. Dabei werden Schlüsseloptionen
+% zuerst abgearbeitet. Die Sternvariante verwendet die Sternvariante von
+% \cs{ProcessOptions}. Im Gegensatz zu \cs{ProcessOptions} wird hier kein
+% abschließendes \cs{relax} benötigt, weil ein zwingendes Argument vorhanden
+% ist (der Bereich).
+% \begin{macrocode}
+\newcommand*{\ProcessAllOptions}{%
+ \@ifstar\@Pr@cessAll@pti@ns\Pr@cessAll@pti@ns
+}
+\newcommand*{\@Pr@cessAll@pti@ns}[1]{%
+ \ProcessKeyValOptions{#1}\ProcessOptions*
+}
+\newcommand*{\Pr@cessAll@pti@ns}[1]{%
+ \ProcessKeyValOptions{#1}\ProcessOptions\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Definition von KOMA-\textsf{keyval}-Schlüsseln}
+%
+% Üblicherweise verwendet \KOMAScript{} für alle
+% \textsf{keyval}-Schlüssel die gleiche Bereichskennung
+% "`\texttt{KOMA}"'. Dadurch ist es möglich, dass Pakete die Schlüssel
+% der Klassen umdefinieren und dass jeder Teil von \KOMAScript{} die
+% Schlüssel jedes anderen Teils ausführen kann -- sobald sie definiert
+% sind.
+%
+% \begin{macro}{\KOMA@key}
+% Einzig, um etwas Tipparbeit zu sparen, wird ein abkürzendes Makro
+% definiert:
+% \begin{macrocode}
+\newcommand*{\KOMA@key}{\define@key{KOMA}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{KOMAoptions}
+% Es werden Schlüssel verwendet. Auch dies ist nur ein abkürzendes Makro:
+% \begin{macrocode}
+\newcommand*{\KOMAoptions}[1]{%
+ \setkeys{KOMA}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{option}{nokey}
+% Dies ist in Wirklichkeit kein Schlüssel, sondern eine Fehlermeldung
+% für nicht definierte Schlüssel. Er kann jedoch wie ein Schlüssel
+% definiert und auch so verwendet werden.
+% \begin{macrocode}
+\KOMA@key{nokey}{%
+ \PackageError{%
+ scrkeyval%
+ }{%
+ unknown KOMA option `#1'%
+ }{%
+ You've tried to use the KOMA option `#1'.\MessageBreak
+ But there is no KOMA option with that name.\MessageBreak
+ See the manual of KOMA-Script for information about known KOMA
+ options.%
+ }%
+}%
+% \end{macrocode}
+% \end{option}
+%
+% \begin{option}{noval}
+% Dies ist in Wirklichkeit kein Schlüssel, sondern eine Fehlermeldung
+% für das Fehlen eines Wertes bei der Verwendung eines Schlüssels ohne
+% Defaultwert. Er kann jedoch wie ein Schlüssel definiert und auch so
+% verwendet werden.
+% \begin{macrocode}
+\KOMA@key{noval}{%
+ \PackageError{%
+ scrkbase%
+ }{%
+ KOMA option `#1' needs a value%
+ }{%
+ You've tried to use the KOMA option `#1' without a
+ value.\MessageBreak
+ But this option has no default value, so you have to set a
+ value.\MessageBreak
+ See the manual of KOMA-Script for information about the option and
+ all known\MessageBreak
+ values.%
+ }%
+}%
+% \end{macrocode}
+% \end{option}
+%
+% \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}
+\newcommand*{\KOMA@unknown@keyval}[3]{%
+ \PackageError{%
+ scrkbase%
+ }{%
+ KOMA option `#1' has no value `#2'%
+ }{%
+ You've tried to set option `#1' to value `#2'.\MessageBreak
+ But allowed values are only:\MessageBreak
+ #3.\MessageBreak
+ See the KOMA-Script manual for more information.%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\KOMA@ifkey}
+% Dieses Makro definiert einen Schlüssel, der einen Schalter an Hand des
+% Wertes setzt. Als Werte sind "`\texttt{true}"', "`\texttt{false}"',
+% "`\texttt{on}"', "`\texttt{off}"', "`\texttt{yes}"' und
+% "`\texttt{no}"' erlaubt. Der Default-Wert für den Schalter ist
+% grundsätzlich "`false"', so dass der Default-Wert für die Verwendung
+% 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}}%
+}
+% \end{macrocode}
+% \begin{macro}{\KOMA@set@ifkey}
+% Die eigentliche Arbeit bei der ganzen Sache wird von diesem internen
+% Makro erledigt. Dabei wird der Name des Schlüssels zu Argument 1, der
+% 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'%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+ }%
+}
+% \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:
+% \{\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.
+% \begin{macrocode}
+\newcommand*{\KOMA@ncmdkey}[1]{%
+ \@ifnextchar [%]
+ {\KOMA@@ncmdkey{#1}}{\KOMA@@ncmdkey{#1}[]}%
+}
+\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}%
+ }%
+ \fi
+ \@ifundefined{#3}{\@namedef{#3}{0}}%
+ \KOMA@key{#1}{\KOMA@set@ncmdkey{#1}{#3}{#4}{##1}}%
+}
+% \end{macrocode}
+% \begin{macro}{\KOMA@set@ncmdkey}
+% 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.
+% \begin{macrocode}
+\newcommand*{\KOMA@set@ncmdkey}[4]{%
+ \begingroup
+ \edef\@searched{#4}%
+ \let\@tempa=\@empty
+ \let\@tempb=\@empty
+ \@tempswafalse
+ \@for\@valuelist:=#3\do{%
+ \if@tempswa\else
+ \edef\@tempc{\expandafter\@firstoftwo\@valuelist}%
+ \edef\@tempa{\@tempa\@tempb`\@tempc'}%
+ \edef\@tempb{, }%
+ \ifx\@tempc\@searched
+ \@tempswatrue
+ \edef\@tempa{\expandafter\@secondoftwo\@valuelist}%
+ \fi
+ \fi
+ }%
+ \if@tempswa
+ \edef\@tempa{\endgroup
+ \noexpand\@namedef{#2}{\@tempa}%
+ }%
+ \else
+ \KOMA@unknown@keyval{#1}{#4}{\@tempa}%
+ \let\@tempa=\endgroup
+ \fi
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KOMA@DeclareObsoleteOption}
+% 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.
+% \begin{macrocode}
+\newcommand*{\KOMA@DeclareObsoleteOption}[3][\@gobbletwo]{%
+ \DeclareOption{#2}{\KOMA@UseObsolete{option}{#1}{#2}{#3}}%
+}
+% \end{macrocode}
+% \begin{macro}{\KOMA@UseObsolete}
+% Die eigentliche Arbeit wird von diesem Makro erledigt. Ob es sich um
+% eine Option oder eine Anweisung handelt wird in Argument 1
+% übergeben. Alle anderen Argumente schließen sich daran an.
+% \begin{macrocode}
+\newcommand*{\KOMA@UseObsolete}[4]{%
+ #2{%
+ scrkbase%
+ }{%
+ You've used the obsolete #1 `#3'.\MessageBreak
+ \protect\KOMAoptions{#4} will be used instead.\MessageBreak
+ You should do this change too%
+ }%
+ \KOMAoptions{#4}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\KOMA@newobsoletecommand}
+% Mit Hilfe dieses Makros kann ein Makro definiert werden, das
+% eigentlich obsolete ist. Das Makro verwendet dann schlicht einen
+% Schlüssel. Das erste Argument ist optional und muss dann entweder
+% \cs{PackageInfo}, \cs{PackageInfoNoLine}, \cs{PackageWarning} oder
+% \cs{PackageWarningNoLine} sein. Das zweite Argument ist das Makro.
+% Das dritte Argument ist das Setzen des gewünschten Schlüssels. Das
+% definierte Makro selbst hat Schaltercharakter, ist also nicht
+% \cs{long} und versteht auch keine Argumente.
+% \begin{macrocode}
+\newcommand*{\KOMA@newobsoletecommand}[3][\@gobbletwo]{%
+ \newcommand*{#2}{\KOMA@UseObsolete{command}{#1}{\string#2}{#3}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \iffalse
+%</body>
+% \fi
+%
+% \Finale
+%
+\endinput
+%
+% end of file `scrkbase.dtx'
+%%% Local Variables:
+%%% mode: doctex
+%%% TeX-master: t
+%%% End: