Bedingte, vertikale Raumverteilung von durch For-Schleife erstellten Inhalten

Bedingte, vertikale Raumverteilung von durch For-Schleife erstellten Inhalten

Ich erstelle eine Berichtsvorlage, die für jede von mehreren Personen einen Abschnitt „Bewertung“ enthält. Jeder Bewertungsabschnitt besteht aus drei Komponenten: einer Überschrift und zwei Textblöcken (jeder in einer Farbbox platziert). Die Bewertungsabschnitte werden dynamisch mithilfe einer Vorlagen-Engine generiert, sodass Inhalt und Anzahl der Abschnitte im Voraus unbekannt sind.

Um Platz zu sparen, möchte ich, dass sich jeder Abschnitt bei Bedarf über zwei Seiten erstreckt. Ich möchte jedoch nicht, dass die Überschrift und der erste Textblock getrennt sind. Um dies zu erreichen, habe ich sie in einem Samepage-Block platziert. Jetzt ist die Verteilung des Inhalts korrekt, aber ich möchte den Abstand auf jeder Seite verbessern. Ich möchte, dass die Abschnitte auf jeder Seite gleichmäßig verteilt sind, sodass der Abstand oben, dazwischen und darunter einheitlich ist (im Gegensatz zu Flushbottom, wo über den oberen und unter den unteren Elementen kein Abstand ist).

Ich kann \vspace*{\vfill}das einigermaßen hinbekommen, möchte aber sicherstellen, dass, wenn ein ganzer Bewertungsabschnitt auf eine Seite passt, kein zusätzlicher Abstand zwischen den beiden Textblöcken entsteht. Ich habe verschiedene Kombinationen von Abstand und Par ausprobiert, um das hinzubekommen, aber ich glaube, mir fehlt die Terminologie, um mein Problem präzise zu beschreiben und zu untersuchen.

Hier ist ein MWE, das die allgemeine Struktur des Inhalts demonstriert. Ich habe einige Kommentare aufgeschrieben und versucht, einige vfill-Befehle an Stellen zu platzieren, die meiner Meinung nach hilfreich sein könnten. Normalerweise passen am Ende eineinhalb Berichte pro Seite. Im Idealfall ist der Abstand über dem ersten Bericht, zwischen dem ersten und dem zweiten Bericht und unter dem zweiten Bericht gleich.

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

Antwort1

Ich habe hier nach dem ersten Block ein hinzugefügt \vspace{\fill}und dann innerhalb des zweiten centerBlocks ein \vspace{-\fill}. Wenn sie auf derselben Seite erscheinen, heben sich die beiden \vspaces auf, aber wenn sie getrennt sind, bleibt ein positives Restzeichen \vspacenach dem ersten Block unten auf der Seite aktiv. Das Negative \vspaceoben auf der nächsten Seite hat keinen Nettoeffekt.

Da die centerUmgebungen zusätzlichen vertikalen Raum hinzufügen und der OP angab, die Blöcke zusammenzuhalten, wenn sie sich auf derselben Seite befinden, habe ich auch einen \vspace{-2\topsep}Zwischenblock hinzugefügt.

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

verwandte Informationen