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:

\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
}

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:

\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
}

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:

\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
}

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 memoirs Definition von figure.

\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
}

Das floatrow-Paket

Nach der Anleitung von floatrow sollte der folgende Code funktionieren:

\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
}

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:

\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
}

Ich empfehle es in der Regel nicht – aus zumeist persönlichen Gründen –, aber man kann es verwenden und es vervollständigt die Liste.

Über Clemens

Ich bin ein LaTeX-Enthusiast, der auch mit ein paar Paketen wie chemmacros oder fnpct einen bescheidenen Beitrag zur LaTeX-Vielfalt beitragen hat. Ich habe noch einen eigenen Blog: einzelMEINUNG und einen englischsprachigen Blog, der sich ausschließlich mit LaTeX beschäftigt mychemistry.eu.

08. Mai 2017 von Clemens
Kategorien: LaTeX | Schlagwörter: , , , , , , | Schreibe einen Kommentar

Schreibe einen Kommentar

Pflichtfelder sind mit * markiert