diff options
author | Karl Berry <karl@freefriends.org> | 2016-05-11 21:26:48 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2016-05-11 21:26:48 +0000 |
commit | 39c10427f8eee057dc28928380060a585e1e017b (patch) | |
tree | 6750074338d5e6b808cfca3671e2ab9763c328ae /Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx | |
parent | a49931ca8756327265b8929a7a147045bf2b3506 (diff) |
koma-script (11may16)
git-svn-id: svn://tug.org/texlive/trunk@41038 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx | 1400 |
1 files changed, 1069 insertions, 331 deletions
diff --git a/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx b/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx index 450a28de737..452d88c8c8d 100644 --- a/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx +++ b/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx @@ -1,8 +1,8 @@ -% \CheckSum{2959} +% \CheckSum{3545} % \iffalse meta-comment % ====================================================================== % scrkernel-basics.dtx -% Copyright (c) Markus Kohm, 2002-2015 +% Copyright (c) Markus Kohm, 2002-2016 % % This file is part of the LaTeX2e KOMA-Script bundle. % @@ -20,7 +20,7 @@ % This work consists of all files listed in manifest.txt. % ---------------------------------------------------------------------- % scrkernel-basics.dtx -% Copyright (c) Markus Kohm, 2002-2015 +% Copyright (c) Markus Kohm, 2002-2016 % % Dieses Werk darf nach den Bedingungen der LaTeX Project Public Lizenz, % Version 1.3c, verteilt und/oder veraendert werden. @@ -55,13 +55,13 @@ % Right brace \} Tilde \~} % % \iffalse -%%% From File: $Id: scrkernel-basics.dtx 2190 2015-08-29 17:21:55Z kohm $ +%%% From File: $Id: scrkernel-basics.dtx 2438 2016-04-27 10:58:21Z kohm $ %<package&option>\NeedsTeXFormat{LaTeX2e}[1995/06/01] %<*driver> \ifx\ProvidesFile\undefined\def\ProvidesFile#1[#2]{}\fi \begingroup \def\filedate$#1: #2-#3-#4 #5${\def\filedate{#2/#3/#4}} - \filedate$Date: 2015-08-29 19:21:55 +0200 (Sat, 29 Aug 2015) $ + \filedate$Date: 2016-04-27 12:58:21 +0200 (Wed, 27 Apr 2016) $ \def\filerevision$#1: #2 ${\def\filerevision{r#2}} \filerevision$Revision: 1638 $ \xdef\fileinfo{\filedate\space\filerevision\space} @@ -217,6 +217,25 @@ % \end{macrocode} % erledigt ist. % +% \subsection{Schutz vor Umdefinierung von +% \LaTeX-Kern-Anweisungen durch +% andere Pakete} +% Einige Pakete wie \textsf{amsgen} definieren \LaTeX-Kern-Anweisungen so um, +% dass sie nicht mehr korrekt funktionieren. Ich muss dann leider dafür +% sorgen, dass \KOMAScript{} damit keine Probleme hat. Die Klassen sind dabei +% in der günstigen Situation, dass sie ggf. einfach die vorhandene Definition +% testen und übernehmen können. Die Pakete müssen hingegen dummer Weise selbst +% dafür sorgen, dass es irgendwie funktioniert. +% +% \begin{macro}{\kernel@ifstar} +% \changes{v3.20}{2016/04/12}{neu (intern)} +% Ich hoffe ja, dass der \LaTeX-Kern zukünftig diese Anweisung definiert und +% das dann auch funktioniert. Damit es aber auch mit älteren \LaTeX-Versionen +% geht, sorge ich hier vor. +% \begin{macrocode} +%<base>\providecommand*\kernel@ifstar[1]{\kernel@ifnextchar*{\@firstoftwo{#1}}} +% \end{macrocode} +% \end{macro}^^A \kernel@ifstar % % \subsection{Test von Anweisungen} % @@ -276,6 +295,8 @@ % % \begin{macro}{\DefineFamily} % \changes{v3.00}{2008/04/30}{Neue Anweisung}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % \begin{macro}{\DefineFamilyMember} % \changes{v3.00}{2008/04/30}{Neue Anweisung}^^A % \begin{macro}{\DefineFamilyKey} @@ -342,7 +363,7 @@ }% } \newcommand*{\DefineFamilyKey}[3][.\@currname.\@currext]{% - \@ifnextchar[%] + \kernel@ifnextchar[%] {% \edef\reserved@a{#1}% \expandafter\scr@define@family@key @@ -757,21 +778,20 @@ % \begin{macro}{\@globaloptionslist} % \changes{v2.96}{2006/11/26}{new}^^A % \changes{v2.96}{2006/11/26}{Klassenoptionen durchsuchen}^^A -% Die Lister der globalen Optionen wird teilweise benötigt. Weil +% \changes{v3.20}{2016/02/06}{Entscheidung später treffen}^^A +% Die Liste der globalen Optionen wird teilweise benötigt. Weil % \textsl{xkeyval} dämlicherweise glaubt, es müsse alle Optionen mit % Gleichheitszeichen aus der Liste der Klassenoptionen entfernen % (seltsamerweise aber nicht die (x)keyval-Optionen, die ohne Wert aufgerufen % werden, weil ihr Defaultwert verwendet werden soll), wird hier ein eigenes -% Makro definiert. +% Makro definiert. Bis \KOMAScript{} 3.19a wurde auch genau hier die Zuweisung +% durchgeführt. Wenn aber \textsf{scrbase} noch vor \cs{documentclass} geladen +% wird, dann ist \cs{@classoptionslist} natürlich noch nicht gültig. Deshalb +% wird die Zuweisung, seit \KOMAScript{} 3.20 in \cs{FamilyProcessOptions} +% durchgeführt. % \begin{macrocode} %<*base> \newcommand*{\@globaloptionslist}{} -\let\@globaloptionslist\@classoptionslist -\scr@ifundefinedorrelax{XKV@classoptionslist}{}{% - \ifx\XKV@classoptionslist\@empty\else - \let\@globaloptionslist\XKV@classoptionslist - \fi -} %</base> % \end{macrocode} % \end{macro} @@ -842,7 +862,19 @@ % dazu jedoch keine Fehler oder Warnungen aus. % \changes{v3.18}{2015/06/17}{Behandlung von undefiniertem % \cs{@globaloptionslist}}^^A +% \changes{v3.20}{2016/02/06}{\cs{@globaloptionslist} immer neu zuweisen}^^A % \begin{macrocode} + \let\@globaloptionslist\@classoptionslist + \scr@ifundefinedorrelax{XKV@classoptionslist}{% +%<trace> \PackageInfo{scrbase}{Using \string\@classoptionslist}% + }{% + \ifx\XKV@classoptionslist\@empty +%<trace> \PackageInfo{scrbase}{Using \string\@classoptionslist}% + \else +%<trace> \PackageInfo{scrbase}{Using \string\XKV@classoptionslist}% + \let\@globaloptionslist\XKV@classoptionslist + \fi + }% \scr@ifundefinedorrelax{@globaloptionslist}{}{% \@for\CurrentOption:=\@globaloptionslist\do{% % \end{macrocode} @@ -1317,225 +1349,401 @@ %</base> % \end{macro}^^A \IfArgIsEmpty % +% +% \begin{macro}{\ifislengthprimitive} +% \changes{v3.20}{2015/10/19}{neu}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einem Primitiv +% expandiert, das als Länge verwendet werden kann, wird das erste Argument +% ausgeführt, sonst das zweite. +% \begin{macrocode} +%<*base> +\newcommand*{\ifislengthprimitive}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifislengthprimitive#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifislengthprimitive} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf diverse Primitive prüft. +% \begin{macrocode} +\newcommand*{\scr@ifislengthprimitive}[1]{% + \begingroup + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifislengthprimitive + }{% + \def\reserved@c{\aftergroup\scr@secondoftwoAfterNil}% + \@for\reserved@a:=\baselineskip,\dp,\hsize,\ht,\lineskip,% + \parindent,\parskip,\pdfpageheight,\pdfpagewidth,% + \wd,\vsize \do {% + \expandafter\ifstr\expandafter{\expandafter\string\reserved@a}{% + \meaning #1% + }{% + \def\reserved@c{\aftergroup\scr@TestDimenAssignTillNil}% + }% + }% + \reserved@c + }% + \endgroup + #1% +} +%</base> +% \end{macrocode} +% \end{macro}^^A \scr@ifislengthprimitive +% \end{macro}^^A \ifislengthprimitive +% +% % \begin{macro}{\ifisdimen} % \changes{v3.12}{2013/11/05}{neu}^^A -% Falls die Expansion des ersten Arguments eine \cs{dimen} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einem +% \cs{dimen}-Register (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. % \begin{macrocode} %<*base> \newcommand*{\ifisdimen}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisdimen#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisdimen} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf ein \cs{dimen}-Register prüft +% \begin{macrocode} +\newcommand*{\scr@ifisdimen}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\dimen}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifrelax@to@nnil - \@tempdima=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisdimen + }{% + \ifstrstart{\meaning #1}{\string\dimen}{% + \aftergroup\scr@TestDimenAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% - }{\aftergroup\@secondoftwo}% + }% \endgroup + #1% } % \end{macrocode} -% \begin{macro}{\scr@ifrelax@to@nnil} -% \changes{v3.12}{2013/11/05}{neu (intern)}^^A -% Hilfsmakro, zur Verwendung beispielsweise nach Zuweissungen. Falls alles bis -% zum ersten \cs{@nnil} aus genau einem \cs{relax} besteht, wird das erste -% Argument ausgeführt, sonst das zweite. +% \end{macro}^^A \scr@ifisdimen +% \begin{macro}{\scr@TestDimenAssignTillNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Das durch \cs{@nil} begrenzte Argument wird einer temporären Länge +% zugewiesen. Wird dabei das Argument komplett aufgebraucht, so wird das +% erste Argument nach \cs{@nil} ausgeführt, sonst das zweite. Das begrenzte +% Argument wird in jedem Fall komplett aufgebraucht. % \begin{macrocode} -\newcommand*{\scr@ifrelax@to@nnil}{} -\def\scr@ifrelax@to@nnil#1\@nnil{% +\newcommand*\scr@TestDimenAssignTillNil{} +\def\scr@TestDimenAssignTillNil#1\@nil{% \begingroup - \def\reserved@a{#1}\def\reserved@b{\relax}% - \ifx\reserved@a\reserved@b - \aftergroup\@firstoftwo - \else - \aftergroup\@secondoftwo - \fi + \afterassignment\scr@AfterEndGroupIfArgIsRelaxTillNnil + \@tempdima=#1\relax\@nnil +} +% \end{macrocode} +% \begin{macro}{\scr@IfAfterEndgroupArgIsRelaxTillNnil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% \begin{macro}{\scr@IfArgIsRelaxAfterRelaxTillNnil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Die Hilfsmakros lesen ein durch \cs{@nnil} begrenztes Argument. Falls dieses +% Argument nur aus einer Folge von \cs{relax} besteht, wird das erste Argument +% nach \cs{@nnil} ausgeführt, sonst das zweite. +% \begin{macrocode} +\newcommand*\scr@AfterEndGroupIfArgIsRelaxTillNnil{} +\def\scr@AfterEndGroupIfArgIsRelaxTillNnil#1\@nnil{% \endgroup + \ifstr{\detokenize{#1}}{\detokenize{\relax}}{\@firstoftwo}{% + \ifstrstart{\detokenize{#1}}{\detokenize{\relax}}{% + \scr@IfArgIsRelaxAfterRelaxTillNnil #1\@nnil + }{\@secondoftwo}% + }% } +\newcommand*\scr@IfArgIsRelaxAfterRelaxTillNnil{} +\def\scr@IfArgIsRelaxAfterRelaxTillNnil \relax#1\@nnil{% + \ifstr{\detokenize{#1}}{\detokenize{\relax}}{\@firstoftwo}{% + \ifstrstart{\detokenize{#1}}{\detokenize{\relax}}{% + \scr@IfArgIsRelaxAfterRelaxTillNnil #1\@nnil + }{\@secondoftwo}% + }% +} +% \end{macrocode} +% \end{macro}^^A \scr@IfArgIsRelaxAfterRelaxTillNnil +% \end{macro}^^A \scr@IfArgIsRelaxTillNnil +% \end{macro}^^A \scr@TestSkipAssignTillNil +% \begin{macro}{\scr@secondoftwoAfterNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Das Hilfsmakro liest ein durch \cs{@nil} begrenztes Argument und führt dann +% das zweite Argument nach \cs{@nil} aus. Dabei wird auch Sorge dafür getrage, +% dass das Argument eventuell leer sein könnte, was normalerweise dazu führen +% würde, dass \cs{@nil} zum Argument selbst wird. +% \begin{macro}{\scr@@secondoftwoAfterNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Zu diesem Zweck wird ein zweites Hilfsmakro benötigt. +% \begin{macrocode} +\newcommand*{\scr@secondoftwoAfterNil}{\scr@@secondoftwoAfterNil\@empty} +\newcommand*{\scr@@secondoftwoAfterNil}{} +\def\scr@@secondoftwoAfterNil#1\@nil{\@secondoftwo} %</base> % \end{macrocode} -% \end{macro} -% \end{macro} +% \end{macro}^^A \scr@@secondoftwoAfterNil +% \end{macro}^^A \scr@secondoftwoAfterNil +% \end{macro}^^A \ifisdimen % -% \begin{macro}{\ifisdimexpr} +% \begin{macro}{\ifisskip} % \changes{v3.12}{2013/11/05}{neu}^^A -% Falls die Expansion des ersten Arguments eine \cs{dimexpr} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. Achtung: Falls der Ausdruck -% ungültig ist, so wird ein Fehler gemeldet! +% \changes{v3.18a}{2015/07/07}{\cs{baselineskip} und \cs{parskip} werden als +% skips akzeptiert}^^A +% \changes{v3.20}{2015/10/19}{\cs{baselineskip} und \cs{parskip} sind keine +% skips}^^A +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einem +% \cs{skip}-Register (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. % \begin{macrocode} %<*base> -\newcommand*{\ifisdimexpr}[1]{% +\newcommand*{\ifisskip}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisskip#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisskip} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf ein \cs{skip}-Register prüft +% \begin{macrocode} +\newcommand*{\scr@ifisskip}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\dimexpr}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifemptyorrelax@to@nnil - \@tempdima=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisskip + }{% + \ifstrstart{\meaning #1}{\string\skip}{% + \aftergroup\scr@TestSkipAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% - }{\aftergroup\@secondoftwo}% + }% \endgroup + #1% } % \end{macrocode} -% \begin{macro}{\scr@ifemptyorrelax@to@nnil} -% \changes{v3.12}{2013/11/05}{neu (intern)}^^A -% Hilfsmakro, zur Verwendung beispielsweise nach Zuweissungen. Falls alles bis -% zum ersten \cs{@nnil} leer ist oder aus genau einem \cs{relax} besteht, wird -% das erste Argument ausgeführt, sonst das zweite. +% \end{macro}^^A \scr@ifisskip +% \begin{macro}{\scr@TestSkipAssignTillNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Das durch \cs{@nil} begrenzte Argument wird einer temporären Länge +% zugewiesen. Wird dabei das Argument komplett aufgebraucht, so wird das +% erste Argument nach \cs{@nil} ausgeführt, sonst das zweite. Das begrenzte +% Argument wird in jedem Fall komplett aufgebraucht. % \begin{macrocode} -\newcommand*{\scr@ifemptyorrelax@to@nnil}{} -\def\scr@ifemptyorrelax@to@nnil#1\@nnil{% +\newcommand*\scr@TestSkipAssignTillNil{} +\def\scr@TestSkipAssignTillNil#1\@nil{% \begingroup - \def\reserved@a{#1}\def\reserved@b{\relax}% - \ifx\reserved@a\reserved@b - \aftergroup\@firstoftwo - \else - \ifx\reserved@a\@empty - \aftergroup\@firstoftwo - \else - \aftergroup\@secondoftwo - \fi - \fi - \endgroup + \afterassignment\scr@AfterEndGroupIfArgIsRelaxTillNnil + \@tempskipa=#1\relax\@nnil } %</base> % \end{macrocode} -% \end{macro} -% \end{macro} +% \end{macro}^^A \scr@TestSkipAssignTillNil +% \end{macro}^^A \ifiskip % -% \begin{macro}{\ifisskip} +% \begin{macro}{\ifiscount} % \changes{v3.12}{2013/11/05}{neu}^^A -% \changes{v3.18a}{2015/07/07}{\cs{baselineskip} und \cs{parskip} werden als -% skips akzeptiert}^^A -% Falls die Expansion des ersten Arguments ein \cs{skip} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einem +% \cs{count}-Register (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. % \begin{macrocode} %<*base> -\newcommand*{\ifisskip}[1]{% +\newcommand*{\ifiscount}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifiscount#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifiscount} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf ein \cs{count}-Register prüft +% \begin{macrocode} +\newcommand*{\scr@ifiscount}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\skip}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifrelax@to@nnil - \@tempskipa=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifiscount + }{% + \ifstrstart{\meaning #1}{\string\count}{% + \aftergroup\scr@TestCountAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% + }% + \endgroup + #1% +} +% \end{macrocode} +% \end{macro}^^A \scr@ifiscount +% \begin{macro}{\scr@TestSkipCountTillNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Das durch \cs{@nil} begrenzte Argument wird einer temporären Länge +% zugewiesen. Wird dabei das Argument komplett aufgebraucht, so wird das +% erste Argument nach \cs{@nil} ausgeführt, sonst das zweite. Das begrenzte +% Argument wird in jedem Fall komplett aufgebraucht. +% \begin{macrocode} +\newcommand*\scr@TestCountAssignTillNil{} +\def\scr@TestCountAssignTillNil#1\@nil{% + \begingroup + \afterassignment\scr@AfterEndGroupIfArgIsRelaxTillNnil + \@tempcnta=#1\relax\@nnil +} +%</base> +% \end{macrocode} +% \end{macro}^^A \scr@TestCountAssignTillNil +% \end{macro}^^A \ifiscount +% +% +% \begin{macro}{\ifisdimexpr} +% \changes{v3.12}{2013/11/05}{neu}^^A +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einer +% \cs{dimexpr} (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. Dies unterscheidet sich in einem +% wichtigen Punkt von \cs{ifisdimen}: Sollte das ganze zwar als \cs{dimexpr} +% beginnen, aber syntaktisch nicht korrekt sein, so wird dies nicht erkannt, +% sondern führt tatsächlich zu einer Fehlermeldung. +% \begin{macrocode} +%<*base> +\newcommand*{\ifisdimexpr}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisdimexpr#1\relax\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisdimexpr} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf eine \cs{dimexpr} prüft +% \begin{macrocode} +\newcommand*{\scr@ifisdimexpr}[1]{% + \begingroup + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisdimexpr }{% - \ifstr{\reserved@a}{\string\baselineskip}{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\string\dimexpr}{% + \aftergroup\scr@TestDimenAssignTillNil }{% - \ifstr{\reserved@a}{\string\parskip}{% - \aftergroup\@firstoftwo - }{% - \aftergroup\@secondoftwo - }% + \aftergroup\scr@secondoftwoAfterNil }% }% \endgroup + #1% } %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \scr@ifisdimexpr +% \end{macro}^^A \ifisdimexpr +% % % \begin{macro}{\ifisglueexpr} % \changes{v3.12}{2013/11/05}{neu}^^A -% Falls die Expansion des ersten Arguments eine \cs{glueexpr} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. Achtung: Falls der Ausdruck -% ungültig ist, so wird ein Fehler gemeldet! +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einer +% \cs{glueexpr} (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. Dies unterscheidet sich in einem +% wichtigen Punkt von \cs{ifisskip}: Sollte das ganze zwar als \cs{glueexpr} +% beginnen, aber syntaktisch nicht korrekt sein, so wird dies nicht erkannt, +% sondern führt tatsächlich zu einer Fehlermeldung. % \begin{macrocode} %<*base> \newcommand*{\ifisglueexpr}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisglueexpr#1\relax\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisglueexpr} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf eine \cs{glueexpr} prüft +% \begin{macrocode} +\newcommand*{\scr@ifisglueexpr}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\glueexpr}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifemptyorrelax@to@nnil - \@tempskipa=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisglueexpr + }{% + \ifstrstart{\meaning #1}{\string\glueexpr}{% + \aftergroup\scr@TestSkipAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% - }{\aftergroup\@secondoftwo}% + }% \endgroup + #1% } %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \scr@ifisglueexpr +% \end{macro}^^A \ifisglueexpr % -% \begin{macro}{\ifiscount} +% +% \begin{macro}{\ifisnumexpr} % \changes{v3.12}{2013/11/05}{neu}^^A -% Falls die Expansion des ersten Arguments ein \cs{count} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. Für \LaTeX-Zähler siehe -% stattdessen \cs{ifiscounter}. +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einer +% \cs{numexpr} (und zu nichts weiterem!) expandiert, wird das erste +% Argument ausgeführt, sonst das zweite. Dies unterscheidet sich in einem +% wichtigen Punkt von \cs{ifiscount}: Sollte das ganze zwar als \cs{numexpr} +% beginnen, aber syntaktisch nicht korrekt sein, so wird dies nicht erkannt, +% sondern führt tatsächlich zu einer Fehlermeldung. % \begin{macrocode} %<*base> -\newcommand*{\ifiscount}[1]{% +\newcommand*{\ifisnumexpr}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisnumexpr#1\relax\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisnumexpr} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf eine \cs{numexpr} prüft +% \begin{macrocode} +\newcommand*{\scr@ifisnumexpr}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\count}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifrelax@to@nnil - \@tempcnta=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisnumexpr + }{% + \ifstrstart{\meaning #1}{\string\numexpr}{% + \aftergroup\scr@TestCountAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% - }{\aftergroup\@secondoftwo}% + }% \endgroup + #1% } %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \scr@ifisnumexpr +% \end{macro}^^A \ifisnumexpr % -% \begin{macro}{\ifisnumexpr} -% \changes{v3.12}{2013/11/05}{neu}^^A -% Falls die Expansion des ersten Arguments eine \cs{numexpr} ist, wird das -% zweite Argument ausgeführt, sonst das dritte. Achtung: Falls der Ausdruck -% ungültig ist, so wird ein Fehler gemeldet! +% +% \begin{macro}{\ifisdefchar} +% \changes{v3.20}{2015/10/19}{neu}^^A +% Falls das erste Argument ggf. über mehrere Stufen hinweg zu einem mit +% \cs{chardef} definierten Wert (und zu nichts weiterem!) expandiert, wird das +% erste Argument ausgeführt, sonst das zweite. Dies unterscheidet sich in einem +% wichtigen Punkt von \cs{ifiscount}: Sollte das ganze zwar wie ein \cs{char} +% beginnen, aber syntaktisch nicht korrekt sein, so wird dies nicht erkannt, +% sondern führt tatsächlich zu einer Fehlermeldung. % \begin{macrocode} %<*base> -\newcommand*{\ifisnumexpr}[1]{% +\newcommand*{\ifisdefchar}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisdefchar#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisdefchar} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf eine \cs{char} prüft +% \begin{macrocode} +\newcommand*{\scr@ifisdefchar}[1]{% \begingroup - \edef\reserved@a{#1}% - \expandafter\expandafter\expandafter\def - \expandafter\expandafter\expandafter\reserved@a - \expandafter\expandafter\expandafter{\expandafter\meaning\reserved@a}% - \expandafter\def\expandafter\reserved@b\expandafter{\string\numexpr}% - \ifstrstart{\reserved@a}{\reserved@b}{% - \afterassignment\scr@ifemptyorrelax@to@nnil - \@tempcnta=#1\relax\@nnil{% - \aftergroup\@firstoftwo + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisdefchar + }{% + \ifstrstart{\meaning #1}{\string\char\string"}{% + \aftergroup\scr@TestCountAssignTillNil }{% - \aftergroup\@secondoftwo + \aftergroup\scr@secondoftwoAfterNil }% - }{\aftergroup\@secondoftwo}% + }% \endgroup + #1% } %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \scr@ifisdefchar +% \end{macro}^^A \ifisdefchar +% % % \begin{macro}{\ifiscounter} % \changes{v3.12}{2013/11/05}{neu}^^A @@ -1545,148 +1753,398 @@ %<*base> \newcommand*{\ifiscounter}[1]{% \begingroup - \@ifundefined{c@#1}% - {\aftergroup\@secondoftwo}% - {\aftergroup\@firstoftwo}% + \scr@ifundefinedorrelax{c@#1}{% + \aftergroup\@secondoftwo + }{% + \aftergroup\@firstoftwo + }% \endgroup } %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \ifiscounter +% % % \begin{macro}{\ifisinteger} % \changes{v3.12}{2013/11/05}{neu}^^A % \changes{v3.12a}{2014/01/24}{Leerzeichenfehler korrigiert}^^A +% \changes{v3.20}{2015/10/19}{Reimplementierung}^^A % Falls die Expansion des ersten Arguments eine (positive oder negative) ganze % Zahl ist, wird das zweite Argument ausgeführt, sonst das dritte. % \begin{macrocode} %<*base> \newcommand*{\ifisinteger}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisinteger#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisinteger} +% \changes{v3.20}{2015/10/19}{neu (intern)}^^A +% Hilfsmacro, das ggf. rekusiv auf ein Vorzeichen oder eine positive Zahl +% prüft. +% \begin{macrocode} +\def\scr@ifisinteger#1{% \begingroup - \edef\reserved@a{#1}\expandafter - \scr@ifintegerplusminus\reserved@a\@nil{\aftergroup\@firstoftwo}% - {\aftergroup\@secondoftwo}% + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisinteger\aftergroup#1% + }{% + \ifstrstart{\meaning #1}{\detokenize{the character}}{% + \if #1-\aftergroup\scr@ifisinteger + \else + \if #1+\aftergroup\scr@ifisinteger + \else + \ifnum 0=0\if #10\else\if #11\else\if #12\else\if #13\else + \if #14\else\if #15\else\if #16\else\if #17\else + \if #18\else\if #19\else 1\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \relax + \aftergroup\scr@TestCountAssignTillNil + \aftergroup#1% + \else + \aftergroup\scr@secondoftwoAfterNil + \aftergroup#1% + \fi + \fi + \fi + }{% + \ifstrstart{\meaning #1}{\string\char\string"}{% + \aftergroup\scr@TestCountAssignTillNil + }{% + \def\reserved@c{% + \aftergroup\scr@secondoftwoAfterNil + }% + \@for\reserved@a:=\abovedisplayskip,\abovedisplayshortskip,% + \adjdemerits,% + \baselineskip,\belowdisplayskip,% + \belowdisplayshortskip,\binoppenalty,\boxmaxdepth,% + \brokenpenalty,% + \clubpenalty,\count,% + \dimen,\dimexpr,\doublehyphendemerits,\dp,% + \emergenystretch,\exhyphenpenalty,% + \finalhyphendemerits,% + \glueexpr,% + \hbadness,\hfuzz,\hsize,\ht,\hyphenpenalty,% + \lastskip,\lastpenalty,\linepenalty,% + \lineskip,\lineskiplimit,% + \maxdepth,\numexpr,% + \overfullrule,% + \parfillskip,\parindent,\parskip,% + \pdfpageheight,\pdfpagewidth,% + \predisplaypenalty,\pretolerance,% + \relpenalty,\widowpenalty,% + \skip,\splitmaxdepth,\splittopskip,% + \tolerance,\topskip,% + \wd,\vbadness,\vfuzz,\vsize + \do {% + \expandafter\ifstr\expandafter{\expandafter\string\reserved@a}{% + \meaning #1% + }{% + \def\reserved@c{\aftergroup\scr@TestCountAssignTillNil}% + }% + }% + \reserved@c + }% + \aftergroup#1% + }% + }% \endgroup } +%</base> % \end{macrocode} -% \begin{macro}{\scr@ifintegerplusminus} +% \end{macro}^^A \scr@ifisinteger +% \end{macro}^^A \ifisinteger +% +% +% \begin{macro}{\scr@ifrelax@to@nnil} % \changes{v3.12}{2013/11/05}{neu (intern)}^^A -% Hilfsmakro, ausschließlich für \cs{ifisinteger}. +% Hilfsmakro, zur Verwendung beispielsweise nach Zuweissungen. Falls alles bis +% zum ersten \cs{@nnil} aus genau einem \cs{relax} besteht, wird das erste +% Argument ausgeführt, sonst das zweite. % \begin{macrocode} -\newcommand*{\scr@ifintegerplusminus}{} -\def\scr@ifintegerplusminus#1#2\@nil{% - \def\scr@next{\scr@ifintegerplusminus #2\@nil}% - \if #1-\relax - \else \if #1+\relax +%<*base> +\newcommand*{\scr@ifrelax@to@nnil}{} +\def\scr@ifrelax@to@nnil#1\@nnil{% + \begingroup + \def\reserved@a{#1}\def\reserved@b{\relax}% + \ifx\reserved@a\reserved@b + \aftergroup\@firstoftwo \else - \def\scr@next{% - \afterassignment\scr@ifrelax@to@nnil - \@tempcnta=#1#2\relax\@nnil - }% - \if #10\else\if #11\else\if #12\else\if #13\else\if #14\else - \if #15\else\if #16\else\if #17\else\if #18\else\if #19\else - \let\scr@next\@secondoftwo - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \aftergroup\@secondoftwo \fi - \fi - \scr@next + \endgroup } %</base> % \end{macrocode} % \end{macro} -% \end{macro} % % \begin{macro}{\ifisdimension} % \changes{v3.12}{2013/11/05}{neu}^^A % \changes{v3.12a}{2014/01/24}{Leerzeichenfehler korrigiert}^^A -% Falls die Expansion des ersten Arguments eine (positive oder negative) -% Länge ist, wird das zweite Argument ausgeführt, sonst das dritte. Es sei -% darauf hingewiesen, dass derzeit ungültige oder fehlende Einheiten eine -% Fehlermeldung bewirken! +% \changes{v3.20}{2015/10/20}{Reimplementierung}^^A +% Falls die stufenweise Expansion des ersten Arguments eine (positive oder +% negative) Länge ist, wird das zweite Argument ausgeführt, sonst das +% dritte. % \begin{macrocode} %<*base> \newcommand*{\ifisdimension}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisdimension#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisdimension} +% \changes{v3.20}{2015/10/20}{neu (intern)} +% Eigentlich wäre dieses Hilfsmakro extrem aufwändig, da eine Dimension recht +% komplex aufgebaut sein darf. Ich habe aber beschlossen, hier mit einer +% Heuristik zu Werke zu gehen: Wenn das Argument mit einer beliebigen Anzahl +% Vorzeichen, gefolgt von max. einem Punkt, Komma oder einer Ziffer oder +% gefolgt einem der für Längen zulässigen Primitiv beginnt, dann probieren wir +% eine Zuweisung. Ist diese syntaktisch nicht korrekt, kann ein Fehler die +% Folge sein. Das mag unschön sein, vereinfacht den Test aber erheblich! +% \begin{macrocode} +\newcommand*{\scr@ifisdimension}[1]{% \begingroup - \edef\reserved@a{#1\relax}\expandafter - \scr@ifdimensionplusminus\reserved@a\@nil{\aftergroup\@firstoftwo}% - {\aftergroup\@secondoftwo}% + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisdimension\aftergroup#1% + }{% + \ifstrstart{\meaning #1}{\detokenize{the character}}{% + \if #1-\aftergroup\scr@ifisdimension + \else + \if #1-\aftergroup\scr@ifisdimension + \else + \if #1.% + \aftergroup\scr@TestDimensionAssignTillNil + \aftergroup#1% + \else + \if #1,% + \aftergroup\scr@TestDimensionAssignTillNil + \aftergroup#1% + \else + \ifnum 0=0\if #10\else\if #11\else\if #12\else\if #13\else + \if #14\else\if #15\else\if #16\else\if #17\else + \if #18\else\if #19\else 1\fi\fi + \fi\fi\fi\fi + \fi\fi\fi\fi + \relax + \aftergroup\scr@TestDimensionAssignTillNil + \aftergroup#1% + \else + \aftergroup\scr@secondoftwoAfterNil + \aftergroup#1% + \fi + \fi + \fi + \fi + \fi + }{% + \ifstrstart{\meaning #1}{\string\char\string"}{% + \aftergroup\scr@TestDimensionAssignTillNil + }{% + \def\reserved@c{% + \aftergroup\scr@secondoftwoAfterNil + \aftergroup\@empty + }% + \@for\reserved@a:=\abovedisplayskip,\abovedisplayshortskip,% + \adjdemerits,% + \baselineskip,\belowdisplayskip,% + \belowdisplayshortskip,\binoppenalty,\boxmaxdepth,% + \brokenpenalty,% + \clubpenalty,\count,% + \dimen,\dimexpr,\doublehyphendemerits,\dp,% + \emergenystretch,\exhyphenpenalty,% + \finalhyphendemerits,% + \glueexpr,% + \hbadness,\hfuzz,\hsize,\ht,\hyphenpenalty,% + \lastskip,\lastpenalty,\linepenalty,% + \lineskip,\lineskiplimit,% + \maxdepth,\numexpr,% + \overfullrule,% + \parfillskip,\parindent,\parskip,% + \pdfpageheight,\pdfpagewidth,% + \predisplaypenalty,\pretolerance,% + \relpenalty,\widowpenalty,% + \skip,\splitmaxdepth,\splittopskip,% + \tolerance,\topskip,% + \wd,\vbadness,\vfuzz,\vsize + \do {% + \expandafter\ifstr\expandafter{\expandafter\string\reserved@a}{% + \meaning #1% + }{% + \def\reserved@c{\aftergroup\scr@TestDimensionAssignTillNil}% + }% + }% + \reserved@c + }% + \aftergroup#1% + }% + }% \endgroup } % \end{macrocode} -% \begin{macro}{\scr@ifdimensionplusminus} -% \changes{v3.12}{2013/11/05}{neu (intern)}^^A -% Hilfsmakro, ausschließlich für \cs{ifisdimension}. +% \begin{macro}{\scr@TestDimenionAssignTillNil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Das durch \cs{@nil} begrenzte Argument wird einer temporären Länge +% zugewiesen. Wird dabei das Argument komplett aufgebraucht, so wird das +% erste Argument nach \cs{@nil} ausgeführt, sonst das zweite. Das begrenzte +% Argument wird in jedem Fall komplett aufgebraucht. % \begin{macrocode} -\newcommand*{\scr@ifdimensionplusminus}{} -\def\scr@ifdimensionplusminus#1#2\@nil{% - \def\scr@next{\scr@ifdimensionplusminus #2\@nil}% - \if #1-\relax - \else \if #1+\relax - \else - \def\scr@next{% - \afterassignment\scr@ifrelax@to@nnil - \@tempdima=#1#2\@nnil - }% - \if #1,\else\if #1.\else - \if #10\else\if #11\else\if #12\else\if #13\else\if #14\else - \if #15\else\if #16\else\if #17\else\if #18\else\if #19\else - \let\scr@next\@secondoftwo - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi\fi - \fi - \fi - \scr@next +\newcommand*\scr@TestDimensionAssignTillNil{} +\def\scr@TestDimensionAssignTillNil#1\@nil{% + \begingroup + \afterassignment\scr@AfterEndGroupIfArgIsRelaxTillptNnil + \@tempdima=#1pt\@nnil +} +% \end{macrocode} +% \begin{macro}{\scr@IfAfterEndgroupArgIsRelaxTillptNnil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% \begin{macro}{\scr@IfArgIsRelaxAfterRelaxTillptNnil} +% \changes{v3.20}{2015/10/19}{neu (intern)} +% Die Hilfsmakros lesen ein durch \cs{@nnil} begrenztes Argument. Falls dieses +% Argument nur aus einer Folge von \cs{relax} besteht, wird das erste Argument +% nach \cs{@nnil} ausgeführt, sonst das zweite. +% \begin{macrocode} +\newcommand*\scr@AfterEndGroupIfArgIsRelaxTillptNnil{} +\def\scr@AfterEndGroupIfArgIsRelaxTillptNnil#1\@nnil{% + \endgroup + \ifstr{\detokenize{#1}}{\detokenize{pt}}{\@firstoftwo}{% + \ifstrstart{\detokenize{#1}}{\detokenize{\relax}}{% + \scr@IfArgIsRelaxAfterRelaxTillptNnil #1\@nnil + }{\@secondoftwo}% + }% +} +\newcommand*\scr@IfArgIsRelaxAfterRelaxTillptNnil{} +\def\scr@IfArgIsRelaxAfterRelaxTillptNnil \relax#1pt\@nnil{% + \ifstr{\detokenize{#1}}{\detokenize{pt}}{\@firstoftwo}{% + \ifstrstart{\detokenize{#1}}{\detokenize{\relax}}{% + \scr@IfArgIsRelaxAfterRelaxTillptNnil #1\@nnil + }{\@secondoftwo}% + }% } %</base> % \end{macrocode} -% \end{macro} -% \end{macro} +% \end{macro}^^A \scr@IfArgIsRelaxAfterRelaxTillptNnil +% \end{macro}^^A \scr@IfArgIsRelaxTillptNnil +% \end{macro}^^A \scr@DimensionSkipAssignTillNil +% \end{macro}^^A \scr@ifisdimension +% \end{macro}^^A \ifisdimension +% % % \begin{macro}{\ifisglue} % \changes{v3.12}{2013/11/05}{neu}^^A % \changes{v3.12a}{2014/01/24}{Leerzeichenfehler korrigiert}^^A -% Falls die Expansion des ersten Arguments eine (positive oder negative) -% Ausdehnung ist, wird das zweite Argument ausgeführt, sonst das dritte. Es sei -% darauf hingewiesen, dass derzeit ungültige oder fehlende Einheiten eine -% Fehlermeldung bewirken! +% \changes{v3.20}{2015/10/21}{Reimplementierung}^^A +% Falls die stufenweise Expansion des ersten Arguments eine (positive oder +% negative) Länge mit Leim ist, wird das zweite Argument ausgeführt, sonst das +% dritte. % \begin{macrocode} %<*base> \newcommand*{\ifisglue}[1]{% + \IfArgIsEmpty{#1}{\@secondoftwo}{\scr@ifisglue#1\@nil}% +} +% \end{macrocode} +% \begin{macro}{\scr@ifisglue} +% \changes{v3.20}{2015/10/21}{neu (intern)} +% Eigentlich wäre dieses Hilfsmakro extrem aufwändig, da Leim recht +% komplex aufgebaut sein darf. Ich habe aber beschlossen, hier mit einer +% Heuristik zu Werke zu gehen: Wenn das Argument mit einer beliebigen Anzahl +% Vorzeichen, gefolgt von max. einem Punkt, Komma oder einer Ziffer oder +% gefolgt einem der für Leim zulässigen Primitiv beginnt, dann probieren wir +% eine Zuweisung. Ist diese syntaktisch nicht korrekt, kann ein Fehler die +% Folge sein. Das mag unschön sein, vereinfacht den Test aber erheblich! +% \begin{macrocode} +\newcommand*{\scr@ifisglue}[1]{% \begingroup - \edef\reserved@a{#1\relax}\expandafter - \scr@ifglueplusminus\reserved@a\@nil{\aftergroup\@firstoftwo}% - {\aftergroup\@secondoftwo}% + \ifstrstart{\meaning #1}{\detokenize{macro:}}{% + \aftergroup\expandafter\aftergroup\scr@ifisglue\aftergroup#1% + }{% + \ifstrstart{\meaning #1}{\detokenize{the character}}{% + \if #1-\aftergroup\scr@ifisglue + \else + \if #1-\aftergroup\scr@ifisdimension + \else + \if #1.% + \aftergroup\scr@TestGlueAssignTillNil + \aftergroup#1% + \else + \if #1,% + \aftergroup\scr@TestGlueAssignTillNil + \aftergroup#1% + \else + \ifnum 0=0\if #10\else\if #11\else\if #12\else\if #13\else + \if #14\else\if #15\else\if #16\else\if #17\else + \if #18\else\if #19\else 1\fi\fi + \fi\fi\fi\fi + \fi\fi\fi\fi + \relax + \aftergroup\scr@TestGlueAssignTillNil + \aftergroup#1% + \else + \aftergroup\scr@secondoftwoAfterNil + \aftergroup#1% + \fi + \fi + \fi + \fi + \fi + }{% + \ifstrstart{\meaning #1}{\string\char\string"}{% + \aftergroup\scr@TestGlueAssignTillNil + }{% + \def\reserved@c{% + \aftergroup\scr@secondoftwoAfterNil + \aftergroup\@empty + }% + \@for\reserved@a:=\abovedisplayskip,\abovedisplayshortskip,% + \adjdemerits,% + \baselineskip,\belowdisplayskip,% + \belowdisplayshortskip,\binoppenalty,\boxmaxdepth,% + \brokenpenalty,% + \clubpenalty,\count,% + \dimen,\dimexpr,\doublehyphendemerits,\dp,% + \emergenystretch,\exhyphenpenalty,% + \finalhyphendemerits,% + \glueexpr,% + \hbadness,\hfuzz,\hsize,\ht,\hyphenpenalty,% + \lastskip,\lastpenalty,\linepenalty,% + \lineskip,\lineskiplimit,% + \maxdepth,\numexpr,% + \overfullrule,% + \parfillskip,\parindent,\parskip,% + \pdfpageheight,\pdfpagewidth,% + \predisplaypenalty,\pretolerance,% + \relpenalty,\widowpenalty,% + \skip,\splitmaxdepth,\splittopskip,% + \tolerance,\topskip,% + \wd,\vbadness,\vfuzz,\vsize + \do {% + \expandafter\ifstr\expandafter{\expandafter\string\reserved@a}{% + \meaning #1% + }{% + \def\reserved@c{\aftergroup\scr@TestGlueAssignTillNil}% + }% + }% + \reserved@c + }% + \aftergroup#1% + }% + }% \endgroup } % \end{macrocode} -% \begin{macro}{\scr@ifglueplusminus} -% \changes{v3.12}{2013/11/05}{neu (intern)}^^A -% Hilfsmakro, ausschließlich für \cs{ifisglue}. +% \begin{macro}{\scr@TestGlueAssignTillNil} +% \changes{v3.20}{2015/10/21}{neu (intern)} +% Das durch \cs{@nil} begrenzte Argument wird einer temporären Länge +% zugewiesen. Wird dabei das Argument komplett aufgebraucht, so wird das +% erste Argument nach \cs{@nil} ausgeführt, sonst das zweite. Das begrenzte +% Argument wird in jedem Fall komplett aufgebraucht. % \begin{macrocode} -\newcommand*{\scr@ifglueplusminus}{} -\def\scr@ifglueplusminus#1#2\@nil{% - \def\scr@next{\scr@ifglueplusminus #2\@nil}% - \if #1-\relax - \else \if #1+\relax - \else - \def\scr@next{% - \afterassignment\scr@ifrelax@to@nnil - \@tempskipa=#1#2\@nnil - }% - \if #1,\else\if #1.\else - \if #10\else\if #11\else\if #12\else\if #13\else\if #14\else - \if #15\else\if #16\else\if #17\else\if #18\else\if #19\else - \let\scr@next\@secondoftwo - \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi - \fi\fi - \fi - \fi - \scr@next +\newcommand*\scr@TestGlueAssignTillNil{} +\def\scr@TestGlueAssignTillNil#1\@nil{% + \begingroup + \afterassignment\scr@AfterEndGroupIfArgIsRelaxTillptNnil + \@tempskipa=#1pt\@nnil } %</base> % \end{macrocode} -% \end{macro} -% \end{macro} +% \end{macro}^^A \scr@TestGlueAssignTillNil +% \end{macro}^^A \scr@ifisglue +% \end{macro}^^A \ifisglue % % % \begin{macro}{\ifnumber} @@ -2128,17 +2586,48 @@ \ifx\scr@key@name\space\else \scr@ifundefinedorrelax{KV@#2@\scr@key@name}{% \scr@ifundefinedorrelax{KV@#2#1@\scr@key@name}{% - \PackageError{scrbase}{% - unknown option - `\expandafter\detokenize\expandafter{\scr@key@atlist}'% +% \end{macrocode} +% \changes{v3.20}{2015/11/18}{Besondere Behandlung der +% \texttt{@else@}-Option}^^A +% Es existiert zwar weder eine Familienoption noch eine Mitgliedsoption, aber +% vielleicht existiert ja die Spezialoption \texttt{@else@}, die in einem +% solchen Fall die eigentliche Option als Wert erhält. +% \begin{macrocode} + \scr@ifundefinedorrelax{KV@#2#1@@else@}{% + \PackageError{scrbase}{% + unknown option + `\expandafter\detokenize\expandafter{\scr@key@atlist}'% + }{% + Member `#1' of family `#2'\MessageBreak + cannot handle option `\scr@key@name'.\MessageBreak + So it cannot be set% + \ifx\scr@key@value\@empty\else + \space to value + `\expandafter\detokenize\expandafter{\scr@key@value}'% + \fi.% + }% }{% - Member `#1' of family `#2'\MessageBreak - cannot handle option `\scr@key@name'.\MessageBreak - So it cannot be set% - \ifx\scr@key@value\@empty\else - \space to value - `\expandafter\detokenize\expandafter{\scr@key@value}'% - \fi.% + \scr@execute@elseoption{#2#1}% +% \end{macrocode} +% Im Gegensatz zu anderen Optionen bedeuten bei der \texttt{@else@}-Option +% alle von \cs{FamilyKeyStateProcessed} abweichenden Ergebnisse, dass die +% Option nicht korrekt verarbeitet werden konnte und deshalb die ursprüngliche +% Option als Fehler zu melden ist. +% \begin{macrocode} + \ifx\FamilyKeyState\FamilyKeyStateProcessed\else + \PackageError{scrbase}{% + unknown option + `\expandafter\detokenize\expandafter{\scr@key@atlist}'% + }{% + Member `#1' of family `#2'\MessageBreak + cannot handle option `\scr@key@name'.\MessageBreak + So it cannot be set% + \ifx\scr@key@value\@empty\else + \space to value + `\expandafter\detokenize\expandafter{\scr@key@value}'% + \fi.% + }% + \fi }% }{% \scr@execute@option{#2#1}% @@ -2146,7 +2635,20 @@ }{% \scr@execute@option{#2}% \ifstr{#1}{}{}{% - \scr@ifundefinedorrelax{KV@#2#1\scr@key@name}{}{% +% \end{macrocode} +% \changes{v3.20}{2015/11/18}{Memberoptionstest nach Familyoptionsausführung +% korrigiert}^^A +% Auch wenn eine Familienoption ausgeführt wurde, muss eine existierende +% Mitgliederoption ggf. noch ausgeführt werden. Existiert sie nicht, wird +% ebenfalls eine existierende \texttt{@else@}-Option ausgeführt. Allerdings +% führen in diesem Fall von \cs{FamilyKeyStateProcessed} abweichende +% Ergebnisse nicht zu einer Fehlermeldung. +% \begin{macrocode} + \scr@ifundefinedorrelax{KV@#2#1@\scr@key@name}{% + \scr@ifundefinedorrelax{KV@#2#1@@else@}{}{% + \scr@execute@elseoption{#2#1}% + }% + }{% \ifx\FamilyKeyState\FamilyKeyStateProcessed \scr@execute@option{#2#1}% \FamilyKeyStateProcessed @@ -2385,7 +2887,7 @@ \noexpand\let\noexpand\KV@err\noexpand\scr@KV@err \noexpand\setkeys{#1}{% \unexpanded\expandafter{\scr@key@atlist}}% - \noexpand\def\noexpand\scr@key@atlist{% + \noexpand\def\noexpand\scr@key@atlist{% \unexpanded\expandafter{\scr@key@atlist}}% \noexpand\def\noexpand\scr@key@name{% \unexpanded\expandafter{\scr@key@name}}% @@ -2445,8 +2947,37 @@ % \begin{macrocode} \newcommand*{\scr@key@run@errors}{} % \end{macrocode} -% \end{macro} +% \end{macro}^^A \scr@key@run@errors} % \end{macro}^^A \scr@execute@option +% \begin{macro}{\scr@execute@elseoption} +% \changes{v3.20}{2015/11/18}{neu (intern)} +% Ist eine Spezialoption mit dem Namen \texttt{@else@} definiert, so wird +% diese von \cs{FamilyExecuteOptions} genau dann ausgeführt, wenn keine +% passende Option gefunden wurde. Dafür dient dieses Makro, dessen Argumente +% und Aufrufstatus genau \cs{scr@execute@option} entspricht. Es soll auch +% genau dasselbe tun, außer dass es nicht die Option selbst aufruft, sondern +% die Option als Wert an die \texttt{@else@}-Option übergibt. Es muss also +% temporär \cs{scr@key@atlist}, \cs{scr@key@name} und \cs{scr@key@value} +% geändert werden, bevor \cs{scr@execute@option} ausgeführt wird. +% \begin{macrocode} +\newcommand*{\scr@execute@elseoption}[1]{% + \protected@edef\reserved@a{% + \noexpand\def\noexpand\scr@key@name{@else@}% + \noexpand\def\noexpand\scr@key@value{% + \unexpanded\expandafter{\scr@key@atlist}}% + \noexpand\def\noexpand\scr@key@atlist{% + @else@={\unexpanded\expandafter{\scr@key@atlist}}}% + \noexpand\scr@execute@option{#1}% + \noexpand\def\noexpand\scr@key@atlist{ + \unexpanded\expandafter{\scr@key@atlist}}% + \noexpand\def\noexpand\scr@key@name{% + \unexpanded\expandafter{\scr@key@name}}% + \noexpand\def\noexpand\scr@key@value{% + \unexpanded\expandafter{\scr@key@value}}% + }\reserved@a +} +% \end{macrocode} +% \end{macro}^^A \scr@execute@elseoption % \begin{macro}{\ifscr@key@found@} % \changes{v2.97c}{2007/04/19}{Neuer Schalter (intern)}^^A % \changes{v3.00}{2008/04/30}{umbenannt von \cs{ifKOMA@key@found}} @@ -2667,7 +3198,104 @@ }% %</base> % \end{macrocode} -% \end{macro} +% \end{macro}^^A \l@addto@macro +% +% \begin{macro}{\l@addto@macro@a} +% \changes{v3.20}{2015/11/20}{neu (intern)} +% So eine ähnliche Anweisung benötige ich außerdem für den Fall, dass eine +% Anweisung erweitert werden soll, die genau ein obligatorisches Argument +% benötigt. Achtung! Diese Anweisung funktioniert deutlich weniger allgemein +% als \cs{l@addto@macro} und wird deshalb nie offiziell dokumentiert! +% \begin{macrocode} +%<*base> +\begingroup + \catcode`\^^A=\catcode`\# + \@makeother\# + \gdef\l@addto@macro@a^^A1{% + \begingroup + \@makeother\# + \def\l@addto@macro@a@cmd{^^A1}% + \l@addto@macro@a@ + } + \gdef\l@addto@macro@a@^^A1{% + \def\l@addto@macro@a@add{^^A1}% + \l@addto@macro@a@@ + } +\endgroup +\begingroup + \@makeother\# + \gdef\l@addto@macro@a@@{% + \@makeother\# + \edef\reserved@a{% + \detokenize{\endgroup\def}% + \detokenize\expandafter{\l@addto@macro@a@cmd#1}% + {% + \expandafter\detokenize% + \expandafter\expandafter\expandafter{\l@addto@macro@a@cmd{#1}}% + \expandafter\detokenize\expandafter{\l@addto@macro@a@add}% + }% + }% + \expandafter\scantokens\expandafter{\reserved@a}% + }% +\endgroup +%</base> +% \end{macrocode} +% \end{macro}^^A \l@addto@macro@a +% +% \begin{macro}{\l@preto@macro} +% \changes{v3.20}{2015/11/25}{neu (intern)}^^A +% In gewisser Weise das gleiche wie \cs{l@appto@macro}, allerdings wird vorn +% statt hinten angefügt. +% \begin{macrocode} +%<*base> +\newcommand\l@preto@macro[2]{% + \edef#1{\unexpanded{#2}\unexpanded\expandafter{#1}}% +}% +%</base> +% \end{macrocode} +% \end{macro}^^A \l@preto@macro +% +% \begin{macro}{\l@preto@macro@a} +% \changes{v3.20}{2015/11/25}{neu (intern)} +% So eine ähnliche Anweisung benötige ich außerdem für den Fall, dass eine +% Anweisung erweitert werden soll, die genau ein obligatorisches Argument +% benötigt. Achtung! Diese Anweisung funktioniert deutlich weniger allgemein +% als \cs{l@preto@macro} und wird deshalb nie offiziell dokumentiert! +% \begin{macrocode} +%<*base> +\begingroup + \catcode`\^^A=\catcode`\# + \@makeother\# + \gdef\l@preto@macro@a^^A1{% + \begingroup + \@makeother\# + \def\l@preto@macro@a@cmd{^^A1}% + \l@preto@macro@a@ + } + \gdef\l@preto@macro@a@^^A1{% + \def\l@preto@macro@a@add{^^A1}% + \l@preto@macro@a@@ + } +\endgroup +\begingroup + \@makeother\# + \gdef\l@preto@macro@a@@{% + \@makeother\# + \edef\reserved@a{% + \detokenize{\endgroup\def}% + \detokenize\expandafter{\l@preto@macro@a@cmd#1}% + {% + \expandafter\detokenize\expandafter{\l@preto@macro@a@add}% + \expandafter\detokenize% + \expandafter\expandafter\expandafter{\l@preto@macro@a@cmd{#1}}% + }% + }% + \expandafter\scantokens\expandafter{\reserved@a}% + }% +\endgroup +%</base> +% \end{macrocode} +% \end{macro}^^A \l@preto@macro@a % % \begin{macro}{\KOMAoption} % \changes{v2.98c}{2008/03/12}{Neue Anweisung}^^A @@ -2825,6 +3453,8 @@ % \changes{v3.12}{2013/11/05}{neu}^^A % \changes{v3.15}{2014/12/03}{er wird ein (optionaler) Säumniswert % unterstützt}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % Dieses Makro definiert einen Schlüssel, der einen \LaTeX-Zähler an Hand % des Wertes setzt. Das erste, optionale Argument ist das Familienmitglied, % das zweite, obligatorische Argument ist die Familie, das dritte der Name @@ -2837,7 +3467,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyCounterKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@@Counter@@Key{#1}{#2}{#3}}% {\Family@Counter@Key{#1}{#2}{#3}}% } @@ -2860,15 +3490,26 @@ % Name des \LaTeX-Zählers, das vierte schließlich der gewünschte Wert. % \begin{macrocode} \newcommand*{\FamilySetCounter}[4]{% - \ifiscount{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifisdimen{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifisskip{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifisnumexpr{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifisdimexpr{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifisinteger{#4}{\value{#3}=#4\FamilyKeyStateProcessed}{% - \ifiscounter{#4}{\value{#3}=\value{#4}\FamilyKeyStateProcessed}{% - \FamilyUnknownKeyValue{#1}{#2}{#4}{% - integer numbers, counters, lengths, skips, dimens + \begingroup + \protected@edef\reserved@a{#4}% + \def\reserved@b{\endgroup\value{#3}=#4 \FamilyKeyStateProcessed}% + \expandafter\ifiscount\expandafter{\reserved@a}{}{% + \expandafter\ifisdimen\expandafter{\reserved@a}{}{% + \expandafter\ifisskip\expandafter{\reserved@a}{}{% + \expandafter\ifisnumexpr\expandafter{\reserved@a}{}{% + \expandafter\ifisdimexpr\expandafter{\reserved@a}{}{% + \expandafter\ifisinteger\expandafter{\reserved@a}{}{% + \expandafter\ifiscounter\expandafter{\reserved@a}{% + \def\reserved@b{% + \endgroup\value{#3}=\value{#4}\FamilyKeyStateProcessed + }% + }{% + \def\reserved@b{% + \endgroup + \FamilyUnknownKeyValue{#1}{#2}{#4}{% + integer numbers, counters, lengths, skips, dimens + }% + }% }% }% }% @@ -2876,7 +3517,7 @@ }% }% }% - }% + \reserved@b } %</base> % \end{macrocode} @@ -2899,6 +3540,8 @@ % \cs{FamilyKeyStateProcessed}}^^A % \changes{v3.18a}{2015/07/06}{korrekte Verwendung von % \cs{FamilyKeyStateProcessed}}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % Diese Anweisung arbeitet fast wie \cs{FamilySetCounter}, allerdings wird % nicht ein Zähler gesetzt, sondern ein Makro auf einen Wert definiert. Dabei % ist das erste Argument die Familie, das zweite der Name des Schlüssels, das @@ -2910,7 +3553,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyCounterMacroKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@@Counter@@Macro@@Key{#1}{#2}{#3}}% {\Family@Counter@Macro@Key{#1}{#2}{#3}}% } @@ -2925,28 +3568,28 @@ } \newcommand*{\FamilySetCounterMacro}[4]{% \begingroup - \ifiscount{#4}{\@tempcnta=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisdimen{#4}{\@tempcnta=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisskip{#4}{\@tempcnta=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisnumexpr{#4}{\@tempcnta=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisdimexpr{#4}{\@tempcnta=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisinteger{#4}{% - \@tempcnta=#4\aftergroup\FamilyKeyStateProcessed - }{% - \ifiscounter{#4}{% - \@tempcnta=\value{#4}\FamilyKeyStateProcessed}{% - \FamilyUnknownKeyValue{#1}{#2}{#4}{% - integer numbers, counters, lengths, skips, dimens - }% - }% - }% - }% - }% +% \end{macrocode} +% An dieser Stelle wird nun der immer definierte Zähler page als lokaler +% Zähler verwendet. Das ist nur möglich, weil \cs{FamilySetCounter} nicht +% global mit \cs{setcounter} arbeitet, sondern lokal mit einer Zuweisung an +% \cs{value}. +% \begin{macrocode} + \FamilySetCounter{#1}{#2}{page}{#4}% + \ifx\FamilyKeyState\FamilyKeyStateProcessed + \edef\reserved@a{% + \unexpanded{\endgroup\def#3}% + {\the\value{page}}% + \noexpand\FamilyKeyStateProcessed + }% + \else + \def\reserved@a{% + \endgroup + \FamilyUnknownKeyValue{#1}{#2}{#4}{% + integer numbers, counters, lengths, skips, dimens }% }% - }% - \expandafter\expandafter\expandafter\endgroup - \expandafter\def\expandafter#3\expandafter{\the\@tempcnta}% + \fi + \reserved@a } %</base> % \end{macrocode} @@ -2959,6 +3602,8 @@ % \changes{v3.12}{2013/11/05}{neu}^^A % \changes{v3.15}{2014/12/03}{er wird ein (optionaler) Säumniswert % unterstützt}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % Dieses Makro definiert einen Schlüssel, der eine \LaTeX-Länge an Hand % des Wertes setzt. Das erste, optionale Argument ist das Familienmitglied, % das zweite, obligatorische Argument ist die Familie, das dritte der Name @@ -2970,7 +3615,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyLengthKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@@Length@@Key{#1}{#2}{#3}}% {\Family@Length@Key{#1}{#2}{#3}}% } @@ -2989,21 +3634,36 @@ % \changes{v3.15}{2015/01/02}{\cs{ifglueexpr} hinzugefügt}^^A % \changes{v3.18a}{2015/07/06}{korrekte Verwendung von % \cs{FamilyKeyStateProcessed}}^^A +% \changes{v3.20}{2016/04/27}{Expansion vor dem Test}^^A % Über diese Anweisung wird der Wert dann gesetzt. Dabei ist das erste % Argument die Familie, das zweite der Name des Schlüssels, das dritte der % Name der \LaTeX-Länge, das vierte schließlich der gewünschte Wert. % \begin{macrocode} \newcommand*{\FamilySetLength}[4]{% - \ifiscount{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisdimen{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisskip{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisnumexpr{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisdimexpr{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisglueexpr{#4}{#3=#4\FamilyKeyStateProcessed}{% - \ifisglue{#4}{#3=#4\FamilyKeyStateProcessed}{% - \FamilyUnknownKeyValue{#1}{#2}{#4}{% - length values, counters, lengths, skips, dimens - }% + \begingroup + \protected@edef\reserved@a{#4}% + \expandafter\ifiscount\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisdimen\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisskip\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisnumexpr\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisdimexpr\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisglueexpr\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \expandafter\ifisglue\expandafter{\reserved@a}{% + \aftergroup\@firstoftwo + }{% + \aftergroup\@secondoftwo }% }% }% @@ -3011,6 +3671,13 @@ }% }% }% + \endgroup + {#3=#4\FamilyKeyStateProcessed}% + {% + \FamilyUnknownKeyValue{#1}{#2}{#4}{% + length values, counters, lengths, skips, dimens + }% + }% } %</base> % \end{macrocode} @@ -3030,8 +3697,11 @@ % \changes{v3.15}{2015/01/02}{\cs{ifglueexpr} hinzugefügt}^^A % \changes{v3.18a}{2015/07/06}{korrekte Verwendung von % \cs{FamilyKeyStateProcessed}}^^A -% Diese Anweisungen arbeitet fast wie \cs{FamilyCounterKey} und -% \cs{FamilySetCounter}, allerdings wird nicht ein Zähler gesetzt, sondern +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} ersetzt durch +% \cs{kernel@ifnextchar}}^^A +% \changes{v3.20}{2016/04/27}{interne Verwendung von \cs{FamilySetLength}}^^A +% Diese Anweisungen arbeitet fast wie \cs{FamilyLengthKey} und +% \cs{FamilySetLengt}, allerdings wird nicht eine Länge gesetzt, sondern % ein Makro auf einen Wert definiert. Dabei ist das erste Argument die % Familie, das zweite der Name des Schlüssels, das dritte das Makro, das % vierte schließlich der gewünschte Wert. @@ -3042,7 +3712,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyLengthMacroKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@@Length@@Macro@@Key{#1}{#2}{#3}}% {\Family@Length@Macro@Key{#1}{#2}{#3}}% } @@ -3057,31 +3727,81 @@ } \newcommand*{\FamilySetLengthMacro}[4]{% \begingroup - \ifiscount{#4}{\@tempskipa=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisdimen{#4}{\@tempskipa=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisskip{#4}{\@tempkipa=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisnumexpr{#4}{\@tempskipa=#4\aftergroup\FamilyKeyStateProcessed}{% - \ifisdimexpr{#4}{% - \@tempskipa=#4\aftergroup\FamilyKeyStateProcessed - }{% - \ifisglueexpr{#4}{% - \@tempskipa=#4\aftergroup\FamilyKeyStateProcessed - }{% - \ifisglue{#4}{% - \@tempskipa=#4\aftergroup\FamilyKeyStateProcessed - }{% - \FamilyUnknownKeyValue{#1}{#2}{#4}{% - length values, counters, lengths, skips, dimens - }% - }% - }% - }% - }% + \FamilySetLength{#1}{#2}{\@tempskipa}{#4}% + \ifx\FamilyKeyState\FamilyKeyStateProcessed + \edef\reserved@a{% + \unexpanded{\endgroup\def#3}% + {\the\@tempskipa}% + \noexpand\FamilyKeyStateProcessed + }% + \else + \def\reserved@a{% + \endgroup + \FamilyUnknownKeyValue{#1}{#2}{#4}{% + length values, counters, lengths, skips, dimens }% }% - }% - \expandafter\expandafter\expandafter\endgroup - \expandafter\def\expandafter#3\expandafter{\the\@tempskipa}% + \fi + \reserved@a +} +%</base> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\FamilyUseLengthMacroKey} +% \changes{v3.20}{2016/04/27}{neu}^^A +% \begin{macro}{\FamilySetLengthMacro} +% \changes{v3.20}{2016/04/27}{neu}^^A +% Diese Anweisungen arbeitet fast wie \cs{FamilyLengthKey} und +% \cs{FamilySetLengt}, allerdings wird das Makro nicht als den Wert des Werts, +% sondern als den Wert selbst definiert. Eine Expansion des Werts findet nur +% für die Prüfung statt. Änderungen am Wert wirken sich also ggf. weiterhing +% aus. Dabei ist das erste Argument die Familie, das zweite der Name des +% Schlüssels, das dritte das Makro, das vierte schließlich der gewünschte +% Wert. +% \begin{macro}{\Family@@UseLength@@Macro@@Key} +% \changes{v3.20}{2016/04/27}{neu (intern)}^^A +% \begin{macro}{\Family@USeLength@Macro@Key} +% \changes{v3.20}{2016/04/27}{neu (intern)}^^A +% \begin{macrocode} +%<*base> +\newcommand*{\FamilyUseLengthMacroKey}[3][.\@currname.\@currext]{% + \kernel@ifnextchar [%] + {\Family@@UseLength@@Macro@@Key{#1}{#2}{#3}}% + {\Family@UseLength@Macro@Key{#1}{#2}{#3}}% +} +\newcommand*{\Family@@UseLength@@Macro@@Key}{} +\def\Family@@UseLength@@Macro@@Key#1#2#3[#4]#5{% + \ifdefined#5\else\let#5\z@\fi + \DefineFamilyKey[{#1}]{#2}{#3}[{#4}]{% + \FamilySetUseLengthMacro{#2}{#3}{#5}{##1}% + }% +} +\newcommand*{\Family@UseLength@Macro@Key}[4]{% + \ifdefined#4\else\let#4\z@\fi + \DefineFamilyKey[{#1}]{#2}{#3}{\FamilySetUseLengthMacro{#2}{#3}{#4}{##1}}% +} +\newcommand*{\FamilySetUseLengthMacro}[4]{% + \begingroup + \FamilySetLength{#1}{#2}{\@tempskipa}{#4}% + \ifx\FamilyKeyState\FamilyKeyStateProcessed + \def\reserved@a{% + \endgroup\def#3{#4}% + \FamilyKeyStateProcessed + }% + \else + \def\reserved@a{% + \endgroup + \FamilyUnknownKeyValue{#1}{#2}{#4}{% + length values, counters, lengths, skips, dimens + }% + }% + \fi + \reserved@a } %</base> % \end{macrocode} @@ -3093,6 +3813,8 @@ % % \begin{macro}{\FamilyNumericalKey} % \changes{v3.00}{2008/04/30}{Neue Anweisung}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % \begin{macro}{\Family@Numerical@Key} % \changes{v3.00}{2008/05/28}{Neu (intern)}^^A % \changes{v3.08b}{2011/03/31}{fehlendes Argument bei \cs{ifundefined}} @@ -3113,7 +3835,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyNumericalKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@Numerical@Key{#1}{#2}{#3}}{\Family@Numerical@Key{#1}{#2}{#3}[]}% } \newcommand*{\Family@Numerical@Key}{} @@ -3175,6 +3897,10 @@ % \changes{v3.02c}{2009/02/04}{definiert ebenfalls das Familienmitglied}^^A % \changes{v3.17}{2015/03/16}{neu implementiert mit Speicherung der % Werte und optionalem erstem Argument}^^A +% \begin{macro}{\KOMA@@ncmdkey} +% \changes{v3.17}{2015/03/16}{neu (intern)}^^A +% \begin{macro}{\KOMA@@@ncmdkey} +% \changes{v3.17}{2015/03/16}{neu (intern)}^^A % Wie \cs{FamilyNumericalKey} mit zwei entscheidenden Unterschieden: % \begin{itemize} % \item Die Familien ist immer \texttt{KOMA} und entfällt daher als zweites @@ -3191,10 +3917,10 @@ \expandafter\endgroup\reserved@a } \newcommand*{\KOMA@@ncmdkey}[2]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\KOMA@@@ncmdkey{#1}{#2}}{\KOMA@@@ncmdkey{#1}{#2}[]} } -\newcommand*{\KOMA@@@cmdkey}{} +\newcommand*{\KOMA@@@ncmdkey}{} \def\KOMA@@@ncmdkey#1#2[#3]#4#5{% \@ifundefined{#4}{\@namedef{#4}{0}}{}% \ifx\relax#3\relax @@ -3224,12 +3950,16 @@ % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} +% \end{macro} % % % \begin{macro}{\FamilyStringKey} % \changes{v3.08}{2010/11/05}{Neue Anweisung}^^A % \changes{v3.08b}{2011/03/31}{\cs{Family@String@Key} und -% \cs{Family@@String@@Key} vertauscht} +% \cs{Family@@String@@Key} vertauscht}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % \begin{macro}{\Family@String@Key} % \changes{v3.08}{2010/11/05}{Neu (intern)}^^A % \begin{macro}{\Family@@String@@Key} @@ -3246,7 +3976,7 @@ % \begin{macrocode} %<*base> \newcommand*{\FamilyStringKey}[3][.\@currname.\@currext]{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\Family@@String@@Key{#1}{#2}{#3}}{\Family@String@Key{#1}{#2}{#3}}% } \newcommand*{\Family@@String@@Key}{} @@ -3265,6 +3995,8 @@ % % \begin{macro}{\KOMA@DeclareDeprecatedOption} % \changes{v3.01a}{2008/11/20}{neu (intern)}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % \begin{macro}{\KOMA@@DeclareDeprecatedOption} % \changes{v3.01a}{2008/11/20}{neu (intern)}^^A % \begin{macro}{\KOMA@@@DeclareDeprecatedOption} @@ -3278,7 +4010,7 @@ % \begin{macrocode} %<*koma> \newcommand*{\KOMA@DeclareDeprecatedOption}{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\KOMA@@DeclareDeprecatedOption}% {\KOMA@@@DeclareDeprecatedOption{\ClassWarningNoLine{\KOMAClassName}}}% } @@ -3316,11 +4048,15 @@ You've used obsolete option `#2'.\noexpand\MessageBreak Usage of this option indicates an old document\noexpand\MessageBreak and changes compatibility level using\noexpand\MessageBreak - `#3,version=first'.\noexpand\MessageBreak + `#3,version=first,\noexpand\MessageBreak + enabledeprecatedfontcommands' that may result\noexpand\MessageBreak + in further warnings.\noexpand\MessageBreak If you don't want this, you should simply\noexpand\MessageBreak replace option `#2' by `#3'% }% - \noexpand\KOMAExecuteOptions{#3,version=first}% + \noexpand\KOMAExecuteOptions{% + #3,version=first}% + \noexpand\ExecuteOptions{enabledeprecatedfontcommands}% \noexpand\def\noexpand\CurrentOption{\CurrentOption}% }% }% @@ -3336,6 +4072,8 @@ % % \begin{macro}{\KOMA@DeclareStandardOption} % \changes{v3.01a}{2008/11/21}{neu (intern)}^^A +% \changes{v3.20}{2016/04/12}{\cs{@ifnextchar} replaced by +% \cs{kernel@ifnextchar}}^^A % \begin{macro}{\KOMA@@DeclareStandardOption} % \changes{v3.01a}{2008/11/21}{neu (intern)}^^A % \begin{macro}{\KOMA@@@DeclareStandardOption} @@ -3349,7 +4087,7 @@ % \begin{macrocode} %<*koma> \newcommand*{\KOMA@DeclareStandardOption}{% - \@ifnextchar [%] + \kernel@ifnextchar [%] {\KOMA@@DeclareStandardOption}% {\KOMA@@@DeclareStandardOption{\ClassInfoNoLine{\KOMAClassName}}}% } |