Sie sind hier

Captions in der Randspalte

Ich würde in einem Dokument die Beschriftungen für Abbildungen, Tabellen und Listings gern in der Randspalte setzen, und zwar auf linken Seiten in rechtsbündingem Falttersatz, auf rechten Seiten in linksbündigem. Dies würde ich gern durch Umdefinieren der Standard-Gleitumgebungen erreichen, da die einzelnen "Code-Schnipsel" auf viele Dateien verteilt in einer wohl geordneten Struktur bereits vorliegen und per \input{} eingebunden werden sollen. Am liebsten wäre mir dies mit KOMA-Script-Bordmitteln, ohne auf Pakete wie sidecap zurückzugreifen.

Mein erster "brachialer" Ansatz funktioniert überhaupt nicht.

\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrbook}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
 
\usepackage{lmodern}
\usepackage{microtype}
\usepackage[ngerman]{babel}
 
\KOMAoption{headinclude}{false}
\KOMAoption{footinclude}{false}
\KOMAoption{mpinclude}{true}
\recalctypearea
 
\setlength{\marginparsep}{2em}
\setlength{\marginparwidth}{11em}
 
\usepackage{marginnote}
\usepackage{ragged2e}
\usepackage{blindtext}
 
\addtokomafont{caption}{\small}
\setkomafont{captionlabel}{\sffamily\bfseries}
\setcapindent*{0pt}
 
\DeclareNewTOC[type=Listing, types=Listings, float, floattype=4, counterwithin=chapter,%
  name=Quelltext, listname={Verzeichnis der Quelltexte}]{ListOfListings}
\setuptoc{ListOfListings}{chapteratlist}
 
