Cadres

La première chose que l’on tape pour encadrer du texte en LaTeX, c’est presque toujours \fbox{...}. Cela marche — tant que le contenu tient sur une ligne. Donnez-lui un paragraphe entier : le cadre refuse de se replier, déborde du papier, et le journal affiche Overfull \hbox. Cette unique limitation est la raison d’être des packages d’encadrement framed, mdframed et tcolorbox. Cette page va du \fbox et du \framebox intégrés jusqu’aux cadres qui traversent les pages et aux panneaux colorés avec titre, autour d’une seule question : pourquoi un cadre ne peut-il pas être coupé en deux ?

\fbox et \framebox : le cadre intégré et sa limite

\fbox{...} ne demande aucun package et trace un filet fin ajusté à son argument. Pour imposer largeur et alignement, il y a \framebox[width][position]{...} : le premier argument optionnel fixe la largeur de la boîte, le second choisit la place du contenu à l’intérieur — c (centré, par défaut), l (à gauche), r (à droite), s (étiré jusqu’aux deux bords). Sans argument optionnel, \framebox se comporte exactement comme \fbox. Ce sont des boîtes en ligne posées sur la ligne de base : elles s’alignent naturellement avec \hspace et les mots voisins.

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

Et voici le mur. Ni \fbox ni \framebox ne renvoie son contenu à la ligne. Donnez-leur un long paragraphe : il continue de croître vers la droite sur une seule ligne, pousse le cadre hors du papier et déclenche l’avertissement Overfull \hbox (... too wide). Ce n’est pas un bogue mais la définition appliquée à la lettre : \fbox compose son argument dans une seule boîte horizontale, une \hbox, et une \hbox ne contient aucun point de coupure. Pour encadrer plusieurs lignes, construisez d’abord le paragraphe avec \parbox ou minipage, comme ci-dessus, puis encadrez cette boîte. \parbox et minipage sont traités sur la page « Boîtes ». Mais ce détour s’arrête dès que le cadre doit franchir une limite de page — la raison arrive.

\fboxrule et \fboxsep : trait plus épais, marge intérieure plus large

Deux longueurs décident de l’aspect du cadre. \fboxrule est l’épaisseur du filet, 0.4pt par défaut dans les classes standard, et \fboxsep la marge intérieure entre le filet et le contenu, 3pt par défaut. Toutes deux se changent avec \setlength. Les 0.4pt par défaut sont aussi fins que le texte courant : c’est rarement suffisant quand la boîte doit ressortir comme un avertissement. Attention toutefois, ce sont des longueurs globales ordinaires : les modifier dans le préambule modifie toutes les \fbox du document. Pour n’épaissir qu’une boîte, placez le \setlength dans un groupe {...}, comme ci-dessous. Charger color ou xcolor donne en plus \fcolorbox{couleur du cadre}{fond}{...}, qui obéit exactement aux mêmes deux longueurs — les noms de couleurs et les mélanges sont sur la page « Couleurs (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}

Pourquoi une boîte encadrée ne peut pas se couper sur une page

La réponse est simple : un contenu entouré d’un filet devient une seule boîte, et le mécanisme de pagination de TeX ne peut couper qu’entre les éléments d’une liste verticale, jamais à l’intérieur d’une boîte. Dès qu’on encadre quelque chose, cela disparaît de la liste des endroits où la page peut être coupée. Cela révèle aussi ce qu’est vraiment un « cadre sécable ». Aucun cadre n’est jamais coupé en deux. Le package découpe d’abord le contenu en morceaux de la taille d’une page, dessine un cadre distinct autour de chaque morceau, puis les empile pour que la jointure soit invisible.

Le package framed de Donald Arseneau expose ce mécanisme à la surface même de sa conception. Sa documentation précise que le premier morceau d’un environnement découpé reçoit \FirstFrameCommand, les morceaux intermédiaires \MidFrameCommand, et le dernier \LastFrameCommand. C’est exactement pourquoi son environnement oframed peut laisser le cadre ouvert en haut et en bas au point de coupure : les extrémités et les jointures utilisent des commandes différentes, et aucun filet horizontal n’est tracé là où la boîte a été coupée. La mention de copyright de framed.sty commence en 1992, signe que le problème est plus ancien que LaTeX2e lui-même. Et puisque le principe est « découper d’abord, décorer ensuite », les limites suivent : notes de bas de page, flottants et matériel sur plusieurs colonnes à l’intérieur d’un cadre sécable sont fragiles, et les manuels de tcolorbox comme de mdframed le mentionnent parmi leurs réserves.

Le package framed : framed, shaded et leftbar

