Changer rang numérotation théorèmes dans box — Les-mathematiques.net The most powerful custom community solution in the world

Changer rang numérotation théorèmes dans box

Bonsoir,

Dans le code suivant trouvé sur internet, j'aimerais que la numérotation des théorèmes se fasse en fonction de la section. Comment dois-je modifier ce code ?
D'autre part, j'aimerais dupliquer ceci pour des propositions et lemmes, mais en changeant les couleurs, comment puis-je faire pour ne pas avoir à recopier 3 fois ce code ?

Merci par avance et bonne soirée
\documentclass{article}
\usepackage{amsmath}
\makeatletter
%%%%%%%%%%%%%%%%%%% debut fichier boiboites.sty %%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{xkeyval}
\RequirePackage{tikz}
\RequirePackage{amssymb}

\define@key{boxedtheorem}{titlecolor}{\def\titlecolor{#1}}
\define@key{boxedtheorem}{titlebackground}{\def\titlebackground{#1}}
\define@key{boxedtheorem}{background}{\def\background{#1}}
\define@key{boxedtheorem}{titleboxcolor}{\def\titleboxcolor{#1}}
\define@key{boxedtheorem}{boxcolor}{\def\boxcolor{#1}}
\define@key{boxedtheorem}{thcounter}{\def\thcounter{#1}}
\define@key{boxedtheorem}{size}{\def\size{#1}}
\presetkeys{boxedtheorem}{titlecolor = black, titlebackground = white, background = white,%
                         titleboxcolor = black, boxcolor = black, thcounter=, size = .9\textwidth}{}

\newcommand{\couleurs}[1][]{%
    \setkeys{boxedtheorem}{#1}
    \tikzstyle{fancytitle} =[draw=\titleboxcolor, rounded corners, fill=\titlebackground,
                            text= \titlecolor]
    \tikzstyle{mybox} = [draw=\boxcolor, fill=\background, very thick,
                        rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
}


%Commande generique pour faire un joli encadre
\newsavebox{\boiboite}
\newcommand{\titre}{Titre}
\newenvironment{boite}[2][]%
    {%
    \renewcommand{\titre}{#2}
    \couleurs[#1]
    \begin{lrbox}{\boiboite}%
     \begin{minipage}[!h]{\size}
    }%
    {%
     \end{minipage}
    \end{lrbox}
    \begin{center}
    \begin{tikzpicture}
    \node [mybox] (box){\usebox{\boiboite}};
    \node[fancytitle, right=10pt] at (box.north west) {\titre};
    \end{tikzpicture}
    \end{center}
    }

\newcommand{\newboxedtheorem}[4][]{%
    \couleurs[#1]
    \@ifnotempty{#4}{%
      \@ifundefined{the#4}{\@ifundefined{\thcounter}{\newcounter{#4}}{%
      \newcounter{#4}[\thcounter ] } } { }%
    }
    \newenvironment{#2}[1][]{%
    \@ifnotempty{#4}{\refstepcounter{#4}}
    \begin{boite}[#1]{\textbf{#3\@ifnotempty{#4}{ \csname the#4\endcsname}}\@ifnotempty{##1}{
    (##1)}}
    }%
    {%
    \end{boite}
    }
}
%%%%%%%%%%%%%%%%%%%% end fichier boiboites.sty %%%%%%%%%%%%%%%%%%%%%%
\makeatother
\newboxedtheorem{theorem}{Theorem}{theorem}
\begin{document}
\begin{theorem}
Bla bla bla bla.
\end{theorem}
\end{document}

Réponses

  • Bonjour,

    Le code ci-dessus ne me semble pas d'excellente qualité (espaces parasites, utilisation de \tikzstyle obsolète depuis très longtemps, écrasement hardi de \size...), mais il offre la flexibilité nécessaire :
    \newboxedtheorem[thcounter=section]{theorem}{Théorème}{theorem}
    \newboxedtheorem[thcounter=section, background=yellow!20,
                     titlebackground=black!10,
                     titlecolor=blue!60]{lemma}{Lemme}{lemma}
    \renewcommand{\thetheorem}{\thesection.\arabic{theorem}}
    \renewcommand{\thelemma}{\thesection.\arabic{lemma}}
    
    Code complet :
    \documentclass{article}
    \usepackage{amsmath}
    \makeatletter
    %%%%%%%%%%%%%%%%%%% debut fichier boiboites.sty %%%%%%%%%%%%%%%%%%%%%%
    \RequirePackage{xkeyval}
    \RequirePackage{tikz}
    \RequirePackage{amssymb}
    
    \define@key{boxedtheorem}{titlecolor}{\def\titlecolor{#1}}
    \define@key{boxedtheorem}{titlebackground}{\def\titlebackground{#1}}
    \define@key{boxedtheorem}{background}{\def\background{#1}}
    \define@key{boxedtheorem}{titleboxcolor}{\def\titleboxcolor{#1}}
    \define@key{boxedtheorem}{boxcolor}{\def\boxcolor{#1}}
    \define@key{boxedtheorem}{thcounter}{\def\thcounter{#1}}
    \define@key{boxedtheorem}{size}{\def\size{#1}}
    \presetkeys{boxedtheorem}{titlecolor = black, titlebackground = white, background = white,%
                             titleboxcolor = black, boxcolor = black, thcounter=, size = .9\textwidth}{}
    
    \newcommand{\couleurs}[1][]{%
        \setkeys{boxedtheorem}{#1}
        \tikzstyle{fancytitle} =[draw=\titleboxcolor, rounded corners, fill=\titlebackground,
                                text= \titlecolor]
        \tikzstyle{mybox} = [draw=\boxcolor, fill=\background, very thick,
                            rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
    }
    
    
    %Commande generique pour faire un joli encadre
    \newsavebox{\boiboite}
    \newcommand{\titre}{Titre}
    \newenvironment{boite}[2][]%
        {%
        \renewcommand{\titre}{#2}
        \couleurs[#1]
        \begin{lrbox}{\boiboite}%
         \begin{minipage}[!h]{\size}
        }%
        {%
         \end{minipage}
        \end{lrbox}
        \begin{center}
        \begin{tikzpicture}
        \node [mybox] (box){\usebox{\boiboite}};
        \node[fancytitle, right=10pt] at (box.north west) {\titre};
        \end{tikzpicture}
        \end{center}
        }
    
    \newcommand{\newboxedtheorem}[4][]{%
        \couleurs[#1]
        \@ifnotempty{#4}{%
          \@ifundefined{the#4}{\@ifundefined{\thcounter}{\newcounter{#4}}{%
          \newcounter{#4}[\thcounter ] } } { }%
        }
        \newenvironment{#2}[1][]{%
        \@ifnotempty{#4}{\refstepcounter{#4}}
        \begin{boite}[#1]{\textbf{#3\@ifnotempty{#4}{ \csname the#4\endcsname}}\@ifnotempty{##1}{
        (##1)}}
        }%
        {%
        \end{boite}
        }
    }
    %%%%%%%%%%%%%%%%%%%% end fichier boiboites.sty %%%%%%%%%%%%%%%%%%%%%%
    \makeatother
    
    \newboxedtheorem[thcounter=section]{theorem}{Théorème}{theorem}
    \newboxedtheorem[thcounter=section, background=yellow!20,
                     titlebackground=black!10,
                     titlecolor=blue!60]{lemma}{Lemme}{lemma}
    \renewcommand{\thetheorem}{\thesection.\arabic{theorem}}
    \renewcommand{\thelemma}{\thesection.\arabic{lemma}}
    
    \begin{document}
    
    \section{Une section}
    
    \begin{theorem}
    Bla bla bla bla.
    \end{theorem}
    
    \begin{lemma}
      Pouet.
    \end{lemma}
    
    \begin{theorem}
      Blob.
    \end{theorem}
    
    \section{Une autre section}
    
    \begin{theorem}
      Et un.
    \end{theorem}
    
    \begin{lemma}
      Et deux.
    \end{lemma}
    
    \begin{lemma}
      Et trois.
    \end{lemma}
    
    \begin{theorem}
      Foo.
    \end{theorem}
    
    \end{document}
    
    Je conseillerais plutôt d'utiliser tcolorbox, avec le style attach boxed title to top left pour obtenir un design similaire :
    \documentclass{article}
    \usepackage{amsthm}
    \usepackage{varwidth}
    \usepackage{tcolorbox}
    \tcbuselibrary{skins, theorems}
    
    \tcbset{
      my box/.style={
        enhanced,
        before skip=2mm, after skip=2mm,
        colbacktitle=black!10,
        colback=black!5, colframe=black!70, boxrule=0.2mm,
        attach boxed title to top left={
          xshift=10pt, yshift*=\dimexpr -\tcboxedtitleheight/2\relax},
        boxed title style={arc=1ex, boxrule=0.5pt},
        varwidth boxed title*=-3cm,
        fonttitle=\bfseries,
        #1,
      },
    }
    
    \tcbset{
      separator sign none,
      description delimiters parenthesis,
      label separator=-,
    }
    
    \newtcbtheorem[number within=section]{theorem}{Théorème}
      {my box={colbacktitle=blue!30}}
      {th}
    \newtcbtheorem[number within=section]{lemma}{Lemme}
      {my box={colback=yellow!20, coltitle=blue!60, colbacktitle=black!10}}
      {lemme}
    
    \begin{document}
    
    \section{Première section}
    
    \begin{lemma}{}{technique}
    Petit lemme.
    \end{lemma}
    
    \begin{proof}
      Facile. Je l'ai écrite dans la marge d'un cahier ; hélas, je n'arrive plus à
      mettre la main dessus...
    \end{proof}
    
    \begin{theorem}{Théorème de Pat}{pat}
    Ce théorème est le numéro~\ref{th-pat}, il se trouve page~\pageref{th-pat} et
    s'appuie sur le lemme~\ref{lemme-technique}.
    \end{theorem}
    
    Une conséquence immédiate de ce résultat est le théorème~\ref{th-compl-foo}.
    
    \begin{theorem}{Foo}{compl-foo}
    Conséquence triviale du théorème~\ref{th-pat}.
    \end{theorem}
    
    \begin{theorem}{}{}
    Théorème sans nom.
    \end{theorem}
    
    \begin{theorem*}{non numéroté}
    Bla bla.
    \end{theorem*}
    
    \section{Deuxième section}
    
    \begin{theorem}{}{}
    Théorème sans nom.
    \end{theorem}
    
    \begin{lemma}{}{}
    Un lemme.
    \end{lemma}
    
    \begin{lemma}{}{}
    Un autre lemme.
    \end{lemma}
    
    \begin{theorem}{Bar}{bar}
    Résultat très important.
    \end{theorem}
    
    \end{document}
    
    Voir aussi ce message qui fait à peu près la même chose.119172
    119174
  • Bonjour Brian, merci beaucoup ! En effet la seconde version avec tcolorbox est plus simple !
    bonne journée
  • Bonjour

    Comment faire en sorte que ce ne soit pas Proof. qui s'affiche, mais Preuve :, ou tout autre chose ?

    Merci par avance.

    Bien cordialement,

    Thierry
  • Bonjour Thierry,

    Déjà, avec \usepackage[french]{babel}, l'environnement proof s'annonce comme « Démonstration » dès que l'on est en français. Ensuite, si l'on veut choisir un autre terme, il suffit de faire comme indiqué à FdP il y a cinq jours :
    \def\frenchproofname{Preuve}
    
    ou bien (un peu plus LaTeX) :
    \renewcommand*{\frenchproofname}{Preuve}
    
    Je mets un exemple complet en attachement.119220
  • Bonjour Brian

    C'est superbe. Je te remercie.

    Autre question : j'y pense maintenant. Comment faire pour avoir la police Euler pour les textes mathématiques et une autre police différente pour le texte classique, s'il te plait ? Je te remercie par avance. Je n'ai jamais réussi à bien gérer les polices.

    Amicalement,

    Thierry
  • As-tu essayé avec \usepackage{euler} ? Il vaut mieux le charger assez tôt, a priori.
  • Brian

    Je veux vraiment te remercier pour ton investissement, dont le résultat incroyable qui se trouve ici. C'est au delà de ce que j'attendais. Je te remercie du fond du cœur, vraiment. C'est bien de n'être limité par presque rien ; tu peux rédiger tout ce que tu veux.

    Concernant ta question : oui, mais sans résultat probant. En fait je voudrais le texte mathématique uniquement en Euler. Le texte basique doit être rédigé avec une autre police que je te laisse le soin de choisir. En plus, l'idéal serait d'avoir les preuves légèrement plus petites (paramétrables pour ce qui est de la taille). Je ne sais pas si c'est possible. Je te remercie par avance.

    Amicalement,

    Thierry
  • Si \usepackage{euler} ne fait rien, cela doit être ton document qui fait quelque chose de spécial. J'ai pris l'exemple de tout à l'heure et ajouté \usepackage{euler}, cela m'a donné Computer Modern pour le texte et Euler pour les maths. Si je mets en plus :
    \usepackage{lmodern}
    \usepackage{euler}
    \usepackage[T1]{fontenc}
    
    eh bien, j'ai Latin Modern pour le texte et Euler pour les maths (voir capture d'écran ci-dessous). On peut le vérifier avec \showoutput qui montre, pour chaque glyphe, le nom de la police utilisée (du point de vue de TeX). Par exemple, ceci :
    ....\T1/lmr/m/n/10 L
    ....\T1/lmr/m/n/10 o
    ....\T1/lmr/m/n/10 r
    ....\T1/lmr/m/n/10 e
    ....\T1/lmr/m/n/10 m
    
    est un Lorem écrit avec Latin Modern, ça ne fait aucun doute.

    Je ne peux pas te dire quelle police texte irait bien avec Euler. C'est un choix de typographe, ce que je ne suis pas, et je n'ai pas le temps de faire des essais avec diverses polices de texte. Tu peux regarder les packages beton et concrete — lequel se contente de charger beton et euler sans option —, mais il faut s'attendre à ce que tout ne soit pas disponible dans toutes les variantes (gras, etc.), tous les codages (T1 si l'on écrit en français et que l'on compile avec le moteur pdfTeX) et en format vectoriel (PostScript Type 1, TrueType ou OpenType).

    Ce sont des polices et packages anciens. Si c'est un nouveau document qui commence, tu pourrais peut-être essayer fontspec et unicode-math avec Neo Euler comme indiqué ici (TeX.SE) — en compilant avec la commande 'lualatex', par exemple.

    L'exemple de tout à l'heure avec Latin Modern pour le texte et Euler pour les maths :
    \documentclass{article}
    \usepackage{lmodern}
    \usepackage{euler}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{amsfonts}
    \usepackage{tikz}
    \usetikzlibrary{tikzmark}
    \usepackage{lipsum}
    
    \newcommand*{\carre}{\mathrel{\square}}
    % \showoutput
    
    \begin{document}
    
    \lipsum[1][1-2]
    \begin{tikzpicture}[remember picture, baseline=(n.base)]
    \node (n)
      {$\tikzmarknode{n1}{\tau} \lor \lnot \in {}
        \mathrel{\tikzmarknode{n2}{\carre}} A' \in {}
        \mathrel{\tikzmarknode{n3}{\carre}} A''.$};
    \coordinate (p) at ([yshift=-0.5ex] n.north); % définit l'altitude de base
    \draw ([xshift=0.1em]  n1 |- p) -- ++(0,1ex)   -| (n2 |- p);
    \draw ([xshift=-0.1em] n1 |- p) -- ++(0,1.6ex) -| (n3 |- p);
    \end{tikzpicture}
    $ y = ax+b, 3=2z+1.$ % virgule et point d'Euler
    
    \end{document}
    
    P.S. : tout cela semble relever d'un sujet différent de celui du fil...119228
  • Quant à cette question que j'avais oubliée :
    En plus, l'idéal serait d'avoir les preuves légèrement plus petites (paramétrables pour ce qui est de la taille).
    il est possible de modifier la commande \proof (en fait, il s'agit de \\proof qui est utilisée en interne) en utilisant le package xpatch :
    \usepackage{xpatch}
    \xpatchcmd{\proof}{\normalfont}{\normalfont\small}{}{\ERROR}
    
    J'espère que cela ne va pas rendre les preuves difficiles à lire !
  • Brian

    Je te remercie infiniment. Vraiment, c'est remarquable, spectaculaire. J'ai les réponses à mes questions.

    Amicalement,

    Thierry

    PS : merci, merci et un grand merci pour tout.
  • Content que tu sois content. :-)
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!