diff options
Diffstat (limited to 'macros/lollipop/tex/lollipop-tools.tex')
-rw-r--r-- | macros/lollipop/tex/lollipop-tools.tex | 1509 |
1 files changed, 0 insertions, 1509 deletions
diff --git a/macros/lollipop/tex/lollipop-tools.tex b/macros/lollipop/tex/lollipop-tools.tex deleted file mode 100644 index f7b11454b5..0000000000 --- a/macros/lollipop/tex/lollipop-tools.tex +++ /dev/null @@ -1,1509 +0,0 @@ -% lollipop-tools.tex copyright 1992/3 Victor Eijkhout -% copyright 2014--2016 Vafa Khalighi -% -% -% This program is free software: you can redistribute it and/or modify -% it under the terms of the GNU General Public License as published by -% the Free Software Foundation, either version 3 of the License, or -% (at your option) any later version. -% -% This program is distributed in the hope that it will be useful, -% but WITHOUT ANY WARRANTY; without even the implied warranty of -% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -% GNU General Public License for more details. -% -% You should have received a copy of the GNU General Public License -% along with this program. If not, see <http://www.gnu.org/licenses/>. -% -% -%% anonymous control sequences -\newif\iftempa \newif\iftempb \newif\iftempc \newif\iftempd - -\newdimen\tempdima \newdimen\tempdimb \newdimen\tempdimc - -\newskip\tempskipa \newskip\tempskipb \newskip\tempskipc - -\newcount\tempcounta \newcount\tempcountb \newcount\tempcountc - -\newbox\tempboxa \newbox\tempboxb \newbox\tempboxc \newbox\tempboxd - -\newtoks\temptoksa \newtoks\temptoksb \newtoks\temptoksc -%\newtoks\temptoksd \newtoks\temptokse \newtoks\temptoksf - -%% auxiliaries -\def\@meld#1{{\immediate\write16{\trace@prefix #1}}} -\def\Dmessage#1{\ifDiagnose \@meld{#1}\fi} -\def\Wmessage#1{\@meld{--- Warning: #1}} -\def\Emessage#1{{\errorcontextlines\m@ne - \errmessage{<><><><><><><><> #1 <><><><><><><><>}}} - -\showboxdepth=7 \showboxbreadth=20 -\newlinechar=`\^^J %nodig? - -\chardef\busje`\\ -\def\cs#1{{\tt\char\busje#1}} - -\let\xp\expandafter \let\nxp\noexpand -\let\csn\csname \let\ecs\endcsname - -% Remove or select tokens -% is used in several places -% -\long\def\id@#1{#1} -\long\def\take@former#1#2{#1} \long\def\take@latter#1#2{#2} -\long\def\take@one#1{} \long\def\take@two#1#2{} -\long\def\take@three#1#2#3{} -\long\def\keep@one#1{#1} \long\def\take@to@dollar#1${} -\def\Xignorespaces#1{#1} - -{\noesc -\xp\xp\xp\gdef\xp\xp\xp\meaning@take@zero - \xp\string\csn macro:\xp\xp\xp\xp\xp\xp\xp\ecs - \xp\xp\xp\xp\xp\xp\xp#\xp\xp\xp1\xp\string\csn->\ecs{} -}\def\real@meaning{\xp\meaning@take@zero\meaning} - -\def\first@of@three#1#2#3{#1} -\def\second@of@three#1#2#3{#2} -\def\third@of@three#1#2#3{#3} -\def\first@two@of@three#1#2#3{{#1}{#2}} - - -% Check if this file is being loaded from IniTeX, or -% by \input'ting on top of an already existing format. -% This is to avoid double definitions and major accidents. -% -\def\lollipop@name{Lollipop} -\expandafter\ifx\csname fmtname\endcsname\lollipop@name - \let\ifini\take@one - \let\ifnin\keep@one - \message{! Loading Lollipop on top of format !} -\else - \let\ifini\keep@one %iniTeX run or on top of plain TeX - \let\ifnin\take@one - \everyjob{\let\ifini\take@one\let\ifnin\keep@one} -\fi - -%%%%%%%%%%%%%%%% forward definitions -\def\new@@counter#1{\csarg\newcount{\counter@name{#1}}} -\def\counter@name#1{#1@C} - -%%%%%%%%%%%%%%%% Special characters - -% At sign -% - -\def\makeatletter{\catcode`\@=11\relax} -\def\makeatother{\catcode`\@=12\relax} - -% Catcode (re)storing -% -\def\storecat#1% - {\noesc - \csarg\edef{restorecat\string#1}% - {\catcode`\string#1= - \the\catcode\expandafter`\string#1}% - \catcode\expandafter`\string#1=12\relax - \normalesc} -\def\restorecat#1% - {\noesc - \csname restorecat\string#1\endcsname - \normalesc} - -% save writing. - -\def\@space{ }\def\@empty{} \newtoks\empty@toks \empty@toks{} -\def\sc@led{scaled} -\def\nl{\hfil\break} -\def\IniTeX{Ini\TeX} -\def\LaTeX{L\kern-.3em\raise.35ex\hbox{\script A}\kern-.1em\TeX} -\def\AmsTeX{$\cal A_MS$-\TeX} -%my old def -%\def\LamsTeX{L\kern-.2em\raise.4ex\hbox -% {$\scriptstyle\cal A$}\kern-.2em$\cal_M$\kern-.2em$\cal S\,$\TeX} -%Spivak's old def -%\def\LamSTeX{L\kern-.4em\raise.3ex\hbox{$\ssize\Cal A$}\kern-.25em -% \lower.4ex\hbox{\eightsy M}\kern-.1em{$\Cal S$}-\TeX} -\def\LamsTeX{L\kern-.4em\raise.3ex\hbox{\script$\cal A$}\kern-.25em - \lower.4ex\hbox{\script$\cal M$}\kern-.1em{$\cal S$}-\TeX} - -\def\CorporateLogo{\TeX\kern-.15em \raise.5ex\hbox{T}\kern-.25em - ECHNIQUE} - - -\hsize=15cm - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%% T O O L S %%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% Construct a control sequence inside \edef -% -\def\CSname#1{\expandafter\noexpand\csname#1\endcsname} - -% Construct a control sequence out of #2, and give it to #1 -% -\def\csarg#1#2{\expandafter#1\csname#2\endcsname} - -% Pick an escapecharacter -% this presumes that its argument is a character. -% -\def\pickescape#1{\ifnum`#1=\escapechar\else#1\fi} - -% Equality of strings. -% the fast approach: does not work in expansion-only environment. -% -\def\EqualString#1#2{00\fi\def\eqs@a{#1}\def\eqs@b{#2}% - \ifx\eqs@a\eqs@b} - -% Test by expansion only -% -\def\EqualStringX#1#2{00\fi - \csname if\@EqualStringX#1&$#2&$\endcsname} -\def\@EqualStringX#1#2$#3#4${\ifx#1#3% - \ifx#1&true\else\hop@ES\@EqualStringX#2$#4$\fi - \else false\fi} -\def\hop@ES#1\fi#2\fi{\fi\fi#1} - -% Lexicographic ordering -% note the use of \def -% also note the characters 0,127,255 that are used, -% these are not supposed to appear in the strings -% -{\catcode0=12 \catcode255=12 \catcode127=12 -\gdef\StringBeforeNC#1#2{\00\fi - \CharsBefore#1^^@^^?#2^^ff^^?} -\gdef\CharsBeforeNC#1#2^^?#3#4^^?{% - \ifcat#1\relax\def\next{\CharsBefore#2^^@^^?#3#4^^ff^^?}% - \else\ifcat#3\relax\def\next{\CharsBefore#1#2^^@^^?#4^^ff^^?}% - \else\ifnum\lccode`#1<\lccode`#3 - \def\next{\csname iftrue\endcsname}% - \else\ifnum\lccode`#1>\lccode`#3 - \def\next{\csname iffalse\endcsname}% - \else\def\next{\CharsBefore#2^^?#4^^?}% - \fi \fi \fi \fi - \next} -\gdef\StringBefore#1#2{\00\fi - \CharsBefore#1^^@^^?#2^^ff^^?} -\gdef\CharsBefore#1#2^^?#3#4^^?{% - \ifnum`#1<`#3 - \def\next{\csname iftrue\endcsname}% - \else\ifnum`#1>`#3 - \def\next{\csname iffalse\endcsname}% - \else\def\next{\CharsBefore#2^^?#4^^?}% - \fi\fi - \next} -} - - -% Null argument test -% -\def\ifempty#1{00\fi\xp\ifx\csname#1null\endcsname\null} -\def\ifEmptyX#1{\xp\ifx\csname#1null\endcsname\null} -%\def\ifEmpty#1{\def\cs@a{#1}\ifx\cs@a\empty} -\def\IsEmptyList#1{00\fi\def\cs@a{#1}\ifx\cs@a\empty} - -% Next character test -% -\def\NextChar#1#2#3{00\fi - \let\nxt@ch#1\def\nxt@a{#2}\def\nxt@b{#3}% - \futurelet\nxt@c\@ifnxtc} -\def\ifNextChar#1#2#3{% - \let\nxt@ch#1\def\nxt@a{#2}\def\nxt@b{#3}% - \futurelet\nxt@c\@ifnxtc} -\let\ifnextchar\ifNextChar -\def\@ifnxtc{\ifx\nxt@ch\nxt@c \expandafter\nxt@a - \else \expandafter\nxt@b \fi} - -% Test for defined-ness of string as control sequence. -% works inside \edef -% -%outdated: \def\ifnotdefined#1{\csarg\ifx{#1}\relax} -\def\UndefinedCS#1{00\fi\csarg\ifx{#1}\relax} - -% Define uniquely defined dummy macros, -% usually to serve as bumper blocks at the end of a list -% -\newcount\dummies -\def\NewDummy#1{ - \if\UndefinedCS{#1}\csarg\edef{#1}{dum\the\dummies} - \advance\dummies\@ne - \else - \ifini{\Wmessage{Attempt at second definition of `#1'}} - \fi} - -% string case statement -% use: \switch \iftest{...} in: -% item1 action1 -% ... -% itemn actionn -% default defaultaction [optional] -% \endswitch -% inspired by Jonathan Fine: Some Basic Control Macros -% Tugboat 12 #4 -% -\let\@fi\fi \let\endswitch\relax \NewDummy{default} -\def\switch@exit #1 \@fi #2 \endswitch {\fi #1} -\def\switch #1#2#3{\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1{#2}\switch@exit #3 \@fi - \switch {#1} -} -% this version puts the test object in {} -\def\oswitch #1 in: #2 #3; {\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1{#2}\switch@exit #3 \@fi - \switch #1 in: -} -% this version assumes that the test object is just one character -\def\cswitch #1 in: #2 #3; {\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1#2\switch@exit #3 \@fi - \cswitch #1 in: -} -% this version assumes that the test object can have an optional space -\def\bswitch #1 in: #2 #3; {\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1#2 \switch@exit #3 \@fi - \bswitch #1 in: -} -% this version can cope with significant spaces at the start of #3; -% #2 is macro argument -\def\mswitch #1 in: #2:#3; {\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1{#2}\switch@exit #3 \@fi - \mswitch #1 in: -} -% idem; #2 does not have to be enclosed in braces -\def\fswitch #1 in: #2:#3; {\csarg\ifx{#2}\default\switch@exit #3 \@fi - #1#2 \switch@exit #3 \@fi - \fswitch #1 in: -} - -% Routines for taking the value of a string: -% if the string is defined as control sequence -% take the value of that, otherwise take the string itself - -% String or value of control sequence -% -\def\w@w#1{\if\UndefinedCS{#1}#1\else \the\csname#1\endcsname\fi} - -% String or control sequence -% -\def\@ww#1{\if\UndefinedCS{#1}#1\else \csname#1\endcsname \fi} - -% String or \noexpand-ed control sequence; -% for use in \edef -% -\def\@w@w#1{\if\UndefinedCS{#1}#1\else - \ifin@label\noexpand\protect\fi \CSname{#1}\fi} -\newtoks\are@these@correct -\def\t@w@w#1{% - \if\UndefinedCS{#1}#1% - \ifdefining\append@to@list\are@these@correct{#1 }\fi - \else - \ifin@label\noexpand\protect\fi \CSname{#1}\fi} -% see below what happens to \are@these@correct - -% Allocation -% -\def\new@count#1#2{\csarg\newcount{#1}\global\set@value{#1}{#2}} -\def\new@skip#1#2{\csarg\newskip{#1}\global\set@value{#1}{#2}} -\def\new@dimen#1#2{\csarg\newdimen{#1}\global\set@value{#1}{#2}} - -% Assignment of Values -% -\def\set@value#1#2{\csname#1\endcsname #2\relax} -\def\increase@value#1#2{\advance\csname#1\endcsname #2\relax} -\def\decrease@value#1#2{\advance\csname#1\endcsname -#2\relax} - -% Hex -% -\def\hexdigit#1{\ifcase#10\or 1\or 2\or 3\or 4\or - 5\or 6\or 7\or 8\or 9\or A\or B\or C\or D\or E\or F\fi} - -% Log 10 -% -\def\LogTen#1{\switch{\ifnum#1<} - {10 }{1} {100 }{2} {1000 }{3} {10000 }{4} {default}{5} - \endswitch} - -% List Manipulation ................ -% this assumes that #1 is a list of tokens, #2 is the name of a list -% -% Names of lists (and of items to pop into) are given as strings; -% not as control sequences. -% -\newtoks\toks@lista \newtoks\toks@listb -% basic append/prepend macro -\long\def\@append@to@cslist#1#2#3{\begingroup\toks@lista=#2{#3}% - \global#1=\xp\xp\xp{\xp\the\xp#1\the\toks@lista}\endgroup} -\long\def\@prepend@to@cslist#1#2#3{\begingroup\toks@lista=#2{#3}% - \global#1=\xp\xp\xp{\xp\the\xp\toks@lista\the#1}\endgroup} -\def\@append@to@list{\csarg\@append@to@cslist} -% variations: -\long\def\append@to@list#1#2{\@append@to@list{#1}{}{#2}} -\def\append@list@to@list#1#2{% - \@append@to@list{#1}{\xp\xp\xp}{\xp\the\csn#2\ecs}} -\def\append@cslist@to@cslist#1#2{% - \@append@to@cslist{#1}\xp{\the#2}} -\def\append@toks@cs@to@list#1#2{\@append@to@list{#1}\xp{\the#2}} - -% A few list macros for the user -\def\NewList:#1 {\csarg\newtoks{#1}\global\csn#1\ecs{}} -\def\EmptyList:#1 {\global\csn#1\ecs{}} -\long\def\AppendToList:#1=#2 {\@append@to@list{#1}{}{#2}} -\def\TheList:#1 {\let\oldwbuskip\willbeunhskip \let\willbeunhskip\@empty - \if\UndefinedCS{#1}\message{List <#1> undefined} - \else\csarg\the{#1}\fi - \let\willbeunhskip\oldwbuskip} - -\def\del@tok@from@list#1#2{\begingroup - \long\def\cs@liste##1#2##2\tok@SM - {\toks@lista{##1}\toks@listb{##2}% - \edef\cs@listb{\global\CSname{#1}= - {\the\toks@lista\the\toks@listb}}% - \cs@listb}% - \edef\cs@lista{\nxp\cs@liste{}\xp\the\csn#1\ecs\nxp\tok@SM}% - \cs@lista \endgroup} -\def\in@front@of@list#1{\csarg{\let\xp\cs@lista}{#1}% - \in@front@of@cslist\cs@lista} -\long\def\in@front@of@cslist#1#2{\begingroup\toks@lista={#2}% - \global#1=\xp\xp\xp{\xp\the\xp\toks@lista \the#1}% - \endgroup} -\long\def\local@in@front@of@list#1#2{\toks@lista={#2}% - \csname#1\endcsname\xp\xp\xp\xp\xp\xp\xp - {\xp\xp\xp\the\xp\xp\xp\toks@lista - \xp\the\csname#1\endcsname}% - } -\def\set@list#1{\csarg{\let\xp\cs@lista}{#1}% - \set@cslist\cs@lista} -\long\def\set@cslist#1#2{\begingroup\toks@lista={#2}% - \global#1=\xp{\the\toks@lista}\endgroup} - -%%%%%%%%%%%%%%%% Stack macros -% -% push in terms of prepending of lists -\def\push@cs@onto@cs#1#2{\@prepend@to@cslist#1\xp{\xp\\\xp{\the#2}}} -\def\push@onto#1{\csarg\push@onto@cs{#1}} -\def\push@onto@cs#1#2{\@prepend@to@cslist#1{}{\\{#2}}} -\def\local@push@onto#1#2{\let\\=\relax - \local@in@front@of@list{#1}{\\{#2}}} -% pop via auxiliary macro: #1 is result, #2 is stack -% two cs arguments -\def\pop@cs@into#1#2{\edef\cs@e - {\nxp\@@popinto\nxp#1\nxp#2\the#2\nxp\@@pop}\cs@e} -% two string arguments -\def\pop@into#1#2{\edef\cs@e - {\nxp\@@popinto\CSname{#1}\CSname{#2}\csarg\the{#2}\nxp\@@pop}\cs@e} -\long\def\@@popinto#1#2\\#3#4\@@pop{#1{#3}#2{#4}} -\def\copy@stacktop#1#2{% - \edef\cs@e{\noexpand\@copy@stacktop - {#1}\csarg\the{#2}\noexpand\@@pop}% - \cs@e} -\def\@copy@stacktop#1\\#2#3\@@pop{\csname#1\endcsname#2\relax} -\newcount\stack@length \newtoks\empty@stack \empty@stack{\\{}} -\def\length@of@stack#1{\csarg\length@of@csstack{#1}} -\def\length@of@csstack#1{\def\\##1{\advance\stack@length\@ne}% - \stack@length\m@ne \the#1} -% turn a stack upside down -\def\invert@csstack#1{\length@of@csstack{#1}% - \tempcountb\z@ \temptoksa\empty@stack - \loop\ifnum\tempcountb<\stack@length - \pop@cs@into\temptoksb#1\advance\stack@length\m@ne - \push@cs@onto@cs\temptoksa\temptoksb -% \append@cslist@to@cslist\temptoksb\temptoksa% append a to b -% \temptoksa\temptoksb - \repeat% copy b to a - #1\temptoksa \temptoksa\empty@toks} -% invert a stack into a list -\def\x@stack@to@list#1{\length@of@stack{#1}% - \tempcountb\z@ \temptoksa\empty@toks - \loop\ifnum\tempcountb<\stack@length - \pop@into{temptoksb}{#1}\advance\stack@length\m@ne - \append@list@to@list{temptoksb}{temptoksa}\repeat - \csn#1\ecs\temptoksa \temptoksa\empty@toks} - - -% Bookkeeping and Householding lists................ -% Generic Defaults -% to be executed each time a definition starts -% -\ifini{\newtoks\generic@defaults} -\def\adds@generic@default#1{ - \append@to@list{generic@defaults}{#1}} -\def\add@generic@default#1{\ifini - {\append@to@list{generic@defaults}{#1}}} - -% Document Start Commands -% to be executed by \Start -% -\ifini{\newtoks\start@commands} -\def\add@start@command#1{\ifini - {\append@to@list{start@commands}{#1}}} -\def\adds@start@command#1{% - \append@to@list{start@commands}{#1}} - -% Document Stop Commands -% to be executed by \Stop -% -\ifini{\newtoks\stop@commands} -\def\add@stop@command#1{\ifini - {\append@to@list{stop@commands}{#1}}} -\def\adds@stop@command#1{% - \append@to@list{stop@commands}{#1}} - -% Style Start Commands -% to be executed by \StyleDefinition -% -\ifini{\newtoks\style@start@commands} -\def\add@style@start@command#1{\ifini - {\append@to@list{style@start@commands}{#1}}} - -% Style Stop Commands -% to be executed by \StyleDefinitionStop -% -\ifini{\newtoks\style@stop@commands} -\def\add@style@stop@command#1{\ifini - {\append@to@list{style@stop@commands}{#1}}} -\add@style@stop@command{\style@stop@commands{} - \style@start@commands{}} - -\def\check@existence#1{\Wmessage{Used \nxp\check@existence. Check}} -% \add@style@stop@command{\if\UndefinedCS{#1}\Wmessage -% {Some trouble involving #1; check definitions carefully!}\fi} - -%\add@style@start@command{\are@these@correct{}} -%\add@style@stop@command{\if\IsEmptyList{\the\are@these@correct}\else -% \Wmessage{Check if the following are literals: \the\are@these@correct} -% \fi} - -% Tracing -% -% if trace@all=0 and \trace@foo is >0, every \Tmessage[foo] is written. -% if \Trace:no, then all trace is disabled through \trace@all=-1 -% if \Trace:yes then all traces are written through \trace@all=1 -% by default: \trace@all=0 -% -\def\Tmessage{\ifnum\trace@all>\m@ne\xp\t@message\else\xp\del@message\fi} -\def\del@message[#1]#2{}\let\trace@prefix\@empty -\def\t@message[#1]#2{% - \ifnum\trace@all>\z@ \def\trace@prefix{[T]}\@meld{#2}% - \else\csarg\ifnum{trace@#1}>\z@ - \def\trace@prefix{[T:#1]}\@meld{#2}\fi - \fi\global\let\trace@prefix\@empty} - -\def\Trace:#1 {\switch{\if\EqualString{#1}} - {yes} {\trace@all\@ne\message{Switching ON all tracing}} - {no} {\trace@all\m@ne\message{Switching OFF all tracing}} - {default} {\if\UndefinedCS{trace@#1}\Wmessage{Strange trace: #1}\else - \csname trace@#1\endcsname\@ne \trace@all\z@ \fi} - \endswitch} -\def\NewTrace:#1 {\new@count{trace@#1}\m@ne} -\new@count{trace@all}\z@ -\NewTrace:gen % traces everything in this file -\NewTrace:def % definitions of constructs etc - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%% Generic Constructs %%%%%%%%%%%%%%%%%%%%% - -% \@GenericConstruct{Foo} = -% \newtoks\Foo@defaults -% \Foo@defaults={} -% \def\add@Foo@default#1{...} -% \def\DefineFoo#1 = -% \@FooDefaults % has to be defined explicitly -% \the\Foo@defaults % constructed cumulatively -% \@GenericDefaults % constructed cumulatively -% \@GetOptions -% \@DefineFoo % has to be defined explicitly -% \def\@FooOption ... % same syntax as \@GenericOption -% -% Options are either generic (the ones below) -% defined by \@GenericOption, -% or specific for some construct, -% defined by \@FooOption -% -\ifini{\newtoks\@gencons} -\newif\ifdefining@a@construct -\def\@GenericConstruct#1{ - \ifini{\append@to@list{@gencons}{\\#1;} - \csarg\newtoks{#1@defaults} - \csn #1@defaults\ecs{}} - \csarg\def{add@#1@default}##1{\ifini - {\append@to@list{#1@defaults}{##1}}} - \csarg\def{adds@#1@default}##1{\append@to@list{#1@defaults}{##1}} - \Install@Noops{#1} - \csarg\def{Define#1}:##1 {\defining@a@constructyes - \def\@name{##1}\def\@class{#1} - \Tmessage[def]{Defining a #1: ##1} - \the\generic@defaults - \csarg\the{#1@defaults} - \Get@Items} - \csarg\def{@#1Option}##1{\csarg\def{#1@##1}####1####2} - } -\add@generic@default{\let\pre@fix\@empty} -\def\@command{\ifx\pre@fix\@empty\else\pre@fix @\fi\@name} -\def\stop@command@suffix{Stop} -\def\stop@command{\@command\stop@command@suffix} -\def\@DefineStopCommand{\csarg\edef{\stop@command}} - -%%%% Abbreviated Closing: -% every group defines its own \default@stop@command; -% on the outer level this is an error msg. -% \> closes whatever is open, \>] closes everything that is open. -\def\outer@stop@command{\Emessage{Vacuous group closing}} -\let\default@stop@command\outer@stop@command -\def\>{\default@stop@command%[fool the editor - \ifNextChar]{\ifx\default@stop@command\outer@stop@command - \xp\take@one - \else \xp\>\fi}{}} -\newif\if@implicitclose -\add@generic@default{\@implicitcloseyes} -% the next line replicated below -%\@GenericOption{noimplicitclose}{\@implicitcloseno} -\def\install@stop{\if@implicitclose - \def\nxp\default@stop@command{\CSname{\stop@command}}% - \else \let\nxp\default@stop@command\nxp\outer@stop@command - \fi} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%% Here is the main -%%%%%%%%%%%%%%%% I T E M A N A L Y S I S -%%%%%%%%%%%%%%%% loop -%%%% - -% This macro is recursive, but with some detours. -% first filter out empty arguments -% -\def\Get@Items#1 {\if\IsEmptyList{#1}\let\get@next@item\Get@Items - \else\def\get@next@item{\@Get@Items#1 }\fi - \get@next@item} - -% Check if the argument is `Stop', in which case you -% have reached the end of a generic definition. -% Otherwise filter the special case of a colon, and process an item -% -\NewDummy{Stop} -\def\@Get@Items#1 {\let\get@next@item=\Get@Items - \csarg\ifx{#1}\Stop - \the\generic@stop@defaults - \let\get@next@item=\relax - \else \if\EqualString{#1}{:}\@add@toks{:} - \else \Item@or@Macro#1::. \fi - \fi \get@next@item} - -% Default actions to be executed when GetItems has finished -% -\def\add@generic@stop@default#1{\ifini - {\append@to@list{generic@stop@defaults}{#1}}} -\ifini{\newtoks\generic@stop@defaults} -\add@generic@stop@default{\csname @Define\@class\endcsname} - -% Now check successive possibilities: -% first it can be a macro. -% -\def\OptionsMacro:#1=#2Stop {\global\csarg\def{opt@mac@#1}{#2}} -\def\split@at@is#1=#2=#3.{{#1}{#2}} -\def\Item@or@Macro#1:#2:#3.{ - \switch {\if\EqualString{#1}} - {macro} {\if\UndefinedCS{opt@mac@#2} - \Wmessage{Unknown macro: `#2'} - \else \edef\get@next@item{\nxp\Get@Items \csn opt@mac@#2\ecs } - \fi} - {default} {\edef\cs@e{\nxp\Option@Item{#1}\split@at@is#2==.} - \cs@e} - \endswitch} - -% The option #1 is not a Lollipop style macro. It can be -% - a specific option -% - a generic option -% - a character -% - a defined control sequence -% -% Is it an option of some sort? -% -\def\Option@Item#1#2#3{ - \if\UndefinedCS{\@class @#1} - \if\UndefinedCS{\gen@option@name{#1}} - \Character@CS@Item{#1}{#2}{#3} - \else \if\EqualString{#2}{title} - \edef\cs@e{\CSname{\gen@option@name{#1}}\CSname{#3Title}} - \cs@e - \else \csn \gen@option@name{#1}\ecs{#2}{#3} - \fi - \Tmessage[gen]{Generic option `#1' for `\@class': - `#2' = `#3'} - \fi - \else \if\EqualString{#2}{title} - \edef\cs@e{\CSname{\@class @#1}\CSname{#3Title}} - \cs@e - \else \csn \@class @#1\ecs{#2}{#3} - \fi - \Tmessage[gen]{Specific option `#1' for `\@class': `#2'} - \fi} - -% If it is not an option, is it a character or control sequence? -% -% Commands are either `\Command', `\Command:arg', `\Command:arg1=arg2' -% See what arguments are nonempty in order to attach them; -% in case 2 and 3 append space token. -% -\def\Character@CS@Item#1#2#3{ - \def\cs@b{#1}\def\cs@c##1##2<<<{\def\cs@c{##1}}\cs@c#1<<< - \ifx\cs@b\cs@c \@add@toks{#1} - \Tmessage[gen]{Single character `#1' for `\@class'} - \else - \if\UndefinedCS{#1} - \Wmessage{Unknown option for `\@class': `#1' in `\@name'.} - \@add@toks{\csn#1\ecs} - \else - \cs@in@ref@protect{#1}% - \edef\cs@e{\nxp\@add@toks{\CSname{#1}}}\cs@e - \fi - \if\IsEmptyList{#2} - \else \if\IsEmptyList{#3}\@add@toks{:#2 } - \else - \if\EqualString{#2}{title} - \edef\cs@e{\nxp\@add@toks{:\CSname{#3Title} }} - \cs@e - \else \@add@toks{:#2={#3} } - \fi - \fi - \fi - \Tmessage[gen]{Command `#1' (#2,#3)} - \fi} - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%% G E N E R I C O P T I O N S -%%%% -% -% All generic constructs get these options. -% They are at liberty to redefine them. -% -\newtoks\@GenericOptions -\def\gen@option@name#1{Option@#1} -\def\@GenericOption#1{ - \append@to@list{@GenericOptions}{\\#1;} - \csarg\def{\gen@option@name{#1}}##1##2} -\def\Noop@Error#1#2{\Emessage{Option #2 is not allowed for class #1}} - -\def\Install@Noops#1{ - \csarg\def{@#1NOOP}##1{\csarg\def{#1@##1}{\Noop@Error{#1}{##1}}} - } -\newtoks\@main@options@list -\newtoks\before@coms \newtoks\after@coms -\add@generic@default - {\def\@current@options@list{@main@options@list}% - \@main@options@list{} - \before@coms{} \after@coms{}} -\long\def\@add@toks#1{\append@to@list{\@current@options@list}{#1}} -\def\toks@add@toks#1{ - \edef\cs@e{\nxp\append@to@list - {\nxp\@current@options@list}{\xp\the\csn#1\ecs}} - \cs@e \let\cs@e\relax} -\def\switch@to@options@list#1{\def\@current@options@list{#1}} -\def\temp@options@list#1{ - \xdef\saved@options@list{\@current@options@list} - \def\@current@options@list{#1}} -\def\revert@options@list{ - \xdef\@current@options@list{\saved@options@list} - \global\let\saved@options@list\@empty} - -\newtoks\z@toks \z@toks={0pt} - -% the next line should be higher, -% but \@GenericOption wasn't defined yet there -\@GenericOption{noimplicitclose}{\@implicitcloseno} - -%%%%%%%%%%%%%%%% Universal textblock -% -% These macros will only be used inside an \edef. -% They are meant for text blocks, but the \outer@start@commands -% are also necessary for output routines, hence the test -% if this is a text-like construct. -% -\newif\iftext@construct -\add@generic@default{\text@constructyes} - -% Level of nesting -% -\newcount\nest@depth - -% Open command -% -\def\@gen@open{\outer@start@commands - \begingroup \inner@start@commands} - -\def\outer@start@commands{% - \iftext@construct - \ifleft@embedded@construct \install@h@before@penalty - \else \nxp\leavehmode \nxp\v@buffer{\the\@whitebefore}% - % backspace previous white space while it's visible - \nxp\if@headed\nxp\else\install@v@before@penalty - \nxp\fi - \fi \fi - \ifhas@counter \nxp\StepCounter:\expandafter\@name\@space - % This sets the \current@label by default - \ifhas@marks - \edef\nxp\cs@e{\nxp\nxp\nxp\refresh@mark@item - {\@name Counter}{\CSname{\@name Counter}}}% - \nxp\cs@e - \fi - \fi - \iflabel@defined - \global\current@label={\the\@labelcoms}\fi - \ifhas@title \install@title@code - % subtle: the title has to be installed after any page break - % otherwise footlines may contain the wrong title. - % also the title has to be global. - \fi - \ifhas@marks\nxp\ifnin{\nxp\place@mark}\fi - %otherwise IniTeX'ing Lollipop will output a page - \nxp\xx@label\the\extern@toks\penalty\@M - % also subtle: if this white space would be higher, it would - % be invisible because of marks et cetera. - % insert nobreak after marks/writes to prevent page breaks. - \iftext@construct - \ifleft@embedded@construct - \else \nxp\@vwhite{\the\@whitebefore}\fi - \fi - } -\def\inner@start@commands{% - \nxp\Open@Group\CSname{\@class}\CSname{\@name}% - \install@stop - \ifleft@embedded@construct - \else \nxp\hold@parskip - \nxp\default@everypar - \ifwhiteleft@defined - \advance@skip\leftskip{\the\@whiteleft}\fi - \ifwhiteright@defined - \advance@skip\rightskip{\the\@whiteright}\fi - \nxp\let\nxp\par=\nxp\@par %explain to me again why this is necessary... - \inside@indent \first@indent - \fi - \advance\nest@depth\@ne - } - -\def\@gen@close{\inner@end@commands \endgroup \outer@end@commands} -\def\inner@end@commands{% - \nxp\Close@Group\CSname{\@class}\CSname{\@name}% - \the\late@extern@toks - \ifright@embedded@construct \install@h@after@penalty - \else \nxp\leavehmode \install@v@after@penalty - \nxp\@vwhite{\the\@whiteafter}\fi - } -\def\outer@end@commands{% - \the\after@toks - \ifright@embedded@construct \nxp\@headedno - \else \after@indent \nxp\dono@parskip - \fi} -\let\esp@hack\relax -\def\bsp@hack{\let\esp@hack\relax - \ifhmode\ifdim\lastskip>\z@\let\esp@hack\ignorespaces\fi\fi} - -%%%%%%%%%%%%%%%% Breaking - -% Constructs such as 'line' or 'rule' introduce breakpoints. -% Here's how we deal with that. The \ifat@breakpoint test is set -% by options such as 'line' or 'vwhite'. Similarly, these options -% test for this condition and if necessary protect. -% After 'text' in a text block the condition is set too. -\newif\ifat@breakpoint -\add@generic@default{\at@breakpointno} -\def\protect@breakpoint{\ifat@breakpoint\@add@toks{\nobreak}\fi} - -% Break Before -% user specifies yes/no, numeric value, or name of value -% yes also does a fill -% default: place zero penalty -% -\newif\ifdefault@break@before -\adds@generic@default{\default@break@beforeyes} -\@GenericOption{breakbefore}{\default@break@beforeno - \switch {\if\EqualString{#1}} - {no} {\def\@beforepenalty{\penalty\@M }} - {yes} {\def\@beforepenalty{\CSname{\h@or@v fil}\penalty-\@M}} - {0} {\def\@beforepenalty{}} - {default} - {\edef\cs@e{\def\nxp\@beforepenalty - {\penalty\@w@w{#1}\relax}} - \cs@e} - \endswitch} -\def\install@v@before@penalty - {\ifdefault@break@before\penalty\z@ - \else\nxp\ifnum\lastpenalty=\z@\@beforepenalty\nxp\fi - \fi} -\def\install@h@before@penalty - {\ifdefault@break@before - \else\nxp\ifnum\lastpenalty=\z@\@beforepenalty\nxp\fi - \fi} - -% Break After -% same story -% -\newif\ifdefault@break@after -\adds@generic@default{\default@break@afteryes}% Heading overrides -\@GenericOption{breakafter}{\default@break@afterno - \switch {\if\EqualString{#1}} - {no} {\def\@afterpenalty{\penalty\@M }} - {yes} {\def\@afterpenalty{\CSname{\h@or@v fil}\penalty-\@M}} - {0} {\def\@afterpenalty{}} - {default} - {\edef\cs@e{\def\nxp\@afterpenalty - {\penalty\@w@w{#1}\relax}} - \cs@e} - \endswitch} -\def\install@v@after@penalty - {\ifdefault@break@after\penalty\z@ \else\@afterpenalty \fi} -\def\install@h@after@penalty - {\ifdefault@break@after \else\@afterpenalty \fi} - -%%%%%%%%%%%%%%%% Surrounding White Space -% WhiteBefore -% amount is put in token list \@whitebefore, -% the \@define... macro uses this to its own discretion -% For the three text construct this happens in the general macros -% In ExternalItem a different default is used -% -\ifini{\newtoks\@whitebefore \newskip\whitebefore} -\add@generic@default{\@whitebefore={whitebefore}} -\whitebefore=6pt plus 6pt\relax -\@GenericOption{whitebefore}{ -% \edef\cs@e{\@whitebefore={\@w@w{#1}}}\cs@e} - \@whitebefore={#1}} - -% WhiteAfter -% same story with \@whiteafter -% -\ifini{\newtoks\@whiteafter \newskip\whiteafter} -\add@generic@default{\@whiteafter={whiteafter}} -\whiteafter=6pt\relax -\@GenericOption{whiteafter}{ -% \edef\cs@e{\@whiteafter={\@w@w{#1}}}\cs@e} - \@whiteafter={#1}} - -% WhiteLeft -% same story with \@whiteleft -% -\ifini{\newtoks\@whiteleft} -\newif\ifwhiteleft@defined -\add@generic@default{\@whiteleft\z@toks \whiteleft@definedno} -\@GenericOption{whiteleft}{ -% \edef\cs@e{\nxp\@whiteleft={\@w@w{#1}}}\cs@e - \@whiteleft={#1} - \whiteleft@definedyes} - -% WhiteRight -% same story with \@whiteright -% -\ifini{\newtoks\@whiteright} -\newif\ifwhiteright@defined -\add@generic@default{\@whiteright\z@toks \whiteright@definedno} -\@GenericOption{whiteright}{ - \edef\cs@e{\nxp\@whiteright={\@w@w{#1}}}\cs@e - \whiteright@definedyes} - -%%%%%%%%%%%%%%%% Group Bookkeeping -\def\@@nulklasse{????}\def\@@nulnaam{????} -\let\@@groepklasse=\@@nulklasse \let\@Group@Name=\@@nulnaam - -% Grouping level during definition -% -\new@@counter{group} -\add@generic@default{\start@counter{group}} -\add@generic@stop@default{\if\TestCounter:group >0 - \Emessage{There are groups open in <\@name>}\fi} - -\add@generic@default{\def\current@def@group{>>OUTER LEVEL<<}} -\def\b@group{\edef\@outer@options@list{\@current@options@list} - \bgroup\step@counter{group} - \ifnextchar[\def@def@group{}%] - } -\def\def@def@group[#1]{\def\current@def@group{#1}} -\def\e@group{\ifnextchar[\test@def@group\egroup%] - } -\def\test@def@group[#1]{\def\current@test@group{#1} - \ifx\current@def@group\current@test@group\egroup - \else\Emessage{Closing `\current@def@group' with `\current@test@group' - in \@class: \@name} - \fi} - - -% Grouping during execution -% -\def\@@testklasse{OUTER}\def\@@testnaam{OUTER} -\def\@DEFgroepsluit{\nxp\Close@Group{\@class}{\@name}} -\def\@groepERR#1#2{\Wmessage{Unexpected close of - <\expandafter\string#1; expected: \expandafter\string#2.}} -\newcount\group@open@lineno -\def\Open@Group#1#2{\def\@@groepklasse{#1}\def\@Group@Name{#2}% - \Tmessage[gen]{Open \string#1\@space \string#2 @ \the\inputlineno} - \group@open@lineno\inputlineno} -\def\Close@Group#1#2{\def\@@testklasse{#1}\def\@@testnaam{#2}% - \ifx\@@testnaam\@Group@Name - \Tmessage[gen]{Close \string#1\@space \string#2}% - \else \@groepERR{\@@testnaam}{\@Group@Name}\fi} -\def\Close@all@groups - {\ifx\@Group@Name\@@nulnaam - \else \Wmessage{Group not closed: \expandafter\string\@Group@Name; - start @\the\group@open@lineno} - \endgroup - \Close@all@groups - \fi} - -\def\@groeptester{\ifx\@Group@Name\@@nulnaam - \else \Wmessage{Group still open: \expandafter\string\@Group@Name}\fi} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%% Counters - -% Counter name -% has been abstracted. -% this may be removed later for efficiency. -% -%\def\counter@name#1{#1@C}%defined above -\def\cs@counter@name#1{\csn#1@C\ecs} -\def\counter@@name#1{\CSname{#1@C}} -\def\counter@value#1{\xp\the\csn#1@C\ecs} - -% -% \NewCounter:COUNTER -% \newcount\COUNTER@C -% \CounterRepresentation:COUNTER=1 ; print arabic numeral -% \StartCounter:COUNTER ; set to 0 -% \COUNTER@RL={} ; create reset list -% -% \CounterRepresentation:THING=W -% if W is another counter, make synonym, otherwise -% \THING@R <- representation command -% \THINGCounter = \THING@R \THING@C -% #1 = naam van een nieuw te definieren teller; -% #2 = telwijze of naam van teller waar de nieuwe teller synoniem -% mee moet worden. -% -\def\NewCounter:#1 {\new@counter{#1}} -\def\new@counter#1{ - \new@@counter{#1}\csarg\edef{#1Value}{\counter@@name{#1}} - \CounterRepresentation:{#1}=1 - \StartCounter:{#1} - } -% given above -%\def\new@@counter#1{\csarg\newcount{\counter@name{#1}}} -\def\AdaptiveCounter:#1 - {\if\UndefinedCS{\counter@name{#1}}\new@counter{#1}\fi - \adds@stop@command - {\ifWriteExtern\immediate\write\aux@file - {\string\SetCounter:#1={\counter@value{#1}}} \fi - }} - -% Counter allocation in the generic constructs -% counter:x -% indicates the mode of representation of the counter -% of the construct being defined. The counter is first allocated. -% A switch is thrown that will generate automatic step instructions. -% -\newif\ifhas@counter -\@GenericOption{HasCounter}{ - \switch {\if\EqualString{#1}} - {yes} {\has@counteryes\has@labelyes - \if\IsEmptyList{#2}\else\def\this@counter@repr{#2}\fi} - {no} {\has@counterno} - {default} {\has@counteryes} - \endswitch} -\@GenericOption{counter}{ - \ifin@label \edef\cs@e{\nxp\@add@toks{\CSname{\@name Counter}}} - \cs@e - \else\has@counteryes\has@labelyes \def\this@counter@repr{#1} - \fi} -\def\install@counter#1{\new@counter{\@name}% - \ifhas@marks\xp\add@mark@item\xp{\@name Counter}\fi - \if\IsEmptyList{#1}\else\CounterRepresentation:\@name=#1 \fi - } - -% Counter-related defaults: initially there is no counter, -% if a counter starts it counts Arabic unless otherwise indicated, -% and the countername associated with this construct is -% made available as an option; -% later it will be a command, and the option is removed again. -% -\add@generic@default{\has@counterno\has@labelno - \def\this@counter@repr{1} - \csarg\def{\gen@option@name{\@name Counter}}{% - \edef\cs@e{\nxp\@add@toks{%\nxp\cprotect - \CSname{\@name Counter}}}\cs@e - \global\has@counteryes\global\has@labelyes}} -\add@generic@stop@default - {\csarg\let{\gen@option@name{\@name Counter}}\relax} -\add@generic@stop@default{\ifhas@counter - \xp\install@counter\xp{\this@counter@repr}\fi} - -%titles are handled below but the actions have to be -%in this order. -\add@generic@stop@default - {\ifhas@title \ifshort@title \@sTitelize\@command - \else \@Titelize{\@command} - \fi\fi} -\add@generic@stop@default{\ifhas@label \@Labelize{\@command}\fi} - - -%%%%%%%%%%%%%%%% Counter Representaton -% main use: indicate representation of numerical value of counter -% control sequence \FooCounter <- Foo@R\Foo@C -% two-step approach necessary because of symbolic reference: -% not all representations work purely by expansion. -% - -% 1 arabic, i lowercase roman, I uppercase roman -% a lowercase character, A uppercase Character -% -\def\@arabic#1{\number#1 } -\def\@lcascii#1{{\tempcounta=#1\relax \advance\tempcounta by 96 - \char\tempcounta\relax}} -\def\@ucascii#1{{\tempcounta=#1\relax \advance\tempcounta by 64 - \char\tempcounta\relax}} -\def\@roman#1{\romannumeral#1 } -\def\@Roman#1{\uppercase\expandafter{\romannumeral#1}} - -% Representation has been abstracted -% -\def\counter@repr#1{#1@R} - -% Give the representing control sequence (@roman, ...) -% inside an \edef -% -\def\counter@@repr#1{\xp\xp\xp\string\csname#1@R\endcsname} - -% Counter Representation (user command) -% decides if this is a real representation command, -% or a synonym declaration -% -\def\CounterRepresentation:#1=#2 { - \if\UndefinedCS{\counter@name{#2}}%is this counter a synonym? - \represent@counter{#1}{#2} - \else \@SynonymCounter{#1}{#2} - \fi} -\def\represent@counter#1#2{ - \edef\cs@e{@\if#2iroman\else - \if#2IRoman\else \if#2alcascii\else - \if#2Aucascii\else arabic\fi\fi\fi\fi} -% \csarg\xdef{\counter@repr{#1}}{\CSname{\cs@e}} - \csarg\edef{\counter@repr{#1}}{\CSname{\cs@e}} - \csarg\xdef{#1Counter}{\nxp\cprotect %\xp\string when writing label out - \CSname{\counter@repr{#1}}{\nxp\number\counter@@name{#1}}} - } -\def\cprotect{} - -\def\PrintCounter:#1 {\csn#1Counter\ecs} - -% Synonym Counters -% share the \FooCounter command, internal name, and reset list -% -\def\@SynonymCounter#1#2{ - \edef\cs@b{\nxp\let\counter@@name{#1}=\counter@@name{#2} - \nxp\let\CSname{#1Counter}=\CSname{#2Counter} - \nxp\let\CSname{#1@RL}=\CSname{#2@RL}} - \cs@b - } - -% Synonym as generic option -% sharecounter:xyz -% Don't allocate a counter, but share the counter of the -% 'xyz' construct. -% -\@GenericOption{sharecounter}{\CounterRepresentation:\@name=#1 } - -% Governing counters -% If a counter governs another counter, the other is reset -% whenever the first is altered. -% -\def\GoverningCounter:#1=#2 {\tempano - \if\UndefinedCS{\counter@name{#1}} - \Wmessage{No such counter <#1>} - \else\if\UndefinedCS{\counter@name{#2}} - \Wmessage{No such counter <#2>} - \else\tempayes - \fi\fi - \iftempa\if\UndefinedCS{#2@RL}\csarg\newtoks{#2@RL} - \csn #2@RL\ecs={}\fi - \append@to@list{#2@RL}{\\#1;} - \fi} -\def\reset@subordinates#1{\if\UndefinedCS{#1@RL}\else - \def\\##1;{\start@counter{##1}}% - \the\csname #1@RL\endcsname \let\\=\relax - \fi} - -% User counter manipulation -% should be global, and should reset subordinate counters -% and define references. -% -\def\StartCounter:#1 {\handle@user@counter{#1}{start}{}} -\let\ResetCounter\StartCounter -\def\StepCounter:#1 {\handle@user@counter{#1}{step}{}} -\def\AddToCounter:#1=#2 {\handle@user@counter{#1}{addto}{#2}} -\def\BackStepCounter:#1 {\handle@user@counter{#1}{back@step}{}} -\def\SetCounter:#1=#2 {\handle@user@counter{#1}{set}{#2}} -\def\handle@user@counter#1#2#3{\if\UndefinedCS{\counter@name{#1}} - \Wmessage{Unknown counter: #1} - \else \begingroup\globaldefs\@ne - \csn#2@counter\ecs{#1}{#3}% - \reset@subordinates{#1}\define@reference{#1}% - \endgroup - \fi} - -% Numeric manipulation -% -\def\CounterValue:#1 {% - \if\UndefinedCS{\counter@name{#1}}0 - \else \cs@counter@name{#1}\fi - } -\def\TestCounter:#1 {00\fi\ifnum\cs@counter@name{#1}} - -% Internal counter manipulation -% is local and has no side effects -% -\def\step@counter#1{\increase@value{\counter@name{#1}}\@ne} -\def\addto@counter#1#2{\edef\cs@e - {\nxp\increase@value{\nxp\counter@name{#1}}{\w@w{#2}}}\cs@e} -\def\back@step@counter#1{\increase@value{\counter@name{#1}}\m@ne} -\def\start@counter#1{\set@value{\counter@name{#1}}\z@} -\def\set@counter#1#2{\edef\cs@e - {\nxp\set@value{\nxp\counter@name{#1}}{\w@w{#2}}}\cs@e} - - -%%%%%%%%%%%%%%%% Title -% -% All constructs can have titles. -% By using the option 'title' the user indicates that -% this particular option has a title. -% A control sequence \constructTitle is defined. -% -% In case the \constructTitle is only used in a macro, -% the user has to set HasTitle:yes as an option. -% -\def\@@@title#1{#1Title}\def\@@title{\@@@title\@name} -\newif\ifhas@title\add@generic@default{\has@titleno} -\newif\ifshort@title\add@generic@default{\short@titleno} -\add@generic@stop@default % we cannot use @@title here! - {\ifhas@marks\ifhas@title\xp\add@mark@item\xp{\@name Title}\fi\fi} -\def\give@title{\global\has@titleyes - \global\csarg\let\@@title\@space - %to define it until first call - } -\@GenericOption{title}{\give@title - \ifin@external \if\IsEmptyList{#1} - \external@handle@title{\@name} - \else \external@handle@title{#1}\fi - \else \if\IsEmptyList{#1} - \edef\cs@e{\nxp\@add@toks{\CSname{\@@title}}}\cs@e - \else\Wmessage{Parametrized titles only in external}\fi - \fi - } -\@GenericOption{HasTitle}{ - \switch {\if\EqualString{#1}} - {yes} {\give@title} - {no} {\global\has@titleno} - {short} {\give@title \global\short@titleyes} - {default} {\give@title} - \endswitch - } - -% this code appears in \outer@start@commands; -% it will be executed in an \edef -% -\newtoks\title@toks -\def\install@title@code - {%\nxp\xp\gdef\nxp\xp\CSname{\@name Title}\nxp\xp{% - % \nxp\xp\nxp\maybe@uppercase\nxp\xp{\nxp\the\title@toks}}% - \nxp\xp\gdef\nxp\xp\CSname{\@name Title}\nxp\xp - {\nxp\the\title@toks}% - \ifhas@marks - \edef\nxp\cs@e{\nxp\nxp\nxp\refresh@mark@item - {\@name Title}{\nxp\the\title@toks}}% - \nxp\cs@e - \fi} - -% Give a macro a title -% -%\add@generic@stop@default{\ifhas@title \@Titelize{\@name}\fi} %above! -% -\newcount\extra@args \add@generic@default{\extra@args\z@} -\def\ttl@name#1{ttl@#1} -\def\@Titelize#1{\edef\cs@e{\let\CSname{\ttl@name{#1}}=\CSname{#1}}\cs@e - \ifcase\extra@args %0: - \csarg\edef{#1}##1\par - {\title@toks\nxp\xp{\nxp\id@##1\nxp\willbeunhskip}% -% {\title@toks{##1\nxp\protect\nxp\unhskip}% - \CSname{\ttl@name{#1}}} - \or %1: - \csarg\edef{#1}##1##2\par - {\title@toks\nxp\xp{\nxp\id@##2\nxp\willbeunhskip}% -% {\title@toks{##2\nxp\protect\nxp\unhskip}% - \CSname{\ttl@name{#1}}{##1}} - \or %2: - \csarg\edef{#1}##1##2##3\par - {\title@toks\nxp\xp{\nxp\id@##3\nxp\willbeunhskip}% -% {\title@toks{##3\nxp\protect\nxp\unhskip}% - \CSname{\ttl@name{#1}}{##1}{##2}} - \else \Wmessage{Sorry, too many extra arguments % - for `\@class' : `\@name'} - \fi} -\begingroup\catcode`\^^M\active \endlinechar-1\relax% -% trick: with an active ^^M we can let it expand to \@space -% not a 100\% solution, true. -\gdef\@sTitelize#1{ - \edef\cs@e{\let\CSname{x@\ttl@name{#1}}=\CSname{#1}}\cs@e - \csarg\edef{#1}{\begingroup\endlinechar`\nxp\^^M - \catcode\endlinechar\active\CSname{\ttl@name{#1}}} -% short titles can have no unwanted trailing space - \ifcase\extra@args %0: - \csarg\edef{\ttl@name{#1}}##1^^M - {\endgroup\let\nxp^^M\nxp\@space - \title@toks\nxp\xp{\nxp\id@##1}% -% \title@toks{##1\nxp\protect\nxp\unhskip}% - \CSname{x@\ttl@name{#1}}} - \or %1: - \csarg\edef{\ttl@name{#1}}##1##2^^M - {\endgroup\let\nxp^^M\nxp\@space - \title@toks\nxp\xp{\nxp\id@##2}% -% \title@toks{##2\nxp\protect\nxp\unhskip}% - \CSname{x@\ttl@name{#1}}{##1}} - \or %2: - \csarg\edef{\ttl@name{#1}}##1##2##3^^M - {\endgroup\let\nxp^^M\nxp\@space - \title@toks\nxp\xp{\nxp\id@##3}% -% \title@toks{##3\nxp\protect\nxp\unhskip}% - \CSname{x@\ttl@name{#1}}{##1}{##2}} - \else \Wmessage{Sorry, too many extra arguments % - for `\@class' : `\@name'} - \fi} -\endgroup - -% Uppercase titles are a big problem -% after \MakeUpperCase -% any appearing title (including when it comes out of a mark) -% is uppercased -% -\newif\ifUpperCasing \def\MakeUpperCase{\UpperCasingyes} -\def\maybe@uppercase{\ifUpperCasing\uppercase\xp\fi} - -%%%%%%%%%%%%%%%% M O D E S -% -% controls whether a construct can start/end as part of a paragraph. -% chooses between a lot of horizontal/vertical commands. -% -% this should appear as one of the first options. -% maybe generate an error msg if it doesn't -% -\newif\ifleft@embedded@construct -\newif\ifright@embedded@construct -\add@generic@default{\left@embedded@constructno\right@embedded@constructno} -\newif\if@hmode \newif\if@vmode -\add@generic@default{\@hmodeno\@vmodeyes} -\@GenericOption{embedded}{\switch {\if\EqualString{#1}} - {yes} {\left@embedded@constructyes\right@embedded@constructyes} - {no} {\left@embedded@constructno \right@embedded@constructno} - {left} {\left@embedded@constructyes\right@embedded@constructno} - {right} {\left@embedded@constructno \right@embedded@constructyes} - {default} {\Wmessage{Strange modifier: `embedded:#1'}} - \endswitch - \ifleft@embedded@construct \@hmodeyes \@vmodeno \fi} - -% Mode dependent -% -\def\h@or@v{\ifleft@embedded@construct h\else v\fi} -\def\append@no@hv@break - {\edef\cs@e{\nxp\@add@toks{%\if@hmode \if@vmode\else\nxp\leavevmode\fi\fi - %\if@vmode \if@hmode\else\nxp\leavehmode\fi\fi - \nxp\nobreak}} - \cs@e} - -%%%%%%%%%%%%%%%% Boxes -% -% Line -% is a \hbox to \hsize -% mainly used to determine the width of stuff inside it. -% -\newif\ifin@line -\add@generic@default{\in@lineno} -\newcount\text@in@line \newtoks\line@toks \newbox\line@box -\def\rm@to@end@of@box{\everyvbox{}% - \setbox\tempboxa\vbox\bgroup - \aftergroup\rm@tmp@box} -\def\rm@tmp@box{\setbox\tempboxa\box\voidb@x\egroup} -\def\definitely@to@hsize{\def\maybe@to@hsize{ to\hsize}} -\@GenericOption{line}{ - \switch {\if\EqualString{#1}} - {start} {\protect@breakpoint - \b@group[line]\in@lineyes\line@toks{} - \temp@options@list{line@toks} - \@add@toks{\hbox \maybe@to@hsize\bgroup}\text@in@line\z@ - } - {stop} {\@add@toks{\hfil\egroup}\revert@options@list - \ifnum\text@in@line>\z@ - \edef\cs@e{\nxp\@add@toks - {\line@toks={\the\line@toks}}}\cs@e - \@add@toks{\begingroup\everyvbox{\rm@to@end@of@box}% - \let\maybe@to@hsize\relax - \setbox\line@box\the\line@toks - \tempdima\hsize\advance\tempdima-\wd\line@box - \everyvbox{}\definitely@to@hsize - \everyvbox{\hsize\tempdima}\the\line@toks - \endgroup} - \else \@add@toks{\definitely@to@hsize} - \toks@add@toks{line@toks} - \fi - \e@group[line]\at@breakpointyes} - {default} {\Wmessage{Strange modifier: `line:#1'}} - \endswitch} - -% Tekstkolom. Is een \vbox of \vtop. -% Openen met 'begin' 'ophangen', 'topregel' of 'voetregel', -% start,topregel : \vtop -% voetregel : \vbox -% ophangen : \vtop{\kern\z@ -% Eindigen met 'stop' -\@GenericOption{textcolumn}{ - \switch {\if\EqualString{#1}} - {stop} {\@add@toks{\egroup}\global\BlockWidth\hsize - \e@group[textcolumn]\at@breakpointyes} - {start} {\open@text@column\vtop{}} - {topline} {\open@text@column\vtop{}} - {hang} {\open@text@column\vtop{\kern\z@}} - {footline} {\open@text@column\vbox{}} - {default} {\Wmessage{Strange modifier: `textcolumn:#1=#2'}} - \endswitch} -\def\open@text@column#1#2% - {\ifin@line\advance\text@in@line\@ne\else\protect@breakpoint\fi - \@add@toks{#1\bgroup#2\leftskip\z@ \Indent:no \leavevmode} - \b@group[textcolumn] - \ifin@line\else\aftergroup\at@breakpointyes\fi - } - -% Depth strut: for use in line -\@GenericOption{depth}{ - \edef\cs@e{\nxp\@add@toks{\vrule width\z@ height\z@ depth \@w@w{#1}}} - \cs@e} - -% Block -% is an hbox -% opening -% 1/ blok:start --> \setbox\block@box=\hbox{ -% and \block@closing = } -% 2/ blok:hang --> \setbox\block@box=\hbox{\vtop{\kern\z@\hbox{ -% and \block@closing = }}} -% closing -% 1/ blok:stop --> \block@closing \box\block@box -% 2/ stickout:left/right --> \block@closing \l/rlap{\box\block@box} -% 3/ fillupto:foo --> \block@closing -% \hbox to \foo{\unhbox\block@box\hfil} -% -\newbox\block@box \newif\ifin@box -\add@generic@default{\in@boxno - \def\block@closing{\ifin@box\else - \Wmessage{Closing `block', but not opened. This is serious!}\fi} - } -\def\block@closing{} -\newdimen\BlockWidth -\def\Measure@Block{\global\BlockWidth\wd\block@box} -\@GenericOption{block}{ - \switch {\if\EqualString{#1}} - {stop} {\stop@block} - {hang} {\start@block - {\vtop\bgroup\kern\z@\hbox\bgroup} - {\egroup\egroup}} - {start} {\start@block{}{}} - {default} {\Wmessage{Strange option: `block:#1'}} - \endswitch} -\def\start@block#1#2{ - \ifin@line\else\protect@breakpoint\fi - \@add@toks{\setbox\block@box=\hbox\bgroup#1} - \b@group[block] - \ifin@line\else\aftergroup\at@breakpointyes\fi - \def\block@closing{\@add@toks{#2\egroup\Measure@Block}} - } -\def\stop@block{\block@closing - \ifin@box \@add@toks{\advance\hsize by -\wd\block@box} \fi - \@add@toks{\box\block@box} - \e@group[block]} - -\@GenericOption{fillupto}{ - \block@closing \e@group[block] - \edef\cs@e{\nxp\@add@toks{\hbox to \@w@w{#1}{\unhbox\block@box\hfil}}} - \cs@e - \ifin@line \edef\cs@e{\nxp\@add@toks{\advance\hsize by -\@w@w{#1}}} - \cs@e \fi - } -\@GenericOption{stickout}{ - \block@closing \e@group[block] - \switch {\if\EqualString{#1}} - {right} {\stickout@right{#2}} - {left} {\stickout@left{#2}} - {default} {\Wmessage{Unknown qualifier (stickout:) `#1'}} - \endswitch - } -\def\stickout@left#1{ - \@add@toks{\llap} - \if\IsEmptyList{#1} - \@add@toks{{\box\block@box}} - \else \edef\cs@e{\nxp\@add@toks{{\hbox to \@w@w{#1} - {\box\block@box\hss}}}} - \cs@e - \fi} -\def\stickout@right#1{ - \@add@toks{\rlap} - \if\IsEmptyList{#1} - \@add@toks{{\box\block@box}} - \else \edef\cs@e{\nxp\@add@toks{{\hbox to \@w@w{#1} - {\hss\box\block@box}}}} - \cs@e - \fi} - -%%%%%%%%%%%%%%%% Tidbits - -% Commands -% -\@GenericOption{command}{ - \ifin@external \external@handle@expandable{#1}{\csn#1\ecs}{<#1>} - \else - \if\UndefinedCS{#1}\Wmessage{Undefined command: <#1>}\fi - \edef\cs@e{\nxp\@add@toks{\CSname{#1}}}\cs@e - \fi} -\@GenericOption{CSname}{ - \edef\cs@e{\nxp\@add@toks{\CSname{#1}}}\cs@e} - -% Literal text. -% only problem if this is a colon. -% -\@GenericOption{literal}{\@add@toks{#1}} - -% Arguments. -% -\@GenericOption{arg}{\edef\cs@e - {\nxp\@add@toks{\iftrue{\else}\fi#1\iffalse{\else}\fi}} - \cs@e} -\@GenericOption{OpenBrace}{\edef\cs@e - {\nxp\@add@toks{\iftrue{\else}\fi}} - \cs@e} -\@GenericOption{CloseBrace}{\edef\cs@e - {\nxp\@add@toks{\iffalse{\else}\fi}} - \cs@e} -% Extra Commands before and after -% -\newtoks\before@toks \add@generic@default{\before@toks{}} -\@GenericOption{commandbefore}{ - \edef\cs@e{\nxp\append@to@list{before@toks}{\CSname{#1}}} - \cs@e} -\newtoks\after@toks \add@generic@default{\after@toks{}} -\def\add@after@command#1{\append@to@list{after@toks}{#1}} -\@GenericOption{commandafter}{ - \edef\cs@e{\nxp\add@after@command{\CSname{#1}}} - \cs@e} - -\endinput - -% 2016/04/13 Chnaged \lolli@name to \lollipop@name -% 2014/04/18 Fixed the wrong numbering of nested enumerate lists -% 92/11/03 Improved penalty handling for embedded environments -% \ifini test extended to make loading on top of plain possible -% 92/11/08 Breakpoint protection into line/block/textcolumn -% 92/11/14 Resetlist generation made conditional -% 92/11/21 option 'arg' -% 92/12/12 \sTitelize, \give@title -% 93/07/30 late@after@toks, inputlineno in group errmsg
\ No newline at end of file |