scrartcl / section / itemize: 왜 빈 페이지인가요?

scrartcl / section / itemize: 왜 빈 페이지인가요?

나는 그것이 내 잘못이라고 확신하지만 scrartcl클래스를 사용하여 LaTeX의 이러한 동작을 설명할 수는 없습니다.

\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과 2 사이에 빈 페이지가 추가된 것을 제외하면 모든 것이 괜찮아 보입니다. 이유는 모르겠습니다. 로그 파일도 괜찮아 보입니다.

답변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가 너무 가득 차면 예상한 대로 작동하고 아래쪽 여백이 넘치지만 여기서는 섹션 헤드 주변의 페이지 나누기 결정에 걸리고 추가 페이지가 발생하는데 이는 실제로 라텍스 버그일 수 있습니다.

Frank가 얼마 전 여기에 답변으로 비슷한 사례를 분석한 것 같은 느낌이 듭니다...

답변2

당신은 아무 잘못도 하지 않았습니다. 그것은 TeX의 (문서화된) 결함이거나 hyperref당신이 그것을 보는 방식에 따른 버그입니다. 예제에서 패키지 hyperref로 바꾸면 url페이지가 예상대로 나옵니다.

그러면 어떻게 되나요?

  • hyperref\pdfdest페이지에 많은 명령을 추가합니다 . 그 중 하나는 \pdfdest name{section.<number>} xyz제목의 일부입니다(예: \section귀하의 경우).
  • 이제 이러한 명령은 출력에 "whatits" 노드를 생성하고 "whatsits"는 페이지 나누기 시 삭제되지 않습니다.
  • 그러나 페널티와 글루는
  • 따라서 hyperref추가 \pdfdest ... \nobreak및 페이지 나누기가 바로 앞에 표시되면(예에서 섹션과 다음 자료가 너무 큰 단일 블록인 경우처럼) 나중에 맨 \pdfdest위로 이동됩니다 . 현재 페이지(다음 페이지)가 표시되지만 \nobreakTeX가 아직 상자(예: 텍스트 줄)를 보지 못했기 때문에 (벌금)은 사라질 것입니다.
  • 다음 TeX는 텍스트의 첫 번째 줄(예: 제목의 텍스트 \section)을 보고 페이지의 첫 번째 상자이므로 \topskip그 앞에 접착제를 추가하므로 페이지는 이제 `\pdfdest ... \glue(from 톱스킵)
  • 따라서 이 글루는 \topskip더 이상 페이지의 첫 번째 항목이 아니며 TeX 규칙에 따르면 글루 앞에 삭제할 수 없는 항목(예: "whatsit")이 있으면 유효한 페이지 나누기가 됩니다.
  • 그래서 우리는 페이지 맨 처음 부분에 (매우 나쁜) 페이지 나누기 가능성이 있습니다.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]

페이지 2가 형성될 때 중단점을 잘 볼 수 있습니다 t=0.0. 다음 가능한 중단점( t=560...)은 이미 너무 늦어서 첫 번째 중단점이 사용됩니다. 그런 다음 페이지 3의 첫 번째 중단점은 이번에입니다 t=560...(단 하나의 중단점만 제거된 동일한 자료를 보고 있으므로 놀랄 일이 아닙니다). 이제 TeX가 이를 가져와 전체 페이지를 보고합니다.

기본적으로 (요약하자면) TeX 코드는 수직 모드에서 "whatsit" 노드를 전혀 추가해서는 안 되지만, 수평 모드에서만 (예를 들어 다음 단락의 시작 부분에) 추가해야 합니다. 그러나 문제는 LaTeX의 단락 기계가 이에 대한 지원을 제공하지 않으며 어렵거나 불가능할 수 있는 기본 지원 구조가 없다는 것입니다. (예를 들어 핵심 LaTeX 배포판의 패키지인 @HeikoOberdiek을 비난한다고 생각하는 사람은 없습니다. color"whatsits"를 발행해야 하고 유사한 방식으로 페이지 나누기를 변경할 수 있기 때문에 실제로 동일한 문제가 있습니다. .)

LaTeX3의 경우 이 지원을 제공하는 "갤리" 구조를 제공하는 실험을 했지만 이를 사용 가능하게 만들려면 모든 패키지에서 해당 인터페이스를 사용해야 합니다. 그렇지 않으면 기본 수직 목록에 혼합된 노드 배치가 생기고 상황이 종료됩니다. 손.

LaTeX2e에 대한 가능한 대안은 \topskip동일하게 \baselineskip만든 다음 앞에 규칙이나 상자를 추가 \pdfdest하고 적절한 양의 네거티브 건너뛰기를 추가하는 것입니다( \prevdepth올바른 방식으로 조작하는 것을 포함). 그런 식으로 이 상자는 \topskip추가를 트리거하므로 \topskip접착제가 페이지 맨 위에 다시 나타나 유효한 중단점이 생성되지 않습니다. 부정적인 건너뛰기는 효과를 취소하고 다음 상자는 \topskipbut을 사용하지 않고 추가됩니다 \baselineskip.

대략적인 스케치이고 구멍이 많을 수도 있지만 이것이 2e에서 작동하는 것을 볼 수 있는 유일한 방법입니다.

ps 귀하의 예는 실제로 최소가 아닙니다. 입력을 단순화하여 많은 패키지를 손실 없이 삭제할 수 있으며 다른 패키지도 삭제할 수 있습니다(예: utf8 또는 독일어가 아닌 계획 텍스트 사용). 그렇게 함으로써 "범인" 패키지를 미리 식별할 수 있었을 것입니다.

관련 정보