\vspace* (星号)将文本移动到其上方

\vspace* (星号)将文本移动到其上方
\documentclass{article}

\begin{document}

aaa

\vspace*{100cm}

bbb

\end{document}

我期望aaa放在第一页,然后看到 100cm 的空白(分布在许多页面上),最后bbb。但是,第 1 页是空的,然后第 2 页有空aaa,然后文档结束。为什么?

答案1

vspace 是一个大块。因此,您会得到一个满溢的框,而 bbb 位于页面之外的某个地方。aaa 会随空间一起移动到第 2 页,因为 \vspace* 之前没有断点。要获得所需的结果,您最好在循环中使用较小的 vspace:

\documentclass{article}
\usepackage{pgffor}
\begin{document}

aaa

\foreach\x in {1,2,...,100}
{\penalty0 \vspace*{1cm}}

bbb

\end{document}

答案2

您实际上得到的是一大块不可分割的空白,并且由于 LaTeX 的一个特性,如果第一页超出了容量,则会生成一个空白页,内容将移至下一页,而下一页又会超出容量。“bbb”消失在纸张底部边缘以下约一米处。

这是一个\breakablevspace不会出现此问题的宏:它将保留请求的空间,并将其划分为必要的空白页。尽情享受吧,我不会给出解释:请阅读书籍。;-)可以说,该空间实际上是 2845.27559pt,即正好是 100cm。

\documentclass{article}

\makeatletter
\newdimen\bvs@temp
\newcommand{\breakablevspace}[1]{%
  \par
  \bvs@temp=#1\relax
  \breakable@vspace
}
\newcommand{\breakable@vspace}{%
  \ifdim\dimexpr
    \ifdim\pagegoal=\maxdimen
      \textheight
    \else
      \pagegoal-\pagetotal
    \fi
   \relax<\bvs@temp
    \bvs@temp=\dimexpr\bvs@temp
      \ifdim\pagegoal=\maxdimen
        -\textheight
      \else
        -\pagegoal+\pagetotal
      \fi
    \relax
    \vspace*{\fill}%
    \newpage
    \hrule height\z@
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  \breakable@vspace
  {\vspace*{\bvs@temp}}%
}
\makeatother

\begin{document}

aaa

\breakablevspace{100cm}

bbb

\end{document}

相关内容