Rahmen

Wer in LaTeX einen Rahmen um Text setzen will, tippt fast immer zuerst \fbox{...}. Das funktioniert – solange der Inhalt in eine Zeile passt. Übergibt man einen ganzen Absatz, bricht der Rahmen nicht um, läuft über den Papierrand hinaus, und im Protokoll steht Overfull \hbox. Genau diese eine Einschränkung ist der Grund, weshalb es die Rahmenpakete framed, mdframed und tcolorbox überhaupt gibt. Diese Seite führt vom eingebauten \fbox und \framebox über seitenumbruchfähige Rahmen bis zu farbigen Panels mit Titel – zusammengehalten von einer Frage: Warum lässt sich ein Rahmen nicht zerteilen?

\fbox und \framebox: der eingebaute Rahmen und seine Grenze

\fbox{...} kommt ohne jedes Paket aus und zieht eine dünne Linie eng um sein Argument. Für Breite und Ausrichtung gibt es \framebox[width][position]{...}: Das erste optionale Argument legt die Breite der Box fest, das zweite die Lage des Inhalts darin – c (zentriert, Standard), l (linksbündig), r (rechtsbündig), s (auf beide Ränder gestreckt). Ohne optionale Argumente verhält sich \framebox exakt wie \fbox. Beide sind Inline-Boxen auf der Grundlinie und fügen sich daher natürlich neben \hspace und den umgebenden Wörtern ein.

latex
\fbox{a framed word}

% width 5cm, content flush left inside the box
\framebox[5cm][l]{flush left}

% multi-line: frame a \parbox, not the text itself
\fbox{\parbox{0.8\linewidth}{%
  Several lines of text. The inner box wraps them
  first, and only then does the frame go around.}}

Und hier ist die Wand. Weder \fbox noch \framebox bricht den Inhalt um. Bei einem langen Absatz wächst er auf einer einzigen Zeile immer weiter nach rechts, schiebt den Rahmen über das Papier hinaus und erzeugt die Warnung Overfull \hbox (... too wide). Das ist kein Fehler, sondern die Definition, die genau so arbeitet: \fbox setzt sein Argument in eine einzige horizontale Box, eine \hbox, und eine \hbox enthält überhaupt keine Umbruchstellen. Für mehrere Zeilen baut man den Absatz zuerst mit \parbox oder minipage und rahmt dann diese Box, wie oben gezeigt. \parbox und minipage selbst behandelt die Seite „Boxen“. Auch dieser Trick endet allerdings, sobald der Rahmen eine Seitengrenze überqueren muss – warum, folgt gleich.

\fboxrule und \fboxsep: dickere Linien, mehr Innenabstand

Zwei Längen bestimmen das Aussehen des Rahmens. \fboxrule ist die Linienstärke, in den Standardklassen 0.4pt, und \fboxsep der Innenabstand zwischen Linie und Inhalt, standardmäßig 3pt. Beide ändert man mit \setlength. Die voreingestellten 0.4pt sind etwa so fein wie der Fließtext und reichen selten aus, wenn die Box als Hinweis auffallen soll. Zu beachten ist aber: Es sind gewöhnliche globale Längen – wer sie in der Präambel ändert, ändert jede \fbox im Dokument. Für eine einzelne dickere Box gehört das \setlength in eine Gruppe {...}, wie unten. Mit color oder xcolor kommt zusätzlich \fcolorbox{Rahmenfarbe}{Hintergrund}{...} hinzu, das genau denselben zwei Längen folgt – Farbnamen und Mischungen behandelt die Seite „Farben (xcolor)“.

latex
% global: every \fbox in the document becomes thicker
\setlength{\fboxrule}{1pt}
\setlength{\fboxsep}{8pt}

% local: the group limits the change to this one box
{\setlength{\fboxrule}{2pt}\fbox{a heavy frame}}

% same two lengths, plus colour (needs color or xcolor)
\fcolorbox{red}{yellow!20}{warning}

Warum ein gerahmter Kasten nicht über eine Seite umbrechen kann

Die Antwort ist einfach: Material mit einer Linie ringsum wird zu einer einzigen Box, und der Seitenumbruchmechanismus von TeX kann nur zwischen den Elementen einer vertikalen Liste trennen, niemals innerhalb einer Box. Sobald etwas eingerahmt ist, verschwindet es aus der Liste möglicher Umbruchstellen. Damit zeigt sich auch, was ein „umbrechbarer Rahmen“ wirklich ist. Kein einzelner Rahmen wird je zerschnitten. Das Paket zerlegt den Inhalt zunächst in seitengroße Stücke, zeichnet um jedes Stück einen eigenen Rahmen und stapelt sie so, dass die Naht unsichtbar bleibt.

