%D \module %D [ file=x-fig-04, %D version=2001.03.21, %D title=\CONTEXT\ Style File, %D subtitle=Figure Base Loading, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. % hele base laden \setXMLfallbackmode3 % icon : preview % caption : \figurebasevariable{caption} % background : rgb cmyk gray name % dimensions : width height offset (l,r,t,b) area % alternative : tag label / evt list % % movie % sound % applet % application \usemodule[res-00] % basic element definitions %D This module implements an interface to a figure database %D and file. The database is formatted in \XML\ conforming %D the following \DTD: %D %D \typefile{x-fig-00.dtd} %D %D A figure base coded this way looks like: %D %D \starttyping %D %D %D %D %D %D %D %D PRAGMA Advanced Document Engineering %D Manuals %D Beginners Manual %D A bunch of figures. %D %D %D %D koe.pdf %D a dutch cow %D Corel Draw Suite %D I bet that you've seen this cow before. %D %D %D %D non existent %D a european cow %D Nobody %D When will we talk about European cows? %D %D %D %D \stoptyping %D %D You can convert this base into a \PDF\ file using %D \TEXEXEC\ and another module in this suite. %D %D \starttyping %D texexec --pdf --use=fig-make yourfile.xml %D \stoptyping %D %D You can now select a graphic from this file using the %D %D \starttyping %D \externalfigure[a dutch cow][width=4cm] %D \stoptyping %D %D This module overloads this command so that a figure is %D it first searched in the list of databases. %D %D \starttyping %D \usemodule [fig-base] %D \usefigurebases[yourfile] %D \stoptyping %D %D The special keyword \type {reset} can be used to reset %D this list. \startcommands dutch english german czech italian romanian usefigurebase: gebruikfiguurbestand usefigurebase usefigurebase usefigurebase usefigurebase usefigurebase \stopcommands \unprotect \consultutilityfilefalse % 0 = no loading % 1 = selective loading % 2 = full loading \chardef\figurebasemode=1 % 2 \newcounter\figurefilepage % loading a complete figure base \startXMLmapping[rl:load] \defineXMLenvironmentsave [rl:figure] {\bgroup} {\XMLflush{rl:figure} \doglobal\increment\figurefilepage \figbase@savedata{\XMLflush{rl:label}}\figurefilepage \egroup} \stopXMLmapping \def\loadfigurebase#1% {\doifnotflagged{rl:#1} {\writestatus{figbase}{loading #1 into memory}% \startnointerference \autoXMLnamespace[rl] \startXMLmapping[rl:load] \doglobal\newcounter\figurefilepage \processXMLfilegrouped{#1.xml} \stopXMLmapping \doglobal\setflag{rl:#1} \stopnointerference}} \def\figbase@savedata#1#2% {%\writestatus{figbase}{data of #1 loaded}% \doglobal\saveXMLdatastructure{rl:rl:#1}{record}{page="#2"}{}{rl:figure}{}} % locating and if needed loading one figure record \startXMLmapping[rl:find] \defineXMLenvironment[rl:instance] {\bgroup} {\doif\askedlabel{\XMLflush{rl:label}} {\doglobal\saveXMLdata{rl:g:manipulation}{rl:manipulation}% \doifXMLdata{rl:original} {\xdef\askedlabel{\XMLflush{rl:original}}}}% \egroup} \defineXMLenvironmentsave [rl:figure] {\bgroup} {\XMLflush{rl:figure} \doglobal\increment\figurefilepage %\doshowfigurestate{base : comparing \askedlabel\space with \XMLflush{rl:label}}% \doif\askedlabel{\XMLflush{rl:label}} {\doshowfigurestate{base label : found \askedlabel}% \ifnum\figurebasemode=\plusone % load used ones \figbase@savedata\askedlabel\figurefilepage \fi \doglobal\saveXMLdata{rl:l:manipulation}{rl:manipulation}% \xdef\figurefilelabel {\XMLflush{rl:label}}% \xdef\figurefilefile {\XMLflush{rl:file}}% \xdef\figurefileoriginal{\XMLflush{rl:original}}% \xdef\figurefilename {\XMLflush{rl:file}} \endinput}% \egroup} \defineXMLenvironment [rl:record] {} {\xdef\figurefilename{\XMLpop{rl:file}} \xdef\figurefilepage{\XMLop {page}}} \stopXMLmapping \def\getfigurefilename#1#2% {\ifnum\figurebasemode=\plustwo \loadfigurebase{#1} \fi \startnointerference \traceXMLelementsfalse \resetfigurefilebase \doglobal\newcounter\figurefilepage \autoXMLnamespace[rl] \startXMLmapping[rl:find] \xdef\figurefilebase{#1}% \def\askedlabel{#2}% \doifelseXMLelement{rl:rl:\askedlabel} {\enableXMLelements\flushXMLelement{rl:rl:\askedlabel}} {\doshowfigurestate{base path : \figurepathlist}% \processcommacommand[\figurepathlist]\dogetfigurefilename}% \stopXMLmapping \stopnointerference} % todo: niet toegekende naam doorgeven aan calculate en pad % in padstring \def\dogetfigurefilename#1% {\ifx\figurefilename\empty \bgroup \doglobal\newcounter\figurefilepage \globalletempty\figurefilelabel \globalletempty\figurefileoriginal \globalletempty\figurefilefile \xdef\figurefilebasepath{#1}% \assignfullfilename{#1}{\figurefilebase}\to\filename \doiffileelse{\filename.xml} {\doshowfigurestate{base file : \filename}% \expanded{\processXMLfilegrouped{\filename.xml}}} \donothing \ifx\figurefilename\empty \else % \global\let\figurefilebase\figurefilebase \globallet\figurefilebase\filename % hm, bad omen that this is needed \fi \egroup \fi} \newtoks\figurebaseresets \appendtoks \globalletempty\figurefilebase \globalletempty\figurefilename \globalletempty\figurefilebasepath \globalletempty\figurefilepage \globalletempty\figurefilelabel %\globalletempty\figurefileoriginal %\globalletempty\figurefilefile \to\figurebaseresets \def\resetfigurefilebase {\the\figurebaseresets} \ifx\doshowfigurestate\undefined \let\doshowfigurestate\gobbleoneargument \fi \def\doanalyzefiguredimensionsfromfile {\ifcase\figurestatus \ifx\figurebaselist\empty \else \resetfigurefilebase \doshowfigurestate{base list : \figurebaselist}% \processcommacommand[\figurebaselist]\dodoanalyzefiguredimensionsfromfile \ifx\figurefilename\empty \doshowfigurestate{base warning : no matching name found}% \else \doiffileelse{\figurefilebase.pdf} {\doshowfigurestate{base file : \figurefilebase.pdf}% \doshowfigurestate{base page : \figurefilepage}% \let\figurepathlist\figurefilebasepath \analyzefigurefilename{\figurefilebase.pdf}\wantedfigurelabel \let\wantedfigurepage\figurefilepage} {\doshowfigurestate{base missing : \figurefilebase.pdf}} \fi \ifcase\figurestatus \analyzefigurefilename\expandedfigurename\wantedfigurelabel \fi \fi \fi} \def\dodoanalyzefiguredimensionsfromfile#1% {\doshowfigurestate{base check : \wantedfigurename\space in #1}% \getfigurefilename{#1}\wantedfigurename \ifx\figurefilename\empty\else \quitcommalist \fi} % management % will become \useresourcelibrary \def\usefigurebase[#1]% {\doifelse{#1}\v!reset {\let\figurebaselist\empty} {\addtocommalist{#1}\figurebaselist}} \let\figurebaselist\empty \resetfigurefilebase % manipulations / todo: fixed order \defineXMLsave [rl:manipulation] \defineXMLsingular [rl:background] [r=0,g=0,b=0,s=0,c=0,m=0,y=0,k=0] {\global\setbox\foundexternalfigure\vbox {\definecolor [XMLRLcolor] [r=\XMLop{r},g=\XMLop{g},b=\XMLop{b},s=\XMLop{s},% c=\XMLop{c},m=\XMLop{m},y=\XMLop{y},k=\XMLop{k}]% \framed [\c!frame=\v!off,\c!offset=\v!overlay, \c!background=\v!color,\c!backgroundcolor=XMLRLcolor] {\box\foundexternalfigure}}} \defineXMLsingular [rl:viewport] [\??cp] % [] {\global\setbox\foundexternalfigure\vbox {\expandXMLta \getXMLta \clip [\XMLta] {\box\foundexternalfigure}}% \global\setbox\foundexternalfigure\vbox {\scale [\c!width=\figurewidth,\c!height=\figureheight] {\box\foundexternalfigure}}} \defineXMLsingular [rl:dimensions] [width=,height=] {} \defineXMLsingular [rl:position] [offset=,width=,height=,hoffset=,voffset=] {} \appendtoks \doglobal\eraseXMLelement{rl:l:manipulation}% \doglobal\eraseXMLelement{rl:g:manipulation}% \to \figurebaseresets \appendtoks \startnointerference \processXMLelement{rl:l:manipulation}% \processXMLelement{rl:g:manipulation}% \stopnointerference \to \externalfigurepostprocessors \protect \doifnotmode{demo}{\endinput} \starttext \setupcolors[state=start] \usefigurebase[d-fig-01] \externalfigure[part of a dutch cow][width=3cm,frame=on] \externalfigure[a simple dutch cow][width=5cm,frame=on] \externalfigure[another simple dutch cow][width=5cm,frame=on] \stoptext