Souligner un \phantom en pointillés avec retour à la ligne

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
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.
crespo12

Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par crespo12 »

Bonjour,

Je cherche à rédiger un cours à compléter avec deux versions: une pour le prof et une pour les étudiants.
Je cherche à souligner en pointillés les parties à compléter dans la version étudiant: j'ai fait des recherches et j'ai trouvé le package "dashundergaps" avec
la commande \dashuline ou \gap qui fait exactement ce que je veux.

Mon problème est que je veux des "blancs soulignés'' en pointillés de plusieurs lignes, et les commandes \phantom ou \gap ne gèrent pas les retours à la ligne??

J'ai pensé à changer le texte en blanc mais les pointillés sont alors aussi en blanc :mrgreen:

Quelqu'un aurait une idée? Merci d'avance.
PS ci-dessous le code de mes essais

Code : Tout sélectionner

\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[dash, phantomtext]{dashundergaps}

\begin{document}
\fbox{
\dashuline{\phantom{bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla }}
}\\ \\
\fbox{
\gap{bla bla bla bla bla bla bla bla bla bla bla bla 
bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla }
}\\
\end{document}
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par pg »

crespo12 a écrit :J'ai pensé à changer le texte en blanc mais les pointillés sont alors aussi en blanc
Il suffit de redéfinir la commande utilisée par le package pour forcer la couleur des pointillés même si le texte est blanc. Une façon de faire :

Code : Tout sélectionner

\documentclass{article}

\usepackage{dashundergaps}
\usepackage{xcolor}

