为什么 \newpage 至少需要 \null 才能创建页面?

为什么 \newpage 至少需要 \null 才能创建页面?

试图回答在书籍类中包含封面和标题页我发现\newpage只有当有一些内容时才会创建一个新页面,即

\documentclass{article}
\begin{document}
\newpage
\end{document}

没有产生任何结果(没有 pdf 文件)

\documentclass{article}
\begin{document}
\null\newpage
\end{document}

可以 (空白页,页脚为 1)。\null\mbox{}可以代替 。 你能解释一下原因吗?

我的理解是,空白页不是空白的,因为 LaTeX 会自动引入页眉和页脚。我曾经使用过\pagestyle{empty}或者\thispagestyle{empty}可以理解它,但第一个代码不适合这种情况。

答案1

添加页眉和页脚TeX 已决定要进行分页,因此分页符是否为空完全无关紧要。

页面上必须包含一些不可丢弃的东西(一个盒子,一条规则,一个什么东西),因为可丢弃的东西(胶水,惩罚,字距)会在分页符处被丢弃。

这样做\newpage\newpage不会产生空白页,因为在垂直模式下发布时,它本质上确实

\vfil
\penalty-10000

请注意,文档的开头被隐式地视为分页符,因此初始可丢弃项确实会被丢弃。这也是为什么在执行以下操作时没有垂直空间的原因

\begin{document}
\vspace{10cm}
Hello world
\end{document}

并且顶部会出现“Hello world”。

\null确实如此\hbox{},因此它提供了一个框。添加不可见内容的更好方法是执行

\vspace*{0pt}

有一个非常这样做的理由是:在发出最终的\clearpage(隐式调用)之后,TeX 仍在工作,并且已准备好创建新页面,因为可能仍存在待处理的浮动。如果将其行为更改为允许\newpage\end{document}\newpage创建没有不可丢弃项目的页面,则总是最后得到一张空白页。


这是的完整定义\newpage

% latex.ltx, line 6503 (2015/10/01 patch level 2)
\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}

这就引出了问题,即 在哪里\if@noskipsec为真;好吧,它在启动时为真,但在 时设置为假,\begin{document}在排版运行部分标题时又设置为真。如果某些文本在 之前排版,但后来设置为等同于,则该命令\@nodocument负责发出错误消息。因此,第一个条件的目的是当发现类似的东西时将事情整理好。\begin{document}\relax\paragraph{Title}\newpage

\if@inlabel当 LaTeX 处理 时,条件为真\item,因此该部分用于从诸如 之类的输入中恢复\item\newpage。最后,\if@nobreak当 LaTeX 排版了“块”分段标题(\section例如 )时,条件为真,同样,这用于从 之类的内容中恢复\section{Title}\newpage

因此,初始部分只是尝试避免在存在争议代码的情况下出现后续问题的代码。如果这些(希望)罕见情况均未发生,则只会\par\vfil\penalty-10000发出。请注意,\par通常隐含在中\vfil,但万一用户重新定义了\vfil,则仍会发出。

我不建议\leavevmode\newpage这样做,但命令开始一个段落,贡献\parskip粘连和\baselineskip胶水。相反,\null或者\vspace*{0pt}只贡献一个高度和深度为零的框/规则(后者也是 10000 惩罚和零胶水),没有\parskip\baselineskip胶水。

其实没什么大不了的,因为我们正在分析制作一个明显空白的页面的问题:一个空白框、一条不可见的规则或一个空白段落不会造成太大的影响,但我们贡献的越少越好。开始一个段落也会释放 的内容\everypar,在某些情况下这可能会产生一些副作用。

相关内容