Столкнулся с проблемой, которую не могу понять. По сути, у меня есть страница с текстом, возможно, уравнениями, парой графиков и, возможно, таблицей, все это разделено гибким пробелом. Иногда все помещается на одной странице, но иногда графика слишком большая, поэтому требуется несколько страниц.
Допустим, у меня есть 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}
решение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
командах. В области действия \centering
(и center
) \\
на самом деле \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}