diff options
author | Karl Berry <karl@freefriends.org> | 2022-09-15 19:57:32 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-09-15 19:57:32 +0000 |
commit | 6503d03131756a0765a9692154b21c653999843c (patch) | |
tree | ce2a1faaf3c1391822c7ccba131161a8e65b138a /Master/texmf-dist/tex/latex/photobook | |
parent | 2f171f66d3660315ddaddd35547b2eff715bd6c8 (diff) |
photobook (15sep22)
git-svn-id: svn://tug.org/texlive/trunk@64404 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/photobook')
-rw-r--r-- | Master/texmf-dist/tex/latex/photobook/photobook.cls | 5058 |
1 files changed, 5058 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/photobook/photobook.cls b/Master/texmf-dist/tex/latex/photobook/photobook.cls new file mode 100644 index 00000000000..c4f2d56c050 --- /dev/null +++ b/Master/texmf-dist/tex/latex/photobook/photobook.cls @@ -0,0 +1,5058 @@ +%---------------------------------------------------------------------- +% +% +% 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 +% +% +% This file contains both the code and the reference, but in a slightly +% more readable format than the traditional LaTeX .dtx format. In general +% there are two main sections: +% - code +% - reference +% lines starting with "%%" or "%X" where X is a section id +% Sections are parts of the reference that are logically ordered differently +% than the code, e.g. main user tools should have priority in the reference +% while meta code (identified by "%M") can be described later, while in code +% we strictly need to define macros before they are used thus meta-macros +% and other building blocks and components come before the user tools. +% +% Docs are build by the Makefile, so reference it for more info. +% +% $ make doc +% +% +% NOTE: in a stripped code install this file may contain only code and +% code comments, in this case, to see the docs refer to either the +% source or the actual documentation/pdf. +% NOTE: the stripped code file is auto-generated, it is not recommended +% to edit it directly, edit the source instead. +% +% +% XXX Q: do we add the pdf to the repo and if so, should it be +% compressed (diff-able) or uncompressed (blob)?? +% XXX revise \clearcaption / \captionclearpage... +% XXX unify API -- see CellContent env... +% XXX make this loadable both as a class and as a package... +% \@ifclassloaded{photobook}{<true>}{<false>} +% XXX revise command naming -- should be obvious from name what is what: +% - meta commands -- ??? (currently same as templates) +% - general macros -- \usecell{..} +% - templates -- \ImagePage{..} +% XXX see where we need to \ignorespaces... +% XXX might be a good idea to add a spine calculator... +% XXX add list of dependencies to docs... +% XXX manual / book: +% - basic usage +% - setup +% - templates (copyright, front matter, back matter, acknowledgements, ...) +% - using templates +% - pre-print +% - customizing +% - extending +% +% +%---------------------------------------------------------------------- + +%%% NOTE: \def\<module-name>@[A-Z]+ macros will be visible to both the +%%% code and the generated docs... +\edef\photobook@FILEVERSION{v0.1} +\edef\photobook@FILEDATE{2021-07-28} + + +%% \documentclass{ltxdoc} +%% +%%% \usepackage{iftex} +%%% \ifluatex +%%% \edef\pdfcompresslevel{\pdfvariable compresslevel} +%%% \edef\pdfobjcompresslevel{\pdfvariable objcompresslevel} +%%% \fi +%%% \pdfcompresslevel 0 +%%% \pdfobjcompresslevel 0 +%% +%% \usepackage[a4paper,margin=25mm,left=55mm,nohead]{geometry} +%% +%% % NOTE: this needs to load before hyperref or bookmarks will break... +%% % NOTE: loading hyperref here will break it loading later in one of +%% % the packages... +%% \usepackage{titlesec} +%% +%% \usepackage[numbered]{hypdoc} +%% \usepackage{doctools} +%% \usepackage{needspace} +%% +%% \usepackage[toc]{multitoc} +%% \renewcommand*{\multicolumntoc}{2} +%% \setlength{\columnseprule}{0.5pt} +%% +%% \usepackage{imakeidx} +%% \makeindex[ +%% columns=1, +%% title=Alphabetical Index, +%% intoc, +%% options= -s photobook.ist ] +%% +%%% \newcommand\DescribeGlobal[1]{% +%%% \DescribeMacro{#1}} +%% +%% \newcommand\LEGACY[1][]{\fbox{LEGACY #1}} +%% \newcommand\EXPERIMENTAL[1][]{\fbox{EXPERIMENTAL #1}} +%% +%%% sections to new pages... +%% \newcommand\sectionbreak{\Needspace{5\baselineskip}} +%% +%% % remove section numbering... +%% \setcounter{secnumdepth}{0} +%% +%% % paragraph configuration... +%% \setlength\parindent{0pt} +%% \setlength\parskip{0.5em} +%% +%% \newcommand\blankfootnote[1]{% +%% \begingroup +%% \renewcommand\thefootnote{}% +%% \footnote{#1}% +%% \addtocounter{footnote}{-1}% +%% \endgroup} +%% +%% +%% \begin{document} +%% +%% \title{\textsf{photobook} --- Document class for building photo-books +%% \thanks{This file describes version \FILEVERSION, +%% last revised \FILEDATE.}} +%% +%% \author{Alex A. Naanou\thanks{E-mail: alex.nanou@gmail.com}} +%% +%% \date{Released \FILEDATE} +%% +%% +%% \maketitle +%% +%% \begin{abstract} +%% The |photobook| \LaTeX\space document class extends the |book| class +%% defining a set of parameters, meta-macros, macros and environments +%% with reasonable defaults to help typeset, build and print books mainly +%% based on visual/image content. +%% \end{abstract} +%% +%% \tableofcontents +%% +% +%%%% Introduction +% +%% \LaTeX\ is great with textual and text-primary content with figures +%% peppered in, as long as pictures/figures flow within, with or as part +%% of text, vanilla \LaTeX\ is fantastic. +%% +%% One can relatively easily stretch the flow concept to more complex +%% layouts introducing {\it even} and {\it odd} pages (the |book| class is +%% one example) and flow rules based on them, but the next step, {\it bleeds}, +%% combining page pairs into {\it spreads} as is often needed when designing +%% image-oriented books is lacking. Full-bleed images/pages can be implemented +%% manually, some more effort is needed to split something horizontally +%% into a page spread, but doing so for whole book's worth of content is +%% not practical -- automating and experimenting with this process is +%% how |photobook| began. +%% +%% |photobook| extends the |book| class adding page layout types, bleeds +%% and other global geometry configuration, introduces the {\it page} and +%% {\it spread} as first-class elements into the document flow. These concepts +%% are generalized as |cell|s. A |cell| is similar to a figure, it can +%% be placed within the document flow, but unlike a figure a |cell| can +%% be aligned relative to a page, it can fill a page, a cell can even be +%% horizontally split to fill several pages (how spreads are implemented). +%% +%% On top of the |cell|, {\it page}, and {\it spread} concepts, |photobook| +%% also builds a set of configurable high level macros and templates for +%% common use cases like full bleed image spreads, foldouts, ... etc. +% +% +%%%% Usage +% +%% >> \documentclass[<options>]{photobook} +%% +% +%---------------------------------------------------------------------- + +\NeedsTeXFormat{LaTeX2e} + +\ProvidesClass{photobook} + [\photobook@FILEDATE \space \photobook@FILEVERSION Photo book document class] + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%% Options +%% + +\edef\photobook@options{\@classoptionslist} + +\RequirePackage{kvoptions} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Helpers... + +\newcommand\@DeclareLiteralOptionTo[2]{% + \DeclareVoidOption{#2}{% + \expandafter\edef\csname photobook@#1\endcsname{#2}}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Page geometry +% +%% \DescribeMacro{blockwidth=<len>} +%% \DescribeMacro{blockheight=<len>} +%% \DescribeMacro{bindingoffset=<len>} +%% \DescribeMacro{bleed=<len>} +% +%% This is similar to what |geometry| does, but adds bleed support. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <---> bleed <---> bleed +%% +%% + - - - - - - - - - - - - - - - - - - - - - + - + ^ +%% . . . | bleed +%% . +---------------------------------------+----- v . . --- +%% . | ^ . = . +%% . | . . . . . . | . . = . ^ +%% . |<-- blockwidth ----------------------->= . | +%% . | . | . . = . | +%% . | | . = . textheight +%% . | . Page | . . = . | +%% . | blockheight . = . | +%% . | . | . . = . | +%% . | | <---> bindingoffset | +%% . | . . . . . . | . . = . v +%% . | v . = . +%% . +---------------------------------------+----- ^ . . --- +%% . . . . | bleed +%% + - - - - - - - - - - - - - - - - - - - - - + - + v +%% . . +%% | <-- textwidth --------------> . | +%% ^ binding line +%% +%% \end{verbatim} +%% \end{minipage} +%% +% NOTE: if blockwidth/blockheight are set they will force recalculations +% and overriding of the paperwidth/paperheight if they were changed +% by the user code anywhere between \documentclass[..]{photobook} +% and \begin{document}... +\DeclareStringOption{blockwidth} +\DeclareStringOption{blockheight} +\DeclareStringOption[0pt]{bindingoffset}[10mm] +\DeclareStringOption[5mm]{bleed}[5mm] + +%% \DescribeMacro{flatfold=<len>} +% +%% Sets the clearance set aside for a flat fold, used for foldouts +%% (see: \nameref{subsec:Foldout page cells} section). +%% +\DeclareStringOption[0pt]{flatfold}[0.2mm] + +%% \DescribeMacro{pagefold=<fold>} +% +%% Sets the default fold type. +%% +%% Can be |in| or |out|. +%% +% XXX check values... +\DeclareStringOption{pagefold} + +%% \DescribeMacro{foldout=<fold-spec>} +% +%% Sets the default fold specification (i.e. sets |\defaultfoldout|). +%% +%% For more information see: \nameref{subsec:Foldout page cells} section. +%% +\DeclareStringOption[2]{foldout}[2] + + + +%%%%% layout +% +%% \DescribeMacro{layoutmode=<layout>} +%% \DescribeMacro{block} +%% \DescribeMacro{endpaper} +%% \DescribeMacro{cover} +%% \DescribeMacro{jacket} +% +%% Sat page layout mode. +% +%% >> layoutmode=<option> +%% +%% |block| (default) +%% +%% Basic page layout. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% blockwidth +%% <---------------> +%% +%% +---------------+ +%% | | +%% | | +%% | page | +%% | | +%% | | +%% +---------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% +%% |endpaper|: +%% +%% Endpaper layout. +%% +% XXX should this use \flatfold??? +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% blockwidth 2x +%% <-------------------------------> +%% +%% +---------------+---------------+ +%% | . | +%% | . | +%% | endpaper | +%% | . | +%% | . | +%% +---------------+---------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% +%% |cover| +%% +%% Book cover layout +%% +%% \DescribeMacro{coverboardgrow=<len>} +%% \DescribeMacro{coverflap=<len>} +%% \DescribeMacro{spinewidth=<len>} +%% \DescribeMacro{spinewidth=<len>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% blockwidth blockwidth +%% <---------------> <---------------> +%% <-> coverboardgrow <-> coverboardgrow +%% <-> coverflap . <-> coverflap +%% . . . . . . +%% +-------------------++---++-------------------+ --- +%% | + - - - - - - - - ++ - ++ - - - - - - - - + | --^ coverflap +%% | . + - - - - - - - ++ - ++ - - - - - - - + . | --^ coverboardgrow +%% | . . .. .. . . | ^ +%% | . . .. .. . . | | blockheight +%% | . . Back .. .. Front . . | | +%% | . . .. .. . . | | +%% | . . .. .. . . | v +%% | . + - - - - - - - ++ - ++ - - - - - - - + . | --v coverboardgrow +%% | + - - - - - - - - ++ - ++ - - - - - - - - + | --v coverflap +%% +-------------------++---++-------------------+ --- +%% . . +%% ^. .^ spinefold +%% . . +%% <---> spinewidth +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% +%% |jacket| +%% +%% Dust jacket layout +%% +%% \DescribeMacro{jacketwrap=<len>} +%% \DescribeMacro{jacketflap=<len>} +%% \DescribeMacro{jacketflapfront=<len>} +%% \DescribeMacro{jacketflapback=<len>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <---> jaketflap/jacketflapback <---> jaketflap/jacketflapfront +%% . . . . +%% . . blockwidth blockwidth . . +%% . . <---------------> <---------------> . . +%% . .<-> coverboardgrow <-> coverboardgrow +%% . . . . . . +%% +---++-----------------++---++-----------------++---+ --- +%% | .. + - - - - - - - ++ - ++ - - - - - - - + .. | --^ coverboardgrow +%% | .. . .. .. . .. | ^ +%% | .. . .. .. . .. | | blockheight +%% | .. . Back .. .. Front . .. | | +%% | .. . .. .. . .. | | +%% | .. . .. .. . .. | v +%% | .. + - - - - - - - ++ - ++ - - - - - - - + .. | --v coverboardgrow +%% +---++-----------------++---++-----------------++---+ --- +%% .. . . .. +%% ^ jacketwrap . . ^ jacketwrap +%% ^. .^ spinefold +%% . . +%% <---> spinewidth +%% +%% \end{verbatim} +%% \end{minipage} +%% +% +% XXX in cover layout setup pdf boxes in a way to use \bleed as foldover... +% ...see hyperref docs to set pdf view/print area (???) +% .....should also set \bleed default to something like 17mm +% XXX do we need to implement cover fold over??? +% XXX fold/cut marks??? +\DeclareStringOption[block]{layoutmode}[block] +\@DeclareLiteralOptionTo{layoutmode}{block} +%\@DeclareLiteralOptionTo{layoutmode}{web} +\@DeclareLiteralOptionTo{layoutmode}{endpaper} +% XXX add overhang... +% XXX minght be a good idea to add cover types as separate values and +% preset defeaults per type, e.g: +% layoutmode= hardcover softcover +% should also set: +% spinefold= 5mm 5mm +% coverflap= 17mm 0mm +% bleed= 0mm 5mm +\@DeclareLiteralOptionTo{layoutmode}{cover} +%\@DeclareLiteralOptionTo{layoutmode}{hardcover} +%\@DeclareLiteralOptionTo{layoutmode}{softcover} +\@DeclareLiteralOptionTo{layoutmode}{jacket} + + +% NOTE: this is only used when layoutmode=cover +% NOTE: these are documented inline with layoutmode=.. docs... +\DeclareStringOption[0pt]{spinewidth}[0pt] +\DeclareStringOption[0pt]{spinefold}[7mm] +\DeclareStringOption[0pt]{coverboardgrow}[3mm] +\DeclareStringOption[0pt]{coverflap}[17mm] +\DeclareStringOption[0pt]{jacketwrap}[2mm] +\DeclareStringOption[0pt]{jacketflap}[50mm] +\DeclareStringOption[0pt]{jacketflapfront}[50mm] +\DeclareStringOption[0pt]{jacketflapback}[50mm] + + + +%%%%% Image clearance +% +%% \DescribeMacro{clearimage=<len>} +% +%% Distance from image to paper border (clearance) for full-page images. +%% +%% this can be: +%% - negative value set image bleed, +%% - positive value set distance from paper edge to image. +%% +\DeclareStringOption{clearimage}[10mm] + + +%%%%% Image block layout +% +%% \DescribeMacro{imageblockwidth=<len>} +%% \DescribeMacro{imageblockheight=<len>} +%% \DescribeMacro{imageblockoffsettop=<len>} +% +%% Image block size relative to text block. +%% +\DeclareStringOption[0.85]{imageblockwidth}[1] +\DeclareStringOption[0.85]{imageblockheight}[1] +\DeclareStringOption[-0.05]{imageblockoffsettop}[0] + +%%%%% PDF Viewer layout +% +%% \DescribeMacro{pdfpagelayout=<mode>} +%% \DescribeMacro{SinglePage} +%% \DescribeMacro{OneColumn} +%% \DescribeMacro{TwoColumnLeft} +%% \DescribeMacro{TwoColumnRight} +%% \DescribeMacro{TwoPageLeft} +%% \DescribeMacro{TwoPageRight} +% +%% Sets PDF page display mode. +%% +%% Defaults to |TwoColumnLeft| for |layoutmode=block| and |SinglePage| for +%% other modes. +%% +%% See: +%% \href{https://ctan.altspu.ru/macros/latex/contrib/hyperref/doc/hyperref-doc.pdf}{hyperref}'s +%% |pdfpagelayout| for more options. +%% +\DeclareStringOption{pdfpagelayout} +\@DeclareLiteralOptionTo{pdfpagelayout}{SinglePage} +\@DeclareLiteralOptionTo{pdfpagelayout}{OneColumn} +\@DeclareLiteralOptionTo{pdfpagelayout}{TwoColumnRight} +\@DeclareLiteralOptionTo{pdfpagelayout}{TwoColumnLeft} +\@DeclareLiteralOptionTo{pdfpagelayout}{TwoPageRight} +\@DeclareLiteralOptionTo{pdfpagelayout}{TwoPageLeft} + + +%%%%% Other options +% +%% \DescribeMacro{nofoldmarks} +% +%% If given disable fold marks. +%% +%% This sets |\iffoldmarks| to false, otherwise it is set to true. +%% +\DeclareBoolOption{nofoldmarks} + +%% \DescribeMacro{foldmarksize=<len>} +% +%% Sets the fold mark size (default: 6mm). +%% +\DeclareStringOption[6mm]{foldmarksize} + +%% \DescribeMacro{geometrynodefaults} +% +%% let the user set geometry defaults. +%% +%% If this is not set |photobook| will override some user settings when +%% initializing geometry. +%% +%% If set |photobook| will only set override: +%% \begin{verbatim} +%% paperwidth=\bleedblockwidth +%% paperheight=\bleedblockheight +%% bindingoffset=\bindingoffset +%% \end{verbatim} +%% +\DeclareBoolOption{geometrynodefaults} + +%% \DescribeMacro{roundprintedlengthsto=<num>} +% +%% Number of digits to round printed lengths to (default: 1). +%% +%% This is a shorthand to |numprint|'s |\nprounddigits{..}|, us it to +%% change values mid-document if needed. +%% +%% This is mostly used for |\GenerateTemplate|. +%% +\DeclareStringOption[1]{roundprintedlengthsto}[1] + + +\DeclareDefaultOption{\PassOptionsToClass{\CurrentOption}{book}} +\ProcessKeyvalOptions* + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Parent class... +% +\LoadClass[9pt, final, openany]{book} + + + +%---------------------------------------------------------------------- +% Packages... +% +% NOTE: imports are after \LoadClass{ .. } to avoid figting over macro +% names... + +\RequirePackage{calc} +\RequirePackage{xargs} +\RequirePackage{ifthen} +\RequirePackage{iftex} +\RequirePackage{pgffor} +\RequirePackage{xint} +\RequirePackage{xinttools} +\RequirePackage{listofitems} +\RequirePackage{xkeyval} +\RequirePackage{etoolbox} +\RequirePackage{atbegshi} +%\RequirePackage{afterpage} +%\RequirePackage{changepage} +\RequirePackage[unicode]{hyperref} +%\RequirePackage{pdfcomment} +\RequirePackage{eso-pic} +\RequirePackage{environ} +\RequirePackage{numprint} +\RequirePackage{trimclip} +\RequirePackage{xcolor} +\RequirePackage{colorspace} +\RequirePackage{graphicx} +\RequirePackage{adjustbox} +\RequirePackage[absolute]{textpos} +\RequirePackage{fancyvrb} +\RequirePackage{tikz} +%\RequirePackage[linewidth=1pt]{mdframed} +% XXX flow text frames... +% XXX this messes with geometry.... +%\RequirePackage{flowfram} +\RequirePackage{rotating} +\RequirePackage{fancyhdr} +\RequirePackage{pdfpages} + + + +%---------------------------------------------------------------------- +%%%% Globals +% XXX move these out to relevant sections + add a separate globals glossary... +% +% NOTE: most of these are setup in \InitPages... + +%%% \DescribeGlobal{layoutmode} +%% \DescribeMacro{\layoutmode=<mode>} +% +%% Layout mode +%% +\edef\layoutmode{\photobook@layoutmode} + +% layout mode tests... +\newif\ifcoverlayout +\newif\ifhardcoverlayout +\newif\ifsoftcoverlayout +\newif\ifendpaperlayout +\newif\ifjacketlayout +% aggregates... +\newif\ifcoverlikelayout +\newif\ifblocklayout + +%% \DescribeMacro{\pdfpagelayout=<mode>} +% +%% Controls the default layout in the pdf viewer. +%% +\edef\pdfpagelayout{\photobook@pdfpagelayout} + +%% \DescribeMacro{\spinewidth=<len>} +% +%% Spine width +%% +\newlength\spinewidth +\setlength\spinewidth{\photobook@spinewidth} + +%% \DescribeMacro{\spinefold=<len>} +% +%% Spine fold width +%% +\newlength\spinefold +\setlength\spinefold{\photobook@spinefold} + +%% \DescribeMacro{\coverboardgrow=<len>} +% +%% Controls how much biger the cover board is than the page block +%% +\newlength\coverboardgrow +\setlength\coverboardgrow{\photobook@coverboardgrow} + +%% \DescribeMacro{\coverflap=<len>} +% +%% Cover flap +%% +\newlength\coverflap + +%% \DescribeMacro{\jacketwrap=<len>} +%% \DescribeMacro{\jacketflap=<len>} +%% \DescribeMacro{\jacketflapfront=<len>} +%% \DescribeMacro{\jacketflapback=<len>} +% +%% Jacker configuration +%% +\newlength\jacketwrap +\newlength\jacketflap +\newlength\jacketflapfront +\newlength\jacketflapback + +%% \DescribeMacro{\blockwidth=<len>} +%% \DescribeMacro{\blockheight=<len>} +% +%% Page block size +%% +% NOTE: page and bleed block sizes are set via \InitPages +\newlength\blockwidth +\newlength\blockheight + +%% \DescribeMacro{\bleedblockwidth=<len>} +%% \DescribeMacro{\bleedblockheight=<len>} +% +%% Page block size with bleeds +%% +%% These are equivalent to |\paperwidth| and |\paperheight| but are +%% independent of them... +%% +\newlength\bleedblockwidth +\newlength\bleedblockheight + +%% \DescribeMacro{\pageblockwidth=<len>} +%% \DescribeMacro{\pageblockheight=<len>} +% +%% Original page block size +%% +%% for the block layout these are the same as |\blockwidth| and |\blockheight| +%% for other layouts these are the original page layout size while the +%% |\blockwidth| are set tho the current layout visible size. +%% +\newlength\pageblockwidth +\newlength\pageblockheight + +%% \DescribeMacro{\bleed=<len>} +% +%% Page bleed size +%% +\newlength\bleed +\setlength\bleed{\photobook@bleed} + +%% \DescribeMacro{\bindingoffset=<len>} +% +%% Binding offset +%% +\newlength\bindingoffset +\setlength\bindingoffset{\photobook@bindingoffset} + +%% \DescribeMacro{\defaultfoldout=<fold-spec>} +% +%% Set the default fold specification. +%% +%% This can be set via the |foldout| class option. +%% +%% For more information see: \nameref{subsec:Foldout page cells} section. +%% +\edef\defaultfoldout{\photobook@foldout} + +%% \DescribeMacro{\flatfold=<len>} +% +%% Sets the amount of paper to account for a flat fold. +%% +\newlength\flatfold +\setlength\flatfold{\photobook@flatfold} + +%% \DescribeMacro{\pagefold=<fold>} +% +%% Default fold type. +%% +%% This defaults to |out| for |jacket| and |cover| and to |in| for other +%% layouts. +%% +\newcommand\photobook@setpagefold[1]{% + \edef\pagefold{ + \ifx \photobook@pagefold \empty% + #1% + \else% + \photobook@pagefold\fi}} +\photobook@setpagefold{in} + +%% \DescribeMacro{\foldmarkoffset=<len>} +% +%% Sets the offset of fold marks from outside of page edge (default: |0.5\bleed|). +%% +%% Note that this can either be a command or a dimension. +%% +%\def\foldmarkoffset{0.5\bleed} +\def\foldmarkoffset{2mm} + +%% \DescribeMacro{\foldmarksize=<len>} +% +%% Sets fold marker size (vertical). +%% +\newlength\photobook@foldmarklen +\setlength\photobook@foldmarklen{\photobook@foldmarksize} + +%% \DescribeMacro{\iffoldmarks} +% +%% Disable/enable fold marks. +%% +%% The default is true, to toggle on/off use |\foldmarkstrue| / |\foldmarksfalse|. +%% +%% This can be set globally via the |nofoldmarks| class option. +%% +\newif\iffoldmarks +\ifphotobook@nofoldmarks% + \foldmarksfalse% +\else% + \foldmarkstrue\fi% + +%% \DescribeMacro{\clearimage=<len>} +% +%% Image clearance +%% +% NOTE: since this can be any number but we need to detect if it was set +% manually we'll set it to \maxdimen and hope noe will print +% something big enough and dare to use it as image clearance... +\newlength{\clearimage} +\setlength\clearimage{\maxdimen} + +%% \DescribeMacro{\imageblockwidth=<ratio>} +%% \DescribeMacro{\imageblockheight=<ratio>} +% +%% Image block width relative to |\textwidth| +%% +\edef\imageblockwidth{\photobook@imageblockwidth} +\edef\imageblockheight{\photobook@imageblockheight} + +%% \DescribeMacro{\pagetextwidth=<len>} +%% \DescribeMacro{\pagetextheight=<len>} +% +%% Root page text width/height. +%% +\newlength\pagetextwidth +\setlength\pagetextwidth{\textwidth} +\newlength\pagetextheight +\setlength\pagetextheight{\textheight} + +%% \DescribeMacro{\imageblockoffsettop=<ratio>} +% +%% The ration by which the image is raised in |\ImagePage{..}| and +%% derived templates. +%% +\edef\imageblockoffsettop{\photobook@imageblockoffsettop} + +%% \DescribeMacro{\clearcaption=<len>} +% +%% Block caption clearance from edge of parent cell. +%% +%% Used as default by |\captionblockcell{..}| +%% +% XXX do we need this??? +\newlength\clearcaption +\setlength\clearcaption{0pt} + +%% \DescribeMacro{\captioncellspacing=<len>} +% +%% Block caption spacing from parent cell. +%% +%% Used as default by |\captionblockcell{..}| +%% +% XXX should this be used in other caption cells??? +\newlength\captioncellspacing +\setlength\captioncellspacing{5pt} + + +%% \DescribeMacro{\captionclearpage=<len>} +% +%% The distance between a caption block on a template page and page +%% borders (defaults to: |\clearimage|). +%% +%% This is relevant only in page/spread templates. +%% +\def\captionclearpage{\clearimage} + + +%% \DescribeMacro{\cellparentwidth=<len>} +%% \DescribeMacro{\cellparentheight=<len>} +%% \DescribeMacro{\cellwidth=<len>} +%% \DescribeMacro{\cellheight=<len>} +%% \DescribeMacro{\celloffsetleft=<len>} +%% \DescribeMacro{\celloffsettop=<len>} +%% \DescribeMacro{\clearance=<len>} +% +%% Cell geometry. +%% +%% These are set automatically by cells, thus it is not recommended to +%% edit them manually. +%% +%% For more details see the \nameref{subsec:Cells} section. +%% +\newlength\cellparentwidth +\setlength\cellparentwidth{\paperwidth} +\newlength\cellparentheight +\setlength\cellparentheight{\paperheight} +\newlength\cellwidth +\setlength\cellwidth{\cellparentwidth} +\newlength\cellheight +\setlength\cellheight{\cellparentheight} +\newlength\celloffsetleft +\setlength\celloffsetleft{0pt} +\newlength\celloffsettop +\setlength\celloffsettop{0pt} +\newlength\clearance +\setlength\clearance{0pt} + + +%% \DescribeMacro{\clearfoldoutbinding=<len>} +%% \DescribeMacro{\clearfoldoutfold=<len>} +%% \DescribeMacro{\clearfoldoutedge=<len>} +% +%% Foldout geometry. +%% +%% For more info see \nameref{subsec:Foldout page cells} section. +%% +\newlength\clearfoldoutbinding +\setlength\clearfoldoutbinding{8mm} +\newlength\clearfoldoutfold +\setlength\clearfoldoutfold{5mm} +\newlength\clearfoldoutedge +\setlength\clearfoldoutedge{1mm} + + + +%---------------------------------------------------------------------- +%%%% Initialization +%% +%% \DescribeMacro{\InitPages} +% +%% Initialize page dimensions. +%% +%% This is not intended for direct use. +%% +% XXX do we need to document this?? +% ...is there a usecase for calling this manually? +\newcommand\InitPages{ + % layout bools/tests... + \coverlayoutfalse + \hardcoverlayoutfalse + \softcoverlayoutfalse + \endpaperlayoutfalse + \jacketlayoutfalse + \coverlikelayoutfalse + \blocklayoutfalse + \ifdefstring{\layoutmode}{block}{ + \blocklayouttrue }{} + \ifdefstring{\layoutmode}{cover}{ + \coverlayouttrue + \coverlikelayouttrue }{} + \ifdefstring{\layoutmode}{hardcover}{ + \hardcoverlayouttrue + \coverlikelayouttrue }{} + \ifdefstring{\layoutmode}{softcover}{ + \softcoverlayouttrue + \coverlikelayouttrue }{} + \ifdefstring{\layoutmode}{jacket}{% + \jacketlayouttrue + \coverlikelayouttrue }{} + \ifdefstring{\layoutmode}{endpaper}{ + \endpaperlayouttrue }{} + % pdf layout... + \ifx\photobook@pdfpagelayout\empty + \ifblocklayout + \def\pdfpagelayout{TwoPageRight} + \else + \def\pdfpagelayout{SinglePage}\fi + \else + \def\pdfpagelayout{\photobook@pdfpagelayout}\fi + % items to ignore in different layouts... + % XXX is this the correct way to go??? + \ifcoverlayout + \setlength\coverflap{\photobook@coverflap} + \else + \setlength\coverflap{0pt}\fi + \ifjacketlayout + \setlength\jacketwrap{\photobook@jacketwrap} + \setlength\jacketflap{\photobook@jacketflap} + \else + \setlength\jacketwrap{0pt} + \setlength\jacketflap{0pt}\fi + % flaps... + \ifdim\jacketflapfront=0pt + \setlength\jacketflapfront{\jacketflap}\fi + \ifdim\jacketflapback=0pt + \setlength\jacketflapback{\jacketflap}\fi + % block size... + \ifdim\blockwidth=0pt + % layout: block... + \setlength\blockwidth{ + \ifx\photobook@blockwidth\empty + \dimexpr + \paperwidth + - 2\bleed \relax + \else + \photobook@blockwidth \fi} + \setlength\pageblockwidth{\blockwidth} + % layout: cover... + \ifcoverlayout + \setsepchar{,}% + \readlist*\pagefoldpanels{% + \the\coverflap, + % board thickness is ignored... + \the\dimexpr + \coverboardgrow + + \pageblockwidth \relax, + \the\spinefold, + \the\spinewidth, + \the\spinefold, + \the\dimexpr + \coverboardgrow + + \pageblockwidth \relax, + % board thickness is ignored... + \the\coverflap}% + \photobook@setpagefold{out} + \setlength\blockwidth{ + \dimexpr + 2\blockwidth + + \spinewidth + + 2\spinefold + + 2\coverboardgrow + + 2\coverflap \relax}\fi + % layout: jacket... + % XXX this seems to be about 6mm off -- what are we missing here??? + \ifjacketlayout + \setsepchar{,}% + \readlist*\pagefoldpanels{% + \the\jacketflapback, + \the\jacketwrap, + \the\dimexpr + \coverboardgrow + + \pageblockwidth \relax, + \the\spinefold, + \the\spinewidth, + \the\spinefold, + \the\dimexpr + \coverboardgrow + + \pageblockwidth \relax, + \the\jacketwrap, + \the\jacketflapfront}% + \photobook@setpagefold{out} + \setlength\blockwidth{ + \dimexpr + 2\blockwidth + + 2\coverboardgrow + + \spinewidth + + 2\spinefold + + 2\jacketwrap + + \jacketflapfront + + \jacketflapback \relax}\fi + % layout: endpaper... + \ifendpaperlayout + \readlist*\pagefoldpanels{% + \the\pageblockwidth, + \the\pageblockwidth}% + \photobook@setpagefold{in} + \setlength\blockwidth{2\blockwidth}\fi\fi + \ifdim\blockheight=0pt + % layout: block / endpaper... + \setlength\blockheight{ + \ifx\photobook@blockheight\empty + \dimexpr \paperheight - 2\bleed \relax + \else + \photobook@blockheight\fi} + \setlength\pageblockheight{\blockheight} + % layout: cover... + \ifcoverlayout + \setlength\blockheight{ + \dimexpr + \blockheight + + 2\coverboardgrow + + 2\coverflap + \relax}\fi + % layout: jacket... + \ifjacketlayout + \setlength\blockheight{ + \dimexpr + \blockheight + + 2\coverboardgrow + \relax}\fi\fi + % default image clearance... + \ifdim \clearimage = \maxdimen + \ifx\photobook@clearimage\empty + %\setlength\clearimage{-\bleed} + \setlength\clearimage{10mm} + \else + \setlength\clearimage{\photobook@clearimage}\fi\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 + 2\bleed + + \blockwidth \relax} + \setlength\bleedblockheight{\dimexpr + 2\bleed + + \blockheight \relax} + % cells... + \global\setlength\cellparentwidth{\blockwidth} + \global\setlength\cellparentheight{\blockheight} + \global\setlength\cellwidth{\cellparentwidth} + \global\setlength\cellheight{\cellparentheight} + % misc... + \nprounddigits{\photobook@roundprintedlengthsto}} + + +%% \DescribeMacro{\ReInitPages} +% +%% Reset and re-initialize page dimentions. +%% +\newcommand\ReInitPages{% + \setlength\blockwidth{0mm}% + \setlength\blockheight{0mm}% + \edef\pdfpagelayout{}% + % + \InitPages% + \ResetFoldMarks} + + + +%---------------------------------------------------------------------- +% Setup... + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% on-import... + +% init/update lengths... +\InitPages + +% minimal geometry setup... +\RequirePackage[ + % paper size (incl. bleeds)... + paperwidth=\bleedblockwidth, paperheight=\bleedblockheight, +]{geometry} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% pre-document... + +\AtEndPreamble{ + + % Metadata... + \hypersetup{ + pdfinfo={ + Title={\@title}, + Subject={\@subject}, + Author={\@author}, + Keywords={\@keywords}, + }, + pdfpagelayout=\pdfpagelayout, + } + + % Geometry... + \InitPages + % no-defaults -- the user is expected to set things up... + \ifphotobook@geometrynodefaults + \geometry{ + % paper size (incl. bleeds)... + paperwidth=\bleedblockwidth, paperheight=\bleedblockheight, + bindingoffset=\bindingoffset} + % normal mode... + \else + \geometry{ + % paper size (incl. bleeds)... + paperwidth=\bleedblockwidth, paperheight=\bleedblockheight, + bindingoffset=\bindingoffset, + % include header/footer/margin notes in printed area + twoside, includeall, nomarginpar, + ignorehead=false, ignorefoot=false, ignoremp=false, + % center printed area on page + vcentering, hcentering}\fi + + \setlength\pagetextwidth{\textwidth} + \setlength\pagetextheight{\textheight} + + % PDF boxes... + \pdfboxesset[\bleed]{\bleedblockwidth}{\bleedblockheight}} + + + +%---------------------------------------------------------------------- +%%%% Generic commands +%% + + +%% \DescribeMacro{\keywords\{..\}} +% +%% Set pdf metadata keywords +%% +%% >> \keywords{<keywords>} +%% +\def\@keywords{} + +\newcommand\keywords[1]{% + \def\@keywords{#1}} + + +%% \DescribeMacro{\subject\{..\}} +% +%% Set pdf metadata subject +%% +%% >> \subject{<subject>} +%% +\def\@subject{} + +\newcommand\subject[1]{% + \def\@subject{#1}} + + +%% \DescribeMacro{\mindim\{..\}} +%% \DescribeMacro{\maxdim\{..\}} +% +%% Get min/max dimension. +% +%% >> \mindim{A}{B} +% +%% >> \maxdim{A}{B} +%% +% XXX do we actually need these?? +% ...should be simple to replace with calc's: +% 0pt + \minof{..} +% 0pt + \maxof{..} +\newcommand\mindim[2]{ + \ifdim \dimexpr #1 \relax < \dimexpr #2 \relax% + \dimexpr #1 \relax% + \else% + \dimexpr #2 \relax\fi} + +\newcommand\maxdim[2]{ + \ifdim \dimexpr #1 \relax > \dimexpr #2 \relax% + \dimexpr #1 \relax% + \else% + \dimexpr #2 \relax\fi} + + +%% \DescribeMacro{\emptypage\{..\}} +% +%% Create an empty page. +% +%% >> \emptypage +%% >> \emptypage[<style>] +% +%% |<style>| is the style name as defined via |fancyhdr| (default: |empty|). +%% +\newcommand\emptypage[1][empty]{% + \begin{page}% + \ifthenelse{\equal{#1}{}}{}{% + \thispagestyle{#1}}% + \end{page}} + + +%% \DescribeMacro{\cleartoleftpage} +% +%% Forces content to left page. +%% +%% This is a companion to |\cleardoublepage|. +%% +\newcommand*{\cleartoleftpage}{% + \clearpage + \if@twoside + \ifodd\c@page + \hbox{}\newpage + \if@twocolumn + \hbox{}\newpage \fi\fi\fi } + + +%M \DescribeMacro{\ResettableMacro\{..\}} +% +%M Create a resettable command. +% +%M >> \ResettableMacro{<name>}{<code>} +%M >> \ResettableMacro{<name>}[<arg-count>]{<code>} +%M >> \ResettableMacro{<name>}[<arg-count>][<default>]{<code>} +% +%M This is similar to |\newcommand{..}| but will define two commands: +%M +%M >> \<name>{..} +%M +%M >> \reset<name> +%M +%M |\<name>{..}| can be freely redefined or undefined by user. +%M +%M |\reset<name>| will reset |\<name>{..}| to its original state. +%M +% parse args... +\def\ResettableMacro#1{% + \@ifnextchar[{% + \photobook@ResettableMacro@pre{#1}% + }{% + \photobook@ResettableMacro{#1}}} +\def\photobook@ResettableMacro@pre#1[#2]{% + \@ifnextchar[{% + \photobook@ResettableMacro@args@dfl{#1}[#2]% + }{% + \photobook@ResettableMacro@args{#1}[#2]}} +% pre -- main command definition... +\def\photobook@ResettableMacro#1#2{% + \expandafter\newcommand\csname photobook@ResettableMacro@#1\endcsname{#2}% + \photobook@ResettableMacro@tail{#1}} +\def\photobook@ResettableMacro@args#1[#2]#3{% + \expandafter\newcommand\csname photobook@ResettableMacro@#1\endcsname[#2]{#3}% + \photobook@ResettableMacro@tail{#1}} +\def\photobook@ResettableMacro@args@dfl#1[#2][#3]#4{% + \expandafter\newcommand\csname photobook@ResettableMacro@#1\endcsname[#2][#3]{#4}% + \photobook@ResettableMacro@tail{#1}} +% post... +\def\photobook@ResettableMacro@tail#1{% + % \reset<name> + \expandafter\newcommand\csname reset#1\endcsname{% + \expandafter\let\csname #1\expandafter\endcsname\csname photobook@ResettableMacro@#1\endcsname} + % initialize... + \csname reset#1\endcsname} + + +% XXX EXPERIMENTAL +% >> \resizedpage[<bleed>]{<width>}{<height>}{<code>} +\newenvironment{resizedpages}[3][\bleed]{ + \begingroup% + % setup page... + \setlength\bleed{#1}% + \setlength\blockwidth{#2}% + \setlength\blockheight{#3}% + \setlength\pageblockwidth{\blockwidth}% + \setlength\pageblockheight{\blockheight}% + \edef\pdfpagelayout{}% + % + \InitPages% + % + \setlength\paperwidth{\bleedblockwidth}% + \setlength\paperheight{\bleedblockheight}% + % + \pdfboxesset[\bleed]{\bleedblockwidth}{\bleedblockheight}% + % + % NOTE: this prevents some issues with macros racing to place + % stuff at ship-out (possibly)... + % ...also see cell env... + % XXX needs more digging... + % XXX do this at beginshipout/beginpage... (???) + %\null% + %\hbox{}% +}{% + \endgroup% + % reset... + \pdfboxesset[\bleed]{\bleedblockwidth}{\bleedblockheight}} + + + + +%---------------------------------------------------------------------- +%%%% Environments and Cells + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Generic + +%% \DescribeEnv{page} +% +%% Page environment. +%% +%% This is mainly designed to wrap other cell environment described later. +%% +%% Note that this may span more than one page if there is enough stuff +%% packed in. +%% +\newenvironment{page}{% + \null% + \ignorespaces% +}{% + \clearpage} + + +%% \DescribeEnv{leftpage} +% +%% \EXPERIMENTAL +%% +% XXX not sure about this... +\newenvironment{leftpage}{% + \begin{page}% + \cleartoleftpage% +}{% + \end{page}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Cells + +% meta helpers... + +%M \DescribeMacro{\CellContentOptions\{..\}} +% +%M \EXPERIMENTAL +%M +%M Define standard cell options. +%M +% XXX figure out how to align and pad without messing with geometry... +\newcommand\CellContentOptions[1]{% + %% align... + %\expandafter\def\csname photobook@#1@align\endcsname{flushleft}% + %\define@key{#1@args}{align}{% + % \expandafter\edef\csname photobook@#1@align\endcsname{##1}}% + % valign... + \expandafter\def\csname photobook@#1@valign\endcsname{t}% + \define@key{#1@args}{valign}{% + \expandafter\edef\csname photobook@#1@valign\endcsname{##1}}% + %% margin... + %\expandafter\def\csname photobook@#1@margin\endcsname{0pt}% + %\define@key{#1@args}{margin}{% + % \expandafter\edef\csname photobook@#1@margin\endcsname{##1}}% + %% padding... + %\expandafter\def\csname photobook@#1@padding\endcsname{0pt}% + %\define@key{#1@args}{padding}{% + % \expandafter\edef\csname photobook@#1@padding\endcsname{##1}}% +} + +%M \DescribeEnv{CellContent} +%M \DescribeEnv{CellContent*} +% +%M \EXPERIMENTAL +%M +%M Standard cell content wrapper, used by |inlinecell|. +% +%M >> \begin{CellContent}[<parent-align>]{<name>} ... \end{CellContent} +%M >> \begin{CellContent*}[<parent-align>]{<name>}{<width>}{<height>} ... \end{CellContent} +% +%M The star version requires width/height to be manually passed while the +%M non-star version will get the values from |\cellwidth| and |\cellheight| +%M respectively. +% +% XXX TEST params... +\newenvironment{CellContent}[2][t]{% + \begin{CellContent*}[#1]{#2}{\cellwidth}{\cellheight}% +}{% + \end{CellContent*}} + +\newenvironment{CellContent*}[4][t]{% + \begin{adjustbox}{ + minipage=[#1][#4][\csname photobook@#2@valign\endcsname]{#3}, + valign=#1}% + \ignorespaces% +}{% + % NOTE: prevent empty "minipage" from collapsing... + \hspace{\fill}% + \end{adjustbox}} + + +%M \DescribeEnv{CellContent} +%M \DescribeEnv{CellContent*} +% +%M \EXPERIMENTAL +%M +%M Like |CellContent| / |CellContent*| but will use |minipage| as the wrapper. +% +%M >> \begin{MinipageCellContent}[<parent-align>]{<name>} ... \end{MinipageCellContent} +%M >> \begin{MinipageCellContent*}[<parent-align>]{<name>}{<width>}{<height>} ... \end{MinipageCellContent} +% +% XXX TEST... +% XXX doc... +\newenvironment{MinipageCellContent}[2][t]{% + \begin{MinipageCellContent*}[#1]{#2}{\cellwidth}{\cellheight}% +}{% + \end{MinipageCellContent*}} + +\newenvironment{MinipageCellContent*}[4][t]{% + \begin{minipage}[#1][#4][\csname photobook@#2@valign\endcsname]{#3}% +}{% + \end{minipage}} + + +%% A cell environment is a box of specified size. +%% +%% Cells can be both placed inline relative to other content or in an +%% absolute location. +%% +%% Note that absolute cells are placed relative to the page and currently +%% can not be placed relative to other absolute cells (this might change +%% in the future). +%% +%% \DescribeMacro{\cellwidth=<len>} +%% \DescribeMacro{\cellheight=<len>} +%% \DescribeMacro{\cellparentwidth=<len>} +%% \DescribeMacro{\cellparentheight=<len>} +%% \DescribeMacro{\celloffsettop=<len>} +%% \DescribeMacro{\celloffsetleft=<len>} +%% \DescribeMacro{\clearance=<len>} +%% +%% A cell defines a set of contextual lengths: +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <--> celloffsetleft +%% . <--------------> cellwidth +%% <----------------------> cellparentwidth +%% . . . . +%% +----------------------+ . . . . . . . +%% | . . | ^ ^ celloffsettop +%% | . . | | | +%% | +--------------+ . | . . | . . . v +%% | | | | | ^ +%% | | | | | | cellheight +%% | | cell | | | | +%% | | | | | | +%% | | | | | | +%% | +--------------+ . | . . | . v +%% | | | +%% | | | cellparentheight +%% +----------------------+ . . v +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% For absolutely positioned cells these define the cell offset from +%% parent. +%% +%% The bare page can be reasonably treated as a cell. +%% +%% Initally, outside of any cells |\cellwidth|, |\cellparentwidth| and +%% |\cellheight|, |\cellparentheight| are equal to |\paperwidth| and +%% |\paperheight| respectively, and |\celloffsettop| and |\celloffsetleft| +%% are set to |0pt|. +%% +%% Changing these is not recommended, it likely will not affect the +%% current cell but can mess up nested cells. +%% +%% \DescribeEnv{inlinecell} +%% \DescribeEnv{inlinecell*} +% +%% Create a basic inline cell. +% +%% >> \begin{inlinecell}{<width>}{<height>} ... \end{inlinecell} +%% >> \begin{inlinecell}[<valign>]{<width>}{<height>} ... \end{inlinecell} +% +%% This will clip oversized content. +%% +%% |inlinecell*| is like |inlinecell| but will not clip. +% +%% >> \begin{inlinecell*}{<width>}{<height>} ... \end{inlinecell*} +%% >> \begin{inlinecell*}[<valign>]{<width>}{<height>} ... \end{inlinecell*} +% +%% |<valign>| can be one of |t| (default) for top, |c| for center or |b| for bottom. +%% +%% These are just like |minipage| but provide cell mechanics. +%% +% XXX EXPERIMENTAL +\CellContentOptions{inlinecell} + +\def\photobook@inlinecell@parentvalign{t} +\define@boolkey{inlinecell@args}{t}[true]{% + \def\photobook@inlinecell@parentvalign{t}} +\define@boolkey{inlinecell@args}{c}[true]{% + \def\photobook@inlinecell@parentvalign{c}} +\define@boolkey{inlinecell@args}{b}[true]{% + \def\photobook@inlinecell@parentvalign{b}} + +\newenvironment{inlinecell*}[3][]{% + \begingroup% + \setkeys{inlinecell@args}{ + t, + #1}% + % + % get args by value... + \edef\photobook@protect@w{\the\dimexpr #2 \relax}% + \edef\photobook@protect@h{\the\dimexpr #3 \relax}% + % + \setlength\cellparentwidth{\cellwidth}% + \setlength\cellparentheight{\cellheight}% + \setlength\cellwidth{\photobook@protect@w}% + \setlength\cellheight{\photobook@protect@h}% + \setlength\celloffsettop{0pt}% + \setlength\celloffsetleft{0pt}% + % + \begin{CellContent}[\photobook@inlinecell@parentvalign]{inlinecell}% +}{% + \end{CellContent}% + \endgroup} + +\newenvironment{inlinecell}[3][t]{% + \begin{inlinecell*}[#1]{#2}{#3}% + \begin{cliptocell}% +}{% + \end{cliptocell}% + \end{inlinecell*}} + + +% XXX EXPERIMENTAL +%% \DescribeEnv{minipagecell} +%% \DescribeEnv{minipagecell*} +% +%% \EXPERIMENTAL +%% +\CellContentOptions{minipagecell} + +\def\photobook@minipagecell@parentvalign{t} +\define@boolkey{minipagecell@args}{t}[true]{% + \def\photobook@minipagecell@parentvalign{t}} +\define@boolkey{minipagecell@args}{c}[true]{% + \def\photobook@minipagecell@parentvalign{c}} +\define@boolkey{minipagecell@args}{b}[true]{% + \def\photobook@minipagecell@parentvalign{b}} + +\newenvironment{minipagecell*}[3][]{% + \begingroup% + \setkeys{minipagecell@args}{ + t, + #1}% + % get args by value... + \edef\photobook@protect@w{\the\dimexpr #2 \relax}% + \edef\photobook@protect@h{\the\dimexpr #3 \relax}% + % + \setlength\cellparentwidth{\cellwidth}% + \setlength\cellparentheight{\cellheight}% + \setlength\cellwidth{\photobook@protect@w}% + \setlength\cellheight{\photobook@protect@h}% + \setlength\celloffsettop{0pt}% + \setlength\celloffsetleft{0pt}% + \setlength\clearance{0pt}% + % + \begin{MinipageCellContent}[\photobook@minipagecell@parentvalign]{minipagecell}% +}{% + \end{MinipageCellContent}% + \endgroup} + +\newenvironment{minipagecell}[3][t]{% + \begin{minipagecell*}[#1]{#2}{#3}% + \begin{cliptocell}% +}{% + \end{cliptocell}% + \end{minipagecell*}} + + +% XXX EXPERIMENTAL +%% \DescribeEnv{zinlinecell} +%% \DescribeEnv{zinlinecell*} +% +%% \EXPERIMENTAL +%% +%% Like |inlinecell| / |inlinecell*| but will take up zero space. +%% +%% >> \begin{zinlinecell}{<width>}{<height>} ... \end{zinlinecell} +%% >> \begin{zinlinecell}[<valign>]{<width>}{<height>} ... \end{zinlinecell} +%% +% XXX need to get rid of the raisebox here... +\NewEnviron{zinlinecell*}[1][]{% + \smash{\makebox[0pt][l]{% + % XXX HACK: RAISEBOX -- feels hackish... + \raisebox{0pt - \totalheightof{O}}{% + \begin{inlinecell*}[#1]{\cellwidth}{\cellheight}% + \BODY% + \end{inlinecell*}}}}} + +\NewEnviron{zinlinecell}[1][]{% + \smash{\makebox[0pt][l]{% + % XXX HACK: RAISEBOX -- feels hackish... + \raisebox{0pt - \totalheightof{O}}{% + \begin{inlinecell}[#1]{\cellwidth}{\cellheight}% + \BODY% + \end{inlinecell}}}}} + + +%% \DescribeEnv{cell} +%% \DescribeEnv{cell*} +% +%% Create a basic absolutely positioned cell. +% +%% >> \begin{cell}{<left>, <top>}{<width>}{<height>} ... \end{cell} +% +%% Oversized content will be clipped. +%% +%% |cell*| is just like |cell| but will not clip its content. +% +%% >> \begin{cell*}{<left>, <top>}{<width>}{<height>} ... \end{cell*} +%% +% XXX SYNTAX: place the second arg in braces... +% \begin{cell*}(<left>, <top>){<width>}{<height>} +\newenvironment{cell*}[3]{% + \begingroup% + \setsepchar{,}% + \readlist*\photobook@cell@offset{#1}% + % + % NOTE: if there is no \null before textblock then it can reset the + % non-standard page boxes... + % ...not sure yet if this is an issue with how/when foldout env + % updates the boxes or with textblock internals, needs + % investigating... + % XXX report this as a bug if issue is in textblock... + % XXX another place where this is relevant is in the resizedpages + % env... + \null% + \begin{textblock*}{#2}(#1)% + \begin{inlinecell*}{#2}{#3}% + \setlength\celloffsettop{\photobook@cell@offset[1]}% + \setlength\celloffsetleft{\photobook@cell@offset[2]}% + \ignorespaces% +}{% + \end{inlinecell*}% + \end{textblock*}% + \endgroup% + \ignorespaces} + +\newenvironment{cell}[3]{% + \begin{cell*}{#1}{#2}{#3}% + \begin{cliptocell}% + \ignorespaces% +}{% + \end{cliptocell}% + \end{cell*}% + \ignorespaces} + + +% XXX EXPERIMENTAL +%% \DescribeEnv{adjustcell} +%% \DescribeEnv{adjustcell*} +% +%% \EXPERIMENTAL +%% +\newenvironment{adjustcell*}[4][t]{% + \begin{adjustbox}{#2}% + \vspace{0pt}% + \begin{minipagecell*}[#1]{#3}{#4}% +}{% + \end{minipagecell*}% + \end{adjustbox}} + +\newenvironment{adjustcell}[4][t]{% + \begin{adjustbox}{#2}% + \vspace{0pt}% + \begin{minipagecell}[#1]{#3}{#4}% +}{% + \end{minipagecell}% + \end{adjustbox}} + + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Save cells + +%% \DescribeMacro{\savecell\{..\}} +%% \DescribeMacro{\gsavecell\{..\}} +% +%% Create a saved cell. +% +%% >> \savecell{<name>}{<width>}{<height>}{ .. } +% +%% This is similar to |\newsavebox{..}| and |\sbox{..}| but adds +%% cell functionality. +%% +%% |\gsavecell{..}| is the same as |\savecell{..}| but greates a global +%% cell. +%% +% XXX can/should we make this an env??? +% XXX should this be split into \newsavecell{..} and \scell{..} ??? +% XXX can we use root cells inside this??? +% ...i.e. things using textbox*... +\newcommand\savecell[5][]{% + % only define a savebox once... + \@ifundefined{#2}{% + \expandafter\newsavebox\csname #2\endcsname}{} + \expandafter\sbox\csname #2\endcsname{% + \begin{inlinecell*}[#1]{#3}{#4}% + #5% + \end{inlinecell*}}% + \ignorespaces} + +\newcommand\gsavecell[5][]{% + % only define a savebox once... + \@ifundefined{#2}{% + \expandafter\newsavebox\csname #2\endcsname}{} + \global\expandafter\sbox\csname #2\endcsname{% + \begin{inlinecell*}[#1]{#3}{#4}% + #5% + \end{inlinecell*}}% + \ignorespaces} + + +%% \DescribeMacro{\usecell\{..\}} +%% \DescribeMacro{\usecell*\{..\}} +% +%% Use part of a saved cell. +%% +%% >> \usecell{<name>}(<top>, <left>){<width>}{<height>} +%% +%% This will clip the content to cell. +%% +%% |\usecell*{..}| is similar to |\usecell{..}| but will not clip the +%% cell content. +%% +%% >> \usecell*{<name>}(<top>, <left>){<width>}{<height>} +%% +%% These are similar to |\usebox{..}|. +%% +\def\usecell{\@ifstar{% + \photobook@usecell% +}{% + \photobook@usecell@star}} + +% cell content... +% NOTE: this is not intended for direct use -- depends closure/context... +\def\photobook@usecell@placecell#1(#2){% + \setsepchar{,}% + \readlist*\photobook@usecell@offset{#2}% + % XXX how we align things feels a bit odd... + \vspace{-\dimexpr \photobook@usecell@offset[1] \relax}% + \adjustbox{margin={-\dimexpr \photobook@usecell@offset[2] \relax} 0pt 0pt 0pt}{% + \expandafter\usebox\csname #1\endcsname}} + +% XXX add option to rotate saved cell... +\def\photobook@usecell@star#1(#2)#3#4{ + \begin{inlinecell}{#3}{#4}% + \photobook@usecell@placecell{#1}(#2)% + \end{inlinecell}} + +% XXX add option to rotate saved cell... +\def\photobook@usecell#1(#2)#3#4{ + \begin{inlinecell*}{#3}{#4}% + \photobook@usecell@placecell{#1}(#2)% + \end{inlinecell*}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Cell macros +% +%% Cell macros require a cell environment to function correctly. +%% + +%% \DescribeEnv{topdown} +%% \DescribeEnv{bottomup} +% +%% Rotate cell content vertically, orienting it top-down or bottom-up. +% +%% >> \begin{topdown} ... \end{topdown} +%% >> \begin{bottomup} ... \end{bottomup} +%% +\newenvironment{topdown}[1][t]{% + \begin{flushright}% + \begin{turn}{270}% + \begin{inlinecell*}[#1]{\cellheight}{\cellwidth}% +}{% + \end{inlinecell*}% + \end{turn}% + \end{flushright}} + +\newenvironment{bottomup}[1][t]{% + \begin{turn}{90}% + \begin{inlinecell*}[#1]{\cellheight}{\cellwidth}% +}{% + \end{inlinecell*}% + \end{turn}} + + +%% \DescribeEnv{cliptocell} +% +%% Clip content to parent cell. +%% +\newenvironment{cliptocell}{% + \begin{clipbox*}{0cm {\height - \cellheight} {\cellwidth} {\height}}% + \begin{minipage}[t][\cellheight][t]{\cellwidth}% + \ignorespaces% +}{% + \end{minipage}% + \end{clipbox*}} + + + +%% \DescribeMacro{\imagecell\{..\}} +% +%% Place image in cell. +% +%% >> \imagecell{<caption-cell>}{<image>} +%% >> \imagecell[<key>=<value>, ..]{<caption-cell>}{<image>} +%% +%% >> \imagecell[fit]{}{<image>} +%% >> \imagecell[fill]{}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% fit (default) fill +%% +-----------------+ . . . +-----------------+ . . . +%% | | . . | | . . +%% +-----------------+ . | | . +%% | . . | . | . . | . +%% | . . | . | . . | . +%% | image | . | image | . +%% | . . | . | . . | . +%% | . . | . | . . | . +%% +-----------------+ . | | . +%% | | . . | | . . +%% +-----------------+ . . . +-----------------+ . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Centering. The image will be centered by default. +%% +%% >> \imagecell{}{<image>} +%% >> \imagecell[center]{}{<image>} +%% +%% Vertical alignment +%% +%% >> \imagecell[top]{}{<image>} +%% >> \imagecell[bottom]{}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% top center (default) bottom +%% +-----------------+ +-----------------+ +-----------------+ +%% | . . | | | | | +%% | . . | +-----------------+ | | +%% | image | | . . | | | +%% | . . | | . . | +-----------------+ +%% | . . | | image | | . . | +%% +-----------------+ | . . | | . . | +%% | | | . . | | image | +%% | | +-----------------+ | . . | +%% | | | | | . . | +%% +-----------------+ +-----------------+ +-----------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Horizontal alignment +%% +%% >> \imagecell[left]{}{<image>} +%% >> \imagecell[right]{}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% left center (default) right +%% +-------------+---+ +-+-------------+-+ +---+-------------+ +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% | image | | | | image | | | | image | +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% | . . | | | | . . | | | | . . | +%% +-------------+---+ +-+-------------+-+ +---+-------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Horizontal and vertical alignment can be combined to control alignment +%% of both vertical and horizontal images at the same time. +%% +%% Image |clearance|. This sets the amount of clearance around an image +%% (default: |0pt|). +%% +%% >> \imagecell[clearance=-4mm]{}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% clearance > 0pt clearance = 0pt clearance < 0pt +%% (default) +%% +--------v--------+ +-----------------+ +--------^--------+ +%% | | | | | | +%% |+---------------+| +-----------------+ ..+-----------------+.. +%% || . . || | . . | . |. .| . +%% || . . || | . . | . | . . | . +%% |> image <| | image | < | image | > +%% || . . || | . . | . | . . | . +%% || . . || | . . | . |. .| . +%% |+---------------+| +-----------------+ ..+-----------------+.. +%% | | | | | | +%% +--------^--------+ +-----------------+ +--------v--------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Note that if |clearance| is less than 0, the image will take up more +%% space than the containing cell, |\imagecell{..}| will not clip +%% its content and the whole image surface will be shown. If clipping is +%% needed then use |clipcell| environment as a container. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +-----------------+ - - caption cell size +%% . . . +%% +-----------------+ . +%% | | . +%% ..+-----------------+.. . + +%% . |.caption cell .| . | +%% . | . . | . | +%% . | . | . | +%% . | . . | . | +%% . |. .| . | +%% ..+-----------------+.. . + +%% | | +%% +-----------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% |<caption-cell>| occupies the same space as the image clipped by the +%% containing cell and provides all the cell functionality. +%% +%% If |captionclearparent| is set, the |<caption-cell>| will fit into an +%% intersection between the image area and the parent cell padded by +%% |captionclearparent|. +%% +%% This will write image path, page and size to |\jobname|.image-list, +%% this is useful for final image pre-press. +%% +%% To disable image list set: +% +%% >> \writeimagelistfalse +%% +% XXX do we need captionclearparent to be directional (a-la margin in adjustbox)??? +% XXX might be a good idea to split this into two parts: +% - \aligncell{..} +% - \imagecell{caption}{image} +% -> size image +% -> \aligncell{ +% image +% caption} +% XXX document scale/offsettop/offsetleft... + +% helpers... + +% image size logging... +\newif\ifwriteimagelist +\writeimagelisttrue + +\newwrite\photobook@imagelist +\def\photobook@logimagesize@setup{% + \immediate\openout\photobook@imagelist=\jobname.image-list% + \AfterEndDocument{% + \immediate\closeout\photobook@imagelist}% + % setup only once per job... + \global\def\photobook@logimagesize@setup{}} + +% >> \photobook@logimagesize{<path>}{<page>}{<imagebox>} +% XXX for some reason can't use \lenprint[mm]{..} in \write{..}... +\newcommand\photobook@logimagesize[3]{% + \ifwriteimagelist% + % first setup... + \photobook@logimagesize@setup% + % write... + \immediate\write\photobook@imagelist{% + #1: p#2: \the\wd#3\space x \the\ht#3}\fi}% + + +% NOTE: these are macros and not lengths as we need to "resolve" these +% as late as possible, i.e. after all the arguments have been +% processed. +\def\photobook@imagecell@top{0pt} +\def\photobook@imagecell@left{0pt} +\def\photobook@imagecell@captiontop{0pt} +\def\photobook@imagecell@captionleft{0pt} + +\newlength\photobook@imagecell@clearance +\setlength\photobook@imagecell@clearance{0pt} + +% NOTE: these feel like a hack... +\newlength\photobook@imagecell@imgratio +\newlength\photobook@imagecell@cellratio + +% fit/fill... +\define@boolkey{imagecell@args}{fit}[true]{% + \KV@imagecell@args@fillfalse} +\define@boolkey{imagecell@args}{fill}[true]{% + \KV@imagecell@args@fitfalse} +% center... +\define@boolkey{imagecell@args}{center}[true]{% + \def\photobook@imagecell@top{\dimexpr + +0.5\cellheight + -0.5\ht\photobook@imagebox \relax}% + \def\photobook@imagecell@left{\dimexpr + +0.5\cellwidth + -0.5\wd\photobook@imagebox \relax}}% +% left/right... +% shortdands... +\newcommand\photobook@imagecell@LEFT{% + \def\photobook@imagecell@left{\dimexpr% + +\photobook@imagecell@clearance \relax}% + \def\photobook@imagecell@captionleft{ + % XXX not sure why this branch is needed... + \ifKV@imagecell@args@fit + 0pt + \else% + \dimexpr% + +\cellwidth + -\photobook@imagecell@clearance + -\wd\photobook@imagebox \relax\fi}}% +\newcommand\photobook@imagecell@RIGHT{% + \def\photobook@imagecell@left{\dimexpr + +\cellwidth + -\photobook@imagecell@clearance + -\wd\photobook@imagebox \relax} + % XXX not sure why 0.5 but it seems to work... + \def\photobook@imagecell@captionleft{% + -0.5\photobook@imagecell@left}}% +% args... +\define@boolkey{imagecell@args}{left}[true]{% + \photobook@imagecell@LEFT} +\define@boolkey{imagecell@args}{right}[true]{% + \photobook@imagecell@RIGHT} +% inside/outside... +\define@boolkey{imagecell@args}{inside}[true]{% + \ifthenelse{\isodd{\thepage}}{% + \photobook@imagecell@LEFT% + }{% + \photobook@imagecell@RIGHT}}% +\define@boolkey{imagecell@args}{outside}[true]{% + \ifthenelse{\isodd{\thepage}}{% + \photobook@imagecell@RIGHT% + }{% + \photobook@imagecell@LEFT}}% +% top/bottom... +\define@boolkey{imagecell@args}{top}[true]{% + \def\photobook@imagecell@top{% + \photobook@imagecell@clearance}% + \def\photobook@imagecell@captiontop{% + -\dimexpr + +\cellheight + -\ht\photobook@imagebox \relax}}% +\define@boolkey{imagecell@args}{bottom}[true]{% + \def\photobook@imagecell@top{% + \dimexpr + +\cellheight + -\photobook@imagecell@clearance + -\ht\photobook@imagebox \relax}% + \def\photobook@imagecell@captiontop{% + \dimexpr + \photobook@imagecell@top + +\photobook@imagecell@clearance \relax}}% +% clearance=<len>... +\define@key{imagecell@args}{clearance}{% + \setlength\photobook@imagecell@clearance{#1}}% + +% offsettop=<len> / offsetleft=<len>... +% XXX DOC!!! +\newlength\photobook@imagecell@offsettop% +\setlength\photobook@imagecell@offsettop{0pt}% +\define@key{imagecell@args}{offsettop}[0pt]{% + \setlength\photobook@imagecell@offsettop{#1}}% +\newlength\photobook@imagecell@offsetleft% +\setlength\photobook@imagecell@offsetleft{0pt}% +\define@key{imagecell@args}{offsetleft}[0pt]{% + \setlength\photobook@imagecell@offsetleft{#1}}% + +% scale=<num>... +\edef\photobook@imagecell@scale{1}% +\define@key{imagecell@args}{scale}[1]{% + \edef\photobook@imagecell@scale{#1}}% + +% captionalign=t|c|b... +\def\photobook@imagecell@captionalign{t} +\define@choicekey{imagecell@args}{captionalign}{t,c,b}[t]{% + \def\photobook@imagecell@captionalign{#1}} + +% captionclearparent=<len>... +% XXX DOC!!! +\newif\ifphotobook@imagecell@captionclearparent +\newlength\photobook@imagecell@captionclearparent +\define@key{imagecell@args}{captionclearparent}[0pt]{% + \setlength\photobook@imagecell@captionclearparent{#1}% + \photobook@imagecell@captionclearparenttrue} + +% XXX can we make this an env??? +\newcommand\imagecell[3][]{% + \begingroup% + % args... + \setkeys{imagecell@args}{% + fit, + center, + clearance=0pt, + #1}% + % preload image... + % fit... + \ifKV@imagecell@args@fit% + \sbox{\photobook@imagebox}{% + \includegraphics[% + keepaspectratio, + width=\photobook@imagecell@scale\dimexpr + \cellwidth + - ((\photobook@imagecell@clearance) * 2) \relax, + height=\photobook@imagecell@scale\dimexpr + \cellheight + - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}% + % fill... + \else\ifKV@imagecell@args@fill% + % preload image to get its proportions... + \sbox{\photobook@imagebox}{\includegraphics{#3}}% + % constrain minimal dimension of image... + % NOTE: here we calculate image/cell eccentricity to decide + % to fit to width or heigh of cell... + % NOTE: did I say that I "love" how LaTeX does basic math?? + \setlength\photobook@imagecell@imgratio{% + 1pt * \ratio{\wd\photobook@imagebox}{\ht\photobook@imagebox}}% + \setlength\photobook@imagecell@cellratio{% + 1pt * \ratio{\cellwidth}{\cellheight}}% + \ifdim \photobook@imagecell@imgratio < \photobook@imagecell@cellratio% + \sbox{\photobook@imagebox}{% + \includegraphics[% + keepaspectratio, + width=\photobook@imagecell@scale\dimexpr + + \cellwidth + - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}% + \else% + \sbox{\photobook@imagebox}{% + \includegraphics[% + keepaspectratio, + height=\photobook@imagecell@scale\dimexpr + + \cellheight + - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}% + \fi\fi\fi% + % + \setlength\celloffsetleft{% + \dimexpr + \photobook@imagecell@offsetleft + + \photobook@imagecell@left \relax}% + \setlength\celloffsettop{% + \dimexpr + \photobook@imagecell@offsettop + + \photobook@imagecell@top \relax}% + % + % + % place image box... + % XXX for some odd reason without this the alignment completely breaks... + \vspace{0pt}% + \smash{\makebox[0pt][l]{% + \adjustbox{% + margin={\celloffsetleft} 0pt 0pt {\celloffsettop}, + valign=T}{% + \photobook@logimagesize{#3}{\thepage}{\photobook@imagebox}% + \usebox\photobook@imagebox}}}% + % + % + % prepare for caption cell... + \setlength\cellparentwidth{\cellwidth}% + \setlength\cellparentheight{\cellheight}% + \setlength\cellwidth{% + \mindim{ + \wd\photobook@imagebox + + \mindim{\celloffsetleft}{0pt} + }{ + \cellwidth}}% + \setlength\cellheight{% + \mindim{ + \ht\photobook@imagebox + + \mindim{\celloffsettop}{0pt} + }{ + \cellheight}}% + \setlength\celloffsetleft{% + \maxdim{\celloffsetleft}{0pt}}% + \setlength\celloffsettop{% + \maxdim{\celloffsettop}{0pt}}% + \setlength\clearance{\photobook@imagecell@clearance}% + % clear parent... + % XXX might be a good idea to put this into a special reusable cell... + \ifphotobook@imagecell@captionclearparent% + % trim vertical... + % XXX this seems overcomplicated... + \setlength\cellheight{% + \mindim{ + \cellheight + % trim from both sides.... + }{\mindim{ + \cellparentheight + - 2\photobook@imagecell@captionclearparent + % trim from bottom... + }{\mindim{ + \cellheight + + \celloffsettop + - \photobook@imagecell@captionclearparent + % trim from top... + }{ + \cellparentheight + - \photobook@imagecell@captionclearparent + - \celloffsettop}}}}% + % offset top... + \setlength\celloffsettop{ + \maxdim{ + \celloffsettop + + (\photobook@imagecell@captionclearparent - \celloffsettop) + }{ + \celloffsettop}}% + % trim horizontal... + % XXX this seems overcomplicated... + \setlength\cellwidth{% + \mindim{ + \cellwidth + % trim from both sides.... + }{\mindim{ + \cellparentwidth + - 2\photobook@imagecell@captionclearparent + % trim from right... + }{\mindim{ + \cellwidth + + \celloffsetleft + - \photobook@imagecell@captionclearparent + % trim from left... + }{ + \cellparentwidth + - \photobook@imagecell@captionclearparent + - \celloffsetleft}}}}% + % offset left... + \setlength\celloffsetleft{ + \maxdim{ + \celloffsetleft + + (\photobook@imagecell@captionclearparent - \celloffsetleft) + }{ + \celloffsetleft}}\fi% + % + % + % place caption box... + \smash{\makebox[0pt][l]{% + \adjustbox{% + %cfbox=gray 0.5pt 0pt 0pt, + margin={\celloffsetleft} 0pt 0pt {\celloffsettop}, + minipage=[b][\cellheight][\photobook@imagecell@captionalign]{\cellwidth}, + valign=T}{% + \ignorespaces% + #2}}}% + \endgroup} + + +%% \DescribeMacro{\captioncell\{..\}} +% +%% Caption cell +%% +%% Placement: +% +%% >> \captioncell[<position>]{<caption>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% over +%% +-----------------+ +%% | top | +%% | | +%% | | +%% | | +%% | center | +%% | | +%% | | +%% | | +%% | bottom | +%% +-----------------+ +%% under +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Default: +%% >> \captioncell{<caption>} +%% >> \captioncell[top]{<caption>} +%% +%% >> \captioncell[center]{<caption>} +%% >> \captioncell[bottom]{<caption>} +%% +%% >> \captioncell[over]{<caption>} +%% >> \captioncell[under]{<caption>} +%% +%% Horizontal alignment +% +%% >> \captioncell[align=<mode>]{<caption>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +-----------------+ +-----------------+ +-----------------+ +%% |flushleft | | center | | flushright| +%% | | | | | | +%% | | | | | | +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Default: +%% >> \captioncell{<caption>} +%% >> \captioncell[align=flushleft]{<caption>} +%% +%% >> \captioncell[align=center]{<caption>} +%% >> \captioncell[align=flushright]{<caption>} +%% +%% Note that a caption cell does not take up any space in the parent cell +%% so multiple captions can be used in combination with other elements. +%% +%% Note that caption cells currently do not play well with other content +%% in the same cell that takes up space, e.g. text, pictures, ...etc. +%% Captions are mainly suited to play well with image cells. +%% + +% over / top / center / bottom / under... +\define@boolkey{captioncell@args}{over}[true]{% + \def\photobook@captioncell@format##1{% + \photobook@captioncell@formatalign[-\cellheight]{b}{##1}}} +\define@boolkey{captioncell@args}{top}[true]{% + \def\photobook@captioncell@format##1{% + \photobook@captioncell@formatalign{t}{##1}}} +\define@boolkey{captioncell@args}{center}[true]{% + \def\photobook@captioncell@format##1{% + \smash{\makebox[0pt][l]{% + \begin{minipage}[t][\cellheight][c]{\cellwidth}% + \begin{\photobook@captioncell@align}% + \ignorespaces% + ##1% + \end{\photobook@captioncell@align}% + \end{minipage}}}}} +\define@boolkey{captioncell@args}{bottom}[true]{% + \def\photobook@captioncell@format##1{% + \photobook@captioncell@formatalign{b}{##1}}} +\define@boolkey{captioncell@args}{under}[true]{% + \def\photobook@captioncell@format##1{% + \photobook@captioncell@formatalign[\cellheight]{t}{##1}}} +% align=<len>... +\def\photobook@captioncell@align{} +% XXX for some reason \define@choicekey{..} does not expand macros... +%\define@choicekey{captioncell@args}{align}{flushleft,center,flushright}{% +\define@key{captioncell@args}{align}{% + \def\photobook@captioncell@align{#1}} +% margin=<len>... +\def\photobook@captioncell@margin{0pt} +\define@key{captioncell@args}{margin}{% + \def\photobook@captioncell@margin{#1}} + +% helpers... +% XXX set minipage height to available cell height (???) +\newcommand\photobook@captioncell@formatalign[3][0pt]{% + \smash{\makebox[0pt][l]{% + \begin{minipage}[t][\cellheight][t]{\cellwidth}% + % XXX for some reason without this things get misaligned... + \vspace{#1}% + % XXX HACK: for some magical reason setting the above minipage to 'b' + % will make \vspace{..} above break... + % ...adding another nested minipage seems to fix the issue... + \begin{minipage}[t][\cellheight][#2]{\cellwidth}% + \begin{\photobook@captioncell@align}% + \ignorespaces% + #3% + \end{\photobook@captioncell@align}% + \end{minipage} + \end{minipage}}}} +% format... +\def\photobook@captioncell@format#1{% + \photobook@captioncell@formatalign{t}{#1}} + +\newcommand\captioncell[2][]{% + \setkeys{captioncell@args}{ + top, + align=flushright, + margin=1pt, + #1}% + \photobook@captioncell@format{% + \adjustbox{margin=\photobook@captioncell@margin}{#2}}% + \ignorespaces} + + +%% \DescribeMacro{\vcaptioncell\{..\}} +% +%% Vertical caption cell +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% (topdown) (bottomup) +%% +-----------------+ +-----------------+ +%% b | l c r | a | | +%% e | e e i | f | | +%% f | f n g | t | | +%% o | t t h | e e | r | +%% r | e t | r r | e t | r +%% e | r | o | t t h | e +%% | | f | f n g | t +%% | | e | e e i | f +%% | | b | l c r | a +%% +-----------------+ +-----------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% See samples for better illustration. +%% + +% bottomup / topdown... +\def\photobook@vcaptioncell@orientation{bottomup} +\define@boolkey{vcaptioncell@args}{bottomup}[true]{% + \KV@vcaptioncell@args@topdownfalse% + \def\photobook@vcaptioncell@orientation{bottomup}} +\define@boolkey{vcaptioncell@args}{topdown}[true]{% + \KV@vcaptioncell@args@bottomupfalse% + \def\photobook@vcaptioncell@orientation{topdown}} + +% before / left / center / right / after... +\def\photobook@vcaptioncell@position{top} +\define@boolkey{vcaptioncell@args}{before}[true]{% + \def\photobook@vcaptioncell@position{% + \ifKV@vcaptioncell@args@bottomup% + over% + \else% + under\fi}} +\define@boolkey{vcaptioncell@args}{left}[true]{% + \def\photobook@vcaptioncell@position{% + \ifKV@vcaptioncell@args@bottomup% + top% + \else% + bottom\fi}} +\define@boolkey{vcaptioncell@args}{center}[true]{% + \def\photobook@vcaptioncell@position{center}} +\define@boolkey{vcaptioncell@args}{right}[true]{% + \def\photobook@vcaptioncell@position{% + \ifKV@vcaptioncell@args@bottomup% + bottom% + \else% + top\fi}} +\define@boolkey{vcaptioncell@args}{after}[true]{% + \def\photobook@vcaptioncell@position{% + \ifKV@vcaptioncell@args@bottomup% + under% + \else% + over\fi}} +% align... +\def\photobook@vcaptioncell@align{} +% XXX for some reason \define@choicekey{..} does not expand macros... +%\define@choicekey{vcaptioncell@args}{align}{flushleft,center,flushright}{% +\define@key{vcaptioncell@args}{align}{% + \def\photobook@vcaptioncell@align{#1}} +% margin... +\def\photobook@vcaptioncell@margin{0pt} +\define@key{vcaptioncell@args}{margin}{% + \def\photobook@vcaptioncell@margin{#1}} + +% valign +\def\photobook@vcaptioncell@valign{% + \ifKV@vcaptioncell@args@bottomup% + b% + \else% + t\fi} + +\newcommand\vcaptioncell[2][]{% + \setkeys{vcaptioncell@args}{ + left, + bottomup, + align=flushleft, + margin=1pt, + #1}% + % + \smash{\makebox[0pt][l]{% + \begin{minipage}[t][\cellheight][\photobook@vcaptioncell@valign]{\cellwidth}% + \begin{\photobook@vcaptioncell@orientation}% + \captioncell[% + \photobook@vcaptioncell@position, + align=\photobook@vcaptioncell@align, + margin=\photobook@vcaptioncell@margin]{#2}% + \end{\photobook@vcaptioncell@orientation}% + \end{minipage}}}% + \ignorespaces} + + +%% \DescribeMacro{\rcaptioncell\{..\}} +% +%% \EXPERIMENTAL +%% +%% Upside-down caption cell. +%% +% XXX a bit off... +\newcommand\rcaptioncell[2][]{% + \captioncell[align=flushleft, #1]{% + \begin{turn}{180}% + % XXX HACK: RAISEBOX -- need to shift by x-height... + % ...currently this is set to 1/(golden ratio) would + % be nice to make this parametric / font-derived... + \raisebox{1ex * \real{-0.618033988749855}}{#2}% + \end{turn}}% + \ignorespaces} + + +%% \DescribeMacro{\captionblockcell\{..\}} +% +%% Add caption into a box left/right of current cell. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% celloffsetleft celloffsetleft +%% <-------> v +%% . <--------------> .<-------------> cellwidth +%% <------------------------> <------------------------> cellparentwidth +%% . .. .. .. . . +%% +------------------------+ +------------------------+ +%% | | | | +%% | | | | +%% |+-------++ - - - - - - +| |+ - - - - - - ++-------+| +%% || |. .| |. .| || +%% || |. .| |. .| || +%% || cap. |. cell .| |. cell .| cap. || +%% || |. .| |. .| || +%% || |. .| |. .| || +%% |+-------++ - - - - - - +| |+ - - - - - - ++-------+| +%% | | | | +%% | | | | +%% +------------------------+ +------------------------+ +%% <> clearcaption .. <> clearcaption +%% <> spacing <> spacing +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX make captions clear top/bottom of page... +% XXX need to do a caption block -- a cell to one side of an image to the +% end of the page... +% XXX can we use the normal caption and simply insert a minipage of the +% appropriate width??? + +\newlength\photobook@captionblockcell@tmplen + +% left / right +\define@boolkey{captionblockcell@args}{left}[true]{% + \KV@captionblockcell@args@rightfalse} +\define@boolkey{captionblockcell@args}{right}[true]{% + \KV@captionblockcell@args@leftfalse} + +% align=flushright|center|flushright +% XXX this should depend on left/right... +\def\photobook@captionblockcell@align{% + \ifKV@captionblockcell@args@left% + flushright% + \else% + flushleft\fi} +\define@key{captionblockcell@args}{align}{% + \def\photobook@captionblockcell@align{#1}} + +% valign=t|c|b +% XXX should be a boolkey -- t|c|b??? +\edef\photobook@captionblockcell@valign{b} +\define@key{captionblockcell@args}{valign}{% + \edef\photobook@captionblockcell@valign{#1}} + +% clearance=<len> (defaults: \clearcaption) +\newlength\photobook@captionblockcell@clearance +\define@key{captionblockcell@args}{clearance}{% + \setlength\photobook@captionblockcell@clearance{#1}} + +% XXX should this clear only top/bottom or all sides??? +% XXX doc!! +% XXX do we need this here??? +\define@boolkey{captionblockcell@args}{constraintoparent}[true]{} +\newlength\photobook@captionblockcell@clearparent +\setlength\photobook@captionblockcell@clearparent{0pt} +\define@key{captionblockcell@args}{clearparent}{% + \setlength\photobook@captionblockcell@clearparent{#1}% + \KV@captionblockcell@args@constraintoparenttrue} + +% spacing=<len> +\newlength\photobook@captionblockcell@spacing +\setlength\photobook@captionblockcell@spacing{0pt} +\define@key{captionblockcell@args}{spacing}{% + \setlength\photobook@captionblockcell@spacing{#1}} + +% width=<len> +\newlength\photobook@captionblockcell@width +\setlength\photobook@captionblockcell@width{0pt} +\define@key{captionblockcell@args}{width}{% + \setlength\photobook@captionblockcell@width{#1}} + +% showbox +\define@boolkey{captionblockcell@args}{showbox}[true]{} + +\newcommand\photobook@captionblockcell@content[2][0pt]{% + \hspace{\celloffsetleft}{% + \begin{adjustbox}{ + % NOTE: we need to draw the border before we set margins + % to show the original box... + fbox=#1 0pt 0pt, + margin=0pt 0pt 0pt \celloffsettop, + minipage=[t][\cellheight][\photobook@captionblockcell@valign]{\cellwidth}, + valign=T}% + \begin{\photobook@captionblockcell@align}% + \ignorespaces% + #2% + \end{\photobook@captionblockcell@align}% + \end{adjustbox}}} + +% XXX revise how \clearance is handled... +% XXX do we need top/bottom boxes??? +% ...if yes do we need lop/left, top/right, bottom/left and bottom/right??? +% XXX should we keep within parent cell if imagecell has negative clearance??? +% XXX need to auto-place within images via \offsetleft... +% XXX add tweak support... +\newcommand\captionblockcell[2][]{% + % XXX should this be within the group??? + \setkeys{captionblockcell@args}{% + left, + valign=b, + clearance=\clearcaption, + spacing=\captioncellspacing, + #1}% + % + \smash{\makebox[0pt][l]{% + \begingroup% + % setup cell context... + \setlength\clearcaption{% + \photobook@captionblockcell@clearance}% + \setlength\photobook@captionblockcell@tmplen{\cellwidth}% + \setlength\cellwidth{% + \ifnum \photobook@captionblockcell@width = 0% + \dimexpr + \cellparentwidth + - \photobook@captionblockcell@spacing + - \cellwidth + - \clearcaption + % XXX this is only present in images... + - \clearance \relax% + \else% + \photobook@captionblockcell@width\fi}% + \setlength\cellparentwidth{% + \photobook@captionblockcell@tmplen}% + \setlength\celloffsetleft{% + \ifKV@captionblockcell@args@left% + \dimexpr + - \cellwidth% + - \photobook@captionblockcell@spacing \relax% + \else% + \dimexpr + \cellparentwidth + + \photobook@captionblockcell@spacing \relax% + \fi}% + % clear parent... + % XXX do we need this here??? + \ifKV@captionblockcell@args@constraintoparent% + % offset top... + \setlength\celloffsettop{% + \mindim{ + \photobook@captionblockcell@clearparent - \celloffsettop + }{ + \photobook@captionblockcell@clearparent}}% + % trim cell top... + \ifdim \celloffsettop > 0pt% + \setlength\cellheight{% + \cellheight - \celloffsettop}\fi% + % trim cell bottom... + \ifdim \dimexpr + \cellheight + + \celloffsettop \relax% + > \dimexpr + \cellparentheight + - \photobook@captionblockcell@clearparent \relax% + \setlength\cellheight{% + \dimexpr + \cellparentheight + - \mindim{ + \cellheight - \cellparentheight + }{ + 2\photobook@captionblockcell@clearparent} \relax}\fi% + % do not clear parent... + \else% + \setlength\celloffsettop{0pt}\fi% + % + % place... + \ifKV@captionblockcell@args@showbox% + \photobook@captionblockcell@content[0.1pt]{#2}% + \else% + \photobook@captionblockcell@content{#2}\fi% + \endgroup}}% + \ignorespaces} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Paper cells +% +%% Paper and page cells are very similar but differ in one aspect -- paper +%% cells represent the paper as indicated by |layoutmode=<layout>| while +%% page cells are always the size of the page block, i.e. |layoutmode=block|. +%% + +%% \DescribeEnv{papercell} +% +%% Paper cell. +%% +%% This does not include bleeds. +%% +\newenvironment{papercell}{% + \begin{cell*}{\bleed, \bleed}{\blockwidth}{\blockheight}% +}{% + \end{cell*}} + + +%% \DescribeEnv{paperbleedcell} +% +%% Paper bleed cell. +%% +%% Like |papercell| but includes bleeds. +%% +\newenvironment{paperbleedcell}{% + \begin{cell*}{0pt, 0pt}{\bleedblockwidth}{\bleedblockheight}% +}{% + \end{cell*}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Page cells +% +%% Page cells always correspond to the page block size, i.e. |layoutmode=block| +%% regardless of the actual |layoutmode| set currently. +%% + +%% \DescribeEnv{pagecell} +%% \DescribeEnv{pagecell*} +% +%% Page cell. +%% +%% This corresponds to the visible page in the |layoutmode=block| and +%% does not include bleeds. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <-> bleed <-> bleed +%% +%% + - - - - - - - - - + + bleed +%% . +---------------+ . v +%% . | | . +%% . | | . +%% . | pagecell | . +%% . | | . +%% . | | . +%% . +---------------+ . + bleed +%% + - - - - - - - - - + v +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% The star version accounts for |\bindingoffset|. +%% +%% Note that |layoutmode|'s other than block will change the paper size +%% but will not affect this either in size (block size) or in position +%% (top-left). +%% +\newenvironment{pagecell}{% + \begin{cell*}{\bleed,\bleed}{\pageblockwidth}{\pageblockheight}% +}{% + \end{cell*}} + +\newenvironment{pagecell*}{% + \begin{cell*}{% + \bleed + \ifnumodd{\thepage}{\bindingoffset}{0pt},% + \bleed}% + {\pageblockwidth - \bindingoffset}% + {\pageblockheight}% +}{% + \end{cell*}} + + +%% \DescribeEnv{pagebleedcell} +% +%% Like |page| but includes bleeds. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <-> bleed <-> bleed +%% +%% +-------------------+ + bleed +%% | + - - - - - - - + | v +%% | . . | +%% | . . | +%% | . pagebleedcell . | +%% | . . | +%% | . . | +%% | + - - - - - - - + | + bleed +%% +-------------------+ v +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Note that as with |pagecell| this is not affected by |layoutmode|. +%% +\newenvironment{pagebleedcell}{% + \begin{cell*}{0pt, 0pt}{\bleedblockwidth}{\bleedblockheight}% +}{% + \end{cell*}} + + + +% XXX EXPERIMENTAL / TEST... +\NewEnviron{shipoutbgcell}{% + \AddToShipoutPictureBG*{% + \begin{pagecell}% + \BODY% + \end{pagecell}}% + \ignorespaces} + + + +% XXX EXPERIMENTAL / TEST... +%% \DescribeEnv{textcell} +% +%% \EXPERIMENTAL +%% +%% A cell taking up the page text block. +% +%% >> \begin{textcell}{<width>}{<height>} ... \end{textcell} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% <-----------> \textwidth +%% +%% <-----------------> \pageblockwidth +%% +%% +-----------------+ ^ \pageblockheight +%% | | | +%% | +-----------+ | | ^ \textheight +%% | | | | | | +%% | | | | | | +%% | | textcell | | | | +%% | | | | | | +%% | | | | | | +%% | +-----------+ | | v +%% | | | +%% +-----------------+ v +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Note that this is an inline cell and if something is on the page it +%% may not be centered properly. +%% +\newenvironment{textcell}{% + \begin{inlinecell*}{\textwidth}{\textheight}% +}{% + \end{inlinecell*}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Foldout page cells +% +%% \EXPERIMENTAL +%% +%% A foldout is a special case cell that changes the page format. +%% +%% In addition to cell lengths a foldout defines a set of additional +%% lengths and lists within its context. +%% +%% \DescribeMacro{\pagefoldpanels=<list>} +%% \DescribeMacro{\pagefoldpanelfolds=<list>} +% +%% Lists page folded panel widths and fold types respectively. +%% +%% |pagefoldpanels| is set automatically for layouts other than |block| +%% and for foldout pages, changing this can mess up fold markers and +%% page cell placement. +%% +%% |pagefoldpanelfolds| is generated when creating a foldout. +%% +%% See: +%% \href{https://ctan.altspu.ru/macros/generic/listofitems/listofitems-en.pdf}{listofitems} +%% for list API. +%% +% XXX add a generic panel constructor.. +% \foldedcell[<height>]{<index>} +% NOTE: these are wrapped in \@ifundefined{..} to prevent overwriting when +% values are defined in \InitPages... +\@ifundefined{pagefoldpanels}{% + \def\pagefoldpanels{}}{} +\@ifundefined{pagefoldpanelfolds}{% + \def\pagefoldpanelfolds{}}{} + +%% \DescribeMacro{\foldoutwidth=<len>} +% +%% Total foldout page width, calculated when a foldout page is created. +%% +\newlength\foldoutwidth +\setlength\foldoutwidth{\blockwidth} + + +%% \DescribeEnv{foldout} +% +%% Create 2 or more pages in foldout mode. +% +%% >> \begin{foldout}[<fold-spec>] ... \end{foldout} +% +%% |<fold-spec>| can be a number of folds, or contain one or more fold +%% types (|in| or |out|), two or more panel widths (dimensions) or a +%% sequence of both (i.e. dim fold dim ...) where missing widths are +%% automatically calculated and missing folds are the same as the previous +%% fold or the default if no folds are specified. +%% +%% If not |<fold-spec>| is given, then the value of |\defaultfoldout| is +%% used (default: |2|). +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% v \flatfold v +%% +%% - --=----------------++---------------++--------------+ +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = .. .. | +%% = (1) .. (2) .. (3) | +%% - --=----------------++---------------++--------------+ +%% +%% +--------------++---------------++----------------=-- - +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | .. .. = +%% | (1) .. (2) .. (3) = +%% +--------------++---------------++----------------=-- - +%% +%% ^ \flatfold ^ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% +%% A foldout always starts on the right/odd page and will always end on +%% the left/even page. +%% +%% If |\foldoutpages{..}| is called on an even page, an empty normal +%% page will be created pushing the foldout to the right page of the +%% spread. If an odd number of pages is created the set will be padded +%% with an empty page before |\foldoutpages{..}| exits. +%% +%% +%% Foldout panel numbering +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% right page +%% - --=-------+-------+- --+-------+-------+ +%% = | | | | | +%% = (1) | (2) | ... | (n-1) | (n) | +%% = | | | | | +%% - --=-------+-------+-- -+-------+-------+ +%% +%% left page +%% +-------+-------+- --+-------+-------=-- - +%% | | | | | = +%% | (1) | (2) | ... | (n-1) | (n) = +%% | | | | | = +%% +-------+-------+-- -+-------+-------=-- - +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Formal |<fold-spec>| grammar: +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% <fold-spec> :: +%% <count> +%% | <fold> +%% | <panels> +%% <panels> ::= +%% <panel> +%% | <panel> <panels> +%% <panel> ::= +%% <width> <fold> +%% | <width> +%% | <fold> +%% <fold> ::= +%% in | out +%% \end{verbatim} +%% \end{minipage} +%% +% +%% \DescribeMacro{\clearfoldoutbinding=<len>} +%% \DescribeMacro{\clearfoldoutedge=<len>} +%% \DescribeMacro{\clearfoldoutfold=<len>} +% +%% Fold panel sizing for similar fold sequence: +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% \clearfoldoutedge <-> +%% \clearfoldoutfold <-> +%% <--> \clearfoldoutbinding +%% (3) /\ (2) +%% +---------------------------------+ / \ +%% +------------------------------- | / +%% -------------------------------------+ / (1) +%% ======================================== =====+===== +%% ======================================== +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Note that |in in| fold sequence is drawn, |out out| is identical in +%% sizing but reflectd. +%% +%% +%% Fold panel sizing for dissimilar fold sequence: +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% \clearfoldoutedge <-> / +%% <--> \clearfoldoutbinding (3) / +%% \ +%% +---------------------------------- \ (2) +%% +---------------------------------+ / +%% -------------------------------------+ / (1) +%% ======================================== =====+===== +%% ======================================== +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% |in out| is drawn, |out it| is the same but reflected. +%% +%% The size of the paper fold is set by |\flatfold|. +%% + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% Fold marks... + +% draw in/out fold mark... +% +% >> \foldinmark[<baseline>] +% >> \foldoutmark[<baseline>] +% +% NOTE: these should be used in a box. +% NOTE: these are centered in origin. +% +% XXX these can affect the items after -- need to encapsulate better + test... +% XXX do we need to make centering block size dependant on \foldmarksize +% or are the two independent??? (test) +% XXX MARKOFFSET for some reason splitting the \vspace{..} into a +% arg-dependant and a foldmarklen-dependant parts below yields +% wrong results... +% ...not that simply splitting the original into two \vspace{..} +% calls works fine... +\newsavebox\photobook@foldinmark +\newsavebox\photobook@foldoutmark +\newcommand\ResetFoldMarks{% + \sbox{\photobook@foldinmark}{% + % XXX MARKOFFSET + %\vspace{0.5\photobook@foldmarklen}% + \smash{\makebox[0pt][l]{% + % size-agnostic centering... + \hspace{-5mm}{\makebox[1cm][c]{% + \begin{tikzpicture}% + \draw[white, ultra thick] + (-0.3333\photobook@foldmarklen,0.3333\photobook@foldmarklen) + -- (0,0) + -- (0.3333\photobook@foldmarklen,0.3333\photobook@foldmarklen); + \draw[white, ultra thick] + (0,0.6666\photobook@foldmarklen) + -- (0,-0.3333\photobook@foldmarklen); + \draw[black, thin] + (-0.3333\photobook@foldmarklen,0.3333\photobook@foldmarklen) + -- (0,0) + -- (0.3333\photobook@foldmarklen,0.3333\photobook@foldmarklen); + \draw[black, thin] + (0,0.6666\photobook@foldmarklen) + -- (0,-0.3333\photobook@foldmarklen); + \end{tikzpicture}}}}}} + \sbox{\photobook@foldoutmark}{% + % XXX MARKOFFSET + %\vspace{0.5\photobook@foldmarklen}% + \smash{\makebox[0pt][l]{% + % size-agnostic centering... + \hspace{-5mm}{\makebox[1cm][c]{% + \begin{tikzpicture}% + \draw[white, ultra thick] + (-0.3333\photobook@foldmarklen,0) + -- (0,0.3333\photobook@foldmarklen) + -- (0.3333\photobook@foldmarklen,0); + \draw[white, ultra thick] + (0,0.6666\photobook@foldmarklen) + -- (0,-0.3333\photobook@foldmarklen); + \draw[black, thin] + (-0.3333\photobook@foldmarklen,0) + -- (0,0.3333\photobook@foldmarklen) + -- (0.3333\photobook@foldmarklen,0); + \draw[black, thin] + (0,0.6666\photobook@foldmarklen) + -- (0,-0.3333\photobook@foldmarklen); + \end{tikzpicture}}}}}}} +\ResetFoldMarks + +% XXX EXPERIMENTAL... +% XXX not sure if this should ever be needed... +%\newcommand\setfoldmarksize[1][6mm]{% +% \setlength\photobook@foldmarklen{#1}% +% %\edef\photobook@foldmarklen{#1}% +% \ResetFoldMarks} + +% >> \foldinmark[<baseline>] +\newcommand\foldinmark[1][0pt]{% + % XXX MARKOFFSET + %\vspace{#1}% + \vspace{\dimexpr 0.5\photobook@foldmarklen + #1 \relax}% + \usebox\photobook@foldinmark} +% >> \foldoutmark[<baseline>] +\newcommand\foldoutmark[1][0pt]{ + % XXX MARKOFFSET + %\vspace{#1}% + \vspace{\dimexpr 0.5\photobook@foldmarklen + #1 \relax}% + \usebox\photobook@foldoutmark} + +% >> \photobook@foldmark[<baseline>]{<type>}{<left>, <top>} +\newif\ifphotobook@foldmark@in +\newcommand\photobook@foldmark[3][0pt]{% + \begingroup% + \ifnumodd{\thepage}{% + \ifthenelse{\equal{#2}{in}}{% + \photobook@foldmark@intrue}{% + \photobook@foldmark@infalse}}{% + \ifthenelse{\equal{#2}{in}}{% + \photobook@foldmark@infalse}{% + \photobook@foldmark@intrue}}% + \begin{textblock*}{0pt}(#3)% + \ifphotobook@foldmark@in% + \foldinmark[#1]% + \else% + \foldoutmark[#1]\fi% + \end{textblock*}% + \endgroup} +\newcommand\photobook@topfoldmark[2][in]{% + \photobook@foldmark[-0.5\photobook@foldmarklen]{#1}{#2}} +\newcommand\photobook@bottomfoldmark[2][in]{% + \photobook@foldmark[0.5\photobook@foldmarklen]{#1}{#2}} +% >> \photobook@markfold[<fold>]{<offset>} +\newcommand\photobook@markfold[2][in]{% + \photobook@topfoldmark[#1]{ + #2, + \bleed + - \foldmarkoffset}% + \photobook@bottomfoldmark[#1]{ + #2, + \blockheight + + \bleed + + \foldmarkoffset}} + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +\newlength\photobook@foldout@panelwidth +\setlength\photobook@foldout@panelwidth{0pt} +\newlength\photobook@foldout@maxpanelwidth +\setlength\photobook@foldout@maxpanelwidth{0pt} +\edef\photobook@foldout@count{} +\edef\photobook@foldout@prevfold{in} + +% >> \photobook@foldout@pushpanel{<width>}{<fold>} +% +% XXX should we set maxpanelwidth when manually setting panel widths??? +% XXX might be good to warn the user if the manual fold will not work... +% after two folds in same direction panels must be strictly smaller... +% ...would be nice to maintain maxpanelwidth and warn if explicit +% width is larger... +\newcommand\photobook@foldout@pushpanel[2]{% + % initial max panel size... + \ifnum \thephotobook@foldoutpanel = 1% + \setlength\photobook@foldout@maxpanelwidth{% + \blockwidth + - \clearfoldoutedge}\fi% + % panel #2 -- clear binding... + \ifnum \thephotobook@foldoutpanel = 2% + \setlength\photobook@foldout@maxpanelwidth{% + \photobook@foldout@maxpanelwidth + - \clearfoldoutbinding}\fi% + % calculate widths... + \ifdim #1 = 0pt% + % first two panels do not need fold compensation... + \ifnum \thephotobook@foldoutpanel < 3% + \setlength\photobook@foldout@panelwidth{% + \photobook@foldout@maxpanelwidth + + \flatfold}% + \else% + % double fold twice in same direction... + \ifthenelse{\equal{#2}{\photobook@foldout@prevfold}}{% + \setlength\photobook@foldout@panelwidth{% + \photobook@foldout@maxpanelwidth + + \flatfold + - \clearfoldoutfold}% + % different fold directions -- no resizing needed here... + }{% + \setlength\photobook@foldout@panelwidth{% + \photobook@foldout@maxpanelwidth + + \flatfold}}\fi% + \setlength\photobook@foldout@maxpanelwidth{% + \photobook@foldout@panelwidth}% + % explicit width... + \else% + % XXX should we set the maxpanelwidth here too??? + % ...if yes, should we be more thorough and size it to the + % available space (accounting for last two folds)?? + %\setlength\photobook@foldout@maxpanelwidth{#1}% + \setlength\photobook@foldout@panelwidth{#1}\fi% + % accumulate width... + \setlength\foldoutwidth{ + \foldoutwidth + + \photobook@foldout@panelwidth}% + % panel spec lists... + \edef\pagefoldpanelfolds{% + \pagefoldpanelfolds,#2}% + \edef\pagefoldpanels{% + \pagefoldpanels,\the\photobook@foldout@panelwidth}% + \stepcounter{photobook@foldoutpanel}} + +% XXX also add this to jacket/cover/endpaper... +\newlength\photobook@showmarks@offset +\setlength\photobook@showmarks@offset{0pt} +\newcommand\photobook@showmarks{% + % XXX make this a list-length check... + \ifx \pagefoldpanels \empty \else% + \begingroup% + \setlength\photobook@showmarks@offset{\bleed}% + % NOTE: we need to iterate left/right pages in reverse order... + % NOTE: the below branches are similar but not identical... + \ifnumodd{\thepage}{% + \xintFor* ##1 in {\xintSeq{1}{\pagefoldpanelslen - 1}} \do {% + \setlength\photobook@showmarks@offset{ + \photobook@showmarks@offset + + \pagefoldpanels[##1]}% + % XXX HACK: it appears that we can't expand \pagefoldpanelfolds[##1] in [..]... + \edef\photobook@showmarks@tmp{\pagefoldpanelfolds[##1]}% + \photobook@markfold[\photobook@showmarks@tmp]{\photobook@showmarks@offset}}% + }{ + \xintFor* ##1 in {\xintSeq{\pagefoldpanelslen}{2}} \do {% + \setlength\photobook@showmarks@offset{ + \photobook@showmarks@offset + + \pagefoldpanels[##1]}% + % XXX HACK: it appears that we can't expand \pagefoldpanelfolds[##1] in [..]... + \edef\photobook@showmarks@tmp{\pagefoldpanelfolds[##1 - 1]}% + \photobook@markfold[\photobook@showmarks@tmp]{\photobook@showmarks@offset}}}% + \endgroup\fi} +\AtBeginShipout{% + \iffoldmarks% + \photobook@showmarks\fi} + +\newcounter{photobook@foldoutpanel} +\setcounter{photobook@foldoutpanel}{1} + +\newenvironment{foldout}[1][\defaultfoldout]{% + \begingroup% + \setsepchar{ }% + \readlist*\photobook@foldout@args{#1}% + % + % defaults... + \setcounter{photobook@foldoutpanel}{1} + \setlength\foldoutwidth{0pt}% + \edef\photobook@foldout@prevfold{\pagefold}% + % + % panel count... + \ifnum \photobook@foldout@argslen = 1% + % in/out... + \ifthenelse{ + \equal{#1}{in} + \OR \equal{#1}{out}}{% + \edef\photobook@foldout@count{2}% + \edef\photobook@foldout@prevfold{#1}% + % count... + }{% + \edef\photobook@foldout@count{#1}}% + % + % build the panels... + \xintFor* ##1 in {\xintSeq{1}{\photobook@foldout@count}} \do {% + \photobook@foldout@pushpanel{% + 0pt}{\photobook@foldout@prevfold}}% + % fold spec... + \else% + \foreachitem \photobook@foldout@opt \in \photobook@foldout@args{% + % in/out... + \ifthenelse{ + \equal{\photobook@foldout@opt}{in} + \OR \equal{\photobook@foldout@opt}{out}}{% + \photobook@foldout@pushpanel{% + \photobook@foldout@panelwidth}{\photobook@foldout@opt}% + % prep for next panel... + \edef\photobook@foldout@prevfold{% + \photobook@foldout@opt}% + \setlength\photobook@foldout@panelwidth{0pt}% + % explicit size... + }{% + % finalize prev panel... + \ifdim \photobook@foldout@panelwidth > 0pt% + \photobook@foldout@pushpanel{% + \photobook@foldout@panelwidth}{\photobook@foldout@prevfold}\fi% + % + \setlength\photobook@foldout@panelwidth{\photobook@foldout@opt}}}% + % add trailing panel... + \photobook@foldout@pushpanel{% + \photobook@foldout@panelwidth}{\photobook@foldout@prevfold}% + \fi% + % prepare data for cells... + \setsepchar{,}% + % NOTE: the first element is empty due to how we create these + % i.e. ('' + ',<value>')... + \ignoreemptyitems% + \readlist*\pagefoldpanelfolds{\pagefoldpanelfolds}% + \readlist*\pagefoldpanels{\pagefoldpanels}% + % + % pages... + % NOTE: we'll keep the start of the foldout set at the right page + % and end it on the left page. + \cleardoublepage% + \begin{resizedpages}{\foldoutwidth}{\blockheight}% + \ignorespaces% +}{% + \cleardoublepage% + \end{resizedpages}% + \endgroup} + + +%% \DescribeEnv{foldoutcell} +%% \DescribeEnv{foldoutcell*} +% +%% Create a cell spanning one or more foldout panels. +% +%% >> \begin{foldoutcell}[<num>] ... \end{foldoutcell} +%% >> \begin{foldoutcell}[<from>-<to>] ... \end{foldoutcell} +% +%% If no arguments are given this will create a panel at |foldoutpanel| +%% counter and increment it by one. +% +%% >> \begin{foldoutcell} ... \end{foldoutcell} +% +%% This will also auto-advance the page when all panels are filled. +%% +%% Note that manual panel placement has no effect on the panel counter +%% thus care must be taken when mixing manual and auto-advanced panels. +%% Also note that |foldoutpanel|'s value is not maintained within manually +%% placed panels and should be treated as undefined. +%% +%% |foldoutcell*| is the same as the non-star version but creates cells +%% including bleeds. +%% +%% Neither version clips its content, to explicitly clip use the |cliptocell| +%% environment. +%% +%% These can only be used from within a |foldout| cell. +%% +% XXX should we be able to turn clipping on/off??? + +\newlength\photobook@foldoutcell@left +\setlength\photobook@foldoutcell@left{0pt} +\newlength\photobook@foldoutcell@width +\setlength\photobook@foldoutcell@width{0pt} + +% calculate offset via \pagefoldpanels and write to dimension <name>... +% >> \photobook@foldoutcell@setfoldoutoffset{<name>}{<from>}{<to>} +% +% NOTE: [<from>, <to>[ -- i.e. <to> is not included... +\newcommand\photobook@foldoutcell@setfoldoutoffset[3]{% + \expandafter\setlength\csname #1\endcsname{0pt}% + \ifnum \numexpr #2 \relax < \numexpr #3 \relax% + \xintFor* ##1 in {% + \xintSeq{#2}{\xintiiMin{#3}{\pagefoldpanelslen + 1} - 1}} \do {% + \ifnumodd{\thepage}{% + \expandafter\setlength\csname #1\endcsname{% + \csname #1\endcsname% + + \pagefoldpanels[##1]} + }{% + \expandafter\setlength\csname #1\endcsname{% + \csname #1\endcsname% + + \pagefoldpanels[-\numexpr ##1 \relax]}}}\fi} + +% foldout panel auto-advance counter... +\newcounter{foldoutpanel} +\setcounter{foldoutpanel}{0} +\edef\photobook@foldoutcell@from{0} +% reset panel count on each page... +\AtBeginShipout{% + \setcounter{foldoutpanel}{0} + \edef\photobook@foldoutcell@from{% + \thefoldoutpanel}} + +% set panel left/width dimensions (helper)... +% >> \photobook@foldoutcell@setdimensions[<panel-spec>] +% +% NOTE: for <panel-spec> see docs for foldoutcell/foldoutcell*... +\newcommand\photobook@foldoutcell@setdimensions[1][0]{ + % parse args... + \setsepchar{-}% + \readlist*\photobook@foldoutcell@panels{#1}% + % + % auto advance panel... + \ifnum \photobook@foldoutcell@panels[1] = 0% + % auto advance page... + \ifnum \value{foldoutpanel} = \pagefoldpanelslen% + % NOTE: this will reset the counter... + \newpage\fi% + \stepcounter{foldoutpanel}% + \global\edef\photobook@foldoutcell@from{% + \thefoldoutpanel}% + % explicit panels... + \else% + \global\edef\photobook@foldoutcell@from{ + \photobook@foldoutcell@panels[1]}\fi% + % left offset... + \photobook@foldoutcell@setfoldoutoffset{photobook@foldoutcell@left}{% + 1 + }{% + \photobook@foldoutcell@from}% + % panel from-to width... + \ifnum \photobook@foldoutcell@panelslen > 1% + \photobook@foldoutcell@setfoldoutoffset{photobook@foldoutcell@width}{% + \photobook@foldoutcell@from% + }{% + \photobook@foldoutcell@panels[2] + 1}% + % panel N width... + \else% + \ifnumodd{\thepage}{% + \setlength\photobook@foldoutcell@width{% + \pagefoldpanels[{\photobook@foldoutcell@from}]} + }{% + \setlength\photobook@foldoutcell@width{% + \pagefoldpanels[-\numexpr \photobook@foldoutcell@from \relax]}}\fi} + +\newenvironment{foldoutcell}[1][0]{% + % XXX check if outside of foldout -> warn... + \begingroup% + \photobook@foldoutcell@setdimensions[#1]% + \begin{cell*}{% + \bleed + + \photobook@foldoutcell@left,% + \bleed}% + {\photobook@foldoutcell@width}% + {\pageblockheight}% +}{% + \end{cell*}% + \endgroup} + +\newenvironment{foldoutcell*}[1][0]{% + % XXX check if outside of foldout -> warn... + \begingroup% + \photobook@foldoutcell@setdimensions[#1]% + % add bleed to first/last panel... + \ifnum \photobook@foldoutcell@from = 1% + \setlength\photobook@foldoutcell@width{% + \bleed + + \photobook@foldoutcell@width} + \else% + \setlength\photobook@foldoutcell@left{% + \bleed + + \photobook@foldoutcell@left}\fi% + \ifnum \photobook@foldoutcell@from = \pagefoldpanelslen% + \setlength\photobook@foldoutcell@width{% + \bleed + + \photobook@foldoutcell@width}\fi% + \begin{cell*}{% + \photobook@foldoutcell@left,% + 0pt}% + {\photobook@foldoutcell@width}% + {\pageblockheight + 2\bleed}% +}{% + \end{cell*}% + \endgroup} + + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Multi-page cells +% +%% \DescribeEnv{spreadtopages} +%% \DescribeEnv{spreadtopages*} +%% \DescribeMacro{\usespreadpage\{..\}} +%% \DescribeMacro{\usespreadpage*\{..\}} +% +%% Spread cell into pages. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +----------------------------------- - +%% | <-- input cell +%% | . . . +%% | Oversized content cell... +%% | . . . +%% | +%% +----------.----------.----------.-- - +%% . . . . . . . +%% . . . . . . . +%% +----------+ +----------+ +----------+ +-- - +%% | | | | | | | <-- output pages +%% | | | | | | | +%% | Overs| |ized conte| |nt cell...| | +%% | | | | | | | +%% | | | | | | | +%% +----------+ +----------+ +----------+ +-- - +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% |spreadtopages| creates a cell and spreads it into pages right away. +%% +%% >> \begin{spreadtopages} .. \end{spreadtopages} +%% >> \begin{spreadtopages}[<page-count>] .. \end{spreadtopages} +%% +%% |spreadtopages*| creates a named save cell only allowing the pages +%% to be placed manually via |\usespreadpage{..}|. +%% +%% >> \begin{spreadtopages*}{<name>} .. \end{spreadtopages*} +%% >> \begin{spreadtopages*}[<page-count>]{<name>} .. \end{spreadtopages*} +%% +%% |\usespreadpage{..}| places a page from a saved cell. +%% +%% >> \usespreadpage{<name>} +%% >> \usespreadpage[<page-num>]{<name>} +%% +%% |\usespreadpage*{..}| is the same as the non-star version but will +%% not use a |page| environment, enabling the user to populate the page +%% with other elements. +%% +%% Page numbers are 1-based. +%% +%% Note that the cell created by |spreadtopages*| env is a normal save +%% cell and can be manipulated via |\usecell{..}| and |\usecell*{..}|. +%% +% XXX add nudge/grow support... + +\NewEnviron{spreadtopages*}[2][2]{% + % setup page count... + \@ifundefined{thespreadtopages#2page}{% + \newcounter{spreadtopages#2page}}{} + \setcounter{spreadtopages#2page}{1} + % + \begingroup% + % create the actual cell... + \setlength\cellparentwidth{\cellwidth}% + \setlength\cellparentheight{\cellheight}% + \setlength\cellwidth{#1\pageblockwidth}% + \setlength\cellheight{\pageblockheight}% + % + \gsavecell{#2}{\cellwidth}{\cellheight}{\BODY}% + \endgroup% + \ignorespaces} + +% NOTE: this essentially counts pages, \usecell{..} / \usecell*{..} are +% better suited for custom stuff... +% NOTE: page is a 1 based offset in pages and can be fractional... +% NOTE: \usecell*{..} takes care of all the bleed calculations... +\def\usespreadpage{\@ifstar{% + \photobook@usespreadpage@star% + }{% + \photobook@usespreadpage}} +\newcommand\photobook@usespreadpage@star[2][]{% + \begin{pagecell}% + % auto advance pages... + \ifthenelse{\equal{#1}{}}{% + \usecell*{#2}% + (0pt, \numexpr \value{spreadtopages#2page} - 1 \relax\cellwidth)% + {\cellwidth}{\cellheight}% + \stepcounter{spreadtopages#2page}% + % manual page selected... + }{% + \usecell*{#2}% + (0pt, \numexpr #1 - 1 \relax\cellwidth)% + {\cellwidth}{\cellheight}}% + \end{pagecell}} +\newcommand\photobook@usespreadpage[2][]{% + \begin{page}% + \usespreadpage*[#1]{#2}% + \end{page}} + +\NewEnviron{spreadtopages}[1][2]{% + \begingroup% + % create the actual cell... + \setlength\cellparentwidth{\cellwidth}% + \setlength\cellparentheight{\cellheight}% + \setlength\cellwidth{#1\pageblockwidth}% + \setlength\cellheight{\pageblockheight}% + % + \savecell{photobook@spreadtopages}{\cellwidth}{\cellheight}{\BODY}% + % + % place the pages... + \foreach \photobook@spreadtopages@page in {1, ..., #1}{% + \usespreadpage[\photobook@spreadtopages@page]{photobook@spreadtopages}}% + \endgroup% + \ignorespaces} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Endpaper cells +% +%% \DescribeEnv{leftside} +%% \DescribeEnv{rightside} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +---------------+---------------+ +%% | | | +%% | | | +%% | leftside | rightside | +%% | | | +%% | | | +%% +---------------+---------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% + +% XXX for some reason naming these anything starting with endpaper will +% make LaTeX complain that that is already defined... +% ...collision with bools??? +\newenvironment{leftside}{% + \begin{pagecell}% +}{% + \end{pagecell}} + +\newenvironment{rightside}{% + \begin{cell*}% + {\bleed + \pageblockwidth, \bleed}% + {\pageblockwidth}{\pageblockheight}% +}{% + \end{cell*}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Cover and dust jacket cells +% +%% \DescribeEnv{frontcover} +%% \DescribeEnv{backcover} +% +%% \DescribeEnv{spine} +%% \DescribeEnv{vspine} +% +%% \DescribeEnv{frontflap} +%% \DescribeEnv{backflap} +% +%% Covers and dust jackets differ only in that covers do not {usually} +%% have flaps. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% backflap spline/vspine frontflap +%% . backcover . frontcover . +%% v v v v v +%% +---+---------------+---+---------------+---+ +%% | | | | | | +%% | | | | | | +%% | | Back | | Front | | +%% | | | | | | +%% | | | | | | +%% +---+---------------+---+---------------+---+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +\newenvironment{frontcover}{% + \begin{cell*}{ + \bleed + + \jacketflapback + + \coverflap + + \jacketwrap + + \coverboardgrow + + \pageblockwidth + + 2\spinefold + + \spinewidth, + \bleed + + \coverflap }% + { \pageblockwidth + \coverboardgrow }% + { \pageblockheight + 2\coverboardgrow }% +}{% + \end{cell*}} + +\newenvironment{backcover}{% + \begin{cell*}{ + \bleed + + \jacketflapback + + \coverflap + + \jacketwrap, + \bleed + + \coverflap }% + { \pageblockwidth + \coverboardgrow }% + { \pageblockheight + 2\coverboardgrow }% +}{% + \end{cell*}} + + +% spines... +% +\newenvironment{spine}{% + \begin{cell*}{ + \bleed + + \jacketflapback + + \coverflap + + \jacketwrap + + \coverboardgrow + + \pageblockwidth + + \spinefold, + \bleed + + \coverflap }% + { \spinewidth }% + { \pageblockheight + 2\coverboardgrow }% +}{% + \end{cell*}} + +\newenvironment{vspine}[1][topdown]{% + \def\photobook@vspine@orientation{#1}% + % + \begin{spine}% + \begin{\photobook@vspine@orientation}% +}{% + \end{\photobook@vspine@orientation}% + \end{spine}} + + +% jackets flaps... +% +\newenvironment{frontflap}{% + \begin{cell*}{ + \bleed + + \jacketflapback + + 2\jacketwrap + + 2\coverboardgrow + + 2\pageblockwidth + + 2\spinefold + + \spinewidth, + \bleed + + \coverflap }% + { \jacketflapfront }% + { \pageblockheight + 2\coverboardgrow }% +}{% + \end{cell*}} + +\newenvironment{backflap}{% + \begin{cell*}{ + \bleed, + \bleed + + \coverflap }% + { \jacketflapback }% + { \pageblockheight + 2\coverboardgrow }% +}{% + \end{cell*}} + + + +%---------------------------------------------------------------------- +%%%% Caption Templates +% XXX need to be able to configure/pass/override: +% - size / \captionsize... +% - color... + +%% \DescribeMacro{\captionsize\{..\}} +% +%% Defines the caption font. +%% +%% Can be redefined to control caption font/style. +%% +\ResettableMacro{captionsize}{% + \fontsize{6.5pt}{8pt}\selectfont} + + +%% \DescribeMacro{\captionformat\{..\}} +% +%% General caption format. +% +%% >> \captionformat{<code>} +% +%% This can be redefined to control the image caption. +%% +\ResettableMacro{captionformat}[1]{% + \adjustbox{ + margin=0.1em 0.2em, + varwidth=\cellwidth}{% + \captionsize #1}} + + + +%---------------------------------------------------------------------- +%%%% Page Templates +% +%% This section contains a set of predefined configurable single-page +%% templates. +%% +% XXX PRECLEAR this may lead to pages collapsing on each other, test... +% +%% Note that most page templates do not |\clearpage| before expanding, +%% this enables one to prepend elements (like pdf comments), if clearing +%% a page is required add |\clearpage| manually before the template. +%% + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Tweaking +% +%% Most page/spread templates provide an ability to externally "tweak" +%% some image proportions. +%% +%% This is an alternative means to setting template properties, e.g: +% +%% \begin{verbatim} +%% \tweakimagescale{0.8} +%% \ImagePage{image} +%% \end{verbatim} +% +%% Is equivalent to: +% +%% >> \ImagePage[scale=0.8]{image} +% +%% Tweaks get reset after each template. +%% + + +%% \DescribeMacro{\imagescale=<num>} +%% \DescribeMacro{\imageoffsettop=<len>} +%% \DescribeMacro{\imageoffsetleft=<len>} +% +%% Tweak next image templates scale/offsettop/offsetleft +%% +%% Note that |\imagescale| is not a length. +% +%% >> \edef\imagescale{<scale>} +%% >> \setlength\imageoffsettop{<len>} +%% >> \setlength\imageoffsetleft{<len>} +%% +\edef\imagescale{1} +% NOTE: these are initialized later by \resetimagetweaks... +\newlength\imageoffsettop +\newlength\imageoffsetleft + +%% \DescribeMacro{\tweakimagescale\{..\}} +%% \DescribeMacro{\tweakimageoffsettop\{..\}} +%% \DescribeMacro{\tweakimageoffsetleft\{..\}} +% +%% Convenience commands +%% +%% These provide a uniform interface for tweaking. +% +%% >> \tweakimagescale{<scale>} +%% >> \tweakimageoffsettop{<len>} +%% >> \tweakimageoffsetleft{<len>} +%% +\newcommand\tweakimagescale[1]{% + \edef\imagescale{#1}} + +\newcommand\tweakimageoffsettop[1]{% + \setlength\imageoffsettop{#1}} + +\newcommand\tweakimageoffsetleft[1]{% + \setlength\imageoffsetleft{#1}} + + +%% \DescribeMacro{\resetimagetweaks\{..\}} +% +%% Reset tweaked values. +%% +\newcommand\resetimagetweaks{% + \edef\imagescale{1}% + \setlength\imageoffsettop{0pt}% + \setlength\imageoffsetleft{0pt}} + +% setup initial state... +\resetimagetweaks + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +% meta-commands... + +%M \DescribeMacro{\ImagePageTemplate\{..\}} +% +%M >> \ImagePageTemplate{<name>}{<code>} +% +%M This will define two commands: +% +%M >> \<name>[<options>]{<caption>}{<code>} +%M >> \<name>*[<options>]{<caption>}{<code>} +% +%M |\<name>{..}| will use |\<name>Caption{..}| template command to typeset +%M the image caption while |\<name>*{..}| will show the caption as-is. +%M +\def\ImagePageTemplate#1#2{% + % handle <macro>* version... + \expandafter\def\csname #1\endcsname{\@ifstar{% + \csname photobook@ImagePageTemplate@#1@star\endcsname% + }{% + \csname photobook@ImagePageTemplate@#1\endcsname}}% + % main implementation (raw caption)... + \expandafter\newcommand\csname photobook@ImagePageTemplate@#1@star\endcsname[3][]{% + #2% + \resetimagetweaks}% + % main implementation with caption template... + \expandafter\newcommand\csname photobook@ImagePageTemplate@#1\endcsname[3][]{% + \csname photobook@ImagePageTemplate@#1@star\endcsname[##1]{% + \@ifundefined{#1Caption}{% + ##2% + }{% + \csname #1Caption\endcsname{##2}}}{##3}}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +\newsavebox\photobook@imagebox + + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% General interface +% +%% A templates provide a uniform interface consisting of several commands: +%% +%% Base template command: +% +%% >> \<template-name>{<caption>}{<image>} +%% >> \<template-name>[<options>]{<caption>}{<image>} +% +%% |<options>| is the same as for |\imagecell{..}|. +%% +%% Template-specific caption command: +% +%% >> \<template-name>Caption{<caption>} +% +%% This can be redefined to control typesetting the caption for all +%% consecutive templates. +%% +%% Reset template caption to default: +% +%% >> \reset<template-name>Caption +% +%% An equivalent to the non-star version but use the caption as-is: +% +%% >> \<template-name>*{<caption>}{<image>} +%% >> \<template-name>*[<options>]{<caption>}{<image>} +% +%% Note that thogh some template versions differ only in |<options>| +%% defaults passed to |\imagecell{..}|, they are split to provide ability +%% to configure the template defaults separately. +%% + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% No bleed + +%% \DescribeMacro{\ImagePage\{..\}} +%% \DescribeMacro{\ImagePageCaption\{..\}} +%% \DescribeMacro{\resetImagePageCaption} +%% \DescribeMacro{\ImagePage*\{..\}} +% +%% Basic image page +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +-----------------+ +%% | | +%% | +-------------+ | +%% | | . . | | +%% | | . . | | +%% | | image | | +%% | | . . | | +%% | | . . | | +%% | +-------------+ | +%% | c | +%% | | +%% +-----------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Create an image page: +%% +%% Note that |\ImagePage{..}| only supports tweaking |scale|, this is +%% intentional ad tweaking offset will mess up page alignment relative +%% to other pages in a book. +%% +\ResettableMacro{ImagePageCaption}[1]{% + \captioncell[under, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePage}{% + % XXX PRECLEAR do we need clear page here??? + %\clearpage% + \begin{page}% + \begin{pagecell*}% + \begin{minipage}[t][\cellheight][c]{\cellwidth}% + \vspace{\imageblockoffsettop\pagetextheight}% + \begin{center}% + \begin{inlinecell*}% + {\imageblockwidth\pagetextwidth}% + {\imageblockheight\pagetextheight}% + \imagecell[fit, + scale=\imagescale, + %captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{inlinecell*}% + \end{center}% + \end{minipage}% + \end{pagecell*}% + \end{page}} + + +%% \DescribeMacro{\ImagePageClear\{..\}} +%% \DescribeMacro{\ImagePageClearCaption\{..\}} +%% \DescribeMacro{\resetImagePageClearCaption} +%% \DescribeMacro{\ImagePageClear*\{..\}} +% +%% >> \ImagePageClear[<options>]{<caption>}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% \clearimage \clearimage +%% v v +%% +-----------------+ +-----------------+ < \clearimage +%% | | | +-----------+ | +%% |+---------------+| | | . . | | +%% || . . || | | . . | | +%% || . . || | | . . | | +%% || image || | | image | | +%% || . . || | | . . | | +%% || . . || | | . . | | +%% |+---------------+| | | . . | | +%% | c | | +-----------+ | +%% +-----------------+ +-----------------+ < \clearimage +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Default image clearance is set by |\clearimage| global length. +%% +%% This respects |\bindingoffset|. +%% +% XXX make captions adaptive??? +\ResettableMacro{ImagePageClearCaption}[1]{% + \captioncell[under, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageClear}{% + % XXX PRECLEAR do we need clear page here??? + %\clearpage% + \begin{page}% + % NOTE: this accounts for \bindingoffset... + \begin{pagecell*}% + \imagecell[% + center, + clearance=\clearimage, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{pagecell*}% + \end{page}} + + +%% \DescribeMacro{\ImagePageClear<D>\{..\}} +%% \DescribeMacro{\ImagePageClear<D>Caption\{..\}} +%% \DescribeMacro{\resetImagePageClear<D>Caption} +%% \DescribeMacro{\ImagePageClear<D>*\{..\}} +% +%% |<D>| can be one of T, B, L or R, for top, bottom, left and right +%% respectively. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +-----------------+ +-----------------+ +%% | +-------------+ | | | +%% | | . . | | | c | +%% | | . . | | | +-------------+ | +%% | | image | | | | . . | | +%% | | . (T) . | | | | . . | | +%% | | . . | | | | image | | +%% | +-------------+ | | | . (B) . | | +%% | c | | | . . | | +%% | | | +-------------+ | +%% +-----------------+ +-----------------+ +%% +%% +-----------------+ +-----------------+ +%% | +---------+ | | +---------+ | +%% | |. .| | | |. .| | +%% | | . . | | | | . . | | +%% | | . . | | | | . . | | +%% | | image | | | | image | | +%% | | .(L). | | | | .(R). | | +%% | | . . | | | | . . | | +%% | |. .| | | |. .| | +%% | +---------+ c | | c +---------+ | +%% +-----------------+ +-----------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX TEST... +\ResettableMacro{ImagePageClearTCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +% XXX the image seems to be a line too low... +\ImagePageTemplate{ImagePageClearT}{% + \ImagePageClear*[% + top, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageClearBCaption}[1]{% + \captioncell[over]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageClearB}{% + \ImagePageClear*[% + bottom, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageClearLCaption}[1]{% + \captionblockcell[right, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageClearL}{% + \ImagePageClear*[% + left, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageClearRCaption}[1]{% + \captionblockcell[left, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageClearR}{% + \ImagePageClear*[% + right, + #1]{#2}{#3}} + + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Partial bleed + +%% \DescribeMacro{\ImagePageFit\{..\}} +%% \DescribeMacro{\ImagePageFitCaption\{..\}} +%% \DescribeMacro{\resetImagePageFitCaption} +%% \DescribeMacro{\ImagePageFit*\{..\}} +% +%% Fit image into page... +% +%% >> \ImagePageFit[<options>]{<caption>}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . +%% +-----------------+ +-----------------+ +%% | | | |. .| | +%% . +-----------------+ . | | . . | | +%% . | . . | . | | . . | | +%% . | . . | . | | . . | | +%% . | image | . | | image | | +%% . | . . | . | | . . | | +%% . | . . | . | | . . | | +%% . +-----------------+ . | | . . | | +%% | c | | |. c.| | +%% +-----------------+ +-----------------+ +%% . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Default image clearance is set by |\bleed| global length. +%% +%% If centered image fits vertically this will account for |\bindingoffset|. +%% +% XXX make captions adaptive??? +\ResettableMacro{ImagePageFitCaption}[1]{% + \captioncell[under, align=flushright]{% + \captionformat{#1}}} + +\newif\ifphotobook@ImagePageFit@centered +\photobook@ImagePageFit@centeredfalse + +\newlength\photobook@ImagePageFit@imgratio +\newlength\photobook@ImagePageFit@cellratio +\def\photobook@ImagePageFit@opt{} +\def\photobook@ImagePageFit@args{} + +\ImagePageTemplate{ImagePageFit}{% + \begingroup% + % see if default alignment is overridden... + \setsepchar{,}% + \ignoreemptyitems% + \readlist*\photobook@ImagePageFit@args{moo, #1}% + \foreachitem\photobook@ImagePageFit@opt\in\photobook@ImagePageFit@args{% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{fill}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{inner}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{outer}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{top}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{left}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{bottom}}{% + \photobook@ImagePageFit@centeredtrue}{}% + \ifthenelse{\equal{\photobook@ImagePageFit@opt}{right}}{% + \photobook@ImagePageFit@centeredtrue}{}}% + % align center -> check if image fits vertically... + \ifphotobook@ImagePageFit@centered\else% + \sbox{\photobook@imagebox}{\includegraphics{#3}}% + \setlength\photobook@ImagePageFit@imgratio{% + 1pt * \ratio{\wd\photobook@imagebox}{\ht\photobook@imagebox}}% + % NOTE: subtracting \bindingoffset from \cellwidth here makes sure that + % we avoid offsetting images close enough in ratio to the page and + % messing up bleeds... + \setlength\photobook@ImagePageFit@cellratio{% + 1pt * \ratio{\cellwidth - \bindingoffset}{\cellheight}}% + \ifdim \photobook@ImagePageFit@imgratio > \photobook@ImagePageFit@cellratio% + \photobook@ImagePageFit@centeredtrue\fi\fi% + % + % ignore \bindingoffset -> center the image... + \ifphotobook@ImagePageFit@centered% + % XXX PRECLEAR do we need clear page here??? + %\clearpage% + \begin{page}% + % NOTE: this does not account for \bindingoffset... + \begin{pagecell}% + \imagecell[% + center, + clearance=-\bleed, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{pagecell}% + \end{page}% + % special case: centered vertical image -> account for \bindingoffset... + \else% + \ImagePageClear*[% + clearance=-\bleed, + #1]{#2}{#3}\fi% + \endgroup} + + +%% \DescribeMacro{\ImagePageFit<D>\{..\}} +%% \DescribeMacro{\ImagePageFit<D>Caption\{..\}} +%% \DescribeMacro{\resetImagePageFit<D>Caption} +%% \DescribeMacro{\ImagePageFit<D>*\{..\}} +% +%% |<D>| can be one of T, B, L or R, for top, bottom, left and right +%% respectively. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . +%% . +-----------------+ . +-----------------+ +%% . | . . | . | | +%% . | . . | . | | +%% . | image | . | | +%% . | . (T) . | . . |-----------------| . +%% . | . . | . . | . . | . +%% . |-----------------| . . | . . | . +%% | | . | image | . +%% | | . | . (B) . | . +%% | | . | . . | . +%% +-----------------+ . +-----------------+ . +%% . . . . . . . . . . . . +%% +%% . . . . . . . . . . . . . . . . +%% . +-----------------+ +-----------------+ . +%% . |. .| | | |. .| . +%% . | . . | | | | . . | . +%% . | . . | | | | . . | . +%% . | . . | | | | . . | . +%% . | image | | | | image | . +%% . | .(L). | | | | .(R). | . +%% . | . . | | | | . . | . +%% . | . . | | | | . . | . +%% . |. .| c | | c |. .| . +%% . +-----------------+ +-----------------+ . +%% . . . . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +\ResettableMacro{ImagePageFitTCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageFitT}{% + \ImagePageFit*[% + top, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageFitBCaption}[1]{% + \captioncell[over]{% + \captionformat{#1}}} +% XXX the image seems a bit too low... +\ImagePageTemplate{ImagePageFitB}{% + \ImagePageFit*[% + bottom, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageFitLCaption}[1]{% + \captionblockcell[right, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageFitL}{% + \ImagePageFit*[% + left, + #1]{#2}{#3}} + +\ResettableMacro{ImagePageFitRCaption}[1]{% + \captionblockcell[left, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageFitR}{% + \ImagePageFit*[% + right, + #1]{#2}{#3}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Full bleed + +%% \DescribeMacro{\ImagePageFill\{..\}} +%% \DescribeMacro{\ImagePageFillCaption\{..\}} +%% \DescribeMacro{\resetImagePageFillCaption} +%% \DescribeMacro{\ImagePageFill*\{..\}} +% +%% Like |\ImagePage| but will fill page with image. +% +%% >> \ImagePageFill[<options>]{<caption>}{<image>} +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . . . . . . . . +%% . . +-----------------+ . . +%% . . | c | . . +%% . .| |. . +%% . | . . | . +%% . | . . | . +%% . | image | . +%% . | . . | . +%% . | . . | . +%% . .| |. . +%% . . | | . . +%% . . +-----------------+ . . +%% . . . . . . . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +%% Default image clearance is set by |\bleed| global length. +%% +\ResettableMacro{ImagePageFillCaption}[1]{% + \captioncell[top, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImagePageFill}{% + \ImagePageFit*[% + fill, + #1]{#2}{#3}} + + +%% \DescribeMacro{\ImageHalfPageL\{..\}} +%% \DescribeMacro{\ImageHalfPageLCaption\{..\}} +%% \DescribeMacro{\resetImageHalfPageLCaption} +%% \DescribeMacro{\ImageHalfPageL*\{..\}} +% +%% Left half of image filling page with full bleed. +% +%% >> \imageleftspreadfullbleed[<vertical-offset>]{<caption>}{<image>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . . +%% . +-----------------= +%% . | . = +%% . | . = +%% . | . = +%% . | . = +%% . | image +%% . | . = +%% . | . = +%% . | . = +%% . | . c = +%% . +-----------------= +%% . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX TEST... +% XXX do a better default... +\ResettableMacro{ImageHalfPageLCaption}[1]{% + \captioncell[bottom, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageHalfPageL}{% + \begin{spreadtopages*}[2]{photobook@ImageHalfPageL@cell}% + \imagecell[% + fill, + clearance=-\bleed, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{spreadtopages*}% + % + % XXX PRECLEAR do we need clear page here??? + %\clearpage% + \usespreadpage[1]{photobook@ImageHalfPageL@cell}} + + + +%% \DescribeMacro{\ImageHalfPageR\{..\}} +%% \DescribeMacro{\ImageHalfPageRCaption\{..\}} +%% \DescribeMacro{\resetImageHalfPageRCaption} +%% \DescribeMacro{\ImageHalfPageR*\{..\}} +% +%% Right half of image filling page with full bleed. +% +%% >> \imagerightspreadfullbleed[<vertical-offset>]{<caption>}{<image>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . . +%% =-----------------+ . +%% = . | . +%% = . | . +%% = . | . +%% = . | . +%% image | . +%% = . | . +%% = . | . +%% = . | . +%% = . c | . +%% =-----------------+ . +%% . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX TEST... +% XXX do a better default... +\ResettableMacro{ImageHalfPageRCaption}[1]{% + \captioncell[bottom, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageHalfPageR}{% + \begin{spreadtopages*}[2]{photobook@ImageHalfPageR@cell}% + \imagecell[% + fill, + clearance=-\bleed, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{spreadtopages*}% + % + % XXX PRECLEAR do we need clear page here??? + %\clearpage% + \usespreadpage[2]{photobook@ImageHalfPageR@cell}} + + + +%---------------------------------------------------------------------- +%%%% Spread Templates + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% No bleed + +% XXX TEST!! +% XXX doc... +% XXX Should we make this just like with pages, i.e. \imagePage{..} and +% \ImagePageFit{..}, the first places relative to text and raises +% slightly while the second simply centers... +%% \DescribeMacro{\ImageSpread\{..\}} +%% \DescribeMacro{\ImageSpreadCaption\{..\}} +%% \DescribeMacro{\resetImageSpreadCaption} +%% \DescribeMacro{\ImageSpread*\{..\}} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +---------------=---------------+ +%% | +-------------=-------------+ | +%% | | . = . | | +%% | | . = . | | +%% | | . = . | | +%% | | image | | +%% | | . = . | | +%% | | . = . | | +%% | | . = . | | +%% | +-------------=-------------+ | +%% +---------------=---------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX do a better default... +% ...adaptive??? +\ResettableMacro{ImageSpreadCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpread}{% + \cleartoleftpage% + \begin{spreadtopages}[2]% + \imagecell[% + fit, + clearance=\clearimage, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{spreadtopages}} + + +%% \DescribeMacro{\ImageSpread<D>\{..\}} +%% \DescribeMacro{\ImageSpread<D>Caption\{..\}} +%% \DescribeMacro{\resetImageSpread<D>Caption} +%% \DescribeMacro{\ImageSpread<D>*\{..\}} +% +%% |<D>| can be one of T, B, L or R, for top, bottom, left and right +%% respectively. +%% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% +---------------=---------------+ +---------------=---------------+ +%% | +-------------=-------------+ | | = | +%% | | . = . | | | c = | +%% | | . = . | | | +-------------=-------------+ | +%% | | image | | | | . = . | | +%% | | . (T) . | | | | . = . | | +%% | | . = . | | | | image | | +%% | +-------------=-------------+ | | | . (B) . | | +%% | = c | | | . = . | | +%% | = | | +-------------=-------------+ | +%% +---------------=---------------+ +---------------=---------------+ +%% +%% +---------------=---------------+ +---------------=---------------+ +%% | +-------------=---------+ | | +---------=-------------+ | +%% | | . = . | | | | . = . | | +%% | | . = . | | | | . = . | | +%% | | . =. | | | | .= . | | +%% | | image | | | | image | | +%% | | . (L)=. | | | | .=(R) . | | +%% | | . = . | | | | . = . | | +%% | | . = . | | | | . = . | | +%% | +-------------=---------+ c | | c +---------=-------------+ | +%% +---------------=---------------+ +---------------=---------------+ +%% +%% \end{verbatim} +%% \end{minipage} +%% +\ResettableMacro{ImageSpreadTCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadT}{% + \ImageSpread*[% + top, + #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadBCaption}[1]{% + \captioncell[over]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadB}{% + \ImageSpread*[% + bottom, + #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadLCaption}[1]{% + \captionblockcell[right, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadL}{% + \ImageSpread*[% + left, + #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadRCaption}[1]{% + \captionblockcell[left, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadR}{% + \ImageSpread*[% + right, + #1]{#2}{#3}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Partial bleed + + +%% \DescribeMacro{\ImageSpreadFit\{..\}} +%% \DescribeMacro{\ImageSpreadFitCaption\{..\}} +%% \DescribeMacro{\resetImageSpreadFitCaption} +%% \DescribeMacro{\ImageSpreadFit*\{..\}} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . +%% +---------------=---------------+ +---------------=---------------+ +%% | = | | |. = .|. | +%% . |---------------=---------------| . | | . = . | | +%% . | . = . | . | | . = . | | +%% . | . = . | . | | . = . | | +%% . | image | . | | image | | +%% . | . = . | . | | . = . | | +%% . | . = . | . | | . = . | | +%% . |---------------=---------------| . | | . = . | | +%% | = c | | |. = .| c | +%% +---------------=---------------+ +---------------=---------------+ +%% . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX TEST... +% XXX make caption adaptive... +\ResettableMacro{ImageSpreadFitCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFit}{% + \cleartoleftpage% + \begin{spreadtopages}[2]% + \imagecell[% + fit, + clearance=-\bleed, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{spreadtopages}} + + +%% \DescribeMacro{\ImageSpread<D>\{..\}} +%% \DescribeMacro{\ImageSpread<D>Caption\{..\}} +%% \DescribeMacro{\resetImageSpread<D>Caption} +%% \DescribeMacro{\ImageSpread<D>*\{..\}} +% +%% Image spread aligned left (with bleed). +% +%% >> \ImageSpread<D>[<options>]{<caption>}{<image>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . . . . . . . . +%% . +---------------=---------------+ . +---------------=---------------+ +%% . | . = . | . | c = | +%% . | . = . | . . |---------------=---------------| . +%% . | . = . | . . | . = . | . +%% . | image | . . | . = . | . +%% . | . (T) . | . . | . = . | . +%% . | . = . | . . | image | . +%% . | . = . | . . | . (B) . | . +%% . |---------------=---------------| . . | . = . | . +%% | = c | . | . = . | . +%% +---------------=---------------+ . +---------------=---------------+ . +%% . . . . . . . . . . . . . . . . . . . +%% +%% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +%% . +---------------=---------------+ +---------------=---------------+ . +%% . | . = . | | | | . = . | . +%% . | . = . | | | | . = . | . +%% . | . = . | | | | . = . | . +%% . | . =. | | | | .= . | . +%% . | image | | | | image | . +%% . | . (L)=. | | | | .(R) . | . +%% . | . = . | | | | . = . | . +%% . | . = . | | | | . = . | . +%% . | . = . | c | | c | . = . | . +%% . +---------------=---------------+ +---------------=---------------+ . +%% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% +% XXX TEST... +% XXX do a better default... +% XXX need a caption box... +\ResettableMacro{ImageSpreadFitTCaption}[1]{% + \captioncell[under]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFitT}{% + \ImageSpreadFit*[top, #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadFitBCaption}[1]{% + \captioncell[over]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFitB}{% + \ImageSpreadFit*[bottom, #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadFitLCaption}[1]{% + \captionblockcell[right, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFitL}{% + \ImageSpreadFit*[left, #1]{#2}{#3}} + +\ResettableMacro{ImageSpreadFitRCaption}[1]{% + \captionblockcell[left, clearance=\captionclearpage]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFitR}{% + \ImageSpreadFit*[right, #1]{#2}{#3}} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%%%% Full bleed + +%% \DescribeMacro{\ImageSpreadFill\{..\}} +%% \DescribeMacro{\ImageSpreadFillCaption\{..\}} +%% \DescribeMacro{\resetImageSpreadFillCaption} +%% \DescribeMacro{\ImageSpreadFill*\{..\}} +% +%% Image spread with full bleed. +% +%% >> \ImageSpreadFill[<options>]{<caption>}{<image>} +% +%% \begin{minipage}{\textwidth} +%% \begin{verbatim} +%% +%% . . . . . . . . . . . . . . . . . . . +%% . +---------------=---------------+ . +%% . | . = . | . +%% . | . = . | . +%% . | . = . | . +%% . | . = . | . +%% . | image | . +%% . | . = . | . +%% . | . = . | . +%% . | . = . | . +%% . | . = . c | . +%% . +---------------=---------------+ . +%% . . . . . . . . . . . . . . . . . . . +%% +%% \end{verbatim} +%% \end{minipage} +%% + +% XXX do a better default... +\ResettableMacro{ImageSpreadFillCaption}[1]{% + \captioncell[bottom, align=flushright]{% + \captionformat{#1}}} +\ImagePageTemplate{ImageSpreadFill}{% + \cleartoleftpage% + \begin{spreadtopages}[2]% + \imagecell[% + fill, + clearance=-\bleed, + scale=\imagescale, + offsettop=\imageoffsettop, + offsetleft=\imageoffsetleft, + captionclearparent=\captionclearpage, + #1]{#2}{#3}% + \end{spreadtopages}} + + + +%---------------------------------------------------------------------- +%%%% Meta Macros / Environments +% +%% These macros and environments are used internally to help define cells +%% and templates and thus can be useful when extending the functionality +%% of this class both when authoring styles and when creating user +%% macros/templates.\footnote{% +%% Note that in code the relevant meta-macros are defined in the logical +%% locations for each macro, i.e. before first use and at the start of +%% the relevant context. This section in the reference is placed near +%% the end so as to focus the user's attention on the main class interface, +%% class internal architecture and extension API being secondary.} +%% +%% \input{\jobname-meta} +%% +%% + + + +%---------------------------------------------------------------------- +%%%% Miscellaneous + +%% \DescribeMacro{\PageInfo} +% +%% Display basic paper / page / cell geometry. +%% +\newcommand\PageInfo[1][mm]{% + Layout: \layoutmode + \par + paper: \lenprint[#1]{\paperwidth} x \lenprint[#1]{\paperheight} (w. bleeds) \\ + block: \lenprint[#1]{\blockwidth} x \lenprint[#1]{\blockheight} \\ + cell: \lenprint[#1]{\cellparentwidth} x \lenprint[#1]{\cellparentheight} \\ + bleed: \lenprint[#1]{\bleed}} + + +%% \DescribeMacro{\GenerateTemplate\{..\}} +% +%% Generate template page for current |layoutmode|. +% +%% >> \GenerateTemplate +% +%% Cell size can be printed in |mm| (default) or in any explicit unit +%% supported by \LaTeX. +% +%% >> \GenerateTemplate{<unit>} +% +%% This can be useful if one needs to make the cover/jacket/... in either a +%% different software package or by hand. +%% +%% This is a no-op for |layoutmode=block|. +%% +% XXX should digits/rounding be configurable??? +\newcommand\photobook@TemplateCell[2][mm]{ + \begin{center} + \vfill% + #2 \\ + (\lenprint[#1]{\cellwidth} \space x \lenprint[#1]{\cellheight}) + \vfill% + \vspace{0pt}% + \end{center}% + \ignorespaces} + +\newcommand\GenerateTemplate[1][mm]{ + \TPoptions{showboxes=true}% + \begin{page} + \setlength{\parindent}{0em} + % NOTE: only the relevant blocks will be visible... + \ifendpaperlayout% + \begin{leftside} + \photobook@TemplateCell[#1]{ENDPAPER LEFT} + \end{leftside} + \begin{rightside} + \photobook@TemplateCell[#1]{ENDPAPER RIGHT} + \end{rightside}\fi% + \ifcoverlikelayout% + \begin{frontcover} + \photobook@TemplateCell[#1]{FRONT COVER} + \end{frontcover} + \begin{vspine}% + \photobook@TemplateCell[#1]{SPINE}% + \end{vspine} + \begin{backcover} + \photobook@TemplateCell[#1]{BACK COVER} + \end{backcover}\fi% + \ifjacketlayout% + \begin{frontflap}% + \photobook@TemplateCell[#1]{FRONT FLAP} + \end{frontflap} + \begin{backflap}% + \photobook@TemplateCell[#1]{BACK FLAP} + \end{backflap}\fi% + \end{page}} + + +% XXX place marks in bleed area... +% XXX do this for all pages... (???) +\newcommand\ShowMarks[1][1pt]{% + % general... + % XXX corners / cut marks... + \ifendpaperlayout% + % XXX fold... + \fi% + \ifcoverlikelayout% + % XXX spine... + % XXX folds... + \fi% + \ifjacketlayout% + % XXX spine... + % XXX folds... + \fi} + + +% XXX EXPERIMENTAL... +\def\photobook@pdfboxstore@stored{} + +% XXX should these be stacked??? +% XXX handle slot name... +\newcommand\storepdfboxes[1][stored]{% + \edef\photobook@pdfboxstore@stored{% + \photobook@pdfboxes}} + +% XXX handle slot name... +\newcommand\restorepdfboxes[1][stored]{% + \expandafter\pdfpageattr\expandafter{\photobook@pdfboxstore@stored}} + + +%% \DescribeMacro{\pdfboxesset\{..\}} +% +%% >> \pdfboxesset[<bleed>]{<bleedblockwidth>}{<bleedblockheight>} +%% +\newcommand\pdfboxesset[3][\bleed]{% + % calculate pdf box dimensions in pt... + \edef\photobook@pdfboxesset@w{\strip@pt\dimexpr + 0.996264009963\dimexpr #2 \relax\relax}% + \edef\photobook@pdfboxesset@h{\strip@pt\dimexpr + 0.996264009963\dimexpr #3 \relax\relax}% + \edef\photobook@pdfboxesset@bleed{\strip@pt\dimexpr + 0.996264009963\dimexpr #1 \relax\relax}% + \edef\photobook@pdfboxesset@t{\strip@pt\dimexpr + 0.996264009963\dimexpr #3 - #1 \relax\relax}% + \edef\photobook@pdfboxesset@r{\strip@pt\dimexpr + 0.996264009963\dimexpr #2 - #1 \relax\relax}% + % + \edef\photobook@pdfboxes{% + /MediaBox [0 0 \photobook@pdfboxesset@w\space \photobook@pdfboxesset@h] + /BleedBox [0 0 \photobook@pdfboxesset@w\space \photobook@pdfboxesset@h] + /ArtBox [ + \photobook@pdfboxesset@bleed\space \photobook@pdfboxesset@bleed\space + \photobook@pdfboxesset@r\space \photobook@pdfboxesset@t] + /TrimBox [ + \photobook@pdfboxesset@bleed\space \photobook@pdfboxesset@bleed\space + \photobook@pdfboxesset@r\space \photobook@pdfboxesset@t] + /CropBox [ + \photobook@pdfboxesset@bleed\space \photobook@pdfboxesset@bleed\space + \photobook@pdfboxesset@r\space \photobook@pdfboxesset@t]}% + % + % set the boxes... + \ifxetex% + % XXX make this reusable -- currently this will add new boxes per + % call, need to cleanup... + \AtBeginShipout{\AtBeginShipoutAddToBox{% + \special{pdf:put @thispage << \photobook@pdfboxes >>}}}% + \else% + \expandafter\pdfpageattr\expandafter{\photobook@pdfboxes}\fi} + + +%% \DescribeMacro{\pdfcommentcell\{..\}} +% +%% Add pdf comment as margin overlay. +%% +%% >> \pdfcommentcell[<options>]{<comment>} +%% +% XXX BUG: this takes up space... +\newcommand\pdfcommentcell[2][]{% + \begin{cell*}{ + \ifnumodd{\thepage}{% + \cellwidth - \marginparwidth - 2\bleed - 1cm + }{% + \bleed + 1cm}, + \bleed + 1cm + }{\marginparwidth}{1pt}% + \pdfcomment[color=yellow, #1]{#2}% + \end{cell*}} + + +%% \DescribeMacro{\pdfpagecount\{..\}} +% +%% Get pdf page count +%% +%% >> \pdfpagecount{<file.pdf>} +%% +\newcommand\pdfpagecount[1]{% + \ifpdftex% + \pdfximage{#1}% + \number\pdflastximagepages% + \else\ifxetex% + \number\XeTeXpdfpagecount"#1"% + \else\ifluatex% + \number\directlua{% + local pages = 0 + local doc = pdfe.open("\luaescapestring{#1}") + if doc then + pages = pdfe.getnofpages(doc) + pdfe.close(doc) + end + tex.write(pages) }\fi\fi} + + +%% \DescribeMacro{\pdfspinewidth\{..\}} +% +%% Calculate spine thickness +%% +%% >> \pdfspinewidth{<paper-thikness>}{<cover-thikness>}{<block-pdf>} +%% +% NOTE: really "like" how LaTeX overcomplicats simple math... +\newcommand\pdfspinewidth[3]{% + \setlength\spinewidth{\dimexpr + (#1 mm) * \numexpr \pdfpagecount{#3} / 2 \relax + + ((#2 mm) * 2) + \relax}} + + + +%---------------------------------------------------------------------- +% Index... +% +% XXX this prints trash at this point... +% ...I do not want to build the index manually but it seems that +% we are slowly moving in that direction... +%%% \printindex + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%%% XXX DEBUG... +%%%\AtBeginDocument{ +%%%} + + +% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +%% \blankfootnote{% +%% Why ASCII diagrams instead of normal graphics, you might ask? +%% Well, for the same reason as photo-books in \LaTeX\ -- I liked +%% the idea of it, the simplicity, and thought that it would be fun to +%% see how far can I push things before it all falling apart on me, and... +%% We are here, at the end, and it all is still here too :)} + + + +%---------------------------------------------------------------------- +%% \end{document} % vim:set ts=4 sw=4 nowrap : |