调查

调查

有没有办法基线圆顶文本到页面底部,即忽略下降部分?实际上,我以为是这样,\vfill但事实并非如此……

在此处输入图片描述

\documentclass{scrartcl}

\usepackage{showframe}

\begin{document}
   Test
   \vfill
   Test g
\end{document}

如果我省略文本,g文本会比带降部时低一点。除了手动添加\enlargethispage或使用之外,还有其他方法吗\smash

更新:不同版本之间似乎存在一些差异(见评论),我将通过升级(从 TL 16 到 17)来解决我的问题。但我仍然对背景感兴趣,想知道为什么会发生这种情况。

更新 2/解决方案:所描述的行为被视为“但是”,已在 2017 版中修复。但是,如果您希望旧文档产生与往常相同的输出,则可以添加\RequirePackage[2017-01-01]{latexrelease}before \documentclass。您可以在LaTeX 新闻 (2015 年 1 月第 22 期)

答案1

正如评论中所述,这是在 TeX Live 2017 中引入的一项变更。 (事实上,根据变更日志,它是在 2017-04-11 引入的。)

调查

这并不是很重要,但如果你好奇我是如何找到它的,这些就是我的步骤。

如果您使用 TL 2017 和 TL 2016 添加行来编译 MWE \showoutput,那么 TeX 将打印出页面的样子。通过比较两者,我们可以看到在页面底部附近出现了一个额外的粘连。

 ....\penalty 10000
 ....\glue(\parfillskip) 0.0 plus 1.0fil
 ....\glue(\rightskip) 0.0
+...\glue -2.12917
 ...\glue 0.0 plus 1.0fil
 ...\glue 0.0
 ...\glue 0.0 plus 0.0001fil

这表明 LaTeX 的输出例程存在问题。我不太熟悉内核的结构,但快速浏览一下texdoc source2e就会发现输出例程是在 中定义的ltoutput.dtx。比较两个版本中的该文件可以发现

% \changes{v2.4a}{2017/04/11}{account for the depth of the last row of the page}

\newpage已修改。它现在包括

%    The |\vfil| at the end of the macro before the break penalty will
%    normally result in the page being run short,  even with |\flushbottom|
%    in effect (in contrast to the behavior
%    of |\pagebreak|). However, if there
%    is some explicit stretch on the page, say, a |\vfill|, it has the undesired
%    side-effect, that the last line will not align at its baseline if it
%    contains characters going below the baseline, as the value of |\prevdepth|
%    is no longer taken into account by \TeX{}. So we back up by that amount
%    (or by |\maxdepth| if it is really huge), to mimic the normal behavior
%    without the |\newpage|.
%    \begin{macrocode}
  \ifdim\prevdepth>\z@
     \vskip -%
       \ifdim\prevdepth>\maxdepth
         \maxdepth
       \else
         \prevdepth
       \fi
  \fi

看起来一个长期存在的错误最近被修复了。

编辑:\newpage尽管没有出现在输入的任何地方,但在这里很重要的原因是\end{document}扩展到(除其他外),\enddocument其扩展包括\clearpage扩展为包含的内容\newpage

编辑2:再仔细思考一下,如果存在两列,这种情况似乎尤其糟糕。

\documentclass[twocolumn]{article}
\usepackage[margin=3.5in]{geometry}
\usepackage{showframe}
\begin{document}
Top\par\vfill Bottom\newpage
Top\par\vfill Bottomy
\end{document}

有了 TL 2016,您就可以实现这一点。

在此处输入图片描述

相关内容