diff options
author | Karl Berry <karl@freefriends.org> | 2019-06-28 21:06:55 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-06-28 21:06:55 +0000 |
commit | 6677e7d16babf1c0596fd30f9aeb6b13433725cd (patch) | |
tree | 84163738e611a8ebcbbed7102f3efa9238211476 /Master/texmf-dist/source/latex/tudscr/tudscr-base.dtx | |
parent | 2a2ad17b85ef254d44022ec0fbcadb62cc90f431 (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.dtx | 830 |
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 |