Figures on left pages, text on right ones with class book, numbering only on right pages
This is an enhancement of code that I have found on c.t.t. It uses the afterpage package to skip every second page and then if you add a figure with the \addfig
command it will output it on the next page. It seems to work reasonable well (to my own surprise also ;-)
\documentclass[english,oneside]{book}
\usepackage{babel}
\usepackage{afterpage}
\makeatletter
\newcommand\@addfig{\relax}
\newcommand\addfig[1]{\global\long\def\@addfig{#1}}
\newcommand\@putfig{\@addfig\addfig{\relax}}
\newcommand\blankpage{%
\null
\vfill
\@putfig%
\vfill
\thispagestyle{empty}%
\addtocounter{page}{-1}%
\clearpage
\afterpage{\blankpage}}
\makeatother
\usepackage{blindtext}
\begin{document}
\afterpage{\blankpage}
\blindtext[2]
\addfig{%
\begin{figure}
\centering
\fbox{\rule{0pt}{3cm}\rule{6cm}{0pt}}
\caption{Test figure}
\end{figure}}
\Blindtext
\Blindtext
\addfig{%
\begin{figure}
\centering
\fbox{\rule{0pt}{3cm}\rule{12cm}{0pt}}
\caption{Test figure 2}
\end{figure}}
\Blindtext
\Blindtext
\Blindtext
\end{document}
I hope I got parity right. It seems that the OP wants the figures to come on the page following the one which references them, and that pages of text should be odd-numbered and on the right, which I would call recto, but Village asked for verso. I went for the OP's requirements. Also, it would make more sense I think to put figures on the page before they are referenced, so that the reader can see them as he reads the corresponding text, but I didn't manage to do that.
I use Heiko Oberdiek's atbegshi
package to capture pages just before they are output to the pdf file (at "shipout" time), and add one page of figures per shipout. In order to keep the correct even/odd layout, I increase the page
counter for each page of figures (this way, \value{page}
is always the true page number in the pdf), but I change \thepage
to display the number of text pages (total minus figures).
The figures are collected as we go in \sos@figures
, which flushes itself when used (\sos@rest@figures
). Each figure added with \addfig
is placed in a \vbox
, with \vfill
between them, so that figures are nicely distributed along the page's height.
Somehow, \shipout\vbox{...}
does not simply send the \vbox
to the pdf centered on the page, so I move the box by \sos@top
and \sos@right
to put it at a place which looks like the left-page layout. Any better solution is welcome.
The mechanism can be turned on and off using \SOStrue
and \SOSfalse
(global switches). The example uses \lipsum
, but with paragraph breaks disabled, so that \lipsum[1-10]
builds one big paragraph.
\documentclass{book}
\usepackage{atbegshi}
\makeatletter
\newlength{\sos@top}
\newlength{\sos@right}
\newcounter{sos@pages}
\newif\ifSOS
\renewcommand{\thepage}{\the\numexpr\value{page}-\value{sos@pages}\relax}
\newcommand{\addfig}[1]{\g@addto@macro\sos@figures{\vbox{\centering#1}\vfill}}
\newcommand{\sos@reset@figures}
{\gdef\sos@figures{\sos@reset@figures\vfill}}
\sos@reset@figures
\newcommand{\sos@shipout@figures}
{%
\begingroup
\stepcounter{page}%
\stepcounter{sos@pages}%
\let\protect\relax
\setbox\z@\vbox to\vsize{\sos@figures}%
\let\protect\string
\AtBeginShipoutOriginalShipout\vbox
{\vbox to\sos@top{}\moveright\sos@right\box\z@}%
\endgroup
}
\AtBeginShipout{%
\ifSOS\ifodd\c@page
\begingroup
\let\protect\string
\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox
\global\AtBegShi@Discardedtrue
\sos@shipout@figures
\endgroup
\fi\fi
}%
\newcommand{\SOSshipout}{\clearpage\sos@shipout@figures}
\renewcommand{\SOStrue}{\clearpage\global\let\ifSOS\iftrue}
\renewcommand{\SOSfalse}{\clearpage\global\let\ifSOS\iffalse}
\setlength{\sos@top}{2cm}
\setlength{\sos@right}{2cm}
\makeatother
% Test example
\usepackage{booktabs,caption}
\usepackage{lipsum}
\usepackage{hyperref}
\begin{document}
\title{Hello world}
\author{Bruno Le Floch}
\maketitle
\tableofcontents
\listoffigures
\listoftables
\part{Abc}
\SOStrue
\chapter{Hello}
\addfig{\begin{tabular}{p{5cm}p{5cm}}
\toprule
Abc def & ghijk lmno pq \\
\midrule
\lipsum[1] & \lipsum[2] \\
\bottomrule
\end{tabular}
\captionof{table}{\label{tab:atable}A table}}
\addfig{%
\rule{8cm}{3cm}%
\captionof{figure}{A figure}}
\lipsum[1-10]
\addfig{\rule{1cm}{3cm}\captionof{figure}{Another figure}}
\addfig{\rule{8cm}{3cm}\captionof{figure}{A figure}}
\addfig{\rule{1cm}{3cm}\captionof{figure}{Another figure}}
\chapter{Bye}
\makeatletter
\renewcommand{\lips@par}{ } % now \lipsum[1-10] makes one big par
\makeatother
\addfig{\rule{8cm}{3cm}\captionof{figure}{That should be figure 5.}}
\addfig{\rule{1cm}{3cm}\captionof{figure}{Perhaps the sixth}}
\lipsum[1-10]
\addfig{\rule{8cm}{3cm}\captionof{figure}{Yet another one}}
\addfig{\rule{1cm}{3cm}\captionof{figure}{One last figure for now.}}
\SOSfalse
\chapter{Back to normal}
\addfig{\rule{8cm}{3cm}\captionof{figure}{That figure won't be lost.}}
\lipsum[11-15]
\addfig{\rule{4cm}{5cm}\captionof{figure}{Nor will that one.}}
\lipsum[16-20]
\lipsum[21-30]
See Table~\ref{tab:atable}.
\SOSshipout
\SOStrue
\chapter{Figures, again}
\addfig{\rule{5cm}{2cm}\captionof{table}{Let's pretend it's a table}}
\lipsum[21-25]
\addfig{\rule{5cm}{2cm}\captionof{table}{Let's pretend it's a table}}
\lipsum[26-30]
\addfig{\rule{4cm}{1cm}\captionof{table}{Last table}}
\end{document}
EDIT: the other advantage of leaving \c@page
alone is that hyperref and references work. (Added to the example.)