\renewenvironment{Listing}[1][]{\renewcommand\caption[1]{\marginnote%
  [\RaggedLeft\captionof{Listing}{##1}]{\RaggedRight\captionof{Listing}{##1}}}}{}
 
\renewenvironment{figure}[1][]{\renewcommand\caption[1]{\marginnote%
  [\RaggedLeft\captionof{figure}{##1}]{\RaggedRight\captionof{figure}{##1}}}}{}
 
\renewenvironment{table}[1][]{\renewcommand\caption[1]{\marginnote%
  [\RaggedLeft\captionof{table}{##1}]{\RaggedRight\captionof{table}{##1}}}}{}	
 
\begin{document}
 
\chapter{Captions in der Randspalte}
 
\blindtext
 
\begin{Listing}
\caption{Bedingte Wiederholung mit Prüfung der Bedingung am Anfang}
\makebox(170, 180)[c]{Listing}
\end{Listing}
 
\blindtext
 
\begin{figure}
\caption{Programmablaufplan für die bedingte Wiederholung mit Prüfung am Anfang}
\makebox(170, 170)[c]{Programmablaufplan}
\end{figure}
 
\blindtext
 
\begin{table}
\caption{Überblick über die Kontrollstrukturen}
\centering\small
\begin{tabular}{lll}
Test & Test & Test \\
Test & Test & Test
\end{tabular}
\end{table}
 
\blindtext
 
\end{document}

Bei dieser Version wird \RaggedLeft einfach ignoriert. Zudem werden Abbildungsbeschriftung und Abbildung durch einen Seitenumbruch getrennt, und die Beschriftung hängt viel zu weit unten auf der Seite.

Wahrscheinlich bin ich völlig auf dem Holzweg. In der KOMA-Script-Dokumentation habe ich aber auch noch keinen Ansatz dafür gefunden, was ich erreichen möchte. Die captionbeside-Umgebung ist ja nicht dafür gedacht, nur die Beschriftung in die Randspalte zu verbannen.

Eine weitere Frage: Welches Vorgehen ist angemessen, um den Satzspiegel zu optimieren? Ist die nachträgliche Änderung von \marginparsep und \marginparwidth in diesem Fall der richtige Weg?

Bild von Markus Kohm

Bei Deiner Umdefinierung sind die Umgebungen ja keine Gleitumgebungen mehr. Soll das so sein oder sollen sie wieder gleiten dürfen?

Dass \RaggedLeft an der Stelle ignoriert wird, ist eigentlich klar. Das sollte es jedenfalls spätestens dann werden, wenn Du einmal ein \captionof im normalen Text ausprobierst. Das \RaggedLeft müsste schon in das Argument von \captionof. Allerdings bleibt dann das Problem, dass das Label natürlich weiterhin links bleibt. Das entspricht ja auch der Vorgabe \setcapindent*{0pt}. Das nach rechts zu bekommen wäre dann auch gar nicht so einfach.

Wie sollen die Beschriftungen denn vertikal ausgerichtet sein? Sollen die oben mit dem Inhalt ausgerichtet werden, zentriert (was als einziges der Angabe [c] bei der picture-Anweisung \makebox entsprechen würde, mir aber ziemlich ungewöhnlich erscheint), oder unten ausgerichtet?

Prinzipiell wäre captionbeside übrigens durchaus ein korrekter Ansatz. Man müsste natürlich eine minipage mit hinein packen, damit der Inhalt der Umgebung Textbreite bekommt. Problematisch wäre aber auch hier ggf. die Linksbündigkeit des Labels.

Was das ganze mit \input zu tun haben soll, ist mir nicht klar. Falls das ein Hinweis der Art: »Ich will aber an meinem existierenden Code nichts ändern müssen.« sein soll, sag es gleich, dann bemühe ich mich gar nicht erst weiter, weil ich das vorab schlicht nicht versprechen kann.

Dass bei der Neudefinition die Umgebungen ihre "Gleiteigenschaft" verloren haben, war mir zwar bewusst, aber eigentlich nicht gewünscht. Es war halt ein erster, völlig rudimentärer Versuch, bei dem ich bemerkt habe, dass alles gar nicht so einfach ist ...

Eigentlich sollen die Beschriftungen vertikal immer oben ausgerichtet sein, bei Abbildungen ganz oben, bei Tabellen in Bezug auf die Kopfzeile (ich arbeite normalerweise mit \toprule, \midrule und \bottomrule aus booktabs, und bei Listings mit Hilfe von listings (ggf. mit einem grauen Kasten hinterlegt) in Bezug auf die erste Zeile des Quelltextes. Bezeichnung und Nummer (z.B. "Abbildung 1.1.") sollen immer eine eigene Zeile bekommen, darunter dann der eigentliche Beschriftungstext im Flattersatz folgen, auf ungeraden Seiten eben linksbündig, auf geraden hingegen rechtsbündig. Scheint ganz schön schwierig zu sein ...

Ich scheue mich nicht davor, alle Code-Teile anzupassen, wenn das nötig ist, würde aber gern erreichen, dass alle Umgebungen in der Präambel einfach "umgeschaltet" werden können, idealerweise zwischen (1) "konventioneller" Beschriftung unterhalb des Gleitobjektes, (2) Beschriftung in der Randspalte und (3) komplettem Unterdrücken der Beschriftung. Ich verwende nämlich die gleichen Tabellen, Abbildungen und Listings in vielen verschiedenen Dokumenten.

Das Ziel hinter dem Ziel: Ich würde gern nach und nach ein Informatik-Skript für die Oberstufe schreiben, das, sollte es jemals fertig werden, sicher einige hundert Seiten umfassen wird. Dabei soll sich der Text lesen wie ein Roman. Aus diesem Grund würde ich bei "kleinen" Abbildungen sehr oft [h] verwenden, bei größeren Abbildungen und Tabellen natürlich nicht. Ebenso würde ich Definitionen und Sätze "elegant" in den Text einbauen, am Rand aber entsprechend kennzeichnen. Das wäre dann m.E. ein guter Kompromiss zwischen "Schulbuch" und "Fachbuch". Ich könnte gern mal ein sechsseitiges Beispiel als PDF zur Verfügung stellen, aber das Hochladen von Dateien scheint hier nicht vorgesehen zu sein.

Ich habe noch ein wenig mit mcaption herumexperimentiert, in der Hoffnung, vielleicht etwas besser zu verstehen, was hinter den Kulissen passiert.

\documentclass[fontsize=11pt, paper=a4, DIV=classic]{scrbook}
 
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
 
\usepackage{lmodern}
\usepackage{microtype}
\usepackage[ngerman]{babel}
 
\KOMAoption{headinclude}{false}
\KOMAoption{footinclude}{false}
\KOMAoption{mpinclude}{true}
\recalctypearea
 
\setlength{\marginparsep}{2em}
\setlength{\marginparwidth}{10em}
 
\usepackage{scrhack}
\usepackage[draft]{graphicx}
\usepackage{booktabs}
\usepackage{listings}
\usepackage{ragged2e}
\usepackage{xcolor}
\usepackage[top]{mcaption}
\usepackage{blindtext}
 
\DeclareNewTOC[%
  type=listing, types=listings, float, floatpos=htbp,%
  name=Quelltext, listname={Verzeichnis der Quelltexte},%
  counterwithin=chapter]{lst}
\setuptoc{lst}{chapteratlist}
 
\newcommand{\RaggedOuter}{\RaggedRight}
 
\newcommand{\checkOddPage}{\ifthispageodd%
  {\renewcommand\RaggedOuter{\RaggedRight}\lstset{numbers=left}}%
  {\renewcommand\RaggedOuter{\RaggedLeft}\lstset{numbers=right}}}
 
\makeatletter
 
% Figures with margin caption
\let\orig@figure\figure
\let\orig@endfigure\endfigure
\renewenvironment{figure}[1][htbp]%
  {\orig@figure[#1]\checkOddPage\margincap\centering\small}%
  {\endmargincap\orig@endfigure}
 
% Tables with margin caption
\let\orig@table\table
\let\orig@endtable\endtable
\renewenvironment{table}[1][htbp]%
  {\orig@table[#1]\checkOddPage\margincap\centering\small}%
  {\endmargincap\orig@endtable}
 
% Listings with margin caption
\let\orig@listing\listing
\let\orig@endlisting\endlisting
\renewenvironment{listing}[1][htbp]%
  {\orig@listing[#1]\checkOddPage\margincap}%
  {\endmargincap\orig@endlisting}
 
\makeatother
 
% Caption format
\addtokomafont{caption}{\RaggedOuter\small}
\setkomafont{captionlabel}{\sffamily\bfseries}
\setcapindent*{0pt}
\renewcommand{\captionformat}{}
 
% Listings
\lstset{language=Java}
\lstset{tabsize=2}
\lstset{basicstyle={\ttfamily\small}}
\lstset{keywordstyle={\bfseries}}
\lstset{commentstyle={\itshape\color{darkgray}}}
\lstset{columns=fullflexible, basewidth={0.55em, 0.55em}}
\lstset{frame=single, framerule=0pt, backgroundcolor={\color{black!5}}}
\lstset{numberstyle=\sffamily\tiny}
\lstset{literate={Ö}{{\"O}}1{Ä}{{\"A}}1{Ü}{{\"U}}1{ß}{{\ss}}2{ü}{{\"u}}1{ä}{{\"a}}1{ö}{{\"o}}1}
 
 
\begin{document}
 
\chapter{Captions in der Randspalte}
 
\blindtext
 
\begin{listing}[h]
\caption{Bedingte Wiederholung mit Prüfung der Bedingung am Anfang}
\begin{lstlisting}
int a = 1;
int b = 1;
 
while (a < 1000)
{
  System.out.print(a + "; ");
 
  b = a + b;
  a = b - a;
}
 
System.out.println("...");
\end{lstlisting}
\end{listing}
 
\blindtext
 
\begin{figure}
\caption{Programmablaufplan für die bedingte Wiederholung mit Prüfung am Anfang}
\includegraphics[width=\linewidth]{FuBK-Testbild}
\end{figure}
 
\blindtext
 
\begin{table}
\caption{Überblick über die Kontrollstrukturen}
\begin{tabular}{lll}
\toprule
Test & Test & Test \\
\midrule
Wer & das & liest \\
ist & selbst & schuld \\
\bottomrule
\end{tabular}
\end{table}
 
\blindtext
 
\end{document}

Das Ergebnis geht durchaus in die Richtung, die ich mir vorstelle. Offen bleibt die exakte vertikale Ausrichtung der Beschriftung bezüglich der Kopfzeile der Tabelle und die Beseitigung der durch \checkOddPage hervorgerufenen Underfull-HBox-Warnung.

Ich scheue mich immer ein wenig, KOMA-Script mit Paketen wie mcaption zu mischen, die doch recht tief ins Geschehen eingreifen. Was scheint vielversprechender? Die Optimierung der mcaption-Lösung oder die Suche nach einer nativen?

Bild von Markus Kohm

Vom Paket mcaption habe ich in der Tat keine Ahnung. Da müsste ich mich erst einmal reinknien. Um eine listings-Umgebung mit automatisch \begin{margincap}…\end{magrincap} zu definieren würde ich aber bei \DeclareNewTOC schlicht:

atbegin=\begin{margincap},
atend=\end{margincap}

als Optionen ausprobieren.

Bezüglich der vertikalen Ausrichtung von Abbildungen sei darauf hingewiesen, dass man ggf. die Abbildung entweder mit Hilfe des Pakets alignbox oder mit einem schlichten \raisebox in seiner vertikalen Ausrichtung ändern kann. Bei tabular gibt es außerdem die Möglichkeit mit dem optionalen Argument, beispielsweise \begin{tabular}[t]{…} die vertikale Ausrichtung zu ändern. Ob das im konkreten Fall hilfreich ist, habe ich nicht geprüft.

Vielen Dank für den Tipp, den ich auf jeden Fall ausprobieren werde! Mittlerweile klappt auch bei Listings die Neudefinition analog zu Abbildungen und Tabellen. Grund für den Fehler war, wie so oft, ein blödes Copy-Paste-Missgeschick, das ich trotz intensiver Überprüfung einfach nicht entdeckt hatte.

Die o.g. Haken funktionieren genauso wie die Neudefinition der Umgebung.

Durch eine hervorragende Antwort auf meine Frage bei StackExchange durfte ich lernen, dass die Underfull-\hbox-Warnung ein inhärentes Problem von \RaggedLeft innerhalb von \caption{} ist und dass man diese am besten temporär unterdrückt, um nicht in weitere Schwierigkeiten zu geraten ...

Bei Verwendung von mcaption bleibt also nur noch die Frage der exakten vertikalen Ausrichtung, möglichst ohne Herumprobieren, offen.

Ich gehe mal davon aus, dass ich für den hier beschriebenen Anwendungsfall auf das Paket mcaption setzen werde, da das gleiche Ergebnis mit KOMA-Script-Bordmitteln wohl schwer zu erreichen sein dürfte.

Bild von Markus Kohm

Das Paket mcaption setzt \abovecaptionskip auf 0pt. Um caption und Tabellenkopf auf einer Linie auszurichten, müsste man hier stattdessen einen anderen Wert hinein patchen:

% Tables with margin caption
\usepackage{xpatch}
\xpatchcmd{\mcaption@align@boxes}{%
  \setlength{\abovecaptionskip}{0pt}%
}{%
  \setlength{\abovecaptionskip}{\abovemcaptionskip}%
}{}{}
\newlength{\abovemcaptionskip}
\let\orig@table\table
\let\orig@endtable\endtable
\renewenvironment{table}[1][htbp]%
  {\setlength{\abovemcaptionskip}{\dimexpr\heavyrulewidth+\abovetopsep+\belowrulesep}\orig@table[#1]\checkOddPage\margincap\centering\small}%
  {\endmargincap\orig@endtable}

Ich patche in diesem Beispiel zunächst statt der 0pt einfach die Verwendung einer neuen Länge \abovemcaptionskip hinein. Diese wird dann innerhalb von table (lokal) so gesetzt, dass es für Tabellen mit \toprule aus booktabs passen dürfte. Ggf. kann man den Wert auch noch anpassen. Das Schöne daran ist, dass man ggf. auch noch per \setlength{\abovemcaptionskip}{…} nach \begin{table} eingreifen kann, falls der Wert einmal nicht passt.

Für figure, listing u. a. Gleitumgebungen würde hier die Voreinstellung von \abovemcaptionskip, also 0pt, verwendet. Damit ergibt sich für diese Umgebungen keine Änderung bezüglich des ungepatchten mcaption. Bei Bedarf kann man aber natürlich für diese Umgebungen ebenfalls einen neuen Defaultwert setzen.

Das ist eine ganz hevorragende und vor allem sehr flexible Lösung, auf die ich so nie gekommen wäre. Vielen Dank, Markus.

Mühsam nährt sich das Eichhörnchen. Dank kompetenter Hilfe habe ich nun aber auch eine Lösung für Theoreme, so dass ich Name, Nummer und Zusatzbeschreibung in die Randspalte "verbannen" kann.

Eine wesentliche Frage ist nicht technischer Natur, nämlich die nach der Gestaltung des Satzspiegels. Der Füllungsgrad der Randspalte dürfte auf den einzelnen Seiten sehr unterschiedlich ausfallen. Insofern ist es wirklich schwer zu entscheiden, ob die Beschriftungen in der Randspalte zum Satzspiegel gehören oder nicht. Darüber werde ich in den nächsten Tagen mal ein wenig sinnieren ...

Bild von Markus Kohm

Optisch, also bezüglich der Aufteilung der Ränder, gehört sie schon eher zum Satzspiegel. Bezüglich der Zeilenlänge ist sie dagegen eher nicht zu berücksichtigen, da ja nur Konsultationstexte in den Rand geschoben werden.

Das ist so ein typischer Fall, bei dem klassische Satzspiegelkonstruktionen erst einmal versagen. Ein Konstruktionsraster ist jedoch durchaus sinnvoll. Man muss nur mit etwas Fingerspitzengefühl entscheiden, welche Streifen des Rasters reiner Rand, genutzte Marginalienspalte oder Textspalte sind.

Immer dann, wenn man von klassischen Formen abweicht, braucht man eben auch ein gutes Auge und etwas Mut. ;-)

Ich habe mal versucht, eine typische Doppelseite zu gestalten. Dabei habe ich mit einer Bindekorrektur von 10 mm gerechnet. Und genau da liegt schon ein großes Problem. Ich kann noch nicht einmal ansatzweise abschätzen, wie viele Seiten das Gesamtwerk umfassen wird. Andererseits komme ich v.a. in der Randspalte nicht umhin, sehr viel manuell einzugreifen, um ein halbwegs passables Ergebnis zu erhalten. Jede nachträgliche Änderung irgendwelcher Maße wäre katastrophal. Mir bliebe also nur noch die von Markus an anderer Stelle schon mal beschriebene Verkleinerung um ein paar Prozent, falls die Bindekorrektur nicht ausreicht. Ein vom Standard abweichendes Format birgt also ganz schön viele Herausforderungen ...

(Diese Ergänzung wäre ggf. im Typografie-Forum besser aufgehoben.)

Bild von Markus Kohm

Wenn bei der Bindung ordentlich mit Signaturen gearbeitet wird, wird die benötigte Bindekorrektur mit der Seitenzahl nur sehr wenig größer. Bei dünnen Büchlein (> 400 Seiten) sollten 10–12mm genügen. Außerdem wird außen auch noch etwas abgeschnitten, um gerade Kanten zu bekommen. Das liegt meist so bei 3mm.

Und ja: Anspruchsvolle Typografie geht nicht ohne Handarbeit und Aufwand. Beim KOMA-Script-Buch sitze ich für jede neue Auflage mehrere Tage am Satz. Alles automatisch geht nur mit 0815-Layout und Augen zu.

Wenn ich das soweit richtig verfolgt habe, sollen Abbildungen in Gleitumgebungen sitzen. Bei dieser Beispieldoppelseite sieht es aber nicht danach aus, als wäre das überhaupt gewünscht. Die Abbildungen sehen für mich ehrlich gesagt noch nicht mal wie Abbildungen aus sondern wie abgesetzte Formeln. Oder ist das ein unerwünschter und vielleicht nur vorläufiger Nebeneffekt des Experiments?

Auf dieser Doppelseite sollen die Abbildungen tatsächlich eher wie abgesetzte Formeln erscheinen, da sie nahtlos in den Text integriert wurden. Bei anderen Abbildungen ist dies anders, diese würde ich, so wie es meist üblich ist, eher oben oder unten auf einer Seite anordnen und bei Bedarf über die Nummer darauf verweisen. Grundsätzlich soll man den Text "wie einen Roman" lesen können, während die Randspalte v.a. dazu dienen soll, bestimmte Teile, z.B. aus dem Index kommend, schnell aufzufinden. Hin und wieder werde ich in der Randspalte auch weniger wichtige, kurze Zusatzinformationen unterbringen, wie es die Doppelseite auch zeigt.

Rein aus Neugier: Wie hast Du bei dieser Doppelseite die Fußnote so formatiert?

Für die Fußnoten verwende ich folgende Einstellungen:

\deffootnote[1.1em]{0pt}{1em}{\makebox[1.1em][l]{\thefootnotemark}}
\addtokomafont{footnotelabel}{\sffamily\bfseries\color{darkgray}}
\renewcommand{\footnoterule}{}
\setlength{\skip\footins}{\baselineskip}

Die Idee dafür stammt aus Lesetypograhie von Willberg und Forssmann. Im Text sollen die hochgestellten Ziffern in der Grundschriftart nicht weiter stören. Unten sollen sie durch die fette und serifenlose Schrift, die auch für Überschriften und Beschriftungen verwendet wird, aber sofort ins Auge fallen.

Bild von Markus Kohm

Vorsicht mit dem Umdefinieren von \footnoterule. Ich empfehle, die Verwendung von \setfootnoterule{0pt}.

Vielen Dank für den Hinweis, Markus.

Ich hoffe mal, meine verbesserte Version, die auch die von dila zitierte und von Dir vorgeschlagene Umsetzung aufgreift, ist so in Ordnung.

\setfootnoterule{0pt}
 
\addtokomafont{footnotelabel}{\sffamily\bfseries}
\addtokomafont{footnotereference}{\libertineOsF}
 
\makeatletter
\newlength{\@fnumwidth}
\pretocmd{\@footnotetext}{%
  \settowidth{\@fnumwidth}{\usekomafont{footnotelabel}\footnotesize\thefootnotemark\enskip}
  \deffootnote[\@fnumwidth]{0em}{1em}{\thefootnotemark\enskip}}{}{}
\makeatother

Für den Befehl \libertineOsF setze ich natürlich voraus, dass zuvor das Paket libertine geladen wurde.

… Willberg und Forssmann: https://komascript.de/node/2064 ;-)

Deine Variante ist aber noch mal ein wenig anders, glaube ich.

Comments for "Captions in der Randspalte" abonnieren