La seule ligne \usepackage{framed} fournit trois environnements qui survivent à un saut de page. framed trace un filet sur toute la largeur du texte, shaded remplit un fond au lieu de tracer un filet, et leftbar trace un unique trait vertical épais dans la marge de gauche — marque courante pour les citations et les remarques. Tout ce qui relève de la famille shaded exige qu’une couleur nommée shadecolor existe d’abord : définissez-la directement avec \definecolor{shadecolor}{gray}{0.9}, ou chargez xcolor et écrivez \colorlet{shadecolor}{gray!15}. Sans cela, la compilation s’arrête sur une erreur de couleur indéfinie, sans indice utile.

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}

Les dimensions se règlent avec \FrameRule et \FrameSep — la documentation du package dit explicitement que ce sont les longueurs qui remplacent \fboxrule et \fboxsep à l’intérieur d’un environnement framed. L’espace vertical avant et après l’environnement est \OuterFrameSep, qui vaut \topsep par défaut. Quelques environnements dérivés suivent : shaded* aligne le bord du fond sur la largeur du texte (le shaded simple déborde légèrement dans la marge), snugshade et snugshade* collent au contenu, et oframed est le cadre ouvert au point de coupure vu à la section précédente. Au-delà, définir son propre \FrameCommand et encadrer le contenu par \MakeFramed ... \endMakeFramed permet de construire n’importe quelle décoration sécable — la documentation y voit d’ailleurs la vocation plus générale du package. Ce que framed ne donne pas : coins arrondis, ombres, titres. Pour cela, il faut monter d’un cran.

Encadrer une formule avec \boxed, qui n’est qu’une \fbox

Pour encadrer un résultat final, chargez \usepackage{amsmath} et utilisez \boxed{...} en mode mathématique : la commande compose son argument comme une formule, puis l’encadre. Le plus intéressant est sa définition : dans amsmath, \boxed s’écrit pour l’essentiel \fbox{\m@th$\displaystyle#1$}. Ce n’est donc pas un mécanisme de tracé distinct — la formule est enveloppée dans $...$ et confiée à \fbox. Trois conséquences pratiques en découlent. \fboxrule et \fboxsep s’y appliquent tels quels. Aucun saut de page n’est possible, naturellement. Et comme \displaystyle est imposé, un \boxed placé dans un indice sort en taille pleine alors que tout ce qui l’entoure est réduit.

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

Mettez les deux côte à côte et la différence saute aux yeux. $\fbox{x+y}$ compose son argument en mode texte : x et y sortent en romain droit et l’espacement autour de + n’a rien de mathématique. $\boxed{x+y}$ conserve l’italique et les espaces mathématiques. Dans une formule, prenez donc toujours \boxed. Pour les besoins plus élaborés — englober aussi le numéro d’équation, ou couvrir plusieurs lignes d’un align — le package empheq fourni avec mathtools est l’outil adéquat. Le mode mathématique lui-même est traité sur la page « Bases du mode mathématique ».

tcolorbox : couleur, titre et breakable

Quand couleur, titre et saut de page sont demandés en même temps, la réponse est tcolorbox. Chargez-le par \usepackage[most]{tcolorbox} et passez à l’environnement tcolorbox les clés colback= (couleur de fond), colframe= (couleur du cadre), title= (barre de titre) et breakable (autoriser les sauts de page). La subtilité qui fait trébucher, c’est le rôle de most. tcolorbox se compose d’un noyau et d’un grand nombre de bibliothèques, et breakable est le nom d’une option et d’une bibliothèque. Avec un simple \usepackage{tcolorbox} suivi de breakable, la boîte refuse encore de se couper, car la bibliothèque n’a jamais été chargée : il faut [most], ou un \tcbuselibrary{breakable} explicite. Dans le code source, most se développe en many (soit raster, skins, breakable, hooks, theorems, fitting) plus listingsutf8, external, magazine, vignette et poster — tout sauf minted, qui dépend d’un outil externe.

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}

La forme se règle par des clés numériques : boxrule= est l’épaisseur du filet (défaut 0.5mm) et arc= le rayon des coins (défaut 1mm), avec sharp corners pour des angles droits et rounded corners pour les coins arrondis par défaut. Le fond de la barre de titre est colbacktitle= et la police du titre fonttitle= (on y passe \bfseries, par exemple). Pour un petit cadre unique au fil d’une ligne, utilisez \tcbox{...} plutôt que l’environnement : il s’ajuste au contenu comme \fbox et, comme \fbox, ne se coupe pas. En dessous, il y a pgf : le noyau exige pgf, et la bibliothèque skins comprise dans most exige tikz lui-même. C’est pourquoi demander enhanced met directement en avant la puissance de dessin de TikZ — ombres, doubles cadres, transparences et titres décorés. S’y ajoutent une bibliothèque theorems pour les boîtes de type théorème, un mode en deux parties où \tcblower scinde la boîte pour placer la source au-dessus de la sortie, et bien davantage.

