Boite lrbox et minipage

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.

Boite lrbox et minipage

Messagepar Tukikun » Samedi 17 Octobre 2009, 11:22

Bonjour, :D

Je souhaite actuellement faire un environnement "tests" qui m'afficherait le titre "Tests" et ensuite deux colonnes avec les-dits tests.

Pour définir ces tests, j'ai créé la commande \test{}{}{} prenant 3 paramètres : la difficulté, le texte du test et la solution au test.

Je voulais créer une boîte "solutions" que j'afficherais plus loin dans le document avec les solutions au tests. Seulement, je n'arrive pas à enregistrer le troisième paramètre du test dans la boîte... quand je suis dans l'environnement "tests". :|

Voici le code :

Code: Tout sélectionner
\documentclass[11pt]{amsart}
\usepackage{multicol}

\newcounter{test}
\newsavebox{\solutions}

\newenvironment{tests}{%
   \bigskip\noindent\begin{minipage}{\linewidth}
      \setlength{\baselineskip}{0.3\baselineskip}\setlength{\parindent}{0pt} \centering {\bfseries Tests\\{\rule{5cm}{0.2mm}} }
   }{
   \end{minipage}%
   }

\newcommand\test[3]{%
   \stepcounter{test}
   \begin{minipage}{\linewidth}
      {\small \bfseries \thetest. {#1}}
      #2
   \end{minipage}
   \bigskip
   \begin{lrbox}{\solutions}
      \usebox{\solutions}
      #3
   \end{lrbox}
}

\begin{document}

\begin{tests}
\test{difficulté 1}{Test 1}{Solution 1}
\test{difficulté 2}{Test 2}{Solution 2}
\test{difficulté 3}{Test 3}{Solution 3}
\end{tests}

Plus loin...

\usebox{\solutions}

\end{document} 


Si je commente les lignes \begin{tests} et \end{tests} ça fonctionne... En fait ça ne fonctionne pas si je met les commandes \test{}{}{} dans un environnement...

Quelqu'un aurait une idée de comment faire ça ? Ou une manière autre de résoudre ce problème ? :oops:

Merci beaucoup !
Tukikun, qui vient d'y passer plus de trois heures sont réussir :cry:
Tukikun
Utilisateur
 
Messages: 9
Inscription: Mardi 24 Mars 2009, 21:03
Statut actuel: Post-bac | Licence

Publicité

Re: lrbox et minipage...

Messagepar pg » Samedi 17 Octobre 2009, 16:04

C'est parceque, dans un environnement, toutes les déclarations sont locales, donc le contenu de la boîte est perdu au sortir de l'environnement. Un moyen est de définir et d'utiliser une variante de lrbox qui fait des déclarations globales (c'est juste le code provenant du fichier latex.ltx avec un \global devant le \setbox) :

Code: Tout sélectionner
\makeatletter
\def\globallrbox#1{%
  \edef\reserved@a{%
    \endgroup
    \global\setbox#1\hbox{%
      \begingroup\aftergroup}%
        \def\noexpand\@currenvir{\@currenvir}%
        \def\noexpand\@currenvline{\on@line}}%
  \reserved@a
    \@endpefalse
    \color@setgroup
      \ignorespaces}
\def\endgloballrbox{\unskip\color@endgroup}
\makeatother


En tout, ce la donne :

Code: Tout sélectionner
\documentclass[11pt]{amsart}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{lmodern}

\usepackage{multicol}

\makeatletter
\def\globallrbox#1{%
  \edef\reserved@a{%
    \endgroup
    \global\setbox#1\hbox{%
      \begingroup\aftergroup}%
        \def\noexpand\@currenvir{\@currenvir}%
        \def\noexpand\@currenvline{\on@line}}%
  \reserved@a
    \@endpefalse
    \color@setgroup
      \ignorespaces}
\def\endgloballrbox{\unskip\color@endgroup}
\makeatother


\newcounter{test}
\newsavebox{\solutions}

