From 1a56ef3e2b95395f22a9f0568ee20013aa4c193a Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Sat, 25 Sep 2010 12:45:45 +0200 Subject: [PATCH] Placement macros, output routine --- ucwmac.tex | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 3 deletions(-) diff --git a/ucwmac.tex b/ucwmac.tex index 4943c80..3bb1091 100644 --- a/ucwmac.tex +++ b/ucwmac.tex @@ -1,3 +1,16 @@ +% We'll use internal macros of plain TeX +\catcode`@=11 + +%%% PDF output switch %%% + +\newif\ifpdf +\pdffalse + +\ifx\pdfoutput\undefined +\else\ifnum\pdfoutput>0 + \pdftrue +\fi\fi + %%% Page size and margins %%% \newdimen\pagewidth @@ -6,6 +19,7 @@ \newdimen\rightmargin \newdimen\topmargin \newdimen\bottommargin +\newdimen\evenpageshift \def\setuppage{% \hsize=\pagewidth @@ -18,16 +32,18 @@ \advance\hoffset by -1truein \voffset=\topmargin \advance\voffset by -1truein - \ifx\pdfpagewidth\undefined\else + \ifpdf \pdfpagewidth=\pagewidth \pdfpageheight=\pageheight \fi } -\def\sethmargins#1{\leftmargin=#1\relax\rightmargin=#1\relax} +\def\sethmargins#1{\leftmargin=#1\relax\rightmargin=#1\relax\evenpageshift=0pt\relax} \def\setvmargins#1{\topmargin=#1\relax\bottommargin=#1\relax} \def\setmargins#1{\sethmargins{#1}\setvmargins{#1}} +\def\setinneroutermargin#1#2{\sethmargins{#1}{#2}\evenpageshift=\rightmargin\advance\evenpageshift by -\leftmargin} + \def\defpaper#1#2#3{\expandafter\def\csname paper-#1\endcsname{\pagewidth=#2\pageheight=#3\setuppage}} \def\setpaper#1{% \expandafter\let\expandafter\currentpaper\csname paper-#1\endcsname @@ -54,4 +70,60 @@ \setmargins{1truein} \setpaper{a4} -\bye +%%% Placing material at specified coordinates %%% + +% Set all dimensions of a given box register to zero +\def\smashbox#1{\ht#1=0pt \dp#1=0pt \wd#1=0pt} +\def\smashedhbox#1{{\setbox0=\hbox{#1}\smashbox0\box0}} +\def\smashedvbox#1{{\setbox0=\vbox{#1}\smashbox0\box0}} + +% Variants of \llap and \rlap working equally on both sides and/or vertically +\def\hlap#1{\hbox to 0pt{\hss #1\hss}} +\def\vlap#1{\vbox to 0pt{\vss #1\vss}} +\def\clap#1{\vlap{\hlap{#1}}} + +% \placeat{right}{down}{hmaterial} places , so that its +% reference point lies at the given position wrt. the current ref point +\long\def\placeat#1#2#3{\smashedhbox{\hskip #1\lower #2\hbox{#3}}} + +% Like \vbox, but with reference point in the upper left corner +\def\vhang#1{\vtop{\hrule height 0pt\relax #1}} + +% Like \vhang, but respecting interline skips +\def\vhanglines#1{\vtop{\hbox to 0pt{}#1}} + +% Crosshair with reference point in its center +\def\crosshair#1{\clap{\vrule height 0.2pt width #1}\clap{\vrule height #1 width 0.2pt}} + +%%% Output routine %%% + +\newbox\pageunderlays +\newbox\pageoverlays +\newbox\commonunderlays +\newbox\commonoverlays + +% Adding to {over,under}-lays +\def\addlay#1#2{\setbox#1=\vbox{\ifvbox#1\box#1\fi\smashedvbox{#2}}} +\def\pageunderlay{\addlay\pageunderlays} +\def\pageoverlay{\addlay\pageoverlays} +\def\commonunderlay{\addlay\commonoverlays} +\def\commonoverlay{\addlay\commonoverlays} + +\output{\ucwoutput} +\def\ucwoutput{\wigglepage\shipout\vbox{% + \makeheadline + \ifvbox\commonunderlays\copy\commonunderlays\nointerlineskip\fi + \ifvbox\pageunderlays\box\pageunderlays\nointerlineskip\fi + \pagebody + \ifvbox\commonoverlays\vbox to 0pt{\vskip -\vsize\copy\commonoverlays}\fi + \ifvbox\pageoverlays\vbox to 0pt{\vskip -\vsize\box\pageoverlays}\fi + \makefootline +}\advancepageno +\ifnum\outputpenalty>-\@MM \else\dosupereject\fi} + +\def\wigglepage{\ifodd\pageno\else\advance\hoffset by \evenpageshift\fi} + +%%% Cleanup %%% + +% Let's hide all internal macros +\catcode`@=12 -- 2.39.2