Я создаю шаблон отчета, в котором есть раздел "оценка" для каждого из многих людей. Каждый раздел оценки состоит из трех компонентов: заголовка и двух текстовых блоков (каждый из которых размещен внутри 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}
. Если они появляются на одной странице, то два \vspace
s отменяются, но если они разделены, остаточный положительный \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}