Je souhaite créer un environnement de type theorème pour obtenir quelque chose de la forme "Exercice n. %retour à la ligne %Début de l'énoncé".

Suite à ma question posée ici https://texnique.fr/osqa/questions/11908/ifthenselse-avec-des-nombres-flottants, une solution a été proposée afin d'inclure le retour à la ligne directement dans le code d'un environnement de type "theorem ams math" (ce qui permet de ne pas avoir à le faire "manuellement").

Voici le code en question :

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{babel}

\newtheoremstyle{break} % ⟨name⟩
{}                      % ⟨Space above⟩
{0.5cm}                 % ⟨Space below⟩
{\normalfont}           % ⟨Body font⟩
{}                      % ⟨Indent amount⟩
{\bfseries}             % ⟨Theorem head font⟩
{}                      % ⟨Punctuation after theorem head⟩
{\newline}              % ⟨Space after theorem head⟩
{}                      % ⟨Theorem head spec (can be left empty, meaning ‘normal’ )⟩

\theoremstyle{break}
\newtheorem{exo}{Exercice}

\begin{document}

\begin{exo} 
bla 
\end{exo}

\begin{exo}
\begin{enumerate}
\item a
\item z
\end{enumerate}
\end{exo}

\end{document}

Ca fonctionne, sauf lorsque l'exercice commence avec une énumération... Dans ce cas, l'item 1) est sur la même ligne que le numéro de l'exercice. Et lorsque j'essaie de le faire manuellement, je me retrouve avec une ligne vide (voir exemple ci-dessus)...

Comment pourrait-on solutionner ce problème ?

Posée 23 Mar '23, 15:00

endomorphisme's gravatar image

endomorphisme
30110
Taux d'acceptation : 0%

Modifiée 23 Mar '23, 15:02


Il suffit d'ajouter \leavevmode\vspace{-\baselineskip} juste après \begin{exo} lorsque celui-ci est immédiatement suivi d'une liste (ici enumerate). Pour éviter d'avoir à le faire manuellement et systématiquement, on peut procéder comme suit (le code ci-dessous tient compte des améliorations apportées suite aux divers commentaires, notamment de l'astuce de @touhami) :

\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{enumitem}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{babel}

\newtheoremstyle{break} % ⟨name⟩
{}                      % ⟨Space above⟩
{0.5cm}                 % ⟨Space below⟩
{\normalfont}           % ⟨Body font⟩
{}                      % ⟨Indent amount⟩
{\bfseries}             % ⟨Theorem head font⟩
{}                      % ⟨Punctuation after theorem head⟩
{\newline}              % ⟨Space after theorem head⟩
{}                      % ⟨Theorem head spec (can be left empty, meaning ‘normal’ )⟩

\theoremstyle{break}

\newtheorem{exo}{Exercice}

\ExplSyntaxOn
\bool_new:N \g_inside_exo_bool
\AddToHook{env/exo/begin}{
  \bool_gset_true:N \g_inside_exo_bool
  \AddToHookNext{para/begin}{\bool_gset_false:N \g_inside_exo_bool}
}
\AddToHook{env/enumerate/begin}{
  \bool_if:NT \g_inside_exo_bool {
    \leavevmode\vspace{-\baselineskip}
  }
}
\ExplSyntaxOff

\begin{document}

\begin{exo}
  bla
\end{exo}

\begin{exo}
  \begin{enumerate}
  \item a
  \item z
  \end{enumerate}
\end{exo}

\begin{exo}
  blabla
  \begin{enumerate}
  \item a
  \item z
  \end{enumerate}
\end{exo}

\begin{exo}
  \begin{enumerate}
  \item a
  \item z
  \end{enumerate}
  Puis :
  \begin{enumerate}
  \item a
  \item z
  \end{enumerate}
\end{exo}

\begin{exo}
  \begin{enumerate}
  \item a
  \item b
  \end{enumerate}
  puis
  \begin{enumerate}[resume]
  \item c
  \item d
  \end{enumerate}
\end{exo}
\end{document}
Lien permanent

Publiée 23 Mar '23, 15:33

denis's gravatar image

denis ♦♦
7.0k1510
Taux d'acceptation : 52%

Modifiée 26 Mar '23, 17:31

Du coup, si un enumerate n'est pas au début mais après, ça ne pose pas problème ?

\begin{exo} blabla \begin{enumerate} \item a \item z \end{enumerate} \end{exo}

(23 Mar '23, 17:07) logamath logamath's gravatar image

Hum ! si bien sûr... Bon, c'est à creuser.

(24 Mar '23, 11:27) denis ♦♦ denis's gravatar image

Effectivement, je n'avais pas remarqué ça au départ, mais ça pose aussi problème lorsque l'on a quelque chose du type...

\begin{enumerate} 
\item a
\item b
\end{enumerate}
blablabla
\begin{enumerate}[resume]
\item c
\item d
\end{enumerate}
(24 Mar '23, 13:04) endomorphisme endomorphisme's gravatar image

Ah, en effet. On peut cependant s'en sortir en remplaçant ce qui se trouve entre \ExplSyntaxOn et \ExplSyntaxOff par :

\bool_new:N \g_inside_exo_bool
\AddToHook{env/exo/begin}{
  \bool_gset_true:N \g_inside_exo_bool
}
\AddToHook{env/enumerate/begin}{
  \bool_if:NT \g_inside_exo_bool {
    \leavevmode\vspace{-\baselineskip}
  }
  \bool_gset_false:N \g_inside_exo_bool
}
(24 Mar '23, 13:56) denis ♦♦ denis's gravatar image

Cela résout le problème pour le cas des listes "scindées" en deux avec end{enumerate} begin{enumerate}[resume], mais le problème persiste pour le cas suivant :

\begin{exo}
blabla
\begin{enumerate}
\item a
\item z
\end{enumerate}
\end{exo}
(24 Mar '23, 15:21) endomorphisme endomorphisme's gravatar image

Une solution serait de laisser une ligne vide entre le texte introductif et le premier item. Peut-être pas optimal, mais ça fonctionne...

(24 Mar '23, 23:08) endomorphisme endomorphisme's gravatar image
3

Vous pouvez essayer avec cette modification

\ExplSyntaxOn \bool_new:N \l_inside_exo_bool \AddToHook{env/exo/begin}{ \bool_set_true:N \l_inside_exo_bool \AddToHookNext{para/begin}{\bool_gset_false:N \l_inside_exo_bool} } \AddToHook{env/enumerate/begin}{ \bool_if:NT \l_inside_exo_bool { \leavevmode\vspace{-\baselineskip} } } \ExplSyntaxOff

(25 Mar '23, 07:27) touhami touhami's gravatar image

Ça fonctionne ! Merci.

(25 Mar '23, 11:50) endomorphisme endomorphisme's gravatar image
1

@touhami Bravo pour cette astuce ! Juste un petit détail : si \bool_gset_false:N est appliqué à un bolléen, ce lui-ci doit être global et donc être nommé \g_... plutôt que \l_.... Je vais modifier ma réponse pour qu'elle reflète les diverses améliorations apportées en commentaires.

(26 Mar '23, 17:27) denis ♦♦ denis's gravatar image
Affichage de 5 parmi 9 Afficher 4 commentaire(s) en plus
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.