Wiki Forum

Enumerate personnalisé dans un environnment

Tout ce qui concerne l'utilisation (ou l'installation) de LaTeX.

Modérateur: Modérateurs_LaTeX

Règles du forum
Merci d'éviter le style SMS dans vos messages. Penser à utiliser les balises Code pour poster du code.
Penser à utiliser la fonction Recherche avant de poster un message.

Enumerate personnalisé dans un environnment

Messagede Altermundus le Lundi 18 Janvier 2010, 17:01

Bonjour

J'ai posté cette demande sur fctt mais le post est parti je ne sais où ...

Je cherche si quelqu'un a déjà fait ce genre de chose, un environnement comme

\begin{exo}
.........
\end{exo}

avec une redéfinition de enumerate à l'entrée puis à la sortie revenir
aux valeurs par défaut.

Si quelqu'un l'a déjà fait, cela me ferait gagner un peu de temps.

Au passage je me demande si on peut faire cela avec des macros.
L'une pour modifier les différents paramètres l'autre pour revenir. Le problème
dans tout ce cirque c'est qu'il faut tenir compte de babel et frenchb.

Merci pour du code ou des idées

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede pg le Lundi 18 Janvier 2010, 17:38

Le package enumitem fournit \setenumerate qui peut faire ce genre de choses. Comme les environnements sont dans un groupe, pas la peine de restituer la valeur initiale à la fin.

Code: Tout sélectionner
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{fourier}

\usepackage{enumitem}

\newcounter{exo}
%\renewcommand{\theexo}{\Alph{exo}}% au besoin
\newtheorem{preexo}[exo]{Exercice}% preexo utilise le compteur exo
\newenvironment{exo}
  {\setenumerate{label=\textbf{\alph*}}\begin{preexo}}
  {\end{preexo}}

\begin{document}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\begin{exo}
Enumerate dans un exercice :
\begin{enumerate}
    \item question 1
    \item question 2
    \item question 3
\end{enumerate}
\end{exo}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\end{document}

Maintenant, d'un point de vue séparation fond-forme, il me semble plus pertinent de définir et d'utiliser un environnement {question} (basé sur {enumerate}) plutôt que d'utiliser directement un {enumerate}.
pg
Modérateur
 
Messages: 1283
Inscription: Vendredi 15 Juin 2007, 00:31

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Lundi 18 Janvier 2010, 18:01

pg a écrit:Le package enumitem fournit \setenumerate qui peut faire ce genre de choses. Comme les environnements sont dans un groupe, pas la peine de restituer la valeur initiale à la fin.
Maintenant, d'un point de vue séparation fond-forme, il me semble plus pertinent de définir et d'utiliser un environnement {question} (basé sur {enumerate}) plutôt que d'utiliser directement un {enumerate}.


Oui je me doutais de ces deux remarques. Je ne tiens pas trop à utiliser un nouveau package ensuite je ne suis pas sûr (mais il faut que je vérifie)
qu'il me permette en effet de modifier tout ce que je veux. À voir donc !

Pour le fond-forme, je suis bien d'accord mais cela me donne un texte bien plus naturel et facilement échangeable.
Des question finalement ce sont des listes et dans un DS, on ne verra pratiquement que ce genre de liste.

À la limite, je dirais que la forme je m'en moque car sans ma redéfinition d'enumerate, l'exercice compile et dans une forme acceptable, enfin compréhensible. Maintenant, je reconnais que si je veux autre chose il me faut re-modifier enumerate.
J'ai commencé, mes premiers documents justement avec cette méthode, \q et \qq pour les questions et les sous questions mais c'est guère facile à échanger et il faut tout modifier.

J'aurai un gros problème fond-forme si enumerate était utilisé dans d'autres conditions.
C'est bien pour cela que je pose ma question d'ailleurs. Modifier enumerate seulement dans un environnement exo

Merci pour ta suggestion je vais jeter un regard sur ce package

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Lundi 18 Janvier 2010, 18:17

Le package enumitem fournit \setenumerate qui peut faire ce genre de choses. Comme les environnements sont dans un groupe, pas la peine de restituer la valeur initiale à la fin.


Oui cela a l'air de m'éviter pas mal de problèmes.
Simplement, il faut que je rende ma classe plus proche d'article.cls car enumitem s'appuie dessus
Cela donne quoi avec les Koma-script ?


Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede pg le Lundi 18 Janvier 2010, 18:33

Altermundus a écrit:Simplement, il faut que je rende ma classe plus proche d'article.cls car enumitem s'appuie dessus

A priori, enumitem fonctionne avec n'importe quelle classe de document, il n'y a rien de particulier à article.cls (l'environnement {enumerate} est défini dans le noyau latex.ltx et les classes standards n'y touchent pas).
Altermundus a écrit:Cela donne quoi avec les Koma-script ?

Je n'utilise pas koma-script, mais l'exemple précédent fonctionne sans problème en remplaçant article par scrartcl.
pg
Modérateur
 
Messages: 1283
Inscription: Vendredi 15 Juin 2007, 00:31

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Lundi 18 Janvier 2010, 20:25

