Gleichzeitig flexibler vertikaler Abstand mit Seitenumbrüchen

Gleichzeitig flexibler vertikaler Abstand mit Seitenumbrüchen

Ich stoße auf ein Problem, das ich nicht lösen kann. Im Wesentlichen habe ich eine Seite mit etwas Text, möglicherweise einigen Gleichungen, ein paar Grafiken und vielleicht einer Tabelle, alles durch flexible Leerzeichen getrennt. Manchmal passt alles auf eine Seite, aber manchmal sind die Grafiken zu groß, sodass mehrere Seiten erforderlich sind.

Nehmen wir an, ich habe 3 Grafiken. Falls sie alle zu groß sind, um auf eine Seite zu passen, würde ich erwarten, dass die ersten beiden Grafiken auf der ersten Seite bleiben und gleichmäßig zusammen mit dem vorhergehenden Text verteilt werden, und dass die dritte Grafik zusammen mit dem folgenden Text oder den Tabellen usw. auf der nächsten Seite steht. Mein Code hält jedoch immer alle drei Grafiken zusammen.

Ich habe den Eindruck, dass es daran liegt, dass \vspaceein unzerbrechliches erstellt wird vbox, aber ich weiß nicht, wie ich sonst das erreichen soll, was ich will, ohne manuell ein \clearpageoder ähnliches hinzuzufügen. Das ist unerwünscht; das Endziel sind natürlich Vorlagen, die das so gut wie automatisch für mich erledigen!

Hier ist ein MWE. In diesem Beispiel landen die Bilder A und B auf Seite 2. Mein Wunsch ist, dass Bild A auf Seite 1 landet und B, C und der nächste Abschnitt auf Seite 2.

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}
\usepackage[T1]{fontenc}
\usepackage[margin=0.8in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{mwe}

\begin{document}

\mainmatter

\section{A section}

\subsection{the first subsection}

Some text here

\vfill

\begin{center}
\textbf{Some title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-a}

\vfill

\textbf{More title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-b}

\vfill

\textbf{Even more title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-c}
\end{center}

\subsection{The next subsection}

\end{document}

Ergebnis: Ergebnis

Grobe MSPaint-Wiedergabe meiner Erwartungen: Bildbeschreibung hier eingeben

Antwort1

Das Problem

Was in Ihrem MWE passiert, ist, dass die Interaktion zwischen unendlich dehnbaren Sprüngen und der negativen (Seitenumbruch-)Strafe, die dadurch eingeführt wird, centerdazu führt, dass der Seitenumbruchalgorithmus von TeX zu dem Schluss kommt, dass es keinen besseren Ort für einen Seitenumbruch gibt als direkt vor dem Inhalt der centerUmgebung. Deshalb hilft die Verwendung \centeringvon anstelle der centerUmgebung. Ähnliche Probleme werden jedoch weiterhin bei Abschnittsüberschriften und Listenumgebungen auftreten.

Am Anfang der Umgebung wird eine negative Strafe (für Seitenumbrüche) eingefügt, centerda diese intern ein verwendet trivlistund der Anfang einer Liste als guter Platz für einen Seitenumbruch gilt. Diese negative Strafe veranlasst TeX, die Seite an dieser Stelle umzubrechen, wenn dies bereits ein akzeptabler Platz dafür ist, womit ich meine, dass dies nicht dazu führen würde, dass der Klebstoff zu weit gedehnt wird. Da Sie jedoch einen unendlich dehnbaren Klebstoff eingefügt haben, ist keine Dehnung zu viel, was zu der Schlussfolgerung führt, dass es centerbesser ist, die Seite am Anfang der Umgebung zu beenden, als dies zu tun, wenn die Seite voll ist. Aufgrund der unendlichen Dehnung ist das Einfügen eines Seitenumbruchs dort mit keinen Kosten verbunden, hat aber (aus Sicht von TeX) den Vorteil, dass der Umbruch an einer natürlichen Stelle dafür erfolgt.

Eine detaillierte Beschreibung des Seitenumbruchalgorithmus finden Sie in Abschnitt 27.4 vonTeX nach Thema.

Abgesehen von erzwungenen Seitenumbrüchen,denkennegative Strafen, die (standardmäßig) nur an den folgenden Stellen eingefügt werden:

  • über den Abschnittsüberschriften,
  • um Listenumgebungen (dazu gehören centerbeispielsweise auch Theoremumgebungen, da diese mit implementiert werden \trivlist),
  • zwischen \items,
  • durch eine Reihe von Benutzerbefehlen, die dies explizit tun ( \pagebreak[n], \smallbreak, usw.),
  • andere? (Bitte lassen Sie es mich wissen, wenn ich etwas übersehen habe.)

Eine Lösung/ein Workaround

Um zu vermeiden, dass Seitenumbrüche aufgrund von Minuspunkten früher als nötig erfolgen, können Sie diese Minuspunkte auf Null setzen. Um dies für Abschnittsüberschriften und In-/Um-Listen zu tun, fügen Sie Ihrer Präambel die folgenden Zeilen hinzu:

\makeatletter       %% <- make @ usable in command sequences
\@secpenalty=0      %% <- don't encourage breaks before section heading
\@beginparpenalty=0 %% <- don't encourage breaks at start of list environments
\@endparpenalty=0   %% <- don't encourage breaks at end of list environments
\@itempenalty=0     %% <- don't encourage breaks between items
\makeatother        %% <- revert @

Ein Nebeneffekt davon ist natürlich, dass Seitenumbrüche an diesen Stellen nicht mehr erwünscht sind. (Sie werden weiterhin nicht empfohlen, z. B.nachAbschnittsüberschriften jedoch.) Dies wird Ihnen auch nicht helfen, wenn durch irgendeine andere Art von Umgebung/Befehl negative Strafen eingefügt werden, seien Sie also vorsichtig.

Ich habe eine Version der figureUmgebung definiert, die meiner Meinung nach mehr oder weniger das tut, was Sie wollen (vorausgesetzt, alle oben genannten Strafen sind auf Null gesetzt). Unendlich dehnbar, sodass nicht auf die vorherige/nächste Seite gewechselt werden kann, wird darum herum eingefügt. Sie könnten auf ähnliche Weise eine shamtamtableUmgebung für Tabellen definieren.

\newcommand*\topvfill{%
  \par                      %% <- switch to vertical mode
  \penalty 0                %% <- allow a page break here, but don't encourage it
  \vspace*{0pt plus 1fill}% %% <- unremovable infinitely stretchable space
}
\newcommand*\bottomvfill{%
  \par                      %% <- switch to vertical mode
  \vspace{0pt plus 1fill}%  %% <- infinitely stretchable space
  \penalty 0                %% <- allow a page break here
}

\usepackage{float} % <- for the [H] option
\newenvironment{shamtamfig}{%
  \topvfill    %% <- insert flexible space above
  \figure[H]%  %% <- begin inner figure environment
  \centering   %% <- horizontally centre content
}{%
  \endfigure   %% <- end figure environment
  \bottomvfill %% <- insert flexible space below
}

Ihr MWE mit diesen Änderungen

Hier ist Ihr MWE mit \vfillersetzt durch \beakablevfillund mit den oben genannten negativen Strafen auf Null gesetzt. Ich habe die showframeOption hinzugefügt, geometryden Rand des Textbereichs anzuzeigen, und ich habe ein paar kleinere Änderungen vorgenommen, um diese Demonstration klarer zu gestalten.

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}
\usepackage[margin=0.8in, showframe]{geometry} %% <- added showframe for demonstration
\usepackage{graphicx}

