Distribución espacial vertical condicional del contenido creado en bucle for

Distribución espacial vertical condicional del contenido creado en bucle for

Estoy creando una plantilla de informe que tiene una sección de "evaluación" para cada una de las muchas personas. Cada sección de evaluación se compone de tres componentes: un encabezado y dos bloques de texto (cada uno colocado dentro de un tcolorbox). Las secciones de evaluación se generarán dinámicamente utilizando un motor de plantillas, por lo que el contenido y el número de secciones se desconocen de antemano.

Para ahorrar espacio, quiero permitir que cada sección se distribuya en dos páginas si es necesario. Sin embargo, no quiero que el encabezado y el primer bloque de texto estén separados. Para manejar esto, los coloqué dentro de un bloque de la misma página. Ahora la distribución del contenido es correcta, pero quiero mejorar el espaciado en cada página. Quiero que las secciones de cada página se distribuyan uniformemente de modo que el espacio arriba, entre y debajo sea uniforme (a diferencia de la parte inferior, donde encima de los elementos superiores y debajo de los inferiores no hay espacio).

Puedo utilizarlo \vspace*{\vfill}para que esto funcione de alguna manera, sin embargo, quiero asegurarme de que si una sección de evaluación completa cabe en una página, entonces no hay espacio adicional entre los dos bloques de texto. He probado varias combinaciones de espaciado y par para que esto funcione, pero creo que me falta la terminología para describir de manera concisa mi problema e investigarlo.

Aquí hay un MWE que demuestra la estructura general del contenido. Escribí algunos comentarios e intenté colocar algunos comandos vfill en lugares que creo que pueden ayudar. Por lo general, al final caben un informe y medio por página. Lo ideal sería que el espacio encima del primer informe, entre el primer informe y el segundo informe y debajo del segundo informe fuera igual.

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

Respuesta1

Lo que hice aquí fue agregar un \vspace{\fill}después del primer bloque y luego, dentro del segundo centerbloque, agregué un \vspace{-\fill}. Si aparecen en la misma página, entonces los dos \vspaces se cancelan, pero si se separan, un positivo residual \vspacedespués del primer bloque permanece activo en la parte inferior de la página. El negativo \vspaceque aparece en la parte superior de la página siguiente no tiene ningún efecto neto.

Debido a que los centerentornos agregan espacio vertical adicional, y el OP indicó mantener los bloques juntos si están en la misma página, también agregué un espacio \vspace{-2\topsep}entre bloques.

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

información relacionada