Change paper size in mid-document
The following works in PDFLaTeX:
\documentclass{article}
\begin{document}
Normal page
\eject \pdfpagewidth=3in \pdfpageheight=10in
Tall page
\eject \pdfpagewidth=10in \pdfpageheight=3in
Wide page
\end{document}
That should work with Xelatex. See the SO qn, Change paper size in the middle of a latex document?, for more.
You can use the typearea
package (KOMA-Script bundle) to change the paper size and also recalculate all dependent margins, header and footer positions etc.
The following code demonstrates the technique but generates some warnings related to offended typesetting rules (placing 10pt font on A3 is not recommended). You might need to adjust some further typearea
settings for better results.
\documentclass{article}
\usepackage[paper=A4]{typearea}
\usepackage{lipsum}% dummy code
\begin{document}
\lipsum% Placed on A4
\KOMAoptions{paper=A3}
\recalctypearea
\lipsum% Placed on A3
\KOMAoptions{paper=A4}
\recalctypearea
\lipsum% Placed on A4 again
\end{document}
Some KOMA-Script options trigger a recalculation of the type area and the “page setup” automatically, but paper
does not. Nevertheless, a recalculation mid-document results in a new page, so no \clearpage
, \newpage
or \eject
is necessary here.
Here is an abridged example which switches between two custom page sizes with corresponding layouts (margins), which can compile with pdflatex
- for more details, see my answer in Problem with setting correct custom page size with 'geometry' in xelatex:
\documentclass{article}
% reminder: US letter: 596pt x 795pt
\newlength{\pagewidthA}
\newlength{\pageheightA}
\setlength{\pagewidthA}{300bp}
\setlength{\pageheightA}{400bp}
\newlength{\pagewidthB}
\newlength{\pageheightB}
\setlength{\pagewidthB}{400bp}
\setlength{\pageheightB}{500bp}
% stockwidth and stockheight - from memoir,
% here just for cheating `layouts` warnings
\newlength{\stockwidth}
\newlength{\stockheight}
\usepackage{geometry}
% this command will take effect into L1 layout just after \begin{document}
% but the L1 geometry will otherwise be ignored
\geometry{twoside,inner=50bp,outer=30bp,top=50bp,bottom=50bp}
\usepackage{tikz,enumitem}
\usepackage{fix-cm}
\usepackage{layouts}
\usepackage{etoolbox}
\patchcmd{\drawpage}{\ifdrawparameters}{\iftrue}%
{\typeout{^^J*******\string\drawpage fixed*******^^J}}%
{\typeout{^^J*******\string\drawpage not fixed*******^^J}}
\usepackage{lipsum}
\makeatletter
\newcommand{\printpagevalues}{%
% from geometry.sty:
* paper: \ifx\Gm@paper\@undefined<default>\else\Gm@paper\fi \\%
* layout: \ifGm@layout<custom>\else<same size as paper>\fi \\%
\@ifundefined{ifGm@layout}{}{%
\ifGm@layout
* layout(width,height): (\the\Gm@layoutwidth,\the\Gm@layoutheight) \\%
\fi
* layoutoffset:(h,v)=(\the\Gm@layouthoffset,\the\Gm@layoutvoffset) \\%
}%
\pagevalues % from package layouts
}
\makeatother
\newcommand{\generatePageLayouts}{%
\newgeometry{layoutwidth=\pagewidthA,layoutheight=\pageheightA,left=1mm,right=5mm,bottom=1mm,top=1mm}
\savegeometry{LayoutPageA}
\newgeometry{layoutwidth=\pagewidthB,layoutheight=\pageheightB,twoside,inner=2.5cm,outer=0.5cm,top=1.5cm,bottom=1.5cm}
\savegeometry{LayoutPageB}
}
\newcommand{\switchToLayoutPageA}{%
% switch page size first:
\pdfpagewidth=\pagewidthA \pdfpageheight=\pageheightA % for PDF output
\paperwidth=\pagewidthA \paperheight=\pageheightA % for TikZ
\stockwidth=\pagewidthA \stockheight=\pageheightA % hyperref (memoir)?!
\loadgeometry{LayoutPageA} % note; \loadgeometry may reset paperwidth/h!
}
\newcommand{\switchToLayoutPageB}{%
% switch page size first:
\pdfpagewidth=\pagewidthB \pdfpageheight=\pageheightB % for PDF output
\paperwidth=\pagewidthB \paperheight=\pageheightB % for TikZ
\stockwidth=\pagewidthB \stockheight=\pageheightB % hyperref (memoir)?!
\loadgeometry{LayoutPageB} % note; \loadgeometry may reset paperwidth/h!
}
\begin{document}
% here geometry layout L1 is instantiated;
% without anything else, paper size defaults to US letter!
% \restoregeometry command restores L1!!
\fontsize{8}{9}\selectfont % this nowork in preamble!
% generate page layouts first based on layoutwidth as page size;
% don't switch actual page sizes yet:
\generatePageLayouts{}
%%% start with content
% start with LayoutPageA (includes switching page size)
\switchToLayoutPageA{}
\pagestyle{empty} % no page numbers here
\\
\the\paperwidth
\lipsum[1]
\printpagevalues{}
\clearpage
% switch to LayoutPageB (includes switching page size)
\switchToLayoutPageB{}
% start page numbering here ("this will reset the page number"):
\pagenumbering{arabic}
% make page numbers visible
\pagestyle{plain}
\the\paperwidth
\lipsum[1]
Trying
some
text
\printpagevalues{}
\end{document}