Одновременное гибкое вертикальное пространство с разрывами страниц

Одновременное гибкое вертикальное пространство с разрывами страниц

Столкнулся с проблемой, которую не могу понять. По сути, у меня есть страница с текстом, возможно, уравнениями, парой графиков и, возможно, таблицей, все это разделено гибким пробелом. Иногда все помещается на одной странице, но иногда графика слишком большая, поэтому требуется несколько страниц.

Допустим, у меня есть 3 графика. В случае, если они все слишком большие, чтобы поместиться на одной странице, я бы ожидал, что первые два графика останутся на первой странице, равномерно распределенные вместе с любым предыдущим текстом, а третий рисунок будет на следующей странице вместе с последующим текстом или таблицами и т. д. Однако мой код всегда сохраняет все три графика вместе.

У меня такое впечатление, что это из-за \vspaceсоздания неразрушаемого vbox, но я не знаю, как еще справиться с тем, что я хочу, не добавляя вручную \clearpageили что-то подобное. Это нежелательно; конечной целью являются шаблоны, которые, конечно, делают это за меня практически автоматически!

Вот MWE. В этом примере изображения A и B оказываются на странице 2. Я хочу, чтобы изображение A оказывалось на странице 1, а B, C и следующий раздел — на странице 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}

Результат: Результат

Грубое представление в MSPaint того, что я ожидаю: введите описание изображения здесь

решение1

Проблема

В вашем MWE происходит следующее: взаимодействие между бесконечно растягиваемыми пропусками и отрицательным (разрывом страницы) штрафом, введенным , centerприводит к тому, что алгоритм разрыва страницы TeX приходит к выводу, что нет лучшего места для разрыва страницы, чем непосредственно перед содержимым окружения center. Вот почему использование \centeringвместо centerокружения помогает. Однако подобные проблемы все еще будут возникать вокруг заголовков разделов и окружений списков.

Отрицательный штраф (за разрыв страницы) вставляется в начале среды, centerпотому что она внутренне использует trivlist, а начало списка считается хорошим местом для разрыва страницы. Этот отрицательный штраф побуждает TeX разорвать страницу в этой точке, если это уже было подходящим местом для этого, под этим я подразумеваю, что это не приведет к слишком большому растяжению клея. Однако, поскольку вы вставили бесконечно растягиваемый клей, никакое растяжение не будет слишком большим, что приводит к выводу, что завершение страницы в начале среды centerпредпочтительнее, чем когда страница заполнена. Нет никаких затрат, связанных с размещением разрыва страницы там из-за бесконечного растяжения, но это имеет преимущество (по мнению TeX), что разрыв происходит в естественном для него месте.

Подробное описание алгоритма разрыва страницы можно найти в разделе 27.4.TeX по теме.

Помимо принудительных разрывов страниц, ядуматьотрицательные штрафы, которые (по умолчанию) вставляются только в следующих местах:

  • выше заголовки разделов,
  • вокруг списковых сред (включая, centerнапример, среды теорем, поскольку они реализованы с использованием \trivlist),
  • между \itemс,
  • с помощью набора пользовательских команд, которые делают это явно ( \pagebreak[n], \smallbreak, и т.д.),
  • другое? (Кто-нибудь, пожалуйста, дайте мне знать, если я что-то пропустил)

Решение/обходной путь

Чтобы избежать разрывов страниц, которые возникали раньше, чем необходимо, из-за отрицательных штрафов, вы можете установить эти отрицательные штрафы на ноль. Чтобы сделать это для заголовков разделов и списков в/вокруг, добавьте следующие строки в преамбулу:

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

Побочным эффектом этого, конечно, является то, что разрывы страниц больше не будут поощряться в этих местах. (Они по-прежнему будут не поощряться, напримерпосле(Однако заголовки разделов.) Это также не поможет вам, если отрицательные штрафы вводятся любым другим типом среды/команды, так что будьте осторожны.

Я определил версию среды figure, которая, как я думаю, делает более или менее то, что вам нужно (при условии, что все вышеперечисленные штрафы установлены на ноль). Бесконечно растягиваемый, который не может перейти на предыдущую/следующую страницу, будет вставлен вокруг него. Вы можете аналогичным образом определить shamtamtableсреду для таблиц.

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

Ваш MWE с этими изменениями

Вот ваш MWE с \vfillзаменой на \beakablevfillи с вышеупомянутыми отрицательными штрафами, установленными на ноль. Я добавил опцию showframeдля geometryотображения границы текстовой области и внес несколько небольших изменений, чтобы сделать эту демонстрацию более понятной.

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

Ради интереса вы можете попробовать закомментировать несколько строк \@...penalty=0в этом примере, чтобы посмотреть, какой эффект они окажут.

первая страница вторая страница третья страница

решение2

введите описание изображения здесь

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

Вам немного повезло с , \centeringно на самом деле проблема заключается в использовании , \\*а не в правильном разделении или \itemкомандах. В области действия \centeringcenter) \\на самом деле \parвместо его обычного определения \newlineэто означает, что он применяет разрыв страницы, \\*добавляет \nobreakштраф, поэтому если случается так, что разрыв страницы рассматривается после заголовка, разрыв предотвращается там из-за , *но нулевой штрафной разрыв доступен перед первым изображением из-за того, что \vfillон доступен для заполнения пространства, поэтому TeX использует этот разрыв страницы, а не смотрит вперед.


Возможно, лучшей разметкой, избегающей использования явных изменений шрифта с интервалами и \\отдающей предпочтение более идиоматической \captionразметке Latex, будет

введите описание изображения здесь

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

Вы можете использовать возможности float (и связанные с ним caption) для настройки форматирования подписи по мере необходимости.

решение3

Я не совсем понимаю, что вы имеете в виду под «гибким пробелом», но вы можете определить новую команду, которая будет использовать \vspaceпредопределенную «гибкую длину».

\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: Не уверен, понял ли я вопрос, так что можете смело попросить меня удалить его.

решение4

Если вы хотите использовать, centerлучше поместить каждый блок в отдельную среду.

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

Связанный контент