[Tex/LaTex] How to make a A4 sheet made of A7 pages

formatting

I'm trying to make a booklet in A7 size but my printer only work with A4 so I need to make a pdf that look more or less like this:

Sheet 1 (Front)

+—–+—–+—–+—–+

|–40–|–1–|–38–|–3–|

+—–+—–+—–+—–+

|–36–|–5–|–34–|–7–|

+—–+—–+—–+—–+

Sheet 1 (Back)

+—–+—–+—–+—–+

|–39–|–2–|–37–|–4–|

+—–+—–+—–+—–+

|–35–|–6–|–33–|–8–|

+—–+—–+—–+—–+

Where the numbers represent the number of the page and the number of pages is 40.
The question is what commands I have to use to make it a reality.

Sorry for my poor english

Best Answer

This does not order the pages automatically, but it does seem to work.

Here's an A7 document with 40 pages. Call the result a7-40.pdf.

% !TEX TS-program = pdflatex
% !TEX encoding = UTF-8 Unicode
% arara: pdflatex
\pdfminorversion=7
\documentclass[twoside]{article}
\usepackage{geometry}
\geometry{paperwidth=74mm,paperheight=105mm}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
\centering
\scalebox{30}{1}\newpage
\scalebox{30}{2}\newpage
\scalebox{30}{3}\newpage
\scalebox{30}{4}\newpage
\scalebox{30}{5}\newpage
\scalebox{30}{6}\newpage
\scalebox{30}{7}\newpage
\scalebox{30}{8}\newpage
\scalebox{30}{9}\newpage
\scalebox{10}{10}\newpage
\scalebox{10}{11}\newpage
\scalebox{10}{12}\newpage
\scalebox{10}{13}\newpage
\scalebox{10}{14}\newpage
\scalebox{10}{15}\newpage
\scalebox{10}{16}\newpage
\scalebox{10}{17}\newpage
\scalebox{10}{18}\newpage
\scalebox{10}{19}\newpage
\scalebox{10}{20}\newpage
\scalebox{10}{21}\newpage
\scalebox{10}{22}\newpage
\scalebox{10}{23}\newpage
\scalebox{10}{24}\newpage
\scalebox{10}{25}\newpage
\scalebox{10}{26}\newpage
\scalebox{10}{27}\newpage
\scalebox{10}{28}\newpage
\scalebox{10}{29}\newpage
\scalebox{10}{30}\newpage
\scalebox{10}{31}\newpage
\scalebox{10}{32}\newpage
\scalebox{10}{33}\newpage
\scalebox{10}{34}\newpage
\scalebox{10}{35}\newpage
\scalebox{10}{36}\newpage
\scalebox{10}{37}\newpage
\scalebox{10}{38}\newpage
\scalebox{10}{39}\newpage
\scalebox{10}{40}
\end{document}

Now use pdfpages to create the A4 pages:

\documentclass[a4paper,twoside]{article}
\usepackage{pdfpages,geometry}
\geometry{scale=1,marginparsep=0pt,marginparwidth=0pt,landscape}
\begin{document}
\includepdf[nup=4x2,pages={40,1,38,3,36,5,34,7,  32,9,30,11,28,13,26,15,  24,17,22,19,20,21,18,23,  16,25,14,27,12,29,10,31, 8,33,6,35,4,37,2,39}]{a7-40}
\end{document}

A7 4x2 on A4

EDIT EDIT

Note that EDIT follows EDIT EDIT, which is logical but non-chronological.

To answer a query in comments, here is one way to add horizontal and vertical rules to divide the page evenly into quarters.

\documentclass[a4paper,twoside]{article}
\usepackage{pdfpages,geometry}
\geometry{scale=1,marginparsep=0pt,marginparwidth=0pt,landscape}
\begin{document}
\newsavebox\adrielhrule
\sbox\adrielhrule{\vrule height .2pt depth .2pt width \paperwidth}
\newsavebox\adrielvrule
\sbox\adrielvrule{\hspace*{-.2pt}\vrule height \paperheight depth 0pt width .4pt}
\includepdf[nup=4x2,pages={40,1,38,3,36,5,34,7,  32,9,30,11,28,13,26,15,  24,17,22,19,20,21,18,23,  16,25,14,27,12,29,10,31, 8,33,6,35,4,37,2,39}, picturecommand={%
    \setlength\unitlength{1mm}% modified from Ignasi's answer at http://tex.stackexchange.com/a/64745/
    \put(0,105){\usebox{\adrielhrule}}%
    \put(148.5,0){\usebox{\adrielvrule}}%
  }]{a7-40}
