Ne pas afficher le contenu d'un environnement

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
GRSG
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 299
Inscription : mercredi 08 octobre 2008, 09:45

[Résolu] Ne pas afficher le contenu d'un environnement

Message par GRSG »

Bonjour,
J'expose mon problème: je souhaite afficher ou non le contenu situé à l'intérieur d'un environnement. Par exemple:

Code : Tout sélectionner

\afficheenonce{false ou true}
\affichesolution{false ou true}

Exercice n\degre1
\begin{enumerate}

\item
\begin{enonce}
Enoncé de la question 1
\end{enonce}

\begin{solution}
Solution de la question 1
\end{solution}

\item

\begin{enumerate}
\item
\begin{enonce}
Enoncé de la question 2a
\end{enonce}

\begin{solution}
Solution de la question 2a
\end{solution}

\item
\begin{enonce}
Enoncé de la question 2b
\end{enonce}

\begin{solution}
Solution de la question 2b
\end{solution}

\end{enumerate}

\end{enumerate}
de façon à pouvoir afficher uniquement l'énoncé, uniquement les solutions ou les deux en même temps.

J'y arrive en faisant écrire le contenu que je ne souhaite pas afficher dans un fichier exterieur dont voici le code (à la base, un programme proposé par pg dans un autre contexte) :

Code : Tout sélectionner

\makeatletter
\newboolean{bsolution}
\newcommand{\affichesolution}[1]{%
\setboolean{bsolution}{#1}%
\ifthenelse{\boolean{bsolution}}%
{\renewenvironment{solution}{\color{black}}{\par}
}%
{
}
}
\makeatother

\makeatletter
\newboolean{benonce}
\newcommand{\afficheenonce}[1]{%
\setboolean{benonce}{#1}%
\ifthenelse{\boolean{benonce}}%
{\renewenvironment{enonce}{\color{black}}{\par}
}%
{
}
}
\makeatother

\makeatletter
\newwrite{\verbatim@out@six}
\def\initiatesolution#1{\immediate\openout \verbatim@out@six #1}
\def\solution{\bgroup\@bsphack
\let\do\@makeother\dospecials
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\verbatim@out@six{\the\verbatim@line}}%
\verbatim@start}
\def\endsolution{\immediate\write\verbatim@out@six{ }\@esphack\egroup}
\def\terminatesolution{\immediate\closeout\verbatim@out@six}
\makeatother

\makeatletter
\newwrite{\verbatim@out@nine}
\def\initiateenonce#1{\immediate\openout \verbatim@out@nine #1}
\def\enonce{\bgroup\@bsphack
\let\do\@makeother\dospecials
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\verbatim@out@nine{\the\verbatim@line}}%
\verbatim@start}
\def\endenonce{\immediate\write\verbatim@out@nine{ }\@esphack\egroup}
\def\terminateenonce{\immediate\closeout\verbatim@out@nine}
\makeatother

\begin{document}

\afficheenonce{true}
\affichesolution{true}


\initiatesolution{solution.tex}
\initiateenonce{enonce.tex}

Exercice n\degre1
\begin{enumerate}

\item
\begin{enonce}
Enoncé de la question 1
\end{enonce}

\begin{solution}
Solution de la question 1
\end{solution}

\item

\begin{enumerate}
\item
\begin{enonce}
Enoncé de la question 2a
\end{enonce}

\begin{solution}
Solution de la question 2a
\end{solution}

\item
\begin{enonce}
Enoncé de la question 2b
\end{enonce}

\begin{solution}
Solution de la question 2b
\end{solution}

\end{enumerate}

\end{enumerate}

\terminatesolution
\terminateenonce
Il y a sans doute plus simple à faire; d'où ma question...

Merci
Dernière modification par GRSG le lundi 24 août 2009, 16:37, modifié 1 fois.

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: Ne pas afficher le contenu d'un environnement

Message par pg »

Je suppose que tu fais référence à ce message ?

Pour ne pas afficher le contenu d'un environnement, il y a le package comment. Voici un exemple (pour ne pas afficher un environnement, il faut utiliser \excludecomment{nom de l'environnement})

Code : Tout sélectionner

\documentclass{article}

\usepackage{comment}

\newtheorem{exercice}{Exercice}
\newtheorem{solution}{Solution}

% pour ne pas afficher les solutions
\excludecomment{solution}

% pour ne pas afficher les énoncés
%\excludecomment{exercice}

\begin{document}

\begin{exercice}
Texte du premier exercice.
\end{exercice}

\begin{solution}
Solution du premier exercice.
\end{solution}

\begin{exercice}
Texte du second exercice.
\end{exercice}

\begin{solution}
Solution du second exercice.
\end{solution}

\end{document}
(En relation avec le fil sur le problème de \tableofcontents, le package comment utilise un \newwrite, mais comme dans ce contexte tous les \newwrite que tu utilise semblent inutiles, ça ne devrait pas être un problème.)

GRSG
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 299
Inscription : mercredi 08 octobre 2008, 09:45

Re: Ne pas afficher le contenu d'un environnement

Message par GRSG »

J'ai essayé sur des environnements simples et ça marche.

