Условное вертикальное распределение пространства для контента, созданного циклом for

Условное вертикальное распределение пространства для контента, созданного циклом for

Я создаю шаблон отчета, в котором есть раздел "оценка" для каждого из многих людей. Каждый раздел оценки состоит из трех компонентов: заголовка и двух текстовых блоков (каждый из которых размещен внутри tcolorbox). Разделы оценки будут генерироваться динамически с использованием шаблонизатора, поэтому содержание и количество разделов заранее неизвестны.

Чтобы сэкономить место, я хочу, чтобы каждый раздел распределялся по двум страницам, если это необходимо. Однако я не хочу, чтобы заголовок и первый текстовый блок были разделены. Чтобы справиться с этим, я поместил их в блок samepage. Теперь распределение контента правильное, но я хочу улучшить интервалы на каждой странице. Я хочу, чтобы разделы на каждой странице были равномерно распределены, так чтобы интервалы сверху, между и снизу были одинаковыми (в отличие от flatbottom, где над верхним и под нижним элементами нет пробелов).

Я могу использовать \vspace*{\vfill}, чтобы как-то сделать это, однако, я хочу убедиться, что если весь раздел оценки умещается на одной странице, то между двумя текстовыми блоками не будет дополнительного пространства. Я пробовал различные комбинации интервалов и пар, чтобы сделать это, но я думаю, что мне не хватает терминологии, чтобы кратко описать мою проблему и исследовать ее.

Вот 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

Что я сделал здесь, так это добавил a \vspace{\fill}после первого блока, а затем, внутри 2-го centerблока, добавил a \vspace{-\fill}. Если они появляются на одной странице, то два \vspaces отменяются, но если они разделены, остаточный положительный \vspaceпосле 1-го блока остается активным внизу страницы. Отрицательный \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}

Связанный контент