22

My problem is that I would like to have either blank or figures on the left pages, and text on the right ones, with the numbering of the right pages to be 1,2,3,4,5 and not 1,3,5,7.

It means, in a book-derived class, to have right pages, with the odd layout, but with also an even number half the time.

It also means that I would like to have, by default, a blank page everywhere on a left page, except if a picture has been defined somehow before on the previous page.


Update:

I've tried it. There is a little \makeatother missing, but I spotted it right away. It seems to work fine alternating pages and inserting blank or figure pages. However, I have two problems:

  • The class (book-derived) sometimes introduces blank pages of its own. I can tweak it, but would prefer to be able to turn on/ turn off the action of the blankpage routine along the course of the document.
  • The layout of the text pages depends on the odd/even number of the page. Since my text pages have odd and even numbers (which is the intended result), the layout is now alternatively odd or even, which is not what I would like, since there they will all be on the right hand side of the doc when open...

Do you have any clue as to how to manage this? I think the second problem is way more difficult...

Thank you already for this answer both simple and effective for achieving the result.

EDIT 2 (19/12/2011) : The answer from Bruno Le Floch seems to me more complete and I recommend it.

4
  • you can produce two oneside documents and combine the two documents with pdfpages. Commented May 13, 2011 at 14:15
  • True, it is my fallback option. However, I won't be able to get the list of pictures on a right page, and in the table of contents...
    – Martigan
    Commented May 13, 2011 at 14:39
  • Welcome to TeX.SX. I merged your "guest" account to the registered one. You are now able to edit the question. I moved your answer post already to it and deleted that post to keep the answer section tidy. Commented May 17, 2011 at 17:32
  • I think Heiko's atbegshi package (as used in my answer to reversing pages from now onwards) may be useful: save pages as they arrive, treat figures completely independently, increase \count0 by two at each page (perhaps with afterpage), but have \renewcommand\thepage{\the\numexpr\count0/2\relax}, or something like that. Commented Dec 12, 2011 at 20:17

2 Answers 2

14
+500

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.)

15
  • I've juste tried it. It seems to be quite good and solve nicely the problem of very long paragraph. The switch on/off feature is quite interesting too. I have two comments however. First one is that the \SOStrue seems to be working, not on the next page, but on the one after. Not a huge problem, but it requires to plan more carefully the switches. The second one is that I would like to know where to tweak things if I want the numbering being only on the right hand pages, with odd and even numbers, and the "invisible numbering" of the left hand pages being the same as the facing page.
    – Martigan
    Commented Dec 19, 2011 at 9:33
  • @Martigan: Tweaking things is difficult. Where do you want figures corresponding to a page to appear? On the left page facing them (hence before them) or on the left page following them? The first option is tricky: what should we do for the first page of a chapter, when normally the facing left page is part of the previous chapter (e.g., headers are from the previous chapter). Commented Dec 19, 2011 at 10:46
  • I would like the figure to appear facing the page it corresponds to. The problem of header is a moot point, since I would like to keep pages with no headers and footers (nor numbering) : \thispagestyle{empty} pour les pages avec figures.
    – Martigan
    Commented Dec 19, 2011 at 10:58
  • @AhmedMusa good idea. Martigan, I'll look into it in a couple hours/days. Don't have time now. Commented Dec 19, 2011 at 17:55
  • @Bruno Le Floch: What of \newcommand*\lipsumnopar[2][1]{{\def\lips@par{ }\lipsum[#1-#2]}}? Or is your redefinition of \lips@par not global? When \ifSOS is false, pending floats have to be flushed with \SOSshipout. Is this the case?
    – Ahmed Musa
    Commented Dec 19, 2011 at 19:39
19
+500

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} 
6
  • It works quite well (don't forget to add the makeatother at the end of the definition of commands) actually, and I solved my layout problem by stating oneside in the book class, that ensures that all the layout will be odd side, even for even pages (pun intended).
    – Martigan
    Commented May 16, 2011 at 9:31
  • @Martigan: I have changed the code by adding the missing \makeatother and changing it to a onesided book class
    – Danie Els
    Commented May 18, 2011 at 3:12
  • Thank you very much Danie. An other comment: I put the addtocounter{page}{-1} after the \clearpage, in order for my figures to have the same number in the table of figures than the text page opposite. If you keep the code as it is, you have the number of the previous text page.
    – Martigan
    Commented May 18, 2011 at 9:05
  • Is this the code that ended up in the semioneside package (mirror.ctan.org/macros/latex/contrib/semioneside)? Commented Dec 14, 2011 at 17:26
  • The semioneside package does seem to share much code. It also seems to share the same problems: "Paragraphs longer than one page can cause the whole mechanism to get out- of-sync. This seems to be due to TEX’s page breaking mechanism. When a paragraph breaks across several pages the \afterpage command is not executed at a page break (at least not reliably) and all gets mixed up. Beware of too long paragraphs!" (documentation for the semioneside package).
    – Village
    Commented Dec 15, 2011 at 12:29

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .