Distribuição de espaço vertical e condicional de conteúdo criado em loop for

Distribuição de espaço vertical e condicional de conteúdo criado em loop for

Estou criando um modelo de relatório que possui uma seção de "avaliação" para cada um dos vários indivíduos. Cada seção de avaliação é composta por três componentes: um título e dois blocos de texto (cada um colocado dentro de uma tcolorbox). As seções de avaliação serão geradas dinamicamente usando um mecanismo de modelo, portanto o conteúdo e o número de seções são desconhecidos de antemão.

Para economizar espaço, quero permitir que cada seção seja distribuída em duas páginas, se necessário. No entanto, não quero que o título e o primeiro bloco de texto sejam separados. Para lidar com isso, coloquei-os dentro de um bloco de mesma página. Agora a distribuição do conteúdo está correta, mas quero melhorar o espaçamento de cada página. Quero que as seções de cada página sejam distribuídas uniformemente, de modo que o espaçamento acima, entre e abaixo seja uniforme (ao contrário do flushbottom, onde acima dos elementos superiores e abaixo dos elementos inferiores não há espaço).

Posso usar \vspace*{\vfill}para fazer isso funcionar de alguma forma, no entanto, quero garantir que, se uma seção de avaliação inteira couber em uma página, não haja espaço adicional entre os dois blocos de texto. Tentei várias combinações de espaçamento e par para fazer isso funcionar, mas acho que me falta a terminologia para descrever concisamente meu problema e pesquisá-lo.

Aqui está um MWE que demonstra a estrutura geral do conteúdo. Anotei alguns comentários e tentei colocar alguns comandos vfill em lugares que acho que podem ajudar. Normalmente, um relatório e meio caberá por página. Idealmente, o espaçamento acima do primeiro relatório, entre o primeiro relatório e o segundo relatório e abaixo do segundo relatório seriam todos iguais.

\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}

Responder1

O que fiz aqui foi adicionar um \vspace{\fill}após o primeiro bloco e depois, dentro do segundo centerbloco, adicionei um \vspace{-\fill}. Se aparecerem na mesma página, os dois \vspaces são cancelados, mas se separados, um resíduo positivo \vspaceapós o 1º bloco permanece ativo na parte inferior da página. A negativa \vspaceno topo da próxima página não tem efeito líquido.

Como os centerambientes adicionam espaço vertical extra, e o OP indicava manter os blocos juntos se estivessem na mesma página, também adicionei um \vspace{-2\topsep}entre os blocos.

\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}

informação relacionada