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зависимости от того, как вам нравится на это смотреть. Если вы замените 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клей снова появился бы в самом верху страницы и, таким образом, не создал бы допустимую точку останова. Отрицательный пропуск отменил бы свой эффект, и следующее поле было бы добавлено без использования \topskipbut \baselineskip.

Это всего лишь грубый набросок, возможно, полный дыр, но это единственный способ, которым я могу это реализовать в 2e.

ps Ваш пример не совсем минимален... вы можете отбросить много пакетов без потерь, а другие можно упростить ввод (например, использовать текст плана, а не utf8 или немецкий). Сделав это, можно было бы заранее определить пакет-"виновник".

Связанный контент