使用自定义分段样式命令避免分页

使用自定义分段样式命令避免分页

我的文档中有一个自定义分段命令,定义如下:

\newcommand{\newtitle}[4]{% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
  \vspace{2em}
    \begin{center}
      \textbf{\LARGE #1}\nopagebreak[4]\vspace{1em}\nopagebreak[4]\\\nopagebreak[4]
%
      \nopagebreak[4]\Large #2\nopagebreak[4]\vspace{0.5em}\nopagebreak[4]\\\nopagebreak
%
      \ifx&#3&%
      \else%
      \nopagebreak[4]#3\nopagebreak[4]\\\nopagebreak[4]%
      \fi%
% 
      \ifx&#4&%
      \else%
      \nopagebreak[4]\vspace{0.5em}\nopagebreak[4]
%
      \nopagebreak[4]\footnotesize\emph{#4}\nopagebreak[4]%
      \fi%
    \nopagebreak[4]\end{center}\nopagebreak[4]}

因此,代码非常奇怪,\nopagebreak只是因为这种多行样式的标题绝对不应该被破坏。

问题实际上并不在于标题内部,而在于遵循命令的文本\newtitle。正如我所说,这是一个分段命令,那么它不应该被打破,但它也总是在同一页中,至少有两个或三个以下行,除非它是一个寡妇标题。

例如,在以下 MWE 中:

\documentclass[a4paper,12pt]{article}


\newcommand{\newtitle}[4]{% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
  \vspace{2em}
    \begin{center}
      \textbf{\LARGE #1}\nopagebreak[4]\vspace{1em}\nopagebreak[4]\\\nopagebreak[4]
%
      \nopagebreak[4]\Large #2\nopagebreak[4]\vspace{0.5em}\nopagebreak[4]\\\nopagebreak
%
      \ifx&#3&%
      \else%
      \nopagebreak[4]#3\nopagebreak[4]\\\nopagebreak[4]%
      \fi%
% 
      \ifx&#4&%
      \else%
      \nopagebreak[4]\vspace{0.5em}\nopagebreak[4]
%
      \nopagebreak[4]\footnotesize\emph{#4}\nopagebreak[4]%
      \fi%
    \nopagebreak[4]\end{center}\nopagebreak[4]}

\title{Title}
\author{Author}
\date{\today}

\begin{document}
\maketitle

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.

Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere.


\newtitle{9 symphony}{Bethoven}{1922}{Lipsum}

Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.
Aliquam convallis sollicitudin purus.

\end{document}

我在页面底部看到了寡妇标题:

渲染示例页面

那么,我该如何避免这种行为并获得与\section强制以下文本位于同一页面的命令相同的行为?

答案1

当您想将几行或几段放在一起时,无需到处使用\nopagebreak[4]:将它们全部放在一个框内(通常是minipage环境或\parbox命令)。这可以防止标题内容出现分页符。为了防止分页符标题之后,你可以使用这样的方法:

  \par\nopagebreak\vspace{4ex plus .1ex minus .1ex}%
  % Uncomment this if you want to suppress paragraph indentation after the title
  % \@afterindentfalse
  \@afterheading

至关重要的是\nopagebreak(或\nobreakTeX 命令)。何时\vspace允许换行或分页的规则在 TeXbook 中有很好的解释(Lamport 的LaTeX 书...)。如果您真的想了解这种构造的工作原理,您可以阅读它。下面是完整的示例,其中包含一些更改(特别是,我更喜欢使用单位ex而不是em垂直方向,因为它们的定义是这样的):

\documentclass{article}
\usepackage{etoolbox}
\usepackage{lipsum}

\makeatletter

% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
\newcommand*{\newtitle}[4]{%
  \par\vspace{2ex}

  \noindent
  \begin{minipage}{\linewidth}
    \begin{center}
      \textbf{\LARGE #1}\par\vspace{1ex}

      \Large #2\par\vspace{0.5ex}

      \ifblank{#3}{}{#3\par}%

      \ifblank{#4}{}{%
        \vspace{0.5ex}% this percent sign could be removed (vertical mode)
        \footnotesize\emph{#4}%
      }%
    \end{center}
  \end{minipage}%
  \par\nopagebreak\vspace{4ex plus .1ex minus .1ex}%
  % Uncomment this if you want to suppress paragraph indentation after the title
  % \@afterindentfalse
  \@afterheading
}

\makeatother

\title{Title}
\author{Author}
\date{\today}

\begin{document}
\maketitle

\lipsum[1-2]\lipsum[3][1-14] One% more word is enough
\newtitle{9\textsuperscript{th}~symphony}{Beethoven}{1922}{Lipsum}
%
\lipsum[4]
\end{document}

第 1 页

在此处输入图片描述


第2页

在此处输入图片描述

如果您只取消注释我所写的“更多”一词,即“再多一个词就足够了”,那么您的全部内容\newtitle就会按需要推迟到下一页:

第 1 页

在此处输入图片描述


第2页

在此处输入图片描述

答案2

嗯,你的\newtitle有点大,不是吗?

这里的问题是,自动方法不能解决每种情况。您的问题很简单,您的新标题适合放在页面末尾(空白处会很大),因此设置了新标题。如果您添加一个小文本,例如text. text % <==== 在新标题之前,情况就会改变。现在空间不足以容纳您的非常大的新标题...

查看代码:

\documentclass[a4paper,12pt]{article}

% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
\newcommand{\newtitle}[4]{%
  \vspace{2em}
  \begin{center}
    \textbf{\LARGE #1}\nopagebreak[4]\vspace{1em}\nopagebreak[4]\\\nopagebreak[4]
%
    \nopagebreak[4]\Large #2\nopagebreak[4]\vspace{0.5em}\nopagebreak[4]\\\nopagebreak
%
    \ifx&#3&%
    \else%
      \nopagebreak[4]#3\nopagebreak[4]\\\nopagebreak[4]%
    \fi%
% 
    \ifx&#4&%
    \else%
      \nopagebreak[4]\vspace{0.5em}\nopagebreak[4]
%
      \nopagebreak[4]\footnotesize\emph{#4}\nopagebreak[4]%
    \fi%
    \nopagebreak[4]%
  \end{center}%
  \nopagebreak[4]%
}

\title{Title}
\author{Author}
\date{\today}


\begin{document}
\maketitle

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. 
Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies 
sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius 
a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy 
molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. 
Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium 
a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra 
tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. 
Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit 
sodales. Vestibulum ante ipsum primis in faucibus orci luctus et 
ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede 
pellentesque fermentum. Maecenas adipiscing ante non diam sodales 
hendrerit.

Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere.

text. text % <==========================================================


\newtitle{9 symphony}{Bethoven}{1922}{Lipsum}
Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere, metus purus iaculis lectus, et tristique ligula justo vitae 
magna.
Aliquam convallis sollicitudin purus.

\end{document}

及其结果:

生成的 pdf

Lipsum.如果你在给定的代码中添加一些内容,你会得到另一个结果\newtitle。你会在命令的第四个参数中获得一个分页符\newtitle。请参阅以下代码

\documentclass[a4paper,12pt]{article}

% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
\newcommand{\newtitle}[4]{%
  \nopagebreak[4]%
  \vspace{2em}
  \begin{center}
    \textbf{\LARGE #1}\nopagebreak[4]\vspace{1em}\nopagebreak[4]\\\nopagebreak[4]
%
    \nopagebreak[4]\Large #2\nopagebreak[4]\vspace{0.5em}\nopagebreak[4]\\\nopagebreak
%
    \ifx&#3&%
    \else%
      \nopagebreak[4]#3\nopagebreak[4]\\\nopagebreak[4]%
    \fi%
% 
    \ifx&#4&%
    \else%
      \nopagebreak[4]\vspace{0.5em}\nopagebreak[4]
%
      \nopagebreak[4]\footnotesize\emph{#4}\nopagebreak[4]%
    \fi%
    \nopagebreak[4]%
  \end{center}%
  \nopagebreak[4]%
}

\title{Title}
\author{Author}
\date{\today}


\begin{document}
\maketitle

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. 
Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies 
sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius 
a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy 
molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. 
Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium 
a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra 
tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. 
Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit 
sodales. Vestibulum ante ipsum primis in faucibus orci luctus et 
ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede 
pellentesque fermentum. Maecenas adipiscing ante non diam sodales 
hendrerit.

Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere.

%text. text % <==========================================================


\newtitle{9 symphony}{Bethoven}{1922}{Lipsum. Lipsum. Lipsum. Lipsum. 
  Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. 
  Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. Lipsum. } % <=========
Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere, metus purus iaculis lectus, et tristique ligula justo vitae 
magna.
Aliquam convallis sollicitudin purus.

\end{document}

及其结果:

在此处输入图片描述

最后,目前还不是很清楚第二种情况是否会发生在你身上,也许包needspace可以帮助你,但目前我认为你的情况非常特殊,你最好简单使用\newpage\clearpage进入\newtitle下一页:

\documentclass[a4paper,12pt]{article}

% \newtitle{<Title>}{<Author>}{<Date>}{<miscellaneous indications>}
\newcommand{\newtitle}[4]{%
  \nopagebreak[4]%
  \vspace{2em}
  \begin{center}
    \textbf{\LARGE #1}\nopagebreak[4]\vspace{1em}\nopagebreak[4]\\\nopagebreak[4]
%
    \nopagebreak[4]\Large #2\nopagebreak[4]\vspace{0.5em}\nopagebreak[4]\\\nopagebreak
%
    \ifx&#3&%
    \else%
      \nopagebreak[4]#3\nopagebreak[4]\\\nopagebreak[4]%
    \fi%
% 
    \ifx&#4&%
    \else%
      \nopagebreak[4]\vspace{0.5em}\nopagebreak[4]
%
      \nopagebreak[4]\footnotesize\emph{#4}\nopagebreak[4]%
    \fi%
    \nopagebreak[4]%
  \end{center}%
  \nopagebreak[4]%
}

\title{Title}
\author{Author}
\date{\today}


\begin{document}
\maketitle

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. 
Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies 
sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius 
a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy 
molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. 
Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium 
a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra 
tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. 
Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit 
sodales. Vestibulum ante ipsum primis in faucibus orci luctus et 
ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede 
pellentesque fermentum. Maecenas adipiscing ante non diam sodales 
hendrerit.

Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere.

\clearpage % <==========================================================
\newtitle{9 symphony}{Bethoven}{1922}{Lipsum.}
Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci 
vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula 
non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros 
vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. 
Curabitur aliquet pellentesque diam. Integer quis metus vitae elit 
lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing 
elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. 
Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. 
Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum 
posuere, metus purus iaculis lectus, et tristique ligula justo vitae 
magna.
Aliquam convallis sollicitudin purus.

\end{document}

相关内容