« Bien davantage » n’est pas une figure de style. Le manuel de tcolorbox livré avec TeX Live 2024, qu’ouvre texdoc tcolorbox, compte 548 pages — une petite monographie, pour un package qui dessine des boîtes. Son auteur est Thomas F. Sturm, à qui l’on doit aussi csvsimple, pour lire des fichiers CSV depuis LaTeX, et genealogytree, pour composer des arbres généalogiques. Le conseil pratique : ne pas chercher à lire ces 548 pages. Quatre clés — colback, colframe, title, breakable — couvrent presque tous les besoins ; l’index du manuel suffit quand on veut vraiment aller plus loin.

Réutiliser un même style avec \newtcolorbox

Répéter le même jeu d’options dans le corps du texte, on le regrette le jour où l’on veut changer la couleur. Définissez la boîte une seule fois dans le préambule avec \newtcolorbox. La forme est \newtcolorbox[init options]{name}[nombre d’arguments][valeur par défaut]{options} et, comme \newenvironment, elle crée des environnements prenant des arguments. Pour une commande plutôt qu’un environnement, \newtcbox ; pour changer d’un coup les valeurs par défaut de tout le document, \tcbset{...}. Une habitude mérite d’être prise : nommer la boîte d’après son sensnote, warning, definition — et non d’après son apparence, comme blueroundbox. Un changement de palette ne coûtera alors que quelques lignes de préambule au lieu d’un rechercher-remplacer dans le texte.

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 : le juste milieu entre framed et tcolorbox

mdframed occupe exactement l’espace entre un cadre plus élégant que framed et un cadre moins lourd que tcolorbox. Chargez-le par \usepackage{mdframed} et passez à l’environnement mdframed des clés optionnelles comme backgroundcolor=, roundcorner=, linecolor= et linewidth=. La raison d’être du package est écrite en tête de son code source, dans les mots de l’auteur : travailler avec \fbox ou \fcolorbox oblige à gérer les sauts de page à la main, alors que l’environnement mdframed s’en charge automatiquement. La limitation même par laquelle cette page a commencé se trouve ainsi consignée comme raison d’exister d’un autre package — et le code source précise tout aussi nettement que l’implémentation s’appuie sur l’idée de framed.sty.

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}

Sa particularité est le choix du moteur de tracé. framemethod=default dessine avec des commandes LaTeX simples, tandis que framemethod=TikZ ou framemethod=pstricks débloquent des décorations plus élaborées. Les réglages fréquents se regroupent dans \mdfsetup{...}. Un environnement encadré personnel se définit par \newmdenv{...}, un environnement de théorème encadré par \newmdtheoremenv{...}. Un détail mérite d’être connu : la version actuelle de mdframed est la 1.9b, datée du 1er juillet 2013 — et son code source porte encore une ligne indiquant que le package est en état bêta. Il figure pourtant dans TeX Live depuis plus de dix ans et fonctionne. Pour un nouveau document destiné à être largement personnalisé, tcolorbox, activement maintenu, reste toutefois le pari le plus sûr.

\fbox ou tcolorbox ? Comment choisir

Il n’y a en réalité qu’un critère : la taille du matériel à enfermer. Un mot ou une ligne : \fbox / \framebox. Une formule : \boxed. Un cadre sobre autour de plusieurs paragraphes : framed. De la couleur et des coins arrondis : mdframed. Un titre, des sauts de page et de la décoration : tcolorbox. En cas d’hésitation, demandez-vous d’abord si la boîte doit survivre à un saut de page — cette seule question sépare nettement les candidats en deux groupes. Autre conseil pratique : framed et tcolorbox cohabitent sans heurt dans un même document, mais pour une allure homogène, mieux vaut s’en tenir à un seul.

Commande / packageCe qu’il encadreSauts de page ?Idéal pour
\fbox / \frameboxContenu tenant sur une ligneNonUn mot ou une courte ligne, vite fait
\boxedMathématiques, en mode mathématiqueNonMettre en valeur un résultat
framedBlocs de paragraphesOuiUn cadre léger, sans décoration
mdframedBlocs de paragraphesOuiCouleur et coins arrondis à peu de frais
tcolorboxBlocs, texte en ligne, théorèmesOui (breakable)Titres, palette, panoplie complète