scrartcl / Abschnitt / Auflisten: Warum leere Seite?

scrartcl / Abschnitt / Auflisten: Warum leere Seite?

Ich bin ziemlich sicher, dass es mein Fehler ist, aber ich kann dieses Verhalten von LaTeX bei Verwendung der Klasse nicht erklären 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}

Beim Kompilieren sieht alles ziemlich gut aus, außer dass zwischen Abschnitt eins und zwei eine leere Seite eingefügt wird. Ich weiß einfach nicht, warum – sogar die Protokolldatei sieht gut aus.

Antwort1

Du hattest einfach Pech.

Mit

\rule{373.44246pt}{505pt}

Es umfasst 2 Seiten, mit Abschnitt 2 und dem Bild auf Seite 2.

Mit

\rule{373.44246pt}{510pt}

Es umfasst 3 Seiten, mit leerer Seite 2.

Allerdings warnt TeX in diesem Fall

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

Normalerweise macht eine überfüllte Vbox das, was Sie erwarten, und lässt den unteren Rand überlaufen, aber hier bleibt sie bei den Seitenumbruchentscheidungen rund um den Abschnittskopf hängen und es wird eine zusätzliche Seite geworfen, was wahrscheinlich wirklich ein Latex-Fehler ist.

Ich habe das Gefühl, dass Frank vor nicht allzu langer Zeit in einer Antwort hier einen ähnlichen Fall analysiert hat ...

Antwort2

Sie haben nichts falsch gemacht, es ist ein (dokumentierter) Mangel von TeX oder ein Fehler, je hyperrefnachdem, wie Sie es sehen möchten. Wenn Sie in Ihrem Beispiel hyperrefdurch das urlPaket ersetzen, werden die Seiten wie erwartet angezeigt.

Was passiert also?

  • hyperreffügt viele \pdfdestBefehle in die Seite ein, einer davon ist \pdfdest name{section.<number>} xyzTeil einer Überschrift (z. B. \sectionin Ihrem Fall)
  • jetzt erzeugen diese Befehle "Whatits"-Knoten in der Ausgabe und "Whatits" werden bei einem Seitenumbruch nicht verworfen
  • jedoch Strafe und Klebstoffe sind
  • Wenn also hyperrefetwas hinzugefügt wird \pdfdest ... \nobreakund der Seitenumbruch genau davor erfolgt (wie im Beispiel, da der Abschnitt und das folgende Material ein einzelner Block sind, der zu groß ist), \pdfdestwird es später an den Anfang der aktuellen Seite verschoben (die nächste, die gebildet wird), aber das \nobreak(was eine Strafe darstellt) verschwindet, weil TeX noch keine Kästchen gesehen hat (z. B. noch Textzeilen).
  • als nächstes sieht TeX die erste Textzeile (z. B. den Text des \sectionTitels) und da dies das erste Feld auf der Seite ist, fügt es \topskipdavor einen Kleber ein, sodass die Seite nun wie folgt aussieht: `\pdfdest ... \glue (von topskip)
  • daher ist dieser Kleber \topskipnicht mehr das erste Element auf der Seite und gemäß den TeX-Regeln ist ein Kleber ein gültiger Seitenumbruch, wenn ihm ein nicht verwerfliches Element (z. B. ein „Dingsbums“) vorangestellt ist, was jetzt der Fall ist.
  • Wir haben also eine (sehr schlechte) Seitenumbruchmöglichkeit ganz am Anfang der Seite, die es ohnehyperref
  • aber da der Abschnitt und seine erste Zeile länger als eine Seite sind, findet TeX danach keinen Seitenumbruch und verwendet daher den ganz am Anfang der Seite stehenden
  • ohne diesen Haltepunkt würde TeX überhaupt keine Stelle zum Unterbrechen finden und müsste deshalb eine überfüllte Box erstellen (d. h. nach dem Abschnitt und dem „Bild“ an der erstmöglichen Stelle unterbrechen).

Sie können dies alles beobachten, indem Sie hinzufügen

\tracingpages=1 \tracingonline=1

in der Präambel. Die zusätzlichen Unterbrechungspunkte werden sofort sichtbar in Zeilen wie

% 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]

Sie können den Haltepunkt gut sehen, t=0.0wenn Seite 2 gebildet wird. Der nächste mögliche Haltepunkt ( t=560...) ist bereits zu spät, also wird der erste genommen. Dann ist für Seite 3 diesmal der erste Haltepunkt t=560...(keine Überraschung, da wir uns dasselbe Material ansehen, bei dem nur ein Haltepunkt entfernt wurde), also nimmt TeX ihn jetzt und meldet eine überfüllte Seite

Grundsätzlich (zusammenfassend) sollte TeX-Code im vertikalen Modus eigentlich gar keine „Whatsits“-Knoten hinzufügen, sondern nur im horizontalen Modus (z. B. am Anfang des nächsten Absatzes). Das Problem ist jedoch, dass die Absatzbildungsmaschinerie von LaTeX dafür keine Unterstützung bietet und ohne eine zugrunde liegende Unterstützungsstruktur ist das zwangsläufig schwierig/unmöglich. (Und nicht, dass irgendjemand denkt, ich würde mit dem Finger auf @HeikoOberdiek zeigen, das colorPaket aus der LaTeX-Kerndistribution hat beispielsweise tatsächlich dasselbe Problem, da es auch „Whatsits“ ausgeben muss und sie den Seitenumbruch auf ähnliche Weise ändern können.)

Für LaTeX3 haben wir mit der Bereitstellung einer „Galerien“-Struktur experimentiert, die diese Unterstützung bietet. Um diese jedoch nutzbar zu machen, müssten alle Pakete ihre Schnittstellen verwenden. Andernfalls hätten Sie am Ende eine gemischte Gruppe von Knoten in der vertikalen Hauptliste und die Dinge würden außer Kontrolle geraten.

Eine mögliche Alternative für LaTeX2e wäre, \topskipgleich zu \baselineskipaddieren und dann eine Regel oder ein Kästchen vor dem \pdfdestund eine angemessene Menge an negativem Skip zu setzen (einschließlich des Herumspielens mit \prevdepthauf die richtige Weise). Auf diese Weise würde dieses Kästchen die \topskipHinzufügung auslösen und somit würde der Kleber wieder ganz oben auf der Seite erscheinen und somit keinen gültigen Haltepunkt erzeugen. Der negative Skip würde seine Wirkung aufheben und das nächste Kästchen würde nicht mit but \topskiphinzugefügt .\topskip\baselineskip

Nur eine grobe Skizze und möglicherweise voller Lücken, aber das ist ungefähr die einzige Möglichkeit, wie ich mir vorstellen kann, dass es in 2e funktioniert.

PS: Ihr Beispiel ist nicht wirklich minimal ... Sie können viele Pakete ohne Verlust löschen und andere, indem Sie die Eingabe vereinfachen (z. B. Plantext verwenden, nicht UTF-8 oder Deutsch). Auf diese Weise hätte das „schuldige“ Paket möglicherweise im Voraus identifiziert werden können.

verwandte Informationen