%D \module
%D   [       file=t-collatingmarks,
%D        version=2010.02.19,
%D          title=\CONTEXT\ User Module,
%D       subtitle=Environment for collating marks,
%D         author={W. Egger},
%D           date=\currentdate,
%D      copyright={W. Egger},
%D          email=w.egger@boede.nl,
%D        license=Public Domain]

% context --ctx=s-mod t-collatingmarks.tex 

%M \startmodule[collatingmarks]

%D \subject{Introduction} 
%D
%D This code is based on the work of Thomas A. Schmitz, who created the module for
%D different crop marks.
%D
%D If a book consists of multiple sections, each section should be marked
%D along the spine with a collating mark. This mark moves down along the spine
%D acoording to the number of the section. After collating the book it becomes
%D easy tho check whether the sequence of the sections is correct. One should
%D see a \quotation{stair case} on the spine of the book as shown in the following figure.

%D \startexample
%D \startuniqueMPgraphic{Collatingblocks}
%D  	numeric b,w,h;
%D 	b := \the\textwidth;
%D 	w := .75b;
%D 	h := .2b;
%D 	pair A,B;
%D 	path sq,p[],block[];
%D 	sq := unitsquare xscaled w yscaled h;
%D 	block[1] := unitsquare xscaled (.1w) yscaled (h/6);
%D 	block[1] := block[1] shifted (0.1w,h-h/6);
%D 	fill block[1];
%D 	label.bot(textext("\switchtobodyfont[6pt] \white\rotate[rotation=90]{1}"),center block[1] shifted (0,.5*h/12));
%D 	draw sq;
%D 	A := llcorner sq;
%D 	B := lrcorner sq;
%D 	p[1] := A--B;
%D 	for i = 1 upto 5 :
%D 		p[i+1] := p[1] shifted (0,h/6*i);
%D 	    draw p[i+1];
%D     endfor;
%D 	for i = 1 upto 5 :
%D 		block[i+1] := block[1] shifted (i*.1w, -i*h/6);
%D 		fill block[i+1];
%D 		numeric ii; 
%D 		ii := i+1;
%D 		label.bot(textext("\switchtobodyfont[6pt] \white\rotate[rotation=90]{"& decimal ii &"}"),
%D                center block[i+1] shifted (0,.5*h/12));
%D 	endfor;
%D \stopuniqueMPgraphic
%D \placefigure[middle,none][]{}{\useMPgraphic{Collatingblocks}}
%D \stopexample
%D
%D \subject{Using the module}
%D 
%D If the collating marks should be placed, then the system should be setup with
%D \starttyping
%D \usemodule[collatingmarks][Collatingmarks=yes]
%D \setupCollatingmarks
%D    [pages=8,
%D     sheets=2,
%D     horpageshift=0mm] 
%D \stoptyping
%D Note that the
%D collating marks-setup needs to know how many pages are placed on a
%D doublesided printed sheet of paper and how many such sheets result in a
%D section i.e. these values depend on the \type{\setuparranging} command.  The
%D shift-option is 0~mm if no horizontal page shifting is issued during
%D imposition.  If a horizontal page shifting is used, then the shift option is
%D used to position the collating mark precisely on the spine. 
%D
%D Be aware that the use of collating marks in MKII causes a lot of calls to 
%D \METAPOST, resulting in very long compilation times.
%D So better use MKIV where METAPOST\ is included as a
%D library. In this case the time overhead is absolutely minimal.
%D
%D \subject{Vocabulary}
%D
%D EN: Collating mark, DE: Kollationiermarke, NL: collationeerblokje

\writestatus{loading}{Context User Module / Collating Marks}

\unprotect

\setupmodule[Collatingmarks=yes]


\def\MCMpages{16}
\def\MCMsheets{1}
\def\MCMshift{0mm}

