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 還沒有看到任何方塊(例如文字行)
  • next TeX 看到第一行文字(例如,標題的文字\section),並且它是頁面上的第一個框,它\topskip在其前面添加了粘連,因此頁面現在看起來像`\pdfdest ... \glue (來自頂跳過)
  • 所以這個黏連\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”節點,而應該只在水平模式下添加“whatsit”節點(例如,在下一段的開頭)。但問題是 LaTeX 的段落機制不提供任何支持,並且沒有底層支持結構,這注定是困難/不可能的。 (並不是說有人認為我把矛頭指向@HeikoOberdiek,color例如,來自核心 LaTeX 發行版的軟體包實際上具有相同的問題,因為它也必鬚髮出“whatsits”,並且他們可以以類似的方式更改分頁.)

對於LaTeX3,我們嘗試提供一個「廚房」結構來提供這種支持,但為了使其可用,所有包都需要使用它的接口,否則您最終會在主垂直列表上獲得一批混合節點,事情就會出問題。

LaTeX2e 的一個可能的替代方案是在 之前添加一條規則或一個框,\topskip以及一些適當數量的負跳過(包括以正確的方式進行調整)。這樣,該框將觸發添加,因此粘合將再次出現在頁面的最頂部,從而不會產生有效的斷點。負跳過將取消其效果,並且將不使用but新增下一個方塊。\baselineskip\pdfdest\prevdepth\topskip\topskip\topskip\baselineskip

只是一個粗略的草圖,可能充滿了漏洞,但這大概是我在 2e 中看到它工作的唯一方法。

ps 你的例子並不是真的很小......你可以通過簡化輸入(例如使用計劃文本而不是utf8或德語)來無損地刪除很多包和其他包。透過這樣做,「罪魁禍首」包也許可以提前被識別出來。

相關內容