Environnements imbriqués... — Les-mathematiques.net The most powerful custom community solution in the world

Environnements imbriqués...

Bonjour

Est-il possible de concevoir un environnement qui va agir sur d'autres environnements (choisis) en respectant les conditions suivantes :
  • La taille de la police (texte et mathématique) doit être réduite en fonction d'un paramètre (taille, pourcentage, ...).
  • Le paragraphe doit pouvoir être décalé de la gauche d'un certain nombre de cm choisi également.
Je vous remercie par avance.
Bien cordialement,
Thierry

Réponses

  • Bonjour,

    Le premier point a l'air facile avec le package relsize (non testé). Pour le deuxième point, je verrais un environnement \list, \trivlist ou un environnement du package enumitem, en jouant notamment sur le paramètre \leftmargin (voir ici pour une illustration des différents paramètres disponibles).

    Avant de proposer quelque chose de plus précis (si nécessaire), je voudrais des précisions :
    • Est-ce qu'enumitem est déjà utilisé dans ton document (ou est-il prévu qu'il le sera à terme) ?
    • Il me semble que ce décalage à gauche va d'être très laid. Et que faire du côté droit ? La longueur des lignes reste-t-elle constante, est-elle augmentée de la valeur du décalage à gauche ?..
    Comme toujours, un petit dessin, même à main levée, permet de se faire une meilleure idée.

    Attention : dans les \item d'un environnement de liste, on peut mettre des paragraphes, des formules mathématiques, voire des appels à \includegraphics, mais pas absolument n'importe quoi. Notamment, je pense que les commandes de sectionnement (\section, etc.) y causeraient de gros problèmes.
  • Bonsoir Brian

    Pour illustrer les choses, voici deux exemples extraits du livre d'algèbre de Bourbaki. A noter que l'environnement "Remarque" existe sous sa version normale, ce qui n'est pas le cas de l'environnement "Exemple". Là, nous avons affaire à une version condensée. Dans les deux cas, il s'agit de listes numérotées, mais il existe des exemples où tel n'est pas le cas. Peut-être est-il plus simple de créer de nouveaux environnements ; mais je ne sais pas faire.

    Je te remercie pour ton investissement.

    Amicalement

    Thierry122134
    122136
  • Tu veux retranscrire tout Bourbaki ? X:-(

    Merci pour l'image : c'est beaucoup plus parlant. J'avais compris le retrait à gauche dans l'autre sens ; c'est pour ça que je pensais que ce serait horrible...

    Je m'inspire de l'environnement standard 'quotation', qui s'appuie sur l'environnement standard 'list'. Comme tous les environnements de liste, il a des propriétés sympathiques (c'est un petit peu simplifié, mais très raisonnable) :
    • espace vertical supplémentaire avant et après (\partopsep) si l'environnement est précédé d'une ligne blanche ou de \par ;
    • après l'environnement, boîte d'indentation supprimée si l'environnement n'est pas suivi d'une ligne blanche ni de \par ;
    • coupure de page interdite après la première ligne d'un item qui suit immédiatement un titre de section, de sous-section, etc. (à tester avec du vrai texte, pas avec \lipsum qui fait un groupe et casse ce petit mécanisme).
    Pour la taille, comme tu peux le voir, ça se règle comme indiqué pour \smaller dans la documentation de relsize (1, 2, 3... de plus en plus petit). On pourrait accepter des mots-clés en lieu et place des nombres si tu préfères.
    \documentclass{article}
    % \usepackage{xparse} % seulement nécessaire si LaTeX plus vieux que 2020-10-01
    \usepackage{relsize}
    \usepackage{lipsum}             % texte bidon
    
    \ExplSyntaxOn % Entre autres : les espaces sont ignorés, mais ~ les remplace.
    \NewDocumentEnvironment { retrait } { O{1} m }
      {
        \begin{list} { }            % argument vide du fait de \ExplSyntaxOn
          {
            \setlength {\itemindent}    {0pt}
            \setlength {\rightmargin}   {0pt}
            \setlength {\leftmargin}    {2.5em}
            \setlength {\parsep}        {0pt plus 1pt}
            \smaller[#1] % Ceci affecte les unités 'em' et 'ex'.
            \setlength {\listparindent} {1.5em}
          }
        \item \relax
        \textit{#2.} ~ --- ~ \ignorespaces % les ~ sont des espaces, ici
      }
      { \end{list} }
    \ExplSyntaxOff
    
    \begin{document}
    
    \lipsum[1][1-3]
    
    \begin{retrait}{Remarques}      % == \begin{retrait}[1]{Remarques}
      \lipsum[2][1-4]
    
      \lipsum[3][1-5]
    \end{retrait}
    
    \begin{retrait}[2]{Remarques}   % plus petit
      \lipsum[2][1-4]
    
      \lipsum[3][1-5]
    \end{retrait}
    abcd                            % pas de ligne blanche avant
    
    \begin{retrait}[3]{Remarques}   % encore plus petit
      \lipsum[2][1-4]
    
      \lipsum[3][1-5]
    \end{retrait}
    
    efgh                            % ligne blanche avant
    
    \end{document}
    
    122148
  • [large]Bonjour Brian

    J'espère que tu vas bien. Je te remercie pour ton investissement.

    Question : est-il possible de modifier le code pour numéroter comme dans les exemples donnés, s'il te plait ? Je te remercie par avance.

    Amicalement,

    Thierry[/large]
  • Bonjour Thierry,

    Merci, j'espère aussi que tu vas bien. Les listes sur ton image n'ont pas la disposition des listes LaTeX standard. J'ai donc bricolé un truc moi-même pour obtenir le même formatage. Ce n'est pas aussi chiadé que les listes LaTeX, mais ça marche... même avec hyperref.

    Note : si l'on bascule entre « avec hyperref » et « sans hyperref », il est normal d'avoir une erreur de compilation, due au fichier .aux ; il faut alors juste recompiler.
    \documentclass{article}
    % \usepackage{xparse} % seulement nécessaire si LaTeX plus vieux que 2020-10-01
    \usepackage{relsize}
    \usepackage{lipsum}             % texte bidon
    \usepackage{hyperref}           % optionnel, mais à charger en dernier
    
    \ExplSyntaxOn % Entre autres : les espaces sont ignorés, mais ~ les remplace.
    \NewDocumentEnvironment { retrait } { O{1} m }
      {
        \begin{list} { }            % argument vide du fait de \ExplSyntaxOn
          {
            \setlength {\itemindent}    {0pt}
            \setlength {\rightmargin}   {0pt}
            \setlength {\leftmargin}    {2.5em}
            \setlength {\parsep}        {0pt plus 1pt}
            \smaller[#1] % Ceci affecte les unités 'em' et 'ex'.
            \setlength {\listparindent} {1.5em}
          }
        \item \relax
        \textit{#2.} ~ --- ~ \ignorespaces % les ~ sont des espaces, ici
      }
      { \end{list} }
    
    \bool_new:N \l__ThierryP_first_item_bool
    \newcounter { listeb } % permet d'avoir des noms d'ancres uniques pour hyperref
    \newcounter { listebitem } [listeb] % 'listeb' est le compteur parent
    
    \cs_new_protected:Npn \ThierryP_listeb_item:
      {
        \bool_if:NF \l__ThierryP_first_item_bool { \par }
        \bool_set_false:N \l__ThierryP_first_item_bool
        \refstepcounter { listebitem }
        \thelistebitem ) \hspace { 0.45em }
      }
    
    \NewDocumentEnvironment { listeb } { }
      {
        \stepcounter { listeb }     % Met 'listebitem' à 0
        % Utilise un autre nom (p. ex. \itemb) si tu prévois de mettre une vraie
        % liste LaTeX à l'intérieur de celle-ci (!).
        \cs_set_eq:NN \item \ThierryP_listeb_item:
        \bool_set_true:N \l__ThierryP_first_item_bool
        \ignorespaces
      }
      { \par }
    \ExplSyntaxOff
    
    \begin{document}
    
    \lipsum[1][1-3]
    
    \begin{retrait}{Remarques}      % == \begin{retrait}[1]{Remarques}
      \begin{listeb}
        \item \lipsum[2][1-4]
        \item \lipsum[3][1-5]
        \item \lipsum[4][1-2]
      \end{listeb}
    \end{retrait}
    
    \begin{retrait}[2]{Remarques}   % plus petit
      Bla bla :
      \begin{listeb}
        \item \lipsum[2][1-4]
        \item \label{point-machin} \lipsum[3][1-5]
        \item \lipsum[4][1-2]
      \end{listeb}
    \end{retrait}
    
    Comme on l'a vu au point~\ref{point-machin} de la remarque ci-dessus, ...
    
    \begin{retrait}[3]{Remarque}    % encore plus petit
      \lipsum[2][1-4]
    
      \lipsum[3][1-5]
    \end{retrait}
    
    \end{document}
    
    122158
  • Brian

    C'est spectaculaire, au-delà même de mes attentes. Tu es vraiment remarquable, rigoureux, sérieux et indispensable. Je te remercie vraiment pour tout.

    Là, je suis en train de rédiger une lettre de motivation pour un job que je n'ai pas envie de décrocher.

    Amitiés sincères,

    Thierry
  • Tu es vraiment remarquable, rigoureux, sérieux et indispensable.
    Et dire que j'avais peur d'être le seul à avoir remarqué ! :-D

    Bravo et merci, Brian ! (tu)
  • Vous allez me faire rougir !.. :-)
  • Évidemment je rejoins Thierry et marsup. Grâce à votre travail, Brian, ce sous-forum est devenu une référence pour toute question concernant LaTeX.

    Je m'interrogeais simplement sur le "Bla bla : 1)" dans le troisième "bloc" de "retraits et listes à la Bourbaki.png" et me disais que peut-être ce comportement n'a lieu dans Bourbaki que si l'énumération débute les remarques.
  • Merci. (:D Tel qu'il est écrit ci-dessus, l'environnement 'listeb' permet de faire le premier item comme dans l'image du livre, qui commence en plein paragraphe. Si l'on veut un retour à la ligne avant le premier item comme ci-dessous, il suffit d'insérer un \par\nobreak (ou \par\nopagebreak) :
    \begin{retrait}[2]{Remarques}
      Bla bla :\par\nobreak
      \begin{listeb}
        \item \lipsum[2][1-4]
        \item \label{point-machin} \lipsum[3][1-5]
        \item \lipsum[4][1-2]
      \end{listeb}
    \end{retrait}
    
    Après, s'il faut intégrer ce truc à l'environnement 'listeb', je ne sais pas. Quelle serait la nouvelle spécification pour la syntaxe d'entrée ?

    P.S. : on peut ajouter '\mode_leave_vertical:' avant
    \thelistebitem ) \hspace { 0.45em }
    
    dans la définition de \ThierryP_listeb_item:. C'est infinitésimalement mieux. Ça ne changera quelque chose que si \thelistebitem est redéfini par l'utilisateur de façon à sortir quelque chose qui peut être ajouté à la liste TeX courante en mode vertical sans démarrer de paragraphe, tel qu'une \hbox — contrairement à sa petite sœur LaTeX \mbox. Très peu probable et sans doute un bug utilisateur, mais bon. Je ne l'ai pas mis ci-dessus pour simplifier un chouia, mais j'ai des remords. 8-) La définition complète devient alors :
    \cs_new_protected:Npn \ThierryP_listeb_item:
      {
        \bool_if:NF \l__ThierryP_first_item_bool { \par }
        \bool_set_false:N \l__ThierryP_first_item_bool
        \refstepcounter { listebitem }
        \mode_leave_vertical: \thelistebitem ) \hspace { 0.45em }
      }
    
    122202
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!