\thispagestyle
auf der richtigen Seite ausgeführt wirdDie LaTeX-Anweisung \thispagestyle
weißt das Problem auf, dass sie den Seitenstil der Seite ändert, auf der die Anweisung ausgeführt wird statt auf der Seite, die zum Zeitpunkt der Ausgabe der entsprechenden Stelle aktiv ist.
Das führt dazu, dass im folgenden Beispiel:
\documentclass{scrreprt}
\RedeclareSectionCommand[%
pagestyle=headings
]{chapter}
\pagestyle{headings}
\usepackage{blindtext}
\begin{document}
\chapter{Test Chapter}
\Blindtext[5]\thispagestyle{plain}
\vspace*{5\baselineskip}
\Blindtext[3]
\section{Test Section}\thispagestyle{empty}
\Blindtext
\blinddocument
\end{document}
die zweite Seite nicht den Seitenstil plain
der ersten \thispagestyle
-Anweisung erhält, sondern den Seitenstil empty
der zweiten \thispagestyle
-Anweisung, obwohl der Abschnitt „Test Section” erst auf der dritten Seite ausgegeben wird. Die Grundursache liegt darin, dass \thispagestyle
auf einem globalen Schalter und einem globalen Makro basiert, dass in der Ausgabe-Routine ausgewertet wird. Das \thispagestyle{empty}
definiert beides, bevor bekannt ist, dass die \section
-Überschrift einen Seitenumbruch verursacht. Daher wirkt es sich auf die Seite vor der Überschrift aus, obwohl die Intention klar die Änderung auf der Seite mit der Überschrift wäre.
Der Trick besteht nun darin, \thispagestyle
bis zur Ausgabe der Seite zu verzögern. Dazu wird eine Marke gesetzt:
\NewMarkClass{specialpage}
\newcommand*{\savethispagestyle}[1]{%
\InsertMark{specialpage}{#1}%
}
und unmittelbar vor der Ausgabe einer Seite per Hook build/page/reset
im Falle, dass diese Marke nicht leer ist, die letzte dieser Marken der aktuellen Seite für \thispagestyle
verwendet:
\AddToHook{build/page/reset}{%
\Ifstr{\LastMark{specialpage}}{}{}{% letzte specialpage Marke ist nicht leer
\thispagestyle{\LastMark{specialpage}}%
\InsertMark{specialpage}{}%
}%
}
Ersetzt man nun in obigem Beispiel min. die \thispagestyle{empty}
-Anweisung nach \section{Test Section}
durch \savethispagestyle{empty}
:
\documentclass{scrreprt}
\NewMarkClass{specialpage}
\newcommand*{\savethispagestyle}[1]{%
\InsertMark{specialpage}{#1}%
}
\AddToHook{build/page/reset}{%
\Ifstr{\LastMark{specialpage}}{}{}{%
\thispagestyle{\LastMark{specialpage}}%
\InsertMark{specialpage}{}%
}%
}
\RedeclareSectionCommand[%
pagestyle=headings
]{chapter}
\pagestyle{headings}
\usepackage{blindtext}
\begin{document}
\chapter{Test Chapter}
\Blindtext[5]\savethispagestyle{plain}
\vspace*{5\baselineskip}
\Blindtext[3]
\section{Test Section}\savethispagestyle{empty}
\Blindtext
\blinddocument
\end{document}
So erhält Seite 2 wie erwartet den Seitenstil plain
und Seite 3 mit \section
-Überschrift den Seitenstil empty
.
Wer diese Lösung mit den Standardklassen nutzen will, benötigt übrigens das Paket scrbase
für die Definition von \Ifstr
. Es sei auch darauf hingewiesen, dass \IfArgIsEmpty
an der Stelle nicht funktioniert, da das Argument erst vollständig expandiert werden muss, bevor es darauf getestet wird, ob es leer ist.
Nebenbei beantwortet die Frage übrigens auch, wie man \thispagestyle{…}
and \section
knüpfen kann:
\documentclass{scrreprt}
\NewMarkClass{specialpage}
\newcommand*{\savethispagestyle}[1]{%
\InsertMark{specialpage}{#1}%
}
\AddToHook{build/page/reset}{%
\Ifstr{\LastMark{specialpage}}{}{}{%
\thispagestyle{\LastMark{specialpage}}%
\InsertMark{specialpage}{}%
}%
}
% Seiten mit Kapitelüberschriften im Stil empty:
\RedeclareSectionCommand[pagestyle=empty]{chapter}
% Seiten mit Abschnittsüberschriften im Stil empty:
\AddtoDoHook{heading/endgroup/section}{\savethispagestyle{empty}\csname @gobble\endcsname}
\pagestyle{headings}
\usepackage{blindtext}
\begin{document}
\chapter{Test Chapter}
\Blindtext[5]
\vspace*{5\baselineskip}
\Blindtext[3]
\section{Test Section}
\Blindtext
\blinddocument
\end{document}
Über den Do-Hook heading/endgroup/section
wird \savethispagestyle{empty}
unmittelbar nach der Ausführung der \section
-Überschrift automatisch ausgeführt. Das \csname @gobble\endcsname
am Ende der Do-Hook-Definition sorgt dafür, dass das Argument, das an den Do-Hook übergeben wird, aufgebraucht wird. Diese Lösung funktioniert nur mit einer KOMA-Script-Klasse, da nur diese über Do-Hooks verfügen. Bei den Standardklassen müsste man stattdessen eine andere Möglichkeit finden, \savethispagestyle{empty}
am Ende von \section{…}
auszuführen.