\newenvironment{tests}{%
   \bigskip\noindent\begin{minipage}{\linewidth}
      \setlength{\baselineskip}{0.3\baselineskip}\setlength{\parindent}{0pt} \centering {\bfseries Tests\\{\rule{5cm}{0.2mm}} }
   }{
   \end{minipage}%
   }

\newcommand\test[3]{%
   \stepcounter{test}
   \begin{minipage}{\linewidth}
      {\small \bfseries \thetest. {#1}}
      #2
   \end{minipage}
   \bigskip
   \begin{globallrbox}{\solutions}
      \usebox{\solutions}
      #3
   \end{globallrbox}
}

\begin{document}

\begin{tests}
\test{difficulté 1}{Test 1}{Solution 1}
\test{difficulté 2}{Test 2}{Solution 2}
\test{difficulté 3}{Test 3}{Solution 3}
\end{tests}

Plus loin...

\usebox{\solutions}

\end{document}
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: lrbox et minipage...

Messagepar Tukikun » Samedi 17 Octobre 2009, 16:32

Mille merci, ça fonctionne ! :D

Bonne soirée :wink:
Tukikun
Utilisateur
 
Messages: 9
Inscription: Mardi 24 Mars 2009, 21:03
Statut actuel: Post-bac | Licence

Re: lrbox et minipage...

Messagepar Tukikun » Samedi 17 Octobre 2009, 17:20

En fait, j'ai trop vite crié victoire... :| Mais bon, c'est déjà une bonne avancée d'avoir récupéré toutes les solutions. :)

Maintenant j'ai un problème (qui n'est pas une conséquence du changement de lrbox en globallrbox), dû au fait qu'il faut tout encadrer d'une minipage pour que ça fonctionne...

Je m'explique, si on met du texte trop long pour la boîte, elle sort de la feuille. La solution standard est donc de mettre \begin{minipage}{\linewidth} ... \end{minipage} autour du texte qu'on veut mettre dans la boîte.

Sauf que mon souhait serait de mettre à jour au fur et à mesure le texte dans la boîte, donc je ne peux pas mettre des minipage à chaque fois...
La seule possibilité que j'ai trouvée jusqu'à maintenant est de mettre
Code: Tout sélectionner
   \begin{globallrbox}{\solutions}
      \begin{minipage}{\linewidth}
      \usebox{\solutions}
     
      #3
      \end{minipage}
      \bigskip
      \end{globallrbox}


Mais ça a deux inconvénients dont un majeur... Le premier c'est qu'au bout de $n$ tests, je vais avoir $n$ minipages imbriquées... ce qui n'est pas très souhaitable... La seconde, c'est que je voulais l'utiliser avec le package multicol et là autant dire que c'est impossible...

Vous auriez une idée ?

Merci beaucoup. :)

Tukikun.
Tukikun
Utilisateur
 
Messages: 9
Inscription: Mardi 24 Mars 2009, 21:03
Statut actuel: Post-bac | Licence

Re: Boite lrbox et minipage

Messagepar pg » Samedi 17 Octobre 2009, 20:29

Avec les boîtes, tu va t'embêter pour rien sans être sûr d'y arriver. Il vaut probablement mieux écrire les solutions dans un fichier. Par contre, du coup, il faut changer la syntaxe car les commandes posent des problèmes de changement de catcode.

Voici un exemple :

Code: Tout sélectionner
\documentclass[11pt]{amsart}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{lmodern}

\usepackage{lipsum}

\usepackage{multicol}

\usepackage{verbatim}

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

\newcounter{test}

\newenvironment{tests}{%
   \initiatesolution{solutions}
   \bigskip\noindent\begin{minipage}{\linewidth}
      \setlength{\baselineskip}{0.3\baselineskip}\setlength{\parindent}{0pt} \centering {\bfseries Tests\\{\rule{5cm}{0.2mm}} }
   \ignorespaces
   }{
   \end{minipage}%
   \terminatesolution
}