pg a écrit:
Altermundus a écrit:Simplement, il faut que je rende ma classe plus proche d'article.cls car enumitem s'appuie dessus

A priori, enumitem fonctionne avec n'importe quelle classe de document, il n'y a rien de particulier à article.cls (l'environnement {enumerate} est défini dans le noyau latex.ltx et les classes standards n'y touchent pas).
Altermundus a écrit:Cela donne quoi avec les Koma-script ?

Je n'utilise pas koma-script, mais l'exemple précédent fonctionne sans problème en remplaçant article par scrartcl.


Non mon problème est que j'ai zappé "description" ou bien je l'ai mal défini; en tout cas j'ai une erreur avec description et enumitem.

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede pg le Mardi 19 Janvier 2010, 20:52

Altermundus a écrit:Non mon problème est que j'ai zappé "description" ou bien je l'ai mal défini; en tout cas j'ai une erreur avec description et enumitem.

À l'occasion si tu peux mettre ici un code qui montre le problème, ça m'intéresserai de voir pourquoi ça ne marche pas.

Si enumitem pose problème, tu peux tout faire à la main sans. Pour renuméroter, ce n'est pas dûr, il suffit de redéfinir \theenumi (ou \theenumii pour le second niveau, etc.) :

Code: Tout sélectionner
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{fourier}

\newcounter{exo}
\newtheorem{preexo}[exo]{Exercice}% preexo utilise le compteur exo
\newenvironment{exo}
  {\renewcommand{\theenumi}{\alph{enumi}}\begin{preexo}}
  {\end{preexo}}

\begin{document}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\begin{exo}
Enumerate dans un exercice :
\begin{enumerate}
    \item question 1
    \item question 2
    \item question 3
\end{enumerate}
\end{exo}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\end{document}


Si tu as besoin de trucs plus avancé, tu peux regarder la définition de {enumerate} dans latex.ltx pour la modifier. La plupart des clefs du package enumitem se transmettent à {list} (par exemple leftmargin=3cm devient \leftmargin=3cm mis au bon endroit, etc.). Une liste des paramètres possibles est ici. Voici un exemple :

Code: Tout sélectionner
\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
\usepackage{fourier}

\newcounter{exo}
\newtheorem{preexo}[exo]{Exercice}% preexo utilise le compteur exo
   \makeatletter
\newenvironment{exo}
  {\renewcommand{\theenumi}{\alph{enumi}}
   \def\enumerate{%
     \ifnum \@enumdepth >\thr@@\@toodeep\else
       \advance\@enumdepth\@ne
       \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
         \expandafter
         \list
           \csname label\@enumctr\endcsname
           {\usecounter\@enumctr
            \def\makelabel####1{\hss\llap{####1}}%
            \leftmargin=3cm
            \topsep=1em
            \itemsep=0.5em
           }%
     \fi}
   \begin{preexo}}
  {\end{preexo}}
\makeatother

\begin{document}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\begin{exo}
Enumerate dans un exercice :
\begin{enumerate}
    \item question 1
    \item question 2
    \item question 3
\end{enumerate}
\end{exo}

Enumerate normal :
\begin{enumerate}
    \item item 1
    \item item 2
    \item item 3
\end{enumerate}

\end{document}

C'est plus lourd que d'utiliser enumitem, mais du coup, pas de risque d'interférence avec {description}.
pg
Modérateur
 
Messages: 1283
Inscription: Vendredi 15 Juin 2007, 00:31

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Mercredi 20 Janvier 2010, 00:38

pg a écrit:C'est plus lourd que d'utiliser enumitem, mais du coup, pas de risque d'interférence avec {description}.


Merci pour les conseils . Je m'en suis sorti mais je n'ai guère eu le temps d'analyser les problèmes.

Il y a interférence avec babel car j'ai défini mes listes après \AtBeginDocument{%
pour éviter que Babel sème le souk et me redéfissent tout. Je vais devoir relire la doc de frenchb nouvelle
version car ma classe date un peu et a été conçu avec l'ancienne

