如何在 ConTeXt 中垂直居中不带妆容的页面内容?

如何在 ConTeXt 中垂直居中不带妆容的页面内容?

我需要使页面内容垂直居中,内容被强制放在单独的页面上(用\page命令分隔)。

previous page content

\page 

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

\page 

next page

放在\vfill第一行后面\page没有任何作用。我需要在不使用排版的情况下将内容居中,因为排版会删除页码,但我需要像往常一样排版此页面。

答案1

在正常排版模式下进入页面时,上下文

  1. 处于垂直模式,并且
  2. 将吞噬紧随其后的所有跳过,以便适当地对齐文本主体第一行的顶部。

因此,在页面顶部插入垂直跳过不会产生任何影响。

为了解决这个问题,你需要强制 TeX 进入水平模式,你可以这样做

  1. 插入水平材料,例如支柱,或
  2. 明确终止垂直模式,这通常是通过\dontleavehmode 指令(上下文同义词 \quitvmode 原始的),或者鲜为人知的 \leavevmode[0].

惯用的解决方案如下:

\starttext
  \dontleavehmode \vfill
  foo
  \vfill
\stoptext

示例输出

因此,如果您打算在不使用构成元素的情况下垂直居中页面,则可以定义如下环境(感谢 /u/Aditya 的建议):

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

\starttext
  \startcenteredpage
    foo
  \stopcenteredpage
\stoptext

与此相关的是,你要求的实际上可以通过调整 选择\setupmakeup。关键设置是pagestate将谁的值传递给隐式的\setuppagenumber,以及headerstatefooterstate。要使页眉和页脚出现在结构上,并防止页码忽略该页面,需要将这些选项设置为 开始(他们默认停止)。 例如:

\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

化妆示例

[0] 讨论\leavevmodevs. \dontleavehmode/ \quitvmode请参阅 Taco 在 Pdftex 列表上的这篇文章

相关内容