5

In the following sample, the geometry doesn't change even though I believe it should. What am I doing wrong and how can I fix it?

\documentclass{article}
\usepackage{lipsum}
\usepackage{afterpage}
\usepackage[bottom=5cm]{geometry}
\begin{document}
\afterpage{\newgeometry{bottom=1cm}}
\lipsum
\lipsum
\end{document}
4
  • Are you trying to make the first page shorter than the following ones?
    – egreg
    Sep 11, 2015 at 10:50
  • Do not use afterpage or newgeometry for this. Just use \enlargethispage on the first page to change its size. Sep 11, 2015 at 11:17
  • I have a letter with a giant footer on the first page. The pages after the first one have small ones that would fit without any fiddling. So yes I am trying to decrease the typearea on the first page in favour of the footer
    – Max
    Sep 11, 2015 at 11:21
  • so use \enlargethispage{-3cm} on the first page. Sep 11, 2015 at 11:25

5 Answers 5

5

enter image description here

\documentclass{article}
\usepackage{lipsum}
%please, no:-)\usepackage{afterpage}
%\usepackage[bottom=5cm]{geometry}
\begin{document}
\enlargethispage{-5cm}
\lipsum
\lipsum
\end{document}
2
  • I am sorry. While this solves it for the minimal sample, I run into issues with geometry. If I use the showframe option to that package, I can see that while the text obeys the \enlargethispage the textarea and more importantly the footer does not and runs off the page's end.
    – Max
    Sep 11, 2015 at 11:45
  • @Max Yes but the normal thing is to put the footer into \smash{some big image} so the height is hidden and so it overprints the space left in the text area. Sep 11, 2015 at 12:11
2

afterpage puts it argument in a group and then (most of) the settings of \newgeometry don't work as you can see here:

\documentclass{article}
\usepackage{lipsum}
\usepackage{afterpage}
\usepackage[bottom=5cm]{geometry}
\begin{document}
\lipsum
\lipsum
{\newgeometry{bottom=1cm}} %bottom ignored
\lipsum
\lipsum
\newgeometry{bottom=1cm}
\lipsum
\lipsum

\end{document}
2
  • Hmm Is there some way to break out of the group or some other way to achieve this?
    – Max
    Sep 11, 2015 at 11:23
  • Use David's suggestion. You can hide the height of the large footer with e.g. \lfoot{\smash{\rule{3cm}{5cm}}}. afterpage injects code in the output routine and you really don't want it to leak out. Sep 11, 2015 at 12:39
2

The trick is not using \newgeometry, that would issue a page break anyway, but \enlargethispage; with fancyhdr you are ensured that the footer will stay in position, it's only sufficient to \smash the giant footer for the first page.

\documentclass{article}
\usepackage{fancyhdr}
\usepackage{graphicx}

\usepackage{lipsum}

\pagestyle{fancy}
\fancyhf{}
\renewcommand{\headrulewidth}{0pt}
\fancyfoot[C]{\small\thepage}

\fancypagestyle{first}{%
  \fancyhf{}%
  \renewcommand{\headrulewidth}{0pt}%
  \fancyfoot[C]{\giantfooter}%
}

\newcommand{\giantfooter}{%
  \leavevmode\smash{\includegraphics[height=5cm]{duck}}%
}

\begin{document}
\thispagestyle{first}\enlargethispage{-5cm}

\lipsum[1-20]

\end{document}

enter image description here

2

After searching the entire internet for a solution (the ones listed here did not work for my setup), I finally came up with this one:

%setup your default geometry:
\usepackage[a4paper, left=2.3cm, right=2.3cm, bottom=2.0cm, top=3.0cm]{geometry}

%use this package to get the "on-every-page-do-this-Hook" below
\usepackage{everypage} 

\begin{document}

%this line registers the reset-hook:
\AddEverypageHook{\ifnum\value{page}=2\restoregeometry\else\fi}

%and this line sets your special geometry which is cleared by the hook above on page N (with N=2 in this case)
\newgeometry{left=2.3cm, right=1.7cm, bottom=2.0cm, top=9.7cm}

EDIT:

After wrapping up my proposal to a compilable example spanning several pages with lorem-ipsum-text I found it actually not working properly!

So, instead, the afterpage-package in combination with \globaldefs=1 seems like the way to go here:

\documentclass{article}
\usepackage{lipsum}
\usepackage{afterpage}
\usepackage[bottom=5cm]{geometry}
\begin{document}
\afterpage{\globaldefs=1 \newgeometry{bottom=1cm}}
\lipsum
\lipsum
\end{document}
3
  • 2
    Can you please make this code compilable and add an screenshot of your result to your answer?
    – Mensch
    Mar 9, 2019 at 11:55
  • This worked exactly as I needed it, and the \globaldefs=1 did exactly what it needed. Could you add a bit of explanation as to what \globaldefs=1 does to fix this or provide a link?
    – oliversm
    Oct 15, 2019 at 16:27
  • Glad to hear that it worked for you! If I got it right, the \globaldefs=1 statement lifts the subsequent newgeometry... statement out of the deeper scope from which it will be invoked (i. e. the scope that it is given by the \afterpage-logic) up to the global scope where it has to overwrite the desired parameter setting (bottom=5cm by bottom=1cm). Here's a first anchor: https://en.wikibooks.org/wiki/TeX/globaldefs
    – Sebastian
    Oct 16, 2019 at 18:00
1

Here is a solution

\documentclass{article}
\usepackage{lipsum}

\usepackage{atbegshi}
\usepackage[bottom=5cm]{geometry}
\begin{document}
\makeatletter
\AtBeginShipoutNext{%
\global\addtolength{\textheight}{4cm}%
\global\setlength{\@colht}{\textheight}}
\makeatother
\lipsum
\lipsum
\lipsum
\lipsum
\lipsum
\end{document}

You must log in to answer this question.

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