%---------------------------------------------------------------------- % % % This does the following: % - sets up the document/pdf for viewing as a book % - adds support for page bleeds % - adds basic templates for image pages (XXX) % %---------------------------------------------------------------------- \NeedsTeXFormat{LaTeX2e} % XXX set release date... \ProvidesClass{photobook}[2021/07/28 Photo book Latex class] % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \RequirePackage{calc} \RequirePackage{iftex} \RequirePackage{kvoptions} \RequirePackage{etoolbox} \RequirePackage{atbegshi} \RequirePackage[unicode]{hyperref} \RequirePackage{graphicx} \RequirePackage{geometry} % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % options... % % XXX handle options: % - image block (w, h) % ...should this be a global setting or a template thing??? % pdf layout... % see: hyperref's pdfpagelayout for more options... \DeclareStringOption[TwoPageRight]{pdfpagelayout} % page geometry... % % <---> bindingoffset % <---> bleed <---> innerbleed % % +-----------------------------------------------+ ^ % | | | | bleed % | +-----------------------------------+ | | v % | | ^ | | | % | | | | | | % | |<-- pagewidth -------------------->| | | % | | | | | | % | | | | | | % | | | | | | % | | pageheight | | | % | | | | | | % | | | | | | % | | | | | | % | | v | | | % | +-----------------------------------+ | | % | | | % +-----------------------------------------------+ % \DeclareStringOption[5mm]{bleed} \DeclareStringOption{innerbleed} \DeclareStringOption{pagewidth} \DeclareStringOption{pageheight} \DeclareStringOption[0]{bindingoffset} \DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{book}} \ProcessKeyvalOptions* \LoadClass[9pt, final, openany]{book} %---------------------------------------------------------------------- % Commands... \newcommand\Keywords[1]{% \def\@keywords{#1}} \newcommand\Subject[1]{% \def\@subject{#1}} \newcommand\RecalculatePageLengths{ % final page size... \setlength\pagewidth{ \ifx\photobook@pagewidth\empty \dimexpr \paperwidth - \bleed - \innerbleed \relax \else \photobook@pagewidth \fi} \setlength\pageheight{ \ifx\photobook@pageheight\empty \dimexpr \paperheight - 2\bleed \relax \else \photobook@pageheight \fi } % page with bleeds... % NOTE: this is essentially \paperwidth and \paperheight but we do % not rely on them being defined -- photobook settings take % priority over \paperwidth and \paperwidth... \setlength\bleedblockwidth{\dimexpr \bleed + \pagewidth + \innerbleed \relax} \setlength\bleedblockheight{\dimexpr 2\bleed + \pageheight \relax} } %---------------------------------------------------------------------- % Globals... \newlength\pagewidth \newlength\pageheight % NOTE: these are equivalent to \paperwidth and \paperheight but are % independent of them... \newlength\bleedblockwidth \newlength\bleedblockheight \newlength\bleed \setlength\bleed{\photobook@bleed} \newlength\innerbleed \setlength\innerbleed{ \ifx\photobook@innerbleed\empty \bleed \else \photobook@innerbleed \fi } \newlength\bindingoffset \setlength\bindingoffset{\photobook@bindingoffset} % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % update global values... \RecalculatePageLengths %---------------------------------------------------------------------- \AtEndPreamble{ % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % pdf metadata... \hypersetup{ pdfinfo={ Title={\@title}, Subject={\@subject}, Author={\@author}, Keywords={\@keywords}, }, pdfpagelayout=\photobook@pdfpagelayout, } % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % Geometry... \RecalculatePageLengths \geometry{ % paper size (incl. bleeds)... paperwidth=\bleedblockwidth, paperheight=\bleedblockheight, % include header/footer/margin notes in printed area twoside, includeall, nomarginpar, ignorehead=false, ignorefoot=false, ignoremp=false, % center printed area on page vcentering, hcentering, bindingoffset=\bindingoffset} % - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - % pdf boxes... % calculate pdf box dimensions in pt... % XXX should these be local or global??? \edef\@pdfWidthPt{\strip@pt\dimexpr 0.996264009963\bleedblockwidth \relax} \edef\@pdfHeightPt{\strip@pt\dimexpr 0.996264009963\bleedblockheight \relax} \edef\@pdfBleedPt{\strip@pt\dimexpr 0.996264009963\bleed \relax} \edef\@pdfTopPt{\strip@pt\dimexpr 0.996264009963\dimexpr \bleedblockheight - \bleed \relax \relax} \edef\@pdfRightPt{\strip@pt\dimexpr 0.996264009963\dimexpr \bleedblockwidth - \bleed \relax \relax} % set the boxes... \ifxetex % XXX not tested... \AtBeginShipout{\AtBeginShipoutAddToBox{ \special{pdf:put @thispage << /MediaBox [0 0 \@pdfWidthPt\space \@pdfHeightPt] /BleedBox [0 0 \@pdfWidthPt\space \@pdfHeightPt] /ArtBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] /TrimBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] /CropBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] >>} }} \else \edef\pdfboxes{ /MediaBox [0 0 \@pdfWidthPt\space \@pdfHeightPt] /BleedBox [0 0 \@pdfWidthPt\space \@pdfHeightPt] /ArtBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] /TrimBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] /CropBox [\@pdfBleedPt\space \@pdfBleedPt\space \@pdfRightPt\space \@pdfTopPt] } \expandafter\pdfpageattr\expandafter{\pdfboxes} \fi } % \AtEndPreamble{..} %---------------------------------------------------------------------- % vim:set ts=4 sw=4 :