Sie sind hier

\RedeclareSectionCommand: fester Leerraum auch am Seitenkopf

Hallo zusammen,

für einige (aktuelle und abgeschlossene) Projekt habe ich recht genaue Vorstellungen davon, wie die Abstände vor und nach Zwischenüberschriften beschaffen sein sollen. Es geht, das nur als Hintergrund, darum, in einem sehr einfach aufgebauten Dokument, das nur aus Text und gelegentlichen Überschriften besteht, sich einer anständigen Registerhaltigkeit zumindest anzunähern.

Sagen wir, als Abstand vor einer Überschrift sei 1.5\baselineskip¹ gewünscht, danach 0.5\baselineskip¹. Eine einzeilige Überschrift würde also den vertikalen Platz von drei Zeilen einnehmen. Da die Überschriften aus der Grundschrift gesetzt sind, würden wir auch bei mehrzeiligen Überschriften im Raster bleiben.

Ein Problem stellt sich lediglich dort, wo eine Überschrift mit einem Seitenumbruch zusammenfällt. Der Leerraum bis zum Beginn der Überschrift wird standardmäßig natürlich geschluckt. Wir sind dann um eine halbe Zeile gegenüber dem Raster versetzt. Nötig ist also, einen Raum von 0.5\baselineskip¹ für TeX ›unverdaulich‹ zu machen, sodass Überschriften, die am Kopf einer neuen Seite landen, eine halbe Zeile nach unten versetzt sind.

Ich habe das lange Zeit erfolgreich mit titlesec realisiert, nach einem genial-einfachen Vorschlag von Hendrik Vogt, jedoch immer nur zähneknirschend, da es bekanntlich zwischen diesem (titlesec) und komascript ein paar Reibereien gibt. Die haben mir zwar keine Probleme bereitet, aber ich fand und finde es immer unschön, ein Paket, das so tiefe Eingriffe vornimmt und so große Unsicherheiten birgt, nur für so eine einzige Maßnahme zu nutzen.

Sehr erfreut bin ich daher über das ›neue‹ \RedeclareSectionCommand¹, mit dem sich zunächst mal die o.g. Abstände ziemlich einfach setzen lassen, ohne dass man außerhalb von KOMA-Script² nach Mitteln suchen müsste. Nur scheitere ich bislang daran, eine serienmäßige Lösung für das eigentliche Problem der Seitenanfänge zu finden.

Meine Frage daher: wie würden wir mit KOMA-Script²-Bordmitteln, neueren oder älteren, dasselbe Ergebnis realisieren? Die Möglichkeiten, die \RedeclareSectionCommand¹ eröffnet, scheinen so etwas wie die Lösung über die \raisebox¹ (s. u.) nicht zu erlauben. Ein Weg wäre sicher, etwas low-level, über \scr@startsection¹ oder \Before@sect¹, aber die sind zumindest für mich (noch) nicht ausreichend im scrguide dokumentiert, als dass ich sie selbständig nutzen könnte.

Es freut sich daher über jeden Hinweis
Nils

LÖSUNG MIT BORDMITTELN BISHER:

\documentclass{scrartcl}
\usepackage{blindtext}
 
\setkomafont{section}{\normalfont}
 
\RedeclareSectionCommand[%
  beforeskip=-1.5\baselineskip,
  afterskip=0.5\baselineskip
]{section}
 
\begin{document}
\Blindtext
\section{Blindtext}
\blindtext
\section{Blindtext}
\blindtext
\newpage
\section{Blindtext}
\Blindtext
\end{document}

LÖSUNG ÜBER TITLESEC, 2013

\titleformat{\subsection}
            {\sffamily\bfseries}
            {\raisebox{-0.5\baselineskip}[0pt][0pt]{\thesubsection}}
            {1ex}
            {\raisebox{-0.5\baselineskip}[0pt][0pt]} % raise the title

[Admin-Edit:]

  1. <code></code> Tags eingefügt (siehe Formatierungshinweise)
  2. KOMA-Script
Bild von Markus Kohm

Ich kann Dein Anliegen verstehen, auch wenn ich diesen Ansatz für Registerhaltigkeit so einschätze, dass man versucht den Teufel mit dem Beelzebub auszutreiben. Ich muss Dich auch gleich einmal enttäuschen: Derzeit gibt es dafür keinen offiziellen Weg. Aber wie so oft gibt es Hacks. Mit der aktuellen Beta funktioniert beispielsweise:

\documentclass{scrartcl}
\usepackage{blindtext}
 
\setkomafont{section}{\normalfont}
\renewcommand*{\sectionformat}{\rule{0pt}{\dimexpr \ht\strutbox+.5\baselineskip}\thesection\autodot.\enskip}
% Oder alternativ mit xpatch:
% \usepackage{xpatch}
% \xpretocmd{\sectionformat}{\rule{0pt}{\dimexpr \ht\strutbox+.5\baselineskip}}{}{\PATchFailED}
 
\RedeclareSectionCommand[%
  beforeskip=-1\baselineskip,
  afterskip=0.5\baselineskip
]{section}
 
\begin{document}
\Blindtext
\section{Blindtext}
\blindtext
\section{Blindtext}
\blindtext
\newpage
\section{Blindtext}
\Blindtext
\end{document}

Bei der aktuellen Release muss man die unsichtbare Stütze hingegen über \othersectionlevelsformat einschleusen. Für nicht nummerierte Überschriften müsste man es wohl oder übel und entgegen der Anleitung über die Schrifteinstellung hineinmurksen – ohne Gewähr, dass das in zwanzig Jahren noch immer funktioniert.

Eine korrekte Lösung würde einen neuen Überschriftenstil definieren, bei den die Überschriften zunächst in eine Box gepackt werden, dann ausgemessen wird, wie hoch und Tief die Box ist, um dann Höhe und Tiefe gewichtet so anzupassen, dass die Überschrift wieder n-Zeilen einnimmt. Genauso müsste man übrigens für alle variabel hohen und tiefen Elemente vorgehen. Allerdings ist es noch ein gutes Stück Weg, bis man neue Überschriftenstile selbst definieren kann und titlesec ist dabei tatsächlich ein Knüppel zwischen den Beinen.

Achja: parskip=never solltest Du auch noch verwenden.

Hallo Markus,

vielen Dank, das klappt wunderbar so! Die Sache mit dem Beelzebub ist mir bewusst. Aber ich bin zuversichtlich: sobald ConTeXt die letzte Hürde* (um mich als Fan zu gewinnen) genommen hat, wird sich die Sache erledigt haben.

Danke und viele Grüße
Nils

*) die Zusammenarbeit mit biblatex.

Comments for "\RedeclareSectionCommand: fester Leerraum auch am Seitenkopf" abonnieren