forループで作成されたコンテンツの条件付き垂直空間配分

forループで作成されたコンテンツの条件付き垂直空間配分

私は、多数の個人それぞれについて「評価」セクションを持つレポート テンプレートを作成しています。各評価セクションは、見出しと 2 つのテキスト ブロック (それぞれ tcolorbox 内に配置) の 3 つのコンポーネントで構成されています。評価セクションはテンプレート エンジンを使用して動的に生成されるため、セクションの内容と数は事前に不明です。

スペースを節約するために、必要に応じて各セクションを 2 ページに分散できるようにしたいと思います。ただし、見出しと最初のテキスト ブロックを分離したくはありません。これに対処するために、それらを同じページ ブロック内に配置しました。これでコンテンツの分散は正しくなりましたが、各ページの間隔を改善したいと思います。各ページのセクションを均等に分散して、上、間、下の間隔がすべて均一になるようにしたいと思います (上部の要素の上と下部の要素の下にスペースがない flushbottom とは異なります)。

ある程度はこれを実現できます\vspace*{\vfill}が、評価セクション全体が 1 ページに収まる場合、2 つのテキスト ブロックの間に余分なスペースがないことを確認したいと思います。これを実現するために、さまざまなスペースと par の組み合わせを試しましたが、問題を簡潔に説明して調査するための用語が不足していると思います。

ここに、コンテンツの一般的な構造を示す MWE があります。コメントをいくつか書き留め、役立つと思われる場所に vfill コマンドをいくつか配置してみました。通常は、1 ページに 1.5 個のレポートが収まることになります。理想的には、最初のレポートの上、最初のレポートと 2 番目のレポートの間、および 2 番目のレポートの下の間隔がすべて等しくなります。

\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}、2 番目のcenterブロック内に を追加することです\vspace{-\fill}。これらが同じページに表示された場合は 2 つの\vspaceがキャンセルされますが、離れている場合は、最初のブロックの後の残りの正の部分\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}

関連情報