有没有办法基线圆顶文本到页面底部,即忽略下降部分?实际上,我以为是这样,\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,您就可以实现这一点。