Menu

HowTo_ToC_pagefirst

Wie die Inhaltsverzeichniseinträge zuerst die Seitenzahl gefolgt von der Überschrift anzeigen

In einigen Zeitschriften findet man, dass die Inhaltsverzeichniseinträge zuerst die Seitenzahl gefolgt von der Artikelüberschrift zeigen, also beispielsweise:

 90 OLED-TV als Gaming-Display
 94 Outdoor-Handy mit Satellitenfunktion
 98 Smartphones unter 500 Euro
102 Mittelklasse-GPUs von AMD und Nvidia

Die in KOMA-Script vorhandenen Stile für Verzeichniseinträge geben eine solche Formatierung nicht her und können auch nicht entsprechend umkonfiguriert werden. Mit Hilfe der Anweisung \DeclareTOCEntryStyle aus dem Paket tocbasic kann man bei KOMA-Script jedoch neue Stile definieren. Näheres zu der Anweisung und den darin verwendbaren Argumenten ist der Anleitung zu entnehmen. Hier ein Beispiel:

\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{mwe}
\makeatletter
% Diese Anweisung dient nur der Demonstration und erzeugt Blindtext
% bis zur angegebenen Seitenzahl.
\newcommand*{\gotopage}[1]{%
  \@whilenum\c@page<#1 \do{\blindtext\par}%
}
\makeatother

