
Я вполне уверен, что это моя вина, но я не могу объяснить такое поведение 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
зависимости от того, как вам нравится на это смотреть. Если вы замените hyperref
пакетом url
в вашем примере, страницы будут выведены так, как и ожидалось.
Так что же происходит?
hyperref
\pdfdest
добавляет на страницу множество команд, одна из которых является\pdfdest name{section.<number>} xyz
частью заголовка (например,\section
в вашем случае)- теперь эти команды генерируют узлы «whatits» в выходных данных, а «whatsits» не отбрасываются при разрыве страницы
- однако штраф и клеи есть
- поэтому, если
hyperref
добавляется\pdfdest ... \nobreak
и разрыв страницы происходит прямо перед ним (как в примере, поскольку раздел и следующий за ним материал представляют собой один блок, который слишком велик), то\pdfdest
позже он будет перемещен в начало текущей страницы (следующей, которая будет сформирована), но\nobreak
(что является штрафом) исчезнет, поскольку TeX еще не увидел никаких блоков (например, строк текста) - далее TeX видит первую строку текста (например, текст заголовка
\section
) и, поскольку это первый блок на странице, он добавляет\topskip
перед ним клей, таким образом, страница теперь выглядит как `\pdfdest ... \glue (из topskip) - поэтому этот склеивающий элемент
\topskip
больше не является первым на странице, и согласно правилам TeX склеивающий элемент является допустимым разрывом страницы, если ему предшествует неудаляемый элемент (например, «что-то»), что и происходит сейчас. - поэтому у нас есть (очень плохая) возможность разрыва страницы в самом начале страницы, чего не было бы без
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 мы экспериментировали с предоставлением структуры «галеры», которая предлагает такую поддержку, но чтобы сделать ее пригодной для использования, все пакеты должны использовать ее интерфейсы, в противном случае вы получите смешанную группу узлов в главном вертикальном списке, и ситуация выйдет из-под контроля.
Возможной альтернативой для LaTeX2e было бы сделать \topskip
равным, чтобы \baselineskip
добавить затем правило или поле перед \pdfdest
и некоторое соответствующее количество отрицательного пропуска (включая манипуляции с \prevdepth
правильным способом). Таким образом, это поле инициировало бы добавление \topskip
, и, таким образом, \topskip
клей снова появился бы в самом верху страницы и, таким образом, не создал бы допустимую точку останова. Отрицательный пропуск отменил бы свой эффект, и следующее поле было бы добавлено без использования \topskip
but \baselineskip
.
Это всего лишь грубый набросок, возможно, полный дыр, но это единственный способ, которым я могу это реализовать в 2e.
ps Ваш пример не совсем минимален... вы можете отбросить много пакетов без потерь, а другие можно упростить ввод (например, использовать текст плана, а не utf8 или немецкий). Сделав это, можно было бы заранее определить пакет-"виновник".