\makeatletter
\newenvironment{test}[1]{%
   \stepcounter{test}
   \begin{minipage}{\linewidth}
      {\small \bfseries \thetest. {#1}}~\ignorespaces}
{
   \end{minipage}
   \bigskip
}
\makeatother

\begin{document}

\begin{tests}

\begin{test}{difficulté 1}
Test 1
\begin{solution}
\textbf{Solution~1} \lipsum[1]
\end{solution}
\end{test}

\begin{test}{difficulté 2}
Test 2
\begin{solution}
\textbf{Solution~2} \lipsum[1]
\end{solution}
\end{test}

\begin{test}{difficulté 3}
Test 3
\begin{solution}
\textbf{Solution~3} \lipsum[1]
\end{solution}
\end{test}

\end{tests}

\begin{multicols}{3}
\input{solutions}
\end{multicols}

\end{document}

(Dans cet exemple, le fichier de solutions est écrasé à chaque environnement tests.)
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Boite lrbox et minipage

Messagepar Tukikun » Samedi 17 Octobre 2009, 21:09

Merci beaucoup, c'est beaucoup plus adapté effectivement... :)

Par contre ça génère un problème conséquent, c'est que je ne peux pas faire une numérotation automatique des solutions, puisque \thetest prend la valeur finale du dernier test à chaque fois :oops: Y-a-t'il un moyen de contourner ce problème ?

Je suis désolé de vous déranger... :oops:
Tukikun
Utilisateur
 
Messages: 9
Inscription: Mardi 24 Mars 2009, 21:03
Statut actuel: Post-bac | Licence

Re: Boite lrbox et minipage

Messagepar pg » Samedi 17 Octobre 2009, 21:19

Oui, c'est possible, en écrivant avant le texte "Solution \thetest" avant le verbatim@start. Attention par contre aux commandes du type \textbf ou ~ qui doivent être précédées d'un \noexpand.

Code: Tout sélectionner
\documentclass[11pt]{amsart}

\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais]{babel}
\usepackage{lmodern}

\usepackage{lipsum}

\usepackage{multicol}

\usepackage{verbatim}

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

\newcounter{test}

\newenvironment{tests}{%
   \initiatesolution{solutions}
   \bigskip\noindent\begin{minipage}{\linewidth}
      \setlength{\baselineskip}{0.3\baselineskip}\setlength{\parindent}{0pt} \centering {\bfseries Tests\\{\rule{5cm}{0.2mm}} }
   \ignorespaces
   }{
   \end{minipage}%
   \terminatesolution
}

\makeatletter
\newenvironment{test}[1]{%
   \stepcounter{test}
   \begin{minipage}{\linewidth}
      {\small \bfseries \thetest. {#1}}~\ignorespaces}
{
   \end{minipage}
   \bigskip
}
\makeatother

\begin{document}

\begin{tests}

\begin{test}{difficulté 1}
Test 1
\begin{solution}
\lipsum[1]
\end{solution}
\end{test}

\begin{test}{difficulté 2}
Test 2
\begin{solution}
\lipsum[1]
\end{solution}
\end{test}

\begin{test}{difficulté 3}
Test 3
\begin{solution}
\lipsum[1]
\end{solution}
\end{test}

\end{tests}

\begin{multicols}{3}
\input{solutions}
\end{multicols}

\end{document}
pg
Modérateur
 
Messages: 2584
Inscription: Jeudi 14 Juin 2007, 23:31

Re: Boite lrbox et minipage

Messagepar Tukikun » Samedi 17 Octobre 2009, 21:45

C'est parfait... Ca sort un "?" à la compilation si je veux mettre des références \ref{test\thetest} à \label{test\thetest}, mais ça fonctionne si je continue la compilation, alors ce n'est pas très grave :)

Merci beaucoup ! :D et bonne soirée. :)
Tukikun
Utilisateur
 
Messages: 9
Inscription: Mardi 24 Mars 2009, 21:03
Statut actuel: Post-bac | Licence


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Ahrefs [Bot], DotBot [Crawler], Google Adsense [Bot], Yandex [Bot] et 21 invités