En déplaçant le code pour les listes avant \AtBeginDocument{% ,
tout fonctionne normalement. Je vais terminer mes travaux sur cette classe et à
l'occasion je veux bien de tes lumières pour critiquer le code et voir ce qui pourrait aller de travers

Et puis cela fera un exemple ( bon exemple j'espère) pour ceux qui veulent entreprendre ce genre d'aventures.

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Mercredi 20 Janvier 2010, 00:42

pg a écrit:Si tu as besoin de trucs plus avancé, tu peux regarder la définition de {enumerate} dans latex.ltx pour la modifier. La plupart des clefs du package enumitem se transmettent à {list} (par exemple leftmargin=3cm devient \leftmargin=3cm mis au bon endroit, etc.). Une liste des paramètres possibles est ici. Voici un exemple


c'est ce que j'ai fait
Code: Tout sélectionner

%traitement des listes
\renewcommand*{\labelitemiii}{\textasteriskbullet}
\renewcommand*{\labelitemi}{\textbullet}
\renewcommand*{\labelitemii}{\textasteriskcentered}
\renewcommand*{\labelenumi}{\textbf{\arabic{enumi}/}}%
\renewcommand*{\labelenumii}{\textbf{\alph{enumii}/}}%

\setlength\leftmargini{1em}
\leftmargin\leftmargini
\setlength\leftmarginii{1.2em}
\setlength\leftmarginiii{0.8em}
\setlength\leftmarginiv{0.8em}

\def\enumerate{%
   \ifnum \@enumdepth >3 \@toodeep
   \else
   \advance\@enumdepth \@ne
   \edef\@enumctr{enum\romannumeral\the\@enumdepth}
    \list{\csname label\@enumctr\endcsname}%
      {%
      \usecounter{\@enumctr}\parsep=0pt\leftmargin=1.8em%
      \labelsep=2pt%
      \labelwidth=\leftmargin%
      \advance\labelwidth-\labelsep%
      \topsep=0pt plus2pt minus2pt
      \partopsep=0pt%
      \parsep=2pt plus1pt minus1pt%
      \itemsep=0pt
      \def\makelabel##1{\hbox to\labelwidth{##1\hss}}%
      }%
    \fi}

\def\itemize{%
    \ifnum \@itemdepth >3 \@toodeep
    \else
        \advance\@itemdepth \@ne
        \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}
        \list{\csname \@itemitem\endcsname}%
        {%
        \parsep=0pt
        \leftmargin=10pt
        \labelsep=2pt
        \labelwidth=\leftmargin
        \advance\labelwidth-\labelsep
        \topsep=0pt plus2pt minus2pt
        \partopsep=0pt
        \itemsep=0pt
        \def\makelabel##1{\hbox to\labelwidth{##1\hss}}%
        }%
    \fi}


Il manque description mais c'était surtout placé au mauvais endroit avec enumitem.
Il me reste à savoir pourquoi mais je n'ai pas le temps en ce moment

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant

Re: Enumerate personnalisé dans un environnment

Messagede pg le Mercredi 20 Janvier 2010, 01:56

Avec ton code précédent mis dans un \AtBeginDocument, il y a effectivement un problème si on charge enumitem avant car enumitem redéfinit aussi la fin des environnements (\endenumerate, par exemple), donc si on redéfinit les choses encore après, il faut aussi s'occuper des fins d'environnements :

Code: Tout sélectionner
\documentclass{article}

\usepackage{enumitem}

\makeatletter
\AtBeginDocument{
\def\enumerate{%
   \ifnum \@enumdepth >3 \@toodeep
   \else
   \advance\@enumdepth \@ne
   \edef\@enumctr{enum\romannumeral\the\@enumdepth}
    \list{\csname label\@enumctr\endcsname}%
      {%
      \usecounter{\@enumctr}\parsep=0pt\leftmargin=1.8em%
      \labelsep=2pt%
      \labelwidth=\leftmargin%
      \advance\labelwidth-\labelsep%
      \topsep=0pt plus2pt minus2pt
      \partopsep=0pt%
      \parsep=2pt plus1pt minus1pt%
      \itemsep=0pt
      \def\makelabel##1{\hbox to\labelwidth{##1\hss}}%
      }%
    \fi}
}
\let\endenumerate =\endlist % commenter pour que la compilation plante
\makeatother

\begin{document}

\begin{enumerate}
    \item
\end{enumerate}

\end{document}


Altermundus a écrit:Il y a interférence avec babel car j'ai défini mes listes après \AtBeginDocument{%
pour éviter que Babel sème le souk et me redéfissent tout. Je vais devoir relire la doc de frenchb nouvelle
version car ma classe date un peu et a été conçu avec l'ancienne

Avec frenchb nouvelle version, il y a l'option StandardLists=true à donner pour que frenchb n'interfère pas avec les listes ; on peut ensuite utiliser enumitem pour faire ce qu'on veut.
pg
Modérateur
 
Messages: 1283
Inscription: Vendredi 15 Juin 2007, 00:31

Re: Enumerate personnalisé dans un environnment

Messagede Altermundus le Mercredi 20 Janvier 2010, 08:27

pg a écrit:Avec ton code précédent mis dans un \AtBeginDocument, il y a effectivement un problème si on charge enumitem avant car enumitem redéfinit aussi la fin des environnements (\endenumerate, par exemple), donc si on redéfinit les choses encore après, il faut aussi s'occuper des fins d'environnements


Merci pour ta remarque, c'est correct et il me faut aussi \let\enditemize =\endlist
Avec frenchb nouvelle version, il y a l'option StandardLists=true à donner pour que frenchb n'interfère pas avec les listes ; on peut ensuite utiliser enumitem pour faire ce qu'on veut.


je savais que je devais relire la doc mais je demande confirmation
moi j'avais mis \frenchbsetup{StandardLayout} logiquement c'est la même chose que
\frenchbsetup{StandardLayout=true} si on ne met rien c'est "false" qui est la valeur par défaut

Il reste à savoir ce que StandardLayout mais logiquement c'est tout la maquette qui n'est pas touchée.

Un grand merci pour ton aide

Alain Matthes
Altermundus
Méga-utilisateur
 
Messages: 369
Inscription: Lundi 28 Mai 2007, 10:31
Localisation: Paris
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité