Sie sind hier

Ebenenspezifisches \At@startsection?

Auch diese Frage ist im Zusammenhang mit biblatex entstanden. In https://github.com/LukasCBossert/biblatex-archaeologie/issues/139 bin ich darauf hingewiesen worden, dass eine biblatex-Option mit den KOMA-Klassen nicht so funktioniert, wie sie soll. In der Tat tut z.B. citereset=section nicht, was es soll: https://github.com/plk/biblatex/issues/713.

Der Quell des Problems scheint mir zu sein, dass biblatex (für KOMA) die Befehle \scr@sect und \@startsection zu patchen versucht, diese finden aber in den neuesten Versionen von KOMA-Script keine Anwendung mehr. Das reine biblatex-Problem wäre wohl zu lösen, wenn wir nun einfach \scr@startsection patchen würden. Allerdings scheint mir das nach einem kurzen Blick in die Dokumentation nicht gewollt: "Die beiden Anweisungen [\SecDef und \scr@startsection] sollten jedoch nicht umdefiniert werden" (scrguide v3.24, S. 510). Stattdessen wird \At@startsection angeboten. Das bietet aber keinen komfortablen Weg, den Code nur für eine bestimmte Gliederungsebene (\chapter, \section) auszuführen. Man kann da sicher mit etwas Getrickse etwas deichseln, da der Ebenenname und die Ebene ja in #1 und #2 in \scr@startsection bekannt sind. Mir fehlt da allerdings das tiefere Wissen über Category codes und TeX-Interna. Gibt es also eine Möglichkeit, \At@startsection ebenenspezifisch zu befüllen?

Ich hätte also gern, dass ich im folgenden MWE einen eigenen \typeout-Text für \section und einen für \subsection bekomme.

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
 
\makeatletter
\At@startsection{\typeout{hullo}}
\makeatother
 
\begin{document}
\section{Foo}
\subsection{Bronto}
\section{Bar}
\subsection{Stegano}
\end{document}
forum: 
Bild von Markus Kohm

Man könnte natürlich \sectionlinesformat und \subsectionlinesformat stattdessen verwenden. Aber dann funktioniert das wiederum nicht mehr, sobald ein Anwender diese Anweisungen umdefiniert. Man könnte also genauso gut \section selbst patchen (beispielsweise mit \xpretocmd aus xpatch). Das funktioniert dann auch nur so lange, solange niemand \RedeclareSectionCommand auf \section anwendet. Das ist alles nicht optimal. Einen offiziellen, idealen Weg kann ich im Augenblick leider nicht nennen. Ich kann nur einen für die Zukunft in Aussicht stellen. Für KOMA-Script 3.25 wird das aber ebenfalls höchstens inoffiziell und (von mir) ungetested möglich sein.

Dann werde ich es fürs Erste mit einer nicht ganz optimalen Lösung probieren. Wenn es dann eine offizielle Schnittstelle gibt, werde ich dazu übergehen.

Bild von Markus Kohm

Seit heute gibt es in den Quellen ein paar neue Befehle, die man nun innerhalb von \At@startsection nutzen kann, beispielsweise:

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
 
\makeatletter
\At@startsection{\typeout{This level is named ``\startsection@sectionname''}}
\makeatother
 
\begin{document}
\section{Foo}
\subsection{Bronto}
\section{Bar}
\subsection{Stegano}
\end{document}

Näheres ist scrkernel-section.dtx Revision 2982 zu entnehmen.

Herzlichen Dank! Das funktioniert soweit zumindest für meine Zwecke hervorragend.

Bild von Markus Kohm

Zukünftig stehen weitere Hooks zur Verfügung, die mit \AddtoDoHook mit Code versehen werden können. Ich gehe davon aus, dass min. einer davon passen wird.

Für den Fall, dass hier Interessierte mitlesen, die die Entwicklung bei biblatex nicht mitverfolgt haben. Der Plan ist, die neuen Hooks in der nächsten Version zu verwenden (insbesondere auch im Hinblick auf https://github.com/plk/biblatex/issues/857). Die relevanten Änderungen sind noch in https://github.com/plk/biblatex/compare/dev...moewew:68f4396 zu finden und zur Zeit noch nicht gemerged.

Die Idee ist

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
 
\makeatletter
\AddtoDoHook{heading/begingroup/section}{\typeout{foo}\@gobble}
\AddtoDoHook{heading/begingroup/subsection}{\typeout{bar}\@gobble}
\makeatother
 
\begin{document}
\section{Foo}
\subsection{Bronto}
\section{Bar}
\subsection{Stegano}
\end{document}

zu nutzen. Der Vorteil für biblatex ist dabei, dass das section in heading/begingroup/section ganz einfach auf andere Ebenen geändert werden kann. So entfällt das mühsame Patchen interner Bestandteile der einzelnen Abschnittsbefehle, die sich je nach Ebenenart, Klasse und weiteren geladenen Paketen unterscheiden können.

Die genaue Platzierung des Patches, also die Auswahl des passenden Hooks, war für die beabsichtigten Befehle nicht ganz einfach. Am Ende fiel die Wahl auf heading/begingroup (der nicht zu \At@startsection äquivalent ist, das wäre laut https://komascript.de/node/2225 heading/postinit), da mir das in meinen Experimenten am schönsten schien und weil ich für alle Anwendungsfälle denselben Hook nutzen wollte.

Vielen Dank für diese nützliche Änderung. Ich bin gespannt, wie sehr sie genutzt werden wird.

Bild von Markus Kohm

Es sei lediglich darauf hingewiesen, dass es vorkommt, dass Benutzer weitere Überschriftenarten beispielsweise auf chapter-Ebene definieren, weil sie abweichende Inhaltsverzeichniseinträge o. ä. beispielsweise im Anhang haben wollen. Daher wäre es eventuell besser, den hook heading/begingroup zu verwenden und dann zu testen, ob eine command sequence #1tocdepth definiert ist und deren numerischer Wert gleich \chaptertocdepth oder \sectiontocdepth oder was auch immer ist.

Wie gesagt: vielleicht. Wirklich beurteilen kann ich das nämlich nicht.

Vielen Dank für den Hinweis. Ich werde es im Hinterkopf behalten, falls sich jemand beschwert. Fürs Erste werde ich aber wohl bei der expliziten Angabe des Überschriftnamens bleiben. Ich bin der Meinung, dass biblatex zumindest in dieser Hinsicht nicht für jeden spezialgelagerten Sonderfall eine automatische Lösung bereitstellen muss (oder kann). Zumal mir nicht klar ist, ob es überhaupt immer gewünscht wäre, alle chapter-ähnliche Ebenen so zu behandeln wie chapter.

Comments for "Ebenenspezifisches  \At@startsection?" abonnieren