[Résolu] listing dans \ifthenelse

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.

[Résolu] listing dans \ifthenelse

Messagepar Bobor » Mercredi 07 Octobre 2015, 21:50

Bonjour,

J'ai une macro "Exercice" qui reçoit deux arguments, l'un est l'énoncé et l'autre la solution. Les exercices sont placés dans une boucle, de façon à ce qu'au premier passage ce soit l'énoncé qui est affiché et au second ce soit la solution.

Mais lorsque je souhaite mettre dans la solution un environnement lstlisting j'ai une erreur étrange :
Paragraph ended before \lst@next was complete.

(voir code ci-dessous)

Il semble que le code, comme les verbatim, ne soient pas acceptés comme paramètre d'un ifthenelse.

Savez-vous comment faire pour place du code dans un ifthenelse ?

Merci par avance.

Code: Tout sélectionner
\documentclass{article}

\usepackage{ifthen}
\usepackage{listings}

\newcounter{ExCor}


\begin{document}

\setcounter{ExCor}{1}
\whiledo{\value{ExCor}<3}{%

\ifthenelse{\value{ExCor}=1}{%
Exercice : bla bla bla}

{%
Solution~:
\begin{lstlisting}
print('Solution')
\end{lstlisting}}

\stepcounter{ExCor}
}

\end{document}


PS : j'utilise emacs+auctex, installation TeXLive, sous windows 7.
Dernière édition par Bobor le Vendredi 09 Octobre 2015, 23:42, édité 1 fois.
Bobor
Déca-utilisateur
 
Messages: 21
Inscription: Samedi 26 Septembre 2009, 16:17
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: listing dans \ifthenelse

Messagepar touhami » Mercredi 07 Octobre 2015, 23:37

Bon jour.
On ne peut pas par exemple ecrire \textbf{\verb+\alpha+} parce que le mode verbatim change les catcodes.

La solution est de taper ton listing
Code: Tout sélectionner
\begin{lstlisting}
print('Solution')
\end{lstlisting}

dans un fichier mylisting.tex puis \lstinputlisting{mylisting.tex}
Code: Tout sélectionner
\documentclass{article}

\usepackage{ifthen}
\usepackage{listings}

\newcounter{ExCor}


\begin{document}

\setcounter{ExCor}{1}
\whiledo{\value{ExCor}<3}{%

\ifthenelse{\value{ExCor}=1}{%
Exercice : bla bla bla}

{%
Solution~:
\lstinputlisting{mylisting.tex}
}

\stepcounter{ExCor}
}



\end{document}
touhami
Méga-utilisateur
 
Messages: 407
Inscription: Dimanche 11 Février 2007, 11:45
Statut actuel: Post-bac

Re: listing dans \ifthenelse

Messagepar un bon petit » Jeudi 08 Octobre 2015, 11:47

touhami a écrit:On ne peut pas par exemple ecrire \textbf{\verb+\alpha+} parce que le mode verbatim change les catcodes...

Je complète : « ... et lorsqu'une macro lit un argument, ces catcodes ne sont plus modifiables ».
Ici, les deux macros \whiledo et \ifthenelse interdisent tout changement de catcode dans leurs arguments, ce qui fait planter linstings.

touhami a écrit:La solution est de taper ton listing

C'est une solution, en effet, mais tant qu'à faire, autant la rendre automatique.
Dans le code ci-dessous, la macro \exercice admet deux arguments : le premier contient l'énoncé et le deuxième le code solution avec la restriction que dans ce code, les accolades doivent être équilibrées (sinon, il faut se fatiguer un peu plus).
Elle écrit dans le répertoire courant autant de fichiers qu'il y a d'exercices et ces fichiers contiennent les codes solutions. Les fichiers ont pour nom exo-1.tex, exo-2.tex, etc.
Code: Tout sélectionner
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\newcount\exocnt\exocnt=0
\newwrite\exowrite
\usepackage{listings}
\makeatletter
\newcommand\allother{%
   \count255=0
   \loop
      \ifnum\count255<256
      \catcode\count255 12
      \advance\count255 1
   \repeat
}
\newcommand\exercice[1]{%
   \global\advance\exocnt 1
   \edef\exo@filename{exo-\number\exocnt}%
   \par\noindent Exercice : #1\par
   \begingroup
      \allother\catcode`\}2 \catcode`\{1
      \exercice@a
}
\newcommand\exercice@a[1]{%
      \immediate\openout\exowrite\exo@filename\relax
      \newlinechar`\^^M
      \immediate\write\exowrite{#1}%
      \immediate\closeout\exowrite
   \endgroup
   \lstinputlisting\exo@filename\par
}
\makeatother
\begin{document}
\exercice{Bla bla bla}{print('Solution')
print    ('truc')

print ("#much")}

suite du texte
\exercice{Deuxième exo}{print('Solution')}
\end{document}
un bon petit
Giga-utilisateur
 
Messages: 681
Inscription: Vendredi 12 Juin 2009, 21:35
Localisation: Chambéry
Statut actuel: Actif et salarié | Enseignant

Re: listing dans \ifthenelse

Messagepar Bobor » Vendredi 09 Octobre 2015, 23:41

Merci pour vos réponses rapides et efficaces. La première me convient très bien, en attendant de comprendre la seconde !

Cordialement, B.
Bobor
Déca-utilisateur
 
Messages: 21
Inscription: Samedi 26 Septembre 2009, 16:17
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot], Google Adsense [Bot], Grapeshot [Crawler] et 16 invités