Wie definiert man ein neues Gleitobjekt?
Dieser Beitrag ist zuerst auf Englisch in Clemens’ LaTeX Corner erschienen.
Vorwort
Wir kennen alle die zwei Gleitobjekte table
und figure
, die von fast allen Dokumentenklassen definiert werden. Immer mal wieder braucht man allerdings ein weiteres Gleitobjekt. zum Beispiel benötigen Chemiker oft eine Art scheme
-Umgebung. Obwohl letztere leicht mit dem chemmacros
-Paket und seinem scheme
-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 article.cls
figure
oder table
definiert:
\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}
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 newfloat
-Paket ist vom gleichen Autor wie die beliebten Pakete caption
und subcaption
. Wenn Du caption
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:
\usepackage{newfloat}
\DeclareFloatingEnvironment[
fileext = los ,
listname = {List of schemes} ,
name = Scheme
]{scheme}
\begin{document}
\begin{scheme}
\caption{bla bla}
\end{scheme}
\listofschemes
\end{document}
Mit KOMA-Script
An Stelle des newfloat
-Pakets kann man auch das tocbasic
-Paket verwenden, das von jeder KOMA-Script-Klasse verwendet wird. Wenn Du also eine der Klassen wie scrartcl
oder scrbook
verwendest, musst Du das Paket nicht laden. Der Code ist ähnlich einfach wie mit newfloat
. Der folgende Code deutet an, dass es eine ganze Reihe weiterer Optionen zur Anpassung gibt:
\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}
Gleitobjekte, die auf diese Art definiert wurden, gehorchen KOMA-Script’s diesbezüglichen Optionen.
Mit der memoir-Klasse
Die memoir
-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 memoir
s Definition von figure
.
\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}
Das floatrow-Paket
Nach der Anleitung von floatrow
sollte der folgende Code funktionieren:
\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}
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 floatrow
vermuten. Es gelang mir leider nicht, in aufzuspüren.
Das float-Paket
Das float
-Paket ist das älteste Paket in dieser Liste, aber es funktioniert noch immer:
\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}
Ich empfehle es in der Regel nicht – aus zumeist persönlichen Gründen –, aber man kann es verwenden und es vervollständigt die Liste.