Belle mise en page de théorème

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
Benjamin

Belle mise en page de théorème

Message non lu par Benjamin »

Bonjour tout le monde.

J'aimerais réaliser une belle mise en page pour mes théorèmes, pour être plus explicite j'ai un exemple :
http://gcasalis.free.fr/Files/edpcasalis.pdf
A la page 48 de ce document pdf il y a un théorème qui comporte en particulier une "ligne" verticale sur le coté gauche, j'aimerais pouvoir reproduir exactement cette même ligne dans mes théorèmes mais je n'ai pas trouvé comment faire.

Merci d'avance de votre aide!
Dernière modification par Benjamin le mardi 11 novembre 2008, 16:14, modifié 1 fois.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Le filet gauche est fait à partir des fontes du package mathabx, donc il faut que ce package soit installé (et, lorsqu'on charge le package, pas mal de choses sont redéfinies, notamment la plupart des fontes pour les maths ne seront plus vectorielles). Ensuite, on peut obtenir une présentation similaire comme ceci :

Code : Tout sélectionner

\documentclass[12pt]{article}

\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage[a4paper]{geometry}

\usepackage{amsmath}
\usepackage{calc}

\usepackage{mathabx}

\makeatletter
\newsavebox{\thm@box}
\newcounter{theoreme}[section]
\renewcommand{\thetheoreme}{\thesection.\arabic{theoreme}}
\def\theoreme{\@ifnextchar[\theoreme@opt\theoreme@nopt}
\def\theoreme@opt[#1]{\def\theoreme@title{~(#1)}\theoreme@allcases}
\def\theoreme@nopt{\def\theoreme@title{}\theoreme@allcases}
\def\theoreme@allcases{\begin{lrbox}{\thm@box}%
   \begin{minipage}{\columnwidth-2.5cm}\itshape}
\def\endtheoreme{\end{minipage}\end{lrbox}%
   \vspace{6pt}\noindent\refstepcounter{theoreme}%
   \textbf{Théorème~\thetheoreme\theoreme@title.}\par\nobreak
   \vspace{6pt}\noindent\hspace{0.75cm}%
   $\delimitershortfall=0pt\left\lfilet\hspace{0.75cm} \usebox{\thm@box}\right.$
\vspace{12pt}}
\makeatother

\begin{document}

\section{Théorème de Lax-Milgram}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\begin{theoreme}[Théorème de Lax-Milgram]
Soit a une forme bilinéaire continue et coercive définie sur $\mathbf{H}$. On a alors la propriété suivante :
\[\forall f \in \mathbf{H}\mathclose{,} \quad \exists! u \in \mathbf{H}\mathclose{,} \quad a(u,v) = (f \mid v).\]
De plus, si $a$ est symétrique, alors le vecteur $u$ défini en vertu du résultat ci-dessus pour une forme linéaire $\theta$ donnée est caractérisé par :
\[u \in \mathbf{H} \quad \text{et} \quad \frac{1}{2} a(u,u) - (f \mid u) = \min_{v \in \mathbf{H}}\left\{\frac{1}{2} a(v,v) - (f \mid v)\right\}\mathclose{.}\]
\end{theoreme}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\end{document}
Voici le résultat :
wave_theorem.pdf
(125.17 Kio) Téléchargé 772 fois
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Merci beaucoup, c'est génial, jamais j'aurais réussi ca tout seul!
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Est-ce que tu penses qu'il serait possible d'intégrer de telles commandes une fois un théorème défini?

Je songe en particulier à avoir un début du style :

Code : Tout sélectionner

\documentclass{article}

\usepackage{ntheorem}

\newtheorem{theoreme}{Théorème}

"Ici les lignes de codes pour les modifications que je désire"

\begin{document}

\begin{theoreme}
Test
\end{theoreme}

\end{document}
Ca me permetterais de conserver toutes les fonctionnalités du package ntheorem...
Amaury

Re: Belle mise en page de théorème

Message non lu par Amaury »

Est-ce que vous avez regardé du côté du package thmbox de E. Beffara ? Même si il y a moins d'enjolivures au niveau de la ligne verticale, c'est pas mal aussi.

un petit lien vers la doc http://www.pps.jussieu.fr/~beffara/soft/thmbox.pdf et sinon le tout se trouve sur ctan.
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Oui j'avais déjà regardé de ce côté là. En fait je me dis que si j'arrivais à comprendre le code de thmbox je pourrais l'adapter pour obtenir le filet que je veux sur le côté mais la description de code est quelque chose d'assez obscure pour moi...

Merci de ton aide!
D.GH

Re: Belle mise en page de théorème

Message non lu par D.GH »

Bonsoir,

Je trouve la proposition de ' pg ' élégante.

Concernant la mise en page des théorème, sur le forum voir ici et ici.

En plus, Je fais la proposition suivante :

Code : Tout sélectionner

 % http://www.cnam.fr/depts/maths/Membres/ghorbanzadeh/
 \documentclass[12pt]{article}
 \usepackage[T1]{fontenc}
 \usepackage[latin1]{inputenc}
 \usepackage[frenchb]{babel}
 \usepackage{xcolor}
 \usepackage{amssymb,amsmath,latexsym,amsfonts}
 \usepackage{multido}
 \usepackage[thmmarks]{ntheorem}
 \theoremstyle{break}
\theoremnumbering{arabic}
\newtheorem{theorem}{Th\'eor\`eme}[section]

\usepackage{framed}

\def\BarBarre{%
{\color{green}\vrule width 1pt}\hspace{1pt}{\color{blue}\vrule width 1pt}\hspace{1pt}{\color{red}\vrule width 1pt}}
\newenvironment{MonTHeo}{%
\def\FrameCommand{\BarBarre\hspace{10pt}}
\MakeFramed{\advance\hsize-\width \FrameRestore}
\kern-2ex
\begin{theorem} }%
{\end{theorem}\endMakeFramed}

\begin{document}

\def\DocTeX{Th\'eorème de Lax-Milgram}

\section{Belle mise en page de th\'eor\`eme}

\noindent \multido{\i=1+1}{10}{\DocTeX.~}

\begin{MonTHeo}[Th\'eor\`me de Lax-Milgram]
Soit a une forme bilin\'eaire continue et coercive d\'efinie sur $\mathbf{H}$.
On a alors la propri\'et\'e suivante :
\[\forall f \in \mathbf{H}\mathclose{,} \quad \exists! u \in \mathbf{H}\mathclose{,} \quad a(u,v) = (f \mid v).\]
De plus, si $a$ est sym\'etrique, alors le vecteur $u$
d\'efini en vertu du r\'esultat ci-dessus pour une
forme lin\'eaire $\theta$ donn\'ee est caract\'eris\'e par :
\begin{equation}
u \in \mathbf{H} \quad \text{et} \quad \frac{1}{2} a(u,u) - (f \mid u) = \min_{v \in \mathbf{H}}\left\{\frac{1}{2} a(v,v) - (f \mid v)\right\}\mathclose{.}
\end{equation}
\end{MonTHeo}

\noindent \multido{\i=1+1}{10}{\DocTeX.~}

\begin{MonTHeo}[Th\'eor\`me de Lax-Milgram]
Soit a une forme bilin\'eaire continue et coercive d\'efinie sur $\mathbf{H}$.
On a alors la propri\'et\'e suivante :
\[\forall f \in \mathbf{H}\mathclose{,} \quad \exists! u \in \mathbf{H}\mathclose{,} \quad a(u,v) = (f \mid v).\]
De plus, si $a$ est sym\'etrique, alors le vecteur $u$
d\'efini en vertu du r\'esultat ci-dessus pour une
forme lin\'eaire $\theta$ donn\'ee est caract\'eris\'e par :
\begin{equation}
u \in \mathbf{H} \quad \text{et} \quad \frac{1}{2} a(u,u) - (f \mid u) = \min_{v \in \mathbf{H}}\left\{\frac{1}{2} a(v,v) - (f \mid v)\right\}\mathclose{.}
\end{equation}
\end{MonTHeo}

\end{document}
D.GH
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Benjamin a écrit :Est-ce que tu penses qu'il serait possible d'intégrer de telles commandes une fois un théorème défini?

[...]

Ca me permetterais de conserver toutes les fonctionnalités du package ntheorem...
Il est possible d'avoir une syntaxe à la ntheorem, mais pour garder toutes les fonctionnalités de ntheorem, il faudrait récrire une partie du package (pas très dur, mais il se peut que ça casse le placement automatique des démonstrations, je ne sais pas).

Il se trouve que je travaille sur un package pour la mise en forme des théorèmes. Ce package permet d'avoir une syntaxe agréable pour les théorèmes, mais ne gère pas encore les environnements de démonstrations (donc, en particulier, avec cette solution, pas de placement automatique du carré de fin de démonstration).

Voici le package en question (un fichier .sty zippé) :

(voir ici pour la dernière version du package)


Pour installer ce package, dézipper et mettre le fichier customtheorem.sty soit dans le même répertoire que le fichier .tex à compiler soit dans le texmf si tu sais faire (voir le wiki). Ensuite les lignes de code suivantes donneront le même résultat que mon code précédent :

Code : Tout sélectionner

\documentclass[12pt]{article}

\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\usepackage[a4paper]{geometry}

\usepackage{amsmath}
\usepackage{calc}

\usepackage{mathabx}

\usepackage{amsthm}
\usepackage{customtheorem}

\theoremformat{sidebar}
\theoremsidebarsymbol{\lfilet}
\theoremrightmargin{0.75cm}
\theoremheadpunct{}
\newtheorem{theoreme}{Théorème}[section]

\begin{document}

\section{Théorème de Lax-Milgram}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\begin{theoreme}[Théorème de Lax-Milgram]
Soit a une forme bilinéaire continue et coercive définie sur $\mathbf{H}$. On a alors la propriété suivante :
\[\forall f \in \mathbf{H}\mathclose{,} \quad \exists! u \in \mathbf{H}\mathclose{,} \quad a(u,v) = (f \mid v).\]
De plus, si $a$ est symétrique, alors le vecteur $u$ défini en vertu du résultat ci-dessus pour une forme linéaire $\theta$ donnée est caractérisé par :
\[u \in \mathbf{H} \quad \text{et} \quad \frac{1}{2} a(u,u) - (f \mid u) = \min_{v \in \mathbf{H}}\left\{\frac{1}{2} a(v,v) - (f \mid v)\right\}\mathclose{.}\]
\end{theoreme}

\begin{proof}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{proof}

\end{document}
On peut personnaliser pas mal d'éléments. Tu peux essayer les suivants par exemple pour voir ce que ça donne :

Code : Tout sélectionner

\theoremformat{sidebar}
\theorempreskip{\topsep}
\theorempostskip{\topsep}
\theoremheadfont{\bfseries}
\theoremheadpunct{.}
\theoremheadsize{\normalsize}
\theorembodyfont{\upshape}
\theorembodysize{\normalsize}
\theoremleftmargin{0cm}
\theoremrightmargin{0.75cm}
\theoremheadcolor{red}
\theorembodycolor{black}
\theoremsidebarsymbol{\rfilet}
\theoremsidebarbefore{0.75cm}
\theoremsidebarafter{0.75cm}
\theoremsidebarcolor{red}
\thmname{#1}
\thmnumber{~#1}
\thmnote{~({\itshape#1})}
\newtheorem{theoreme}{Théorème}[section]
Comme le package est encore au stade de développement, aucune garantie qu'il n'y ai pas de bugs. Au stade actuel, il permet de faire simplement des choses comme dans ce post et celui-ci.
Pièces jointes
customtheorem.zip
(4.58 Kio) Téléchargé 256 fois
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Merci beaucoup pour ton package! Je vais essayer d'en faire bon usage!
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Est-ce que tu saurais où je peux trouver un tutorial pour apprendre à programmer un package comme tu l'as fait par exemple?

Il se trouve que, sans rentrer dans les détails, je suis autodidacte sur LaTeX, comme la plupart d'entre nous je suppose, mais ma compréhension des codes sources des différents packages est très limitée et je n'arrive donc pas à vraiment apprendre à utiliser toutes ces commandes.

Tout simplement j'ai beaucoup de mal à comprendre le rôle des commandes qui se trouvent dans ton package par exemple.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Malheureusement, il me semble qu'il n'y a pas de tutoriel pour apprendre à programmer les packages en LaTeX. Il y a bien des documents qui expliquent quelle doit être la structure du fichier .sty, mais pas vraiment sur ce qu'il faut mettre dedans.

Pour apprendre à programmer les théorèmes, par exemple, le mieux est de regarder les autres packages sur le sujet (theorem.sty, amsthm.sty, ntheorem.sty) pour voir comment ils font. Les sources sont un peu commentées, donc avec du temps et de la patience, on finit par comprendre comment faire.

Supposons par exemple que l'on veuille faire une commande \newtheorem{theoreme}{Théorème} qui doit :
  • définir un compteur appelé theoreme ;
  • définir un environnement \begin{theoreme}...\end{theoreme} qui doit:
    • incrémenter le compter theoreme (avec \refstepcounter{theoreme}),
    • imprimer \textbf{Théoreme~\thetheoreme.} puis le contenu du théorème.
Pour faire ça, on a besoin de savoir:
  • utiliser \csname ...\endcsname : par exemple \csname theoreme\endcsname produit \theoreme, mais l'avantage est que l'on peut paramétrer l'appel : \csname#1\endcsname produira \theoreme si #1 = theoreme et produira \corollaire si #1 = corollaire ;
  • utiliser \expandafter : un petit détail technique fait que \def\csname theoreme\endcsname{Théorème} ne fonctionne pas pour définir une commande \theoreme imprimant Théorème (TeX croira qu'on veut définir \csname) ; il faut utiliser \expandafter\def\csname theoreme\endcsname{Théorème} à la place ;
  • définir un environnement : en plus de \newenvironment{theoreme}{début}{fin}, on peut définir un environnement \begin{theoreme}...\end{theoreme} en ne définissant que des commandes \theoreme et \endtheoreme qui font ce qui faut, LaTeX s'occupe du reste pour permettre la syntaxe \begin{theoreme}...\end{theoreme}.
Voici une possibilité pour réaliser la commande \newtheorem en question :

Code : Tout sélectionner

\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\def\newtheorem#1#2{%
\newcounter{#1}
\expandafter\def\csname #1\endcsname{\refstepcounter{#1}\textbf{#2~\csname the#1\endcsname.}}
\expandafter\def\csname end#1\endcsname{}
}

\newtheorem{theoreme}{Théorème}
\newtheorem{corollaire}{Corollaire}

\begin{document}

\begin{theoreme}
Bla bla
\end{theoreme}

\begin{corollaire}
Bla bla
\end{corollaire}

\begin{theoreme}
Bla bla
\end{theoreme}

\end{document}
Ceci est la base pour créer des environnements de théorèmes. Si ça t'intéresse, je pourrai t'expliquer plus tard comment faire pour créer une commande \newtheorem qui peut être appelée des façons suivantes :
  • \newtheorem{theoreme}{Théorème} : fait ce qui précède ;
  • \newtheorem{theoreme}{Théorème}[section] : comme \newtheorem{theoreme}{Théorème}, mais le compteur theoreme dépend de section et s'imprime sous la forme \thesection.\thetheoreme ;
  • \newtheoreme{theoreme}[equation]{Théorème} : comme \newtheorem{theoreme}{Théorème}, mais le compteur utilisé n'est plus theoreme, mais equation (les théorèmes et les équations seront donc numérotés de la même façon) ;
  • \newtheorem*{theoreme}{Théorème} : comme \newtheorem{theoreme}{Théorème}, mais aucun numéro n'est utilisé.
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Merci de ton aide.

Je suis tout à fait partant pour que tu m'expliques, quand tu auras le temps, comment faire pour créer les différentes modifications dont tu as parlé.
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Une petite question à laquelle je trouve la réponse nul part : quelle est la signification des @ ou \@ dans les lignes de code? Je me doute que ca parait stupide comme question lol, mais je trouve pas la réponse...

EDIT : Pendant que j'y suis, si ca ne te dérange pas bien sur, j'aimerais bien que tu m'expliques la différence entre \def et \gdef, et à quoi sert le \global qui se trouve devant certain \expandafter de ton package s'il-te-plaît.
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Benjamin a écrit :Une petite question à laquelle je trouve la réponse nul part : quelle est la signification des @ ou \@ dans les lignes de code? Je me doute que ca parait stupide comme question lol, mais je trouve pas la réponse...
La tradition est, quand on programme en LaTeX, que toutes les commandes internes à un package (c'est-à-dire celles que l'utilisateur n'aura pas à utiliser) comportent un @. La raison en est que le caractère @ n'est pas normalement un caractère admis dans les noms de commandes (sauf pour \@, car on peut mettre n'importe quoi comme nom de commande tant qu'il n'y a qu'une seul caractère en plus du \). Pour permettre l'appel d'une commande contenant à @ ou pour définir dans un document .tex une commande utilisant un @, il faut l'entourer de \makeatletter (qui rend le caractère @ normal) et de \makeatother (qui interdit de nouveau l'usage de @ dans les commandes). Dans un fichier .sty appelé par \usepackage{...}, on peut utiliser @ dans les noms de commandes sans utiliser \makeatletter ou \makeatother.
Benjamin a écrit :EDIT : Pendant que j'y suis, si ca ne te dérange pas bien sur, j'aimerais bien que tu m'expliques la différence entre \def et \gdef, et à quoi sert le \global qui se trouve devant certain \expandafter de ton package s'il-te-plaît.
\gdef, c'est la même chose que \global\def. Cela permet de définir des variables globales. Normalement, lorsqu'on est dans un groupe (grosso-modo à l'intérieur de { et } ou de \bgroup et \egroup ou de \begingroup et \endgroup), les définitions sont locales. Exemple :

Code : Tout sélectionner

\documentclass{article}
\begin{document}

\begingroup
\def\bfseries{\itshape}
{\bfseries Texte}
\endgroup

{\bfseries Texte}

\end{document}
Le premier {\bfseries Texte} va donner Texte, tandis que le second va donner Texte. Par contre, si tu remplace \def par \gdef ou \global\def, les deux donneront Texte.

La raison pour laquelle j'ai mis des \global est que cela permet d'être sûr que, même si l'utilisateur mets les \newtheorem dans un groupe, les théorèmes et toutes les commandes associées seront quand même définies partout. Voici un exemple pratique d'utilisation de \newtheorem dans un groupe délimité par { et }:

Code : Tout sélectionner

\documentclass{article}

\usepackage{customtheorem}

\newtheorem{theorem}{Theorem}

{\theoremleftmargin{1cm}
\theoremrightmargin{1cm}
\theoremsize{\small}
\newtheorem{lemma}{Lemma}}

\theorembodyfont{\upshape}
\newtheorem{definition}{Definition}

\begin{document}

\begin{definition}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{definition}

\begin{theorem}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{theorem}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\begin{lemma}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{lemma}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\end{document}
Comme on le voit en compilant ce document, seul le lemme est en caractères plus petits et avec des marges à gauche et à droites, pas la définition qui suit : le fait d'avoir mis les commandes entre { et } les a rendu locales, tandis que la définition de l'environnement lemma a été, elle, globale.

Si tu veux plus de détails sur la différence entre { et }, \bgroup et \egroup ainsi que \begingroup et \endgroup, tu peux consulter ce message de Jean-Côme Charpentier sur le sujet ; c'est peut-être un peu technique, mais très clair et complet.

Une autre propriété dont on peut affubler un \def est \long. Cela sert à dire que la définition est longue, c'est-à-dire qu'il peut y avoir un changement de paragraphe dans son argument. Exemple :

Code : Tout sélectionner

\documentclass{article}
\begin{document}

\long\def\putinbold#1{\begingroup\bfseries #1\endgroup}

\begingroup

\putinbold{Bla bla

Bla bla}

\end{document}
Si on enlève le \long, TeX se plain que le paragraphe s'est terminé avant que \putinbold ne soit fini.

Noter que \newcommand produit toujours des commandes longues, mais pas \newcommand* (avec \newcommand, il faut donc spécifier que la commande n'est pas longue alors qu'avec \def il faut spécifier si elle est longue).

J'essaierai de revenir plus tard ce soir sur la définition de \newtheorem dont je parlais dans mon post précédent.
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Une petite précision sur les @, il n'y a pas de différence entre \@if et \if?

Je vais essayer de créer mon package de théorème, certes à l'image du tiens, mais je pense que ca va m'aider à utiliser toutes ces commandes. Du coup je pense que je vais pas tarder à revenir avec plein de nouvelles questions :D
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Benjamin a écrit :Une petite précision sur les @, il n'y a pas de différence entre \@if et \if?
Où as-tu vu une commande \@if ?
Benjamin a écrit :Je vais essayer de créer mon package de théorème, certes à l'image du tiens, mais je pense que ca va m'aider à utiliser toutes ces commandes.
Essayer de programmer tout seul est effectivement le meilleur moyen d'apprendre. À la base, j'avais essayé de reprendre les principes de base du code de theorem.sty.
pg a écrit : Si ça t'intéresse, je pourrai t'expliquer plus tard comment faire pour créer une commande \newtheorem qui peut être appelée des façons suivantes :
  • \newtheorem{theoreme}{Théorème} : fait ce qui précède ;
  • \newtheorem{theoreme}{Théorème}[section] : comme \newtheorem{theoreme}{Théorème}, mais le compteur theoreme dépend de section et s'imprime sous la forme \thesection.\thetheoreme ;
  • \newtheoreme{theoreme}[equation]{Théorème} : comme \newtheorem{theoreme}{Théorème}, mais le compteur utilisé n'est plus theoreme, mais equation (les théorèmes et les équations seront donc numérotés de la même façon) ;
  • \newtheorem*{theoreme}{Théorème} : comme \newtheorem{theoreme}{Théorème}, mais aucun numéro n'est utilisé.
La première chose à faire est de créer une nouvelle commande \new@theorem (on met un @ dans le nom car c'est une commande interne au package dont l'utilisateur n'aura pas à se servir) qui prend trois arguments :
  • #1 qui est le nom de l'environnement à définir (par exemple theoreme) ;
  • #2 qui est le nom à afficher pour l'environnement (par exemple Théorème) ;
  • #3 qui est le compteur à utiliser ; si #3 est vide, il ne faudra ni incrémenter ni imprimer un quelconque compteur.
Cette commande \new@theorem s'adapte facilement à partir du \newtheorem précédent ; la seule difficulté est le traitement séparé du cas où #3 est vide ou n'est pas vide. Pour cela, on utilise le if appelé \@ifnotempty (qui provient de amsthm.sty). Sa syntaxe est la suivante :

Code : Tout sélectionner

\@ifnotempty{ce qui ne doit pas être vide}{ce qu'on fait si ce n'est pas vide}
En l'occurrence, on sera intéressé par \@ifnotempty{#3}{\refstepcounter{#3}} pour incrémenter le compteur #3 si #3 n'est pas vide et par \@ifempty{#3}{\expandafter the#3\endcsname} pour afficher la valeur du compteur #3 si #3 est non vide.

Voici le code de \new@theorem :

Code : Tout sélectionner

\def\new@theorem#1#2#3{
\expandafter\def\csname #1\endcsname{%
   \@ifnotempty{#3}{\refstepcounter{#3}}%
   \textbf{#2\@ifnotempty{#3}{~\csname the#3\endcsname}.}}
\expandafter\def\csname end#1\endcsname{}
}
Une petite remarque : il faut mettre l'espace qui doit être entre le titre du théorème et le numéro à l'intérieur du \@ifnotempty{#3}{...} sinon la commande imprimera "Remarque ." au lieu de "Remarque.".

Voici un exemple compilable qui illustre l'utilisation de \new@theorem pour définir une remarque qui n'a pas de numéro. Bien sûr, notre but est de pouvoir écrire "\newtheorem*{remarque}{Remarque}" à la place de "\new@theorem{remarque}{Remarque}{}" qui doit être mis entre des \makeatletter et \makeatother.

Code : Tout sélectionner

\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\makeatletter

% macros for checking if (not) empty (from amsthm.sty)

\long\def\@ifempty#1{\@xifempty#1@@..\@nil}
\long\def\@xifempty#1#2@#3#4#5\@nil{%
  \ifx#3#4\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\long\def\@ifnotempty#1{\@ifempty{#1}{}}

% macros pour \newtheorem

\def\newtheorem#1#2{%
\newcounter{#1}
\new@theorem{#1}{#2}{#1}
}
\def\new@theorem#1#2#3{
\expandafter\def\csname #1\endcsname{%
   \@ifnotempty{#3}{\refstepcounter{#3}}%
   \textbf{#2\@ifnotempty{#3}{~\csname the#3\endcsname}.}}
\expandafter\def\csname end#1\endcsname{}
}
\makeatother

\newtheorem{theoreme}{Théorème}
\newtheorem{corollaire}{Corollaire}

\makeatletter
\new@theorem{remarque}{Remarque}{}
\makeatother

\begin{document}

\begin{theoreme}
Bla bla
\end{theoreme}

\begin{corollaire}
Bla bla
\end{corollaire}

\begin{theoreme}
Bla bla
\end{theoreme}

\begin{remarque}
Bla bla
\end{remarque}

\end{document}
Passons à la deuxième étape : rediriger la commande \newtheorem, selon sa syntaxe, sur le bon appel de \new@theorem, à savoir :
  • \newtheorem*{theoreme}{Théorème} doit appeler \new@theorem{theoreme}{Théorème}{}, sans créer bien sûr aucun compteur ;
  • \newtheorem{theoreme}[equation]{Théorème} doit appeler \new@theorem{theoreme}{Théorème}{equation}, sans créer là non plus aucun compteur ;
  • \newtheorem{theoreme}{Théorème}[section] doit créer un compteur theoreme, le faire dépendre de section (c'est-à-dire que lorsque section augmente de 1, theoreme est remis à zéro) et faire en sorte que \thetheoreme affiche \thesection.\arabic{theoreme} puis appeler \new@theorem{theoreme}{Théorème}{theoreme}.
  • \newtheorem{theoreme}{Théorème} doit créer un compteur theoreme et appeler \new@theorem{theoreme}{Théorème}{theoreme} ;
Pour réaliser ceci, le principe est le suivant :
  • on teste s'il y une étoile qui suit \newtheorem ;
  • s'il est suivi d'une étoile, on fait ce qu'on vient de décrire pour \newtheorem*{theoreme}{Théorème} ;
  • s'il n'est pas suivi d'une étoile, on teste si son premier argument (à savoir {theoreme}) est suivi d'un crochet ouvrant ;
  • si tel est le cas, on fait ce qu'on vient de dire pour \newtheorem{theoreme}[equation]{Théorème} ;
  • si tel n'est pas le cas, on teste si le deuxième argument (à savoir {Théorème}) est suivi d'un crochet ouvrant ;
  • si tel est le cas, on fait ce qu'on vient de décrire pour \newtheorem{theoreme}{Théorème}[section] ;
  • si tel n'est pas le cas, on fait ce qu'on vient de décrire pour \newtheorem{theoreme}{Théorème}.
Pour tester si une étoile suit une commande, on peut utiliser \@ifstar. Voici un exemple, qui crée une commande \abs telle que \abs{x} est la même chose que |x| mais \abs*{x} est la même chose que \left|x\right| (c'est à peu près ce que fait la commande \DeclarePairedDelimiter du package mathtools) :

Code : Tout sélectionner

\documentclass{article}

\makeatletter
\def\abs{\@ifstar\abs@star\abs@nostar}
\def\abs@star#1{\left|#1\right|}
\def\abs@nostar#1{\mathopen{|}#1\mathclose{|}}
\makeatother

\begin{document}

\[\abs{-\frac{1}{2}}\abs*{-\frac{1}{2}}\]

\end{document}
Quelques remarques :
  • \abs@star et \abs@nostar ont des @ dans leurs noms car ce sont des commandes internes ;
  • la syntaxe de \@ifstar est toujours du type \@ifstar\abs@star\abs@nostar où \abs@star est ce qui doit être exécuté s'il y a une étoile et \abs@nostar ce qui doit être fait s'il n'y en n'a pas ; définir une commande étoilée requiert donc de définir trois commandes au lieu d'une.
Pour faire des commandes testant s'il y a un crochet ouvrant après, c'est le même principe :

Code : Tout sélectionner

\documentclass{article}

\makeatletter
\def\vect#1{\@ifnextchar[{\vect@opt{#1}}{\vect@nopt{#1}}}
\def\vect@opt#1[#2]{(#1_{1},\dots,#1_{#2})}
\def\vect@nopt#1{(#1_{1},\dots,#1_{n})}
\makeatother

\begin{document}

\[\vect{x} \vect{x}[5]\]

\end{document}
Une petite remarque : à la différence de \@ifstar (après qui on n'a plus à s'occuper de l'étoile), ici, après \@ifnextchar[, il faut mettre explicitement dans la définition de \vect@opt le crochet et son contenu.

Si on préfère la syntaxe \vect[5]{x} (qui serait ce que LaTeX ferai avec \newcommand), c'est facile d'adapter :

Code : Tout sélectionner

\documentclass{article}

\makeatletter
\def\vect{\@ifnextchar[{\vect@opt}{\vect@nopt}}
\def\vect@opt[#1]#2{(#2_{1},\dots,#2_{#1})}
\def\vect@nopt#1{(#1_{1},\dots,#1_{n})}
\makeatother

\begin{document}

\[\vect{x} \vect[5]{x}\]

\end{document}
Armé de tout ceci, on va définir successivement tous les cas possibles pour \newtheorem. Première étape, on teste s'il y a une étoile après. Si tel est le cas, on appelle \newtheorem@star et sinon, on appelle \newtheorem@nostar :

Code : Tout sélectionner

\def\newtheorem{%

  \@ifstar{\newtheorem@star}{\newtheorem@nostar}}
La définition de \newtheorem@star se fait comme on l'a dit tout à l'heure, à savoir qu'on appelle juste \new@theorem avec un troisième argument vide.

Code : Tout sélectionner

\def\newtheorem@star#1#2{\new@theorem{#1}{#2}{}}
Pour \newtheorem@nostar, il faut tester si son argument est suivit ou non d'un crochet ouvrant. Si tel est le cas, on appelle \@othm et sinon, on appelle \@nthm :

Code : Tout sélectionner

\def\newtheorem@nostar#1{%
  \@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}
Conformément aux spécifications précédentes, la commande \othm doit appeller \new@theorem en utilisant pour compteur ce qui est entre crochets :

Code : Tout sélectionner

\def\@othm#1[#2]#3{\new@theorem{#1}{#3}{#2}}
La commande \nothm, quant à elle, doit tester si son deuxième argument est suivi ou non d'un crochet :

Code : Tout sélectionner

\def\@nthm#1#2{%
  \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}}
S'il y a un crochet, c'est \@xnthm qui est appelé et qui doit définir le compteur #1 et le faire dépendre de ce qui est entre crochets puis appeler \new@theorem :

Code : Tout sélectionner

\def\@xnthm#1#2[#3]{\newcounter{#1}[#3]%
  \expandafter\gdef\csname the#1\endcsname{\csname the#3\endcsname.\arabic{#1}}
  \new@theorem{#1}{#2}{#1}}
Finalement, \@ynthm définit juste un compteur puis appelle le \new@theorem correspondant :

Code : Tout sélectionner

\def\@ynthm#1#2{\newcounter{#1}\new@theorem{#1}{#2}{#1}}
En mettant bout à bout tout ça, on obtient le bout de code suivant :

Code : Tout sélectionner

\documentclass{article}

\usepackage[latin1]{inputenc}
\usepackage[francais]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\makeatletter

% macros for checking if (not) empty (from amsthm.sty)

\long\def\@ifempty#1{\@xifempty#1@@..\@nil}
\long\def\@xifempty#1#2@#3#4#5\@nil{%
  \ifx#3#4\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}
\long\def\@ifnotempty#1{\@ifempty{#1}{}}

% macros pour \newtheorem

\def\newtheorem{%
  \@ifstar{\newtheorem@star}{\newtheorem@nostar}}
\def\newtheorem@star#1#2{\new@theorem{#1}{#2}{}}
\def\newtheorem@nostar#1{%
  \@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}
\def\@othm#1[#2]#3{\new@theorem{#1}{#3}{#2}}
\def\@nthm#1#2{%
  \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}}
\def\@xnthm#1#2[#3]{\newcounter{#1}[#3]%
  \expandafter\gdef\csname the#1\endcsname{\csname the#3\endcsname.\arabic{#1}}
  \new@theorem{#1}{#2}{#1}}
\def\@ynthm#1#2{\newcounter{#1}\new@theorem{#1}{#2}{#1}}
\def\new@theorem#1#2#3{
\expandafter\def\csname #1\endcsname{%
   \@ifnotempty{#3}{\refstepcounter{#3}}%
   \textbf{#2\@ifnotempty{#3}{~\csname the#3\endcsname}.}}
\expandafter\def\csname end#1\endcsname{}
}
\makeatother

\newtheorem{theoreme}{Théorème}[section]
\newtheorem{corollaire}[theoreme]{Corollaire}
\newtheorem*{remarque}{Remarque}
\newtheorem{axiome}{Axiome}

\begin{document}

\section{Titre}

\begin{axiome}
Bla bla
\end{axiome}

\begin{theoreme}
Bla bla
\end{theoreme}

\begin{corollaire}
Bla bla
\end{corollaire}

\begin{theoreme}
Bla bla
\end{theoreme}

\begin{remarque}
Bla bla
\end{remarque}

\end{document}
Au sommaire du prochain numéro :
  • gérer les arguments optionnels pour les environnements de théorèmes, comme dans \begin{theoreme}[des valeurs intermédiaires]...\end{theoreme} (pas très dur une fois qu'on sait tester si une commande est suivie d'un crochet)
  • permettre de changer le style du titre et du corps du théorème avec des commandes du type \theorembodyfont{\itshape} et \theoremheadfont{\scshape}
Après cela, l'aspect programmation de l'interface sera à peu près terminé. Il restera à voir comment bien formater un théorème (ici, nos théorèmes ne font juste qu'imprimer \textbf{Théorème~1.} Bla bla et puis c'est tout, ce qui est un peu rudimentaire).
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Merci infiniment, je m'en sors beaucoup mieux maintenant!

Une petite précision : la commande \@ifempty ne prend elle pas 3 arguments?

Code : Tout sélectionner

\@ifempty{ce qui doit etre vide}{ce que l'on fait si c'est vide}{ce que l'on fait si ce n'est pas vide}
Est-ce que tu pourrais aussi m'expliquer à quoi servent les commandes \@iden et \topsep, pourquoi on place régulièrement un % à la fin de chaque ligne, et aussi la différence entre un \let et un \def s'il te plait?

Vivement le prochain numéro :D (je pense déjà avoir réussi à écrire le code pour l'argument optionnel, je suis fier de moi lol).
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Benjamin a écrit :Une petite précision : la commande \@ifempty ne prend elle pas 3 arguments?

Code : Tout sélectionner

\@ifempty{ce qui doit etre vide}{ce que l'on fait si c'est vide}{ce que l'on fait si ce n'est pas vide}
C'est bien ça. Ensuite, \@ifnotempty est juste défini par \@ifnotempty{#1}{#2}=\@ifempty{#1}{}{#2} donc n'a plus que deux arguments.
Benjamin a écrit :Est-ce que tu pourrais aussi m'expliquer à quoi servent les commandes \@iden et \topsep, pourquoi on place régulièrement un % à la fin de chaque ligne, et aussi la différence entre un \let et un \def s'il te plait?
Pour \@iden et pour la différence entre \let et \def, j'en parlerai dans mon prochain message.

\topsep est une longueur utilisée par LaTeX principalement dans les listes (c'est l'espace mis au début et à la fin de la liste). Pour connaître sa valeur standard, compiler le document suivant et regarder dans le fichier .log correspondant (en compilant en mode interactif, latex devrait s'arrêter pour montrer la valeur) :

Code : Tout sélectionner

\documentclass{article}
\begin{document}
\showthe\topsep
\end{document}
Résultat : 8pt plus 2pt minus 4pt ; la valeur sera donc comprise entre 4pt et 10pt, selon la place disponible sur la page.

Les % en fin de ligne sont là pour empêcher tout risque d'espace parasite (un saut de ligne est considéré par TeX comme un espace). Voici un exemple qui montre ce phénomène :

Code : Tout sélectionner

\documentclass{article}
\def\onewithspace{
1}
\def\onewithoutspace{%
1}
\begin{document}
X\onewithspace X

X\onewithoutspace X
\end{document}
Les règles de prise en compte ou non des espaces sont un peu complexes, donc pour être prudent, il vaut mieux en mettre partout en fin de ligne ; une exception notable : après une commande comme \noindent, \par, etc., pas besoin, l'espace est automatiquement enlevé.

L'ajout d'un espace à la fin de ligne est d'ailleurs ce qui donne une espace entre "Théorème 1." et "Bla bla." lorsqu'on utilise le code de mes messages précédents dans

Code : Tout sélectionner

\begin{theoreme}
Bla bla.
\end{theoreme}
mais pas si on tape:

Code : Tout sélectionner

\begin{theoreme}Bla bla.\end{theoreme}
J'avais prévu d'en parler plus tard, mais pour éviter ce genre de désagrément, il suffit de rajouter l'espace après le point dans le code de \new@theorem et de mettre un \ignorespaces après ; plus précisément, il faut changer \new@theorem en

Code : Tout sélectionner

\def\new@theorem#1#2#3{
\expandafter\def\csname #1\endcsname{%
   \@ifnotempty{#3}{\refstepcounter{#3}}%
   \textbf{#2\@ifnotempty{#3}{~\csname the#3\endcsname}.~}\ignorespaces}
\expandafter\def\csname end#1\endcsname{}
}
Ce message est déjà un peu long, donc j'écrirai la suite plus tard ce soir.
Benjamin

Re: Belle mise en page de théorème

Message non lu par Benjamin »

Y a un petit truc qui me gène dans la programmation du format sidebar c'est qu'il n'accepte pas de saut de page... C'est possible de le modifier pour éviter ce problème?

Et une petite question au passage, à quoi sert la commande \relax?
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2613
Inscription : vendredi 15 juin 2007, 00:31

Re: Belle mise en page de théorème

Message non lu par pg »

Benjamin a écrit :à quoi sert la commande \relax?
\relax dit à TeX de ne rien faire, ce qui a souvent pour effet de le stopper dans son élan. Voici un exemple :

Code : Tout sélectionner

\documentclass{article}
\begin{document}
X\hskip 1cm plus 1cmX

X\hskip 1cm\relax plus 1cmX
\end{document}
Benjamin a écrit :Y a un petit truc qui me gène dans la programmation du format sidebar c'est qu'il n'accepte pas de saut de page... C'est possible de le modifier pour éviter ce problème?
Oui, c'est possible, avec le package boites :

Code : Tout sélectionner

\documentclass{article}

\usepackage{graphicx}
\usepackage{calc}

\usepackage{mathabx}
\newcommand{\theoremsidebarsymbol}{\lfilet}

\usepackage{boites}

\newlength{\saveparindent}
\setlength{\saveparindent}{\parindent}
\def\breakboxparindent{\saveparindent}
\makeatletter
\newdimen\bk@hauteurcourrante
\newdimen\bk@hauteursuivante
\newdimen\bk@tempdimen
\def\wavelinebox{%
  \def\bk@espace{ }%
  \def\pt@to@bp##1{##1=.99627393548##1}% 1bp=1.00374pt
  \def\bkvz@before@breakbox{\ifhmode\par\fi\vskip\breakboxskip\bk@hauteurcourrante=1200bp}%
  \setlength{\bk@tempdimen}{\widthof{$\big\theoremsidebarsymbol$}}
  \def\bkvz@set@linewidth{%
     \advance\linewidth -7.5bp
     \advance\linewidth \bk@tempdimen
     \advance\linewidth -0.75cm
     \advance\linewidth -0.75cm
     \advance\linewidth -0.75cm}%
  \def\bkvz@left{%
     \hspace{0.75cm}%
     \raisebox{0pt}[0pt][0pt]{$\big\theoremsidebarsymbol$}%
     \hspace{0.75cm}}%
  \let\bkvz@right\relax
  \def\bkvz@top{\noindent \textbf{Theorem~1.1}\par\nobreak\vspace{3pt}}
  \let\bkvz@bottom\relax
  \breakbox}
\def\endwavelinebox{\endbreakbox}
\makeatother

\begin{document}

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.

\begin{wavelinebox}
Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.
\end{wavelinebox}

\end{document}
Tu peux essayer de remplacer le format sidebar du package par ce code (si tu as des difficultés, on regardera ça ensemble).
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message