Sie sind hier

Letzte Zeile bei zweispaltigem Satz auf erster Seite nicht am unteren Rand

Hallo,

ich möchte Beiträge für eine Zeitschrift zweispaltig setzen. Leider liegen jeweils auf der ersten Seite die letzten Linien der Spalten nicht beide am unteren Rand des Satzspiegels. Das lässt sich in einem Minimalbeispiel leicht reproduzieren:

\documentclass{scrartcl}
 
\KOMAoption{twocolumn}{true}
 
% \KOMAoption{fontsize}{10pt}
% \recalctypearea
 
\usepackage{blindtext}
\usepackage{showframe}
 
\author{Peter\thanks{Paul}}
 
\title{Über Namen}
 
\date{}
 
\begin{document}
 
\flushbottom% redundant, bereits von twocolumn impliziert
 
\maketitle
 
\blindtext[25]
 
\end{document}

Auf der ersten Seite liegt die linke Spalte, also die mit der Fußnote, am unteren Rand, während die rechte etwas höher hängt. Ohne Fußnote fällt natürlich kein Unterschied in die Augen, aber es bleibt ein Abstand vom Rahmen bzw. unteren Rand.

Wie kann man da Abhilfe schaffen?

Vielleicht würde ein flexibler \vskip am Ende der Definition von \maketitle helfen, den man wie \chapterheadendvskip redefinieren kann. Aber ich habe im Code keinen solchen 'Hook' gefunden.

Verwendet: v3.26b aus TeXLive 2019

Grüße
Christian

Bild von Markus Kohm

Das ist leider ein LaTeX-Problem. Einspaltiges Material über zweispaltigem Text setzt man bei LaTeX mit \twocolumn[Einspaltiges Material]. So macht das auch KOMA-Script, nämlich in der Form \twocolumn[\@maketitle]. Nun läge es natürlich nahe, stattdessen etwas wie

\twocolumn[\@maketitle\vskip 0pt plus .5\baselineskip minus .5\baselineskip]

oder auch

\twocolumn[\@maketitle\vspace*{0pt plus .5\baselineskip minus .5\baselineskip}]

zu machen. Leider aber geht der komplette Leim im optionalen Argument von \twolcolumn verloren. Es ändert sich dadurch also rein gar nichts.

Übrigens hat article genau dasselbe Problem. Mit

\documentclass[twocolumn,a4paper,11pt]{article}
%\usepackage{typearea}
 
\usepackage{blindtext}
\usepackage{showframe}
 
\author{Peter\thanks{Paul}}
 
\title{Über Namen}
 
\date{}
 
\begin{document}
 
\flushbottom% redundant, bereits von twocolumn impliziert
 
\maketitle
 
\blindtext[25]
 
\end{document}

findest Du daher ebenfalls underfull \vbox Meldungen für die erste Seite in der log-Datei.

(Das Problem ist übrigens ähnlich zu dem Problem bei der Indexüberschrift aber nicht ganz dasselbe.)

Als Workaround könnte ich

\documentclass[twocolumn]{scrartcl}
 
\usepackage{blindtext}
\usepackage{showframe}
\usepackage{xpatch}
 
\makeatletter
\xpatchcmd{\maketitle}{\twocolumn[\@maketitle]}{%
  \twocolumn[{%
    \setbox\@tempboxa\vbox{\let\thanks\@gobble\@maketitle}%
    \@tempcnta\numexpr\ht\@tempboxa/\baselineskip\relax
    \parbox[t][\dimexpr \baselineskip*\@tempcnta\relax]{\textwidth}{\@maketitle}%
  }]%
}{}{\undefined}
\makeatother
 
\author{Peter\thanks{Paul}}
 
\title{Über Namen}
 
\date{}
 
\begin{document}
 
\flushbottom% redundant, bereits von twocolumn impliziert
 
\maketitle
\blindtext[25]
\end{document}

anbieten. Aber es muss klar sein, dass das ein Hack ist!
Das Prinzip dieses Hacks ist, auszumessen, wie hoch der Titelkopf tatsächlich wird, diese Höhe dann auf eine ganze Zahl an Zeilen zu runden (sowohl auf wie ab) und dann in eine Box der entsprechenden, festen Höhe zu packen. Das ist dann kein Leim mehr, macht aber letztlich ungefähr das gleiche wie \vskip 0pt plus .5\baselineskip minus .5\baselineskip. Der Abstand am Ende des Titelkopfes kann also eine halbe Zeile größer oder kleiner sein als eigentlich eingestellt. Im Gegensatz zu echtem Leim hat aber der restliche Inhalt der Seite keine Auswirkung mehr darauf, sondern der Titel wird unabhängig davon nur für sich behandelt.