\newif\ifversionetudiant
\AtBeginDocument{
\ifversionetudiant
  \newcommand{\insidecolor}{white}
  \newcommand{\dashcolor}{black}
\else
  \newcommand{\insidecolor}{black}
  \newcommand{\dashcolor}{white}
\fi
}
\def\dashuline{\bgroup\color{\insidecolor}
\ifdim\ULdepth=\maxdimen
\settodepth\ULdepth{(j}\advance\ULdepth.4pt\fi
\markoverwith{\color{\dashcolor}\kern.15em
\vtop{\kern\ULdepth \hrule width .3em}%
\kern.15em}\ULon}

% commenter/decommenter selon la version voulue
%\versionetudiantfalse
\versionetudianttrue

\begin{document}

\dashuline{Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla.}

\end{document}
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 952
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par un bon petit »

crespo12 a écrit :Quelqu'un aurait une idée? Merci d'avance.
Bon ouais, le package de Merciadri est bien gentil mais bon, on peut tout de même écrire sa propre macro, non ?
Je m'en suis sorti en mettant un argument optionnel qui est la couleur du texte à souligner. pour le faire disparaitre, mettre "white" comme dans l'ECM ci dessous :

Code : Tout sélectionner

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{ulem}
\usepackage[frenchb]{babel}
\newcommand\underdash[1][black]{% <- règle la couleur du texte
	\bgroup
	\ifdim\ULdepth=\maxdimen\settodepth\ULdepth{(j}\advance\ULdepth.4pt\fi
	\markoverwith{\kern0.2em% <- règle l'espacement avant un pointillé
		\vtop{\kern0.5ex% <- règle l'altitude des pointillés
		{\color{black}% <- règle la couleur des pointillés
		 \hrule width.4em% <- règle la largeur des pointillés
		}}\kern0.2em% <- règle l'espacement après un pointillé
	}\color{#1}\ULon}
\begin{document}

\underdash{Voici un texte souligné, comme on peut le voir, il s'étend sur plus d'une ligne et le soulignement aussi !}

\underdash[white]{Voici un texte souligné, comme on peut le voir, il s'étend sur plus d'une ligne et le soulignement aussi !}

\underdash[red]{Voici un texte souligné, comme on peut le voir, il s'étend sur plus d'une ligne et le soulignement aussi !}
\end{document}
crespo12

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par crespo12 »

Bonjour,

Vos deux solutions me conviennent parfaitement! Je n'aurais jamais trouvé ça tout seul...
Merci pour votre efficacité.
Luca Merciadri

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par Luca Merciadri »

Bonjour,

Je suis l'auteur du package dashundergaps.

Une nouvelle version du package sera bientôt publiée, grâce au bug que vous avez découvert. Merci!
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 952
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par un bon petit »

Oui, j'ai suivi la discussion sur ctt et bien regardé la solution de Arseneau.
Luca Merciadri

Re: Souligner un \phantom en pointillés avec retour à la ligne

Message non lu par Luca Merciadri »

;-)
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

Bonjour,

Je suis heureux de voir que je ne suis pas le seul à utiliser cette "technique" de "texte à trous" pour les polys et/ou slides.
Je rebondis sur cette question de crespo 12 pour poser une question...

Pour différencier la version prof de la version étudiant, j'ai pris l'habitude de définir une couleur (nommée "profetu") définie de manière relative : en blanc pour les étudiants, en gris pour le prof :

Code : Tout sélectionner

%\definecolor{profetu}{gray}{0.5} %prof - gray:0.5 ? (0.75:trop pâle ; 0.25:proche du noir...)
\definecolor{profetu}{gray}{1} %etudiant - gray:1
Du coup, pour un "texte à trous", je l'appelle avec une commande \tcpe définie ainsi :

Code : Tout sélectionner

\newcommand{\tcpe}[1]{{\color{gray} \uwave{\textcolor{profetu}{#1}}}}
Ainsi, lorsque je fais cours, je dois compiler une version prof et une version étudiant. C'est un peu "fastidieux" et surtout laid comme démarche : je compile pour une des versions (disons étudiant), je fais copier-coller du fichier, que je renomme alors "xxx_etu", puis je change en version prof (=> texte en gris), je compile, je fais copier-coller, je renomme en "xxx_prof". Puis, pour le cours, j'ai ces 2 fichiers. La version "etu" est le pdf par défaut. Les étudiants réfléchissent à la solution, puis j'affiche le pdf version "prof" pour donner le résultat. Mais c'est assez lourd et fastidieux, car il faut que je me mette à la bonne page. Bref.
Ce que je voudrais, c'est qu'à partir de la version de base du fichier, la version étudiante, que je puisse cliquer sur la zone à trou pour faire apparaître le résultat. Je ne sais pas comment faire.... Quelqu'un aurait-il une solution à cela ? Ou une solution intermédiaire / alternative moins fastidieuse que ce que je fais actuellement ? NB : cela vaut pour un cours qui est fais de slides uniquement (avec beamer), mais aussi pour un autre cours qui est un poly uniquement. :?

Merci de vos lumières ! :)
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

On peut faire ce genre de choses avec le package ocg (disponible sur ctan ; s'il n'est pas présent sur la machine, le mettre dans le même répertoire que le fichier .tex qui compile) :
exercices_a_trous.pdf
(42.37 Kio) Téléchargé 461 fois

Code : Tout sélectionner

\documentclass{article}

\usepackage{xcolor}
\usepackage{xspace}
%http://mirror.ctan.org/graphics/asymptote/doc/ocg.sty
\usepackage{ocg}
\usepackage{dashundergaps}

\newcommand{\ToggleLayer}[2]{%
  % #1: layer name,
  % #2: link text
  \leavevmode
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /A <<
      /S/JavaScript
      /JS (
         var aOCGs = this.getOCGs();
         var AllChecked = 1;
         var AllIndex = 0;
         for(var i=0; aOCGs && i<aOCGs.length;i++)
         {
         if(aOCGs[i].name == "#1") {aOCGs[i].state = !aOCGs[i].state;}
         if(!aOCGs[i].state && aOCGs[i].name != "all") {AllChecked = 0;}
         if(aOCGs[i].name == "all") {aOCGs[i].state = false; AllIndex=i;}
         }
         if(AllChecked == 1) {aOCGs[AllIndex].state = true;}
      )
    >>
  }#2%
  \pdfendlink
}

\makeatletter
\newlength{\hide@width}
\newcounter{hide@number}
\newcommand{\hide}[1]{%
  \refstepcounter{hide@number}%
  \definecolor{profetu}{gray}{1.00}%
  \settowidth{\hide@width}{\tcpe{#1}}%
  \tcpe{#1}%
  \nobreak\hspace{-\hide@width}%
  \begin{ocg}{Professeur\arabic{hide@number}}{professeur\arabic{hide@number}}{0}%
  \definecolor{profetu}{gray}{0.5}%
  \ToggleLayer{Professeur\arabic{hide@number}}{\tcpe{#1}}%
  \end{ocg}%
  \xspace
}
\makeatother

\definecolor{profetu}{gray}{1.00}% couleur par defaut
\newcommand{\tcpe}[1]{{\color{gray}\uwave{\textcolor{profetu}{#1}\ignorespaces}}}

\begin{document}

La fonction $f$ est \hide{croissante} si et seulement si \hide{$f'(x) \geq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si \hide{$f'(x) \leq 0$}.

\end{document}
Il faut compiler deux fois et ça ne marche peut-être pas si on utilise autre chose que Acrobat Reader.
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

Super, merci !
Je n'aurais jamais été capable de produire un tel code, chapeau...

Par contre, en l'utilisant tel quel sur mon code existant (en remplaçant dans le corps du document les \tcpe par des \hide), j'ai des erreurs de compilation. Ce n'est pas trop méchant car cela s'affiche (presque) correctement, mais bon sans erreur de compilation c'est mieux.
A priori cela est dû fait que que j'utilisais \tcpe à l'intérieur d'une équation. Typiquement, je ne fais pas forcément que

Code : Tout sélectionner

La fonction $f$ est \hide{croissante} si et seulement si \hide{$f'(x) \geq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si \hide{$f'(x) \leq 0$}.
je fais aussi et surtout plus souvent quelque chose du genre :

Code : Tout sélectionner

La fonction $f$ est \hide{croissante} si et seulement si $f'(x) \hide{\geq} 0$.

La fonction $f$ est \hide{decroissante} si et seulement si $f'(x) \hide{\leq} 0$.
Ainsi, est-il possible (facilement) d'étendre ce super code à son utilisation à l'intérieur d'équations ?!
Par avance, merci de vos réponses :)
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

La macro compliquée (\Togglelayer) n'est pas de moi. Pour pouvoir utiliser \hide dans les équations, il suffit de tester le mode mathématiques pour ajouter les dollars automatiquement :

Code : Tout sélectionner

\documentclass{article}

\usepackage{xcolor}
\usepackage{xspace}
%http://mirror.ctan.org/graphics/asymptote/doc/ocg.sty
\usepackage{ocg}
\usepackage{dashundergaps}
\usepackage{amsmath}

\newcommand{\ToggleLayer}[2]{%
  % #1: layer name,
  % #2: link text
  \leavevmode
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /A <<
      /S/JavaScript
      /JS (
         var aOCGs = this.getOCGs();
         var AllChecked = 1;
         var AllIndex = 0;
         for(var i=0; aOCGs && i<aOCGs.length;i++)
         {
         if(aOCGs[i].name == "#1") {aOCGs[i].state = !aOCGs[i].state;}
         if(!aOCGs[i].state && aOCGs[i].name != "all") {AllChecked = 0;}
         if(aOCGs[i].name == "all") {aOCGs[i].state = false; AllIndex=i;}
         }
         if(AllChecked == 1) {aOCGs[AllIndex].state = true;}
      )
    >>
  }#2%
  \pdfendlink
}

\makeatletter
\newlength{\hide@width}
\newcounter{hide@number}
\newif\ifhiden@mathmode
\newcommand{\hide}[1]{%
  \relax\ifmmode\hiden@mathmodetrue\else\hiden@mathmodefalse\fi
  \refstepcounter{hide@number}%
  \definecolor{profetu}{gray}{1.00}%
  \settowidth{\hide@width}{\tcpe{\ifhiden@mathmode${}\fi#1\ifhiden@mathmode{}$\fi}}%
  \tcpe{\ifhiden@mathmode${}\fi#1\ifhiden@mathmode{}$\fi}%
  \nobreak\hspace{-\hide@width}%
  \begin{ocg}{Professeur\arabic{hide@number}}{professeur\arabic{hide@number}}{0}%
  \definecolor{profetu}{gray}{0.5}%
  \ToggleLayer{Professeur\arabic{hide@number}}{\tcpe{\ifhiden@mathmode${}\fi#1\ifhiden@mathmode{}$\fi}}%
  \end{ocg}%
  \xspace
}
\makeatother

\definecolor{profetu}{gray}{1.00}% couleur par defaut
\newcommand{\tcpe}[1]{\text{\color{gray}\uwave{\textcolor{profetu}{#1}\ignorespaces}}}

\begin{document}

La fonction $f$ est \hide{croissante} si et seulement si \hide{$f'(x) \geq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si \hide{$f'(x) \leq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si $f'(x) \hide{\leq} 0$.

\end{document}
Il se peut que, dans certains cas, l'espacement soit incorrect, mais pour des choses comme "{...} \hide{+} {...}" ou "{...} \hide{<} {...}", ce sera bon.
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

Merci infiniment, ça marche sans erreur de compilation.

Par contre, en effet, il y a quelques fois où l'espacement est incorrect : notamment dans \int (surtout la borne supérieure - bon j'arrive pas à joindre de fichier pour le montrer, tant pis).
Mais c'est un moindre mal !

Mille merci encore une fois.

Cordialement,
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

nipi44 a écrit :Par contre, en effet, il y a quelques fois où l'espacement est incorrect : notamment dans \int (surtout la borne supérieure - bon j'arrive pas à joindre de fichier pour le montrer, tant pis).
Mettre le code sous la forme "\int_{\hide{a}}..." ou que sais-je, ça devrait me suffire pour voir ce qui ne va pas et trouver une solution.
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

Très bien : si vous le proposez, voici le bout de code qui pose problème :

Code : Tout sélectionner

\int_{\hide{n}}^{\hide{n+1}}
(pour info, à l'intérieur de l'équation dont je donne le code complet :

Code : Tout sélectionner

\[
	\lim_{n \to + \infty} \, \int_\R f_n(t)\,dt = \lim_{n \to + \infty} \, \int_{\hide{n}}^{\hide{n+1}} \hide{1}\,dt = \hide{1} \quad \neq \quad \int_\R \lim_{n \to + \infty} \, f_n(t)\,dt = \int_\R \hide{0}\,dt = \hide{0} \,,
\]
avec \R défini par \newcommand{\R}{{\mathbb R}} )

Comme je le disais, la borne inférieure (n) n'est semble-t-il pas décalée -en tout cas pas significativement-. Par contre, la borne supérieure (n+1) est "vachement" décalée vers la gauche : le n est sur le signe intégral. Voili voilou
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

Ce n'est pas du tout le type de problème d'espacement auquel je pensais. Le problème vient de \text qui s'ajoute à un \scriptstyle. Pour contourner le problème, il suffit d'utiliser \hbox en mode mathématique et de donner explicitement le style mathématique courant pour que la taille soit la bonne :

Code : Tout sélectionner

\documentclass{article}

\usepackage{xcolor}
\usepackage{xspace}
%http://mirror.ctan.org/graphics/asymptote/doc/ocg.sty
\usepackage{ocg}
\usepackage{dashundergaps}
\usepackage{amsmath}

\newcommand{\ToggleLayer}[2]{%
  % #1: layer name,
  % #2: link text
  \leavevmode
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /A <<
      /S/JavaScript
      /JS (
         var aOCGs = this.getOCGs();
         var AllChecked = 1;
         var AllIndex = 0;
         for(var i=0; aOCGs && i<aOCGs.length;i++)
         {
         if(aOCGs[i].name == "#1") {aOCGs[i].state = !aOCGs[i].state;}
         if(!aOCGs[i].state && aOCGs[i].name != "all") {AllChecked = 0;}
         if(aOCGs[i].name == "all") {aOCGs[i].state = false; AllIndex=i;}
         }
         if(AllChecked == 1) {aOCGs[AllIndex].state = true;}
      )
    >>
  }#2%
  \pdfendlink
}

\makeatletter
\newlength{\hide@width}
\newcounter{hide@number}
\newif\ifhiden@mathmode
\newcommand{\hide}[1]{%
  \relax\ifmmode
    \hiden@mathmodetrue
    \mathchoice{\hide@aux{#1}{\displaystyle}}%
               {\hide@aux{#1}{\textstyle}}%
               {\hide@aux{#1}{\scriptstyle}}%
               {\hide@aux{#1}{\scriptscriptstyle}}%
  \else
    \hiden@mathmodefalse
    \hide@aux{#1}{}%
  \fi
  \xspace
}
\newcommand{\hide@aux}[2]{%
% #1 = texte à cacher/montrer
% #2 = style mathématique à utiliser (vide si mode texte)
  \refstepcounter{hide@number}%
  \definecolor{profetu}{gray}{1.0}%
  \settowidth{\hide@width}{\tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}}%
  \tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}%
  \nobreak\null\hspace*{-\hide@width}%
  \begin{ocg}{Professeur\arabic{hide@number}}{professeur\arabic{hide@number}}{0}%
  \definecolor{profetu}{gray}{0.5}%
  \ToggleLayer{Professeur\arabic{hide@number}}%
              {\tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}}%
  \end{ocg}%
}
\newcommand{\mathortextbox}{% pour éviter que \text{$\scriptstyle n+1$} ne soit trop petit
  \ifhiden@mathmode
    \expandafter\hbox
  \else
    \expandafter\text
  \fi
}
\makeatother

\definecolor{profetu}{gray}{1.00}% couleur par defaut
\newcommand{\tcpe}[1]{\mathortextbox{\color{gray}\uwave{\textcolor{profetu}{#1}}}}

\begin{document}

La fonction $f$ est \hide{croissante} si et seulement si \hide{$f'(x) \geq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si \hide{$f'(x) \leq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si $f'(x) \hide{\leq} 0$.

\[
   \lim_{n \to + \infty} \, \int_{-\infty}^{+\infty} f_n(t)\,dt = \lim_{n \to + \infty} \, \int_{\hide{n}}^{\hide{n+1}} \hide{1}\,dt = \hide{1} \neq \int_{-\infty}^{+\infty} \lim_{n \to + \infty} \, f_n(t)\,dt = \int_{-\infty}^{+\infty} \hide{0}\,dt = \hide{0}
\]

\end{document}
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

OK, j'ai du mal à suivre, mais problème résolu.
Par contre, le texte n'est plus en gris, mais en noir :?
Désolé pour le dérangement...
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

J'avais juste changé le \definecolor{profetu}{gray}{0.5} en \definecolor{profetu}{gray}{0.2} pour mieux voir les choses lors de mes tests. J'ai rectifié le code précédent pour rétablir le gris.
nipi44

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par nipi44 »

Ah oui, j'aurais dû regarder le code. Merci.

Par contre j'ai utilisé ce code sur un autre cours que j'ai repris d'un collègue. Cours fait de slides avec beamer. Il devait utiliser un mac, en tout cas j'ai des warning de compilation.
Bref, ce code marche et ne génère pas d'erreur de compilation, mais à la fin du cours, apparaissent dans des slides supplémentaires dans lesquels apparaissent :
"professeur10 professeur20 professeur30 professeur40 (...) professeur4110"
sebk

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par sebk »

Bonjour,
Merci pour cette magnifique macro.
Je cherche depuis un bon moment comment faire pour que les vagues (que je souhaite remplacer par des points dotuline mais c'est anecdotique) apparaissent seulement pour les eleves et non dans le document prof cliqué, la couleur suffisant je trouve.
J'ai eu beau deplacer le uwave un peu partout, je n'ai pas réussi.
Merci pour votre aide

ps : je suis sur mac ave texshop et tout marche bien, une fois qu'on a compris qu'il fallait compiler ave pdfLateX et non en Tex + dvi...
pg
Modérateur spécialisé
Modérateur spécialisé
Messages : 2608
Inscription : vendredi 15 juin 2007, 00:31

Re: Souligner un \phantom en pointillés avec retour à la lig

Message non lu par pg »

nipi44 a écrit : à la fin du cours, apparaissent dans des slides supplémentaires dans lesquels apparaissent :
"professeur10 professeur20 professeur30 professeur40 (...) professeur4110"
Il me faudrait un exemple de code qui ne marche pas pour voir ce qui se passe.
sebk a écrit : Je cherche depuis un bon moment comment faire pour que les vagues (que je souhaite remplacer par des points dotuline mais c'est anecdotique) apparaissent seulement pour les eleves et non dans le document prof cliqué, la couleur suffisant je trouve.
J'ai eu beau deplacer le uwave un peu partout, je n'ai pas réussi.
On peut mettre la réponse et la question sur des calques différents et puis modifier la commande de basculement pour qu'elle les interchange :

Code : Tout sélectionner

\documentclass{article}

\usepackage{xcolor}
\usepackage{xspace}
%http://mirror.ctan.org/graphics/asymptote/doc/ocg.sty
\usepackage{ocg}
\usepackage{dashundergaps}
\usepackage{amsmath}

% Syntaxe de \begin{ocg}{#1}{#2}{#3}
%  #1 = nom du calque
%  #2 = id du calque
%  #3 = état initial : 0 (invisible) ou 1 (visible)

\newcommand{\ToggleLayer}[2]{%
  % #1: layer name,
  % #2: link text
  \leavevmode
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /A <<
      /S/JavaScript
      /JS (
         var aOCGs = this.getOCGs();
         var AllChecked = 1;
         var AllIndex = 0;
         for(var i=0; aOCGs && i<aOCGs.length;i++)
         {
         if(aOCGs[i].name == "#1") {aOCGs[i].state = !aOCGs[i].state;}
         if(!aOCGs[i].state && aOCGs[i].name != "all") {AllChecked = 0;}
         if(aOCGs[i].name == "all") {aOCGs[i].state = false; AllIndex=i;}
         }
         if(AllChecked == 1) {aOCGs[AllIndex].state = true;}
      )
    >>
  }#2%
  \pdfendlink
}
\newcommand{\ToggleLayers}[3]{%
  % #1: first layer name,
  % #2: second layer name
  % #3: link text
  \leavevmode
  \pdfstartlink user {
    /Subtype /Link
    /Border [0 0 0]%
    /A <<
      /S/JavaScript
      /JS (
         var aOCGs = this.getOCGs();
         var AllChecked = 1;
         var AllIndex = 0;
         for(var i=0; aOCGs && i<aOCGs.length;i++)
         {
         if(aOCGs[i].name == "#1") {aOCGs[i].state = !aOCGs[i].state;}
         if(aOCGs[i].name == "#2") {aOCGs[i].state = !aOCGs[i].state;}
         if(!aOCGs[i].state && aOCGs[i].name != "all") {AllChecked = 0;}
         if(aOCGs[i].name == "all") {aOCGs[i].state = false; AllIndex=i;}
         }
         if(AllChecked == 1) {aOCGs[AllIndex].state = true;}
      )
    >>
  }#3%
  \pdfendlink
}

\makeatletter
\newlength{\hide@width}
\newcounter{hide@number}
\newif\ifhiden@mathmode
\newcommand{\hide}[1]{%
  \relax\ifmmode
    \hiden@mathmodetrue
    \mathchoice{\hide@aux{#1}{\displaystyle}}%
               {\hide@aux{#1}{\textstyle}}%
               {\hide@aux{#1}{\scriptstyle}}%
               {\hide@aux{#1}{\scriptscriptstyle}}%
  \else
    \hiden@mathmodefalse
    \hide@aux{#1}{}%
  \fi
  \xspace
}
\newcommand{\hide@aux}[2]{%
% #1 = texte à cacher/montrer
% #2 = style mathématique à utiliser (vide si mode texte)
  \refstepcounter{hide@number}%
  \settowidth{\hide@width}
      {\tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}}%
  \begin{ocg}{Etudiant\arabic{hide@number}}{etudiant\arabic{hide@number}}{1}%
  \definecolor{profetu}{gray}{1.0}%
  \tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}%
  \end{ocg}%
  \nobreak\null\hspace*{-\hide@width}%
  \begin{ocg}{Professeur\arabic{hide@number}}{professeur\arabic{hide@number}}{0}%
  \definecolor{profetu}{gray}{0.5}%
  \ToggleLayers{Professeur\arabic{hide@number}}{Etudiant\arabic{hide@number}}%
      {\let\uwave\relax\tcpe{\ifhiden@mathmode$#2{}\fi#1\ifhiden@mathmode{}$\fi}}%
  \end{ocg}%
}
\newcommand{\mathortextbox}{% pour éviter que \text{$\scriptstyle n+1$} ne soit trop petit
  \ifhiden@mathmode
    \expandafter\hbox
  \else
    \expandafter\text
  \fi
}
\makeatother

\definecolor{profetu}{gray}{1.00}% couleur par defaut
\newcommand{\tcpe}[1]{\mathortextbox{\color{gray}\uwave{\textcolor{profetu}{#1}}}}

\begin{document}

La fonction $f$ est \hide{croissante} si et seulement si \hide{$f'(x) \geq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si \hide{$f'(x) \leq 0$}.

La fonction $f$ est \hide{decroissante} si et seulement si $f'(x) \hide{\leq} 0$.

\[
   \lim_{n \to + \infty} \, \int_{-\infty}^{+\infty} f_n(t)\,dt = \lim_{n \to + \infty} \, \int_{\hide{n}}^{\hide{n+1}} \hide{1}\,dt = \hide{1} \neq \int_{-\infty}^{+\infty} \lim_{n \to + \infty} \, f_n(t)\,dt = \int_{-\infty}^{+\infty} \hide{0}\,dt = \hide{0}
\]

\end{document}