%D \module
%D [ file=cont-new,
%D version=1995.10.10,
%D title=\CONTEXT\ Miscellaneous Macros,
%D subtitle=New Macros,
%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.
% it's about time to clean up this file ...
\newcontextversion{2006.12.07 16:27}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
%D features.
\unprotect
\writestatus{\m!systems}{beware: some patches loaded from cont-new.tex}
% \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0
% todo: mp-new
% caption: grid=top|bottom in xml defs
\let\then\relax % \ifnum1>2\then -)
\def\dividedsize#1#2#3% size gap n
{\dimexpr
\ifnum\dimexpr#1\relax>\plusone
(\dimexpr#1\relax-\numexpr#3-1\relax\dimexpr#2\relax)/#3\else#1%
\fi
\relax}
% maybe to be integrated (option=...)
\def\directexternalfigure
{\dodoubleempty\dodirectexternalfigure}
\def\dodirectexternalfigure[#1][#2]%
{\bgroup
\getparameters[\??ef][\c!type=\splitofftype,\c!page=1,#2]%
\sanitizefilename#1\to\expandedfigurename
\splitfilename\expandedfigurename
\let\@@DriverImageWidth \!!zeropoint
\let\@@DriverImageHeight \!!zeropoint
\let\@@DriverImageFile \splitofffull
\let\@@DriverImageType \@@eftype
\let\@@DriverImageMethod \@@eftype
\let\@@DriverImageLabel \empty
\let\@@DriverImagePage \@@efpage
\doinsertfile
\egroup}
% \directexternalfigure[cow.pdf]
% normally one does not want this to happen nested, maybe there
% is more; non public vars btw, will become conditionals
\appendtoks \writetoregisterfalse \to \everybeforeutilityread
\appendtoks \writetolistfalse \to \everybeforeutilityread
\appendtoks \notesenabledfalse \to \everybeforeutilityread
% \setuplabeltext[\s!itemcount1={{I(},{)}}]
% \def\labeledcountervalue#1{\labeltexts{#1}{\countervalue{#1}}}
\def\singlewidened #1{\hbox spread 1em{\hss#1\hss}}
\def\complexwidened[#1]#2{\hbox spread #1{\hss#2\hss}}
\definecomplexorsimple\widened
% todo
%
% \def\definelocation{\dodoubleargument\dodefinelocation}
% \def\dodefinelocation[#1][#2]{\setvalue{loc:#1}{#2}}
%
% \definelocation[lt] [\v!left\v!top]
% \definelocation[tl] [\v!left\v!top]
% \definelocation[\v!top\v!left][\v!left\v!top]
%
% \def\getlocation#1{\executeifdefined{loc:#1}{#1}}
% just in case we load something from a file (pdfr-ec for instance)
\prependtoks \restoreendofline \to \everybeforeshipout
% The following may be a solution for the fact that one cannot
% change catcodes of characters like : and ; inside an environment.
\appendtoks
\enablelanguagespecifics[\currentlanguage]%
\to \everystarttext
% Peter M\"unster's test case:
%
% \defineoverlay[Draft][{\scale[factor=max]{\rotate[rotation=60]{~MY||DRAFT~}}}]
% \setupbackgrounds[page][background=Draft]
% \starttext
% \starttables[|l|]
% \dorecurse{200}{\NC hallo \NC\AR}
% \stoptables
% \stoptext
%
% \let\normalactivetilde~
% \let\normalactivebar |
%
% \appendtoks\let~\normalactivetilde\to\everypagebody
% \appendtoks\let|\normalactivebar \to\everypagebody
\let\cs\getvalue
% experimental so this may change
\def\startdescriptions
{\dosingleempty\dostartdescriptions}
\def\dostartdescriptions[#1]%
{\begingroup
\def\item{\getvalue{#1}}%
\let\dostoppairdescription \donothing
\let\@@description \dostartpairdescription
\let\@@startsomedescription\dostartsomedescription}
\def\stopdescriptions
{\dostoppairdescription
\endgroup}
\def\dostartpairdescription[#1][#2]%
{\dostoppairdescription
\def\dostoppairdescription{\@@stopdescription{#1}}%
\bgroup
\def\currentdescription{#1}%
\doifelse{\descriptionparameter{\s!do\c!state}}\v!start
{\@@makedescription{#1}[#2]{}}
{\@@makedescription{#1}[#2]}}
\def\dostartsomedescription% #1[#2]#3%
{\bgroup
\@@makedescription} % {#1}[#2]{#3}}
% \starttext
%
% \definedescription[test]
%
% \startdescriptions
% \test{Foo} Bar bar bar
% \test{Foo} Bar bar bar
% \test{Foo} Bar bar bar
% \stopdescriptions
%
% \startdescriptions[test]
% \item{Foo} Bar bar bar
% \item{Foo} Bar bar bar
% \item{Foo} Bar bar bar
% \stopdescriptions
%
% \startdescriptions
% \starttest{Foo} Bar bar bar \stoptest
% \starttest{Foo} Bar bar bar \stoptest
% \starttest{Foo} Bar bar bar \stoptest
% \stopdescriptions
%
% \startdescriptions[test]
% \item{Foo} Bar bar bar
% \item{Foo} Bar bar bar
% \item{Foo} Bar bar bar
% \stopdescriptions
%
% \stoptext
% to do:
%
% \def\defineshapesynonym
% {\dodoubleargument\dodefineshapesynonym}
%
% \def\dodefineshapesynonym[#1][#2]%
% {\setvalue{shsy:#1}{#2}}
%
% \def\shapesynonym#1%
% {\ifcsname shsy:#1\endcsname
% \expandafter\shapesynonym\csname shsy:#1\endcsname\else#1%
% \fi}
%
% \beginTEX
%
% \def\shapesynonym#1%
% {\expandafter\ifx\csname shsy:#1\endcsname\relax
% #1\else\expandafter\shapesynonym\csname shsy:#1\endcsname
% \fi}
%
% \endTEX
%
%\defineshapesynonym[eacute] [e]
%\defineshapesynonym[egrave] [e]
%\defineshapesynonym[eumlaut [e]
%\defineshapesynonym[eogonek][e]
%
% more reduction
%
%\defineshapesynonym[e][o]
%\defineshapesynonym[w][v]
%\defineshapesynonym[m][n]
%
% \shapesynonym{eacute}
\chardef\baselinecorrectionmode\plusone
\def\onbaselinecorrection {\chardef\baselinecorrectionmode\plusone }
\def\offbaselinecorrection {\chardef\baselinecorrectionmode\plustwo }
\def\forcebaselinecorrection{\chardef\baselinecorrectionmode\plusthree}
\def\topbaselinecorrection
{\ifvmode \ifdim\pagegoal<\maxdimen
\forcedtopbaselinecorrection
\fi \fi}
\def\forcedtopbaselinecorrection
{\ifvmode
\bgroup
\setbaselinecorrections
\whitespace
\nointerlineskip
\dotopbaselinecorrection
\egroup
\fi}
\let\forcedbotbaselinecorrection\botbaselinecorrection
\def\startbaselinecorrection
{\ifcase\baselinecorectionmode
\or % normal
\baselinecorrection
\ifvmode
\bgroup
\setbox\scratchbox\vbox\bgroup
\ignorespaces
\let\stopbaselinecorrection\donormalstopbaselinecorrection
\else
\bgroup
\let\stopbaselinecorrection\egroup
\fi
\or % off
\bgroup
\let\stopbaselinecorrection\egroup
\or % force
\baselinecorrection
\ifvmode
\bgroup
\setbox\scratchbox\vbox\bgroup
\ignorespaces
\let\stopbaselinecorrection\doforcedstopbaselinecorrection
\else
\bgroup
\let\stopbaselinecorrection\egroup
\fi
\fi}
\def\startbaselinecorrection
{\bgroup
\let\stopbaselinecorrection\egroup
\ifcase\baselinecorrectionmode
\or % normal
\baselinecorrection
\ifvmode
\setbox\scratchbox\vbox\bgroup\ignorespaces
\let\stopbaselinecorrection\donormalstopbaselinecorrection
\fi
\or % off
\or % force
\baselinecorrection
\ifvmode
\setbox\scratchbox\vbox\bgroup\ignorespaces
\let\stopbaselinecorrection\doforcedstopbaselinecorrection
\fi
\fi}
\let\stopbaselinecorrection\relax
\def\donormalstopbaselinecorrection % I have to check columns yet.
{\egroup
\topbaselinecorrection
\box\scratchbox
\botbaselinecorrection
\egroup}
\def\doforcedstopbaselinecorrection % I have to check columns yet.
{\egroup
\forcedtopbaselinecorrection
\box\scratchbox
\forcedbotbaselinecorrection
\egroup}
% core-grd:
\let\normalstartbaselinecorrection=\startbaselinecorrection
\def\startbaselinecorrection
{\ifgridsnapping
\centertogrid\bgroup
\let\stopbaselinecorrection\egroup
\else
\normalstartbaselinecorrection
\fi}
% \page[left]
% \definecolumntextarea[intro][left][x=1,y=1,nx=4,ny=20,state=start,background=introlayer]
% \setupcolumntextareatext[intro][left][\setups{intro}]
% \flushcolumntextareas
\def\flushcolumntextareas
{\initializecolumntextareas
\setvsize}
%D (Inspired by a discussion on the \CONTEXT\ mailing list)
%D
%D In \TEX\ each character can have one of 16 catcodes. This way the
%D backslash, dollar, ampersand, hash and some more characters get
%D their special meaning. If you want to process tokens under a
%D certain catcode regime, passing arguments can interfere badly.
%D
%D \startbuffer[a]
%D \def\whatever#1{[#1]}
%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
%D \stopbuffer
%D
%D \typebuffer[a]
%D
%D Here we pass an argument to \type {\whatever} but part of that
%D argument is to be processed under a different catcode regime, i.e.\
%D all characters that need to be typeset verbatim need to get
%D the catcode that makes it a letter. This is what we get when we typeset
%D the text verbatim:
%D
%D \starttyping
%D whatever \type {\whatever{you want}} $or$ not!
%D \stoptyping
%D
%D However, when passed to \type {\whatever} we get:
%D
%D \getbuffer[a]
%D
%D In \ETEX\ one can use \type {\scantokens} to circumvent this problem.
%D
%D \startbuffer[b]
%D \def\rescan#1{\scantokens{#1}}
%D \def\whatever#1{[\rescan{#1}]}
%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
%D \stopbuffer
%D
%D \getbuffer[b] \typebuffer[b]
%D
%D This time the \type {\whatever} call gives:
%D
%D \getbuffer[b]
%D
%D In this example, two spaces have crept in. The first one, after the
%D macro name, is inserted by \TEX\ and cannot be avoided. The last space
%D is inserted by \type {\scantokens}, and is the consequence of the fact
%D that this macro mimics reading from a file. You can avoid the last
%D space by a slightly different definition:
%D
%D \startbuffer[c]
%D \def\rescan#1{\scantokens{#1\ignorespaces}}
%D \def\whatever#1{[\rescan{#1}]}
%D \whatever{whatever \type {\whatever{you want}} $or$ not!}
%D \stopbuffer
%D
%D \typebuffer[c]
%D
%D Unfortunately we still keep the first space, but at least it's better than
%D a failure:
%D
%D \getbuffer[c]
\long\def\rescan#1{\scantokens{#1\ignorespaces}}
\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantokens{#2\ignorespaces}\endgroup}
\ifx\scantextokens\undefined \else
\long\def\rescan#1{\scantextokens{#1}}
\long\def\rescanwithsetup#1#2{\begingroup\directsetup{#1}\scantextokens{#2}\endgroup}
\fi
% In 2005 we will abandon support for font encodings that don't have
% the ascii characters { } $ etc in their normal slot, i.e. latin modern
% instead of computer modern. Then we can also clean up some of the ugly
% xml internals that are a result from the need to deal with funny
% encodings.
%
% a solution:
%
% \defineXMLargument[ctx:c]{\getXMLcharacter}
% \defineXMLargument[ctx:e]{\getXMLentity }
% \defineXMLargument[ctx:u]{\unicodechar }
%
% \bgroup \catcode`\<=\active \catcode`\&=\active
%
% \gdef\dontexpandutf
% {\def\getXMLcharacter##1{##1}%
% \def\getXMLentity ##1{##1}%
% \def\unicodechar ##1{##1}}
%
% \egroup
%
% more generic
%
% IS THIS STILL OK? TO BE CHECKED (UTF AND SUCH) ! ! ! !
\def\XMLexpanded#1%
{\bgroup
\honorunexpanded
% \dontexpandencoding
% \dontexpandutf
\chardef\activecharactermode\zerocount
\xdef\@@globalexpanded{#1}%
\egroup
\@@globalexpanded}
\def\setXMLexpandedmark#1#2% using a tok prevents unwanted expansion in mark
{\XMLexpanded{\scratchtoks{\enableXML#2}}%
\expanded{\normalsetnormalmark{#1}{\the\scratchtoks}}}
\ifx\pagediscards\undefined \let\pagediscards\relax \fi
\installoutput\synchronizeoutput % maybe add pagediscards
{\ifvoid\normalpagebox\else
\unvbox\normalpagebox
\pagediscards % maybe not needed ?
\fi}
% temp hack, else no proper default fall back (like \textmultiply); todo: sync encoding
\def\dealwithmathtextencoding
{\expanded{\everyhbox{\the\everyhbox\noexpand\fastenableencoding{\currentencoding}}}%
\def\dealwithmathtextencoding{\let\characterencoding\nocharacterencoding}%
\dealwithmathtextencoding}
\appendtoks
\dealwithmathtextencoding
\to \everymathematics
\let\outerencoding\empty
\def\checkoutermathencoding
{\ifx\outerencoding\empty
\ifx\outerencoding\s!default\else
\edef\outerencoding{\currentencoding}%
\fi
\fi}
\prependtoks
\checkoutermathencoding
\to \everymathematics
% \startmathcollection[eul:texnansi]
% \definemathsymbol [breve] [accent] [tf] ["15]
% \stopmathcollection
% \startmathcollection[eul:ec]
% \definemathsymbol [breve] [accent] [tf] ["08]
% \stopmathcollection
%
% $\breve e$
% \separatestring123 456\to\test [\test]
% \def\separatestring#1\to#2%
% {\let#2\empty
% \def\docommand##1{\edef#2{\ifx#2\empty\else#2,\fi##1}}%
% \processseparatedlist[#1][ ]\docommand}
%
% \processseparatedlist[aap noot][]\ruledhbox
% this will be activated when
% \newinsert\thispageinsert % <- installinsertion
% \def\flushatthispage
% {\bgroup
% \dowithnextbox{\insert\thispageinsert{\box\nextbox}\egroup}%
% \hbox}
% \appendtoks
% \ifvoid\thispageinsert\else\hbox{\smashedbox\thispageinsert}\fi
% \to \everyshipout
% \definemarkedpage[nobackgrounds]
% \markpage[nobackgrounds]
% \doifmarkedpageelse{nobackgrounds}
\newcounter\nofmarkedpages
\def\definemarkedpage[#1]%
{\definetwopasslist{\v!page:#1}}
\def\markpage[#1]% looks very much like domarginreference
{\iftrialtypesetting\else
\doglobal\increment\nofmarkedpages\relax
\lazysavetwopassdata{\v!page:#1}{\nofmarkedpages}{\noexpand\realfolio}%
\fi}
\def\doifmarkedpageelse#1%
{\gettwopassdatalist{\v!page:#1}%
\expanded{\doifinsetelse{\realfolio}{\twopassdatalist}}}
% Just a simple and fast hanger, for usage in macros.
\def\setuphanging
{\dodoubleempty\getparameters[\??ha]}
\setuphanging
[\c!distance=.5em]
\def\starthanging
{\noindent\bgroup
\dowithnextbox
{\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
\hangindent\nextboxwd
\hangafter\plusone
\flushnextbox\ignorespaces}
\hbox}
\def\stophanging
{\endgraf
\egroup}
% experimental
\def\stophangaround
{\endgraf
\egroup}
\def\starthangaround
{\noindent\bgroup
\dowithnextbox
{\ifdim\nextboxht>\strutht\setbox\nextbox\tbox{\flushnextbox}\fi
\setbox\nextbox\hbox{\flushnextbox\hskip\@@hadistance}%
\getboxheight\scratchdimen\of\box\nextbox
\getnoflines\scratchdimen
\nextboxht\strutht
\nextboxdp\strutdp
\hangindent\nextboxwd
\hangafter-\noflines
\llap{\flushnextbox}\ignorespaces}
\hbox}
\def\modevalue#1#2#3%
{\@EA\ifx\csname\@mode@\systemmodeprefix#1\endcsname\endcsname\enabledmode#2\else#2\fi}
\def\systemmodevalue#1%
{\modevalue{\systemmodeprefix#1}}
% \getmulticolumnlines -> now in cont-loc, to be tested and really needed
\long\def\startprocesscommalist[#1]#2\stopprocesscommalist
{\long\def\currentcommalistcommand##1{\def\currentcommalistitem{##1}#2}%
\processcommalist[#1]\currentcommalistcommand}
% \tracefonthandlingtrue
% new, still to be improved
%
% \dorecurse{10}
% {\input thuan
% \placefigure{}{\framed[height=1.5cm]{test}}
% \placefloatplaceholder}
\def\placefloatplaceholder
{\ifroomforfloat \else
\scratchdimen\pagegoal
\advance\scratchdimen-\pagetotal
\advance\scratchdimen-3\lineheight
\ifdim\scratchdimen>\zeropoint
\startlinecorrection[blank]
\mhbox{\inframed{\labeltexts{placeholder}{\lastcaptiontag}}}%
\stoplinecorrection
\else
\allowbreak
\fi
\fi}
\setuplabeltext
[placeholder={, moved}]
% etex only, of course we could just parse (scan for \% in string)
\newif\ifpercentdimendone
\bgroup % usage: \setpercentdimen\somedimen{% or dimen} todo: pct
\catcode124=\@@comment
\catcode 37=\@@active
\gdef\setpercentdimen#1#2|
{\xdef\@@expanded{#2}|
\ifx\@@expanded\empty\else
\bgroup
\global\percentdimendonefalse
\def\%{\dimexpr#1/100\relax\global\percentdimendonetrue\ignorespaces}| scantokens add's a space
\catcode`%=\@@active
\catcode`\\=\@@escape
\let%\%|
\scratchdimen#1|
\xdef\@@expanded{\@@expanded\scratchdimen\!!zeropoint}| trick: when 1.2 => .2\scratchdimen and 0pt typeset
\startnointerference
\global\globalscratchdimen\scantokens\@EA{\@@expanded}| i'm lazy and use etex
\stopnointerference
\egroup
#1\globalscratchdimen
\fi}
\egroup
% TEX alternative, in principle accurate enough and also a bit faster
% \bgroup
%
% \catcode`\%=\@@other
% \catcode`\|=\@@comment
%
% \gdef\setpercentdimen#1#2|
% {\beforesplitstring#2\at%\to\ascii
% \doifelse\ascii{#2}
% {#1=#2}
% {\divide#1by100\relax#1=\ascii#1\relax}} | or: {#1=\ascii#1\divide#1by100\relax}}
%
% \egroup
%
% \dimen0=1000pt \setpercentdimen{\dimen0}{10%} \the\dimen0
% \dimen0= 100pt \setpercentdimen{\dimen0}{10%} \the\dimen0
% \dimen0= 95pt \setpercentdimen{\dimen0}{10%} \the\dimen0
% \dimen0= 10pt \setpercentdimen{\dimen0}{10%} \the\dimen0
% \dimen0= 1pt \setpercentdimen{\dimen0}{10%} \the\dimen0
\bgroup
\obeylines % don't remove %'s !
\gdef\collapsedspace#1%
{\ifx#1^^M%
\expandafter\collapsedspace
\else
\space
\expandafter#1%
\fi}
\gdef\collapsespaces%
{\prependtoksonce\relax\to\everyeof%
\ignorelines%
\ignoretabs%
\let\obeyedspace\collapsedspace%
\obeyspaces}
\egroup
% todo : test low level translation (nl->en) and optimize script
% \definestylecollection[mine]
% \definestyleinstance[mine][default][sorry]
% \definestyleinstance[mine][tt][bs][ttbs:\rm\sl]
% \definestyleinstance[mine][tt][bf][ttbf:\rm\sl]
% \definestyleinstance[mine][bf][\sl]
% \definestyleinstance[mine][sl][\tt]
% {\bf test \mine test \sl test \mine test \bs oeps \mine oeps {\tt test \mine \bf test}}
\definesystemvariable{sx}
\def\definestylecollection
{\dosingleargument\dodefinestylecollection}
\def\dodefinestylecollection[#1]%
{\iffirstargument
\unexpanded\setvalue{#1}{\styleinstance[#1]}%
\def\docommand##1%
{\def\dodocommand####1{\letbeundefined{\??sx##1:####1:\commalistelement}}%
\processcommacommand[\alternativelist,\s!default]\dodocommand}%
\processcommacommand[\stylelist,\s!default]\docommand
\fi}
\def\definestyleinstance
{\doquadrupleargument\dodefinestyleinstance}
\def\dodefinestyleinstance[#1][#2][#3][#4]% [name] [rm|ss|tt|..] [sl|bf|...] [whatever]
{\iffirstargument
\doifundefined{#1}{\definestylecollection[#1]}%
\fi
\iffourthargument
\setvalue{\??sx#1:#2:#3}{#4}%
\else\ifthirdargument
\setvalue{\??sx#1::#2}{#3}%
\else\ifsecondargument
\letvalue{\??sx#1::#2}\empty
\fi\fi\fi}
\unexpanded\def\styleinstance[#1]% will be faster
{%\begingroup\expanded{\infofont[#1:\fontstyle:\fontalternative]}\endgroup
\executeifdefined{\??sx#1:\fontstyle:\fontalternative}%
{\executeifdefined{\??sx#1:\fontstyle:\s!default}%
{\executeifdefined{\??sx#1::\fontalternative}
{\getvalue {\??sx#1::\s!default}}}}}
% \beginETEX \ifcsname
%
% \unexpanded\def\styleinstance[#1]%
% {\csname\??sx#1%
% \ifcsname:\fontstyle:\fontalternative\endcsname
% :\fontstyle:\fontalternative
% \else\ifcsname:\fontstyle:\s!default\endcsname
% :\fontstyle:\s!default
% \else\ifcsname::\fontalternative\endcsname
% ::\fontalternative
% \else\ifcsname::\s!default\endcsname
% ::\s!default
% \else
% % nothing, \relax
% \fi\fi\fi\fi
% \endcsname}
%
% \endETEX
% cleaner
%
% \long\def\doMPTEXcheck#1%
% {\long\def\dodoMPTEXcheck##1#1##2##3\war{\if##2@\else\@EA\donoMPTEXcheck\fi}%
% \@EA\dodoMPTEXcheck\MPascii#1@@\war}
% \long\def\donoMPTEXcheck#1\relax
% {\global\MPTEXgraphictrue}
% \MPTEXgrapicchecks\emptytoks
% \def\forceMPTEXcheck#1%
% {\convertargument#1\to\ascii
% \@EA\appendtoks\@EA\doMPTEXcheck\@EA{\ascii}\to\MPTEXgrapicchecks}
% \forceMPTEXcheck{etex}
% \forceMPTEXcheck{textext}
% \forceMPTEXcheck{graphictext}
% \long\def\checkMPTEXgraphic#1%
% {\ifforceMPTEXgraphic
% \global\MPTEXgraphictrue
% \else
% \global\MPTEXgraphicfalse
% \expandafter\convertargument#1\to\MPascii
% \the\MPTEXgrapicchecks\relax % \relax is end condition!
% \fi}
% no, wrong! never!
%
% \def\tightlayer[#1]%
% {\begingroup
% \def\currentlayer{#1}% todo: left/right
% \setbox\nextbox\emptybox % hoogte/breedte are \wd\nextbox/\ht\nextbox
% \hsize\layerparameter\c!width % \overlaywidth = \hsize
% \vsize\layerparameter\c!height % \overlaywheight = \vsize
% \hbox to \hsize{\composedlayer{#1}}%
% \endgroup}
\let\locatedfilepath\empty
\def\locatefilepath#1%
{\let\locatedfilepath\empty
\ifx\allinputpaths\empty \else
\def\docommand##1%
{\doiffileelse{\pathplusfile{##1}{#1}}{\donetrue\def\locatedfilepath{##1}}\donefalse
\ifdone\expandafter\quitcommalist\fi}%
\doifparentfileelse{#1} % new
{\processcommacommand [\allinputpaths]\docommand}
{\processcommacommand[.,\allinputpaths]\docommand}%
\fi}
% todo : share symbols
% \definecolor[rollover:n][red]
% \definecolor[rollover:r][green]
% \definecolor[rollover:d][blue]
\definepalet
[rollover]
[n=red,
r=green,
d=blue]
% \newcounter\nofrollovers
%
% \def\dorollbutton[#1][#2]#3[#4]%
% {\dontleavehmode
% \bgroup
% \doglobal\increment\nofrollovers
% \unexpanded\def\dosetlocationbox[##1]##2[##3]%
% {\getparameters[##1][##3]%
% \definecolor[rollover][rollover:##2]%
% \let\next\hbox
% \doif{##2}{n}
% {\doifvalue{##1\c!variant}\v!verborgen{\let\next\phantom}}%
% \next
% {\localframed[##1]
% [\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
% {\dolocationattributes{##1}\c!style\c!color{#3}}}}%
% \iffirstargument
% \ifsecondargument
% \def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
% \else
% \doifassignmentelse{#1}
% {\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
% {\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
% \fi
% \else
% \def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
% \fi
% % todo: share symbols
% \definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
% \definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
% \definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
% \nextsystemfield
% \setupfield
% [rollbutton]
% [\c!frame=\v!off,\c!offset=\v!overlay,\c!klickoff={#4}]%
% \definefield
% [\currentsystemfield][push][rollbutton]
% [rsym:\nofrollovers:n,%
% rsym:\nofrollovers:r,%
% rsym:\nofrollovers:d]%
% \fitfield[\currentsystemfield]%
% \egroup}
\newcounter\nofrollovers
\newcounter\nofrollbuttons
\def\dorollbutton[#1][#2]#3[#4]%
{\dontleavehmode
\bgroup
\doglobal\increment\nofrollovers
\doglobal\increment\nofrollbuttons
\unexpanded\def\dosetlocationbox[##1]##2[##3]%
{\getparameters[##1][##3]%
\definecolor[rollover][rollover:##2]%
\doifelse{##2}{n}{\doifelsevalue{##1\c!alternative}\v!hidden\phantom\hbox}\hbox
{\localframed[##1]
[\c!framecolor=rollover,\c!backgroundcolor=rollover,\c!color=rollover]%
{\dolocationattributes{##1}\c!style\c!color{#3}}}}%
\iffirstargument
\ifsecondargument
\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[#2]}%
\else
\doifassignmentelse{#1}
{\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[#1]}}
{\def\setlocationbox##1{\dosetlocationbox[\??am#1]{##1}[]}}%
\fi
\else
\def\setlocationbox##1{\dosetlocationbox[\??bt]{##1}[]}%
\fi
% todo: share symbols, tricky since different dimensions
\definesymbol[rsym:\nofrollovers:n][\setlocationbox n]%
\definesymbol[rsym:\nofrollovers:r][\setlocationbox r]%
\definesymbol[rsym:\nofrollovers:d][\setlocationbox d]%
\setupfield
[rollbutton]
[\c!frame=\v!off,
\c!offset=\v!overlay,
\c!clickout={#4}]%
\definefield
[roll:\nofrollbuttons][push][rollbutton]
[rsym:\nofrollovers:n,%
rsym:\nofrollovers:r,%
rsym:\nofrollovers:d]%
\fitfield[roll:\nofrollbuttons]%
\egroup}
\unexpanded\def\rollbutton
{\dodoubleempty\dorollbutton}
% \def\do@@amrob[#1]#2\\%
% {\txt\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
% \appendtoks \let\rob\do@@amrob \to \everysetmenucommands
\def\menu@rob[#1]#2\\%
{\@@amboxcommand\rollbutton[\currentmenu]{\ignorespaces#2\unskip}[#1]\\}%
\appendtoks \let\rob\menu@rob \to \everysetmenucommands
% calls:
% {..} [JS..]
% [left] {..} [JS..]
% [a=b] {..} [JS..]
% [left] [a=b] {..} [JS..]
%
% \setupbuttons[offset=0pt,frame=off] % alternative=hidden
%
% \rollbutton {Manuals} [JS(Goto_File{show-man.pdf})]
% \rollbutton {Articles} [JS(Goto_File{show-art.pdf})]
% \rollbutton {Papers} [JS(Goto_File{show-pap.pdf})]
% \rollbutton {Presentations} [JS(Goto_File{show-pre.pdf})]
% \rollbutton {Resources} [JS(Goto_File{show-res.pdf})]
%
% \rob [JS(...)] bla bla \\
\unexpanded\def\overlayrollbutton
{\dodoubleargument\dooverlayrollbutton}
\def\dooverlayrollbutton[#1][#2]%
{\bgroup
\nextsystemfield
\setupfield
[overlayrollbutton]
[\c!frame=\v!off,\c!offset=\v!overlay,\c!regionin={#1},\c!regionout={#2}]%
\definesymbol
[\currentsystemfield]
[{\framed[\c!frame=\v!off,\c!width=\overlaywidth,\c!height=\overlayheight]{}}]%
\definefield
[\currentsystemfield][push][overlayrollbutton][\currentsystemfield][\currentsystemfield]%
\fitfield[\currentsystemfield]%
\egroup}
% \defineoverlay
% [ShowMenu]
% [{\overlayrollbutton[VideLayer{navigation}][HideLayer{navigation}]}]
\def\inlinedbox
{\bgroup
\dowithnextbox
{\scratchdimen\nextboxht
\advance\scratchdimen\nextboxdp
\advance\scratchdimen-\lineheight
\divide\scratchdimen\plustwo
\advance\scratchdimen\strutdepth
\setbox\nextbox\hbox{\lower\scratchdimen\flushnextbox}%
\nextboxht\strutht
\nextboxdp\strutdp
\flushnextbox
\egroup}%
\hbox}
% \readfile{cont-exp}\donothing\donothing % speed up (5-20%)
\def\dimenratio#1#2% etex only
{\withoutpt\the\dimexpr2\dimexpr(#1)/\dimexpr(#2)/32768\relax\relax}
\def\doxprecurse#1#2%
{\ifnum#1=\zerocount % no \ifcase
\expandafter\gobblethreearguments
\else
#2\expandafter\expandafter\expandafter\doxprecurse\expandafter
\fi\expandafter{\the\numexpr#1-1\relax}{#2}}
\def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie
\unexpanded\def\asciistr#1{\convertargument#1\to\ascii{\verbatimfont\ascii}}
% messy, will be improved:
\prependtoks \setnormalcatcodes \to \everyTEXinputmode
\appendtoks \processingXMLfalse \to \everyTEXinputmode
\let\normalenableXML\enableXML % some day we move the normal \enableXML into the toks
\prependtoks \normalenableXML \to \everyXMLinputmode
\appendtoks \processingXMLtrue \to \everyXMLinputmode
\unexpanded\def\enableXML {\setinputmode[XML]} % \enableXML is used in edef's and marks
\unexpanded\def\disableXML{\setinputmode[TEX]}
\beginTEX
% else the skip aborts the reshape process
\def\shapefill{\vskip\onepoint\!!plus\lineheight\!!minus\lineheight\relax}
\endTEX
\beginETEX
\def\shapefill{\vskip\zeropoint\!!plus\lineheight\!!minus\lineheight\relax}
\endETEX
\let\normaltype\type
\beginTEX
\unexpanded\def\retype#1{\bgroup\convertargument#1\to\ascii\@EA\normaltype\@EA{\ascii}\egroup}
\endTEX
\beginETEX
\unexpanded\def\retype#1{\scantokens{\normaltype{#1}\ignorespaces}}
\endETEX
\def\simplifytype{\let\type\retype}
% \ruledhbox
% {\startignorespaces
% \def\oeps{a}
% \startignorespaces
% \def\oeps{a}
% \stopignorespaces
% \def\oeps{a}
% \stopignorespaces
% \oeps}
\newsignal\boissignal
\newcount \boislevel
\long\def\startignorespaces
{\advance\boislevel\plusone
\ifcase\boislevel\or \ifhmode
\hskip\boissignal
\fi \fi
\ignorespaces}
\long\def\stopignorespaces
{\ifcase\boislevel\or \ifhmode
\doloop
{\ifdim\lastskip=\zeropoint
\exitloop
\else\ifdim\lastskip=\boissignal
\unskip
\exitloop
\else
\unskip
\fi\fi}%
\fi \fi
\advance\boislevel\minusone}
\defineblankmethod [\v!synchronize] {\verticalstrut\vskip-2\lineheight\verticalstrut}
% \vtop{\blank[synchronize]\blank[line]test}
\def\minimalhbox#1#%
{\dowithnextbox
{\bgroup
\setbox\scratchbox\hbox#1{\hss}%
\ifdim\nextboxwd<\wd\scratchbox\nextboxwd\wd\scratchbox\fi
\flushnextbox
\egroup}
\hbox}
% manual
%
% externfiguur -> grid =ja|hoogte|diepte|halveregel|passend -> helemaal in details
% stelplaatsblokin -> zijuitlijnen=hoogte|diepte|regel|halveregel|grid -> halveregel in 'details'
% TODO: TEST FIRST, NO CORRECTION NEEDED IN GRID MODE, EVT OPTION
\def\OTRONEsomeherefloat[#1]% spacing between two successive must be better
{\baselinecorrection % not really needed in grid mode:
%\ifgridsnapping \else \baselinecorrection \fi % ! ! ! test test test ! ! ! !
\doplacefloatbox
\doinsertfloatinfo
\dochecknextindentation\??bk
\dorechecknextindentation}
% todo: switch koppelen aan par scheelt pos
% to be documented: \startspread .. \stopspread
% to be documented primarydef p crossed d
% to be documented PlainTextArea
% manual
%
% Sometimes the demands are getting pretty weird:
%
% \startitemize
% \item test
% \item test
% \headsym{xx} test \par test
% \stopitemize
% \def\dodimchoice#1#2#3%
% {\ifx#3\relax
% #1\@EA\gobbleuntilrelax
% \else\ifdim#1#2%
% #3\@EAEAEA\gobbleuntilrelax
% \else
% \@EAEAEA\dodimchoice
% \fi\fi{#1}}
% \def\donumchoice#1#2#3%
% {\ifx#3\relax
% #1\@EA\gobbleuntilrelax
% \else\ifnum#1#2%
% #3\@EAEAEA\gobbleuntilrelax
% \else
% \@EAEAEA\dodimchoice
% \fi\fi{#1}}
% \def\dimchoice#1#2{\dodimchoice{#1}#2\empty\relax}
% \def\numchoice#1#2{\donumchoice{#1}#2\empty\relax}
\def\gobbleuntilempty#1\empty{}
\def\dodimchoice#1#2#3%
{\ifdim#1#2%
#3\@EA\gobbleuntilempty
\else
\@EA\dodimchoice
\fi{#1}}
\def\donumchoice#1#2#3%
{\ifnum#1#2%
#3\@EA\gobbleuntilempty
\else
\@EA\dodimchoice
\fi{#1}}
\def\dimchoice#1#2{\dodimchoice{#1}#2{=#1}{#1}\empty}
\def\numchoice#1#2{\donumchoice{#1}#2{=#1}{#1}\empty}
% \the\dimexpr(\dimchoice {7pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
% \the\dimexpr(\dimchoice{11pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
% \the\dimexpr(\dimchoice{14pt}{{<10pt}{8pt}{<12pt}{9pt}{<15pt}{10pt}{=11pt}{12pt}})
\def\showsetupsdefinition[#1]{\showvalue{\??su:#1}} % temp hack for debugging
% documentation : \setupregister[alternative=a|b|A|B]
\def\defineXMLstore {\doquadrupleargument\dodefineXMLstore[\saveXMLasdata]}
\def\defineXMLgstore{\doquadrupleargument\dodefineXMLstore[\gsaveXMLasdata]}
\def\dodefineXMLstore[#1][#2][#3][#4]% element attribute prefix % will become faster
{\defineXMLargument[#2][#3=\s!dummy]{#1{#4:\XMLop{#3}}}}
\def\countXMLchildren[#1]#2%
{\startnointerference
\doglobal\newcounter\nofXMLchildren
\defineXMLargument[#1]{\doglobal\increment\nofXMLchildren}%
\startXMLignore
#2%
\stopXMLignore
\stopnointerference}
\unprotected \def\traceposstring#1#2#3%
{\iftracepositions
\smashedhbox%
{#1{\infofont#2#3}%
\scratchdimen.5\points
\kern-2\scratchdimen
\vrule\!!width4\scratchdimen\!!height\scratchdimen\!!depth\scratchdimen}%
\fi}
% It took quite a while to figure this out (using the preliminary 1.5
% spec). There are still a lot of things to be implemented. This is
% the third alternative.
% todo: multiple instances, dus indirect
\let\currentrendering\empty
\definereference[StartCurrentRendering] [\v!StartRendering {\currentrendering}]
\definereference[StopCurrentRendering] [\v!StopRendering {\currentrendering}]
\definereference[PauseCurrentRendering] [\v!PauseRendering {\currentrendering}]
\definereference[ResumeCurrentRendering][\v!ResumeRendering{\currentrendering}]
\newcounter\nofexternalrenderings
\def\useexternalrendering{\doquadrupleempty\douseexternalrendering}
\def\setinternalrendering{\dodoubleempty \dosetinternalrendering}
\def\douseexternalrendering[#1][#2][#3][#4]% tag mime file options
{\setgvalue{\??rd:#1}{\plusone{#1}{#2}{#3}{#4}}}
\def\dosetinternalrendering[#1][#2]% tag options {content}
{\bgroup
\dowithnextbox
{\setgvalue{\??rd:#1}{\plustwo{#1}{IRO}{#1}{#2}}%
\let\objectoffset\zeropoint
\setobject{IRO}{#1}\hbox{\box\nextbox}%
\egroup}%
\hbox}
\def\checkrendering#1% let's hope that \next is not used
{\iflocation
\doifsomething{#1}%
{\doifdefined{\??rd:#1}%
{\expanded{\getvalue{\??rd::\number\renderingtype{#1}}%
{\filterfromvalue{\??rd:#1}52}{\filterfromvalue{\??rd:#1}53}%
{\filterfromvalue{\??rd:#1}54}{\filterfromvalue{\??rd:#1}55}}}}%
\fi}
\setvalue{\??rd::1}{\doinsertrendering}
\setvalue{\??rd::2}{\doinsertrenderingobject}
\def\renderingtype #1{\filterfromvalue{\??rd:#1}51}
\def\renderingoptions#1{\filterfromvalue{\??rd:#1}55}
\setexecutecommandcheck {startrendering} \checkrendering
\setexecutecommandcheck {stoprendering} \checkrendering
\setexecutecommandcheck {pauserendering} \checkrendering
\setexecutecommandcheck {resumerendering} \checkrendering
% by using a nice trick (used in other places of context as well) we
% can easily overload the default size to match the opbject size
\def\renderingwidth {8cm}
\def\renderingheight{6cm}
\def\definerenderingwindow
{\dodoubleempty\dodefinerenderingwindow}
\def\dodefinerenderingwindow[#1][#2]%
{\presetlocalframed[\??rw#1]%
\getparameters%
[\??rw#1]%
[\c!openpageaction=,\c!closepageaction=,%
\c!width=\renderingwidth,\c!height=\renderingheight,%
#2]}
\def\setuprenderingwindow
{\dodoubleargument\dosetuprenderingwindow}
\def\dosetuprenderingwindow[#1]%
{\getparameters[\??rw#1]}
\def\placerenderingwindow
{\dodoubleempty\doplacerenderingwindow}
\def\doplacerenderingwindow[#1][#2]%
{\bgroup
\edef\currentrendering{\ifsecondargument#2\else#1\fi}%
\ifcase\renderingtype\currentrendering\or
% a file
\or
% an object
\getobjectdimensions{IRO}\currentrendering
\scratchdimen\objectheight
\advance\scratchdimen\objectdepth
\edef\renderingheight{\the\scratchdimen}%
\edef\renderingwidth{\objectwidth}%
\fi
% create fall back if needed
\doifdefinedelse{\??rw#1\c!width}
{\def\currentrenderingwindow{#1}}
{\let\currentrenderingwindow\s!default
\definerenderingwindow[\currentrenderingwindow]}%
\checkrendering\currentrendering
\handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!openpageaction }}\dosetuprenderingopenpageaction
\handlereferenceactions{\getvalue{\??rw\currentrenderingwindow\c!closepageaction}}\dosetuprenderingclosepageaction
\localframed
[\??rw\currentrenderingwindow][\c!offset=\v!overlay]%
{\expanded{\doinsertrenderingwindow
\noexpand\currentrendering\hsize\vsize{\renderingoptions\currentrendering}}}%
\egroup}
% todo:
%
% \setinternalrendering[example-1][options]{}
% test file:
%
% \definerenderingwindow
% [example]
% [width=320pt,height=150pt,frame=off,
% background=color,backgroundcolor=gray,
% openpageaction=StartCurrentRendering,
% closepageaction=NextPage]% StopCurrentRendering]
%
% \useexternalrendering[example-1][audio/mpeg] [eldorado.mp3]
% \useexternalrendering[example-2][audio/mpeg] [myst-12.mp3]
% \useexternalrendering[example-3][application/x-shockwave-flash][http://localhost/mb.swf] [auto]
% \useexternalrendering[example-4][application/x-shockwave-flash][celebration.swf]
% \useexternalrendering[example-5][video/quicktime] [p1000726.mov]
% \useexternalrendering[example-6][application/smil] [quadratic_map.smi]
%
% \def\renderingmenu[#1]%
% {\hbox
% {\setupbuttons[width=2.5em]%
% \button{\symbol[StartRendering]} [StartRendering{#1}]\enspace
% \button{\symbol[StopRendering]} [StopRendering{#1}]\enspace
% \button{\symbol[PauseRendering]} [PauseRendering{#1}]\enspace
% \button{\symbol[ResumeRendering]}[ResumeRendering{#1}]}}
%
% \renderingmenu[example-1]\blank
% \renderingmenu[example-2]\blank
% \renderingmenu[example-3]\blank
% \renderingmenu[example-4] \placefigure{A ShockWave}{\placerenderingwindow[example][example-4]} \page
% \renderingmenu[example-5] \placefigure{A Movie}{\placerenderingwindow[example][example-5]} \page
% \renderingmenu[example-6] \placefigure{A Smile}{\placerenderingwindow[example][example-6]}
% will be a MyWay
%
% \setuplayout[grid=yes] \setupcaption[figure][inbetween=] \useMPlibrary[dum] \setupcolors[state=start]
%
% \starttext \showgrid \showstruts
%
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
% \input ward
% \page
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
% \input ward
% \page
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
% \input ward \placefigure{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
% \input ward
% \page
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=yes]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=fit]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.4,grid=height]}
% \input ward
% \page
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=yes]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=fit]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.5,grid=height]}
% \input ward
% \page
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=yes]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=fit]}
% \input ward \placefigure[none]{}{\externalfigure[dummy][width=.5\hsize,lines=1.6,grid=height]}
% \input ward
%
% \stoptext
% funny, as field action with e.g. dissolve ... only the field dissolves, bug?
\setglobalsystemreference\rt!exec{Transition}{transition}
%def\PDFexecutetransition {/Trans /Trans <>}
\def\PDFexecutetransition {/Trans /Trans <<\executeifdefined{PDFpage\argumentA}\PDFpagereplace>>}
% new, continuous blocks, \som \par \startdoorlopendblok ...
% \startitemize
% \item bagger
% \item bagger
% \item \startdoorlopendblok bagger \stopdoorlopendblok
% \item \endgraf \startdoorlopendblok bagger \stopdoorlopendblok
% \item \endgraf \startdoorlopendblok \strut bagger \stopdoorlopendblok
% \item \startdoorlopendblok
% \starttabulate
% \NC test \NC test \NC \NR
% \NC test \NC test \NC \NR
% \NC test \NC test \NC \NR
% \stoptabulate
% \stopdoorlopendblok
% \item test
% \stopitemize
\def\startdoorlopendblok % for special cases, don't change it too much and don't rely on it
{\ifhmode\endgraf\nobreak\fi % don't remove the \nobreak
\dowithnextboxcontent
{\setlocalhsize \hsize\localhsize \forgetall}
{\bgroup
\forgeteverypar
\forgetparskip
\scratchdimen\nextboxht
\advance\scratchdimen\nextboxdp
\getnoflines\scratchdimen
\advance\scratchdimen-\strutheight
\setbox\nextbox\hbox{\lower\scratchdimen\box\nextbox}%
\ht\nextbox\strutheight
\dp\nextbox\strutdepth
\setbox\nextbox\vbox
{\indent\box\nextbox
\endgraf
\nobreak
\advance\noflines\minusone
\dorecurse\noflines{\crlf\nobreak}}%
\verticalstrut
\endgraf
\nobreak
\offinterlineskip
\kern-2\lineheight % 2\lineheight when no vertical struts in main \vbox
\nobreak
\unvbox\nextbox
\prevdepth\strutdepth
% evt (eerst testen) een signal zodat een direct volgend blok goed gaat)
\egroup}
\vbox\bgroup
\vskip-\lineheight \verticalstrut\endgraf
\insidefloattrue
\doinhibitblank} % beware, no \inhibitblank ! ! ! ! ! !
\def\stopdoorlopendblok
{\endgraf\verticalstrut\endgraf\kern-2\lineheight
\egroup}
\def\definepushbutton % name optional setup
{\dodoubleempty\dodefinepushbutton}
\def\dodefinepushbutton[#1][#2]% name setup
{\dododefinepushbutton{#1}{n}{push}%
\dododefinepushbutton{#1}{r}{\symbol[psym:#1:n]}%
\dododefinepushbutton{#1}{d}{\symbol[psym:#1:r]}%
\setvalue{pushbutton:#1}{\dohandlepushbutton{#1}{#2}}}
\def\dododefinepushbutton#1#2#3%
{\doifsymboldefinedelse{psym:#1:#2}%
\donothing{\definesymbol[psym:#1:#2][{#3}]}}
\def\definepushsymbol
{\dotripleargument\dodefinepushsymbol}
\def\dodefinepushsymbol[#1][#2]% [#3]
{\definesymbol[psym:#1:#2]}
\def\dopushbutton[#1][#2]%
{\executeifdefined{pushbutton:#1}\gobbleoneargument{#2}}
\def\pushbutton
{\dodoubleargument\dopushbutton}
\def\dohandlepushbutton#1#2#3% identifier setup script
{\bgroup
\nextsystemfield
\setupfield
[pushbutton]
[\c!frame=\v!overlay,
\c!offset=\v!overlay,
\c!clickout=#3,#2]%
\definefield
[\currentsystemfield]
[push]
[pushbutton]
[psym:#1:n,psym:#1:r,psym:#1:d]%
\fitfield
[\currentsystemfield]%
\egroup}
% \def\do@@ampsh
% {\dodoubleargument\dodo@@ampsh}
%
% \def\dodo@@ampsh[#1][#2]#3\\%
% {\txt\pushbutton[#1][#2]\\}%
%
%\appendtoks \let\psh\do@@ampsh \to \everysetmenucommands
\def\@@ampsh{\txt\pushbutton}
\appendtoks \let\psh\@@ampsh \to \everysetmenucommands
% \definepushbutton [reset]
%
% \definepushsymbol [reset] [n] [\uniqueMPgraphic{whatever}{color=green}]
% \definepushsymbol [reset] [r] [\uniqueMPgraphic{whatever}{color=white}]
%
% \startinteractionmenu[bottom]
% \psh [reset] [JS(reset_something)] \\
% \stopinteractionmenu
\def\tabulaterule % to be redone, not correct
{\dotabulaterule
{\hrule\!!height.5\scratchdimen\!!depth.5\scratchdimen\relax
\doifvalue{\??tt\currenttabulate\c!distance}\v!grid
{\kern-\scratchdimen}}} % experimental tm-prikkels
% todo: \setupinterlinespace[\c!regel=\v!vast] => ==\the\baselineskip
%%%%%%%% todo: \chardef\snapstruts=1 => d=l-h
\def\useMPvariables
{\dodoubleargument\douseMPvariables}
\def\douseMPvariables[#1][#2]%
{\def\@@meta{#1:}%
\prepareMPvariables{#2}}
\def\processlinetableXMLfile#1%
{\bgroup
\let\startlinetable\donothing
\let\stoplinetable \donothing
\startlinetableanalysis\processXMLfile{#1}\stoplinetableanalysis
\startlinetablerun \processXMLfile{#1}\stoplinetablerun
\egroup}
% experimental: \synchronizegrid bla bla bla
\newcounter\currentgridsync
\def\gridsynctag{grs:\currentgridsync}
\def\synchronizegrid
{\doglobal\increment\currentgridsync
\par\prevdepth\zeropoint
\nointerlineskip
\hpos\gridsynctag{\strut}\par
\vskip-\lineheight
\nointerlineskip
% top of text
\scratchdimen\MPy{\v!text:\MPp\gridsynctag}%
\advance\scratchdimen\MPh{\v!text:\MPp\gridsynctag}%
% move to first baseline
\advance\scratchdimen-\topskip
% subtract wrong baseline
\advance\scratchdimen-\MPy\gridsynctag
% get minimal number of lines
\advance\scratchdimen\lineheight
\getnoflines\scratchdimen
% calculate difference
\advance\scratchdimen-\noflines\lineheight\relax
\scratchdimen-\scratchdimen\relax
\ifdim\scratchdimen>\zeropoint
\nointerlineskip
\advance\scratchdimen-\lineheight
\vskip\scratchdimen \dontleavehmode \quad \strut
\par
%\else
% \message{no grid correction: \the\scratchdimen}\wait
\fi}
% needed for extreme
\definesystemvariable{ie}
% \def\definetest[#1]#2%
% {\long\setvalue{\??ie#1}{#2}}
\def\definetest
{\dodoubleempty\dodefinetest}
\def\dodefinetest[#1][#2]#3%
{\setgvalue{\??ie#1}{#3}%
\ifsecondargument
\processaction
[#2]
[% first test true, rest depends
\v!next=>\setgvalue{\??ie#1}{\setgvalue{\??ie#1}{#3}\firstoftwoarguments},
% rest true if first true
% \v!first=>\setgvalue{\??ie#1}{#3{\letgvalue{\??ie#1}%
% \firstoftwoarguments\firstoftwoarguments}%
% \secondoftwoarguments},
% always true
\v!yes=>\letgvalue{\??ie#1}\firstoftwoarguments,
% always false
\v!no=>\letgvalue{\??ie#1}\secondoftwoarguments]%
\fi}
\def\doperformtest#1%
{\executeifdefined{\??ie#1}\secondoftwoarguments}
\def\definecolumnsethsize#1#2#3#4% will be improved/speed up
{\bgroup
\def\OTRSETidentifier{#1}%
\ifcase\columnsetlevel\relax
\mofcolumns\plusone
\OTRSETinitializecolumns
\OTRSETassignwidths
\OTRSETsethsize
\fi
\!!counta#2\!!countb#3\docalculatecolumnsetspan
\expandafter\egroup\expandafter\edef\expandafter
#4\expandafter{\the\!!widtha}}
% so far
% between alignment lines certain rules apply, and even a
% simple test can mess up a table, which is why we have a
% special test facility
%
% \ruledvbox
% {\starttabulate[|l|p|]
% \NC 1test \NC test \NC \NR
% \tableifelse{\doifelse{a}{a}}{\NC Xtest \NC test \NC \NR}{}%
% \stoptabulate}
\long \def\tableifelse#1%
{\TABLEnoalign{#1%
{\aftergroup \firstoftwoarguments}%
{\aftergroup\secondoftwoarguments}}}
% \long \def\tableif#1% whow, this is real ugly
% {\TABLEnoalign{\let\gnext\gobbleoneargument#1%
% {\let\gnext\firstofoneargument}}\gnext}
\long \def\tableiftextelse#1{\tableifelse{\doiftextelse{#1}}}
\def\expandifnonempty#1%
{\@EA\ifx\csname#1\endcsname\empty
\expandafter\secondoftwoarguments
\else
\expandafter\firstoftwoarguments
\fi
{\csname#1\endcsname}}
\def\@@sectiekoppeling#1%
{\expandifnonempty{\??ko#1\c!coupling}{#1}}
\def\@@sectiesectie#1%
{\expandifnonempty{\??ko#1\c!section}{\@@sectiekoppeling{#1}}}
\def\sectioncountervalue#1%
{\@@sectionvalue{\@@sectiesectie{#1}}}
% todo namespace \@@meta:#1:... ! ! ! ! ! !
\def\presetMPvariable
{\dodoubleargument\dopresetMPvariable}
\def\dopresetMPvariable[#1][#2=#3]%
{\doifundefined{#1:#2}{\setvalue{#1:#2}{#3}}}
% experiment, not yet to be used
\def\displaybreak
{\ifhmode
\removeunwantedspaces
\ifcase\raggedstatus\hfill\fi
\strut\penalty-9999 % \break fails on case (3)
\fi}
\def\startdisplay{\displaybreak\ignorespaces\startpacked}
\def\stopdisplay {\stoppacked\displaybreak\ignorespaces}
\def\tightvbox{\dowithnextbox{\nextboxdp\zeropoint\flushnextbox}\vbox}
\def\tightvtop{\dowithnextbox{\nextboxht\zeropoint\flushnextbox}\vtop}
% \translateMPinput{il2-pl}
%
% \startMPenvironment[global]
% \setupbodyfont[plr]
% \stopMPenvironment
%
% \TeX: ± ¶
%
% \startMPcode
% draw btex MetaPost: ± ¶ etex scaled 5 ;
% \stopMPcode
% now in cont-loc.tex, for the sake of testing.
%
% %D When \type {\somecolor} is issued, we can savely assume
% %D grouping. Using \type {\groupedcommand} here (i.e.\ the
% %D definition of \type {\color}) is unsafe because in
% %D interferes with for instance switching attributes.
%
% \def\switchtocolor[#1]%
% {\bgroup\startcolor[#1]
% \aftergroup\stopcolor
% \aftergroup\egroup}
% what is this stupid macro meant for:
\def\hyphenationpoint
{\hskip\zeropoint}
\def\hyphenated#1%
{\bgroup
\!!counta\zerocount
\def\hyphenated##1{\advance\!!counta\plusone}%
\handletokens#1\with\hyphenated
\!!countb\plusone
\def\hyphenated##1%
{##1%
\advance\!!countb\plusone\relax
\ifnum\!!countb>2 \ifnum\!!countb<\!!counta
\hyphenationpoint
\fi\fi}%
\handletokens#1\with\hyphenated
\egroup}
\def\obeysupersubletters
{\let\super\normalsuper
\let\suber\normalsuber
\let\normalsuper\letterhat
\let\normalsuber\letterunderscore
\enablesupersub}
\def\obeysupersubmath
{\let\normalsuper\letterhat
\let\normalsuber\letterunderscore
\enablesupersub}
%\let\normaltype\type
%
%\def\type#1%
% {\expanded{\normaltype{\detokenize{#1}}}}
% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
% \definefontsynonym[OldStyle][Serif]
% {x123 \os x123} {\tfa x123 \os x123} {x123 \tx x123 \os x123}
% testen :
%
% \appendtoks
% \let\registerparoptions\relax
% \to \everyforgetall
\def\startgridcorrection
{\dosingleempty\dostartgridcorrection}
\def\dostartgridcorrection[#1]%
{\ifgridsnapping
\iffirstargument\doifsomething{#1}{\moveongrid[#1]}\fi
\snaptogrid\vbox\bgroup
\else
\startbaselinecorrection
\fi}
\def\stopgridcorrection
{\ifgridsnapping
\egroup
\else
\stopbaselinecorrection
\fi}
\def\checkgridsnapping
{\lineskip\ifgridsnapping\zeropoint\else\normallineskip\fi}
\def\startplaatsen
{\dosingleempty\dostartplaatsen}
\def\dostartplaatsen[#1]% tzt n*links etc
{\endgraf
\noindent\bgroup
\setlocalhsize
\hbox to \localhsize\bgroup
\doifnot{#1}\v!left\hss
\def\stopplaatsen
{\unskip\unskip\unskip
\doifnot{#1}\v!right\hss
\egroup
\egroup
\endgraf}%
\gobblespacetokens}
% \startplaatsen[links] bla \stopplaatsen
% we don't register the paragraph characteristics, only the
% width
\appendtoks
\setinnerparpositions % see "techniek" for application
\to \everytabulate
%D This alternative is slower, since it works on top of the
%D color (stack) mechanism, but it does provide nesting.
\def\dosetrastercolor#1%
{\edef\@@cl@@s{#1}%
\ifx\@@cl@@s\empty
\let\@@cl@@s\@@rsscreen
\fi
\let\@@cl@@t\@@cl@@z % else we get rogue
\let\@@cl@@a\@@cl@@z % transpancies
\setevalue{\??cr\??rs}{\colorSpattern}}
% beware, don't add extra grouping, else color in tables
% fails
\def\localstartraster[#1]%
{\ifincolor\dosetrastercolor{#1}\localstartcolor[\??rs]\fi}
\def\startraster[#1]%
{\ifincolor\dosetrastercolor{#1}\startcolor[\??rs]\fi}
\def\localstopraster{\ifincolor\localstopcolor\fi}
\def\stopraster {\ifincolor\stopcolor\fi}
\def\raster[#1]{\groupedcommand{\startraster[#1]}{\stopraster}}
\def\fontclassname#1#2%
{\ifcsname\??ff#1#2\endcsname
\fontclassname{#1}{\csname\??ff#1#2\endcsname}%
\else\ifcsname\??ff#2\endcsname
\fontclassname{#1}{\csname\??ff#2\endcsname}%
\else
#2%
\fi\fi}
\def\defineclassfontsynonym
{\dotripleargument\dodefineclassfontsynonym}
\def\dodefineclassfontsynonym[#1][#2][#3]%
{\definefontsynonym[#1][\fontclassname{#2}{#3}]}
%\definefontsynonym [KopFont] [\fontclassname{officina}{SerifBold}]
%
%\defineclassfontsynonym [KopFont] [officina] [SerifBold]
\def\startcolumnmakeup % don't change
{\bgroup
\getrawnoflines\textheight % teksthoogte kan topskip hebben, dus raw
\scratchdimen\noflines\lineheight
\advance\scratchdimen-\lineheight
\advance\scratchdimen\topskip
\setbox\scratchbox
\ifcase\showgridstate\vbox\else\ruledvbox\fi to \scratchdimen\bgroup
\forgetall} % ! don't change
\def\stopcolumnmakeup
{\egroup
\dp\scratchbox\zeropoint
\wd\scratchbox\textwidth
\box\scratchbox
\egroup
\synchronizehsize}
% todo : hoe komt box er uit
\long\def\startexternalfigure
{\dotripleempty\dostartexternalfigure}
\long\def\dostartexternalfigure[#1][#2][#3]#4\stopexternalfigure
{\gdef\figuredescription{#4}%
\externalfigure[#1][#2][#3]%
\globallet\figuredescription\empty}
\let\figuredescription\empty
%% where does this come from, old code probably
%%
%%
%% \newif\ifpagechanged \let\lastchangedpage\empty
%%
%% \def\checkpagechange#1%
%% {\gettwopassdata\s!paragraph
%% \pagechangedfalse
%% \iftwopassdatafound
%% \ifnum\twopassdata>0\getvalue{\s!paragraph:p:#1}\relax
%% \pagechangedtrue
%% \fi
%% \fi
%% \ifpagechanged
%% \letgvalue{\s!paragraph:p:#1}\twopassdata
%% \globallet\lastchangedpage\twopassdata
%% \else
%% \globallet\lastchangedpage\realfolio
%% \fi
%% \doparagraphreference}
%%
%% \def\changedpage#1%
%% {\getvalue{\s!paragraph:p:#1}}
% incomplete, will be a special case of float placement
\def\startfixed{\dosingleempty\dostartfixed}
\def\dostartfixed[#1]%
{\expanded{\dowithnextbox{\noexpand\dodofixed{\ifhmode0\else1\fi}{#1}}}%
\vbox\bgroup
\setlocalhsize}
\def\stopfixed
{\egroup}
\def\dodofixed#1#2%
{\ifcase#1\relax
\processaction
[#2]
[ \v!high=>\bbox {\flushnextbox},
\v!low=>\tbox {\flushnextbox},
\v!middle=>\vcenter{\flushnextbox},
\v!lohi=>\vcenter{\flushnextbox},
\s!unknown=>\tbox {\flushnextbox},
\s!default=>\tbox {\flushnextbox}]%
\else
\startbaselinecorrection
\noindent\flushnextbox
\stopbaselinecorrection
\fi}
% \startitemize
%
% \item \externalfigure[koe][height=2cm]
% \item \externalfigure[koe][height=2cm]
% \item \externalfigure[koe][height=2cm]
% \item \externalfigure[koe][height=2cm]
%
% \page
%
% \item \startfixed \externalfigure[koe][height=2cm]\stopfixed
% \item \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
% \item \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
% \item \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
%
% \page
%
% \item test \startfixed \externalfigure[koe][height=2cm]\stopfixed
% \item test \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
% \item test \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
% \item test \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
%
% \page
%
% \item test \par \startfixed \externalfigure[koe][height=2cm]\stopfixed
% \item test \par \startfixed[high]\externalfigure[koe][height=2cm]\stopfixed
% \item test \par \startfixed[low] \externalfigure[koe][height=2cm]\stopfixed
% \item test \par \startfixed[lohi]\externalfigure[koe][height=2cm]\stopfixed
%
% \stopitemize
% still needed for uguide
\let\placefloatlabel \placefloatcaption
\let\placefloatlabeltext \placefloatcaptiontext
\let\placefloatlabelreference \placefloatcaptionreference
\def\obeyfollowingtoken{{}} % end \cs scanning
\def\gobbleparameters{\doquadrupleempty\dogobbleparameters}
\def\dogobbleparameters[#1][#2][#3][#4]{}
% documentation
% \starttable[|||]
% \HL
% \VL test \VS test \VL \FR
% \VL test \VD test \VL \MR
% \VL test \VT test \VL \LR
% \HL
% \stoptable
%D To be documented, \type {\includemenu[menu]}.
%D To be documented, \type {\emphbf} cum suis.
%D For Ton. To be documented.
\def\plaatsexterndocument[#1]%
{\def\doexternaldocument##1##2##3{\readlocfile{##2}\donothing\donothing}%
\getvalue{\v!file:::#1}}
%D Far from complete.
\def\startgeheel
{\startlinecorrection
\insidefloattrue}
\def\stopgeheel
{\stoplinecorrection}
%D Next we load a few local optimizations and new features. They
%D live on on my machine and are not distributed, but they may end
%D up in the distributed files.
\loadmarkfile{cont-new}
\readsysfile {cont-loc} {} {} % local improvements, patches, new features
\readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups)
\readsysfile {cont-mtx} {} {} % experimental metatex features
\protect \endinput