# Automate Fixed Width Page, length > some minimum length, but only as long as needed

I am trying to automate the solution proposed by egreg to How define a fixed width page, but length > some minimum length, but only as long as needed by hooking into \begin{document} and \end{document}.

So, egreg's solution works fine:

\documentclass{article}
\def\MinimumPaperHeight{12cm}
\usepackage{geometry}
\geometry{paperwidth=\MinimumPaperHeight,paperheight=\maxdimen,margin=1cm}
\usepackage{lipsum}

\begin{document}
\setbox0=\vbox{
\lipsum[1-6]
}
\dimen0=\dp0
\pdfpageheight=\dimexpr\ht0+2cm\relax
\ifdim\pdfpageheight<\MinimumPaperHeight \pdfpageheight=\MinimumPaperHeight \fi
\unvbox0\kern-\dimen0
\end{document}


But can't seem to get this to work:

\documentclass{article}
\def\MinimumPaperHeight{12cm}
\usepackage{geometry}
\geometry{paperwidth=\MinimumPaperHeight,paperheight=\maxdimen,margin=1cm}
\usepackage{lipsum}
\usepackage{environ}

\NewEnviron{MyBox}{
\setbox0=\vbox{\BODY}%
}{%
\dimen0=\dp0%
\pdfpageheight=\dimexpr\ht0+2cm\relax%
\ifdim\pdfpageheight<\MinimumPaperHeight \pdfpageheight=\MinimumPaperHeight \fi%
\unvbox0\kern-\dimen0%
}

\AtBeginDocument{\begin{MyBox}}
\AtEndDocument{\end{MyBox}}

\begin{document}
\lipsum[1-6]
\end{document}


Hooking into \AtBeginDocument is per this solution on How to automatically add text immediately after \begin{document}.

-

This can't work, because \begin{MyBox} needs to see \end{MyBox}, but it doesn't because the document ends before the tokens are actually present: the contents of an environment defined with \NewEnviron is not expanded until it's processed with the expansion of \BODY.

One solution is to hook directly into \document and \enddocument:

\usepackage{etoolbox}

\AtBeginDocument{
\setbox0=\vbox\bgroup
\preto\enddocument{\egroup
\dimen0=\dp0
\pdfpageheight=\dimexpr\ht0+2cm\relax
\ifdim\pdfpageheight<\MinimumPaperHeight
\pdfpageheight=\MinimumPaperHeight
\fi
\unvbox0\kern-\dimen0 }
}


(Not heavily tested, sorry.)

-
This works great. But, if using the standalone package, need to use [preview=false] option. –  Peter Grill Sep 4 '11 at 19:38