
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 hyperref
nachdem, wie Sie es sehen möchten. Wenn Sie in Ihrem Beispiel hyperref
durch das url
Paket ersetzen, werden die Seiten wie erwartet angezeigt.
Was passiert also?
hyperref
fügt viele\pdfdest
Befehle in die Seite ein, einer davon ist\pdfdest name{section.<number>} xyz
Teil einer Überschrift (z. B.\section
in 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
hyperref
etwas hinzugefügt wird\pdfdest ... \nobreak
und der Seitenumbruch genau davor erfolgt (wie im Beispiel, da der Abschnitt und das folgende Material ein einzelner Block sind, der zu groß ist),\pdfdest
wird 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
\section
Titels) und da dies das erste Feld auf der Seite ist, fügt es\topskip
davor einen Kleber ein, sodass die Seite nun wie folgt aussieht: `\pdfdest ... \glue (von topskip) - daher ist dieser Kleber
\topskip
nicht 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 ohne
hyperref
- 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.0
wenn 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 color
Paket 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, \topskip
gleich zu \baselineskip
addieren und dann eine Regel oder ein Kästchen vor dem \pdfdest
und eine angemessene Menge an negativem Skip zu setzen (einschließlich des Herumspielens mit \prevdepth
auf die richtige Weise). Auf diese Weise würde dieses Kästchen die \topskip
Hinzufü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 \topskip
hinzugefü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.