Das Paket framed von Donald Arseneau legt genau diesen Mechanismus offen. Seine Dokumentation hält fest, dass das erste Stück einer aufgeteilten Umgebung \FirstFrameCommand erhält, Zwischenstücke \MidFrameCommand und das letzte \LastFrameCommand. Genau deshalb kann seine Umgebung oframed den Rahmen an der Umbruchstelle oben und unten offen lassen: Für Enden und Nahtstellen gelten verschiedene Befehle, an der Schnittkante wird keine waagerechte Linie gezogen. Der Copyright-Vermerk in framed.sty beginnt im Jahr 1992 – das Problem ist also älter als LaTeX2e selbst. Und weil das Prinzip „erst teilen, dann dekorieren“ lautet, ergeben sich die Grenzen von selbst: Fußnoten, Gleitobjekte und spaltenübergreifendes Material in einem umbrechbaren Rahmen sind heikel, und die Handbücher von tcolorbox wie mdframed führen das unter ihren Einschränkungen auf.

Das Paket framed: die Umgebungen framed, shaded und leftbar

Allein \usepackage{framed} liefert drei Umgebungen, die einen Seitenumbruch überstehen. framed zieht eine Linie über die volle Textbreite, shaded füllt statt einer Linie einen Hintergrund, und leftbar zeichnet einen einzelnen dicken senkrechten Strich am linken Rand – eine verbreitete Markierung für Zitate und Nebenbemerkungen. Alles aus der shaded-Familie setzt voraus, dass zuvor eine Farbe namens shadecolor existiert: entweder direkt mit \definecolor{shadecolor}{gray}{0.9} oder über xcolor mit \colorlet{shadecolor}{gray!15}. Fehlt sie, bricht der Lauf mit einem Fehler über eine undefinierte Farbe ab, nicht mit einem hilfreichen Hinweis.

latex
\usepackage{framed}
\usepackage{xcolor}
\colorlet{shadecolor}{gray!15}

% these lengths are the framed counterparts of
% \fboxrule and \fboxsep
\setlength{\FrameRule}{1pt}
\setlength{\FrameSep}{10pt}

\begin{framed}
  A long note. If it reaches the bottom of the page the
  frame is split and continues on the next one, which is
  precisely what \fbox cannot do.
\end{framed}

\begin{shaded}
  Filled background instead of a rule.
\end{shaded}

\begin{leftbar}
  A single vertical rule in the left margin.
\end{leftbar}

Die Maße stellt man mit \FrameRule und \FrameSep ein – die Paketdokumentation sagt ausdrücklich, dass genau diese Längen innerhalb einer framed-Umgebung an die Stelle von \fboxrule und \fboxsep treten. Der vertikale Abstand vor und nach der Umgebung ist \OuterFrameSep und entspricht standardmäßig \topsep. Dazu kommen einige abgeleitete Umgebungen: shaded* richtet die Kante der Füllung an der Textbreite aus (das schlichte shaded läuft leicht in den Rand hinein), snugshade und snugshade* legen sich eng um den Inhalt, und oframed ist der an der Umbruchstelle offene Rahmen aus dem vorigen Abschnitt. Darüber hinaus lässt sich mit einem eigenen \FrameCommand und \MakeFramed ... \endMakeFramed jede beliebige umbrechbare Dekoration bauen – laut Dokumentation der eigentliche, allgemeinere Zweck des Pakets. Was framed nicht bietet, sind abgerundete Ecken, Schatten und Titel. Dafür geht es eine Stufe höher.

Eine Formel mit \boxed rahmen – darunter steckt eine \fbox

