使用 \clearpage 代替 \newpage 是否错误?

使用 \clearpage 代替 \newpage 是否错误?

命令\newpage\clearpage都强制分页。此外,后一个命令还会从堆栈中“刷新”所有待处理的浮点数,即强制从分页符后的页面开始排版它们。

我的问题是:使用\clearpage而不是是否有错误\newpage,除非在某些情况下不是想要刷新任何待处理的浮点数吗?通过对这两个命令的定义(见下文)的随意检查,我无法判断总是使用 是否存在任何问题\clearpage

\newpage为了方便参考,这里是(来自)的定义latex.ltx

\def \newpage {%
  \if@noskipsec
    \ifx \@nodocument\relax
      \leavevmode
      \global \@noskipsecfalse
    \fi
  \fi
  \if@inlabel
    \leavevmode
    \global \@inlabelfalse
  \fi
  \if@nobreak \@nobreakfalse \everypar{}\fi
  \par
  \vfil
  \penalty -\@M}

这是的定义\clearpage——请注意,它调用\newpage

\def\clearpage{%
  \ifvmode
    \ifnum \@dbltopnum =\m@ne
      \ifdim \pagetotal <\topskip
        \hbox{}%
      \fi
    \fi
  \fi
  \newpage
  \write\m@ne{}%
  \vbox{}%
  \penalty -\@Mi
}

答案1

\clearpage从技术上讲,使用而不是并没有错\newpage。但是,这两个命令具有不同的语义,问题是您对哪种语义感兴趣。

首先,正如您已经提到的,\clearpage它不仅会结束页面,还会清除所有已延迟的浮动。从表面上看,这可能是一个好主意,但请考虑以下情况:您有一个浮动在等待,它只是页面大小的 1/3。现在您\newpage开始一个新页面,然后浮动算法(有关详细信息,请参阅该算法的描述)将启动并尝试将等待的浮动元素放置到下一页(并且最有可能将等待的浮动元素分配到下一页的顶部区域。相反,\clearpage也会输出这个浮动元素,但在它自己的页面上。

因此,在章节开始的情况下,建议结尾上一章\clearpage(或者更确切地说开始您可以使用一个新页面(其中包含新的页面)来清除所有浮动元素,但在其他情况下,这可能会导致相当空白的页面,其中只有浮动元素,这可能是也可能不是想要的。

第二个区别是,它\clearpage实际上总是开始一个新的“页面”,而\newpage实际上只结束当前列 - 这是双列模式下的一个巨大区别。只需尝试以下操作即可看到区别:

\documentclass[twocolumn]{article}
\begin{document}
A test
\newpage              % ends first column but not page
A second test
\newpage

A clearpage test
\clearpage             % ends page (which has one column)
A second clearpage test
\end{document}

答案2

我认为,你可以\clearpage在任何地方使用,除非“有特殊原因不这样做”。对我来说,这个特殊原因是当你(出于审美或其他原因)真的想要拥有:

  • 一个真正空白的页面,然后你调用例如\newpage\leavevmode\thispagestyle{empty}\newpage
  • 放置在特定页面上的内容或其他内容(\clearpage如果排队的浮动元素很多,则可能会添加多个分页符,而\newpage仅添加一个)
  • 当您希望两页彼此相邻时(我喜欢章节标题在左页而没有文本,而文本从右页开始 - 然后我\newpage在排版章节标题后使用)。

当然,这两个命令的所有用法都应该是概念性的,我的意思是,您不需要在作品的正文中使用它们,而是在宏定义(如我\chapter上面提到的)或在序言/...中使用它们。

相关内容