%D \module %D [ file=page-log, % moved here from main-001 %D version=1997.03.31, %D title=\CONTEXT\ Page Macros, %D subtitle=Logos, %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. \writestatus{loading}{ConTeXt Page Macros / Logos} \unprotect %D Although logos can conveniently be implemented on top of %D background and text areas, we provide a dedicated mechanism %D here. One reason is that such a separate mechanism cannot %D interfere with the other ones, but an even more important %D reason is that logos are kind of special in the sense that %D they have a short life span and may change after the first %D page. %D \macros %D {recalculatelogos,addlogobackground} %D %D The interface to the other low level page building routines %D is provided by a macro that signals changes in layout %D specifications: %D %D \starttyping %D \recalculatelogos %D \stoptyping %D %D as well as a simple placement macro: %D %D \starttyping %D \addlogobackground %D \stoptyping %D %D In no way the following boolean switch should be used %D directly. \newif\ifnewlogos \def\recalculatelogos {\global\newlogostrue} %D The current state of logos is registered in a status %D variable \type {\logostatus}. %D %D \starttabulate[|l|l|l|] %D \NC 0 \NC don't place \NC remains 0 \NC \NR %D \NC 1 \NC place now \NC remains 1 \NC \NR %D \NC 2 \NC calulate and place \NC becomes 1 \NC \NR %D \NC 3 \NC calculate and place once \NC becomes 2 \NC \NR %D \stoptabulate \chardef\logostatus=0 \def\addlogobackground#1% todo: dimension spec {\ifcase\logostatus \else \ifcase\logostatus % no logos to take care of \or % 1 \ifnewlogos \chardef\logostatus2 \setlogoboxes \chardef\logostatus1 \global\newlogosfalse \fi \or % 2 \setlogoboxes \chardef\logostatus1 \or % 3 \setlogoboxes \global\chardef\logostatus2 \fi \setbox#1\vbox {\offinterlineskip \doifmarginswapelse {\copy\leftlogos} {\copy\rightlogos} \box#1}% \fi} %D For efficiency reasons (and since logos seldom change inside %D a document) we can save the left and right hand (or first %D and following page) logos in boxes. The areas are slightly %D different from the ones used in backgrounds and text %D placement, but still related to the page layout. The {\em %D left} and {\em right edge}, as well as {\em top} and {\em %D bottom} touch the bounding box of the paper and are %D therefore not the sams as their background adn text %D counterparts. In addition there are {\em left}, {\em right} %D and {\em middle} areas as well as a {\em page} one. \newbox\leftlogos \newbox\rightlogos \def\setlogoboxes {\showmessage\m!layouts7\empty \dosetlogobox\leftlogos\relax \ifdoublesided \dosetlogobox\rightlogos\doswapmargins \fi} \def\dosetlogobox#1#2% {\global\setbox#1\vbox to \paperheight {\dontcomplain % needed here ? \calculatereducedvsizes % needed here ? \offinterlineskip #2\relax \vskip-\topspace \dodosetlogobox\v!top\blap \vskip\topspace \dodosetlogobox\v!header\blap \vskip\dimexpr\headerheight+\headerdistance\relax \dodosetlogobox\v!text\blap \vskip\dimexpr\textheight+\footerdistance+\footerheight\relax \dodosetlogobox\v!footer \tlap \vfilll \dodosetlogobox\v!bottom\tlap \vskip\topspace} \smashbox#1} \def\dodosetlogobox#1#2% {\hbox % width equals \makeupwidth {\def\docommand##1% {\donefalse \ifnum\logostatus=3 \ExpandBothAfter \doifinset{\getvalue{\??lo#1##1}}\requestedlogos\donetrue \else \doifvalue{\??lo#1##1\c!state}\v!start\donetrue \fi \ifdone #2{\hbox{\getvalue{\??lo#1##1\c!command}}}% \fi}% \def\dodocommand##1##2##3##4##5##6% {\hsmash {\hskip-\texthoffset \hbox to \paperwidth {\rlap{\docommand##1}\hss\llap{\docommand##6}}% \hskip-\paperwidth \hbox to \paperwidth {\hskip\texthoffset \hskip-\leftmarginwidth \hskip-\leftmargindistance \hbox to \leftmarginwidth{\docommand##2\hss}% \hskip\leftmargindistance \hbox to \makeupwidth{\docommand##3\hss\docommand##4}% \hskip\rightmargindistance \hbox to \rightmarginwidth{\hss\docommand##5}% \hfill}}}% \normalbaselines \settexthoffset \hsmash {\hbox to \makeupwidth{\hss\docommand\c!middle\hss}}% \hsmash {\hskip-\texthoffset \hbox to \paperwidth{\docommand\v!page\hss}}% \swapmargins \doifbothsidesoverruled {\dodocommand \v!leftedge \v!leftmargin \v!left \v!right \v!rightmargin \v!rightedge} {\dodocommand \v!leftedge \v!leftmargin \v!left \v!right \v!rightmargin \v!rightedge} {\dodocommand \v!rightedge \v!rightmargin \v!right \v!left \v!leftmargin \v!leftedge}}} %D The user interface is relatively simple and provides %D macros for assigning logos to logo areas as well as %D forcing placement. %D %D \showsetup{definelogo} %D \showsetup{placelogos} \let\definedlogos \empty \let\requestedlogos\empty \long\def\dodefinelogo[#1][#2][#3][#4]% {\addtocommalist{#1}\definedlogos \long\setvalue{\??lo#2#3}{#1}% \getparameters[\??lo#2#3][#4]% \global\chardef\logostatus2 } \def\definelogo {\doquadrupleargument\dodefinelogo} \def\placelogos {\dosingleempty\doplacelogos} \def\doplacelogos[#1]% {\xdef\requestedlogos{\iffirstargument#1\else\definedlogos\fi}% \global\chardef\logostatus3 } \protect \endinput