Um ein Endergebnis zu rahmen, lädt man \usepackage{amsmath} und verwendet \boxed{...} im Mathematikmodus; der Befehl setzt sein Argument als Mathematik und rahmt es anschließend. Interessant ist die Definition: In amsmath steht \boxed im Kern als \fbox{\m@th$\displaystyle#1$}. Es handelt sich also gar nicht um einen eigenen Zeichenmechanismus – die Formel wird in $...$ gehüllt und an \fbox weitergereicht. Daraus folgen drei praktische Konsequenzen: \fboxrule und \fboxsep wirken unverändert; ein Seitenumbruch ist naturgemäß ausgeschlossen; und da \displaystyle erzwungen wird, erscheint ein \boxed im Index in voller Größe, während alles ringsum verkleinert ist.

latex
\usepackage{amsmath}

\[
  \boxed{E = mc^2}
\]

% \fbox inside math sets its argument in TEXT mode:
% upright roman letters, not math italic
$\fbox{x+y}$ \quad versus \quad $\boxed{x+y}$

Stellt man beide nebeneinander, ist der Unterschied offensichtlich. $\fbox{x+y}$ setzt sein Argument im Textmodus, x und y erscheinen also aufrecht in Antiqua, und der Abstand um + ist gar kein mathematischer. $\boxed{x+y}$ bewahrt Mathe-Kursive und Mathe-Abstände. Innerhalb von Formeln also stets \boxed. Für anspruchsvollere Wünsche – die Gleichungsnummer mit einschließen oder mehrere Zeilen eines align überspannen – ist das mit mathtools gelieferte Paket empheq das richtige Werkzeug. Der Mathematikmodus selbst wird auf der Seite „Grundlagen des Mathematikmodus“ behandelt.

tcolorbox: Farbe, Titel und breakable

Wenn Farbe, Titel und Seitenumbruch auf einmal gefragt sind, lautet die Antwort tcolorbox. Geladen wird es mit \usepackage[most]{tcolorbox}; der Umgebung tcolorbox übergibt man colback= (Hintergrundfarbe), colframe= (Rahmenfarbe), title= (Titelleiste) und breakable (Seitenumbruch erlauben). Die Feinheit, über die viele stolpern, ist die Rolle von most. tcolorbox besteht aus einem Kern und einer großen Zahl von Bibliotheken, und breakable ist der Name einer Option und einer Bibliothek. Mit bloßem \usepackage{tcolorbox} und der Angabe breakable teilt sich die Box trotzdem nicht, weil die Bibliothek nie geladen wurde; nötig ist [most] oder ein ausdrückliches \tcbuselibrary{breakable}. Im Quelltext steht most für many (also raster, skins, breakable, hooks, theorems, fitting) zuzüglich listingsutf8, external, magazine, vignette und poster – alles außer minted, das ein externes Werkzeug voraussetzt.

latex
\usepackage[most]{tcolorbox}

\begin{tcolorbox}[colback=blue!5, colframe=blue!60!black,
                  title=Remarks, fonttitle=\bfseries, breakable]
  A coloured box with a title bar. Because breakable was
  given, a long body is split across the page boundary.
\end{tcolorbox}

% inline, fitted to its content, no page breaks
\tcbox[colback=red!5, colframe=red!60!black]{inline box}

Die Form regeln numerische Schlüssel: boxrule= ist die Linienstärke (Standard 0.5mm), arc= der Eckenradius (Standard 1mm); sharp corners liefert eckige, rounded corners die voreingestellten runden Ecken. Der Hintergrund der Titelleiste ist colbacktitle=, die Titelschrift fonttitle= (etwa \bfseries). Für einen einzelnen kleinen Rahmen innerhalb einer Zeile dient \tcbox{...} statt der Umgebung – es schrumpft wie \fbox auf den Inhalt und bricht, wie \fbox, nicht um. Darunter liegt pgf: Der Kern verlangt pgf, die in most enthaltene skins-Bibliothek verlangt tikz selbst. Deshalb holt die Angabe enhanced die Zeichenkraft von TikZ unmittelbar nach vorn – Schatten, Doppelrahmen, Transparenz und dekorierte Titel. Dazu kommen eine theorems-Bibliothek für theoremartige Kästen, ein zweiteiliger Modus, in dem \tcblower die Box so trennt, dass Quelltext über Ausgabe steht, und noch vieles mehr.

„Vieles mehr“ ist keine Redensart. Das mit TeX Live 2024 ausgelieferte Handbuch zu tcolorbox, das texdoc tcolorbox öffnet, umfasst 548 Seiten – eine kleine Monografie, und das für ein Paket zum Zeichnen von Kästen. Verfasst hat es Thomas F. Sturm, von dem auch csvsimple zum Einlesen von CSV-Dateien in LaTeX und genealogytree zum Setzen von Stammbäumen stammen. Der praktische Rat lautet: diese 548 Seiten nicht durchlesen wollen. Vier Schlüssel – colback, colframe, title, breakable – decken fast alles ab, was ein Dokument braucht; für alles Aufwendigere genügt der Index des Handbuchs.

Ein Aussehen wiederverwenden mit \newtcolorbox

Dieselben Optionen im Fließtext immer wieder zu wiederholen, bereut man spätestens an dem Tag, an dem die Farbe geändert werden soll. Besser definiert man die Box einmal in der Präambel mit \newtcolorbox. Die Form lautet \newtcolorbox[init options]{name}[Argumentzahl][Vorgabe]{options}, und wie \newenvironment lassen sich damit Umgebungen mit Argumenten erzeugen. Wird ein Befehl statt einer Umgebung gebraucht, hilft \newtcbox; um die Vorgaben für das gesamte Dokument umzustellen, \tcbset{...}. Eine Gewohnheit lohnt sich: die Box nach ihrer Bedeutung benennen – note, warning, definition – und nicht nach ihrem Aussehen wie blueroundbox. Ein späterer Farbwechsel kostet dann ein paar Zeilen in der Präambel statt eines Suchen-und-Ersetzen im Text.

document.tex
\usepackage[most]{tcolorbox}

% one argument: the heading text
\newtcolorbox{note}[1]{%
  colback=yellow!10, colframe=orange!70!black,
  fonttitle=\bfseries, title=#1, breakable}

\begin{document}
\begin{note}{Careful}
  The note environment is now defined; its heading
  arrives as an argument.
\end{note}
\end{document}

mdframed: der Mittelweg zwischen framed und tcolorbox

mdframed besetzt genau den Platz zwischen einem Rahmen, der besser aussieht als framed, und einem, der weniger kostet als tcolorbox. Geladen wird es mit \usepackage{mdframed}; der Umgebung mdframed übergibt man optionale Schlüssel wie backgroundcolor=, roundcorner=, linecolor= und linewidth=. Warum das Paket geschrieben wurde, steht mit den Worten des Autors am Kopf des Quelltextes: Wer mit \fbox oder \fcolorbox arbeitet, muss Seitenumbrüche von Hand behandeln, während die Umgebung mdframed sie automatisch erledigt. Genau die Einschränkung, mit der diese Seite begann, ist damit als Existenzgrund eines anderen Pakets festgehalten – und der Quelltext vermerkt ebenso deutlich, dass die Umsetzung auf der Idee von framed.sty aufbaut.

latex
\usepackage{mdframed}

\begin{mdframed}[backgroundcolor=gray!10, roundcorner=5pt,
                 linecolor=gray!60, linewidth=1pt]
  An mdframed box. It breaks across pages.
\end{mdframed}

% a named environment of your own, and a framed theorem
\newmdenv[linecolor=red, linewidth=1.5pt]{alert}
\newmdtheoremenv{prop}{Proposition}

Sein besonderes Merkmal ist die Wahl des Zeichen-Backends. framemethod=default zeichnet mit einfachen LaTeX-Befehlen, während framemethod=TikZ oder framemethod=pstricks aufwendigere Dekoration freischalten. Häufig benutzte Einstellungen lassen sich in \mdfsetup{...} bündeln. Eine eigene gerahmte Umgebung entsteht mit \newmdenv{...}, eine gerahmte Theoremumgebung mit \newmdtheoremenv{...}. Ein Detail lohnt die Erwähnung: Das aktuelle mdframed trägt die Version 1.9b vom 1. Juli 2013 – und im Quelltext steht bis heute die Zeile, das Paket habe Beta-Status. Trotzdem liegt es seit über einem Jahrzehnt in TeX Live und funktioniert. Für ein neues Dokument, das stark angepasst werden soll, ist das aktiv gepflegte tcolorbox allerdings die sicherere Wahl.

\fbox oder tcolorbox? Die Wahl auf einen Blick

Es gibt eigentlich nur ein Kriterium: die Größe des Materials, das eingeschlossen werden soll. Ein Wort oder eine Zeile: \fbox / \framebox. Eine Formel: \boxed. Ein schlichter Rahmen um mehrere Absätze: framed. Farbe und runde Ecken: mdframed. Titel, Seitenumbrüche und Dekoration: tcolorbox. Im Zweifel lautet die erste Frage, ob der Kasten einen Seitenumbruch überstehen muss – diese eine Frage teilt die Kandidaten sauber in zwei Gruppen. Ein weiterer praktischer Hinweis: framed und tcolorbox vertragen sich im selben Dokument problemlos, doch für ein einheitliches Erscheinungsbild ist es besser, sich auf eines festzulegen.

Befehl/PaketGerahmter InhaltSeitenumbruch?Am besten für
\fbox / \frameboxInhalt für eine ZeileNeinWort oder kurze Zeile, schnell
\boxedMathematik im MathematikmodusNeinEin Endergebnis hervorheben
framedAbsatzblöckeJaLeichter Rahmen ohne Zierrat
mdframedAbsatzblöckeJaFarbe und runde Ecken mit wenig Aufwand
tcolorboxBlöcke, Inline-Text, TheoremeJa (breakable)Titel, Farbschema, volle Ausstattung