有条件地,for 循环创建内容的垂直空间分布

有条件地,for 循环创建内容的垂直空间分布

我正在创建一个报告模板,其中为许多人中的每一个人都提供了一个“评估”部分。每个评估部分由三个部分组成:一个标题和两个文本块(每个文本块都放在 tcolorbox 内)。评估部分将使用模板引擎动态生成,因此部分的内容和数量事先是未知的。

为了节省空间,我希望允许每个部分分布在两页上(如果需要)。但是,我不希望标题和第一个文本块分开。为了解决这个问题,我将它们放在同一个页面块中。现在内容的分布是正确的,但我想改善每页的间距。我希望每页上的部分均匀分布,使得上方、中间和下方的间距都是均匀的(与 flushbottom 不同,其中顶部元素上方和底部元素下方没有空间)。

我可以使用\vspace*{\vfill}来使它工作,但是,我想确保如果整个评估部分适合一页,那么两个文本块之间没有额外的空间。我尝试了各种间距和 par 组合来使其工作,但我认为我缺乏简洁地描述我的问题并对其进行研究的术语。

这是演示内容一般结构的 MWE。我写下了一些评论,并尝试将一些 vfill 命令放在我认为可能有帮助的地方。通常最终每页会放一个半报告。理想情况下,第一个报告上方、第一个报告与第二个报告之间以及第二个报告下方的间距都应相等。

\documentclass{report}

\usepackage[letterpaper,margin=0.5in]{geometry}

\usepackage[most]{tcolorbox}
\usepackage{parskip}
\usepackage{pgffor}
\usepackage{lipsum}

\usepackage{showframe}

%\flushbottom
\newtcolorbox{containingBox}[1][]{%
  width=16cm,
  arc=0mm,
  colframe=blue,
  colback=blue,
  nobeforeafter,
  after skip=15pt,
  #1,
}% 

\pagestyle{empty}

\begin{document}

\foreach \n in {0,...,5} {
  \vspace*{\fill}

  % Heading and first text block
  \begin{samepage}
    {\fontsize{24pt}{1em}\bfseries Header Text}
    \begin{center}
      \begin{containingBox}
        \lipsum[1]
      \end{containingBox}
    \end{center}
  \end{samepage}

  % Second section that can break to another page, but 
  % should stay close if on same page
  % This is where I want to put a vfill only if
  % this block has gotten separated

  %\vspace*{\fill}

  \begin{center}
    \begin{containingBox}
      \lipsum[1-2]
    \end{containingBox}
  \end{center}
  \vspace*{\fill}
 }
\end{document}

答案1

\vspace{\fill}我在这里所做的是在第一个块后添加一个,然后在第二个center块内添加一个\vspace{-\fill}。如果它们出现在同一页上,则两个\vspaces 会取消,但如果分开,第一个块后的剩余正值\vspace仍会在页面底部保持活动状态。\vspace下一页顶部的负值没有净效应。

因为center环境增加了额外的垂直空间,并且 OP 指示如果在同一页面上则将块保持在一起,所以我还在\vspace{-2\topsep}块之间添加了一个。

\documentclass{report}

\usepackage[letterpaper,margin=0.5in]{geometry}

\usepackage[most]{tcolorbox}
\usepackage{parskip}
\usepackage{pgffor}
\usepackage{lipsum}

\usepackage{showframe}

%\flushbottom
\newtcolorbox{containingBox}[1][]{%
  width=16cm,
  arc=0mm,
  colframe=blue,
  colback=blue,
  nobeforeafter,
  after skip=15pt,
  #1,
}% 

\pagestyle{empty}

\begin{document}

\foreach \n in {0,...,5} {
  \vspace*{\fill}

  % Heading and first text block
  \begin{samepage}
    {\fontsize{24pt}{1em}\bfseries Header Text}
    \begin{center}
      \begin{containingBox}
        \lipsum[1]
      \end{containingBox}
    \end{center}
  \end{samepage}
  % Second section that can break to another page, but 
  % should stay close if on same page
  % This is where I want to put a vfill only if
  % this block has gotten separated
  \vspace{-2\topsep}
  \vspace{\fill}
  \begin{center}
  \vspace{-\fill}
    \begin{containingBox}
      \lipsum[1-2]
    \end{containingBox}
  \end{center}
  \vspace*{\fill}
 }
\end{document}

相关内容