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 ? |
Il suffit d'ajouter \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} Du coup, si un enumerate n'est pas au début mais après, ça ne pose pas problème ?
Hum ! si bien sûr... Bon, c'est à creuser. 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} Ah, en effet. On peut cependant s'en sortir en remplaçant ce qui se trouve entre \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 } 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} Une solution serait de laisser une ligne vide entre le texte introductif et le premier item. Peut-être pas optimal, mais ça fonctionne... 3
Vous pouvez essayer avec cette modification
Ça fonctionne ! Merci. 1
@touhami Bravo pour cette astuce ! Juste un petit détail : si
Affichage de 5 parmi 9
Afficher 4 commentaire(s) en plus
|