summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2016-05-11 21:26:48 +0000
committerKarl Berry <karl@freefriends.org>2016-05-11 21:26:48 +0000
commit39c10427f8eee057dc28928380060a585e1e017b (patch)
tree6750074338d5e6b808cfca3671e2ab9763c328ae /Master/texmf-dist/source/latex/koma-script/scrkernel-basics.dtx
parenta49931ca8756327265b8929a7a147045bf2b3506 (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.dtx1400
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}}}%
}