Problème de retour à la ligne entre théorème et énumération

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

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Problème de retour à la ligne entre théorème et énumération

Messagepar flocel62 » Mardi 05 Juillet 2011, 17:42

bonjour,
je voudrais faire un retour à ligne après mes "théorèmes" ; celui-ci se fait bien quand mon théorème est suivi de texte mais il n'a pas lieu quand je poursuis par une énumération. Comment faire pour régler ce problème ? ; voilà le code de mon document (un peu long mais étant novice, je ne sais pas faire le tri...):

Code: Tout sélectionner
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\usepackage[fleqn]{amsmath}
\usepackage{amsthm,amssymb}
\usepackage{numprint}
\usepackage{tdsfrmath} % pour les repères, vecteurs ...
\usepackage{mathrsfs}
\usepackage[gen]{eurosym}
%\usepackage[paperwidth=5cm,paperheight=7cm,textwidth=5cm,textheight=7cm]{geometry}
\usepackage[a4paper,hmargin=1cm,vmargin=1.5cm]{geometry} % marges
\setlength{\parindent}{0 mm}
\usepackage[table]{xcolor}
\usepackage{xcolor}
\usepackage{graphicx}
\usepackage{array}
\usepackage{pifont}
%\usepackage{pstricks,pst-plot,pst-text,pst-tree}
\usepackage{pstricks-add,xkeyval,pst-func}
\usepackage{pstricks,pst-plot,pst-text,pst-tree,pst-eps,pst-fill,pst-node,pst-math}
\usepackage{indentfirst}
\usepackage{enumerate}
\usepackage{enumitem}
\usepackage{lmodern}
\usepackage[all]{xy}
\usepackage{ifthen}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{fancybox}
\usepackage{lastpage}
\usepackage{tabularx}
\usepackage{tkz-tab}
\usepackage{tabvar}
\pagestyle{empty}

\setenumerate[1]{label=\textbf{\arabic*)},ref=\textbf{\theenumi)}}  %pour changer la forme des numéros dans les listes
\setenumerate[2]{label=\textbf{\alph*)},ref=\textbf{\theenumi\alph*)}}
\newtheoremstyle{definition}{}{}{\upshape}{}{\bfseries}{ :}{\newline}{}

\begin{document}

\begin{multicols}{3}
   \begin{flushleft}
TE
   \end{flushleft}
\columnbreak
   \begin{center}
\textbf{\textit{Devoir commun \no}}

\textit{Calculatrice autorisée}
   \end{center}
\columnbreak
   \begin{flushright}
 .../.../...
   \end{flushright}
\end{multicols}

\hrule

\vspace{0.5cm}

\theoremstyle{definition}

\newtheorem{exo}{Exercice \no}

\begin{exo}[sur points]
   \begin{enumerate}
   \item  blabla
      \begin{enumerate}
      \item  blabla
      \item
      \end{enumerate}
   \item \label{a}
   \item
   
   on pourra utiliser le \ref{a}
   \end{enumerate}
\end{exo}

%\vspace{0.5cm}

\begin{exo}[sur points]

Soit $f$ la fonction définie par
\end{exo}

%\vspace{0.5cm}

\begin{exo}[sur  points]

\end{exo}

%\vspace{0.5cm}

\end{document}

Merci pour l'aide que vous pourrez m'apporter.
flocel62
Utilisateur
 
Messages: 2
Inscription: Mardi 05 Juillet 2011, 17:33
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Problème de retour à la ligne entre théorème et énumérat

Messagepar pg » Mardi 05 Juillet 2011, 18:51

Voici une solution avec amsthm :

Code: Tout sélectionner
\documentclass[12pt,a4paper]{article}

\usepackage[cp1252]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\usepackage[fleqn]{amsmath}
\usepackage{amsthm,amssymb}
\usepackage{enumitem}
\usepackage{lmodern}

\setenumerate[1]{label=\textbf{\arabic*)},ref=\textbf{\theenumi)}}  %pour changer la forme des numéros dans les listes
\setenumerate[2]{label=\textbf{\alph*)},ref=\textbf{\theenumi\alph*)}}

