From 85b7bc695629926641c7cb752fd478adfdf374f3 Mon Sep 17 00:00:00 2001 From: Marius Date: Sun, 4 Jul 2010 15:32:09 +0300 Subject: stable 2010-05-24 13:10 --- tex/context/base/page-log.mkii | 202 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 tex/context/base/page-log.mkii (limited to 'tex/context/base/page-log.mkii') diff --git a/tex/context/base/page-log.mkii b/tex/context/base/page-log.mkii new file mode 100644 index 000000000..18c7991b1 --- /dev/null +++ b/tex/context/base/page-log.mkii @@ -0,0 +1,202 @@ +%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 / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{ConTeXt 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 -- cgit v1.2.3