From: Vit Zyka <vit.zyka@seznam.cz>
Subject: Re: \setupmarginrules
Date: Tue, 28 Mar 2006 20:55:48 +0200 [thread overview]
Message-ID: <442986B4.6000401@seznam.cz> (raw)
In-Reply-To: <44296E72.9060401@wxs.nl>
Hans Hagen wrote:
> Vit Zyka wrote:
>
>> Willi Egger wrote:
>>
>>
>>> Hi Vit!
>>>
>>> Thanks for this patch. Do you know why the rulethickness must be
>>> given in integer dimension. e.g. 2.5pt will cause an error, telling
>>> that a wrong dimension is used.
>>>
>>> Willi
>>>
>>
>>
>> Due to my fault. Sorry. This is a little bit better solution:
>>
>> -----------------------------------------------
>> \defineparagraphs [poem][n=2,distance=20pt]
>> \setupparagraphs [poem][1][width=.25\textwidth]
>> \setupparagraphs [poem][2][rule=on,rulethickness=5.5pt]
>>
>> \unprotected
>> \def\doalinealijn#1#2%
>> {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
>> {\dimen2=#1\relax
>> \dimen3=\getvalue{\??al#2\the\alteller\c!rulethickness}% VZ
>> \hskip.5\dimen2
>> % \hskip-\linewidth
>> \hskip-.5\dimen3 % VZ
>> % \vrule\!!width\linewidth
>> \vrule\!!width\dimen3 % VZ
>> \hskip-.5\dimen3 % VZ
>> \hskip.5\dimen2}
>> {\hskip#1}}
>>
>
> \def\doalinealijn#1#2%
> {\doifelsevalue{\??al#2\the\alteller\c!rule}\v!on
> {\linewidth\getvalue{\??al#2\the\alteller\c!rulethickness}%
> \scratchdimen#1%
> \advance\scratchdimen-\linewidth
> \divide\scratchdimen \plustwo
> \hskip\scratchdimen
> \vrule\!!width\linewidth
> \hskip\scratchdimen}
> {\hskip#1}}
>
> btw, this feature is pretty old, and therefore a bit crappy; for
> instance, the spacing in this example poem is funny (topskip) so i
> wonder if the attached file works better (maybe optional); can those who
> use paragraphs this wau test the attached variant (for taco: raises the
> result by strutheight)
>
> (beware: i un-dutched the file a bit)
Fine, you forgot to initialize rulethickness:
\getparameters[\??al#1]%
[\c!n=3,
\c!before=\blank,
\c!after=\blank,
\c!distance=1em,
\c!height=\v!fit,
\c!rule=\v!off,
\c!rulethickness=\linewidth, % <--------------------------------
\c!command=,
\c!align=,
\c!tolerance=\v!tolerant,
\c!style=,
\c!color=,
\c!top=,
\c!top=\vss,
\c!bottom=\vfill,
#2]%
\setvalue{\e!setup#1\e!endsetup}%
{\setupparagraphs[#1]}%
\dorecurse
{\getvalue{\??al#1\c!n}}
{\setupparagraphs[#1][\recurselevel]
[\c!width=,
\c!bottom=\getvalue{\??al#1\c!bottom},
\c!top=\getvalue{\??al#1\c!top},
\c!height=\getvalue{\??al#1\c!height},
\c!style=\getvalue{\??al#1\c!style},
\c!color=\getvalue{\??al#1\c!color},
\c!rule=\getvalue{\??al#1\c!rule},
\c!rulethickness=\getvalue{\??al#1\c!rulethickness},%<-----
\c!align=\getvalue{\??al#1\c!align},
\c!tolerance=\getvalue{\??al#1\c!tolerance},
\c!distance=\getvalue{\??al#1\c!distance}]}%
Vit
>
> Hans
>
> -----------------------------------------------------------------
> Hans Hagen | PRAGMA ADE
> Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
> tel: 038 477 53 69 | fax: 038 477 53 74 | www.pragma-ade.com
> | www.pragma-pod.nl
> -----------------------------------------------------------------
>
>
> ------------------------------------------------------------------------
>
> %D \module
> %D [ file=core-mis,
> %D version=1998.01.29,
> %D title=\CONTEXT\ Core Macros,
> %D subtitle=Miscelaneous,
> %D author=Hans Hagen,
> %D date=\currentdate,
> %D copyright={PRAGMA / Hans Hagen \& Ton Otten}]
> %C
> %C This module is part of the \CONTEXT\ macro||package and is
> %C therefore copyrighted by \PRAGMA. See mreadme.pdf for
> %C details.
>
> \writestatus{loading}{Context Core Macros / Misc Commands}
>
> % todo: kleur in legenda + letter
>
> % Obsolete
> %
> % \startmessages dutch library: systems
> % title: systeem
> % 3: probeer LaTeX eens
> % \stopmessages
> %
> % \startmessages english library: systems
> % title: system
> % 3: try LaTeX
> % \stopmessages
> %
> % \startmessages german library: systems
> % title: system
> % 3: Versuche LaTeX
> % \stopmessages
> %
> % \startmessages czech library: systems
> % title: system
> % 3: zkuste LaTeX
> % \stopmessages
> %
> % \startmessages italian library: systems
> % title: sistema
> % 3: provare LaTeX
> % \stopmessages
> %
> % \startmessages norwegian library: systems
> % title: system
> % 3: fors�ker LaTeX
> % \stopmessages
> %
> % \startmessages romanian library: systems
> % title: sistem
> % 3: incercati LaTeX
> % \stopmessages
> %
>
> % %D You would not expect the next macro in \CONTEXT,
> % %D wouldn't you? It's there to warn \LATEX\ users that
> % %D something is wrong.
> % %D
> % %D Obsolete now:
> % %
> % % \def\documentstyle{\showmessage\m!systems3\empty\stoptekst}
> % %
> % % \let\documentclass=\documentstyle
> % %D \macros
> % %D {simplifiedcommands, simplifycommands}
> % %D
> % %D I first needed this simplification in bookmarks. Users can
> % %D add their own if needed.
>
> \unprotect
>
> %D Sometimes (for instance in bookmarks) we need to simplify macro
> %D behaviour, so here is the hook.
>
> \ifx\simplifiedcommands\undefined \newtoks\simplifiedcommands \fi
>
> \def\simplifycommands{\the\simplifiedcommands}
>
> %D A possibly growing list:
>
> %appendtoks \def\executesynonym#1#2#3#4{#3}\to\simplifiedcommands
> %appendtoks \def\executesort#1#2#3{#3}\to\simplifiedcommands
>
> \appendtoks \def\ { }\to\simplifiedcommands
> \appendtoks \def\type#1{\string\\\strippedcsname#1}\to\simplifiedcommands
> \appendtoks \def\TeX{TeX}\to\simplifiedcommands
> \appendtoks \def\ConTeXt{ConTeXt}\to\simplifiedcommands
> \appendtoks \def\MetaPost{MetaPost}\to\simplifiedcommands
> \appendtoks \def\MetaFont{MetaFont}\to\simplifiedcommands
> \appendtoks \def\MetaFun{MetaFun}\to\simplifiedcommands
> %appendtoks \def||{-}\to\simplifiedcommands
> \appendtoks \def|#1|{\ifx#1\empty\empty-\else#1\fi}\to\simplifiedcommands
>
> \appendtoks\let\buildtextaccent\secondoftwoarguments\to\simplifiedcommands
> \f
> % THIS WAS MAIN-002.TEX
>
> %\def\checkinterlineskip
> % {\ifvmode
> % \ifdim\lastskip>\zeropoint
> % \nointerlineskip
> % \else\ifdim\lastkern>\zeropoint
> % \nointerlineskip
> % \fi\fi
> % \fi}
>
> \def\horitems#1#2% #1=breedte #2=commandos
> {\scratchdimen#1%
> \divide\scratchdimen \nofitems
> \!!counta\zerocount
> \def\docommando##1%
> {\advance\!!counta \plusone
> \processaction
> [\@@isalign]
> [ \v!left=>\hbox to \scratchdimen{\strut##1\hss},
> \v!right=>\hbox to \scratchdimen{\hss\strut##1},
> \v!middle=>\hbox to \scratchdimen{\hss\strut##1\hss},
> \v!margin=>\ifnum\!!counta=\plusone\hss\else\hfill\fi
> \strut##1%
> \ifnum\!!counta=\nofitems\hss\else\hfill\fi,
> \s!default=>\hbox to \scratchdimen{\hss\strut##1\hss}, % midden
> \s!unknown=>\hbox to \scratchdimen{\strut##1\hss}]}% % links
> \hbox to #1{\hss#2\hss}}
>
> \def\veritems#1#2% #1=breedte #2=commandos
> {\scratchdimen#1%
> \def\docommando##1%
> {\ifdim\scratchdimen<\zeropoint % the - was a signal
> \hbox to -\scratchdimen{\hss\strut##1}%
> \else\ifdim\scratchdimen>\zeropoint
> \hbox to \scratchdimen{\strut##1\hss}%
> \else
> \hbox{\strut##1}%
> \fi\fi}%
> \vbox{#2}}
>
> \def\dosetupitems[#1]%
> {\getparameters[\??is][#1]%
> \doif\@@iswidth\v!unknown
> {\def\@@iswidth{\hsize}}%
> \doifconversiondefinedelse\@@issymbol
> {\def\doitembullet##1{\convertnumber{\@@issymbol}{##1}}}
> {\doifsymboldefinedelse\@@issymbol
> {\def\doitembullet##1{\symbol[\@@issymbol]}}{}}}
>
> \def\makeitemsandbullets#1%
> {\doifelse\@@isn\v!unknown
> {\getcommalistsize[#1]%
> \edef\nofitems{\commalistsize}}
> {\edef\nofitems{\@@isn}}%
> \setbox0\hbox
> {\doitems \@@iswidth
> {\processcommalist[#1]\docommando}}%
> \setbox2\hbox
> {\doitems \@@isbulletbreedte
> {\dorecurse\nofitems
> {\docommando{\strut\doitembullet\recurselevel}}}}}
>
> \def\dostartitems#1#2#3%
> {\let\doitems#2%
> \def\@@isbulletbreedte{#3}%
> \makeitemsandbullets{#1}%
> \@@isbefore}
>
> \def\dostopitems
> {\@@isafter
> \egroup}
>
> \setvalue{doitems\v!top}#1%
> {\dostartitems{#1}\horitems\@@iswidth
> \noindent\vbox
> {\forgetall
> \doifsomething\@@issymbol
> {\doifnot\@@issymbol\v!none
> {\box2
> \@@isinbetween
> \nointerlineskip}}%
> \box0}%
> \dostopitems}
>
> \setvalue{doitems\v!bottom}#1%
> {\dostartitems{#1}\horitems\@@iswidth
> \noindent\vbox
> {\forgetall
> \box0
> \doifsomething\@@issymbol
> {\@@isinbetween
> \nointerlineskip
> \box2}}%
> \dostopitems}
>
> \setvalue{doitems\v!inmargin}#1%
> {\dostartitems{#1}\veritems{-1.5em}% - is a signal
> \noindent\hbox{\llap{\box2\hskip\leftmargindistance}\box0}%
> \dostopitems}
>
> \setvalue{doitems\v!left}#1%
> {\advance\hsize -1.5em%
> \dostartitems{#1}\veritems{1.5em}%
> \noindent\hbox{\box2\box0}%
> \dostopitems}
>
> \setvalue{doitems\v!right}#1%
> {\dostartitems{#1}\veritems{0em}%
> \noindent\hbox{\box0\hskip-\wd2\box2}%
> \dostopitems}
>
> \def\setupitems
> {\dosingleargument\dosetupitems}
>
> \def\complexitems[#1]%
> {\bgroup
> \setupitems[#1]%
> \parindent\zeropoint
> \setlocalhsize
> \hsize\localhsize
> \dontcomplain
> %\doifundefined{doitems\@@islocation}%
> % {\let\@@islocation\v!left}%
> %\getvalue{doitems\@@islocation}}
> \executeifdefined{doitems\@@islocation}{\let\@@islocation\v!left}}
>
> \definecomplexorsimpleempty\items
>
> \setupitems
> [\c!location=\v!left,
> \c!symbol=5,
> \c!width=\hsize,
> \c!align=\v!middle,
> \c!n=\v!unknown,
> \c!before=\blank,
> \c!inbetween={\blank[\v!medium]},
> \c!after=\blank]
> \f
> % Te zijner tijd [plaats=boven,onder,midden] implementeren,
> % in dat geval moet eerst de maximale hoogte worden bepaald.
> %
> % Overigens kan een en ander mooier met \halign.
>
> \def\dodefineparagraphs[#1][#2]%
> {\setvalue{\s!do\s!next#1}%
> {\def\\{\getvalue{#1}}}%
> \setvalue{#1}%
> {\getvalue{\s!do\s!next#1}%
> \dostartparagraphs{#1}}%
> \setvalue{\e!next#1}%
> {\getvalue{#1}}%
> \setvalue{\e!start#1}%
> {\bgroup
> \letvalue{\s!do\s!next#1}\empty
> \setvalue{\e!stop#1}%
> {\getvalue{#1}%
> \egroup}%
> \getvalue{#1}}%
> \getparameters[\??al#1]%
> [\c!n=3,
> \c!before=\blank,
> \c!after=\blank,
> \c!distance=1em,
> \c!height=\v!fit,
> \c!rule=\v!off,
> \c!command=,
> \c!align=,
> \c!tolerance=\v!tolerant,
> \c!style=,
> \c!color=,
> \c!top=,
> \c!top=\vss,
> \c!bottom=\vfill,
> #2]%
> \setvalue{\e!setup#1\e!endsetup}%
> {\setupparagraphs[#1]}%
> \dorecurse
> {\getvalue{\??al#1\c!n}}
> {\setupparagraphs[#1][\recurselevel]
> [\c!width=,
> \c!bottom=\getvalue{\??al#1\c!bottom},
> \c!top=\getvalue{\??al#1\c!top},
> \c!height=\getvalue{\??al#1\c!height},
> \c!style=\getvalue{\??al#1\c!style},
> \c!color=\getvalue{\??al#1\c!color},
> \c!rule=\getvalue{\??al#1\c!rule},
> \c!align=\getvalue{\??al#1\c!align},
> \c!tolerance=\getvalue{\??al#1\c!tolerance},
> \c!distance=\getvalue{\??al#1\c!distance}]}%
> \setupparagraphs[#1][1][\c!distance=0em]}
>
> \def\defineparagraphs
> {\dodoubleargument\dodefineparagraphs}
>
> \def\dosetupparagraphs[#1][#2][#3]%
> {\doifelse{#2}\v!each
> {\dorecurse
> {\getvalue{\??al#1\c!n}}
> {\getparameters[\??al#1\recurselevel][#3]}}
> {\ConvertToConstant\doifelse{#3}{}
> {\getparameters[\??al#1][#2]}
> {\def\docommando##1%
> {\getparameters[\??al#1##1][#3]}%
> \processcommalist[#2]\docommando}}}
>
> \def\setupparagraphs
> {\dotripleempty\dosetupparagraphs}
>
> \newcount\alcounter
> \newcount\alnsize
> \newdimen\alhsize
>
> \def\doparagraphrule#1#2%
> {\doifelsevalue{\??al#2\the\alcounter\c!rule}\v!on
> {\linewidth\getvalue{\??al#2\the\alcounter\c!rulethickness}%
> \scratchdimen#1%
> \advance\scratchdimen-\linewidth
> \divide\scratchdimen \plustwo
> \hskip\scratchdimen
> \vrule\!!width\linewidth
> \hskip\scratchdimen}
> {\hskip#1}}
>
> \def\dostartparagraph#1%
> {\doifelsevaluenothing{\??al#1\the\alcounter\c!width}
> {\!!widtha\alhsize
> \divide\!!widtha \alnsize}
> {\!!widtha\getvalue{\??al#1\the\alcounter\c!width}}%
> \dostartattributes
> {\??al#1\the\alcounter}\c!style\c!color
> \empty
> \doifelsevalue{\??al#1\the\alcounter\c!height}\v!fit
> {\setbox0\vtop}
> {\setbox0\vtop to \getvalue{\??al#1\the\alcounter\c!height}}%
> \bgroup
> \blank[\v!disable]%
> \forgetall
> \getvalue{\??al#1\the\alcounter\c!top}%
> \getvalue{\??al#1\c!inner}%
> \hsize\!!widtha % setting \wd afterwards removed
> \getvalue{\??al#1\the\alcounter\c!inner}%
> \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!align}}% nodig?
> \expandafter\setupalign\expandafter[\!!stringa]%
> \edef\!!stringa{\getvalue{\??al#1\the\alcounter\c!tolerance}}% nodig?
> \expandafter\setuptolerance\expandafter[\!!stringa]%
> \ignorespaces
> \endgraf
> \ignorespaces
> %
> % Nadeel van de onderstaande constructie is dat \everypar
> % binnen een groep kan staan en zo steeds \begstruts
> % worden geplaatst. Mooi is anders dus moet het anders!
> %
> % Hier is \Everypar niet nodig.
> %
> \everypar{\begstrut\everypar\emptytoks}%
> %
> \ignorespaces\geenspatie % dubbel: \ignorespaces
> \getvalue{\??al#1\the\alcounter\c!command}}
>
> \def\dostopparagraph#1%
> {\ifvmode
> \removelastskip
> \else
> \unskip\endstrut\endgraf
> \fi
> \getvalue{\??al#1\the\alcounter\c!bottom}%
> \egroup
> \ifdim\wd0=\zeropoint % no data
> \wd0\!!widtha
> \fi
> \box0
> \dostopattributes
> %\ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
> % \def\next{\doparagraphcell{#1}}%
> %\else
> % \def\next{\dostopparagraphs{#1}}%
> %\fi
> %\next}
> \ifnum\alcounter<\getvalue{\??al#1\c!n}\relax
> \@EA\doparagraphcell
> \else
> \@EA\dostopparagraphs
> \fi{#1}}
>
> \def\doparagraphcell#1%
> {\global\advance\alcounter \plusone
> \doifelsevaluenothing{\??al#1\the\alcounter\c!distance}
> {\doifnot{\the\alcounter}{1}
> {\hskip\getvalue{\??al#1\c!distance}}}
> {\doifelse{\the\alcounter}{1}%
> {\hskip\getvalue{\??al#1\the\alcounter\c!distance}}
> {\doparagraphrule{\getvalue{\??al#1\the\alcounter\c!distance}}{#1}}}%
> \setvalue{#1}{\dostopparagraph{#1}}%
> \dostartparagraph{#1}}
>
> \def\dostartparagraphs#1%
> {\global\alcounter\zerocount
> \parindent\zeropoint
> \setlocalhsize
> \alhsize\localhsize
> \alnsize\getvalue{\??al#1\c!n}\relax
> \dorecurse
> {\getvalue{\??al#1\c!n}}
> {\doifelsevaluenothing{\??al#1\recurselevel\c!distance}
> {\ifnum\recurselevel=\plusone\else
> \global\advance\alhsize -\getvalue{\??al#1\c!distance}\relax
> \fi}
> {\global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!distance}\relax}%
> \doifvaluesomething{\??al#1\recurselevel\c!width}
> {\global\advance\alnsize \minusone
> \global\advance\alhsize -\getvalue{\??al#1\recurselevel\c!width}\relax}}%
> %\whitespace % gaat fout bij \framed
> \getvalue{\??al#1\c!before}%
> \leavevmode % gaat wel goed bij \framed, brrr
> \setbox\scratchbox\vbox\bgroup\hbox\bgroup\doparagraphcell{#1}}
>
> \def\dostopparagraphs#1%
> {\egroup
> \egroup
> \iftrue
> \hbox{\raise\strutheight\box\scratchbox}% new
> \else
> \box\scratchbox % old
> \fi
> \par
> \getvalue{\??al#1\c!after}}%
> \f
> \def\dosetuptab[#1]%
> {\getparameters[\??ta]
> [\c!headstyle=\v!normal,
> \c!headcolor=,
> \c!style=\v!normal,
> \c!color=,
> \c!width=\v!broad,
> \c!sample={\hskip4em},
> \c!before=,
> \c!after=,
> #1]%
> \definedescription
> [tab]
> [\c!headstyle=\@@taheadstyle,
> \c!headcolor=\@@tacolor,
> \c!sample=\@@tasample,
> \c!width=\@@tawidth,
> \c!before=\@@tabefore,
> \c!after=\@@taafter]}
>
> \def\setuptab
> {\dosingleargument\dosetuptab}
>
> \setuptab
> [\c!location=\v!left]
> \f
> % The following macro's are derived from PPCHTEX and
> % therefore take some LaTeX font-switching into account.
>
> \newif\ifloweredsubscripts
>
> % Due to some upward incompatibality of LaTeX to LaTeX2.09
> % and/or LaTeX2e we had to force \@@chemieletter. Otherwise
> % some weird \nullfont error comes up.
>
> \doifundefined{@@chemieletter}{\def\@@chemieletter{\rm}}
>
> \def\beginlatexmathmodehack
> {\ifmmode
> \let\endlatexmathmodehack\relax
> \else
> \def\endlatexmathmodehack{$}$\@@chemieletter
> \fi}
>
> \def\setsubscripts
> {\beginlatexmathmodehack
> \def\dosetsubscript##1##2##3%
> {\dimen0=##3\fontdimen5##2%
> \setxvalue{@@\string##1\string##2}{\the##1##2\relax}%
> ##1##2=\dimen0\relax}%
> \def\dodosetsubscript##1##2%
> {\dosetsubscript{##1}{\textfont2}{##2}%
> \dosetsubscript{##1}{\scriptfont2}{##2}%
> \dosetsubscript{##1}{\scriptscriptfont2}{##2}}%
> %\dodosetsubscript{\fontdimen14}{?}%
> \dodosetsubscript{\fontdimen16}{.7}%
> \dodosetsubscript{\fontdimen17}{.7}%
> \global\loweredsubscriptstrue
> \endlatexmathmodehack}
>
> \def\resetsubscripts
> {\ifloweredsubscripts
> \beginlatexmathmodehack
> \def\doresetsubscript##1##2%
> {\dimen0=\getvalue{@@\string##1\string##2}\relax
> ##1##2=\dimen0}%
> \def\dodoresetsubscript##1%
> {\doresetsubscript{##1}{\textfont2}%
> \doresetsubscript{##1}{\scriptfont2}%
> \doresetsubscript{##1}{\scriptscriptfont2}}%
> %\dodoresetsubscript{\fontdimen14}%
> \dodoresetsubscript{\fontdimen16}%
> \dodoresetsubscript{\fontdimen17}%
> \global\loweredsubscriptsfalse
> \endlatexmathmodehack
> \fi}
>
> \let\beginlatexmathmodehack = \relax
> \let\endlatexmathmodehack = \relax
>
> \def\chem#1#2#3%
> {\bgroup
> \setsubscripts
> \mathematics{\hbox{#1}_{#2}^{#3}}%
> \resetsubscripts
> \egroup}
>
> \unexpanded\def\celsius #1{#1\mathematics{^\circ}C}
> \unexpanded\def\inch {\mathematics{\prime\prime}} % was: \hbox{\rm\char125\relax}
> \unexpanded\def\fraction#1#2{\mathematics{#1\over#2}}
>
> % very dutch
>
> \unexpanded\def\graden {\mathematics{^\circ}}
>
> \def\bedragprefix {\euro\normalfixedspace}
> \def\bedragsuffix {}
> \def\bedragempty {\euro}
>
> \unexpanded\def\bedrag#1%
> {\strut\hbox\bgroup
> \let\normalfixedspace~%
> \doifelsenothing{#1}
> {\bedragempty}
> {\bedragprefix\digits{#1}\bedragsuffix}%
> \egroup}
>
> % \definieeralineas[test][n=3]
> %
> % \stelalineasin[test][3][breedte=4cm,uitlijnen=links]
> %
> % \startopelkaar
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{~.~~1,--} \\
> % \test hans \\ ton \\ \bedrag{~.~~1,~~} \\
> % \test hans \\ ton \\ \bedrag{~.100,--} \\
> % \test hans \\ ton \\ \subtot{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{1.000,--} \\
> % \test hans \\ ton \\ \totaal{1.000,--} \\
> % \test hans \\ ton \\ \bedrag{nihil,--} \\
> % \test hans \\ ton \\ \totaal{nihil,--} \\
> % \test hans \\ ton \\ \subtot{nihil,--} \\
> % \stopopelkaar
>
> \def\periodswidth {.5em}
> \def\periodsdefault{3} % was 5, but now it's like \unknown
>
> \unexpanded\def\periods
> {\dosingleempty\doperiods}
>
> \def\doperiods[#1]%
> {\dontleavehmode
> \begingroup
> \scratchdimen\periodswidth
> \hbox to \iffirstargument#1\else\periodsdefault\fi \scratchdimen
> {\leaders\hbox to \scratchdimen{\hss.\hss}\hss}%
> \endgroup}
>
> \unexpanded\def\unknown
> {\periods\relax} % relax prevents lookahead for []
>
> % compatibility macros
>
> \def\doorsnede
> {\hbox{\rlap/$\circ$} }
>
> \unexpanded\def\ongeveer
> {\mathematics\pm}
> \f
> \chardef\boundarycharactermode\plusone
>
> \def\midboundarycharacter#1#2%
> {\ifcase\boundarycharactermode
> \or
> %\nobreak
> \hskip\hspaceamount\currentlanguage{#2}%
> \languageparameter#1%
> %\nobreak
> \hskip\hspaceamount\currentlanguage{#2}%
> \or
> \languageparameter#1%
> \fi
> \chardef\boundarycharactermode\plusone}
>
> \def\leftboundarycharacter#1#2%
> {\ifcase\boundarycharactermode
> \or
> \languageparameter#1%
> \nobreak
> \hskip\hspaceamount\currentlanguage{#2}%
> \or
> \languageparameter#1%
> \fi
> \chardef\boundarycharactermode\plusone}
>
> \def\rightboundarycharacter#1#2%
> {\ifcase\boundarycharactermode
> \or
> \prewordbreak %\nobreak
> \hskip\hspaceamount\currentlanguage{#2}%
> \languageparameter#1%
> \or
> \languageparameter#1%
> \fi
> \chardef\boundarycharactermode\plusone}
> \f
> % actually this is pretty old, but temporary moved here
> %
> % obsolete:
>
> \def\setuphyphenmark
> {\dodoubleargument\getparameters[\??kp]}
>
> \setuphyphenmark
> [\c!sign=\composedhyphen]
>
> \installdiscretionaries || \@@kpsign
>
> % will become:
> %
> % \installdiscretionaries || \composedhyphen
>
> \def\composedhyphen
> {\discretionary
> {\hbox{\directsymbol\empty\c!leftcompoundhyphen}}
> {\hbox{\directsymbol\empty\c!rightcompoundhyphen}}
> {\hbox{\directsymbol\empty\c!compoundhyphen}}}
>
> \definesymbol[\c!leftcompoundhyphen] [\languageparameter\c!leftcompoundhyphen]
> \definesymbol[\c!rightcompoundhyphen] [\languageparameter\c!rightcompoundhyphen]
> \definesymbol[\c!compoundhyphen] [\languageparameter\c!compoundhyphen]
>
> \definehspace [sentence] [\zeropoint]
> \definehspace [intersentence] [.250em]
>
> \definesymbol
> [\c!midsentence]
> [\midboundarycharacter\c!midsentence{sentence}]
>
> \definesymbol
> [\c!leftsentence]
> [\leftboundarycharacter\c!leftsentence{sentence}]
>
> \definesymbol
> [\c!rightsentence]
> [\rightboundarycharacter\c!rightsentence{sentence}]
>
> \definesymbol
> [\c!leftsubsentence]
> [\leftboundarycharacter\c!leftsubsentence{sentence}]
>
> \definesymbol
> [\c!rightsubsentence]
> [\rightboundarycharacter\c!rightsubsentence{sentence}]
>
> \newsignal \subsentencesignal
> \newcounter\subsentencelevel
>
> \def\midsentence
> {\symbol[\c!midsentence]}
>
> \def\beginofsubsentence
> {\ifdim\lastkern=\subsentencesignal
> \unskip
> \kern\hspaceamount\currentlanguage{intersentence}%
> \fi
> \doglobal\increment\subsentencelevel
> \ifnum\subsentencelevel=\plusone
> \leaveoutervmode
> \fi
> \symbol[\ifodd\subsentencelevel\c!leftsentence \else
> \c!leftsubsentence\fi]%
> \ignorespaces}
>
> \def\beginofsubsentencespacing
> {\kern\subsentencesignal\ignorespaces}
>
> \def\endofsubsentence
> {\symbol[\ifodd\subsentencelevel\c!rightsentence \else
> \c!rightsubsentence\fi]%
> \doglobal\decrement\subsentencelevel
> \unskip
> \kern\subsentencesignal}
>
> \def\endofsubsentencespacing
> {\ifdim\lastkern=\subsentencesignal
> \unskip
> \hskip\hspaceamount\currentlanguage{intersentence}%
> \ignorespaces
> \else
> \unskip
> \fi}
>
> % test |<|test |<|test|>| test|>| test \par
> % test|<|test|<|test|>|test|>|test \par
> % test |<||<|test|>||>| test \par
>
> \enableactivediscretionaries
> \f
> \definehspace [quotation] [\zeropoint]
> \definehspace [interquotation] [.125em]
>
> %definehspace [quote] [\zeropoint]
> %definehspace [speech] [\zeropoint]
>
> \definehspace [quote] [\hspaceamount\currentlanguage{quotation}]
> \definehspace [speech] [\hspaceamount\currentlanguage{quotation}]
>
> \definesymbol
> [\c!leftquotation]
> [\leftboundarycharacter\c!leftquotation{quotation}]
>
> \definesymbol
> [\c!rightquotation]
> [\rightboundarycharacter\c!rightquotation{quotation}]
>
> \definesymbol
> [\c!leftquote]
> [\leftboundarycharacter\c!leftquote{quote}]
>
> \definesymbol
> [\c!rightquote]
> [\rightboundarycharacter\c!rightquote{quote}]
>
> \definesymbol
> [\c!leftspeech]
> [\leftboundarycharacter\c!leftspeech{speech}]
>
> \definesymbol
> [\c!rightspeech]
> [\rightboundarycharacter\c!rightspeech{speech}]
>
> \definesymbol
> [\c!middlespeech]
> [\leftboundarycharacter\c!middlespeech{speech}]
> \f
> % has been replaced by delimitedtext
> %
> % \def\leftquotationmark
> % {\setbox\scratchbox\hbox{\symbol[\c!leftquotation]}%
> % \doif\@@cilocation\v!margin{\hskip-\wd\scratchbox}%
> % \box\scratchbox}
> %
> % \def\rightquotationmark
> % {\hsmash{\symbol[\c!rightquotation]}}
> %
> % \newsignal\quotationsignal
> %
> % \def\setupquote
> % {\dodoubleargument\getparameters[\??ci]}
> %
> % \def\startquotation
> % {\bgroup\dosingleempty\dostartquotation}
> %
> % \def\dostartquotation[#1]%
> % {\@@cibefore
> % \doifelsenothing{#1}
> % {\let\dostopquotation\relax}
> % {\startnarrower[#1]%
> % \let\dostopquotation\stopnarrower}%
> % \dostartattributes\??ci\c!style\c!color\empty
> % \leftquotationmark
> % \ignorespaces}
> %
> % \def\stopquotation
> % {\removeunwantedspaces
> % \removelastskip
> % \rightquotationmark
> % \dostopattributes
> % \dostopquotation
> % \@@ciafter
> % \egroup}
> %
> % \def\dohandlequotation#1#2%
> % {\ifdim\lastskip=\quotationsignal
> % \unskip\hskip\hspaceamount\currentlanguage{interquotation}% hardcoded
> % \else
> % #2%
> % \fi
> % \ifhmode % else funny pagebeaks
> % \penalty\!!tenthousand\hskip\zeropoint % == \prewordbreak
> % \fi
> % \strut % new, needed below
> % \symbol[#1]%
> % \penalty\!!tenthousand\hskip\quotationsignal} % +- \prewordbreak
> %
> % \def\handlequotation#1%
> % {\dohandlequotation{#1}\relax}
> %
> % \unexpanded\def\quotation
> % {\groupedcommand
> % {\dohandlequotation\c!leftquotation \relax}
> % {\dohandlequotation\c!rightquotation\removelastskip}}
> %
> % \unexpanded\def\quote
> % {\doifelse\@@cistyle\v!normal\doquotedcite\doattributedcite}
> %
> % \def\doquotedcite
> % {\groupedcommand
> % {\dohandlequotation\c!leftquote \relax}
> % {\dohandlequotation\c!rightquote\removelastskip}}
> %
> % \def\doattributedcite
> % {\groupedcommand
> % {\dostartattributes\??ci\c!style\c!color}
> % {\dostopattributes}}
>
> %D The previous one fails in \placefloat[left]{}{}, so instead
> %D we use the next alternative, where the first one is handled
> %D outside group. Watch the strut.
>
> % has been replaced by delimitedtext
> %
> % \unexpanded\def\quotation
> % {\dohandlequotation\c!leftquotation\relax
> % \groupedcommand \donothing
> % {\dohandlequotation\c!rightquotation\removelastskip}}
> %
> % \def\doquotedcite
> % {\dohandlequotation\c!leftquote\relax
> % \groupedcommand \donothing
> % {\dohandlequotation\c!rightquote\removelastskip}}
> %
> % \setupquote
> % [\c!location=\v!margin,
> % \c!style=\v!normal,
> % \c!color=,
> % \c!before=\startnarrower,
> % \c!after=\stopnarrower]
>
> \appendtoks\def\quotation#1{"#1"}\to\simplifiedcommands
> \appendtoks\def\quote #1{'#1'}\to\simplifiedcommands
>
> %D The next features was so desperately needed by Giuseppe
> %D Bilotta that he made a module for it. Since this is a
> %D typical example of core functionality, I decided to extend
> %D the low level quotation macros in such a way that a speech
> %D feature could be build on top of it. The speech opening and
> %D closing symbols are defined per language. Italian is an
> %D example of a language that has them set.
>
> % has been be replaced by delimitedtext
> %
> % \newcounter\speechlevel \newconditional\insidespeech
> %
> % \def\startspeech
> % {\doglobal\increment\speechlevel\relax
> % \dohandlequotation\c!leftspeech\relax
> % \global\settrue\insidespeech
> % \ignorespaces}
> %
> % \def\stopspeech
> % {\dohandlequotation\c!rightspeech\removelastskip
> % \doglobal\decrement\speechlevel\relax
> % \ifcase\speechlevel\relax \global\setfalse\insidespeech \fi}
> %
> % \def\dohandlespeech % indirect since called in everypar
> % {\relax % still needed?
> % \ifcase\speechlevel\or\dodohandlespeech\fi}
> %
> % \def\dodohandlespeech
> % {\ifconditional\insidespeech
> % \dohandlequotation\c!middlespeech\relax
> % \else
> % \global\settrue\insidespeech
> % \fi}
> %
> % \unexpanded\def\speech
> % {\doglobal\increment\speechlevel\relax
> % \dohandlequotation\c!leftspeech\relax
> % \groupedcommand \ignorespaces
> % {\dohandlequotation\c!rightspeech\removelastskip
> % \doglobal\decrement\speechlevel\relax}}
>
> % \appendtoks \dohandlespeech \to \everypar
> \f
> % this will replace the quotation and speed definitions
>
> \newsignal\delimitedtextsignal
>
> \def\delimitedtextparameter#1%
> {\csname\??ci
> \ifundefined{\??ci\currentdelimitedtext#1}\else\currentdelimitedtext\fi
> #1\endcsname}
>
> \def\definedelimitedtext
> {\dodoubleempty\dodefinedelimitedtext}
>
> \def\dodefinedelimitedtext[#1][#2]%
> {\doifassignmentelse{#2}
> {\getparameters
> [\??ci#1]
> [\c!location=\v!margin, % \v!text \v!paragraph
> \c!spacebefore=,
> \c!spaceafter=\delimitedtextparameter\c!spacebefore,
> \c!style=\v!normal,
> \c!color=,
> \c!leftmargin=\zeropoint,
> \c!rightmargin=\delimitedtextparameter\c!leftmargin,
> \c!indentnext=\v!yes,
> \c!before=,
> \c!after=,
> \c!left=,
> \c!right=,
> \c!level=0,
> \c!repeat=\v!no,
> \c!method=,
> #2]}%
> {\doifdefined{#2}
> {\copyparameters[\??ci#1][\??ci#2]
> [\c!location,\c!spacebefore,\c!spaceafter,\c!style,\c!color,
> \c!leftmargin,\c!rightmargin,\c!indentnext,
> \c!before,\c!after,\c!left,\c!right]}}%
> \doifsomething{#1}
> {\unexpanded\setvalue{#1}{\delimitedtext[#1]}%
> \setvalue{\e!start#1}{\startdelimitedtext[#1]}%
> \setvalue{\e!stop#1}{\stopdelimitedtext}}}
>
> \def\setupdelimitedtext
> {\dodoubleargument\dosetupdelimitedtext}
>
> \def\dosetupdelimitedtext[#1][#2]%
> {\ifsecondargument
> \getparameters[\??ci#1][#2]%
> \else
> \getparameters[\??ci][#1]%
> \fi}
>
> \def\dorepeatdelimitedtext
> {\relax\ifcase\delimitedtextparameter\c!level\else
> \dohandledelimitedtext\c!middle
> \fi}
>
> \let\dohandlerepeatdelimitedtext\relax
>
> \def\startdelimitedtext[#1]%
> {\bgroup
> \def\currentdelimitedtext{#1}%
> \doifelse{\delimitedtextparameter\c!method}\s!font
> {\doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
> \def\dostopdelimitedtext{\removeunwantedspaces\ignoredelimitedtext\c!right}%
> \ignoredelimitedtext\c!left\ignorespaces}
> {\doifelse{\delimitedtextparameter\c!repeat}\v!yes
> {\let\dohandlerepeatdelimitedtext\dorepeatdelimitedtext}%
> {\let\dohandlerepeatdelimitedtext\relax}%
> \doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
> {\dosingleempty\dostartdelimitedtextpar}\dostartdelimitedtexttxt}}
>
> \def\dostartdelimitedtextpar[#1]%
> {\let\dostopdelimitedtext\dostopdelimitedtextpar
> \doifsomething{\delimitedtextparameter\c!spacebefore}
> {\blank[\delimitedtextparameter\c!spacebefore]}%
> \delimitedtextparameter\c!before
> % nicer:
> % \doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
> % \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
> % backward compatible:
> \doifelsenothing{#1}
> {\doadaptleftskip {\delimitedtextparameter\c!leftmargin}%
> \doadaptrightskip{\delimitedtextparameter\c!rightmargin}%
> \let\dodostopdelimitedtextpar\endgraf}
> {\startnarrower[#1]\let\dodostopdelimitedtextpar\stopnarrower}%
> % so far
> \dochecknextindentation{\??ci\currentdelimitedtext}%
> \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
> \leftdelimitedtextmark
> \doglobal\incrementvalue{\??ci\currentdelimitedtext\c!level}%
> \ignorespaces}
>
> \def\dostopdelimitedtextpar
> {\removeunwantedspaces
> \removelastskip
> \rightdelimitedtextmark
> \dostopattributes
> \dodostopdelimitedtextpar
> \delimitedtextparameter\c!after
> \doifsomething{\delimitedtextparameter\c!spaceafter}
> {\blank[\delimitedtextparameter\c!spaceafter]}}
>
> \def\dostartdelimitedtexttxt
> {\let\dostopdelimitedtext\dostopdelimitedtexttxt
> \dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color\empty
> \dohandledelimitedtext\c!left
> \ignorespaces}
>
> \def\dostopdelimitedtexttxt
> {\removeunwantedspaces
> \dohandledelimitedtext\c!right
> \dostopattributes}
>
> \def\stopdelimitedtext
> {\dostopdelimitedtext
> \doglobal\decrementvalue{\??ci\currentdelimitedtext\c!level}%
> \egroup}
>
> \def\delimitedtext[#1]%
> {\pushmacro\currentdelimitedtext
> \def\currentdelimitedtext{#1}%
> \doifelse{\delimitedtextparameter\c!method}\s!font
> {\dofontdrivendelimited}
> {\doifinsetelse{\delimitedtextparameter\c!location}{\v!paragraph,\v!margin}%
> \dodelimitedtextpar\dodelimitedtexttxt}}
>
> % shortcuts
>
> \def\startdelimited{\startdelimitedtext}
> \def\stopdelimited {\stopdelimitedtext} % no let, dynamically assigned
> \def\delimited {\delimitedtext}
>
> \def\leftdelimitedtextmark
> {\dontleavehmode
> \setbox\scratchbox\hbox{\delimitedtextparameter\c!left}%
> \doif{\delimitedtextparameter\c!location}\v!margin{\hskip-\wd\scratchbox}%
> \box\scratchbox}
>
> \def\rightdelimitedtextmark
> {\hsmash{\delimitedtextparameter\c!right}}
>
> \def\dohandledelimitedtext#1#2%
> {\begingroup
> \setbox\scratchbox\hbox{\delimitedtextparameter#1}%
> \ifdim\wd\scratchbox>\zeropoint
> \ifdim\lastskip=\delimitedtextsignal
> \unskip\hskip\hspaceamount\currentlanguage{interquotation}%
> \else
> #2%
> \fi
> \ifhmode % else funny pagebeaks
> \penalty\!!tenthousand\hskip\zeropoint % == \prewordbreak
> \fi
> \strut % new, needed below
> \delimitedtextparameter#1% unhbox\scratchbox
> \penalty\!!tenthousand\hskip\delimitedtextsignal % +- \prewordbreak
> \fi
> \endgroup}
>
> \def\ignoredelimitedtext#1%
> {\delimitedtextparameter#1}
>
> \def\handledelimitedtext#1%
> {\dohandledelimitedtext{#1}\relax}
>
> \unexpanded\def\dodelimitedtextpar
> {\dohandledelimitedtext\c!left\relax
> \groupedcommand
> \donothing
> {\dohandledelimitedtext\c!right\removelastskip}}
>
> \unexpanded\def\dodelimitedtexttxt
> {\doifelse{\delimitedtextparameter\c!style}\v!normal
> \doquoteddelimited\doattributeddelimited}
>
> \def\doquoteddelimited
> {\dohandledelimitedtext\c!left\relax
> \groupedcommand
> \donothing
> {\dohandledelimitedtext\c!right
> \removelastskip
> \popmacro\currentdelimitedtext}}
>
> \def\doattributeddelimited
> {\groupedcommand
> {\dostartattributes{\??ci\currentdelimitedtext}\c!style\c!color}
> {\dostopattributes
> \popmacro\currentdelimitedtext}}
>
> % \def\dofontdrivendelimited#1% thanks to Taco for sorting out the kerning interference
> % {\languageparameter{\c!left\currentdelimitedtext}%
> % #1% sorry, no verbatim support
> % \languageparameter{\c!right\currentdelimitedtext}%
> % \popmacro\currentdelimitedtext}
>
> \def\dofontdrivendelimited
> {\simplegroupedcommand
> {\languageparameter{\c!left\currentdelimitedtext}}
> {\languageparameter{\c!right\currentdelimitedtext}%
> \popmacro\currentdelimitedtext}}
> \f
> \definedelimitedtext
> [\v!quotation]
> [\c!left={\symbol[\c!leftquotation]},
> \c!right={\symbol[\c!rightquotation]},
> \c!leftmargin=\v!standard]
>
> \definedelimitedtext
> [\v!quote][\v!quotation]
>
> \setupdelimitedtext
> [\v!quote]
> [\c!location=\v!text,
> \c!left={\symbol[\c!leftquote]},
> \c!right={\symbol[\c!rightquote]}]
>
> \definedelimitedtext
> [\v!speech][\v!quotation]
>
> \setupdelimitedtext
> [\v!speech]
> [\c!repeat=\v!yes,
> \c!left={\symbol[\c!leftspeech]},
> \c!middle={\symbol[\c!middlespeech]},
> \c!right={\symbol[\c!rightspeech]}]
>
> % how do we call an tight quote
> %
> % \definedelimitedtext
> % [\v!quotation][\v!quotation]
> %
> % \setupdelimitedtext
> % [\v!quotation]
> % [\c!indentnext=\v!no,
> % \c!spacebefore=\v!nowhite]
>
> \def\setupquotation{\setupdelimitedtext[\v!quotation]}
> \def\setupquote {\setupdelimitedtext[\v!quote]}
> \f
> % seldom used, move from kernel to run time module
>
> \def\basegrid
> {\dosingleempty\dobasegrid}
>
> \def\dobasegrid[#1]%
> {\begingroup
> \getparameters[\??rt]
> [\c!x=0,\c!y=0,
> \c!nx=10,\c!ny=10,
> \c!dx=.5,\c!dy=.5,
> \c!xstep=0,\c!ystep=0,
> \c!unit=\s!cm,
> \c!scale=1,
> \c!factor=1,
> \c!offset=\v!yes,
> \c!location=\v!left,
> #1]%
> \startpositioning
> \dimen0=\@@rtdx\@@rtunit\relax
> \dimen0=\@@rtscale\dimen0\relax
> \dimen0=\@@rtfactor\dimen0\relax
> \multiply\dimen0 \@@rtnx\relax
> \dimen2=\@@rtdy\@@rtunit\relax
> \dimen2=\@@rtscale\dimen2\relax
> \dimen2=\@@rtfactor\dimen2\relax
> \multiply\dimen2 \@@rtny\relax
> \def\horline
> {\vbox
> {\hrule
> \!!width \dimen0
> \!!height \linewidth
> \!!depth \!!zeropoint}}%
> \def\verline%
> {\vrule
> \!!width \linewidth
> \!!height \dimen2
> \!!depth \!!zeropoint}%
> \doglobal\newcounter\@@gridc
> \doglobal\newcounter\@@gridd
> \doglobal\newcounter\@@gride
> \def\setlegend##1##2##3%
> {\gdef\@@gridc{0}%
> \dimen0=2em\relax
> \dimen2=##2\@@rtunit\relax
> \dimen2=\@@rtscale\dimen2\relax
> \dimen2=\@@rtfactor\dimen2\relax
> \divide\dimen0 \dimen2\relax
> \xdef\@@gride{\number\dimen0}%
> \ifnum\@@gride>50
> \gdef\@@gride{100}%
> \else\ifnum\@@gride>10
> \gdef\@@gride{50}%
> \else\ifnum\@@gride>5
> \gdef\@@gride{10}%
> \else\ifnum\@@gride>1
> \gdef\@@gride{5}%
> \else
> \gdef\@@gride{1}%
> \fi\fi\fi\fi
> \gdef\@@gridd{0}%
> \def\legend
> {\ifnum\@@gridd=\zerocount
> \vbox
> {\increment(\@@gridc,##1)%
> \hbox to 2em{\hss\@@gridc\hss}}%
> \global\let\@@gridd=\@@gride
> \fi
> \doglobal\decrement\@@gridd
> \doglobal\increment(\@@gridc,##1)}}%
> \def\draw##1##2##3##4##5##6##7##8##9%
> {\setuppositioning
> [\c!state=##8,
> \c!xstep=\v!absolute,
> \c!ystep=\v!absolute,
> \c!unit=\@@rtunit,
> \c!scale=\@@rtscale,
> \c!factor=\@@rtfactor,
> \c!offset=\@@rtoffset,
> \c!xoffset=##6,
> \c!yoffset=##7]%
> \doifelse{##9}\v!middle
> {\scratchdimen##3pt\scratchdimen.5\scratchdimen
> \edef\@@psxx{\withoutpt\the\scratchdimen}%
> \scratchdimen##4pt\scratchdimen.5\scratchdimen
> \edef\@@psyy{\withoutpt\the\scratchdimen}%
> \scratchcounter##2\advance\scratchcounter -1
> \edef\@@pszz{\the\scratchcounter}}
> {\edef\@@psxx{0}\edef\@@psyy{0}\edef\@@pszz{##2}}%
> \position(\@@psxx,\@@psyy){##1}%
> \setuppositioning
> [\c!state=##8,
> \c!xstep=\v!relative,
> \c!ystep=\v!relative,
> \c!scale=\@@rtscale,
> \c!factor=\@@rtfactor,
> \c!offset=\@@rtoffset,
> \c!unit=\@@rtunit]%
> \dorecurse\@@pszz{\position(##3,##4){##5}}}%
> \draw
> \verline\@@rtnx\@@rtdx0\verline\!!zeropoint\!!zeropoint\v!start\empty
> \draw
> \horline\@@rtny0\@@rtdy\horline\!!zeropoint\!!zeropoint\v!start\empty
> \tfx
> \doifnot\@@rtxstep{0}
> {\setlegend\@@rtxstep\@@rtdx\@@rtx
> \draw\legend\@@rtnx\@@rtdx0\legend{-1em}{-1.5em}\v!overlay\@@rtlocation}%
> \doifnot\@@rtystep{0}
> {\setlegend\@@rtystep\@@rtdy\@@rty
> \draw\legend\@@rtny0\@@rtdy\legend{-2em}{-.75ex}\v!overlay\@@rtlocation}%
> \stoppositioning
> \endgroup}
>
> \let\grid\basegrid
> \f
> % Dit wordt:
> %
> % \doorverwijzen[naam][instellingen] enz.
> %
> % waarbij <naam> bijvoorbeeld publicatie is. Dit levert:
> %
> % \start<naam>
> % \stop<naam>
> %
> % \beginvan<naam>
> % \eindvan<naam>
> %
> % \publicatie
> %
> % \volledigelijstmetpublicaties
> %
> % eigenlijk kan ook door... zo worden uitgebreid!
>
> % old, will become obsolete or module, replace by bib module
>
> \defineenumeration
> [@publicatie]
> [\c!location=\v!left,
> \c!width=\@@pbwidth,\c!hang=,\c!sample=,
> \c!before=\@@pbbefore,\c!after=\@@pbafter,\c!inbetween=,
> \c!headstyle=\@@pbheadstyle,\c!style=,
> \c!headcolor=\@@pbheadcolor,\c!color=,
> \c!way=\@@pbway,\c!blockway=\@@pbblockway,
> \c!text=,\c!left=\@@pbleft,\c!right=\@@pbright]
>
> \def\dosetuppublications[#1]%
> {\getparameters[\??pb][#1]}
>
> \def\setuppublications%
> {\dosingleargument\dosetuppublications}
>
> \def\apa@publicatie
> {\doifsomething\@@pb@naam {\@@pb@naam,\space}%
> \doifsomething\@@pb@titel {{\sl\@@pb@titel}.\space}%
> \doifsomething\@@pb@jaar {(\@@pb@jaar).\space}%
> \doifsomething\@@pb@plaats {\@@pb@plaats\doifelsenothing\@@pb@uitgever{.}{:\space}}%
> \doifsomething\@@pb@uitgever{\@@pb@uitgever.}}
>
> \def\normaal@publicatie
> {\@@pb@naam, \@@pb@titel, \@@pb@jaar, \@@pb@pagina, \@@pb@plaats, \@@pb@uitgever.}
>
> \def\complexstartpublicatie[#1]#2\stoppublicatie
> {\bgroup
> \def\dosetpublicatie
> {\processcommalist
> [naam,titel,jaar,plaats,pagina,uitgever]
> \setpublicatie
> \ignorespaces}%
> \def\setpublicatie##1%
> {\letvalue{\??pb @##1}\empty
> \setvalue{##1}####1{\setvalue{\??pb @##1}{####1}\ignorespaces}}%
> \def\getpublicatie%
> {\doifsomething\@@pbalternative{\getvalue{\@@pbalternative @publicatie}}}%
> \doifelse\@@pbnumbering\v!yes
> {\@publicatie[#1]\dosetpublicatie#2\getpublicatie\par}%
> {\@@pbbefore
> \dosetpublicatie\ignorespaces#2\getpublicatie
> \@@pbafter}%
> \egroup}
>
> \definecomplexorsimpleempty\startpublicatie
>
> \def\publication#1[#2]%
> {\@@pbleft\in{#1}[#2]\@@pbright}
>
> \setuppublications
> [\c!numbering=\v!yes,
> \c!alternative=\c!apa,
> \c!width=2em,
> \c!hang=,
> \c!sample=,
> \c!before=,
> \c!after=,
> \c!inbetween=,
> \c!headstyle=,
> \c!headcolor=,
> \c!style=,
> \c!color=,
> \c!blockway=\v!by\v!text,
> \c!way=\v!by\v!text,
> \c!text=,
> \c!left={[},
> \c!right={]}]
> \f
> % only used at pragma, move from kernel to run time module
>
> \def\referraldate
> {\currentdate[\v!referral]}
>
> \def\doreferral[#1]%
> {\noheaderandfooterlines
> \bgroup
> \getparameters
> [\??km]
> [\c!bet=\unknown,\c!dat=\unknown,\c!ken=\unknown,
> \c!from=,\c!to=,\c!ref=,#1]%
> % moet anders, hoort niet in 01b
> \assigntranslation[\s!nl=referentie,\s!en=reference,\s!de=Referenz,\s!sp=referencia]\to\@@@kmref
> \assigntranslation[\s!nl=van,\s!en=from,\s!de=Von,\s!sp=de]\to\@@@kmvan
> \assigntranslation[\s!nl=aan,\s!en=to,\s!de=An,\s!sp=a]\to\@@@kmaan
> \assigntranslation[\s!nl=betreft,\s!en=concerns,\s!de=Betreff,\s!sp=]\to\@@@kmbet
> \assigntranslation[\s!nl=datum,\s!en=date,\s!de=Datum,\s!sp=fecha]\to\@@@kmdat
> \assigntranslation[\s!nl=kenmerk,\s!en=mark,\s!de=Kennzeichen,\s!sp=]\to\@@@kmken
> %
> \definetabulate[\s!dummy][|l|p|]
> \startdummy
> \NC\@@@kmbet\EQ\@@kmbet\NC\NR
> \NC\@@@kmdat\EQ\@@kmdat\NC\NR
> \NC\@@@kmken\EQ\expanded{\smallcapped{\@@kmken}}\NC\NR
> \doifsomething{\@@kmfrom\@@kmto}{\NC\NC\NC\NR}%
> \doifsomething \@@kmfrom {\NC\@@@kmvan\EQ\@@kmfrom\NC\NR}%
> \doifsomething \@@kmto {\NC\@@@kmaan\EQ\@@kmto\NC\NR}%
> \doifsomething \@@kmref {\NC\NC\NC\NR\NC\@@@kmref\EQ\@@kmref\NC\NR}%
> \stopdummy
> \egroup}
>
> \def\referral
> {\dosingleargument\doreferral}
> \f
> % FUZZY OLD STUFF: will be removed when not used in some manual;
> % rows instead of columns, i'd forgotten that this code exist
> %
> % \definesystemvariable{ri}
> %
> % \def\setuprows
> % {\dodoubleargument\getparameters[\??ri]}
> %
> % \definecomplexorsimpleempty\startrows
> %
> % \def\complexstartrows[#1]%
> % {\bgroup
> % \setuprows[#1]%
> % \let\do@@ribottom\relax
> % \def\row
> % {\do@@ribottom
> % \egroup
> % \dimen0\vsize
> % \divide\dimen0 \@@rin
> % \advance\dimen0 -\lineskip
> % \vbox to \dimen0
> % \bgroup
> % \@@ritop
> % \let\do@@ribottom\@@ribottom
> % \ignorespaces}%
> % \bgroup
> % \row}
> %
> % \def\stoprows
> % {\do@@ribottom
> % \egroup
> % \egroup}
> %
> % \setuprows
> % [\c!n=2,
> % \c!top=,
> % \c!bottom=\vfill]
> \f
> % THIS WAS MAIN-003.TEX
>
> \startmessages dutch library: systems
> 41: externe file -- in groep -- bestaat niet
> \stopmessages
>
> \startmessages english library: systems
> 41: external file -- in group -- does not exist
> \stopmessages
>
> \startmessages german library: systems
> 41: Externe Datei -- in Gruppe -- existiert nicht
> \stopmessages
>
> \startmessages czech library: systems
> 41: externi soubor -- ve skupine -- neexistuje
> \stopmessages
>
> \startmessages italian library: systems
> 41: il file esterno -- del gruppo -- non esiste
> \stopmessages
>
> \startmessages norwegian library: systems
> 41: ekstern fil -- i gruppe -- eksisterer ikke
> \stopmessages
>
> \startmessages romanian library: systems
> 41: fisierul extern -- din grupul -- nu exista
> \stopmessages
>
> \startmessages french library: systems
> 41: le fichier externe -- du groupe -- n'existe pas
> \stopmessages
> \f
> \definetabulate
> [\v!legend]
> [|emj1|i1|mR|]
>
> \setuptabulate
> [\v!legend]
> [\c!unit=.75em,\c!inner=\setquicktabulate\leg,EQ={=}]
>
> \definetabulate
> [\v!legend][\v!two]
> [|emj1|emk1|i1|mR|]
>
> \definetabulate
> [\v!fact]
> [|R|ecmj1|i1mR|]
>
> \setuptabulate
> [\v!fact]
> [\c!unit=.75em,\c!inner=\setquicktabulate\fact,EQ={=}]
>
> \unexpanded\def\xbox
> {\bgroup\aftergroup\egroup\hbox\bgroup\tx\let\next=}
>
> \unexpanded\def\xxbox
> {\bgroup\aftergroup\egroup\hbox\bgroup\txx\let\next=}
>
> % \def\mrm#1%
> % {$\rm#1$}
> \f
> %D \macros
> %D {definepairedbox, setuppairedbox, placepairedbox}
> %D
> %D Paired boxes, formally called legends, but from now on a
> %D legend is just an instance, are primarily meant for
> %D typesetting some text alongside an illustration. Although
> %D there is quite some variation possible, the functionality is
> %D kept simple, if only because in most cases such pairs are
> %D typeset sober.
> %D
> %D The location specification accepts a pair, where the first
> %D keyword specifies the arrangement, and the second one the
> %D alignment. The first key of the location pair is one of
> %D \type {left}, \type {right}, \type {top} or \type {bottom},
> %D while the second key can also be \type {middle}.
> %D
> %D The first box is just collected in an horizontal box, but
> %D the second one is a vertical box that gets passed the
> %D bodyfont and alignment settings.
>
> %D Today we would implement this using layers .... but for the
> %D moment we keep it this way.
>
> % \startbuffer[test]
> % \test left \test left,top \test left,bottom \test left,middle
> % \test right \test right,top \test right,bottom \test right,middle
> % \test top \test top,left \test top,right \test top,middle
> % \test bottom \test bottom,left \test bottom,right \test bottom,middle
> % \stopbuffer
> %
> % \def\showtest#1%
> % {\pagina
> % \typebuffer[demo]
> % \def\test##1
> % {\startlinecorrection[blank]
> % \getbuffer[demo]%
> % \ruledhbox\placelegend
> % [bodyfont=6pt,location={##1}]
> % {\framed[width=.25\textwidth]{\tttf##1}}
> % {#1}
> % \stoplinecorrection}
> % \getbuffer[test]}
> %
> % \startbuffer[demo]
> % \setuplegend
> % [width=\hsize,maxwidth=\makeupwidth,
> % height=\vsize,maxheight=\makeupheight]
> % \stopbuffer
> %
> % \showtest{These examples demonstrate the default settings.}
> %
> % \startbuffer[demo]
> % \setuplegend
> % [width=\textwidth,
> % maxwidth=\textwidth]
> % \stopbuffer
> %
> % \showtest{\input tufte }
> %
> % \startbuffer[demo]
> % \setuplegend
> % [width=.65\textwidth]
> % \stopbuffer
> %
> % \showtest{\input knuth }
> %
> % \startbuffer[demo]
> % \setuplegend
> % [height=2cm]
> % \stopbuffer
> %
> % \showtest{These examples demonstrate some other settings.}
> %
> % \startbuffer[demo]
> % \setuplegend
> % [width=.65\textwidth,
> % height=2cm]
> % \stopbuffer
> %
> % \showtest{These examples demonstrate some other settings.}
> %
> % \startbuffer[demo]
> % \setuplegend
> % [n=2,align=right,width=.5\textwidth]
> % \stopbuffer
> %
> % \showtest{\input zapf }
>
> %D \macros
> %D {setuplegend, placelegend}
> %D
> %D It makes sense to typeset a legend to a figure in \TEX\
> %D and not in a drawing package. The macro \type {\placelegend}
> %D combines a figure (or something else) and its legend. This
> %D command is just a paired box.
> %D
> %D The legend is placed according to \type {location}, being
> %D \type {bottom} or \type {right}. The macro macro is used as
> %D follows.
> %D
> %D \starttyping
> %D \placefigure
> %D {whow}
> %D {\placelegend
> %D {\externalfigure[cow]}
> %D {\starttabulation
> %D \NC 1 \NC head \NC \NR
> %D \NC 2 \NC legs \NC \NR
> %D \NC 3 \NC tail \NC \NR
> %D \stoptabulation}}
> %D
> %D \placefigure
> %D {whow}
> %D {\placelegend
> %D {\externalfigure[cow]}
> %D {\starttabulation[|l|l|l|l|]
> %D \NC 1 \NC head \NC 3 \NC tail \NC \NR
> %D \NC 2 \NC legs \NC \NC \NC \NR
> %D \stoptabulation}}
> %D
> %D \placefigure
> %D {whow}
> %D {\placelegend[n=2]
> %D {\externalfigure[cow]}
> %D {\starttabulation
> %D \NC 1 \NC head \NC \NR
> %D \NC 2 \NC legs \NC \NR
> %D \NC 3 \NC tail \NC \NR
> %D \stoptabulation}}
> %D
> %D \placefigure
> %D {whow}
> %D {\placelegend[n=2]
> %D {\externalfigure[cow]}
> %D {head \par legs \par tail}}
> %D
> %D \placefigure
> %D {whow}
> %D {\placelegend[n=2]
> %D {\externalfigure[cow]}
> %D {\startitemize[packed]
> %D \item head \item legs \item tail \item belly \item horns
> %D \stopitemize}}
> %D
> %D \placefigure
> %D {whow}
> %D {\placelegend[n=2,width=.8\hsize]
> %D {\externalfigure[cow]}
> %D {\startitemize[packed]
> %D \item head \item legs \item tail \item belly \item horns
> %D \stopitemize}}
> %D \stoptyping
>
> \newbox\firstpairedbox
> \newbox\secondpairedbox
>
> \def\definepairedbox
> {\dodoubleempty\dodefinepairedbox}
>
> \def\dodefinepairedbox[#1][#2]%
> {\getparameters
> [\??ld#1]
> [\c!n=1,
> \c!distance=\bodyfontsize,
> \c!before=,
> \c!after=,
> \c!color=,
> \c!style=,
> \c!inbetween={\blank[\v!medium]},
> \c!width=\hsize,
> \c!height=\vsize,
> \c!maxwidth=\textwidth, % \makeupwidth,
> \c!maxheight=\textheight, % \makeupheight,
> \c!bodyfont=,
> \c!align=,
> \c!location=\v!bottom,
> #2]%
> \setvalue{\e!setup#1\e!endsetup}{\setuppairedbox[#1]}%
> \setvalue{\e!place#1}{\placepairedbox[#1]}}
>
> \def\setuppairedbox
> {\dodoubleempty\dosetuppairedbox}
>
> \def\dosetuppairedbox[#1]%
> {\getparameters[\??ld#1]}
>
> \def\placepairedbox
> {\bgroup\dodoubleempty\doplacepairedbox}
>
> \def\doplacepairedbox[#1][#2]% watch the hsize/vsize tricks
> {\setuppairedbox[#1][#2]% % and don't change them
> \copyparameters % brrr
> [\??ld][\??ld#1]
> [\c!n,\c!distance,\c!inbetween,\c!before,\c!after,
> \c!width,\c!height,\c!maxwidth,\c!maxheight,
> \c!color,\c!style,\c!bodyfont,\c!align,\c!location]%
> \@@ldbefore\bgroup
> \global\setsystemmode{pairedbox}%
> \beforefirstpairedbox
> \dowithnextbox
> {\betweenbothpairedboxes
> \dowithnextbox
> {\afterbothpairedboxes
> \egroup\@@ldafter
> \egroup}
> \vbox\bgroup
> \insidesecondpairedbox
> \let\next=}
> \hbox}
>
> \def\beforefirstpairedbox
> {\chardef\pairedlocationa1 % left
> \chardef\pairedlocationb4 % middle
> \getfromcommacommand[\@@ldlocation][1]%
> \processaction
> [\commalistelement]
> [ \v!left=>\chardef\pairedlocationa0,
> \v!right=>\chardef\pairedlocationa1,
> \v!top=>\chardef\pairedlocationa2,
> \v!bottom=>\chardef\pairedlocationa3]%
> \getfromcommacommand[\@@ldlocation][2]%
> \processaction
> [\commalistelement]
> [ \v!left=>\chardef\pairedlocationb0,
> \v!right=>\chardef\pairedlocationb1,
> \v!high=>\chardef\pairedlocationb2,
> \v!top=>\chardef\pairedlocationb2,
> \v!low=>\chardef\pairedlocationb3,
> \v!bottom=>\chardef\pairedlocationb3,
> \v!middle=>\chardef\pairedlocationb4]}
>
> \def\betweenbothpairedboxes
> {\switchtobodyfont[\@@ldbodyfont]% split under same regime
> \setbox\firstpairedbox\flushnextbox
> \ifnum\pairedlocationa<2
> \hsize\wd\firstpairedbox % trick
> \hsize\@@ldwidth
> \scratchdimen\wd\firstpairedbox
> \advance\scratchdimen \@@lddistance
> \bgroup\advance\scratchdimen \hsize
> \ifdim\scratchdimen>\@@ldmaxwidth\relax
> \egroup
> \hsize\@@ldmaxwidth
> \advance\hsize -\scratchdimen
> \else
> \egroup
> \fi
> \else
> \hsize\wd\firstpairedbox
> \hsize\@@ldwidth % can be \hsize
> \ifdim\hsize>\@@ldmaxwidth\relax \hsize\@@ldmaxwidth \fi % can be \hsize
> \fi
> \ifnum\@@ldn>\plusone
> \setrigidcolumnhsize\hsize\@@lddistance\@@ldn
> \fi}
>
> \def\afterbothpairedboxes
> {\setbox\secondpairedbox\vbox
> {% \localstartcolor[\@@ldcolor]% does not work yet
> \ifnum\@@ldn>1
> \rigidcolumnbalance\nextbox
> \else
> \flushnextbox
> \fi
> }% \localstopcolor}%
> \ifnum\pairedlocationa<2\hbox\else\vbox\fi\bgroup % hide vsize
> \forgetall
> \ifnum\pairedlocationa<2
> \scratchdimen\maxoftwoboxdimens\ht\firstpairedbox\secondpairedbox
> \vsize\scratchdimen
> \ifdim\scratchdimen<\@@ldheight\relax % can be \vsize
> \scratchdimen\@@ldheight
> \fi
> \ifdim\scratchdimen>\@@ldmaxheight\relax
> \scratchdimen\@@ldmaxheight
> \fi
> \valignpairedbox\firstpairedbox \scratchdimen
> \valignpairedbox\secondpairedbox\scratchdimen
> \else
> \scratchdimen\maxoftwoboxdimens\wd\firstpairedbox\secondpairedbox
> \halignpairedbox\firstpairedbox \scratchdimen
> \halignpairedbox\secondpairedbox\scratchdimen
> \scratchdimen\ht\secondpairedbox
> \vsize\scratchdimen
> \ifdim\ht\secondpairedbox<\@@ldheight\relax % can be \vsize
> \scratchdimen\@@ldheight\relax % \relax needed
> \fi
> \ifdim\scratchdimen>\@@ldmaxheight\relax % todo: totale hoogte
> \scratchdimen\@@ldmaxheight\relax % \relax needed
> \fi
> \ifdim\scratchdimen>\ht\secondpairedbox
> \setbox\secondpairedbox\vbox to \scratchdimen
> {\ifnum\pairedlocationa=3 \vss\fi %
> \box\secondpairedbox
> \ifnum\pairedlocationa=2 \vss\fi}% \kern\zeropoint
> \fi
> \fi
> \ifcase\pairedlocationa
> \box\secondpairedbox\hskip\@@lddistance\box\firstpairedbox \or
> \box\firstpairedbox \hskip\@@lddistance\box\secondpairedbox\or
> \box\secondpairedbox\endgraf \nointerlineskip \@@ldinbetween \box\firstpairedbox \or
> \box\firstpairedbox \endgraf \nointerlineskip \@@ldinbetween \box\secondpairedbox\else
> \fi
> \egroup}
>
> \def\insidesecondpairedbox
> {\forgetall
> \setupalign[\@@ldalign]%
> \tolerantTABLEbreaktrue % hm.
> \blank[\v!disable]%
> \everypar{\begstrut}}
>
> \def\maxoftwoboxdimens#1#2#3%
> {#1\ifdim#1#2>#1#3 #2\else#3\fi}
>
> \def\valignpairedbox#1#2%
> {\setbox#1\vbox to #2
> {\ifcase\pairedlocationb\or\or\or\vss\or\vss\fi
> \box#1\relax
> \ifcase\pairedlocationb\or\or\vss\or\or\vss\fi}}
>
> \def\halignpairedbox#1#2%
> {\setbox#1\hbox to #2
> {\ifcase\pairedlocationb\or\hss\or\or\or\hss\fi
> \box#1\relax
> \ifcase\pairedlocationb\hss\or\or\or\or\hss\fi}}
>
> \definepairedbox[\v!legend]
>
> %D Goody:
>
> \newevery \everyinsidefloat \relax
>
> \appendtoks
> \global\resetsystemmode{combination}%
> \global\resetsystemmode{pairedbox}%
> \to \everyinsidefloat
> \f
> \newcount\horcombination % counter
> \newcount\totcombination
>
> \def\definecombination
> {\dodoubleempty\dodefinecombination}
>
> \def\dodefinecombination[#1][#2]%
> {\copyparameters
> [\??co#1][\??co]
> [\c!width,\c!height,\c!distance,\c!location,%
> \c!before,\c!inbetween,\c!after,\c!align,%
> \c!style,\c!color]%
> \getparameters
> [\??co#1][#2]}
>
> \def\setupcombinations
> {\dodoubleempty\dosetupcombinations}
>
> \def\dosetupcombinations[#1][#2]%
> {\ifsecondargument
> \getparameters[\??co#1][#2]%
> \else
> \getparameters[\??co][#1]%
> \fi}
>
> \def\combinationparameter#1%
> {\csname\??co\currentcombination#1\endcsname}%
>
> \def\startcombination
> {\bgroup % so we can grab a group
> \dodoubleempty\dostartcombination}
>
> \def\dostartcombination[#1][#2]%
> {\global\setsystemmode{combination}%
> \ifsecondargument
> \def\currentcombination{#1}%
> \else
> \let\currentcombination\empty
> \fi
> \forgetall
> \doifelse{\combinationparameter\c!height}\v!fit
> \vbox {\vbox to \combinationparameter\c!height}%
> \bgroup
> %\doifelsenothing{#1}
> % {\dodostartcombination[2*1*]}
> % {\doifelsenothing{#2}
> % {\dodostartcombination[#1*1*]}
> % {\dodostartcombination[#2*1*]}}}
> \expanded{\dodostartcombination
> [\ifsecondargument#2\else\iffirstargument#1\else2\fi\fi*1*]}}
>
> \long\def\dodostartcombination[#1*#2*#3]%
> {\setuphorizontaldivision
> [\c!n=\v!fit,\c!distance=\combinationparameter\c!distance]%
> \global\horcombination#1%
> \global\totcombination#2%
> \global\setbox\combinationstack\emptybox
> \xdef\maxhorcombination{\the\horcombination}%
> \multiply\totcombination\horcombination
> \tabskip\zeropoint
> \doifelse{\combinationparameter\c!width}\v!fit
> {\halign}{\halign to \combinationparameter\c!width}%
> \bgroup&%
> %\hfil##\hfil% now : location={left,top}
> \ExpandBothAfter\doifnotinset\v!left{\combinationparameter\c!location}\hfil
> ##%
> \ExpandBothAfter\doifnotinset\v!right{\combinationparameter\c!location}\hfil
> &\tabskip\zeropoint \!!plus 1fill##\cr
> \docombination}
>
> \def\docombination % we want to add struts but still ignore an empty box
> {\dowithnextbox
> {\setbox0\flushnextbox
> \dowithnextbox
> {\setbox2\flushnextbox
> \dodocombination}%
> \vtop\bgroup
> \def\next
> {\futurelet\nexttoken\nextnext}%
> \def\nextnext
> {\ifx\nexttoken\egroup \else % the next box is empty
> \hsize\wd0
> \setupalign[\combinationparameter\c!align]%
> \dostartattributes{\??co\currentcombination}\c!style\c!color\empty
> \bgroup
> \aftergroup\endstrut
> \aftergroup\dostopattributes
> \aftergroup\egroup
> \begstrut
> \fi}%
> \afterassignment\next\let\nexttoken=}
> \hbox}
>
> % stupid version, does not align top stuff when captions,
> % keep as example
> %
> % \def\dodocombination
> % {\vbox
> % {\forgetall % \setupwhitespace[\v!none]%
> % \let\next\vbox
> % \ExpandFirstAfter\processallactionsinset
> % [\combinationparameter\c!location]
> % [ \v!top=>\let\next\tbox,
> % \v!middle=>\let\next\halfwaybox]%
> % \next{\copy0}%
> % \ifdim\ht2>\zeropoint % beter dan \wd2, nu \strut mogelijk
> % \combinationparameter\c!inbetween
> % %\vtop % wrong code
> % % {\nointerlineskip % recently added
> % % \hsize\wd0
> % % \setupalign[\combinationparameter\c!align]% % \raggedcenter
> % % \begstrut\unhbox2\endstrut}%
> % \box2
> % \fi}%
> % \ifnum\totcombination>\plusone
> % \global\advance\totcombination\minusone
> % \global\advance\horcombination\minusone
> % \ifnum\horcombination=\zerocount
> % \def\next
> % {\cr\noalign
> % {\forgetall % \setupwhitespace[\v!geen]% no
> % \nointerlineskip
> % \combinationparameter\c!before
> % \combinationparameter\c!after
> % \vss
> % \nointerlineskip}%
> % \global\horcombination\maxhorcombination\relax
> % \docombination}%
> % \else
> % \def\next
> % {&&&\hskip\combinationparameter\c!distance&\docombination}%
> % \fi
> % \else
> % \def\next
> % {\cr\egroup}%
> % \fi
> % \next}
>
> % \def\dodocombination
> % {\vbox
> % {\forgetall % \setupwhitespace[\v!none]%
> % \let\next\vbox
> % \ExpandFirstAfter\processallactionsinset
> % [\combinationparameter\c!plaats]
> % [ \v!top=>\let\next\tbox,
> % \v!middle=>\let\next\halfwaybox]%
> % \next{\copy0}%
> % % we need to save the caption for a next alignment line
> % \saveoncombinationstack2}%
> % \ifnum\totcombination>\plusone
> % \global\advance\totcombination\minusone
> % \global\advance\horcombination\minusone
> % \ifnum\horcombination=\zerocount
> % \def\next
> % {\cr
> % \flushcombinationstack
> % \noalign
> % {\forgetall % \setupwhitespace[\v!none]% no
> % \global\setbox\combinationstack\emptybox
> % \nointerlineskip
> % \combinationparameter\c!after
> % \combinationparameter\c!before
> % \vss
> % \nointerlineskip}%
> % \global\horcombination\maxhorcombination\relax
> % \docombination}%
> % \else
> % \def\next
> % {&&&\hskip\combinationparameter\c!distance&\docombination}%
> % \fi
> % \else
> % \def\next
> % {\cr
> % \flushcombinationstack
> % \egroup}%
> % \fi
> % \next}
>
> \def\depthonlybox
> {\dowithnextbox{\vtop{\hsize\wd\nextbox\kern\zeropoint\box\nextbox}}\vbox}
>
> % \def\boxwithstrutheight
> % {\dowithnextbox
> % {\scratchdimen\strutheight
> % \advance\scratchdimen-\nextboxht
> % \hbox{\raise\scratchdimen\box\nextbox}}%
> % \vbox}
>
> \def\dodocombination
> {\vbox
> {\forgetall % \setupwhitespace[\v!none]%
> \let\next\vbox
> \ExpandFirstAfter\processallactionsinset
> [\combinationparameter\c!location]
> [ \v!top=>\let\next\depthonlybox, % \tbox,
> \v!middle=>\let\next\halfwaybox]%
> \next{\copy0}%
> % we need to save the caption for a next alignment line
> \saveoncombinationstack2}%
> \ifnum\totcombination>\plusone
> \global\advance\totcombination\minusone
> \global\advance\horcombination\minusone
> \ifnum\horcombination=\zerocount
> \def\next
> {\cr
> \flushcombinationstack
> \noalign
> {\forgetall % \setupwhitespace[\v!none]% no
> \global\setbox\combinationstack\emptybox
> \nointerlineskip
> \combinationparameter\c!after
> \combinationparameter\c!before
> \vss
> \nointerlineskip}%
> \global\horcombination\maxhorcombination\relax
> \docombination}%
> \else
> \def\next
> {&&&\hskip\combinationparameter\c!distance&\docombination}%
> \fi
> \else
> \def\next
> {\cr
> \flushcombinationstack
> \egroup}%
> \fi
> \next}
>
> \def\stopcombination
> {\egroup
> \egroup}
>
> \newbox\combinationstack
>
> \def\saveoncombinationstack#1%
> {\global\setbox\combinationstack\hbox
> {\hbox{\box#1}\unhbox\combinationstack}}
>
> \def\flushcombinationstack
> {\noalign
> {\ifdim\ht\combinationstack>\zeropoint
> \nointerlineskip % nieuw
> \combinationparameter\c!inbetween
> \global\horcombination\maxhorcombination
> \globallet\doflushcombinationstack\dodoflushcombinationstack
> \else
> \global\setbox\combinationstack\emptybox
> \globallet\doflushcombinationstack\donothing
> \fi}%
> \doflushcombinationstack\crcr}
>
> \gdef\dodoflushcombinationstack
> {\global\setbox\combinationstack\hbox
> {\unhbox\combinationstack
> \global\setbox1\lastbox}%
> \box1% \ruledhbox{\box1}%
> \global\advance\horcombination\minusone\relax
> \ifnum\horcombination>\zerocount
> \def\next{&&&&\doflushcombinationstack}%
> \else
> \global\setbox\combinationstack\emptybox
> %\let\next\relax
> \@EA\gobbleoneargument
> \fi
> \next}
>
> \setupcombinations
> [\c!width=\v!fit,
> \c!height=\v!fit,
> \c!distance=1em,
> \c!location=\v!bottom, % can be something {top,left}
> \c!before=\blank,
> \c!inbetween={\blank[\v!medium]},
> \c!style=,
> \c!color=,
> \c!after=,
> \c!align=\v!middle]
> \f
> % does not work
> %
> % \def\plaatsondernaastelkaar#1#2%
> % {\bgroup
> % \def\doplaatsondernaastelkaar%
> % {#2\cr\omit\bgroup#2%
> % \aftergroup#2%
> % \aftergroup\cr
> % \aftergroup\egroup
> % \aftergroup\egroup
> % \let\next=}%
> % #1\bgroup##\cr
> % \omit\bgroup#2%
> % \aftergroup\doplaatsondernaastelkaar
> % \let\next=}
>
> \def\plaatsondernaastelkaar#1#2%
> {\bgroup
> \dowithnextbox
> {\bgroup
> \setbox0\box\nextbox
> \dowithnextbox
> {\setbox2\box\nextbox
> #1{#2#########2\cr\box0\cr\box2\cr}
> \egroup
> \egroup}
> \hbox}
> \hbox}
>
> \def\placeontopofeachother
> {\plaatsondernaastelkaar\halign\hss}
>
> \def\placesidebyside
> {\plaatsondernaastelkaar\valign\vss}
> \f
> \def\douseexternalfiles[#1][#2]%
> {\getparameters
> [\??fi#1]
> [\c!file=,
> \c!bodyfont=,
> \c!option=,
> #2]}
>
> \def\useexternalfiles
> {\dodoubleargument\douseexternalfiles}
>
> \def\dostelexternefilesin[#1][#2]%
> {\doifundefinedelse{\??fi#1\c!file}
> {\useexternalfiles[#1][#2]}
> {\getparameters[\??fi#1][#2]}}
>
> \def\stelexternefilesin
> {\dodoubleargument\dostelexternefilesin}
>
> \def\verwerkexternefile#1#2#3%
> {\bgroup
> \getparameters[\??fi#1][\c!file=,#3]%
> \doinputonce{\getvalue{\??fi#1\c!file}}%
> \ExpandFirstAfter\switchtobodyfont[\getvalue{\??fi#1\c!bodyfont}]%
> \readsysfile{#2} % beter: loc of fix gebied
> \donothing
> {\showmessage\m!systems{41}{#2,#1}}%
> \egroup}
>
> \def\douseexternalfile[#1][#2][#3][#4]%
> {\stelexternefilesin[#1][]%
> \doinputonce{\getvalue{\??fi#1\c!file}}%
> \doifelsenothing{#2}
> {\setvalue{#3}{\verwerkexternefile{#1}{#3}{#4}}}
> {\setvalue{#2}{\verwerkexternefile{#1}{#3}{#4}}}}
>
> \def\useexternalfile
> {\doquadrupleargument\douseexternalfile}
>
> \useexternalfiles
> [pictex]
> [\c!bodyfont=\v!small,
> \c!file=pictex]
>
> \useexternalfiles
> [table]
> [\c!file=table]
> \f
> %D A couple of examples, demonstrating how the depth is
> %D taken care of:
> %D
> %D \startbuffer
> %D test\rotate[frame=on, rotation=0] {gans}%
> %D test\rotate[frame=on, rotation=90] {gans}%
> %D test\rotate[frame=on, rotation=180]{gans}%
> %D test\rotate[frame=on, rotation=270]{gans}%
> %D test
> %D \stopbuffer
> %D
> %D \typebuffer \getbuffer
>
> % \presetlocalframed[\??ro]
> %
> % \def\setuprotate
> % {\dodoubleargument\getparameters[\??ro]}
> %
> % \def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
> % {\bgroup
> % \hbox\bgroup % compatibility hack
> % \dowithnextbox
> % {\edef\@@rorotation{#1}%
> % \setbox\nextbox\vbox{\flushnextbox}%
> % \dostoprotate
> % \egroup}}
> %
> % \def\dodostoprotate#1#2#3#4#5#6%
> % {\dontshowcomposition
> % \scratchdimen\nextboxht\advance\scratchdimen\nextboxdp
> % \doif\@@rolocation\v!high
> % {\setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}}%
> % \setbox\nextbox\vbox to #1
> % {#2\relax
> % \hbox to #4
> % {#5\relax % \number removes leading spaces too
> % \edef\@@rorotation{\number\@@rorotation}%
> % \doifelsenothing\@@rorotation
> % {\dostartrotation{90}}
> % {\dostartrotation{\@@rorotation}}%
> % \nextboxwd\zeropoint
> % \nextboxht\zeropoint
> % %\nextboxdp\zeropoint
> % \flushnextbox
> % \dostoprotation
> % #6}
> % #3}%
> % \nextboxdp\zeropoint
> % \flushnextbox
> % \egroup}
> %
> % \def\dostoprotate
> % {\!!counta\@@rorotation
> % \divide\!!counta 90
> % \ifcase\!!counta
> % \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> % \or
> % %\dodostoprotate\nextboxwd\vfill\relax\nextboxht\relax\hfill
> % \dodostoprotate\nextboxwd\vfill\relax\scratchdimen\relax\hfill
> % \or
> % \dodostoprotate\nextboxht\vfill\relax\nextboxwd\hfill\relax
> % \or
> % %\dodostoprotate\nextboxwd\relax\vfill\nextboxht\hfill\relax
> % \dodostoprotate\nextboxwd\relax\vfill\scratchdimen\hfill\relax
> % \or
> % \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> % \else
> % \def\@@rotation{90}%
> % \dodostoprotate\nextboxht\relax\vfill\nextboxwd\relax\hfill
> % \fi}
> %
> % \def\complexrotate[#1]%
> % {\dowithnextbox
> % {\getparameters[\??ro][#1]%
> % \dostoprotate}%
> % \vbox\localframed[\??ro][#1]}
> %
> % \unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
> % {\bgroup\complexorsimpleempty\rotate}
> %
> % \setuprotate
> % [\c!rotation=90,
> % \c!width=\v!fit,
> % \c!height=\v!fit,
> % \c!offset=\v!overlay,
> % \c!frame=\v!off]
>
> % The previous implementation is replaced by one that supports
> % rotation over arbitrary angles.
> %
> % When we rotate over arbitrary angles, we need to relocate the
> % resulting box because rotation brings that box onto the negative
> % axis. The calculations (mostly sin and cosine) need to be tuned for
> % the way a box is packages (i.e. the refence point). A typical example
> % of drawing, scribbling, and going back to the days of school math.
> %
> % We do a bit more calculations than needed, simply because that way
> % it's easier to debug the code.
>
> \def\dododorotatenextbox
> {\setbox\nextbox\vbox to \@@layerysiz
> {\vfill
> \hbox to \@@layerxsiz
> {\dostartrotation\@@rorotation
> \nextboxwd\zeropoint
> \nextboxht\zeropoint
> \flushnextbox
> \dostoprotation
> \hfill}%
> \kern\@@layerypos}%
> \setbox\nextbox\hbox
> {\kern\@@layerxpos
> \kern\@@layerxoff
> \lower\@@layeryoff\flushnextbox}}
>
> \def\dodorotatenextbox#1#2% quite some trial and error -)
> {\dontshowcomposition
> \dontcomplain
> \ifnum#2=\plusfour
> % new, location=middle
> \!!widthb \nextboxwd
> \!!heightb\nextboxht
> \!!depthb \nextboxdp
> \setbox\nextbox\vbox{\vskip.5\nextboxht\hskip-.5\nextboxwd\flushnextbox}%
> \smashbox\nextbox
> \fi
> \!!widtha \nextboxwd
> \!!heighta\nextboxht
> \!!deptha \nextboxdp
> \!!doneafalse
> \!!donebfalse
> \ifcase#2\or
> % 1: fit
> \or
> % 2: depth, not fit
> \!!doneatrue
> \!!donebtrue
> \or
> % 3: depth, fit
> \!!donebtrue
> \fi
> \setbox\nextbox\vbox{\hbox{\raise\nextboxdp\flushnextbox}}%
> \!!dimena \nextboxht
> \calculatecos\@@rorotation\edef\cos{\calculatedcos\@@rorotation}%
> \calculatesin\@@rorotation\edef\sin{\calculatedsin\@@rorotation}%
> \@@layerxpos\zeropoint
> \@@layerypos\zeropoint
> \@@layerxoff\zeropoint
> \@@layeryoff\zeropoint
> \ifdim\sin\points>\zeropoint
> \ifdim\cos\points>\zeropoint
> \@@layerxsiz \cos\!!widtha
> \@@layerysiz \sin\!!widtha
> \advance\@@layerxsiz \sin\!!dimena
> \advance\@@layerysiz \cos\!!dimena
> \@@layerypos \cos\!!dimena
> \if!!donea
> \@@layerxoff \negated\sin\!!dimena
> \advance\@@layerxoff \sin\!!deptha
> \fi
> \if!!doneb
> \@@layeryoff \cos\!!deptha
> \fi
> \dododorotatenextbox
> \else
> \@@layerxsiz \negated\cos\!!widtha
> \@@layerysiz \sin\!!widtha
> \advance\@@layerxsiz \sin\!!dimena
> \advance\@@layerysiz \negated\cos\!!dimena
> \@@layerxpos \negated\cos\!!widtha
> \if!!donea
> \@@layerxoff -\@@layerxsiz
> \advance\@@layerxoff \sin\!!deptha
> \fi
> \if!!doneb
> \@@layeryoff \negated\cos\!!heighta
> \fi
> \dododorotatenextbox
> \wd\nextbox\if!!donea\sin\!!deptha\else\@@layerxsiz\fi
> \fi
> \else
> \ifdim\cos\points<\zeropoint
> \@@layerxsiz \negated\cos\!!widtha
> \@@layerysiz \negated\sin\!!widtha
> \advance\@@layerxsiz \negated\sin\!!dimena
> \advance\@@layerysiz \negated\cos\!!dimena
> \@@layerxpos \@@layerxsiz
> \@@layerypos \negated\sin\!!widtha
> \if!!donea
> \@@layerxoff -\@@layerxsiz
> \advance\@@layerxoff \negated\sin\!!heighta
> \fi
> \if!!doneb
> \@@layeryoff \@@layerysiz
> \advance\@@layeryoff \cos\!!deptha
> \fi
> \dododorotatenextbox
> \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
> \else
> \@@layerxsiz \cos\!!widtha
> \@@layerysiz \negated\sin\!!widtha
> \advance\@@layerxsiz \negated\sin\!!dimena
> \advance\@@layerysiz \cos\!!dimena
> \ifdim\sin\points=\zeropoint
> \@@layerxpos \zeropoint
> \@@layerxoff \zeropoint
> \@@layerypos \@@layerysiz
> \if!!doneb
> \@@layeryoff \!!deptha
> \fi
> \else
> \@@layerypos \@@layerysiz
> \@@layerxpos \negated\sin\!!dimena
> \if!!donea
> \@@layerxoff -\@@layerxsiz
> \advance\@@layerxoff \negated\sin\!!heighta
> \fi
> \if!!doneb
> \@@layeryoff \negated\sin\!!deptha
> \fi
> \fi
> \dododorotatenextbox
> \ifdim\sin\points=\zeropoint
> \else
> \wd\nextbox\if!!donea\negated\sin\!!heighta\else\@@layerxsiz\fi
> \fi
> \fi
> \fi
> % new, location=middle
> \ifnum#2=\plusfour
> \setbox\nextbox\vbox{\vskip-.5\!!heightb\hskip.5\!!heightb\flushnextbox}%
> \nextboxwd\!!widthb
> \nextboxht\!!heightb
> \nextboxdp\!!depthb
> \fi}
>
> \def\dorotatenextbox#1#2%
> {\doifsomething{#1}
> {\edef\@@rorotation{\number#1}% get rid of leading zeros and spaces
> \setbox\nextbox\vbox{\flushnextbox}% not really needed
> \dodorotatenextbox\@@rorotation#2}%
> \hbox{\boxcursor\flushnextbox}}
>
> \def\dodorotatebox#1% {angle} \hbox/\vbox/\vtop
> {\bgroup\hbox\bgroup % compatibility hack
> \dowithnextbox
> {\dorotatenextbox{#1}\plusone
> \egroup\egroup}}
>
> \def\dorotatebox#1% {angle} \hbox/\vbox/\vtop
> {\ifcase#1\relax
> \expandafter\gobbleoneargument
> \else
> \expandafter\dodorotatebox
> \fi{#1}}
>
> \unexpanded\def\rotate % \bgroup: \rotate kan argument zijn
> {\bgroup\complexorsimpleempty\rotate}
>
> \def\complexrotate[#1]% framed met diepte !
> {\getparameters[\??ro][#1]%
> \processaction
> [\@@rolocation]
> [ \v!depth=>\!!counta\plusthree\donefalse,% depth fit - raw box
> \v!fit=>\!!counta\plustwo \donefalse,% depth tight - raw box
> \v!broad=>\!!counta\plusone \donefalse,% nodepth fit - raw box
> \v!high=>\!!counta\plusone \donetrue ,% nodepth fit - framed
> \v!middle=>\!!counta\plusfour \donefalse,% centered, keep dimensions
> \s!default=>\!!counta\plusthree\donetrue ,% depth fit - framed
> \s!unknown=>\!!counta\plusthree\donetrue ]% depth fit - framed
> \ifdone
> \def\docommand{\localframed[\??ro][#1,\c!location=]}%
> \else
> \let\docommand\relax
> \fi
> \dowithnextbox{\dorotatenextbox\@@rorotation\!!counta\egroup}\vbox\docommand}
>
> \presetlocalframed[\??ro]
>
> \def\setuprotate
> {\dodoubleargument\getparameters[\??ro]}
>
> \setuprotate
> [\c!rotation=90,
> \c!location=\v!normal,
> \c!width=\v!fit,
> \c!height=\v!fit,
> \c!offset=\v!overlay,
> \c!frame=\v!off]
>
> % \dostepwiserecurse{0}{360}{10}
> % {\startlinecorrection[blank]
> % \hbox
> % {\expanded{\setuprotate[rotation=\recurselevel]}%
> % \traceboxplacementtrue
> % \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=depth] {\ruledhbox{\bfb (depth)}}}}%
> % \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=fit] {\ruledhbox{\bfb (fit)}}}}%
> % \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=broad] {\ruledhbox{\bfb (broad)}}}}%
> % \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=normal]{\ruledhbox{\bfb (normal)}}}}%
> % \hbox to .2\hsize{\hss\ruledhbox{\rotate[location=high] {\ruledhbox{\bfb (high)}}}}}
> % \stoplinecorrection}
> \f
> % scale
>
> \def\doscalelikeafigure % quite dirty and potential interference possible
> {\doifsomething{\@@xyscale\@@xyxscale\@@xyyscale
> \@@xyfactor\@@xyhfactor\@@xywfactor
> \@@xywidth\@@xyheight\@@xylines}
> {\let \@@efscale \@@xyscale
> \let \@@efxscale \@@xyxscale
> \let \@@efyscale \@@xyyscale
> \let \@@effactor \@@xyfactor
> \let \@@efwfactor\@@xywfactor
> \let \@@efhfactor\@@xyhfactor
> \let \@@efwidth \@@xywidth
> \let \@@efheight \@@xyheight
> \let \@@eflines \@@xylines
> \let \@@efgrid \@@xygrid
> \let \@@epx \!!zeropoint
> \let \@@epy \!!zeropoint
> \edef\@@epw {\the\nextboxwd}%
> \edef\@@eph {\the\nextboxht}%
> \figwid\zeropoint \figxsca\plusone % see note * (core-fig)
> \fighei\zeropoint \figysca\plusone % see note * (core-fig)
> \checkfiguresettings
> \setfactorfiguresize
> \setscalefiguresize
> \setdimensionfiguresize
> \convertfigureinsertscale\@@epx\figx\figxsca\scax
> \convertfigureinsertscale\@@epy\figy\figysca\scay
> \scratchdimen\scax\points \divide\scratchdimen \plushundred
> \edef\@@xysx{\withoutpt\the\scratchdimen}%
> \scratchdimen\scay\points \divide\scratchdimen \plushundred
> \edef\@@xysy{\withoutpt\the\scratchdimen}}}
>
> \def\doscale[#1]% todo: xscale/yscale
> {\bgroup
> \forgetall
> \getparameters
> [\??xy]
> [\c!scale=,\c!xscale=,\c!yscale=,\c!width=,\c!height=,\c!lines=,
> \c!factor=,\c!hfactor=,\c!wfactor=,\c!grid=,
> \c!sx=1,\c!sy=1,#1]%
> \dowithnextbox
> {\dontshowcomposition
> \ifdim\nextboxht>\zeropoint \ifdim\nextboxwd>\zeropoint
> \doscalelikeafigure
> \dimen0=\@@xysy\nextboxht
> \dimen2=\@@xysy\nextboxdp
> \dimen4=\@@xysx\nextboxwd
> \dimen6=\dimen0\advance\dimen6 \dimen2
> % \setbox\nextbox\vbox to \dimen6
> % {\nextboxht\zeropoint
> % \nextboxdp\zeropoint
> % \vfill % erbij
> % \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
> \setbox\nextbox\hbox
> {\smashbox\nextbox
> \dostartscaling\@@xysx\@@xysy\flushnextbox\dostopscaling}%
> \nextboxht\dimen0
> \nextboxdp\dimen2
> \nextboxwd\dimen4
> \fi \fi
> \flushnextbox
> \egroup}
> \hbox}
>
> \def\scale
> {\dosingleempty\doscale}
>
> % mirror
>
> \def\domirrorbox % \hbox/\vbox/\vtop
> {\bgroup
> \dowithnextbox
> {\dontshowcomposition
> \scratchdimen\nextboxwd
> % better use an hbox (if no \forgetall, leftskip etc may creep in)
> %\setbox\nextbox\vbox{\forgetall\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
> \setbox\nextbox\hbox{\dostartmirroring\hskip-\nextboxwd\flushnextbox\dostopmirroring}%
> \nextboxwd\scratchdimen
> \flushnextbox
> \egroup}}
>
> \def\mirror
> {\domirrorbox\hbox}
>
> %\setbox0=\hbox{gans}
> %
> %\ruledhbox{\copy0 \schaal[sx=2,sy=2]{\copy0}}
> %
> %\spiegel{\ruledhbox{\copy0 \schaal{\box0}}}
> \f
> % to be used in some other places! todo!
> %
> % divides \hsize in fractions, will be made a bit more
> % clever and advanced when needed
> %
> % \horizontaldivision[n/m,elements,distance]
> %
> % \horizontaldivision[2/5,3,1em]
> % \horizontaldivision[2/5,3,1em]
> % \horizontaldivision[1/5,3,1em]
> %
> % \setuphorizontaldivision[afstand=,aantal=] (passend,passend)
>
> \def\??fr{@@fr}
>
> \def\setuphorizontaldivision
> {\dodoubleargument\getparameters[\??fr]}
>
> \def\horizontaldivision
> {\dosingleargument\dohorizontaldivision}
>
> \def\dohorizontaldivision[#1]%
> {\dodohorizontaldivision[#1,,,,,,]}
>
> \def\dodohorizontaldivision[#1/#2,#3,#4,#5]%
> {\doifelsenothing{#3}
> {\doifelse\@@frn\v!fit
> {\!!counta#2\relax}
> {\!!counta\@@frn\relax}}
> {\!!counta#3\relax}%
> \doifelsenothing{#4}
> {\doifelse\@@frdistance\v!fit
> {\!!widtha\zeropoint}
> {\!!widtha\@@frdistance}}
> {\!!widtha#4}%
> \advance\!!counta \minusone
> \multiply\!!widtha \!!counta
> \advance\hsize -\!!widtha
> \divide\hsize #2\relax
> \hsize#1\hsize}
>
> \setuphorizontaldivision
> [\c!distance=\tfskipsize,
> \c!n=\v!fit]
> \f
> %D This one is for Daniel Pittman, who wanted tight
> %D fractions. We show three versions. First the simple
> %D one using \type {\low} and \type {high}:
> %D
> %D \startbuffer
> %D \def\vfrac#1#2%
> %D {\hbox{\high{\tx#1\kern-.25em}/\low{\kern-.25em\tx#2}}}
> %D
> %D test \vfrac{1}{2} test \vfrac{123}{456} test
> %D \stopbuffer
> %D
> %D \typebuffer {\showmakeup\getbuffer}
> %D
> %D A better way to handle the kerning is the following, here
> %D we kind of assume that tye slash is symmetrical and has
> %D nearly zero width.
> %D
> %D \startbuffer
> %D \def\vfract#1#2%
> %D {\hbox{\high{\tx#1}\hbox to \zeropoint{\hss/\hss}\low{\tx#2}}}
> %D \stopbuffer
> %D
> %D \typebuffer {\showmakeup\getbuffer}
> %D
> %D The third and best alternative is the following:
> %D
> %D {\showmakeup\getbuffer}\crlf\getbuffer
> %D
> %D This time we measure the height of the \type {/} and
> %D shift over the maximum height and depths of this
> %D character and the fractional digits (we use 57 as
> %D sample). Here we combine all methods in one macros.
>
> \chardef\vulgarfractionmethod=3
>
> \definehspace[vulgarfraction][.25em] % [.15em]
> \definesymbol[vulgarfraction][/] % [\raise.2ex\hbox{/}]
>
> \unexpanded\def\vulgarfraction#1#2%
> {\dontleavehmode
> \hbox
> {\def\vulgarfraction{vulgarfraction}%
> \ifcase\vulgarfractionmethod
> #1\symbol[\vulgarfraction]#2%
> \or
> \high{\tx#1\kern-\hspaceamount\empty\vulgarfraction}%
> \symbol[\vulgarfraction]%
> \low {\kern-\hspaceamount\empty\vulgarfraction\tx#2}%
> \or
> \high{\tx#1}%
> \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
> \low{\tx#2}%
> \or
> \setbox0\hbox{\symbol[\vulgarfraction]}%
> \setbox2\hbox{\txx57}%
> \raise\ht0\hbox{\lower\ht2\hbox{\txx#1}}%
> \hbox to \zeropoint{\hss\symbol[\vulgarfraction]\hss}%
> \lower\dp0\hbox{\raise\dp2\hbox{\txx#2}}%
> \fi}}
>
> \ifx\vfrac\undefined \let\vfrac\vulgarfraction \fi
>
> %D \starttabulate
> %D \HL
> %D \NC \bf method \NC \bf visualization \NC\NR
> %D \HL
> %D \NC 0 \NC \chardef\vulgarfractionmethod0\vulgarfraction{1}{2} \NC\NR
> %D \NC 1 \NC \chardef\vulgarfractionmethod1\vulgarfraction{1}{2} \NC\NR
> %D \NC 2 \NC \chardef\vulgarfractionmethod2\vulgarfraction{1}{2} \NC\NR
> %D \NC 3 \NC \chardef\vulgarfractionmethod3\vulgarfraction{1}{2} \NC\NR
> %D \HL
> %D \stoptabulate
> \f
> %D Under construction:
> %D
> %D \starttyping
> %D \commalistsentence[aap,noot,mies]
> %D \commalistsentence[aap,noot]
> %D \commalistsentence[aap]
> %D \stoptyping
>
> \let\handlecommalistsentence\firstofoneargument
>
> \def\commalistsentence[#1]%
> {\bgroup
> \getcommalistsize[#1]%
> \ifcase\commalistsize\relax
> \def\serializedcommalist{#1}%
> \else
> \let\serializedcommalist\empty
> \scratchcounter\zerocount
> \def\docommando##1%
> {\advance\scratchcounter \plusone
> \ifnum\scratchcounter=\plusone
> \scratchtoks{\handlecommalistsentence{##1}}%
> \else
> \ifnum\scratchcounter=\commalistsize
> \appendtoks\labeltext{and-2}\handlecommalistsentence{##1}\to\scratchtoks
> \else
> \appendtoks\labeltext{and-1}\handlecommalistsentence{##1}\to\scratchtoks
> \fi
> \fi}%
> \processcommacommand[#1]\docommando
> \edef\serializedcommalist{\the\scratchtoks}%
> \fi
> \serializedcommalist
> \egroup}
>
> \ifx\textcomma\undefined \def\textcomma{,} \fi
>
> \setuplabeltext [\s!nl] [and-1=\textcomma\ , and-2= en ]
> \setuplabeltext [\s!en] [and-1=\textcomma\ , and-2=\textcomma\ and ]
> \setuplabeltext [\s!de] [and-1=\textcomma\ , and-2= und ]
> \f
> \protect \endinput
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> ntg-context mailing list
> ntg-context@ntg.nl
> http://www.ntg.nl/mailman/listinfo/ntg-context
--
=======================================================
Ing. Vít Zýka, Ph.D. TYPOkvítek
database publishing databazove publikovani
data maintaining and typesetting in typographic quality
priprava dat a jejich sazba v typograficke kvalite
tel.: (+420) 777 198 189 www: http://typokvitek.com
=======================================================
_______________________________________________
ntg-context mailing list
ntg-context@ntg.nl
http://www.ntg.nl/mailman/listinfo/ntg-context
next prev parent reply other threads:[~2006-03-28 18:55 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-15 23:53 \page inside a block frantisek holop
2006-03-16 10:38 ` Hans Hagen
2006-03-16 21:50 ` frantisek holop
2006-03-16 22:17 ` Aditya Mahajan
2006-03-16 22:27 ` Thomas A. Schmitz
2006-03-16 22:57 ` frantisek holop
2006-03-17 18:49 ` Willi Egger
2006-03-26 19:42 ` \setupmarginrules (was: Re: \page inside a block) frantisek holop
2006-03-26 20:12 ` \setupmarginrules Vit Zyka
2006-03-26 20:41 ` \setupmarginrules frantisek holop
2006-03-27 20:54 ` \setupmarginrules Vit Zyka
2006-03-28 14:49 ` \setupmarginrules Willi Egger
2006-03-28 15:05 ` \setupmarginrules Taco Hoekwater
2006-03-28 15:10 ` \setupmarginrules Vit Zyka
2006-03-28 15:14 ` \setupmarginrules Taco Hoekwater
2006-03-28 16:58 ` \setupmarginrules Vit Zyka
2006-03-28 17:13 ` \setupmarginrules Hans Hagen
2006-03-30 19:18 ` \setupmarginrules Willi Egger
2006-03-28 16:42 ` \setupmarginrules Hans Hagen
2006-03-28 17:12 ` \setupmarginrules Hans Hagen
2006-03-28 18:55 ` Vit Zyka [this message]
2006-03-28 21:44 ` \setupmarginrules frantisek holop
2006-03-29 8:14 ` \setupmarginrules Hans Hagen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=442986B4.6000401@seznam.cz \
--to=vit.zyka@seznam.cz \
--cc=ntg-context@ntg.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).