\expandafter\ifx\csname pdfxupfile\endcsname\relax
\PackageError{pdfxup}{This file should not be compiled alone}
             {File pdfxup-template.pdf is not meant to be compiled alone.
               \MessageBreak
             It should only be used via the 'pdfxup' script.}
\fi

\documentclass{minimal}
  \usepackage[margin=0pt,\pdfxupoutputpaper paper]{geometry}
  \ifnum\pdfxupoutputlandscape=1\relax\geometry{landscape}\fi
  \usepackage{graphicx}
  \IfFileExists{grffile.sty}{\usepackage{grffile}}{}

  \topskip=0pt
  \parindent=0pt
  
  \makeatletter

  %% define functions for parsing comma-separated lists of ranges of pages
  \newcounter{result}%
  \newif\iffound
  \def\@parserange#1-#2-#3\@end#4\@end{%
    \setcounter{result}{#4}%
    \ifnum\value{result}=1\relax
      \foundtrue
      \setcounter{result}{#1}%
    \else
      \addtocounter{result}{-1}%
      \ifx\relax#3\relax%% means that range contains no -
      \else
        \addtocounter{result}{#1}%
        \ifnum#2<\value{result}\relax
          \addtocounter{result}{-#2}%
        \else
          \foundtrue
        \fi
      \fi
    \fi}
  \def\parserange#1#2{\expandafter\@parserange#2-SINGLE-\@end#1\@end}
  \def\@parsecsl#1,#2\@end#3\@end{%
    \parserange{#3}{#1}%
    \iffound\else
    \ifx\relax#2\relax\else\@parsecsl#2\@end\value{result}\@end\fi\fi}
   %% \nthvalue#1#2 looks for #1-th value in list of intervals #2
  \def\nthvalue#1#2{\foundfalse\expandafter\@parsecsl#2,\@end#1\@end}

  %% perform various computations:
  %% - width and height of image (\hresult and \vresult)
  %% - width and height of frame containing image (\hboxsize and \vboxsize)
  \newcounter{lastpage}
  \newcounter{outpage}%%% nr of pages of output document
  \setcounter{outpage}{\pdfxupnbpages}
  \addtocounter{outpage}{-1}
  \divide\c@outpage by \pdfxupnbhoriz
  \divide\c@outpage by \pdfxupnbvert
  \ifbooklet
    \divide\c@outpage by 2
  \fi
  \stepcounter{outpage}
  \ifbooklet
    \multiply\c@outpage by 2
  \fi
  \setcounter{lastpage}{\value{outpage}}
  \multiply\c@lastpage by \pdfxupnbhoriz
  \multiply\c@lastpage by \pdfxupnbvert
  \makeatother
  %
  \newlength\outputvmargin
  \newlength\outputhmargin
  \setlength\outputvmargin{\pdfxupvmargin}
  \setlength\outputhmargin{\pdfxuphmargin}
  \newlength\innervmargin
  \newlength\innerhmargin
  \setlength\innervmargin{\pdfxupinnervmargin}
  \setlength\innerhmargin{\pdfxupinnerhmargin}
  \newlength\outputindivvmargin
  \newlength\outputindivhmargin
  \setlength\outputindivvmargin{\pdfxupintermvspace}
  \setlength\outputindivhmargin{\pdfxupintermhspace}
  %
  \setlength\fboxrule{\pdfxupframewidth}
  \fboxsep=-\fboxrule
  \newlength\hresult
  \newlength\vresult
  \newlength\vboxsize
  \newlength\hboxsize  
  \hresult=\paperwidth
  \advance\hresult by -\pdfxupnbhoriz\fboxrule
  \advance\hresult by -\pdfxupnbhoriz\fboxrule
  \advance\hresult by -\pdfxupnbhoriz\innerhmargin
  \advance\hresult by -\pdfxupnbhoriz\innerhmargin
  \vresult=\paperheight 
  \advance\vresult by -\pdfxupnbvert\fboxrule
  \advance\vresult by -\pdfxupnbvert\fboxrule
  \advance\vresult by -\pdfxupnbvert\innervmargin
  \advance\vresult by -\pdfxupnbvert\innervmargin
  %
  \advance\hresult by -2\outputhmargin
  \advance\vresult by -2\outputvmargin
  %
  \advance\hresult by -\pdfxupnbhoriz \outputindivhmargin
  \advance\vresult by -\pdfxupnbvert \outputindivvmargin
  \advance\hresult by \outputindivhmargin
  \advance\vresult by \outputindivvmargin
  %
  \divide\hresult by \pdfxupnbhoriz
  \divide\vresult by \pdfxupnbvert

  \vboxsize=\vresult
  \advance\vboxsize by 2\fboxrule
  \advance\vboxsize by 2\innervmargin
  \hboxsize=\hresult
  \advance\hboxsize by 2\fboxrule
  \advance\hboxsize by 2\innerhmargin


  \let\pdfxupnblines\pdfxupnbvert
  \let\pdfxupnbcols\pdfxupnbhoriz
  \ifnum\columnmode=0\relax
  %% "row-mode"
  \def\horizincr{\pdfxupnbhoriz}
  \def\vertincr{1}
  \else
  %% "column-mode"
  \def\horizincr{1}
  \def\vertincr{\pdfxupnbvert}%
  \fi

%% compute actual scale by which PDF is shrunk (or extended)
  \ifnum\pdfxupemptybb=0\relax
  \newcounter{origx}
  \setcounter{origx}{\pdfxupw}
  \addtocounter{origx}{-\pdfxupx}
  \newcounter{origy}
  \setcounter{origy}{\pdfxuph}
  \addtocounter{origy}{-\pdfxupy}
  \newlength\finalx
  \newlength\finaly
  \finalx=\hresult
  \finaly=\vresult
  \divide\finalx by \value{origx}
  \divide\finaly by \value{origy}
  \newwrite\scale
  \immediate\openout\scale=\pdfxupfilename.scl
  \ifdim\finalx>\finaly
    \multiply\finaly by 100
    \immediate\write\scale{\the\finaly}
  \else
    \multiply\finalx by 100
    \immediate\write\scale{\the\finalx}
  \fi
  \immediate\closeout\scale
  \fi


  %% start document
  \begin{document}
  %\tracingoutput=1
  %\tracingpages=1
  %\tracingparagraphs=1
  \makeatletter
  \newcounter{curroutpage}%%%% counts pages nr  of output document
  \setcounter{curroutpage}{0}%
  \newcounter{currpage}%%%%%%% page nr of input document
  \newcounter{linecurrpage}%%% currpage at beginning of line
  \newcounter{currcol}%
  \newcounter{currline}%
  \newcounter{realout}%
  \newcounter{wmout}%
  \newcounter{wmoutaux}%
  \@whilenum \value{outpage}>\value{curroutpage} \do%
    {\advance\c@curroutpage by 1%
    %% check if we are on last page, and if so, possibly balance last page
    \if0\balancelast\relax\else
    \c@currpage=\c@curroutpage %
    \multiply\c@currpage by \pdfxupnbhoriz\relax%
    \multiply\c@currpage by \pdfxupnbvert\relax%
    \ifnum\c@currpage>\pdfxupnbpages\relax
      \c@currpage=-\c@curroutpage\relax%
      \advance\c@currpage by 1 %
      \multiply\c@currpage by \pdfxupnbhoriz\relax%
      \multiply\c@currpage by \pdfxupnbvert\relax%
      \advance\c@currpage by \pdfxupnbpages\relax
      \ifnum\columnmode=0\relax
        \advance\c@currpage by -1\relax
        \divide\c@currpage by \pdfxupnbvert\relax%
        \advance\c@currpage by 1\relax
        \edef\horizincr{\thecurrpage}
        \edef\pdfxupnbcols{\thecurrpage}
      \else
        \advance\c@currpage by -1\relax
        \divide\c@currpage by \pdfxupnbhoriz\relax%
        \advance\c@currpage by 1\relax
        %\showthe\value{currpage}
        \edef\vertincr{\thecurrpage}
        \edef\pdfxupnblines{\thecurrpage}
        %\show\vertincr
        %\show\horizincr
      \fi
    \fi
    \fi
    %% start producing page
    \c@currpage=\c@curroutpage%
    \advance\c@currpage by -1%
    \multiply\c@currpage by \pdfxupnbhoriz%
    \multiply\c@currpage by \pdfxupnbvert%
    \c@linecurrpage=\c@currpage%
    \hrule \@height\z@%
    \c@currline=0%
    \vskip\outputvmargin%
    \@whilenum\value{currline}<\pdfxupnblines \do%
      {\hrule \@height\z@%
       \ifnum\value{currline}>0%
          \vskip \outputindivvmargin%
          \advance\c@linecurrpage by \horizincr%
        \else%
          \advance\c@linecurrpage by 1%
        \fi%
        \stepcounter{currline}%
        \c@currpage=\c@linecurrpage%
        \c@currcol=0%
        \hskip \outputhmargin%
        \@whilenum\value{currcol}<\pdfxupnbcols \do%
          {\ifnum\value{currcol}>0%
             \hskip\outputindivhmargin%
             \advance\c@currpage by \vertincr%
            \fi%
            \stepcounter{currcol}%
            \ifnum\value{currpage}>\value{lastpage}\else
	      %% computing page number corresponding to \currline and \currcol
              \c@realout=\value{currpage}%
              \def\ang{0}%
              \ifbooklet
               \iflongedge
                %% long edge:
                %% 1->n, 2->1, 3->n-1 (rotated), 4->2(rotated)...
                \ifodd\value{realout}%           -> 1 or 3
                  \addtocounter{realout}{-1}%
                  \divide\c@realout by 2\relax
                  \ifodd\value{realout}%         -> 3
                    \def\ang{180}%
                  \else%                         -> 1
                  \fi
                  \setcounter{realout}{-\value{realout}}%
                  \addtocounter{realout}{\value{outpage}}%
                  \addtocounter{realout}{\value{outpage}}%
                \else%                           -> 2 or 4
                  \divide\c@realout by 2\relax
                  \ifodd\value{realout}%         -> 2
                  \else%                         -> 4
                    \def\ang{180}%
                  \fi
                \fi
               \else 
                %% short edge:
                %% 1->n, 2->1, 3->2, 4->n-1, 5->n-2, 6->3, 7->4, 8->n-3
                \ifodd\value{realout}%           -> 1 or 3
                  \addtocounter{realout}{-1}%
                  \divide\c@realout by 2\relax
                  \ifodd\value{realout}%         -> 3
                    \stepcounter{realout}
                  \else%                         -> 1
                    \setcounter{realout}{-\value{realout}}%
                    \addtocounter{realout}{\value{outpage}}%
                    \addtocounter{realout}{\value{outpage}}%
                  \fi
                \else%                           -> 2 or 4
                  \divide\c@realout by 2\relax
                  \ifodd\value{realout}%         -> 2
                  \else%                         -> 4
                    \setcounter{realout}{-\value{realout}}%
                    \stepcounter{realout}
                    \addtocounter{realout}{\value{outpage}}%
                    \addtocounter{realout}{\value{outpage}}%
                  \fi
                \fi
               \fi %% \iflongedge...\else
              \fi %% \ifbooklet
              \ifnum\value{realout}>\pdfxupnbpages\relax
	        %% if page above nb of pages, output blank page
                %\hskip\hresult\hskip2\fboxrule
		\hskip\hboxsize
              \else
                %% otherwise compute corresponding page to display
	        %% first keep realout for watermarking...
	        \setcounter{wmoutaux}{\value{realout}}%
	        \setcounter{wmout}{\value{realout}}%
                \nthvalue{\value{realout}}{\pdfxuppagelist}%
                \iffound\setcounter{realout}{\value{result}}%
                \else %% hmmm... problem
                \message{I'm messed up counting pages...}%
                \fi
                %% compute watermarking page and display
	        \ifx\pdfxupwatermark\@empty\else
	  	  \ifnum\pdfxupnbwp<\value{wmoutaux}\relax
		    \addtocounter{wmoutaux}{-\pdfxupnbwp}%
		    \addtocounter{wmoutaux}{-1}%
		    \divide\c@wmoutaux by \pdfxupwperiod\relax
                    \stepcounter{wmoutaux}%
		    \multiply\c@wmoutaux by \pdfxupwperiod\relax
		    \addtocounter{wmout}{-\value{wmoutaux}}%
		  \fi
		  \vbox to \vboxsize{\vfill
	          \hbox to \hboxsize{\hfill
		    \includegraphics[keepaspectratio,%
		    height=\vresult,width=\hresult,angle=\ang,%
                    page=\value{wmout}\pdfxupclipopt]{\pdfxupwatermark}\hfill}\vfill}%
		    \hskip-\hboxsize\relax
		\fi
                %% display current page at correct size
                \edef\pdfxupinclgr{\includegraphics[\pdfxupbbox,%
                    keepaspectratio,height=\vresult,width=\hresult,angle=\ang,%
                    page=\value{realout}\pdfxupclipopt]{\pdfxupfile}}%
	        \pdfxupwidefbox{\vbox to \vboxsize{\vfill
		\hbox to \hboxsize{\hfill
                \pdfxuptightfbox{\hskip\innerhmargin\relax
		    \sbox{0}{\pdfxupinclgr}%
		    \ht0=\dimexpr\ht0 + \innervmargin\relax
                    \dp0=\dimexpr\dp0 + \innervmargin\relax
		    \usebox{0}\hskip\innerhmargin\relax}%
                    \hfill}\vfill}}%
              \fi
            \fi}}%
        \clearpage%
  }%
  \makeatother%
  \end{document}