\makeatletter
% Hinweis: Es funktionieren die bekannten Optionen toclevel, beforeskip,
% entryformat, pagenumberwidth. Bei pagenumberwidth gibt es aber die Änderung,
% dass die Seitenzahl vorn steht. Der Abstand 1em nach der Seitenzahl ist
% bisher fest durch ein \quad im Code für die Ausgabe vorgegeben.
\DeclareTOCEntryStyle{ct}[{% Zuerst Definition und Initialisierung von Optionen:
  \DefineTOCEntryCommandOption{entryformat}%
    {scr@tso@}{@entryformat}[1]{entry format}%
  \DefineTOCEntryLengthOption{beforeskip}%
    {scr@tso@}{@beforeskip}{vertical skip before the entry}%
  \DefineTOCEntryLengthOption{pagenumberwidth}%
    {scr@tso@}{@pagenumberwidth}{width of page number box}%
  \expandafter\providecommand%
  \csname scr@tso@#1@entryformat\endcsname[1]{\normalfont ##1}%
  % oder:
  % \csname scr@tso@#1@entryformat\endcsname[1]{\normalfont\sffamily\bfseries ##1}%
  \expandafter\providecommand\expandafter*%
  \csname scr@tso@#1@beforeskip\endcsname{\glueexpr \z@ plus .2\p@\relax}%
  % Automatische Bestimmung der nummerischen Ebene aus dem Namen der Ebene
  \@ifundefined{#1tocdepth}{%
    \Ifstr{#1}{part}{\@namedef{#1tocdepth}{-1}}{%
      \Ifstr{#1}{chapter}{\@namedef{#1tocdepth}{0}}{%
        \Ifstr{#1}{section}{\@namedef{#1tocdepth}{1}}{%
          \Ifstr{#1}{subsection}{\@namedef{#1tocdepth}{2}}{%
            \Ifstr{#1}{subsubsection}{\@namedef{#1tocdepth}{3}}{%
              \Ifstr{#1}{paragraph}{\@namedef{#1tocdepth}{4}}{%
                \Ifstr{#1}{subparagraph}{\@namedef{#1tocdepth}{5}}{%
                  \Ifstr{#1}{figure}{\@namedef{#1tocdepth}{1}}{%
                    \Ifstr{#1}{table}{\@namedef{#1tocdepth}{1}}{%
                      \Ifstr{#1}{lstlisting}{\@namedef{#1tocdepth}{1}}{%
                        \expandafter\let\csname #1tocdepth\expandafter\endcsname
                        \csname #1numdepth\endcsname
                      }%
                    }%
                  }%
                }%
              }%
            }%
          }%
        }%
      }%
    }%
  }{}%
  \@ifundefined{#1tocdepth}{%
    \expandafter\let\csname #1tocdepth\expandafter\endcsname
    \csname toclevel@#1\endcsname
  }{}%
  % Automatische Bestimmung der Seitenzahlbreite anhand der Elternebene
  \scr@ifundefinedorrelax{scr@tso@#1@pagenumberwidth}{%
    \Ifstrstart{#1}{sub}{%
      \scr@ifundefinedorrelax{scr@tso@\scr@dte@nosub{#1}@pagenumberwidth}{%
        \@namedef{scr@tso@#1@pagenumberwidth}{\@pnumwidth}%
      }{%
        \expandafter\let
        \csname scr@tso@#1@pagenumberwidth\expandafter\endcsname
        \csname scr@tso@\scr@dte@nosub{#1}@pagenumberwidth\endcsname
      }%
    }{%
      \@namedef{scr@tso@#1@pagenumberwidth}{\@pnumwidth}%
    }%
  }{}%
}]{% Es folgt die eigentliche Ausgabe:
  \renewcommand*{\numberline}[1]{}% Alle Einträge ohne Gliederungsnummer!
  \ifnum \c@tocdepth >\numexpr \@nameuse{#1tocdepth}-\@ne\relax
    \addpenalty\@secpenalty
    \addvspace{\@nameuse{scr@tso@#1@beforeskip}}%
    \begingroup
      \parindent \z@ \rightskip \z@
      \parfillskip \z@ \@plus 1fil
      \@nameuse{scr@tso@#1@entryformat}{%
        \@hangfrom{%
          \makebox[\@nameuse{scr@tso@#1@pagenumberwidth}][r]{##2}\quad
        }%
        ##1\par
      }%
    \endgroup
    \penalty\@highpenalty
  \fi
}
\makeatother

\DeclareTOCStyleEntry[beforeskip=.5\baselineskip plus 2pt]{ct}{section}

\begin{document}
\tableofcontents
\newpage
\setcounter{page}{90}
\section{OLED-TV als Gaming-Display}
\gotopage{94}
\section{Outdoor-Handy mit Satellitenfunktion}
\gotopage{98}
\section{Smartphones unter 500 Euro}
\gotopage{102}
\section{Mittelklasse-GPUs von AMD und Nvidia}
\gotopage{103}

\end{document}

Das erste, verpflichtende Argument von \DeclareTOCEntryStyle ist der Name des neuen Eintragsstils. Im Beispiel wurde in Anlehnung an die Computerzeitschrift c't der Name ct gewählt.

Das zweite Argument ist optional und gibt den Initialisierungscode an. Dieser wird bei Verwendung der Anweisung \DeclareTOCStyleEntry bzw. \DeclareTOCStyleEntries ausgeführt. Das Argument #1 ist dann der Name der jeweiligen Verzeichnisebene, beispielsweise section. Die hier gezeigte Initialisierung definiert die Optionen entryformat, beforeskip, pagenumberwidth und entryformat. Die Option level wird für alle Stile automatisch definiert. Außerdem initialisiert sie Werte für die Optionen bzw. die dahinter stehenden Makros und Längen. Der Code dafür ist in großen Teilen den in tocbasic vordefinierten Stilen entnommen und in der KOMA-Script-Quelldatei scrkernel-tocstyle.dtx (sourceforge.net) dokumentiert.

Das dritte, erneut verpflichtende Argument enthält den Code für die eigentliche Formatierung des Verzeichniseintrags. Dieser sei hier etwas näher erläutert:

\renewcommand*{\numberline}[1]{}% Alle Einträge ohne Gliederungsnummer!

Als erstes wird die Anweisung \numberline so umdefiniert, dass sie ihr Argument verwirft. Dieses Argument ist normalerweise die Gliederungsnummer des Verzeichniseintrags. Da der Eintragsstil bereits die Seitenzahl als erstes zeigt, wäre nach meiner Meinung die
zusätzliche Anzeige der Gliederungsnummer eher verwirrend. Daher wird sie verworfen.

\ifnum \c@tocdepth >\numexpr \@nameuse{#1tocdepth}-\@ne\relax\fi

\c@tocdepth ist die LaTeX-interne Definition des Zählers tocdepth. Hier wird also getestet, ob tocdepth größer oder gleich der die in #1tocdepth – das ist beispielsweise \sectiontocdepth – Zahl ist. Nur, wenn das der Fall ist, findet überhaupt eine Ausgabe statt. Das ist letztlich das Geheimnis hinter dem Zähler tocdepth.

 \addpenalty\@secpenalty

Diese Anweisung nimmt Einfluss auf die Erlaubnis für einen Seitenumbruch vor dem Eintrag. Der Standardwert für \@secpenalty in LaTeX is -300, was bedeutet, dass ein Umbruch hier bevorzugt wird. Eine Alternative wäre hier die Verwendung einer Einstellung, die von der Ebene oder auch der vorherigen Ebene abhängt.

\addvspace{\@nameuse{scr@tso@#1@beforeskip}}%

Es wird ein vertikaler Abstand entsprechend Option beforeskip eingefügt, wobei \addvspace nicht kumulativ arbeitet, so dass sich aufeinanderfolgende \addvspace nicht summieren, sondern lediglich der Maximalwert erhalten bleibt.

\begingroup
      \parindent \z@ \rightskip \z@
      \parfillskip \z@ \@plus 1fil
\endgroup

Die eigentliche Ausgabe, aber vor allem die Änderung des Absatzeinzugs und der Füllweite der letzten Zeile des Absatzes erfolgt in einer Gruppe. Alle Änderungen bleiben daher lokal zu dieser Gruppe. Der Absatzeinzug wird auf 0 gesetzt, die letzte Zeile des Absatzes darf beliebig lang sein.

  \@nameuse{scr@tso@#1@entryformat}{%}

Der Eintrag wird entsprechend Option entryformat formatiert. In der Voreinstellung für section der Klasse scrartcl ist das \normalfont\sffamily\bfseries, also serifenlos und fett.

      \@hangfrom{%
        \makebox[\@nameuse{scr@tso@#1@pagenumberwidth}][r]{##2}\quad
      }%
      ##1\par

Die Seitenzahl aus ##2 wird rechtsbündig in einer Box der Breite aus Option pagenumberwidth ausgegeben. Der Text aus Argument ##1 wird dazu hängend ausgegeben. Hinweis: Bei ##1 handelt es sich genau genommen um die Gliederungsnummer und den Text, wobei die Gliederungsnummer als Argument der Anweisung \numberline dem Text vorangestellt ist. Da diese Anweisung weiter oben so definiert wurde, dass sie ihr Argument ignoriert, wird die Gliederungsnummer hier jedoch nicht mit ausgegeben.

  \penalty\@highpenalty

Hier wird ein Seitenumbruch zunächst verboten. Aber wir erinnern uns, dass im Falle eines weiteren Eintrags dieses Stils, dann ein Seitenumbruch wieder explizit erlaubt würde.

Also alles kein großes Geheimnis. Wer in die Erstellung eigener Stile einsteigen will, dem sei noch einmal das Studium der vordefinierten Stile aus tocbasic.sty empfohlen. Dabei sollte mit den weniger komplexen Stilen dottedtocline, undottedtocline und largetocline begonnen werden. Die stark konfigurierbaren Stile tocline und toctext sind dann für diejenigen Interessant, die viele Einstellmöglichkeiten benötigen und vor entsprechend komplexen Definitionen nicht zurückschrecken.

Es sei noch erwähnt, dass die Verwendung von tocbasic natürlich auch mit anderen Klassen möglich ist. Während die KOMA-Script-Klassen das Paket automatisch laden und verwenden, muss das Paket aber beispielsweise bei Verwendung einer Standardklasse explizit geladen werden. Darüber hinaus ist die Verwendung des neu definierten Eintragsstils nicht auf das Inhaltsverzeichnis beschränkt. Man kann ihn per \DeclareTOCStyleEntry ebenso beispielsweise auf figure oder table anwenden.


Related

Wiki (Deutsch): HowTo_ToCConfiguration

MongoDB Logo MongoDB