summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-06-28 21:06:55 +0000
committerKarl Berry <karl@freefriends.org>2019-06-28 21:06:55 +0000
commit6677e7d16babf1c0596fd30f9aeb6b13433725cd (patch)
tree84163738e611a8ebcbbed7102f3efa9238211476 /Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
parent2a2ad17b85ef254d44022ec0fbcadb62cc90f431 (diff)
tudscr (28jun19)
git-svn-id: svn://tug.org/texlive/trunk@51500 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx')
-rw-r--r--Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx830
1 files changed, 436 insertions, 394 deletions
diff --git a/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx b/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
index ca16321084d..f932b224e2b 100644
--- a/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
+++ b/Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx
@@ -1,10 +1,10 @@
-% \CheckSum{752}
+% \CheckSum{790}
% \iffalse meta-comment
%
% TUD-Script -- Corporate Design of Technische Universität Dresden
% ----------------------------------------------------------------------------
%
-% Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2017
+% Copyright (C) Falk Hanisch <hanisch.latex@outlook.com>, 2012-2019
%
% ----------------------------------------------------------------------------
%
@@ -48,25 +48,35 @@
%
% \iffalse
%%% From File: tudscr-base.dtx
-%<*driver>
-\ifx\ProvidesFile\@undefined\def\ProvidesFile#1[#2]{}\fi
-\ProvidesFile{tudscr-base.dtx}[%
- 2017/05/30 v2.05m TUD-Script\space%
-%</driver>
+%<*dtx>
+% \fi
+%
+\ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi
+\ProvidesFile{tudscr-base.dtx}[2019/06/28 v2.06 TUD-Script\space%
+%
+% \iffalse
+%</dtx>
%<package&base>\ProvidesPackage{tudscrbase}[%
-%<*driver|package&base>
+%<*package&base>
%!TUD@Version
-%<package> package
+%</package&base>
+%<package&base> package
+%<*dtx|package&base>
+% \fi
(basics for the bundle)%
]
-%</driver|package&base>
-%<*driver>
-\RequirePackage[ngerman=ngerman-x-latest]{hyphsubst}
+% \iffalse
+%</dtx|package&base>
+%<*dtx>
\documentclass[english,ngerman,xindy]{tudscrdoc}
-\usepackage[T1]{fontenc}
-\usepackage{selinput}\SelectInputMappings{adieresis={ä},germandbls={ß}}
+\ifpdftex{
+ \usepackage[T1]{fontenc}
+ \usepackage[ngerman=ngerman-x-latest]{hyphsubst}
+}{
+ \usepackage{fontspec}
+}
\usepackage{babel}
-\usepackage{tudscrfonts} % only load this package, if the fonts are installed
+\usepackage{tudscrfonts}
\KOMAoptions{parskip=half-}
\usepackage{bookmark}
\usepackage[babel]{microtype}
@@ -83,7 +93,7 @@
\tableofcontents
\DocInput{\filename}
\end{document}
-%</driver>
+%</dtx>
% \fi
%
% \selectlanguage{ngerman}
@@ -97,11 +107,20 @@
% benötigen das Paket und laden dieses auch.
%
% \ToDo{%
-% Schnittstelle äquivalent zu \cs{KOMA@kav@\dots}? Falls ja, dann Löschen
-% von Elementen aus \pkg{etoolbox}-Listen mit \cs{list(cs)(g/e/x)}rem oder
-% ähnlich ermöglichen%
-% }[v2.07]
-% \ToDo{alle benötigten Pakete zur Not mit Unwind@Package abfangen}[v2.06]
+% Schnittstelle äquivalent zu \cs{KOMA@kav@\dots}? Dann hierfür
+% \pkg{etoolbox}-Listen und \cs{listadd} sowie \cs{listremove} nutzen
+% }[v2.??]
+% \ToDo{%
+% Teile im Quelltext suchen, die nur einmalig durchlaufen werden müssen
+% (bswp. notwendige Pakete und Schriften) und über aux-Eintrag abkürzen?!
+% }[v2.??]
+%^^A\BeforeClosingMainAux{%
+%^^A \if@tud@xxx\if@filesw%
+%^^A \immediate\write\@mainaux{%
+%^^A \string\global\string\let\string\tud@test@xxx\string\relax%
+%^^A }%
+%^^A \fi\fi%
+%^^A}
%
%
% \StopEventually{\PrintIndex\PrintChanges\PrintToDos}
@@ -115,86 +134,71 @@
% \subsection{Notwendige Pakete für \TUDScript}
%
% \iffalse
-%<*package|class&doc>
+%<*package&base>
% \fi
%
% Das Paket \pkg{scrbase} wird zur Optionsdefinition benötigt, \pkg{scrlfile}
% für verschiedene Hooks vor sowie nach Klassen und Paketen.
-% \ToDo{Patches für \pkg{scrbase} raus}[v3.21]
-% \begin{macrocode}
-%<*base>
-\RequirePackage{scrbase}[2013/12/19]
-\@ifpackagelater{scrbase}{2015/10/04}{}{%
- \providecommand*\kernel@ifstar[1]{\kernel@ifnextchar*{\@firstoftwo{#1}}}%
-}
-\@ifpackagelater{scrbase}{2016/05/11}{}{%
- \renewcommand*\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}{%
- \ifstr{#1}{ex}{\@tempswatrue}{%
- \ifstr{#1}{em}{\@tempswatrue}{%
- \scr@ifpdfoutput{%
- \ifstr{#1}{px}{\@tempswatrue}{}%
- }{}%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
- }%
-}
-%</base>
-% \end{macrocode}
-% Das Paket \pkg{fix-tudscrfonts} muss bereits vor der Dokumentklasse geladen
-% werden und führt anschließend spezifische Anpassungen an diese aus. Dafür
-% ist das Paket \pkg{scrlfile} notwendig.
% \begin{macrocode}
-%<fontsfix|doc>\RequirePackage{scrlfile}[2013/12/19]
+\RequirePackage{scrbase}[2018/03/30]
% \end{macrocode}
-% Das Paket \pkg{etoolbox} wird für die Manipulation bereits definierter
+% Die folgenden Pakete werden für die Manipulation bereits definierter
% Makros sowie zur erweiterten Auswertung boolescher Ausdrücke benötigt.
% \begin{macrocode}
-%<base|fontsfix|doc>\RequirePackage{etoolbox}[2011/01/03]
+\RequirePackage{etoolbox}[2011/01/03]
+\RequirePackage{xpatch}[2012/10/02]
+\RequirePackage{letltxmacro}[2016/05/16]
% \end{macrocode}
% Das Paket \pkg{kvsetkeys} erweitert \pkg{keyval} um die Möglichkeit, das
% Verhalten bei der Angabe eines nicht definierten Schlüssels festzulegen.
% \begin{macrocode}
-%<*base>
\RequirePackage{etexcmds}[2011/02/16]
\RequirePackage{kvsetkeys}[2012/04/25]
-%</base>
% \end{macrocode}
-%
-% \iffalse
-%</package|class&doc>
-%<*package&base|class&doc>
-% \fi
+% Mit dem Paket \pkg{trimspaces} können eventuell vorhandene Leerzeichen aus
+% einem Argument entfernt. Dies wird beispielsweise beim Einlesen von Feldern
+% oder bei der expliziten Auswahl einer Schrift des \CD sgenutzt.
+% \begin{macrocode}
+\RequirePackage{trimspaces}[2009/09/17]
+% \end{macrocode}
%
% \subsection{Grundlegende Befehle für \TUDScript}
% \subsubsection{Temporäre Makros zur internen Verwendung durch \TUDScript}
%
% Hier werden Makros definiert, die allein für die interne temporäre Nutzung
% gedacht sind.
+% \ToDo{Sämtliche \cs{@temp\dots}-Makros auf \cs{tud@res@\dots} ändern}[v2.??]
+% \ToDo{\cs{tud@reserved} in \cs{tud@res@?}, Achtung bei Dopplungen!}[v2.??]
% \begin{macro}{\tud@reserved}
% \changes{v2.05}{2015/10/27}{neu}^^A
-% Ein Makro zur temporären Verwendung.
+% \begin{macro}{\tud@res@a}
+% \changes{v2.06}{2018/07/12}{neu}^^A
+% \begin{macro}{\tud@res@b}
+% \changes{v2.06}{2018/07/12}{neu}^^A
+% \begin{macro}{\tud@res@c}
+% \changes{v2.06}{2018/07/12}{neu}^^A
+% \begin{macro}{\if@tud@res@swa}
+% \changes{v2.06}{2018/07/12}{neu}^^A
+% \begin{macro}{\tud@res@cnt}
+% \changes{v2.06}{2019/06/13}{neu}^^A
+% \begin{macro}{\tud@res@read}
+% \changes{v2.06}{2019/06/21}{neu}^^A
+% Makros zur temporären Verwendung.
% \begin{macrocode}
\newcommand*\tud@reserved{}
-% \end{macrocode}
+\newcommand*\tud@res@a{}
+\newcommand*\tud@res@b{}
+\newcommand*\tud@res@c{}
+\newif\if@tud@res@swa
+\newcount\tud@res@cnt
+\newread\tud@res@read
+% \end{macrocode}
+% \end{macro}^^A \tud@res@read
+% \end{macro}^^A \tud@res@cnt
+% \end{macro}^^A \if@tud@res@swa
+% \end{macro}^^A \tud@res@c
+% \end{macro}^^A \tud@res@b
+% \end{macro}^^A \tud@res@a
% \end{macro}^^A \tud@reserved
% \begin{macro}{\tud@toks@}
% \changes{v2.05}{2015/11/01}{neu}^^A
@@ -205,29 +209,13 @@
% zu \cs{addto@hook}~-- ein Makro zum Anfügen des expandierten Arguments an ein
% token-Register bereitgestellt.
% \begin{macrocode}
-%<package&base>\newtoks\tud@toks@
+\newtoks\tud@toks@
\newcommand*\eaddto@hook[2]{%
\expandafter\addto@hook\expandafter#1\expandafter{#2}%
}
% \end{macrocode}
% \end{macro}^^A \eaddto@hook
% \end{macro}^^A \tud@toks@
-% Die Befehle für die Klasse \cls{tudscrdoc} bereits definierten Befehle
-% werden vor dem Laden von \pkg{tudscrbase} undefiniert gesetzt.
-% \begin{macrocode}
-%<*doc>
-\BeforePackage{tudscrbase}{%
- \undef\tud@reserved%
- \undef\eaddto@hook%
-}
-%</doc>
-% \end{macrocode}
-%
-% \iffalse
-%</package&base|class&doc>
-%<*package&base>
-% \fi
-%
%
% \subsubsection{Robuster Test auf leeres Argument}
%
@@ -240,23 +228,6 @@
% \end{macrocode}
% \end{macro}^^A \ifxblank
%
-% \subsubsection{Robuster Test auf numerischen Ausdruck}
-%
-% \begin{macro}{\ifxnumber}
-% Dieser Befehl dient zum Testen, ob ein gegebenes Argument eine Zahl ist.
-% Die Syntax lautet: \cs{ifxnumber}\marg{Argument}\marg{Wahr}\marg{Falsch}
-% \ToDo{kann eigentlich raus, geht auch mit \cs{expandafter}}[v2.06]
-% \begin{macrocode}
-\newcommand*\ifxnumber[1]{%
- \if\relax\detokenize\expandafter{\romannumeral-0#1}\relax%
- \expandafter\@firstoftwo%
- \else%
- \expandafter\@secondoftwo%
- \fi%
-}
-% \end{macrocode}
-% \end{macro}^^A \ifxnumber
-%
% \subsubsection{Test auf booleschen Ausdruck in Form eines Strings}
%
% \begin{macro}{\ifstrbool}
@@ -265,7 +236,8 @@
% Ausdruck interpretiert werden kann. Ist der String als \enquote{wahr}
% interpretierbar, wird das zweite Argument ausgeführt. Kann der String als
% \enquote{falsch} angesehen werden, dementsprechen das dritte. Ist der String
-% kein logischer Wert, kommt das letzte Argument zum Tragen. Die Syntax lautet:
+% kein logischer Wert, kommt das letzte Argument zum Tragen. Die Syntax lautet:
+%
% \cs{ifstrbool}\marg{Argument}\marg{Wahr}\marg{Falsch}\marg{Andernfalls}
% \begin{macrocode}
\newcommand*\ifstrbool[4]{%
@@ -286,30 +258,6 @@
% \end{macrocode}
% \end{macro}^^A \ifstrbool
%
-% \subsubsection{Test auf Angabe einer Länge}
-%
-% \begin{macro}{\ifxlen}
-% \changes{v2.05}{2016/06/16}{neu}^^A
-% Hiermit kann getestet werden, ob das gegebene Argument einer Länge entspricht.
-% \begin{macrocode}
-\newcommand*\ifxlen[1]{%
- \begingroup%
- \protected@edef\@tempa{#1}%
- \@tempswafalse%
- \expandafter\ifisdimen\expandafter{\@tempa}{\@tempswatrue}{}%
- \expandafter\ifisskip\expandafter{\@tempa}{\@tempswatrue}{}%
- \expandafter\ifisdimexpr\expandafter{\@tempa}{\@tempswatrue}{}%
- \if@tempswa\edef\@tempa{\the\@tempa}\fi%
- \expandafter\ifdimen\expandafter{\@tempa}{%
- \aftergroup\@firstoftwo%
- }{%
- \aftergroup\@secondoftwo%
- }%
- \endgroup
-}
-% \end{macrocode}
-% \end{macro}^^A \iflanguageloaded
-%
% \subsubsection{Test auf eine verwendbare Sprache}
%
% \begin{macro}{\iflanguageloaded}
@@ -357,7 +305,7 @@
%
% \subsubsection{Division für rationale Zahlen}
%
-% Mit \LaTeXe kann~-- ohne die Verwendung zusätzlicher Pakete~-- nicht ohne
+% Mit \LaTeXe{} kann~-- ohne die Verwendung zusätzlicher Pakete~-- nicht ohne
% Weiteres eine Division durchgeführt werden, die als Ergenis eine rationale
% Zahl liefert. Dem wird hier Abhilfe geleistet.
% \begin{macro}{\tud@divide}
@@ -401,10 +349,10 @@
% Mit dem im temporären Zählerregister \cs{@tempcnta} gespeicherten Faktor
% wird der Dividend erweitert und der berechnete Quotient wieder gekürzt.
% \begin{macrocode}
- \setlength{\@tempdimc}{%
+ \setlength\@tempdimc{%
\dimexpr(\@tempcnta\@tempdima / \@tempdimb * \p@)\relax%
}%
- \setlength{\@tempdimc}{\dimexpr \@tempdimc/\@tempcnta\relax}%
+ \setlength\@tempdimc{\dimexpr \@tempdimc/\@tempcnta\relax}%
% \end{macrocode}
% Das Ergebnis wird in das angegebene Makro expandiert.
% \begin{macrocode}
@@ -433,41 +381,41 @@
%
% \subsubsection{Erweiterung von \KOMAScript-Schriftelementen}
%
-% \begin{macro}{\tud@font@koma@set}
-% \begin{macro}{\tud@font@koma@unset}
-% \begin{macro}{\tud@font@koma@reset}
+% \begin{macro}{\tud@komafont@set}
+% \begin{macro}{\tud@komafont@unset}
+% \begin{macro}{\tud@komafont@reset}
% \changes{v2.02}{2014/08/24}{neu}^^A
% Es wird die Möglichkeit geschaffen, bestimmten Schriftelementen weitere
% Eigenschaften mitzugeben. Damit dies optionsabhängig geschehen kann und
% \cs{addtokomafont} nur einmalig verwendete werden muss, wird im Zweifelsfall
-% einem Schriftelement ein Hilfsmakro \cs{tud@font@koma@\meta{Element}}
-% zugewiesen, welches intern angepasst werden kann. Mit \cs{tud@font@koma@set}
+% einem Schriftelement ein Hilfsmakro \cs{tud@komafont@\meta{Element}}
+% zugewiesen, welches intern angepasst werden kann. Mit \cs{tud@komafont@set}
% werden dem angegebenen Element die gewünschten Schriftattribute zugeteilt.
% \begin{macrocode}
-\newcommand*\tud@font@koma@set[2]{%
- \ifcsdef{tud@font@koma@#1}{}{\addtokomafont{#1}{\csuse{tud@font@koma@#1}}}%
- \csdef{tud@font@koma@#1}{#2\nobreak}%
+\newcommand*\tud@komafont@set[2]{%
+ \ifcsdef{tud@komafont@#1}{}{\addtokomafont{#1}{\csuse{tud@komafont@#1}}}%
+ \csdef{tud@komafont@#1}{#2\nobreak}%
}
% \end{macrocode}
-% Mit \cs{tud@font@koma@unset} kann das angegebene Element wieder zurückgesetzt
+% Mit \cs{tud@komafont@unset} kann das angegebene Element wieder zurückgesetzt
% werden. Dabei wird das hinzugefügte Makro auf \cs{relax} gesetzt.
% \begin{macrocode}
-\newcommand*\tud@font@koma@unset[1]{%
- \ifcsdef{tud@font@koma@#1}{}{\addtokomafont{#1}{\csuse{tud@font@koma@#1}}}%
- \csdef{tud@font@koma@#1}{\relax}%
+\newcommand*\tud@komafont@unset[1]{%
+ \ifcsdef{tud@komafont@#1}{}{\addtokomafont{#1}{\csuse{tud@komafont@#1}}}%
+ \csdef{tud@komafont@#1}{\relax}%
}
% \end{macrocode}
% Werden \KOMAScript-Schriftelemente auf ihre Ausgangsdefinition zurückgesetzt,
-% so kann diesen mit \cs{tud@font@koma@reset} kann das passende Hilfsmakro
+% so kann diesen mit \cs{tud@komafont@reset} kann das passende Hilfsmakro
% abermals zugewiesen werden.
% \begin{macrocode}
-\newcommand*\tud@font@koma@reset[1]{%
- \ifcsdef{tud@font@koma@#1}{\addtokomafont{#1}{\csuse{tud@font@koma@#1}}}{}%
+\newcommand*\tud@komafont@reset[1]{%
+ \ifcsdef{tud@komafont@#1}{\addtokomafont{#1}{\csuse{tud@komafont@#1}}}{}%
}
% \end{macrocode}
-% \end{macro}^^A \tud@font@koma@unset
-% \end{macro}^^A \tud@font@koma@reset
-% \end{macro}^^A \tud@font@koma@set
+% \end{macro}^^A \tud@komafont@unset
+% \end{macro}^^A \tud@komafont@reset
+% \end{macro}^^A \tud@komafont@set
%
% \subsubsection{Optionsdefinition für \TUDScript}
%
@@ -492,43 +440,100 @@
% \end{macro}^^A \TUDExecuteOptions
% \end{macro}^^A \TUDProcessOptions
% \begin{macro}{\TUD@key}
-% \begin{macro}{\TUD@ifkey}
+% \begin{macro}{\TUD@key@define}
+% \changes{v2.06}{2018/07/19}{neu}^^A
+% \begin{macro}{\TUD@key@@define}
+% \changes{v2.06}{2018/07/19}{neu}^^A
+% \begin{macro}{\TUD@key@preset}
+% \changes{v2.06}{2018/07/19}{neu}^^A
+% Dies ist der zentrale Befehl zur Definition von Optionen, welcher die von
+% \KOMAScript{} Schnittstelle \cs{DefineFamilyKey} nutzt.
+%
+% Da sich die Klassenoptionen teilweise selbst gegenseitig beeinflussen oder
+% aber in bestimmten Fällen eine Option in Abhängigkeit von einer anderen
+% unterschiedliche Standardwerte annehmen soll, wird dafür eine Möglichkeit
+% geschaffen. Hierfür wird für jede Option ein korrelierende Schalter
+% \cs{if@tud@key@\meta{Schlüssel}@set} definiert. Dieser wird auf \val{true}
+% gesetzt, sobald der Schlüssel explizit gesetzt wurde, womit ein Standardwert
+% einer Klassenoption überschrieben werden kann. Das Setzen der Standardwerte
+% erfolgt intern mit dem Befehl \cs{TUD@key@preset}.
+% \begin{macrocode}
+\newcommand*\TUD@key[2][.\@currname.\@currext]{%
+% \end{macrocode}
+% Basierend auf dem Namen des Schalters wird die notwendige, boolesche Variable
+% erzeugt (\cs{if@tud@key@\meta{Schlüssel}@set}), welche im Falle des direkten
+% Aufrufs des Schlüssels, ein Überschreiben mit einem Standardwert verhindert.
+% \begin{macrocode}
+ \providebool{@tud@key@#2@set}%
+ \DefineFamilyMember[{#1}]{TUD}%
+ \kernel@ifnextchar[%]
+ {\TUD@key@define{#1}{#2}}%
+ {\TUD@key@@define{#1}{#2}}%
+}
+\newcommand*\TUD@key@define{}
+\def\TUD@key@define#1#2[#3]#4{%
+ \DefineFamilyKey[{#1}]{TUD}{#2}[{#3}]{%
+ #4%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed%
+ \booltrue{@tud@key@#2@set}%
+ \fi%
+ }%
+}
+\newcommand*\TUD@key@@define{}
+\def\TUD@key@@define#1#2#3{%
+ \DefineFamilyKey[{#1}]{TUD}{#2}{%
+ #3%
+ \ifx\FamilyKeyState\FamilyKeyStateProcessed%
+ \booltrue{@tud@key@#2@set}%
+ \fi%
+ }%
+}
+% \end{macrocode}
+% Es kann intern über \cs{if@tud@key@\meta{Schlüssel}@set} geprüft werden, ob
+% einem Schlüssel ein explizites Wert zugewiesen wurde. Sollte dies nicht der
+% Fall sein, kann dieser hiermit intern beliebig angepasst werden. Da es durch
+% das Setzen der Option mit \cs{TUDoption} zu einer Sperrung kommt, muss diese
+% folgend wieder rückgängig gemacht werden.
+% \begin{macrocode}
+\newcommand*\TUD@key@preset[2]{%
+ \ifbool{@tud@key@#1@set}{}{%
+ \TUDoption{#1}{#2}%
+ \boolfalse{@tud@key@#1@set}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}^^A \TUD@key@preset
+% \end{macro}^^A \TUD@key@@define
+% \end{macro}^^A \TUD@key@define
+% \end{macro}^^A \TUD@key
% \begin{macro}{\TUD@set@ifkey}
-% \begin{macro}{\TUD@numkey}
-% \begin{macro}{\TUD@bool@numkey}
-% \changes{v2.03}{2015/01/09}{neu}^^A
+% \changes{v2.06}{2018/08/01}{forcierte Kleinschreibung Schlüsselwerte}^^A
% \begin{macro}{\TUD@set@numkey}
% \changes{v2.02}{2014/11/05}{neu}^^A
-% \begin{macro}{\TUD@lengthkey}
+% \changes{v2.06}{2018/08/01}{forcierte Kleinschreibung Schlüsselwerte}^^A
+% \begin{macro}{\TUD@bool@numkey}
% \changes{v2.03}{2015/01/09}{neu}^^A
-% \begin{macro}{\TUD@set@lengthkey}
% \begin{macro}{\TUD@set@dimenkey}
% \changes{v2.05}{2016/06/15}{neu}^^A
+% \changes{v2.06}{2018/08/01}{forcierte Kleinschreibung Schlüsselwerte}^^A
% \begin{macro}{\TUD@unknown@keyval}
-% Dies sind die Befehle zur Definition der Optionen. Klassenoptionen können
-% entweder als Schalter (\cs{TUD@ifkey}) oder aber mit mehreren möglichen
-% Werten (\cs{TUD@numkey}) definiert werden. Prinzipiell ist auch eine freie
+% Dies sind die Befehle zum Setzen der Optionen. Diese können entweder als
+% Schalter (\cs{TUD@set@ifkey}) oder aber mit mehreren möglichen Werten
+% (\cs{TUD@set@numkey}) definiert werden. Prinzipiell ist auch eine freie
% Definition mit anschließender Abarbeitung ohne die zuvor genannten Befehle
% möglich.
% \begin{macrocode}
-\newcommand*\TUD@key[1][.\@currname.\@currext]{%
- \DefineFamilyMember[{#1}]{TUD}%
- \DefineFamilyKey[{#1}]{TUD}%
-}
-% \end{macrocode}
-% Dies sind die Befehle zur Definition einer booleschen Option.
-% \begin{macrocode}
-\newcommand*\TUD@ifkey[1][.\@currname.\@currext]{%
- \DefineFamilyMember{TUD}%
- \FamilyBoolKey[#1]{TUD}%
+\newcommand*\TUD@set@ifkey[3]{%
+ \tud@lowerstring\tud@res@a{#3}%
+ \edef\tud@res@b{%
+ \etex@unexpanded{\FamilySetBool{TUD}{#1}{#2}}{\tud@res@a}%
+ }\tud@res@b%
}
-\newcommand*\TUD@set@ifkey{\FamilySetBool{TUD}}
-% \end{macrocode}
-% Dies sind die Befehle zur Definition einer Option mit definierten Werten.
-% \begin{macrocode}
-\newcommand*\TUD@numkey[1][.\@currname.\@currext]{%
- \DefineFamilyMember{TUD}%
- \FamilyNumericalKey[#1]{TUD}%
+\newcommand*\TUD@set@numkey[4]{%
+ \tud@lowerstring\tud@res@a{#4}%
+ \edef\tud@res@b{%
+ \etex@unexpanded{\FamilySetNumerical{TUD}{#1}{#2}{#3}}{\tud@res@a}%
+ }\tud@res@b%
}
% \end{macrocode}
% Um Dopplungen im Code zu vermeiden, werden für die numerische Schlüssel die
@@ -537,140 +542,104 @@
\newcommand*\TUD@bool@numkey{%
{false}{0},{off}{0},{no}{0},{true}{1},{on}{1},{yes}{1}%
}
-\newcommand*\TUD@set@numkey{\FamilySetNumerical{TUD}}
-% \end{macrocode}
-% Dies sind die Befehle zur Definition einer Option zur Festlegung einer Länge.
-% \begin{macrocode}
-\newcommand*\TUD@lengthkey[1][.\@currname.\@currext]{%
- \DefineFamilyMember{TUD}%
- \FamilyLengthKey[#1]{TUD}%
-}
-\newcommand*\TUD@set@lengthkey{\FamilySetLength{TUD}}
% \end{macrocode}
% Mit \cs{TUD@set@dimenkey} wird der übergebene Längenwert im spezifiezierten
% Makro gespeichert.
% \begin{macrocode}
\newcommand*\TUD@set@dimenkey[3]{%
- \ifxlen{#3}{%
- \def#2{#3}%
- \FamilyKeyStateProcessed%
- }{%
- \TUD@unknown@keyval{#1}{#3}{dimens}%
- }%
+ \tud@lowerstring\tud@res@a{#3}%
+ \edef\tud@res@b{%
+ \etex@unexpanded{\FamilySetUseLengthMacro{TUD}{#1}{#2}}{\tud@res@a}%
+ }\tud@res@b%
}
% \end{macrocode}
% Dieser Befehl wird lediglich pro forma definiert. An diesen kann eine Liste
-% möglicher Wertzuweisungen übergeben werden, welche durch \KOMAScript derzeit
-% jedoch nicht abgearbeitet und ausgegeben wird.
+% möglicher Wertzuweisungen übergeben werden, welche durch \KOMAScript{}
+% derzeit jedoch nicht abgearbeitet und ausgegeben wird.
% \begin{macrocode}
\newcommand*\TUD@unknown@keyval{\FamilyUnknownKeyValue{TUD}}
% \end{macrocode}
% \end{macro}^^A \TUD@unknown@keyval
% \end{macro}^^A \TUD@set@dimenkey
-% \end{macro}^^A \TUD@set@lengthkey
-% \end{macro}^^A \TUD@lengthkey
% \end{macro}^^A \TUD@set@numkey
% \end{macro}^^A \TUD@bool@numkey
-% \end{macro}^^A \TUD@numkey
% \end{macro}^^A \TUD@set@ifkey
-% \end{macro}^^A \TUD@ifkey
-% \end{macro}^^A \TUD@key
-% \begin{macro}{\TUD@key@lock}
-% \begin{macro}{\TUD@std@ifkey@lock}
-% \begin{macro}{\TUD@std@numkey@lock}
-% \begin{macro}{\TUD@set@ifkey@lock}
-% \begin{macro}{\TUD@set@numkey@lock}
-% Da sich die Klassenoptionen teilweise selbst gegenseitig beeinflussen oder
-% aber in bestimmten Fällen eine Option in Abhängigkeit von einer anderen
-% unterschiedliche Standardwerte annehmen soll, wird dafür eine Möglichkeit
-% geschaffen. Dabei kann der Nutzer jederzeit einen von einer Option abhängigen
-% Standardwert einer Klassenoption überschreiben. Die Klassenoptionen selber
-% werden intern mit dem Befehl \cs{TUD@key@lock} definiert und die Standardwerte
-% sowie deren Manipulation innerhalb der Optionen mit \cs{TUD@std@ifkey@lock}
-% bzw. \cs{TUD@std@numkey@lock} gesetzt. Mit \cs{TUD@set@ifkey@lock} und
-% \cs{TUD@set@numkey@lock} werden bei der expliziten Anwendung einer Option
-% durch den Nutzer die entsprechenden Werte geändert und gegen ein internes
-% Überschreiben gesperrt.
-% \begin{macrocode}
-\newcommand*\TUD@key@lock[2][.\@currname.\@currext]{%
-% \end{macrocode}
-% Basierend auf dem Namen des Schalters wird die notwendige, boolesche Variable
-% erzeugt (\cs{if@tud@\meta{Schaltername}@lock}), welche im Falle des direkten
-% Aufrufs des Schlüssels durch den Anwender, ein internes Überschreiben
-% verhindert.
-% \begin{macrocode}
- \newbool{@tud@#2@locked}%
- \TUD@key[{#1}]{#2}%
-}
-% \end{macrocode}
-% Es kann intern über \cs{if\meta{Schaltername}@lock} geprüft werden, ob einem
-% mit Schlüssel, der mit \cs{TUD@key@lock} definiert wurde, durch den Anwender
-% ein explizites Verhalten zugewiesen wurde. Sollte dies nicht der Fall sein,
-% kann dieser hiermit intern beliebig angepasst werden. Da es durch das Setzen
-% der Option mit \cs{TUDoption} zu einer Sperrung kommt, muss diese folgend
-% wieder rückgängig gemacht werden.
-% \begin{macrocode}
-\newcommand*\TUD@std@ifkey@lock[3]{%
- \ifbool{@tud@#1@locked}{}{%
- \TUD@set@ifkey{#1}{#2}{#3}%
- \boolfalse{@tud@#1@locked}%
- }%
-}
-\newcommand*\TUD@set@ifkey@lock[1]{%
- \booltrue{@tud@#1@locked}%
- \TUD@set@ifkey{#1}%
-}
-\let\TUD@std@numkey@lock\TUD@std@ifkey@lock
-\newcommand*\TUD@set@numkey@lock[1]{%
- \booltrue{@tud@#1@locked}%
- \TUD@set@numkey{#1}%
-}
-% \end{macrocode}
-% \end{macro}^^A \TUD@set@numkey@lock
-% \end{macro}^^A \TUD@set@ifkey@lock
-% \end{macro}^^A \TUD@std@numkey@lock
-% \end{macro}^^A \TUD@std@ifkey@lock
-% \end{macro}^^A \TUD@key@lock
-% \begin{macro}{\cs@lock}
-% \begin{macro}{\cs@std@lock}
-% \begin{macro}{\cs@set@lock}
-% Mit \cs{cs@lock}\marg{Name}\marg{Definition} kann ein Befehl definiert
-% werden, welcher intern nur mit \cs{cs@std@lock}\marg{Name}\marg{Definition}
-% geschrieben wird, wenn nicht über eine entsprechende Option ein explizites
-% Verhalten mit \cs{cs@set@lock}\marg{Name}\marg{Definition} zugewiesen wurde.
-% Dies ist äquivalent zu \cs{TUD@std@ifkey@lock} und \cs{TUD@set@ifkey@lock}
-% bzw. \cs{TUD@std@numkey@lock} und \cs{TUD@set@numkey@lock}
-% \begin{macrocode}
-\newcommand*\cs@lock[2]{%
+% \begin{macro}{\tud@locked@newnum}
+% \begin{macro}{\tud@locked@num@preset}
+% \begin{macro}{\tud@locked@num@set}
+% Mit \cs{tud@locked@newnum}\marg{Name}\marg{Definition} lässt sich ein Makro
+% definieren, für das mit \cs{tud@locked@num@preset}\marg{Name}\marg{Definition}
+% eine Voreinstellung definiert werden kann, solange der Wert nicht mit
+% \cs{tud@locked@num@set}\marg{Name}\marg{Definition} explizit überschrieben
+% wurde.
+% \begin{macrocode}
+\newcommand*\tud@locked@newnum[2]{%
\expandafter\newcommand\expandafter*\csname#1\endcsname{#2}%
\newbool{#1@locked}%
+ \tud@num@set{#1}{#2}%
}
-\newcommand*\cs@std@lock[2]{%
+\newcommand*\tud@locked@num@preset[2]{%
\ifbool{#1@locked}{}{%
- \csdef{#1}{#2}%
+ \tud@num@set{#1}{#2}%
\boolfalse{#1@locked}%
}%
}
-\newcommand*\cs@set@lock[2]{%
- \csdef{#1}{#2}%
+\newcommand*\tud@locked@num@set[2]{%
+ \tud@num@set{#1}{#2}%
\booltrue{#1@locked}%
}
+\newcommand*\tud@num@set[2]{%
+ \ifcsdef{#1}{%
+ \ifnumber{#2}{%
+ \csdef{#1}{#2}%
+ }{%
+ \PackageError{tudscrbase}{%
+ `#2' is not a valid numerical expression%
+ }{%
+ You set the numerical expression `\@backslashchar#1'\MessageBreak%
+ to value `#2', which isn't numerical.%
+ }%
+ }%
+ }{%
+ \PackageError{tudscrbase}{%
+ `\@backslashchar#1' was never defined%
+ }{%
+ You tried using the numerical expression `\@backslashchar#1'\MessageBreak%
+ but you didn't define it with `\string\tud@locked@newnum'.%
+ }%
+ }%
+}
% \end{macrocode}
-% \end{macro}^^A \cs@set@lock
-% \end{macro}^^A \cs@std@lock
-% \end{macro}^^A \cs@lock
-% \begin{macro}{\tud@setbool}
+% \end{macro}^^A \tud@locked@num@set
+% \end{macro}^^A \tud@locked@num@preset
+% \end{macro}^^A \tud@locked@newnum
+% \begin{macro}{\tud@locked@newbool}
+% \begin{macro}{\tud@locked@bool@preset}
+% \begin{macro}{\tud@locked@bool@set}
+% \begin{macro}{\tud@bool@set}
% \changes{v2.05}{2015/07/03}{neu}^^A
-% \begin{macro}{\bool@lock}
-% \begin{macro}{\bool@std@lock}
-% \begin{macro}{\bool@set@lock}
% Diese Makros dienen in Anlehnung an die vorherigen zum Definieren und Setzen
-% von sperrbaren booleschen Schaltern. Dabei wird \cs{tud@setbool} definiert,
+% von sperrbaren booleschen Schaltern. Dabei wird \cs{tud@bool@set} definiert,
% um nicht nur \val{true} und \val{false} sondern auch alle anderen bekannten
% booleschen Zuweisungen (\val{yes} und \val{on} sowie \val{no} und \val{off})
% mit diesen Befehlen verwenden zu können.
% \begin{macrocode}
-\newcommand*\tud@setbool[2]{%
+\newcommand*\tud@locked@newbool[2][false]{%
+ \newbool{#2}%
+ \newbool{#2@locked}%
+ \tud@bool@set{#2}{#1}%
+}
+\newcommand*\tud@locked@bool@preset[2]{%
+ \ifbool{#1@locked}{}{%
+ \tud@bool@set{#1}{#2}%
+ \boolfalse{#1@locked}%
+ }%
+}
+\newcommand*\tud@locked@bool@set[2]{%
+ \tud@bool@set{#1}{#2}%
+ \booltrue{#1@locked}%
+}
+\newcommand*\tud@bool@set[2]{%
\ifstrbool{#2}{\booltrue{#1}}{\boolfalse{#1}}{%
\PackageError{tudscrbase}{%
`#2' is not a valid boolean expression%
@@ -681,128 +650,123 @@
}%
}%
}
-\newcommand*\bool@lock[2][false]{%
- \newbool{#2}%
- \newbool{#2@locked}%
- \tud@setbool{#2}{#1}%
-}
-\newcommand*\bool@std@lock[2]{%
- \ifbool{#1@locked}{}{%
- \tud@setbool{#1}{#2}%
- \boolfalse{#1@locked}%
- }%
-}
-\newcommand*\bool@set@lock[2]{%
- \tud@setbool{#1}{#2}%
- \booltrue{#1@locked}%
-}
% \end{macrocode}
-% \end{macro}^^A \bool@set@lock
-% \end{macro}^^A \bool@std@lock
-% \end{macro}^^A \bool@lock
-% \end{macro}^^A \tud@setbool
-%
-% \iffalse
-%</package&base>
-%<*package&(base|fontsfix)>
-% \fi
-%
-% \begin{macro}{\tud@cmd@store}
-% \begin{macro}{\tud@cmd@restore}
-% \begin{macro}{\tud@cmd@reset}
-% \begin{macro}{\tud@cmd@update}
+% \end{macro}^^A \tud@bool@set
+% \end{macro}^^A \tud@locked@bool@set
+% \end{macro}^^A \tud@locked@bool@preset
+% \end{macro}^^A \tud@locked@newbool
+% \begin{macro}{\tud@cs@letltx}
+% \changes{v2.06}{2019/06/13}{\cs{LetLtxMacro} zum Sichern originärer Makros}^^A
+% \begin{macro}{\tud@cs@store}
+% \changes{v2.06}{2018/07/15}{%
+% mit \cs{DeclareRobustCommand} definierte Befehle unterstüzt%
+% }^^A
+% \begin{macro}{\tud@cs@restore}
+% \changes{v2.06}{2018/07/15}{%
+% stellt originäre Makros auch wieder her, wenn diese mit \cs{undef}
+% zwischendurch \emph{undefiniert} gesetzt wurden%
+% }^^A
+% \begin{macro}{\tud@cs@reset}
+% \begin{macro}{\tud@cs@update}
% \changes{v2.04}{2015/03/03}{neu}^^A
-% \begin{macro}{\tud@cmd@use}
-% \begin{macro}{\tud@cmd@check}
+% \begin{macro}{\tud@cs@use}
+% \begin{macro}{\tud@cs@check}
% \changes{v2.03}{2015/01/09}{neu}^^A
% Mit diesen Befehlen wird es möglich, Originalbefehle sichern, nutzen und
% wiederherstellen zu können. Dies wird benötigt, um zwischen den einzelnen
% Layouts über Optionseinstellungen zu wechseln und dabei von einem definierten
% Anfangszustand auszugehen.
%
-% Mit dem Aufruf \cs{tud@cmd@store}\marg{Befehlsname} wird der im Argument
+% Der Befehl \cs{tud@cs@letltx} nutzt intern \cs{LetLtxMacro} aus dem Paket
+% \pkg{letltxmacro}, um auch robust definierte Befehle korrekt zu sichern.
+% \begin{macrocode}
+\newcommand*\tud@cs@letltx[2]{%
+ \expandafter\expandafter\expandafter\LetLtxMacro%
+ \expandafter\csname #1\expandafter\endcsname\csname #2\endcsname%
+}
+% \end{macrocode}
+% Mit dem Aufruf \cs{tud@cs@store}\marg{Befehlsname} wird der im Argument
% angegebene Befehl in einem neuem Makro \cs{@@tud@\meta{Befehlsname}}
% gespeichert. Dieser kann danach beliebig angepasst werden. Soll der Befehl zu
% einem späteren Zeitpunkt auf den Orginalzustand zurücksetzen, kann hierfür
-% jederzeit der Befehl \cs{tud@cmd@reset}\marg{Befehlsname} verwendet werden.
-% Durch das Makro \cs{tud@cmd@restore}\marg{Befehlsname} wird das mit
-% \cs{tud@cmd@store} erstellte Hilfsmakro zusätzlich noch gelöscht. Der
-% ursprüngliche Befehl kann als solcher mit \cs{tud@cmd@use}\marg{Befehlsname}
-% weiterhin genutzt werden. Ein zuvor bereits gesicherter Befehl kann mit dem
-% Makro \cs{tud@cmd@update}\marg{Befehlsname} auf die momentane Definition
+% jederzeit der Befehl \cs{tud@cs@reset}\marg{Befehlsname} verwendet werden.
+% Durch das Makro \cs{tud@cs@restore}\marg{Befehlsname} wird das mit
+% \cs{tud@cs@store} erstellte Hilfsmakro zusätzlich noch gelöscht. Der
+% ursprüngliche Befehl kann als solcher mit \cs{tud@cs@use}\marg{Befehlsname}
+% weiterhin genutzt werden. Ein zuvor bereits gesicherter Befehl kann mit
+% \cs{tud@cs@update}\marg{Befehlsname} auf die momentane Definition
% aktualisiert werden.
% \begin{macrocode}
-\newcommand*\tud@cmd@store[1]{%
- \tud@cmd@check{#1}%
- \ifcsdef{@@tud@#1}{}{\csletcs{@@tud@#1}{#1}}%
+\newrobustcmd*\tud@cs@store[1]{%
+ \tud@cs@check{#1}%
+ \ifcsdef{@@tud@#1}{}{%
+ \tud@cs@letltx{@@tud@#1}{#1}%
+ }%
}
-%<*base>
-\newcommand*\tud@cmd@restore[1]{%
- \tud@cmd@check{#1}%
+\newrobustcmd*\tud@cs@restore[1]{%
+% \end{macrocode}
+% Sollte ein zuvor gesichertes Makro mit \cs{undef} oder \cs{csundef}
+% zwischenzeitlich \emph{undefiniert} gesetzt worden sein, wird das originäre
+% Makro dennoch wiederhergestellt. Hierfür wird es zu \cs{relax} gesetzt, damit
+% die Überprüfung mit \cs{tud@cs@check} keinen Fehler erzeugt.
+% \begin{macrocode}
+ \ifcsdef{#1}{}{%
+ \ifcsdef{@@tud@#1}{%
+ \cslet{#1}{\relax}%
+ }{}%
+ }%
+% \end{macrocode}
+% Die eigentliche Wiederherstellung.
+% \begin{macrocode}
+ \tud@cs@check{#1}%
\ifcsdef{@@tud@#1}{%
- \csletcs{#1}{@@tud@#1}%
+ \tud@cs@letltx{#1}{@@tud@#1}%
\csundef{@@tud@#1}%
}{}%
}
-\newcommand*\tud@cmd@reset[1]{%
- \tud@cmd@check{#1}%
- \ifcsdef{@@tud@#1}{\csletcs{#1}{@@tud@#1}}{}%
+\newrobustcmd*\tud@cs@reset[1]{%
+ \tud@cs@check{#1}%
+ \ifcsdef{@@tud@#1}{%
+ \tud@cs@letltx{#1}{@@tud@#1}%
+ }{}%
}
-\newcommand*\tud@cmd@update[1]{%
- \tud@cmd@check{#1}%
- \ifcsdef{@@tud@#1}{\csletcs{@@tud@#1}{#1}}{}%
+\newrobustcmd*\tud@cs@update[1]{%
+ \tud@cs@check{#1}%
+ \ifcsdef{@@tud@#1}{%
+ \tud@cs@letltx{@@tud@#1}{#1}%
+ }{}%
}
-\newcommand*\tud@cmd@use[1]{%
- \tud@cmd@check{#1}%
+\newrobustcmd*\tud@cs@use[1]{%
+ \tud@cs@check{#1}%
\ifcsdef{@@tud@#1}{%
\csuse{@@tud@#1}%
}{%
\csuse{#1}%
}%
}
-%</base>
% \end{macrocode}
% Dieses Makro dient zum Überprüfen, ob der zu sichernde beziehungsweise
% wiederherzustellende Befehl überhaupt definiert ist. Sollte das nicht der
% Fall sein, wird ein Fehler ausgegeben.
% \begin{macrocode}
-\newcommand*\tud@cmd@check[1]{%
+\newrobustcmd*\tud@cs@check[1]{%
\ifcsdef{#1}{}{%
- \PackageError{%
-%<base> tudscrbase%
-%<fontsfix> fix-tudscrfonts%
- }{`\@backslashchar#1' is not defined}{%
- The command `\@backslashchar#1' was never defined\MessageBreak%
+ \PackageError{tudscrbase}{%
+ `\@backslashchar#1' is not defined}{%
+ The command `\@backslashchar#1' was never defined.\MessageBreak%
Please contact the TUD-Script maintainer\MessageBreak%
via \tudscrmail. A bugfix is urgently required.%
}%
}%
}
% \end{macrocode}
-% Die Befehle \cs{tud@cmd@store} und \cs{tud@cmd@check} werden für das Paket
-% \pkg{fix-tudscrfonts} bereits außerhalb von \pkg{tudscrbase} definiert. Damit
-% deshalb keine Probleme entstehen, werden diese kurzerhand vor dem Laden von
-% \pkg{tudscrbase} undefiniert gesetzt.
-% \begin{macrocode}
-%<*fontsfix>
-\BeforePackage{tudscrbase}{%
- \undef\tud@cmd@store%
- \undef\tud@cmd@check%
-}
-%</fontsfix>
-% \end{macrocode}
-% \end{macro}^^A \tud@cmd@check
-% \end{macro}^^A \tud@cmd@use
-% \end{macro}^^A \tud@cmd@update
-% \end{macro}^^A \tud@cmd@reset
-% \end{macro}^^A \tud@cmd@restore
-% \end{macro}^^A \tud@cmd@store
-%
-% \iffalse
-%</package&(base|fontsfix)>
-%<*package&base>
-% \fi
-%
+% \end{macro}^^A \tud@cs@check
+% \end{macro}^^A \tud@cs@use
+% \end{macro}^^A \tud@cs@update
+% \end{macro}^^A \tud@cs@reset
+% \end{macro}^^A \tud@cs@restore
+% \end{macro}^^A \tud@cs@store
+% \end{macro}^^A \tud@cs@letltx
% \begin{macro}{\tud@skip@store}
% \changes{v2.04}{2015/03/02}{neu}^^A
% \changes{v2.05}{2016/07/13}{Verwendung von \cs{tud@skip@check}}^^A
@@ -913,7 +877,7 @@
argument of \string\TUD@parameter@family\space has to be\MessageBreak%
a unique family name. Alternatively, you can specify\MessageBreak%
the family name within the optional argument of\MessageBreak%
- \@backslashchar#2.
+ \@backslashchar#2.%
}%
}{}%
}
@@ -962,7 +926,7 @@
% Hierfür wird die angegebene Parameterliste sukzessive abgearbeitet. Elemente,
% welche in Schlüssel"=Wert"=Syntax angegeben wurden, bleiben unverändert\dots
% \begin{macrocode}
- \def\@tempb{}%
+ \let\@tempb\@empty%
\def\@tempa##1{%
\@expandtwoargs\in@{=}{##1}%
\ifin@%
@@ -979,7 +943,7 @@
% Parameterliste zu verwenden. Hierfür werden Umlaute sowie das \enquote*{ß}
% unschädlich gemacht.
% \begin{macrocode}
- \begingroup
+ \begingroup%
\let\IeC\@firstofone%
\def\"####1{####1e}%
\def\ss{ss}%
@@ -1023,6 +987,9 @@
% Das erste obligatorische Argument von \cs{TUD@parameter@handler@macro} wird
% für die Verarbeitung unbekannter Schlüssel-Wert-Paare genutzt, das zweite für
% einfache optionale Argumente.
+% \ToDo{%
+% Eine Katastrophe, dringend überarbeiten; generelle Lösung mit \cs{toks@}?%
+% }[v2.??]%
% \begin{macrocode}
\newcommand*\TUD@parameter@handler@macro[3][\TUD@parameter@@family]{%
\TUD@parameter@checkfamily{#1}{TUD@parameter@handler@macro}%
@@ -1066,7 +1033,7 @@
}%
\appto\@tempa{%
\ifstr{\kv@value}{twocolumn}{\def\kv@value{2}}{}%
- \ifxnumber{\kv@value}{\def\tud@reserved{columns=\kv@value}}{}%
+ \ifnumber{\kv@value}{\def\tud@reserved{columns=\kv@value}}{}%
\iflanguageloaded{\kv@value}{\def\tud@reserved{language=\kv@value}}{}%
\ifx\tud@reserved\relax%
\PackageError{tudscrbase}{%
@@ -1074,7 +1041,7 @@
}{%
If `\kv@value' is a language, you haven't loaded it.\MessageBreak%
Otherwise, there's no handler for the given value.\MessageBreak%
- You should specify a certian key (<key>=\kv@value).
+ You should specify a certian key (<key>=\kv@value).%
}%
\fi%
}%
@@ -1102,11 +1069,6 @@
% \end{macrocode}
% \end{macro}^^A \TUD@parameter@error
%
-% \iffalse
-%</package&base>
-%<*package&base|class&doc>
-% \fi
-%
% \subsubsection{Ausführung von paketspezifischem Quellcode}
%
% Ab und an ist es notwendig, bestimmten Quelltext gezielt in Abhängigkeit vom
@@ -1118,15 +1080,96 @@
% Argument wird das Paket angegeben, im zweiten der Quellcode.
% \begin{macrocode}
\newcommand*\TUD@UnwindPackage[2]{\AtEndPreamble{\@ifpackageloaded{#1}{}{#2}}}
-%<doc>\BeforePackage{tudscrbase}{\undef\TUD@UnwindPackage}
+\@onlypreamble\TUD@UnwindPackage
% \end{macrocode}
% \end{macro}^^A \TUD@UnwindPackage
-%
-% \iffalse
-%</package&base|class&doc>
-%<*package&base>
-% \fi
-%
+% \begin{macro}{\TUD@CheckPackage}
+% \changes{v2.06}{2019/06/21}{neu}^^A
+% \begin{macro}{\tud@if@packagelater@exists}
+% \changes{v2.06}{2019/06/21}{neu}^^A
+% Mit \cs{TUD@CheckPackage} wird geprüft, ob ein Paket mindestens in der
+% angegebenen Version existiert. Sollte das Paket in einer früheren Version
+% existieren, wird eine Warnung ausgegeben. Dabei wird das Paket \emph{nicht}
+% geladen. Damit lässt sich sicherstellen, dass beispielsweise Schriftdateien
+% in einer bestimmten Version vorhanden sind, ohne diese durch das Paket selbst
+% zu laden. Ist das Paket gar nicht installiert, wird durch den Aufruf von
+% \cs{RequirePackage} ein Fehler erzeugt respektive MiKTeX zur automatischen
+% Nachinstallation animiert.
+% \begin{macrocode}
+\newcommand*\TUD@CheckPackage[2]{%
+ \tud@if@packagelater@exists{#1}{#2}{}{%
+ \PackageWarningNoLine{tudscrbase}{%
+ The version `#2' of package `#1'\MessageBreak%
+ is urgently required. An erroneous output\MessageBreak
+ may occur. Please update your distribution%
+ }%
+ \IfFileExists{#1.\@pkgextension}{}{\RequirePackage{#1}[#2]}%
+ }%
+}
+\@onlypreamble\TUD@CheckPackage
+% \end{macrocode}
+% Hiermit wird geprüft, ob ein installiertes Paket in einer bestimmten Version
+% installiert ist, ohne dieses zu laden. Hierfür wird die Datei zeilenweise
+% gelesen, bis der Eintrag \cs{ProvidesPackage\marg{Paketname}\oarg{Version}}
+% gefunden wird.
+% \begin{macrocode}
+\newcommand*\tud@if@packagelater@exists[2]{%
+ \begingroup%
+ \let\tud@res@a\@empty%
+ \def\tud@res@b[##1]{\def\tud@res@a{##1}}%
+ \def\ProvidesPackage##1{%
+ \@ifnextchar[%]
+ {\tud@res@b}{\tud@res@b[]}%
+ }%
+ \IfFileExists{#1.\@pkgextension}{%
+ \openin\tud@res@read=#1.\@pkgextension%
+ \@tud@res@swatrue%
+ \loop%
+ \read\tud@res@read to\tud@res@c%
+ \@expandtwoargs\in@{\string\ProvidesPackage}%
+ {\expandafter\detokenize\expandafter{\tud@res@c}}%
+ \ifin@%
+ \@tud@res@swafalse%
+ \tud@res@c%
+ \fi%
+ \ifeof\tud@res@read\@tud@res@swafalse\fi%
+ \if@tud@res@swa%
+ \repeat%
+ \closein\tud@res@read%
+ }{}%
+ \edef\tud@res@a{\endgroup\noexpand\@ifl@t@r{\tud@res@a}{#2}}
+ \tud@res@a%
+}
+\@onlypreamble\tud@if@packagelater@exists
+% \end{macrocode}
+% \end{macro}^^A \tud@if@packagelater@exists
+% \end{macro}^^A \TUD@CheckPackage
+% \begin{macro}{\TUD@RecommendPackage}
+% \changes{v2.06}{2018/07/12}{neu}^^A
+% Bestimmte Pakete sind für die Funktionalität von \TUDScript empfohlen, aber
+% nicht zwingend erforderlich. Sind diese nicht vorhanden, wird eine Warnung
+% ausgegeben.
+% \begin{macrocode}
+\newcommand*\TUD@RecommendPackage[1]{%
+ \kernel@ifnextchar[%]
+ {\TUD@@RecommendPackage#1}%
+ {\TUD@@RecommendPackage#1[]}%
+}
+\@onlypreamble\TUD@RecommendPackage
+\newcommand*\TUD@@RecommendPackage{}
+\def\TUD@@RecommendPackage#1[#2]{%
+ \IfFileExists{#1.sty}{%
+ \RequirePackage{#1}[#2]%
+ }{%
+ \PackageWarning{tudscrbase}{%
+ The usage of package `#1' (#2) is\MessageBreak%
+ recommended but it isn't installed%
+ }%
+ }%
+}
+\@onlypreamble\TUD@@RecommendPackage
+% \end{macrocode}
+% \end{macro}^^A \TUD@RecommendPackage
% \begin{macro}{\TUD@AfterPackage@set}
% \changes{v2.04}{2015/03/09}{neu}^^A
% \begin{macro}{\TUD@AfterPackage@do}
@@ -1175,16 +1218,16 @@
% \begin{macrocode}
%<*package&base>
\newcommand*\TUD@KOMAoptions[1]{}
-\ifdef{\KOMAClassName}{%
- \let\TUD@KOMAoptions\KOMAoptions
-}{%
+\ifundef{\KOMAClassName}{%
\renewcommand*\TUD@KOMAoptions[1]{%
\PackageWarning{tudscrbase}{%
You should load package `scrextend' right after the\MessageBreak%
documentclass. Option \string\TUD@KOMAoptions{`#1'} is gobbled%
}%
}%
- \AfterPackage*{scrextend}{\let\TUD@KOMAoptions\KOMAoptions}
+ \AfterPackage*{scrextend}{\let\TUD@KOMAoptions\KOMAoptions}%
+}{%
+ \let\TUD@KOMAoptions\KOMAoptions%
}
%</package&base>
% \end{macrocode}
@@ -1239,13 +1282,12 @@
% Im Makro \cs{tud@x@multicol@num} wird die Anzahl der gewünschten Spalten in
% einer Umgebung für die Verwendung des \pkg{multicol}-Paketes gespeichert.
% \begin{macrocode}
-\cs@lock{tud@x@multicol@num}{1}
+\newcommand*\tud@x@multicol@num{1}
% \end{macrocode}
% Der Befehl \cs{tud@x@multicol@check} prüft, ob das Paket \pkg{multicol}
% geladen wurde. Falls dies nicht der Fall ist, wird eine Warnung ausgegeben
% und die Änderung des Wertes über einen Parameter der Umgebungen \env{tudpage}
-% respektive \env{abstract} sowie \env{declarations} über \cs{set@set@lock}
-% verhindert.
+% respektive \env{abstract} sowie \env{declarations} verhindert.
% \begin{macrocode}
\newcommand*\tud@x@multicol@check{%
\ifnum\tud@x@multicol@num>\@ne\relax%
@@ -1253,10 +1295,10 @@
The option `columns=\tud@x@multicol@num' is only\MessageBreak%
supported, when package `multicol' is loaded%
}%
- \cs@set@lock{tud@x@multicol@num}{1}%
+ \renewcommand*\tud@x@multicol@num{1}%
\fi%
}
-\AfterPackage{multicol}{\renewcommand*\tud@x@multicol@check{\relax}}
+\AfterPackage{multicol}{\let\tud@x@multicol@check\relax}
% \end{macrocode}
% \end{macro}^^A \tud@x@multicol@check
% \end{macro}^^A \tud@x@multicol@num