同时调整垂直空间与分页符

同时调整垂直空间与分页符

遇到一个我无法弄清楚的问题。实际上,我有一个页面,其中包含一些文本、可能还有一些方程式、一些图形和可能是一个表格,所有这些都由灵活的空白分隔。有时所有内容都适合放在一页上,但有时图形太大,因此需要多个页面。

假设我有 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 中发生的事情是,无限可拉伸跳过与引入的负面(分页符)惩罚之间的相互作用导致centerTeX 的分页算法得出结论,没有比环境内容之前更好的分页符位置了center。这就是为什么使用\centering而不是center环境会有所帮助。然而,类似的问题仍然会出现在节标题和列表环境中。

在环境的开始处插入一个负惩罚(用于分页)center,因为它内部使用了trivlist并且列表的开始被认为是分页的好位置。如果此时已经是一个可以分页的地方,这个负惩罚会鼓励 TeX 在此位置分页,我的意思是这样做不会导致任何粘连被拉伸得太远。但是因为你插入了一些可以无限拉伸的粘连,所以无论拉伸多少都不为过,这导致的结论是,在环境的开始处结束页面比center在页面已满时结束页面更好。由于可以无限拉伸,将分页符放在那里没有任何成本,但它的好处(在 TeX 看来)是分页发生在一个自然的位置。

分页算法的详细描述可以在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的范围内,实际上是而不是其通常的定义,这意味着它行使分页符,增加惩罚,因此如果碰巧在标题之后考虑分页符,则会因为而阻止分页,但由于可以填充空间,因此在第一幅图像之前可以使用零惩罚分页符,因此 TeX 会采用该分页符而不是向前看。\centeringcenter\\\par\newline\\*\nobreak*\vfill


一个更好的标记可能是避免使用显式间距字体更改,而\\采用更惯用的乳胶标记\caption

在此处输入图片描述

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

您可以使用浮点数(及相关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}

附言:不确定我是否理解了这个问题,因此,请随时要求我删除它。

答案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}

相关内容