%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. %D This file is loaded at runtime, thereby providing an %D excellent place for hacks, patches, extensions and new %D features. % \font\f=dummyfont \rpcode\f0=500 \hbox{..}\char0 % todo: mp-new % caption: grid=top|bottom in xml defs \unprotect \writestatus{\m!systems}{beware: some patches loaded from cont-new.tex} % \tracefilestrue % % \unexpanded\def\readfile#1#2#3% % {\readlocfile{#1}{#2} % {\readjobfile{#1}{#2} % {\readsysfile{#1}{#2}{#3}}}} \unexpanded\def\readfile#1#2#3% {\readlocfile{#1}{#2}{\readsysfile{#1}{#2}{#3}}} \chardef\preprocessmethod 2 % 0=no check 1=present_check 2=log_check \chardef\preprocessstate 0 % 1=found 2=not_present (skip) \def \preprocesssuffix {.prep} \def\loadctxpreplist {\ifcase\preprocessmethod % no checking \or % simple checking \or \doiffileexistselse{./\jobname.ctl} {\bgroup \defineXMLenvironment[ctx:preplist] {\writestatus\m!systems{loading ctx log file}} {}% \defineXMLenvironmentsave[ctx:prepfile][done=no] {} {\writestatus\m!systems{registering \XMLflush{ctx:prepfile} -> \XMLop{done}}% \setxvalue{fp..\XMLflush{ctx:prepfile}}{\XMLop{done}}}% \processXMLfile{./\jobname.ctl}% \egroup}% {\global\chardef\preprocessmode\plusone}% \fi \global\let\loadctxpreplist\relax} \appendtoks\loadctxpreplist\to\everystarttext % will become: \prependtoks\loadctxpreplist\to\everyjob \def\docheckprepfile {\ifcase\preprocessmethod % no preprocessing \or % only check for existence \doiffileexistselse{\readfilename\preprocesssuffix} {\chardef\preprocessstate\plusone} \donothing \or % check when in list, otherwise assume normal file \bgroup \splitfilename\readfilename \ifx\splitofftype\empty % saveguard and speed up \egroup \else \doifdefinedelse{fp..\splitoffname.\splitofftype} {\egroup \doiffileexistselse{\readfilename\preprocesssuffix} {\chardef\preprocessstate\plusone} {\chardef\preprocessstate\plustwo}}% {\egroup}% \fi \fi} % beware, \readfilename keeps the original one, but we load and store the % suffixed with .prep file (if present) \def\doreadfile#1#2#3#4% beware, this one already works at format generation time! {\sanitizefilename#2\to\readfilename \ifx\readfilename\empty % silently ignore \else \let\trackedfilename\readfilename \chardef\preprocessstate\zerocount \ifconditional\trackfilenames \doifundefinedelse{fn..\trackedfilename}\donetrue\donefalse \else \donetrue \fi \ifdone \checkfilename\readfilename \ifcase\kindoffile % not a full path or url, check for existence \doifelsenothing{#1} {\iftracefiles\writestatus\m!systems{searching for \readfilename\space on tex path}\fi \def\next{\redoreadfile\readfilename{#3}{#4}}}% {\iftracefiles\writestatus\m!systems{searching for \readfilename\space on #1}\fi \def\next{\redoreadfile{\pathplusfile{#1}{\readfilename}}{#3}{#4}}}% \else % a full path or url, no further checking done \docheckprepfile \ifcase\preprocessstate \doiffileexistselse\readfilename {\iftracefiles\writestatus\m!systems{located \readfilename}\fi \def\next{#3\dodoreadfile}}% {\iftracefiles\writestatus\m!systems{not found \readfilename}\fi \def\next{#4}}% \or \iftracefiles\writestatus\m!systems{located \readfilename\preprocesssuffix}\fi \def\next{#3\dodoreadfile}% \or \iftracefiles\writestatus\m!systems{not found \readfilename\preprocesssuffix}\fi \def\next{#4}% \fi \fi \else \edef\readfilename{\getvalue{fn..\readfilename}}% \iftracefiles\writestatus\m!systems{already located \readfilename}\fi \def\next{#3\dodoreadfile}% \fi \expandafter\next \fi} \def\redoreadfile#1#2#3% {\docheckprepfile \ifcase\preprocessstate \doiffileexistselse{#1}% {\edef\readfilename{#1}% \iftracefiles\writestatus\m!systems{#1 located}\fi \def\next{#2\dodoreadfile}}% {\iftracefiles\writestatus\m!systems{cannot locate #1}\fi \decrement\readlevel\relax \ifnum\readlevel>\zerocount \edef\readfilename{\pathplusfile{\f!parentpath}{\readfilename}}% \def\next{\redoreadfile\readfilename{#2}{#3}}% \else \def\next{#3}% \fi}% \or \edef\readfilename{#1}% \iftracefiles\writestatus\m!systems{#1\preprocesssuffix\space located}\fi \def\next{#2\dodoreadfile}% \or \def\next{#3}% \fi \next} \def\dodoreadfile % we provide hooks, for instance for \enableXML {\ifconditional\trackfilenames \setxvalue{fn..\trackedfilename}{\readfilename\ifcase\preprocessstate\or\preprocesssuffix\fi}% \fi \the\everybeforereadfile \ifcase\preprocessstate % no checking or not found when using method 1 \normalinput\readfilename \or % found when using method 1 or 2 \normalinput\readfilename\preprocesssuffix \or % not found when using method 2 \fi \relax \the\everyafterreadfile} \def\headparameter#1% to do: everywhere in core-sec {\csname\??ko\currenthead#1\endcsname} % 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 %D Krzysztof Leszczynski suggested to provide access to the level by %D means of a \type {#1}. I decided to pass the more frquently used %D level as \type {#1} and the less favoured depth as \type {#2}. The %D intended usage is: %D %D \starttyping %D \dorecurse{3}{\definesymbol[test-#1][xx-#1]} %D %D \def\test{\dorecurse{3}{\definesymbol[test-##1][xx-##1]}} \test %D %D \symbol[test-1]\quad\symbol[test-2]\quad\symbol[test-3] %D \stoptyping %D %D Since the hashed arguments are expanded, we don't need tricky %D expansion here. %D %D \starttyping %D \dorecurse{3}{\expanded{\definesymbol[test-\recurselevel][xx-\recurselevel]}} %D \stoptyping \def\expandrecursecontent {\csname\@@arecurse\recursedepth\@EA\@EA\@EA\endcsname\@EA\@EA\@EA{\@EA\recurselevel\@EA}\@EA{\recursedepth}} \long\def\xdorecurse#1#2% {\global\advance\outerrecurse \plusone \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#2}% \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \@EA\dodorecurse\@EA1\@EA{\number#1}} \long\def\dostepwiserecurse#1#2#3#4% can be made faster by postponing #4 {\global\advance\outerrecurse \plusone \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#4}% \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \ifnum#3>0\relax \ifnum#2<#1\relax \let\nextrecurse\exitstepwiserecurse \else \let\nextrecurse\dodostepwiserecurse \fi \else \ifnum#3<0\relax \ifnum#1<#2\relax \let\nextrecurse\exitstepwiserecurse \else \let\nextrecurse\dodostepwisereverse \fi \else \let\nextrecurse\exitstepwiserecurse \fi \fi\expanded{\nextrecurse{\number#1}{\number#2}{\number#3}}} \long\def\doloop#1% {\global\advance\outerrecurse \plusone \long\global\@EA\def\csname\@@arecurse\recursedepth\endcsname##1##2{#1}% \global\@EA\let\csname\@@irecurse\recursedepth\endcsname\recurselevel \let\endofloop\dodoloop \dodoloop1} % no \plusone else \recurselevel wrong \ifx\normalcompound\undefined \let\normalcompound=| \fi % 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} % new: \forcebaselinecorrection --> core-spa & core-grd \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} % todo: fast processor \def\gettwopassdatalist#1% {\loadtwopassdata \ifcsname#1:\s!list\endcsname \letcscsname\twopassdatalist\csname#1:\s!list\endcsname \else \let\twopassdatalist\empty \fi} % \def\literateencodedtokens % {% \let\dohandleaccent \keephandleaccent % assumes named chars % defineaccent "e {name} % % \let\dohandlecommand \keephandlecommand % assumes named chars % definecommand crap {name} % \let\dohandlecharacter\keephandlecharacter} % % \def\convertmeaning#1\to % watch the double expansion ! % {\bgroup % \honorunexpanded % %\dontexpandencoding % new % \literateencodedtokens % newer % \xdef\@@globalexpanded{#1}% % \xdef\@@globalexpanded{\@@globalexpanded}% % \egroup % \convertcommand\@@globalexpanded\to} \def\defXMLattributestring#1#2#3#4% {\ifcsname\@@XMLvariable:#2:#3\endcsname \@EA\convertcommand\csname\@@XMLvariable:#2:#3\endcsname\to#1% \else \convertargument#4\to#1% \fi} \bgroup \catcode`\<=\active % usage: \expanded{\rescanXMLatttributes{fo:table-cell}} \gdef\rescanXMLattributes #1{\noexpand\dogetXMLarguments{#1}\currentXMLarguments>} \gdef\parseXMLattributes #1#2{\dogetXMLarguments{#1}#2>} \egroup % \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} % And so, after a few years of keeping this potentially dangerous % speedup in cont-exp, we now move it to the kernel: the next % patch is 30\% faster on main interface (seconds) (9->7 sec on % 1 million calls). Another speed up is still under testing. \startinterface english \def\dosetevalue #1#2{\@EA\edef\csname#1#2\endcsname} \def\dosetgvalue #1#2{\@EA\gdef\csname#1#2\endcsname} \def\dosetvalue #1#2{\@EA\def \csname#1#2\endcsname} \def\docopyvalue#1#2#3{\@EA\def \csname#1#3\@EA\endcsname\@EA{\csname#2#3\endcsname}} \stopinterface \def\XMLprocess#1% {\begingroup\enableXML\XMLflush{#1}\endgroup} %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{\bgroup\directsetup{#1}\scantokens{#2\ignorespaces}\egroup} % 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 \def\XMLexpanded#1% {\bgroup \honorunexpanded % \dontexpandencoding % \dontexpandutf \let\dohandleactivecharacter\donthandleactivecharacter \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}}} %D Ok, I got tired of making dedicated clean up macros using the %D same mechanism again and again, so now we have: %D %D \starttyping %D \def\xxxx{abc.d} \replacecharacters\xxxx{a.}{-} \xxxx %D \stoptyping \def\replacecharacters#1#2#3% macro characters replacement {\bgroup \edef\ascii{#1}% \retainlccodes \def\docommand##1{\lccode\expandafter`\csname##1\endcsname=\expandafter`\csname#3\endcsname}% \handletokens#2\with\docommand \lowercase\@EA{\@EA\xdef\@EA\globalascii\@EA{\ascii}}% \egroup \dodoglobal\let#1\globalascii} \ifx\pagediscards\undefined \let\pagediscards\relax \fi \installoutput\synchronizeoutput % maybe add pagediscards {\ifvoid\normalpagebox\else \unvbox\normalpagebox \pagediscards \fi} % temp hack, else no proper default fall back (like \textmultiply); todo: sync encoding \appendtoks \let\characterencoding\nocharacterencoding \to \everymathematics % \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} \def\gettwopassdatalist#1% {\loadtwopassdata \letcscsname\twopassdatalist\csname#1:\s!list\endcsname \ifx\twopassdatalist\relax\let\twopassdatalist\empty\fi} \newcounter\nofmarkedpages \def\definemarkedpage[#1]% {\definetwopasslist{\v!page:#1}} \def\markpage[#1]% looks very much like domarginreference {\iftrialtypesetting\else \doglobal\increment\nofmarkedpages\relax \edef\writeparref% {\writeutilitycommand% {\twopassentry% {\v!page:#1}% {\nofmarkedpages}% {\noexpand\realfolio}}}% \writeparref \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)\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 % \def\doshowpardata#1#2{\hbox{\string#1: \the#2}\endgraf} % % \def\showpardata % {\edef\thepardata % {\hbox{font: \fontname\font}\endgraf % \doshowpardata{interword space}{\fontdimen2\font}% % \doshowpardata{interword stretch}{\fontdimen3\font}% % \doshowpardata{interword shrink}{\fontdimen4\font}% % \doshowpardata{quad space}{\fontdimen6\font}% % \doshowpardata{extra space}{\fontdimen7\font}% % \doshowpardata\hsize\hsize % \doshowpardata\leftskip\leftskip % \doshowpardata\rightskip\rightskip % \doshowpardata\spaceskip\spaceskip % \doshowpardata\xspaceskip\xspaceskip % \doshowpardata\parindent\parindent % \doshowpardata\parfillskip\parfillskip % \doshowpardata\hyphenpenalty\hyphenpenalty % \doshowpardata\exhyphenpenalty\exhyphenpenalty % \doshowpardata\displaywidowpenalty\displaywidowpenalty % \doshowpardata\widowpenalty\widowpenalty % \doshowpardata\clubpenalty\clubpenalty % \doshowpardata\brokenpenalty\brokenpenalty % \doshowpardata\doublehyphendemerits\doublehyphendemerits % \doshowpardata\finalhyphendemerits\finalhyphendemerits % \doshowpardata\adjdemerits\adjdemerits}% % \begingroup % \dontshowcomposition % \inleftmargin{\vsmash % {\switchtobodyfont[7pt,tt]% % \framed[\c!align=\v!right]{\thepardata}}}% % \endgroup} % % \def\startshowpardata % {\begingroup % \showcomposition % \showstruts\tracepositionstrue \tracingparagraphs\maxdimen % \appendtoksonce\showpardata\let\showpardata\relax\to\everypar} % % \def\stopshowpardata % {\endgraf % \endgroup} % % \defineXMLenvironment[showpardata] \startshowpardata \stopshowpardata % \defineXMLsingular [showpardata] \showpardata % 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\docommando##1% {\doiffileelse{\pathplusfile{##1}{#1}}{\donetrue\def\locatedfilepath{##1}}\donefalse \ifdone\expandafter\quitcommalist\fi}% \doifparentfileelse{#1} % new {\processcommacommand [\allinputpaths]\docommando} {\processcommacommand[.,\allinputpaths]\docommando}% \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\dimexpr(2\dimexpr(#1)/(\dimexpr(#2)/32768))} \def\doxprecurse#1#2% {\ifnum#1=\zerocount % no \ifcase \expandafter\gobblethreearguments \else #2\expandafter\expandafter\expandafter\doxprecurse\expandafter \fi\expandafter{\the\numexpr(#1-1)}{#2}} \def\buttonframed{\dodoubleempty\localframed[\??bt]} % goodie \unexpanded\def\asciistr#1{\convertargument#1\to\ascii{\verbatimfont\ascii}} \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 \def\enableXML {\setinputmode[XML]} \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 % Currently there is a bug in \lastnodetype, so we will enable this % feature when the bugfix is widespread. % \beginETEX \lastnodetype % % \def\dodoreshapebox#1#2#3#4% \shapebox, \shapepenalty, \shapekern, \shapeskip % {\ifnum\lastnodetype=\@@gluenode % \ifcase\lastskip % \ifdim\lastskip=\zeropoint\relax % \shapeskip\lastskip % \global\setbox\tmpshapebox\normalvbox{#4\unvbox\tmpshapebox}% % \unskip % \else\ifnum\lastnodetype=\@@kernnode % \ifcase\lastkern % \ifdim\lastkern=\zeropoint\relax % \shapekern\lastkern % \global\setbox\tmpshapebox\normalvbox{#3\unvbox\tmpshapebox}% % \unkern % \else\ifnum\lastnodetype=\@@penaltynode % \ifcase\lastpenalty % \ifnum\lastpenalty=\zerocount % \shapepenalty\lastpenalty % \global\setbox\tmpshapebox\normalvbox{#2\unvbox\tmpshapebox}% % \unpenalty % \else % \setbox\shapebox\lastbox % \ifvoid\shapebox % \unskip\unpenalty\unkern % \else % \ifdim\wd\shapebox=\shapesignal\relax % \exitloop % \else % \shapecounter\zerocount % \global\setbox\tmpshapebox\normalvbox{#1\unvbox\tmpshapebox}% % \fi % \fi % \fi\fi\fi % \ifnum\shapecounter>100 % can be less % \message{<>}% % \global\setbox\tmpshapebox\copy\oldshapebox % \exitloop % \else % \advance\shapecounter \plusone % \fi} % % \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} % 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 % wait till bugfix in etex is widespead % % \beginETEX \lastnodetype % % \def\removeunwantedspaces % {\ifhmode % \doloop{\ifnum\lastnodetype=\@@gluenode\unskip\else\exitloop\fi}% % \fi} % % \endETEX % \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\pushXMLmeaning#1% {\@EA\pushmacro\csname\@@XMLelement:#1/\endcsname \@EA\pushmacro\csname\@@XMLelement:#1\endcsname \@EA\pushmacro\csname\@@XMLelement:/#1\endcsname} \def\popXMLmeaning#1% {\@EA\popmacro\csname\@@XMLelement:#1/\endcsname \@EA\popmacro\csname\@@XMLelement:#1\endcsname \@EA\popmacro\csname\@@XMLelement:/#1\endcsname} \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\overloaded#1#2% {\appendtoks \writestatus\m!systems{overloaded: \string#2}% \to \everybye #1#2} \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} % pretty important (esp since we now ignore shipouts) % % actually we should nil all writes, marks, specials \appendtoks \globallet\popproperties \relax \to \everylastshipout \appendtoks \globallet\popsplitproperties\relax \to \everylastshipout \def\incrementvalue#1{\expandafter\increment\csname#1\endcsname} \def\decrementvalue#1{\expandafter\decrement\csname#1\endcsname} % \translateMPinput{il2-pl} % % \startMPenvironment[global] % \setupbodyfont[plr] % \stopMPenvironment % % \TeX: ± ¶ % % \startMPcode % draw btex MetaPost: ± ¶ etex scaled 5 ; % \stopMPcode % \startcolumnset[two] \input tufte % \startcolumnsetspan[two] \input tufte \stopcolumnsetspan % \input tufte \stopcolumnset % 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 \appendtoks \checkcurrentlayout \to \everystarttext \def\flushfootnotes {\flushnotes} \def\doflushfootnotes{\doflushnotes} %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\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 A prelude to strategies. Note for myself: overloads %D previous stuff from local pragma test files. \def\s!strategy{strategy} \def\currentstrategypass {1} \def\currentstrategyvariable{0} \def\maximumstrategypass {8} \newconditional\strategypassneeded \newconditional\strategypassforced \definetwopasslist{\s!strategy} \def\registerstrategypass% {\ifnum\currentstrategypass>\maximumstrategypass \else \ifconditional\strategypassforced \doglobal\increment\currentstrategypass \else%\ifconditional\strategypassneeded %\doglobal\increment\currentstrategypass \fi%\fi \fi \savecurrentvalue\currentstrategypass{\currentstrategypass}} \appendtoks \registerstrategypass \to \everybye % \everylastshipout \def\setstrategyvariable#1#2% key value {%\doifnotstrategyvariable{#1}{\global\settrue\strategypassneeded}% \doglobal\increment\currentstrategyvariable \expanded{\immediatewriteutilitycommand{\noexpand \twopassentry{\s!strategy}{\currentstrategyvariable}{#1::#2}}}} \def\doifstrategyvariableelse#1#2#3% {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi} \def\getstrategyvariable#1% key {\findtwopassdata{\s!strategy}{#1::}% \setxvalue{\s!strategy:#1}{\twopassdata}} \def\retainstrategyvariable#1% key {\expanded{\setstrategyvariable{#1}{\strategyvariable{#1}}}} \def\strategyvariable#1% key {\csname\s!strategy:#1\endcsname} \let\stratvar\strategyvariable \def\forcestrategy{\global\settrue \strategypassforced} \def\abortstrategy{\global\setfalse\strategypassforced} \def\doifstrategyvariableelse#1#2#3% {\getstrategyvariable{#1}\iftwopassdatafound#2\else#3\fi} \def\doifstrategyvariable #1#2{\doifstrategyvariableelse{#1}{#2}{}} \def\doifnotstrategyvariable#1#2{\doifstrategyvariableelse{#1}{}{#2}} %D New: only at start of columns; may change ! Rather %D interwoven and therefore to be integrated when the multi %D column modules are merged. % already taken care of: \definesystemvariable{ks} % is buggy now and does not work any longer \def\setupcolumnspan[#1]% {\getparameters[\??ks][#1]} \presetlocalframed [\??ks] \setupcolumnspan [\c!n=2, \c!offset=\v!overlay, \c!frame=\v!off] \newbox\columnspanbox \let\postprocesscolumnspanbox\gobbleoneargument \def\dostartcolumnspan[#1]% {\bgroup \setupcolumnspan[#1]% \forgetall \ifinsidecolumns \advance\hsize \intercolumnwidth \hsize\@@ksn\hsize \advance\hsize -\intercolumnwidth \fi \dowithnextbox {\setbox\columnspanbox\flushnextbox \ifinsidecolumns\wd\columnspanbox\hsize\fi \postprocesscolumnspanbox\columnspanbox \scratchdimen\ht\columnspanbox \setbox\columnspanbox\hbox % depth to be checked, probably option! {\localframed[\??ks][\c!offset=\v!overlay]{\box\columnspanbox}}% \ht\columnspanbox\scratchdimen \dp\columnspanbox\strutdp \wd\columnspanbox\hsize \ifinsidecolumns \ifnum\@@ksn>1 \setvsize \dohandleallcolumns {\ifnum\currentcolumn>\@@ksn\else \global\setbox\currenttopcolumnbox=\vbox {\ifnum\currentcolumn=1 \snaptogrid\vbox{\copy\columnspanbox} \else \snaptogrid\vbox{\vphantom{\copy\columnspanbox}} \fi}% \wd\currenttopcolumnbox\hsize \global\advance\vsize -\ht\currenttopcolumnbox \fi} \global\pagegoal\vsize \else \snaptogrid\vbox{\box\columnspanbox} \fi \else \snaptogrid\vbox{\box\columnspanbox} \fi \endgraf \prevdepth\strutdp \egroup} \vbox\bgroup %\topskipcorrection % becomes an option ! \EveryPar{\begstrut\EveryPar{}}} % also ! \def\startcolumnspan {\dosingleempty\dostartcolumnspan} \def\stopcolumnspan {\egroup} %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 No more news. \protect %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. \readsysfile {cont-loc} {} {} % local improvements, patches, new features \readsysfile {cont-exp} {} {} % experimental features (e.g. local speed-ups) \endinput