\makeatletter %% <- make @ usable in command sequences
\@beginparpenalty=0 % <- start of list env
\@endparpenalty=0   % <- end of list env
\@itempenalty=0     % <- between items
\@secpenalty=0      % <- before section heading
\makeatother  %% <- revert @

\newcommand*\topvfill{%
  \par                      %% <- switch to vertical mode
  \penalty 0                %% <- allow a page break here, but don't encourage it
  \vspace*{0pt plus 1fill}% %% <- unremovable infinitely stretchable space
}
\newcommand*\bottomvfill{%
  \par                      %% <- switch to vertical mode
  \vspace{0pt plus 1fill}%  %% <- infinitely stretchable space
  \penalty 0                %% <- allow a page break here
}
\def\midvfill{%
  \par                       %% <- switch to vertical mode
  \vspace{0pt plus 1fill}%   %% <- infinitely stretchable space
  \penalty 0                 %% <- allow a page break here, but don't encourage it
  \vspace{0pt plus -1fill}%  %% <- cancels out the previous \vspace if no page break occurred
  \vspace*{0pt plus 1fill}%  %% <- unbreakable/unremovable infinitely stretchable space
}

\usepackage{float} % <- for the [H] option

\newenvironment{shamtamfig}{%
  \topvfill    %% <- insert flexible space above
  \figure[H]%  %% <- begin inner figure environment
  \centering   %% <- horizontally centre content
}{%
  \endfigure   %% <- end figure environment
  \bottomvfill %% <- insert flexible space below
}

\usepackage{blindtext} % <- for demonstration purposes

\begin{document}

\section{A section}

\subsection{the first subsection}

\blindtext[2]

\blindtext

\begin{shamtamfig}
    \textbf{Some title text}\par
    \includegraphics[width=0.6\textwidth]{example-image-a}
\end{shamtamfig}