Par contre, j'ai l'impression que ça ne marche pas si par exemple en définit l'environnement exercice de la façon suivante (l'environnement exercice fait intervenir un autre environnement)

Code : Tout sélectionner

\newenvironment{exercice}%
{\begin{minipage}{\linewidth}}{\end{minipage}}

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: Ne pas afficher le contenu d'un environnement

Message par pg »

L'environnement minipage est relativement complexe donc récalcitrant à certains traitements. Par contre, pour d'autres environnements, comme itemize, il suffit de ne pas utiliser la forme \begin{itemize} ... \end{itemize} mais \itemize ... \enditemize (ce qui est à peu près équivalent). Exemple :

Code : Tout sélectionner

\documentclass{article}

\usepackage{comment}

\newenvironment{enumeration}{\itemize}{\enditemize}
\excludecomment{enumeration}

\begin{document}

Un enumeration :

\begin{enumeration}
   \item Du texte.
   \item Du texte.
\end{enumeration}

\end{document}
Pour les minipages, tu peux tout mettre dans une boite puis choisir ou non d'afficher cette boite. Voici un exemple :

Code : Tout sélectionner

\documentclass{article}

\newsavebox\boitetemporaire
\newif\ifafficheremarque
\newenvironment{remarque}
   {\begin{lrbox}{\boitetemporaire}%
    \begin{minipage}{\linewidth}%
    \textbf{Remarque.~}\ignorespaces
   }
   {\end{minipage}%
    \end{lrbox}%
    \ifafficheremarque
      \par\addvspace{6pt}%
      \unhbox\boitetemporaire
      \par\addvspace{6pt}%
    \fi
   }

\afficheremarquefalse
%\afficheremarquetrue

\begin{document}

Bla bla

\begin{remarque}
Texte de la remarque.
\end{remarque}

Bla bla

\end{document}

GRSG
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 299
Inscription : mercredi 08 octobre 2008, 09:45

Re: Ne pas afficher le contenu d'un environnement

Message par GRSG »

Ca fonctionne bien.

Je vais donc pouvoir entreprendre le grand nettoyage.

A quoi sert la commande \ignorespaces?

Merci

Gabriel

pg
Modérateur
Modérateur
Messages : 2600
Inscription : vendredi 15 juin 2007, 00:31

Re: [résolu]Ne pas afficher le contenu d'un environnement

Message par pg »

À ignorer les espaces après la fin du \begin{environnement}. Sinon, il peut, dans certains cas, y avoir une espace indésirable supplémentaire si on écrit

Code : Tout sélectionner

\begin{remarque}
Texte
\end{remarque}
Voici un exemple qui montre la différence :

Code : Tout sélectionner

\documentclass{article}

\newenvironment{remarqueavec}{\textbf{Remarque.~}\ignorespaces}{}
\newenvironment{remarquesans}{\textbf{Remarque.~}}{}

\begin{document}

\begin{remarqueavec}
Texte (avec)
\end{remarqueavec}

\begin{remarquesans}
Texte (sans)
\end{remarquesans}

\end{document}
ignorespaces.png
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

GRSG
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 299
Inscription : mercredi 08 octobre 2008, 09:45

Re: [Résolu] Ne pas afficher le contenu d'un environnement

Message par GRSG »

En fait, j'ai repris un de tes programmes, je l'ai adapté en créant une commande \exclure et qui fonctionne avec tous les environnements contenant éventuellement un environnment minipage.

Le fichier poubelle est le fichier dans lequel est stocké tout ce que je ne veux pas voir affiché

Code : Tout sélectionner

\makeatletter
\newwrite{\verbatim@out@one}
\newcommand\initiatepoubelle[1]{\immediate\openout \verbatim@out@one #1}
\newcommand{\exclure}[1]{
\renewenvironment{#1}{\bgroup\@bsphack
\let\do\@makeother\dospecials
\catcode`\^^M\active
\def\verbatim@processline{%
\immediate\write\verbatim@out@one{\the\verbatim@line}}%
\verbatim@start}
{\immediate\write\verbatim@out@one{ }\@esphack\egroup}}
\def\terminatepoubelle{\immediate\closeout\verbatim@out@one}
\makeatother

GRSG
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 299
Inscription : mercredi 08 octobre 2008, 09:45

Re: [Résolu] Ne pas afficher le contenu d'un environnement

Message par GRSG »

Bonjour,
En relisant la doc de Verbatim, il me semble être arrivé à une programmation un peu plus simple (et compatible avec minipage) pour ne pas afficher le contenu compris dans un environnement.

Voici le code:

Code : Tout sélectionner

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[frenchb]{babel}
\usepackage{verbatim}
\newenvironment{essai}{}{}
\newenvironment{truc}{}{}
\newcommand{\exclure}[1]{\renewenvironment{#1}{\begingroup\comment}{\endcomment\endgroup\ignorespaces}}
\exclure{essai}

\begin{document}
Ceci
et je passe à la ligne suivante
\begin{essai}
\begin{minipage}{\textwidth}
et cette ligne de l'environnement essai
\end{minipage}
\end{essai}
\begin{truc}
oulala de l'environnement truc
\end{truc}
\end{document}
Gabriel