Wie definiert man ein neues Gleitobjekt?
Dieser Beitrag ist zuerst auf Englisch in Clemens’ LaTeX Corner erschienen.
Vorwort
Wir kennen alle die zwei Gleitobjekte [cci_latex]table[/cci_latex] und [cci_latex]figure[/cci_latex], die von fast allen Dokumentenklassen definiert werden. Immer mal wieder braucht man allerdings ein weiteres Gleitobjekt. zum Beispiel benötigen Chemiker oft eine Art [cci_latex]scheme[/cci_latex]-Umgebung. Obwohl letztere leicht mit dem [cci_latex]chemmacros[/cci_latex]-Paket und seinem [cci_latex]scheme[/cci_latex]-Modul erhalten werden kann, will ich anhand dieses Beipiels verschiedene Methoden präsentieren, mit denen man Gleitobjekte definieren kann
Manuelle Definition
Die manuelle Definition ist etwas mühsam, da man eine ganze Reihe interner Makros definieren muss. Der folgende Code demonstriert das für ein Gleitobjekt “scheme” analog dazu, wie [cci_latex]article.cls[/cci_latex] [cci_latex]figure[/cci_latex] oder [cci_latex]table[/cci_latex] definiert:
[cce_latex]\documentclass{article}
\makeatletter
\newcounter{scheme}% der Zähler
\renewcommand*\thescheme{\arabic{scheme}}% das Format für den Zähler
\newcommand*\fps@scheme{tbp}% voreingestellte Gleitoptionen
\newcommand*\ftype@scheme{4}% Gleittyp-Nummer, muss eine Potenz von 2 sein;
% \ftype@figure=1, \ftype@table=2
\newcommand*\ext@scheme{los}% Dateiendung für das Verzeichnis
\newcommand*\fnum@scheme{\schemename\nobreakspace\thescheme}% in Überschriften verwendet
\newcommand*\schemename{Scheme}% der Name
\newcommand*\listschemename{List of schemes}% der Name des Verzeichnisses
\newenvironment{scheme}{\@float{scheme}}{\end@float}% die Umgebung
\newenvironment{scheme*}{\@dblfloat{scheme}}{\end@dblfloat}% die Sternvariante
% für zweispaltige Dokumente
\newcommand*\listofschemes{% das Verzeichnis
\section*{\listschemename}
\@mkboth
{\MakeUppercase\listschemename}
{\MakeUppercase\listschemename}
\@starttoc{\ext@scheme}
}
\let\l@scheme\l@figure % Layout des Verzeichnisses analog zum Abbildungsverzeichnis
\makeatother
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Dieser Ansatz ist mühsam und wenig flexibel. Die mangelnde Flexibilität ist vermutlich kein größeres Problem, wenn der Code in der Präambel eines Dokuments eingesetzt wird.
Mit dem newfloat-Paket
Das [cci_latex]newfloat[/cci_latex]-Paket ist vom gleichen Autor wie die beliebten Pakete [cci_latex]caption[/cci_latex] und [cci_latex]subcaption[/cci_latex]. Wenn Du [cci_latex]caption[/cci_latex] eh schon verwendest, dann ist das Deine Wahl, um neue Gleitobjekte zu definieren. Damit hast Du die volle Power beider Pakete zur Verfügung, um Anpassungen vorzunehmen. Abgesehen davon: der Code ist viel einfacher:
[cce_latex]\documentclass{article}
\usepackage{newfloat}
\DeclareFloatingEnvironment[
fileext = los ,
listname = {List of schemes} ,
name = Scheme
]{scheme}
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Mit KOMA-Script
An Stelle des [cci_latex]newfloat[/cci_latex]-Pakets kann man auch das [cci_latex]tocbasic[/cci_latex]-Paket verwenden, das von jeder KOMA-Script-Klasse verwendet wird. Wenn Du also eine der Klassen wie [cci_latex]scrartcl[/cci_latex] oder [cci_latex]scrbook[/cci_latex] verwendest, musst Du das Paket nicht laden. Der Code ist ähnlich einfach wie mit [cci_latex]newfloat[/cci_latex]. Der folgende Code deutet an, dass es eine ganze Reihe weiterer Optionen zur Anpassung gibt:
[cce_latex]\documentclass{article}
\usepackage{tocbasic}% oder eine KOMA-Script-Klasse wie `scrartcl’
\DeclareNewTOC[
type = scheme ,
% types = schemes ,
float ,
% name = Scheme ,
% listname = {List of Schemes}
]{scheme}
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Gleitobjekte, die auf diese Art definiert wurden, gehorchen KOMA-Script’s diesbezüglichen Optionen.
Mit der memoir-Klasse
Die [cci_latex]memoir[/cci_latex]-Klasse hat ebenfalls ihren eigenen Mechanismus, um Gleitobjekte zu definieren. Leider ist er nicht so geradlinig, wie man denken würde, und auch nicht so leicht, wie das Handbuch behauptet. Die folgende Definition ist analog zu [cci_latex]memoir[/cci_latex]s Definition von [cci_latex]figure[/cci_latex].
[cce_latex]\documentclass{memoir}
\newfloat[chapter]{scheme}{los}{Scheme}
\renewcommand*\thescheme{\thechapter.\arabic{scheme}}
\newlistof{listofschemes}{los}{List of schemes}
\newlistentry[chapter]{scheme}{los}{0}
\cftsetindents{scheme}{0em}{2.3em}
\makeatletter
\addtodef\@memfront@floats{\counterwithout{scheme}{chapter}}
\addtodef\@memmain@floats{\counterwithin{scheme}{chapter}}
\addtodef\@memback@floats{\counterwithin{scheme}{chapter}\setcounter{scheme}{0}}
\makeatother
\ifartopt
\counterwithout{scheme}{chapter}
\fi
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Das floatrow-Paket
Nach der Anleitung von [cci_latex]floatrow[/cci_latex] sollte der folgende Code funktionieren:
[cce_latex]\documentclass{article}
\usepackage{floatrow}
\DeclareNewFloatType{scheme}{name=Scheme}
\newcommand*\listofschemes{\listof{scheme}{List of schemes}}
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Tatsächlich tut er das aber nicht. Während die Gleit-Umgebung selbst definiert ist und funktioniert, bleibt das Verzeichnis leer. Das lässt sehr stark einen Bug in [cci_latex]floatrow[/cci_latex] vermuten. Es gelang mir leider nicht, in aufzuspüren.
Das float-Paket
Das [cci_latex]float[/cci_latex]-Paket ist das älteste Paket in dieser Liste, aber es funktioniert noch immer:
[cce_latex]\documentclass{article}
\usepackage{float}
\newfloat{scheme}{hbp}{los}
\floatname{scheme}{Scheme}
\newcommand*\listofschemes{\listof{scheme}{List of schemes}}
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}[/cce_latex]
Ich empfehle es in der Regel nicht – aus zumeist persönlichen Gründen –, aber man kann es verwenden und es vervollständigt die Liste.