Hallo Markus,

ganz herzlichen Dank für den Hack und auch für die Erklärung, durch die ich endlich verstehe, warum meine Patch-Versuche nicht funktioniert haben.

Wenn ich den Hack richtig verstehe, wird die Abmessung von \maketitle erst im Boxregister \@tempboxa gespeichert, oder? Dann wird die Höhe (\ht) der Box im Boxregister durch \baselineskip dividiert und das Ergebnis im Zählregister \@tempcnta gespeichert, welches dann anschließend wieder bei der Höhendefinition für eine \parbox als Faktor für die Höhe in Zeilenvielfachen verwendet wird. Richtig? Nutzt man dabei aus, dass das Zählregister vom Typ Integer ist, oder wie bekommt man den Ganzzahlquotienten?

Welches Buch würdest Du eigentlich empfehlen, wenn man solche TeX-Primitiven verstehen will?

Ich habe den Hack jetzt verwendet und das Ergebnis sieht jetzt druckereifertig aus!

Grüße
Christian

Bild von Markus Kohm

Ja, der Titelkopf wird erst in das Boxregister gepackt, um dann dessen Höhe verwenden zu können. Man hätte die Höhe auch mittels \settotheight in ein Längenregister schreiben können.

Dass das Zählregister vom Typ Integer ist, wird nicht wirklich ausgenutzt. Tatsächlich hätte man da auch ein Längenregister verwenden können. TeX speichert Längen intern immer als Integer in sp. Und wenn man einem Zähler eine Länge zuweist, dann enthält diese anschließend genau diesen Wert ohne Einheit. Teile ich nun zwei Längen durcheinander, dann wird daraus wieder eine Länge in sp. Dass ich einen Zähler statt einer Länge zum Speichern genommen habe, liegt schlicht daran, dass die Einheit beim Teilen von zwei Zahlen mit Einheit ja eigentlich Unfug ist und tatsächlich ein Faktor und keine Länge dabei heraus kommt. Außerdem nutze ich aus, dass \numexpr (genau wie \dimexpr und \glueexpr) eben immer auf die nächste ganze Zahl (bzw. Länge in sp) runden (\divide arbeitet da übrigens ein wenig anders). Wobei es letztlich für das Ergebnis gar nicht so genau darauf ankommt, ob nun ab- oder aufgerundet wird. Hauptsache bei der anschließenden Multiplikation kommt eine Länge in \baselineskip heraus.

Eigentlich müsste man auch noch die Tiefe der Box berücksichtigen. Das habe ich hier unberücksichtigt gelassen, weil ich einerseits eine \vbox verwendet habe und andererseits weiß, dass am Ende von \@maketitle ein vertikaler Abstand steht.

Das [t] bei der \parbox ist übrigens nicht so wichtig. Es wird nur irgend ein optionales Argument für die vertikale Ausrichtung benötigt, damit man eines für die Höhe angeben kann. Theoretisch könnte man aber auch direkt \ht und \dp von \@tempboxa manipulieren und die Box dann mit \usebox oder \box ausgeben.

Literatur:

  • TeX by Topic (ist bei einem vollständigen TeX Live dabei)
  • The e-TeX manual (ist bei einem vollständigen TeX Live auch dabei)
  • The TeXbook (legal nur als Buch zu kaufen oder als Demoqueltext im Quelltext zu lesen)

Und 30 Jahre Erfahrung. ;-)

Hi,

scheint mir kein KOMA-Script Problem zu sein, denn wenn ich als Dokumentenklasse  \documentclass[twocolumn]{article} angebe und die Option \KOMAoption{twocolumn}{true} auskommentiere, bleibt das Layout am unteren Rand der ersten Seite vergleichbar.

Hast Du mal versucht, statt der Option twocolumn einfach das multicol Paket zu verwenden? Damit sieht nach meinem Eindruck der untere Rand der ersten Seite besser aus.

Bild von Markus Kohm

Bei multicol wird die Fußnote ja unter den kompletten zweispaltigen Teil gesetzt, die rechte Spalte endet also vor dem Fußnotenapparat. Dadurch sieht man das Problem zunächst nicht. Wenn Du dann die Fußnote raus nimmst, sieht Du aber, dass das Problem erneut auftritt. Und auch dort funktioniert es nicht Leim zwischen Titel und zweispaltigen Text zu packen.

Hi,

auch Dir Danke für Deine Antwort!

Grüße

Comments for "Letzte Zeile bei zweispaltigem Satz auf erster Seite nicht am unteren Rand" abonnieren