\begin{shamtamfig}
    \textbf{More title text}\par
    \includegraphics[width=0.4\textwidth]{example-image-b}
\end{shamtamfig}

\begin{shamtamfig}
    \textbf{Even more title text}\par
    \includegraphics[width=0.4\textwidth]{example-image-c}
\end{shamtamfig}

\subsection{The next subsection}

\blindtext

\blinditemize

\blindtext[2]

\begin{shamtamfig}
    \textbf{Even more title text}\par
    \includegraphics[width=0.6\textwidth]{example-image}
\end{shamtamfig}

\end{document}

Zum Spaß können Sie versuchen, einige Zeilen \@...penalty=0in diesem Beispiel auszukommentieren, um zu sehen, welche Wirkung diese Zeilen haben.

erste Seite zweite Seite dritte Seite

Antwort2

Bildbeschreibung hier eingeben

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}

\usepackage[T1]{fontenc}
\usepackage[margin=0.8in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{mwe}

\begin{document}

%\pagestyle{fancy}

\mainmatter

\section{A section}

\subsection{the first subsection}

Some text here

\vfill

{\centering
\textbf{Some title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-a}


\vfill

\textbf{More title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-b}

\vfill

\textbf{Even more title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-c}

}

\subsection{The next subsection}

\end{document}

Mit haben Sie etwas mehr Glück, \centeringaber das Problem liegt wirklich in der Verwendung \\*und nicht in der richtigen Unterteilung oder \itemBefehlen. Im Rahmen von \centering(und center) \\liegt wirklich \pareher als in seiner üblichen Definition von, \newlinedas heißt, es übt den Seitenumbruch aus und \\*fügt eine \nobreakStrafe hinzu, sodass, wenn es passiert, dass ein Seitenumbruch nach der Überschrift als Umbruch betrachtet wird, dort aufgrund von ein Umbruch verhindert wird, *aber vor dem ersten Bild ist ein Umbruch ohne Strafe verfügbar, da \vfillverfügbar ist, um den Platz zu füllen, also nimmt TeX diesen Seitenumbruch vor, anstatt vorauszuschauen.


Ein vielleicht besseres Markup, das explizite Änderungen der Zeichenabstände vermeidet und \\stattdessen das idiomatischere Latex-Markup bevorzugt, \captionwäre

Bildbeschreibung hier eingeben

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}

\usepackage[T1]{fontenc}
\usepackage[margin=0.8in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{mwe,float}

\begin{document}

%\pagestyle{fancy}

\mainmatter

\section{A section}

\subsection{the first subsection}

Some text here

\begin{figure}[H]
  \centering
\caption{Some title text}
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-a}  
\end{figure}

\begin{figure}[H]
  \centering
\caption{Some title text}
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-b}  
\end{figure}

\begin{figure}[H]
  \centering
\caption{Some title text}
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-c}  
\end{figure}



\subsection{The next subsection}

\end{document}

Sie können die Funktionen des Floats (und verwandter Funktionen caption) verwenden, um die Beschriftungsformatierung nach Bedarf anzupassen.

Antwort3

Ich bin nicht sicher, was Sie mit „flexiblem Leerzeichen“ meinen, aber Sie könnten einen neuen Befehl definieren, der \vspaceeine vordefinierte „flexible Länge“ verwendet.

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}
\usepackage[T1]{fontenc}
\usepackage[margin=0.8in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{mwe}

\newlength{\mylength}
\setlength{\mylength}{20pt plus 10pt minus 5pt}
\newcommand{\myskip}{\vspace{\mylength}}
\begin{document}

\mainmatter

\section{A section}

\subsection{the first subsection}

Some text here

\myskip

\begin{center}
\textbf{Some title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-a}

\myskip

\textbf{More title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-b}

\myskip

\textbf{Even more title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-c}
\end{center}

\subsection{The next subsection}

\end{document}

PS: Ich bin nicht sicher, ob ich die Frage verstanden habe. Bitten Sie mich daher ruhig, sie zu löschen.

Antwort4

Wenn Sie es verwenden möchten, centerist es besser, jeden Block in seine eigene Umgebung zu platzieren.

\documentclass[letterpaper,10pt,article,oneside,openany]{memoir}
\usepackage[T1]{fontenc}
\usepackage[margin=0.8in]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{mwe}

\begin{document}    
\mainmatter    
\section{A section}    
\subsection{the first subsection}    
Some text here    
\vfill    
\begin{center}
\textbf{Some title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-a}
\end{center}    
\vfill    
\begin{center}
\textbf{More title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-b}
\end{center}    
\vfill    
\begin{center}
\textbf{Even more title text} \\*
\includegraphics[width=0.75\textwidth,keepaspectratio]{example-image-c}
\end{center}    
\subsection{The next subsection}    

\end{document}

verwandte Informationen