改ページと同時に柔軟な垂直スペースを確保

改ページと同時に柔軟な垂直スペースを確保

原因が分からない問題に遭遇しました。要するに、テキスト、おそらく数式、いくつかのグラフィック、そしておそらく表が含まれたページがあり、それらはすべて柔軟な空白で区切られています。すべてが 1 ページに収まることもありますが、グラフィックが大きすぎて複数のページが必要になることもあります。

グラフィックが 3 つあるとします。グラフィックがすべて 1 ページに収まらないほど大きい場合、最初の 2 つのグラフィックは最初のページに残り、先行するテキストとともに均等に分散され、3 番目のグラフィックは後続のテキストや表などとともに次のページに表示されると予想されます。しかし、私のコードでは、常に 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を使用すると役立つ理由です。ただし、セクションの見出しやリスト環境の周辺でも同様の問題が引き続き発生します。\centeringcenter

環境の先頭に負のペナルティ (改ページ用) が挿入されるのcenterは、内部的に が使用されtrivlist、リストの先頭が改ページに適した場所と見なされるためです。この負のペナルティにより、TeX は、この時点で既にページを改ページできる場所である場合、つまり、そうすることでグルーが過度に引き伸ばされない場合、ここでページを改ページするように促されます。ただし、無限に引き伸ばせるグルーを挿入したため、引き伸ばしすぎはないため、ページを環境の先頭で終了する方が、ページがcenterいっぱいになったときに終了するよりも好ましいという結論に至ります。無限に引き伸ばされるため、そこに改ページを入れることに関連するコストはありませんが、(TeX の考えでは) 自然な場所で改ページが行われるという利点があります。

ページ分割アルゴリズムの詳細な説明は、トピック別TeX

強制改ページ以外では、考える負のペナルティは(デフォルトでは)次の場所にのみ挿入されます。

  • セクション見出しの上、
  • リスト環境(これにはcenterや 、例えば定理環境が含まれる。これらは を使用して実装されているため\trivlist)、
  • sの間\item
  • これを明示的に行う一連のユーザーコマンド(\pagebreak[n]\smallbreakなど)によって、
  • その他? (何か見逃していたら教えてください)

解決策/回避策

負のペナルティによって必要以上に早くページ区切りが発生しないようにするには、これらの負のペナルティを 0 に設定することができます。セクションの見出しやリスト内/リストの周囲でこれを実行するには、次の行をプリアンブルに追加します。

\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

\vfillこれは、を に置き換え\beakablevfill、前述の負のペナルティを 0 に設定したMWE です。テキスト領域の境界線を表示する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ページ目 3ページ目

答え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)は の通常の定義ではなく、\\つまりページ ブレーカーを実行し、ペナルティを追加するため、見出しの後にページ ブレークが考慮される場合、 のためにそこでのブレークは防止されますが、 がスペースを埋めるために使用できるため、最初の画像の前ではペナルティなしのブレークが使用可能であり、TeX は先を見ずにそのページ ブレークを使用します。\par\newline\\*\nobreak*\vfill


明示的な間隔フォントの変更を避け、\\より慣用的なLaTeX\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}

関連情報