scrartcl / sección / itemize: ¿Por qué página vacía?

scrartcl / sección / itemize: ¿Por qué página vacía?

Estoy bastante seguro de que es culpa mía, pero no puedo explicar este comportamiento de LaTeX usando la scrartclclase:

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

Al compilar, todo parece bastante bien, excepto que se agrega una página en blanco entre las secciones uno y dos. Simplemente no sé por qué; incluso el archivo de registro parece estar bien.

Respuesta1

Simplemente tuviste mala suerte.

Con

\rule{373.44246pt}{505pt}

Se necesitan 2 páginas, con la sección 2 y la imagen en la página 2.

Con

\rule{373.44246pt}{510pt}

Se necesitan 3 páginas, con la página 2 en blanco.

Sin embargo, TeX advierte en ese caso.

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

Normalmente, un vbox demasiado lleno hace lo que se podría esperar y desborda el margen inferior, pero aquí queda atrapado en las decisiones de ruptura de página alrededor del encabezado de la sección y se lanza una página adicional, lo que probablemente sea un error de látex.

Tengo la sensación de que Frank analizó un caso similar en una respuesta aquí no hace mucho...

Respuesta2

No hiciste nada malo, es una deficiencia (documentada) de TeX o un error dependiendo hyperrefde cómo quieras verlo. Si reemplaza hyperrefpor el urlpaquete en su ejemplo, las páginas salen como se esperaba.

¿Así que lo que ocurre?

  • hyperrefagrega muchos \pdfdestcomandos a la página, uno de los cuales es \pdfdest name{section.<number>} xyzparte de un encabezado (por ejemplo, \sectionen su caso)
  • ahora estos comandos generan nodos "whatits" en la salida y "whatsits" no se descartan en un salto de página
  • sin embargo la pena y los pegamentos son
  • entonces, si hyperrefse agrega \pdfdest ... \nobreaky el salto de página se toma justo en frente (como es el caso en el ejemplo, ya que la sección y el material que sigue son un solo bloque que es demasiado grande), luego \pdfdestse moverá a la parte superior. de la página actual (la siguiente que se formará) pero \nobreak(lo cual es una penalización) desaparecerá porque TeX no ha visto ningún cuadro (por ejemplo, líneas de texto todavía)
  • next TeX ve la primera línea de texto (por ejemplo, el texto del \sectiontítulo) y, al ser el primer cuadro de la página, agrega \topskippegamento delante de él, por lo que la página ahora se ve como `\pdfdest ... \glue (de saltar)
  • por lo tanto, este pegamento \topskipya no es lo primero en la página y, según las reglas de TeX, un pegamento es un salto de página válido si va precedido de un elemento no descartable (por ejemplo, un "qué"), que es el caso ahora.
  • entonces tenemos (muy mala) posibilidad de salto de página al principio de la página, que no está allí sinhyperref
  • pero como la sección y su primera línea son más grandes que una página, TeX no encuentra un salto de página después, por lo que recurre al uso del que está al principio de la página.
  • sin ese punto de interrupción, TeX no encontraría ningún lugar para romper, por lo que recurriría a hacer un cuadro demasiado lleno (es decir, romper después de la sección y la "imagen" en el primer lugar posible).

Puedes ver cómo se desarrolla todo esto agregando

\tracingpages=1 \tracingonline=1

en el preámbulo. Los puntos de interrupción adicionales se vuelven inmediatamente visibles en líneas 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]

Puede ver muy bien el punto de interrupción t=0.0cuando se forma la página 2; el siguiente punto de interrupción posible ( t=560...) ya es demasiado tarde, por lo que se toma el primero. Luego, para la página 3, el primer punto de interrupción es esta vez t=560...(no es de extrañar, ya que estamos viendo el mismo material con solo un punto de interrupción eliminado), por lo que ahora TeX lo toma y reporta una página demasiado llena.

Básicamente (como resumen), el código TeX realmente no debería agregar nodos "whatsit" en modo vertical, sino que debería hacerlo solo en modo horizontal (por ejemplo, al comienzo del siguiente párrafo). Sin embargo, el problema es que la maquinaria de párrafos de LaTeX no proporciona ningún soporte para eso y sin una estructura de soporte subyacente eso seguramente será difícil/imposible. (Y no es que alguien piense que estoy señalando a @HeikoOberdiek, el colorpaquete de la distribución principal de LaTeX, por ejemplo, tiene el mismo problema, ya que también tiene que emitir "whatsits" y pueden cambiar el salto de página de una manera similar. .)

Para LaTeX3 hemos experimentado proporcionando una estructura de "galera" que ofrece este soporte, pero para que esto sea utilizable, todos los paquetes necesitarían usar sus interfaces, de lo contrario terminaría con un lote mixto de nodos en la lista vertical principal y las cosas saldrían mal. mano.

Una posible alternativa para LaTeX2e sería \topskipagregar \baselineskipuna regla o un cuadro delante \pdfdesty una cantidad apropiada de salto negativo (incluido tocar el violín de \prevdepthla manera correcta). De esa manera, este cuadro activaría la \topskipadición y, por lo tanto, el \topskippegamento volvería a aparecer en la parte superior de la página y, por lo tanto, no generaría un punto de interrupción válido. El salto negativo cancelaría su efecto y se agregaría el siguiente cuadro sin usar \topskippero \baselineskip.

Solo un boceto aproximado y posiblemente lleno de agujeros, pero esa es la única forma en que pude ver que esto funcione en 2e.

PD: Su ejemplo no es realmente mínimo... puede descartar muchos paquetes sin pérdida y otros simplificando la entrada (por ejemplo, use texto del plan, no utf8 o alemán). Al hacerlo, tal vez se podría haber identificado de antemano el paquete "culpable".

información relacionada