\end{document}

dividers

EDIT

To make this more convenient, it would be nice to have TeX figure out the page order and automatically add blank pages, if necessary, to produce a complete signature.

This solution uses expl3 and a little help from egreg to achieve just this.

\adrielbooklet[<other pdfpages options>]{<no. of pages>}{<pdf filename>}

will include the first <no. of pages> from <pdf filename>, arranging them in the appropriate order and applying <other pdfpages options>.

Complete code with examples:

\documentclass[a4paper,twoside]{article}
\usepackage{pdfpages,geometry,xparse}
\geometry{scale=1,marginparsep=0pt,marginparwidth=0pt,landscape}
\ExplSyntaxOn
\int_new:N \l_adriel_pages_int
\int_new:N \l_adriel_total_int
\int_set:Nn \l_adriel_pages_int { 1 }
\int_set:Nn \l_adriel_total_int { 1 }
\tl_new:N \l_adriel_pages_tl
\tl_new:N \l_adriel_pdfopts_tl
\cs_new_protected_nopar:Npn \adriel_pageorder:n #1
{
  \int_compare:nTF
  {
    \int_mod:nn { #1 } { 4 }  = 0
  }
  {
    \int_set:Nn \l_adriel_total_int { #1 }
  }
  {
    \int_set:Nn \l_adriel_total_int { #1 + 4 - \int_mod:nn { #1 } { 4 } }
  }
  \int_set:Nn \l_adriel_pages_int { \l_adriel_total_int - 1 }
  \int_compare:nTF
  {
    \l_adriel_total_int > #1
  }
  {
    \tl_clear:N \l_adriel_pages_tl
  }
  {
    \tl_set:NV \l_adriel_pages_tl \l_adriel_total_int
  }
  \int_do_while:nn
  {
    \l_adriel_pages_int > 0
  }
  {
    \int_if_odd:nTF { \l_adriel_pages_int }
    {
      \int_compare:nTF
      {
        ( \l_adriel_total_int - \l_adriel_pages_int ) > #1
      }
      {
        \tl_put_right:Nn \l_adriel_pages_tl { , }
      }
      {
        \tl_put_right:Nx \l_adriel_pages_tl { , \int_eval:n { \l_adriel_total_int - \l_adriel_pages_int } }
      }
    }
    {
      \int_compare:nTF
      {
        \l_adriel_pages_int > #1
      }
      {
        \tl_put_right:Nn \l_adriel_pages_tl { , }
      }
      {
        \tl_put_right:Nx \l_adriel_pages_tl { , \int_eval:n { \l_adriel_pages_int } }
      }
    }
    \int_decr:N \l_adriel_pages_int
  }
}
\cs_new_protected_nopar:Npn \adriel_includepdf:nn #1 #2
{
  \includepdf[#1]{#2}
}
\cs_generate_variant:Nn \adriel_includepdf:nn { V }
\cs_new_protected_nopar:Npn \adriel_booklet:nnn #1 #2 #3
{
  \adriel_pageorder:n { #2 }
  \tl_set:Nx \l_adriel_pdfopts_tl { {pages={\l_adriel_pages_tl}} }
  \tl_put_right:Nn \l_adriel_pdfopts_tl { , #1 }
  \adriel_includepdf:Vn \l_adriel_pdfopts_tl { #3 }
}
\NewDocumentCommand \adrielbooklet { O {} m m }
{
  \adriel_booklet:nnn { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
\begin{document}
\adrielbooklet[nup=4x2]{39}{a7-40}
\adrielbooklet[nup=4x2]{40}{a7-40}
\adrielbooklet[nup=4x2]{38}{a7-40}
\adrielbooklet[nup=4x2]{37}{a7-40}
\end{document}

This produces 4 booklets:

4 auto-booklets

EDIT EDIT EDIT

Here's a (mostly) expl3 version with dividing lines:

\documentclass[a4paper,twoside]{article}
\usepackage{pdfpages,geometry,xparse}
\geometry{scale=1,marginparsep=0pt,marginparwidth=0pt,landscape}
\ExplSyntaxOn
\int_new:N \l_adriel_pages_int
\int_new:N \l_adriel_total_int
\int_set:Nn \l_adriel_pages_int { 1 }
\int_set:Nn \l_adriel_total_int { 1 }
\tl_new:N \l_adriel_pages_tl
\tl_new:N \l_adriel_pdfopts_tl
\cs_new_protected_nopar:Npn \adriel_pageorder:n #1
{
  \int_compare:nTF
  {
    \int_mod:nn { #1 } { 4 }  = 0
  }
  {
    \int_set:Nn \l_adriel_total_int { #1 }
  }
  {
    \int_set:Nn \l_adriel_total_int { #1 + 4 - \int_mod:nn { #1 } { 4 } }
  }
  \int_set:Nn \l_adriel_pages_int { \l_adriel_total_int - 1 }
  \int_compare:nTF
  {
    \l_adriel_total_int > #1
  }
  {
    \tl_clear:N \l_adriel_pages_tl
  }
  {
    \tl_set:NV \l_adriel_pages_tl \l_adriel_total_int
  }
  \int_do_while:nn
  {
    \l_adriel_pages_int > 0
  }
  {
    \int_if_odd:nTF { \l_adriel_pages_int }
    {
      \int_compare:nTF
      {
        ( \l_adriel_total_int - \l_adriel_pages_int ) > #1
      }
      {
        \tl_put_right:Nn \l_adriel_pages_tl { , }
      }
      {
        \tl_put_right:Nx \l_adriel_pages_tl { , \int_eval:n { \l_adriel_total_int - \l_adriel_pages_int } }
      }
    }
    {
      \int_compare:nTF
      {
        \l_adriel_pages_int > #1
      }
      {
        \tl_put_right:Nn \l_adriel_pages_tl { , }
      }
      {
        \tl_put_right:Nx \l_adriel_pages_tl { , \int_eval:n { \l_adriel_pages_int } }
      }
    }
    \int_decr:N \l_adriel_pages_int
  }
}
\cs_new_protected_nopar:Npn \adriel_includepdf:nn #1 #2
{
  \includepdf[#1]{#2}
}
\cs_generate_variant:Nn \adriel_includepdf:nn { V }
\cs_new_protected_nopar:Npn \adriel_booklet:nnn #1 #2 #3
{
  \adriel_pageorder:n { #2 }
  \tl_set:Nx \l_adriel_pdfopts_tl { {pages={\l_adriel_pages_tl}} }
  \tl_put_right:Nn \l_adriel_pdfopts_tl { , #1 }
  \adriel_includepdf:Vn \l_adriel_pdfopts_tl { #3 }
}
\NewDocumentCommand \adrielbooklet { O {} m m }
{
  \adriel_booklet:nnn { #1 } { #2 } { #3 }
}
\box_new:N \l_adriel_hline_box
\box_new:N \l_adriel_vline_box
\hbox_set:Nn \l_adriel_hline_box { \vrule height .2pt depth .2pt width \paperwidth }
\hbox_set:Nn \l_adriel_vline_box { \hspace*{-.2pt} \vrule height \paperheight depth 0pt width .4pt }
\NewDocumentCommand \adrielhrule { }
{
  \box_use:N \l_adriel_hline_box
}
\NewDocumentCommand \adrielvrule { }
{
  \box_use:N \l_adriel_vline_box
}
\ExplSyntaxOff
\begin{document}
\adrielbooklet
  [nup=4x2,
  picturecommand={%
    \setlength\unitlength{1mm}% modified from Ignasi's answer at http://tex.stackexchange.com/a/64745/
    \put(0,105){\adrielhrule}%
    \put(148.5,0){\adrielvrule}%
  }%
  ]{40}{a7-40}
\end{document}

auto-version with dividers

Related Question