在页面末尾组合 \vfill 和 \vskip 会产生空白行

在页面末尾组合 \vfill 和 \vskip 会产生空白行

我想定义一个环境,用来\vskip在前后留出一些空间。通常它会用在普通文本中,但有时我想用 将其推到页面底部\vfill。当环境被放置在页面底部时,由于页面上的当前文本没有 ,\vfill之后\vskip会被忽略 - 但使用 时不会\vfill

有没有办法在两种情况下获得相同的行为(忽略\vskip)?

即使没有环境,也会发生这种情况,如下面的 MWE 所示。

\documentclass{article}

\begin{document}

test

\vfill % \vskip\baselineskip is added and causes a blank line at the bottom of the page
       % without that \vfill no space (glue) is inserted at the end (see below)

test

\vskip\baselineskip

\end{document}

在这边搜索了一会儿之后,我找到了\showoutput查看文档中发生了什么的命令。我试图找出造成这种差异的原因并实现我想要的……但没有成功。这是\showoutput该示例的相关部分(我认为)。区别只是一行有或没有\vfill

...\hbox(6.15+0.11)x345.0, glue set 313.84fil, direction TLT
....\localpar
.....\localinterlinepenalty=0
.....\localbrokenpenalty=0
.....\localleftbox=null
.....\localrightbox=null
....\hbox(0.0+0.0)x15.0, direction TLT
....\TU/lmr/m/n/10 t
....\TU/lmr/m/n/10 e
....\TU/lmr/m/n/10 s
....\TU/lmr/m/n/10 t
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0
...\glue 0.0 plus 1.0fill % That's the \vfill I guess
...\glue(\parskip) 0.0 plus 1.0
...\glue(\parskip) 0.0
...\glue(\baselineskip) 5.74
...\hbox(6.15+0.11)x345.0, glue set 313.84fil, direction TLT
....\localpar
.....\localinterlinepenalty=0
.....\localbrokenpenalty=0
.....\localleftbox=null
.....\localrightbox=null
....\hbox(0.0+0.0)x15.0, direction TLT
....\TU/lmr/m/n/10 t
....\TU/lmr/m/n/10 e
....\TU/lmr/m/n/10 s
....\TU/lmr/m/n/10 t
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
....\glue(\rightskip) 0.0
...\glue 12.0 % That's the \vskip I guess (it disappears without the \vfill)
...\glue -0.11
...\glue 0.0 plus 1.0fil
...\glue 0.0
...\glue 0.0 plus 0.0001fil

顺便说一句,对于\vspace\addvspace也会发生同样的情况\vskip

答案1

我认为您应该定义两个相关的环境:foo用于文本块的正常外观并将foo*其移动到页面底部。

\documentclass{article}

\usepackage[a6paper,showframe]{geometry}
\usepackage{lipsum}

\newenvironment{foo}{%
  \par\addvspace{\baselineskip}\startfoo
}{%
  \par\addvspace{\baselineskip}%
}
\newenvironment{foo*}{%
  \par\vfill\startfoo
}{%
  \par
}
\newcommand{\startfoo}{\noindent\textbf{Foo.}\ \ignorespaces}

\begin{document}

\lipsum[1][1-5]

\begin{foo}
\lipsum[2][1-3]
\end{foo}

\lipsum[3][1-5]

\clearpage

\lipsum[1][1-5]

\begin{foo*}
\lipsum[2][1-3]
\end{foo*}

\end{document}

我在前言中加载的包只是为了生成一个显示页边距的较小图片。我提供了环境的模拟定义。

在此处输入图片描述

相关内容