scartcl /section /itemize: Por que página vazia?

scartcl /section /itemize: Por que página vazia?

Tenho certeza de que a culpa é minha, mas não consigo explicar esse comportamento do LaTeX usando a scrartclclasse:

\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}

Após a compilação, tudo parece bem, exceto que uma página em branco é adicionada entre as seções um e dois. Só não sei por que - até o arquivo de log parece bom.

Responder1

Você simplesmente teve azar.

Com

\rule{373.44246pt}{505pt}

São necessárias 2 páginas, com a seção 2 e a imagem na página 2.

Com

\rule{373.44246pt}{510pt}

São necessárias 3 páginas, com a página 2 em branco.

No entanto, o TeX avisa nesse caso

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

Normalmente, um vbox muito cheio faz o que você espera e transborda a margem inferior, mas aqui ele fica preso nas decisões de quebra de página ao redor do cabeçalho da seção e uma página extra é lançada, o que provavelmente é um bug de látex, na verdade.

Tenho a sensação de que Frank analisou um caso semelhante em uma resposta aqui há não muito tempo atrás...

Responder2

Você não fez nada de errado, é uma deficiência (documentada) do TeX ou um bug dependendo de hyperrefcomo você gosta de vê-lo. Se você substituir hyperrefpelo urlpacote no seu exemplo, as páginas sairão conforme o esperado.

Então o que acontece?

  • hyperrefadiciona muitos \pdfdestcomandos à página, um dos quais faz \pdfdest name{section.<number>} xyzparte de um título (por exemplo, \sectionno seu caso)
  • agora esses comandos geram nós "whatits" na saída e "whatsits" não são descartados em uma quebra de página
  • no entanto, penalidade e colas são
  • então, se hyperrefas adições \pdfdest ... \nobreake a quebra de página forem feitas logo na frente dela (como é o caso no exemplo, já que a seção e o material a seguir são um único bloco que é muito grande), então \pdfdestserá posteriormente movido para o topo da página atual (próxima a ser formada), mas \nobreak(o que é uma penalidade) desaparecerá porque o TeX ainda não viu nenhuma caixa (por exemplo, linhas de texto)
  • próximo TeX vê a primeira linha de texto (por exemplo, o texto do \sectiontítulo) e sendo a primeira caixa na página ele adiciona \topskipcola na frente dela, assim a página agora se parece com `\pdfdest ... \glue (de saltar para cima)
  • então esta cola \topskipnão é mais a primeira coisa na página e de acordo com as regras do TeX uma cola é uma quebra de página válida se for precedida por um item não descartável (por exemplo, um "whatsit") que é o caso agora.
  • então temos (uma péssima) possibilidade de quebra de página bem no início da página, que não existe semhyperref
  • mas como a seção e sua primeira linha são maiores que uma página, o TeX não encontra uma quebra de página depois dela, então recorre ao uso daquele que está no início da página
  • sem esse ponto de interrupção, o TeX não encontraria nenhum lugar para quebrar, então recorreria a fazer uma caixa cheia demais (ou seja, quebrar após a seção e a "imagem" no primeiro lugar possível)

Você pode assistir a tudo isso se desenrolando adicionando

\tracingpages=1 \tracingonline=1

no preâmbulo. Os pontos de interrupção extras tornam-se imediatamente visíveis em linhas como

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

você pode ver bem o ponto de interrupção quando t=0.0a página 2 é formada, o próximo ponto de interrupção possível ( t=560...) já é tarde demais, então o primeiro é obtido. Então, para a página 3, o primeiro ponto de interrupção é desta vez t=560...(sem surpresa, pois estamos olhando para o mesmo material com apenas um ponto de interrupção removido), então agora o TeX o pega e relata uma página cheia demais

Basicamente (como um resumo) o código TeX realmente não deveria adicionar nós "whatsit" no modo vertical, mas deveria fazer isso apenas no modo horizontal (por exemplo, no início do próximo parágrafo). O problema, porém, é que a máquina de parágrafos do LaTeX não fornece nenhum suporte para isso e sem uma estrutura de suporte subjacente que será difícil/impossível. (E não que alguém pense que eu aponto o dedo para @HeikoOberdiek, o colorpacote da distribuição principal do LaTeX, por exemplo, tem o mesmo problema, pois também precisa emitir "whatsits" e eles podem alterar a quebra de página de maneira semelhante .)

Para o LaTeX3 nós experimentamos fornecer uma estrutura de "galé" que oferece esse suporte, mas para torná-lo utilizável todos os pacotes precisariam usar suas interfaces, caso contrário você acabaria com um lote misto de nós na lista vertical principal e as coisas sairiam do controle. mão.

Uma alternativa possível para o LaTeX2e seria igualar \topskipa \baselineskipadição de uma regra ou caixa na frente de \pdfdeste alguma quantidade apropriada de salto negativo (incluindo mexer \prevdepthno caminho certo). Dessa forma essa caixa acionaria a \topskipadição e assim a \topskipcola apareceria novamente bem no topo da página e assim não geraria um breakpoint válido. O salto negativo cancelaria seu efeito e a próxima caixa seria adicionada sem usar \topskipmas \baselineskip.

Apenas um esboço grosseiro e possivelmente cheio de buracos, mas essa é a única maneira que pude ver isso funcionando na 2e.

ps Seu exemplo não é realmente mínimo ... você pode descartar muitos pacotes sem perdas e outros simplificando a entrada (por exemplo, use o texto do plano, não utf8 ou alemão). Ao fazer isso, o pacote “culpado” talvez pudesse ter sido identificado antecipadamente.

informação relacionada