\def\setupCollatingmarks#1[#2]%
   {\getparameters[Collatingmarks][pages=16,sheets=1,shift=0mm,#2]}

\setupMPvariables
    [Collatingmarks]
    [pages=\MCMpages, %pages per sheet doublesided
	sheets=\MCMsheets,% number of sheets forming one section
	horpageshift=\MCMshift]

% We prepare collating marks:

\processaction[\currentmoduleparameter{Collatingmarks}]
	[yes=>\def\Collatingmarks{Collatingmarks},
	no=>\def\Collatingmarks{},
	\v!unknown=>\def\Collatingmarks{},
	\v!default=>\def\Collatingmarks{}]
	
\startusableMPgraphic{Collatingmarks}
StartPage;

numeric offset, sectionno, pages, sheets, factor, correction, offset, pageshift;
path p,q;

pages  := \MPvar{pages};
sheets := \MPvar{sheets};
pageshift:=\MPvar{horpageshift};

z5colm = ulcorner Page;
z6colm = (x5colm, y5colm-10mm);

p := unitsquare xscaled 1mm yscaled 7mm;

if \realfolio mod 2 = 1 : % on uneven pages only
		sectionno := \realfolio div (sheets*pages)+ 1;
		label.lrt(textext("\switchtobodyfont[5pt]"& decimal sectionno &""),llcorner Page shifted (1mm,-2mm));
	if \realfolio mod (sheets*pages) = 1 : % on the first page of a section only
		nofmarkings := (y6colm-7mm) div 7mm;
		offset := y6colm-sectionno*7mm;
		if sectionno > nofmarkings : 
			correction := sectionno div nofmarkings;
			offset := y6colm-(sectionno-correction*nofmarkings)*7mm; 
		fi;
		p := p shifted (-1mm-2pageshift,offset);
		fill p withcolor black;
		if sectionno < 9 : 
			label.rt(textext("\switchtobodyfont[3pt] \white "& decimal sectionno &""), center p shifted (-1.3mm,0));
		else :
			label.rt(textext("\switchtobodyfont[3pt] \white "& decimal sectionno &""), center p shifted (-1.5mm,0));
		fi;
	fi;
fi;
\stopusableMPgraphic

%D \subject{Implementation}
%D
%D Collating marks are calculated and drawn by \METAPOST. The result is
%D placed into an overlay which is used as a page background

%D \starttyping
%D \defineoverlay[Collatingmarks][\useMPgraphic{Collatingmarks}]
%D \stoptyping

\defineoverlay[Collatingmarks][\useMPgraphic{Collatingmarks}]

%D \starttyping
%D \setupbackgrounds[page][state=repeat,background={\Collatingmarks}]
%D \stoptyping

\setupbackgrounds[page][state=repeat,background={\Collatingmarks}]

% We let \METAPOST do the calculations and draw de collating marks.
\protect
\stopmodule

\doifnotmode{demo}{\endinput}



%D \subject{Example}
%D \starttyping
%D \usemodule[collatingmarks][Collatingmarks=yes]
%D \setuppapersize[A5][A2]
%D \setuplayout[location=middle,marking=on]
%D \setuppagenumbering[alternative=doublesided]
%D \setuparranging[2*4]
%D 
%D \setupCollatingmarks
%D 	[pages=8,  % pages per sheet of paper doublesided
%D 	sheets=1,  % sheets of paper used per section
%D 	horpageshift=0mm] % used for correction if horizontal page-shifting is used while imposition is active
%D \starttext
%D 	\dorecurse{10}{\section{Text \recurselevel}\input tufte \par\subject{Ward} \input ward\par}
%D \stoptext
%D \stoptyping


%\usemodule[collatingmarks][Collatingmarks=yes]
%\setuppapersize[A5][A2]
%\setuplayout[location=middle,marking=on]
%\setuppagenumbering[alternative=doublesided]
%\setuparranging[2*4]
%
%\setupCollatingmarks
%	[pages=8,  % pages per sheet of paper doublesided
%	sheets=1,  % sheets of paper used per section
%	horpageshift=0mm] % used for correction if horizontal page-shifting is used while imposition is active
%\starttext
%	\dorecurse{10}{\section{Text \recurselevel}\input tufte \par\subject{Ward} \input ward\par}
%\stoptext
