scrartcl/section/itemize:为什么是空白页?

scrartcl/section/itemize:为什么是空白页?

我很确定这是我的错,但我无法使用该类解释 LaTeX 的这种行为scrartcl

\documentclass[a4paper,10pt,onecolumn]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amssymb} 
\usepackage{longtable}
\usepackage{pdfpages}
\usepackage[breaklinks=true]{hyperref}

\title{Test}

\author{Sebastian}

\begin{document}
\maketitle

\section{Links}
Lesenswerte Artikel und weiterführende Informationen:
\begin{itemize}
    \item \url{http://www.bbc.com/news/world-africa-30199004} (empfehlenswerter Überblick)
    \item \url{http://allafrica.com/stories/201408280138.html} (LCL Ebola Awareness)
    \item \url{http://www.actalliance.org/resources/alerts_and_situation_reports/Alert12_2014_WestAfrica_Ebola.pdf} (ActAlliance-Alert vom April 2014)
    \item \url{http://help-liberia.com/ebola/ebola-in-liberia-news} (Sehr übersichtliche deutschsprachige Webseite mit ausführlichen Informationen zum Ebolaausbruch in Liberia)
\end{itemize}
So.

\section{Bilder}
\rule{373.44246pt}{527.93196pt} \\
\noindent Quelle: MOHSW Monrovia7Liberia 2014.

\end{document}

编译后,一切看起来都很好,除了第一部分和第二部分之间添加了一个空白页。我只是不知道为什么——甚至日志文件看起来都很好。

答案1

你只是运气不好。

\rule{373.44246pt}{505pt}

它占用 2 页,包含第 2 部分和第 2 页上的图像。

\rule{373.44246pt}{510pt}

共占用3页,其中2页为空白。

然而 TeX 在这种情况下会发出警告

Overfull \vbox (4.90276pt too high) has occurred while \output is active

通常,过满的 vbox 会按照您预期的方式溢出底部边距,但在这里,它会陷入节头周围的分页决策中,并抛出一个额外的页面,这实际上可能是乳胶错误。

我感觉弗兰克不久前在这里的一个回答中分析过一个类似的案例......

答案2

你没有做错什么,这是 TeX 的一个缺陷(已记录在案),或者是一个错误,这hyperref取决于你怎么看待它。如果你hyperrefurl示例中的包替换,页面就会按预期显示。

那么会发生什么呢?

  • hyperref\pdfdest在页面中添加了很多命令,其中一个是\pdfdest name{section.<number>} xyz标题的一部分(例如,\section在你的情况下)
  • 现在这些命令在输出中生成“whatits”节点,并且“whatsits”不会在分页符处被丢弃
  • 然而惩罚和胶水是
  • 因此,如果hyperref添加\pdfdest ... \nobreak并且分页符恰好位于其前面(就像示例中的情况一样,因为该部分和下面的材料是一个太大的单个块),那么\pdfdest稍后将移动到当前页面的顶部(下一个要形成的页面),但\nobreak(这是一个惩罚)将消失,因为 TeX 还没有看到任何框(例如文本行)
  • 接下来 TeX 看到第一行文本(例如,标题文本\section),并且这是页面上的第一个框,它\topskip在其前面添加粘连,因此页面现在看起来像`\pdfdest ... \glue(来自 topskip)
  • 所以这个粘连\topskip不再是页面上的第一件事,并且根据 TeX 规则,如果粘连前面有不可丢弃的项目(例如,“whatsit”),那么粘连就是有效的分页符,现在就是这种情况。
  • 因此,我们在页面的最开始处有一个(非常糟糕的)分页符的可能性,如果没有hyperref
  • 但由于该部分及其第一行大于页面,TeX 无法在其后找到分页符,因此只能使用页面最开头的分页符
  • 如果没有该断点,TeX 根本找不到任何可以断点的地方,因此只能制作一个满溢的盒子(即在该部分之后断点,并在第一个可能的位置出现“图片”)

您可以通过添加来观察这一切的进展

\tracingpages=1 \tracingonline=1

在序言中。额外的断点在以下行中立即可见:

% t=31.90276 plus 1.86108 g=538.0 b=10000 p=-300 c=100000#
% t=615.80687 plus 9.02771 minus 0.86108 g=538.0 b=* p=0 c=*
[1{c:/texlive/2015/texmf-var/fonts/map/pdftex/updmap/pdftex.map}]
%% goal height=538.0, max depth=5.0
% t=0.0 g=538.0 b=10000 p=0 c=100000#
% t=560.83472 plus 1.86108 g=538.0 b=* p=0 c=*
[2]
%% goal height=538.0, max depth=5.0
% t=560.83472 plus 1.86108 g=538.0 b=* p=0 c=*#

Overfull \vbox (22.83472pt too high) has occurred while \output is active []

[3]

t=0.0您可以清楚地看到第 2 页形成时的断点,下一个可能的断点( t=560...)已经太晚了,所以第一个断点被采用。然后对于第 3 页,第一个断点是此时t=560...(这并不奇怪,因为我们正在查看相同的材料,只是删除了一个断点)所以现在 TeX 会接受它并报告页面过满

基本上(总结一下)TeX 代码实际上根本不应该在垂直模式下添加“whatsit”节点,而应该只在水平模式下添加(例如,在下一个段落的开头)。但问题是 LaTeX 的段落机制不提供任何支持,而且没有底层支持结构,这注定会很困难/不可能。(并不是有人认为我在指责@HeikoOberdiek,color例如,核心 LaTeX 发行版中的软件包实际上有同样的问题,因为它也必须发布“whatsits”,他们可以以类似的方式更改分页。)

对于 LaTeX3,我们尝试提供一个提供此支持的“galley”结构,但为了使其可用,所有包都需要使用它的接口,否则您最终会在主垂直列表上得到一批混合的节点,事情就会失控。

LaTeX2e 的一个可能替代方案是使\topskip等于\baselineskip在前面添加一个规则或一个框,\pdfdest并添加适当数量的负跳过(包括以\prevdepth正确的方式摆弄)。这样,这个框就会触发\topskip添加,因此\topskip粘连会再次出现在页面的最顶部,从而不会生成有效的断点。负跳过会取消其效果,下一个框将使用\topskip但不会添加\baselineskip

这只是一个粗略的草图,可能充满漏洞,但这是我在 2e 中看到的唯一可行方法。

ps 你的例子其实并不简单……你可以删除很多包而不会造成损失,也可以通过简化输入(例如使用计划文本而不是 utf8 或德语)来删除其他包。通过这样做,也许可以提前识别出“罪魁祸首”包。

相关内容