Belle mise en page de théorème
Belle mise en page de théorème
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!
Re: Belle mise en page de théorème
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}
Re: Belle mise en page de théorème
Re: Belle mise en page de théorème
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}
Re: Belle mise en page de théorème
un petit lien vers la doc http://www.pps.jussieu.fr/~beffara/soft/thmbox.pdf et sinon le tout se trouve sur ctan.
Re: Belle mise en page de théorème
Merci de ton aide!
Re: Belle mise en page de théorème
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}
Re: Belle mise en page de théorème
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).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 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é) :
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}
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]
- Pièces jointes
-
- customtheorem.zip
- (4.58 Kio) Téléchargé 256 fois
Re: Belle mise en page de théorème
Re: Belle mise en page de théorème
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.
Re: Belle mise en page de théorème
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.
- 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}.
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}
- \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é.
Re: Belle mise en page de théorème
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é.
Re: Belle mise en page de théorème
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.
Re: Belle mise en page de théorème
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 :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...
\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 :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.
Code : Tout sélectionner
\documentclass{article}
\begin{document}
\begingroup
\def\bfseries{\itshape}
{\bfseries Texte}
\endgroup
{\bfseries Texte}
\end{document}
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}
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}
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.
Re: Belle mise en page de théorème
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
Re: Belle mise en page de théorème
Où as-tu vu une commande \@if ?Benjamin a écrit :Une petite précision sur les @, il n'y a pas de différence entre \@if et \if?
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.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.
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 :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é.
- #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.
Code : Tout sélectionner
\@ifnotempty{ce qui ne doit pas être vide}{ce qu'on fait si ce n'est pas 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{}
}
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}
- \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} ;
- 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}.
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}
- \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.
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}
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}
Code : Tout sélectionner
\def\newtheorem{%
\@ifstar{\newtheorem@star}{\newtheorem@nostar}}
Code : Tout sélectionner
\def\newtheorem@star#1#2{\new@theorem{#1}{#2}{}}
Code : Tout sélectionner
\def\newtheorem@nostar#1{%
\@ifnextchar[{\@othm{#1}}{\@nthm{#1}}}
Code : Tout sélectionner
\def\@othm#1[#2]#3{\new@theorem{#1}{#3}{#2}}
Code : Tout sélectionner
\def\@nthm#1#2{%
\@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}}
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}}
Code : Tout sélectionner
\def\@ynthm#1#2{\newcounter{#1}\new@theorem{#1}{#2}{#1}}
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}
- 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}
Re: Belle mise en page de théorème
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}
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).
Re: Belle mise en page de théorème
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 :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}
Pour \@iden et pour la différence entre \let et \def, j'en parlerai dans mon prochain message.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?
\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}
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}
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}
Code : Tout sélectionner
\begin{theoreme}Bla bla.\end{theoreme}
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{}
}
Re: Belle mise en page de théorème
Et une petite question au passage, à quoi sert la commande \relax?
Re: Belle mise en page de théorème
\relax dit à TeX de ne rien faire, ce qui a souvent pour effet de le stopper dans son élan. Voici un exemple :Benjamin a écrit :à quoi sert la commande \relax?
Code : Tout sélectionner
\documentclass{article}
\begin{document}
X\hskip 1cm plus 1cmX
X\hskip 1cm\relax plus 1cmX
\end{document}
Oui, c'est possible, avec le package boites :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?
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}
-
- Sujets similaires
- Réponses
- Vues
- Dernier message
-
- 1 Réponses
- 429 Vues
-
Dernier message par MB