4

I need to vertically center the content of page, content is forced to be on a separate page (delimeted with \page command).

previous page content

\page 

this content must be verticaly centered on it's page.

\page 

next page

placing \vfill after first \page does nothing. I need to center content without using makeup, because makeup removes page numbering, but I need to typeset this page as usual.

2
  • 1
    \dontleavehmode \vfill foo bar \vfill. Jan 23, 2014 at 6:20
  • That works! You can post your answer to get score.
    – s9gf4ult
    Jan 23, 2014 at 11:11

1 Answer 1

7

When entering a page in normal typesetting mode, Context

  1. is in vertical mode, and
  2. will gobble all skips that follow immediately so as to align the top of the first line of the text body appropriately.

For this reason, inserting a vertical skip has no effect at the top of a page.

To work around this behavior you need to force TeX into horizontal mode, which you can do by

  1. inserting horizontal material, for instance a strut, or
  2. terminating vertical mode explicitly, which is usually done by means of the \dontleavehmode directive (the Context synonym for the \quitvmode primitive), or alternatively the lesser known \leavevmode [0].

The idiomatic solution would look like this:

\starttext
  \dontleavehmode \vfill
  foo
  \vfill
\stoptext

Example output

Thus, if you intend to vertically center a page without using makeups, you could define an environment as follows (thanks to /u/Aditya for the suggestion):

\definestartstop [centeredpage] [
  before=\dontleavehmode \vfill,
  after=\vfill,
]

\starttext
  \startcenteredpage
    foo
  \stopcenteredpage
\stoptext

On a related note, what you are asking for can actually be achieved conveniently by tweaking the options to \setupmakeup. The key settings are pagestate whose value is passed to an implicit \setuppagenumber, as well as headerstate and footerstate that govern the behavior of running heads and footers, respectively. To make headers and footers appear on the makeup, and to prevent the page numbering from ignoring that page, these options need to be set to start (they default to stop). For example:

\definemakeup [centeredpage]
\setupmakeup [centeredpage] [
  pagestate=start,
  top=\vfill,
  bottom=\vfill,
  headerstate=start,
  footerstate=start,
  page=yes,
]

\setupheadertexts [dummy header]
\setupfootertexts [dummy footer] [{\getnumber [userpage]}]

\starttext
  text on page before
  \startcenteredpagemakeup
    \input ward
  \stopcenteredpagemakeup
  text on page after
\stoptext

Example with makeup

[0] For a discussion of \leavevmode vs. \dontleavehmode / \quitvmode see this post by Taco on the Pdftex list.

4
  • It may be better to define a startstop environment for this rather than entering the raw commands in the text
    – Aditya
    Jan 24, 2014 at 14:00
  • @Aditya That’d amount to some makeshift version of makeups, wouldn’t it? Jan 24, 2014 at 18:08
  • Yes. But my comment was motivated by the idea that all markup in a document should be semantic markup. The OP probably want a dedication page (or copyright page), so the markup should show that.
    – Aditya
    Jan 24, 2014 at 19:27
  • 1
    @Aditya I incorporated your suggestion into the answer, though it’s not really semantic because OP didn’t give the purpose of the centered content. Jan 25, 2014 at 20:08

You must log in to answer this question.

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