\makeatletter
\def\nobreakitem{%
  \@inmatherr\item
  \@ifnextchar [\@nobreakitem{\@noitemargtrue \@nobreakitem[\@itemlabel]}}
\def\@nobreakitem[#1]{%
  \if@noparitem
    \@donoparitem
  \else
    \if@inlabel
      \indent \par\nobreak
    \fi
    \ifhmode
      \unskip\unskip \par\nobreak
    \fi
    \if@newlist
      \if@nobreak
        \@nbitem
      \else
        \addpenalty\@beginparpenalty
        \addvspace\@topsep
        \addvspace{-\parskip}%
      \fi
    \else
      \addpenalty\@M % <-- difference with \@item is here
      \addvspace\itemsep
    \fi
    \global\@inlabeltrue
  \fi
  \everypar{%
    \@minipagefalse
    \global\@newlistfalse
    \if@inlabel
      \global\@inlabelfalse
      {\setbox\z@\lastbox
       \ifvoid\z@
         \kern-\itemindent
       \fi}%
      \box\@labels
      \penalty\z@
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \everypar{}%
    \fi}%
  \if@noitemarg
    \@noitemargfalse
    \if@nmbrlist
      \refstepcounter\@listctr
    \fi
  \fi
  \sbox\@tempboxa{\makelabel{#1}}%
  \global\setbox\@labels\hbox{%
    \unhbox\@labels
    \hskip \itemindent
    \hskip -\labelwidth
    \hskip -\labelsep
    \ifdim \wd\@tempboxa >\labelwidth
      \box\@tempboxa
    \else
      \hbox to\labelwidth {\unhbox\@tempboxa}%
    \fi
    \hskip \labelsep}%
  \ignorespaces}
\makeatother

\newtheoremstyle{definition}{}{}{\upshape}{}{\bfseries}{ :}{0pt}{}
\theoremstyle{definition}
\newcounter{exo}% pour que le compteur s'appelle "exo"
\newtheorem{exoaux}[exo]{Exercice \no}
\newenvironment{exo}[1][]{\begin{exoaux}[#1]\nobreakitem\relax}{\end{exoaux}}

\begin{document}

\begin{exo}[sur points]
   \begin{enumerate}
   \item  blabla
      \begin{enumerate}
      \item  blabla
      \item
      \end{enumerate}
   \item \label{a}
   \item
   
   on pourra utiliser le \ref{a}
   \end{enumerate}
\end{exo}

\begin{exo}[sur points]
Soit $f$ la fonction définie par
\end{exo}

\begin{exo}[sur  points]
Bla bla bla.
\end{exo}

\end{document}

On peut aussi utiliser ntheorem et son style "break", mais attention il est buggué dans certains cas.
pg
Modérateur
 
Messages: 2597
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Problème de retour à la ligne entre théorème et énumérat

Messagepar flocel62 » Mercredi 06 Juillet 2011, 16:09

Merci beaucoup pour cette réponse rapide. Effectivement, ça marche !!! :)
Quelques questions quand même :
1) il n'y a pas pas plus simple pour résoudre mon problème ? (sans utiliser un package qui comporte des bugs, évidemment...)
2) cette longue série de codes gère-t-elle autre chose que mon problème ?
3) est-il possible d'avoir une rapide explication concernant cette série de codes, pour en comprendre les rudiments ?
Merci d'avance pour les éclairages que vous pourrez m'apporter.
flocel62
Utilisateur
 
Messages: 2
Inscription: Mardi 05 Juillet 2011, 17:33
Statut actuel: Actif et salarié | Enseignant

Re: Problème de retour à la ligne entre théorème et énumérat

Messagepar pg » Mercredi 06 Juillet 2011, 16:23

1) Non.
2) Non.
3) Oui : le gros bout de code est juste le recopiage la définition de \item pour empêcher tout saut de page à cet endroit (par défaut, LaTeX encourage les sauts de pages avant un \item). Ensuite, au lieu d'utiliser l'option \newline de \newtheoremstyle (qui est faite pour ne pas sauter de ligne si elle est suivie par une liste), on définit un théorème avec \begin{exo}\nobreakitem ... \end{exo} (il faut bien sûr changer les noms pour éviter des conflits). Le \nobreakitem fait qu'il y aura toujours un saut de ligne.

Le code est donc équivalent à taper à chaque fois

Code: Tout sélectionner
\begin{exo}\item
Texte de l'exercice.
\end{exo}

avec en plus le fait que tout saut de page est impossible entre \begin{exo} et \item.
pg
Modérateur
 
Messages: 2597
Inscription: Jeudi 14 Juin 2007, 23:31


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 6 invités