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 と 2 の間に空白ページが追加されていることを除いて、すべてかなり正常に見えます。理由はわかりませんが、ログ ファイルも正常に見えます。

答え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 は予想どおりに動作し、下マージンをオーバーフローしますが、ここではセクション ヘッダーの周りのページ分割の決定に巻き込まれ、余分なページがスローされます。これは実際にはおそらく LaTeX のバグです。

フランクが少し前にここでの回答で同様のケースを分析したような気がします...

答え2

hyperref何も間違ったことをしていません。これは、見方によっては TeX の (文書化された) 欠陥、またはバグです。例のパッケージhyperrefに置き換えるとurl、ページは期待どおりに表示されます。

それで何が起こるのでしょうか?

  • hyperref\pdfdestページに多くのコマンドを追加しますが、そのうちの 1 つは\pdfdest name{section.<number>} xyz見出しの一部です (たとえば、\sectionあなたの場合)
  • これらのコマンドは出力に「whatits」ノードを生成し、「whatits」はページ区切りで破棄されなくなりました。
  • しかし、ペナルティとグルーは
  • したがって、hyperref追加され\pdfdest ... \nobreak、その直前でページ区切りが取られた場合(例の場合のように、セクションとそれに続く資料は大きすぎる単一のブロックです)、後で\pdfdest現在のページ(次に形成されるページ)の先頭に移動されますが、\nobreak(ペナルティである)は、TeXがボックス(テキストの行など)をまだ見ていないため消えます。
  • 次に、TeX はテキストの最初の行 (たとえば、タイトルのテキスト\section) を確認し、それがページの最初のボックスであるため、\topskipその前に glue を追加します。そのため、ページは `\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]

ページ2が形成された時点でブレークポイントがうまく表示されます。t=0.0次のブレークポイント(t=560...)はすでに遅すぎるため、最初のブレークポイントが取得されます。次にページ3の最初のブレークポイントが今回ですt=560...(ブレークポイントを1つ削除しただけの同じ資料を見ているので驚くことではありません)。そのため、TeXはそれを取得して、オーバーフルページを報告します。

基本的に (要約すると)、TeX コードは垂直モードでは "whatsit" ノードをまったく追加すべきではなく、水平モードでのみ追加する必要があります (たとえば、次の段落の先頭)。ただし、問題は、LaTeX の段落作成機構がそれをサポートしておらず、基礎となるサポート構造がなければ困難/不可能になるということです。(私が @HeikoOberdiek を非難しているとは誰も思っていませんが、colorたとえばコア LaTeX ディストリビューションのパッケージには、"whatsits" を発行する必要があり、同様の方法でページ区切りを変更できるため、同じ問題があります。)

LaTeX3 では、このサポートを提供する「ギャラリー」構造を提供することを試しましたが、これを使用可能にするには、すべてのパッケージがそのインターフェイスを使用する必要があります。そうしないと、メインの垂直リストにノードの混合バッチが表示され、手に負えなくなります。

LaTeX2e の代替案としては、 を に追加してから、 の前にルールまたはボックスを追加し\topskip、適切な量の負のスキップ (正しい方法で をいじることを含む) を追加することが考えられます。 こうすることで、このボックスが追加をトリガーし、グルーがページの一番上に再び表示され、有効なブレークポイントが生成されなくなります。 負のスキップはその効果を取り消し、次のボックスは を使用せずに追加されます。\baselineskip\pdfdest\prevdepth\topskip\topskip\topskip\baselineskip

まだラフスケッチで、穴だらけかもしれませんが、これが 2e でこれが機能する唯一の方法だと思います。

ps あなたの例は本当に最小限ではありません... 入力を簡素化することで、多くのパッケージを損失なく削除したり、他のパッケージを削除したりできます (例: utf8 や german ではなく、plan text を使用します)。 そうすることで、「原因」パッケージを事前に特定できた可能性があります。

関連情報