为什么部分标题默认不是垂直居中?

为什么部分标题默认不是垂直居中?

\part第一次使用该命令时\documentclass ,我意识到该部分的标题没有垂直居中,并且在页面上的位置比“应该”的位置高。使用此 MWE,我在页面顶部有大约 60 毫米的垂直空间,在底部有 113 毫米的垂直空间,即几乎翻倍。

在此处输入图片描述

\documentclass{book}

\usepackage[showframe]{geometry}
\setlength\topskip{0pt}

\begin{document}

\part{My first part}

\end{document}

查看它们的定义后,可以使用下面这个简单的 MWE 来模仿\part\@endpart命令(就垂直对齐而言)。

在此处输入图片描述

\documentclass{book}

\usepackage[showframe]{geometry}
\setlength\topskip{0pt}

\begin{document}

\null\vfil
A\par
\vskip 20pt
A\par
\vfil

\end{document}

为什么部分标题没有垂直居中?哪些元素将标题“推”到页面顶部?

我意识到,如果我将 替换\vfil\vfill,它比 更“强大” \vfil,我就会得到一个在页面上垂直居中的标题(下面的图片和 MWE)。为什么这不是默认行为?

在此处输入图片描述

\documentclass{book}

\usepackage[showframe]{geometry}
\setlength\topskip{0pt}

\begin{document}

\null\vfill
A\par
\vskip 20pt
A\par
\vfill

\end{document}

答案1

部分页面强制使用强制分页符,在您的示例中,由\end{document}which does \clearpagewhich does 执行\newpage

newpage

\def \newpage {%
  \if@noskipsec
    \ifx \@nodocument\relax
      \leavevmode
      \global \@noskipsecfalse
    \fi
  \fi
  \if@inlabel
    \leavevmode
    \global \@inlabelfalse
  \fi
  \if@nobreak \@nobreakfalse \everypar{}\fi
  \par
  \ifdim\prevdepth>\z@
     \vskip -%
       \ifdim\prevdepth>\maxdepth
         \maxdepth
       \else
         \prevdepth
       \fi
  \fi
  \vfil
  \penalty -\@M}

因此它增加了\vfil允许强制页面变短的功能。

因此,您的示例中有一个\vfil位于文本上方,两个位于文本下方,因此位于页面下方的三分之一处。

这在标准类中没有明确记录(这些类中的大多数设计决策都没有)但它似乎是设计使然。

相关内容