Reponsesperso : erreur avec \def\AMCanswer#1#2

Added by Frédéric Bréal over 10 years ago

Bonjour,

Je teste les commandes réponses perso avec l'exemple trouvé sur la documentation en anglais. J'ai copié-collé votre exemple et j'ai une erreur de compilation liée à le ligne 126 (l'accolade de fermeture de la commande exemplaire).

\begin{question}{add}
\def\AMCbeginAnswer{$\Big($}
\def\AMCendAnswer{$\Big)$}
\def\AMCanswer#1#2{#1  #2\hfill}
2+2=
\begin{reponsesperso}
\bonne{4}
\mauvaise{2}
\mauvaise{3}
\end{reponsesperso}
\end{question}

! Illegal parameter number in definition of \iterate.
<to be read again>
1
l.126 }
You meant to type ## instead of #, right?
Or maybe a } was forgotten somewhere earlier, and things
are all screwed up? I'm going to assume that you meant ##.
! Illegal parameter number in definition of \iterate.

Cette erreur disparaît si je supprime la commande \def\AMCanswer#1#2{#1 #2\hfill} ou si je supprime la commande \exemplaire{1}{...} ou simplement les accolades de début et de fin d'exemplaire

J'ai testé avec le fichier automultiplechoice.sty du 1/9/2013 (version stable sous windows et miktex) et du 5/12/2013 (version test sous xbuntu avec virtualbox).

Je vous joins mon fichier (ligne 111).

Merci.


Replies (8)

RE: Reponsesperso : erreur avec \def\AMCanswer#1#2 - Added by Alexis Bienvenüe over 10 years ago

Comme vous êtes à l'intérieur de la commande exemplaire, il faut doubler les # :

\begin{question}{add}
\def\AMCbeginAnswer{$\Big($}
\def\AMCendAnswer{$\Big)$}
\def\AMCanswer##1##2{##1  ##2\hfill}
2+2=
\begin{reponsesperso}
\bonne{4}
\mauvaise{2}
\mauvaise{3}
\end{reponsesperso}
\end{question}

RE: Reponsesperso : erreur avec \def\AMCanswer#1#2 - Added by Frédéric Bréal over 10 years ago

Bonsoir,

Comme vous êtes à l'intérieur de la commande exemplaire, il faut doubler les #
Merci pour la réponse.

Question sans rapport direct avec AMC mais plutôt Latex
Votre réponses me pose un problème de compréhension.
Dans ce code (copié d'après votre exemple dans le wiki), la commande est définie avant exemplaire mais elle est appelée dans la commande exemplaire. Je comprends l'intérêt des doubles #.

\def\insertRespectconsigne{ %
{\def\AMCbeginQuestion##1##2{}\AMCnobloc%
 \begin{questionmult}{00respectconsigne}
\AMCnoCompleteMulti\AMCdontAnnotate
\def\AMCbeginAnswer{}\def\AMCendAnswer{}
   Reservé~~\begin{reponsesperso}[o]\bareme{p=-2}
    \mauvaise{-2~}\bareme{b=0,m=-2,e=-2}
    \mauvaise{-1~}\bareme{b=0,m=-1,e=-2}
    \bonne{0~}\bareme{b=0,m=0,e=-2}
    \end{reponsesperso}
 \end{questionmult}}
}

Dans ce code (inspiré de votre exemple), le doublement des # pose problème alors que l'élément est appelé dans la commande exemplaire. Pourquoi ? Merci de votre éventuelle réponse qui participera à mon auto-formation en latex.

\element{exercice}{  
\begin{question}{ex01}
Coche la bonne réponse qui correspond au schéma.\medskip

\begin{minipage}[c]{0.1\linewidth}
\begin{tikzpicture}[scale=0.35]
    \filldraw[gray!20](0,0) arc (0:-180:1)--(-2,4) -- ++ (2,0)--cycle;
    \draw(-2,0) -- ++ (0,8) (0,0) -- ++ (0,8);
    \draw(0,0) arc (0:-180:1);
    \draw (-0.5,-1) node[below]{Eau et sucre};
\end{tikzpicture}
\end{minipage}
\begin{minipage}[c]{0.45\linewidth}
\begin{reponses}
\bonne{Le sucre est \textbf{soluble} dans l'eau.}
\mauvaise{Le sucre est \textbf{insoluble} dans l'eau.}
\mauvaise{Le sucre est \textbf{miscible} dans l'eau.}
\mauvaise{Le sucre est \textbf{non miscible} dans l'eau.}
\end{reponses}
\end{minipage}
\begin{minipage}[c]{0.35\linewidth}
\def\AMCbeginQuestion#1#2{}  <----
\begin{question}{ex02}
\begin{reponses}
\bonne{Le mélange est \textbf{homogène}.}
\mauvaise{Le mélange est \textbf{hétérogène}.}
\end{reponses}
\end{question}
\end{minipage} 
\end{question} 
}

RE: Reponsesperso : erreur avec \def\AMCanswer#1#2 - Added by Frédéric Bréal about 10 years ago

Bonjour,

J'ai un problème similaire mais avec

\def\AMCbeginQuestion#1#2{\par\noindent{\textbf{Q.#1}}\hspace*{0.5ex}}

Je suis en mode non-ensemble et copies pré-remplies. Le code ci dessous est écrit dans la commande \newcommande{sujet}{...}

\AMCsection{La chromatographie}

\def\AMCbeginQuestion#1#2{\par\noindent{ \textbf{Q.#1}}\hspace*{0.5ex}}
\begin{questionmult}{20}
...
\begin{reponseshoriz}[o]
...
\end{reponseshoriz}
\end{questionmult}

Même si je double les #, cela ne fonctionne pas.

RE: Reponsesperso : erreur avec \def\AMCanswer#1#2 - Added by Alexis Bienvenüe about 10 years ago

Pouvez-vous envoyer un source complet ?

RE: Reponsesperso : erreur avec \def\AMCanswer#1#2 - Added by Alexis Bienvenüe about 10 years ago

Ligne 239 par exemple, pour éviter tout problème d'imbrication des définitions de commandes, vous pouvez simplement appeler une commande \Qcourt que vous aurez préalablement définie (juste après le \begin{document}, ou dans le préambule) :

\newcommand\Qcourt{\def\AMCbeginQuestion##1##2{\par\noindent{ \textbf{Q.##1}}\hspace*{0.5ex}}}

En LaTeX, les #n représentent la valeur des arguments d'une commande :
\def\double#1{#1 #1}

définit une commande \double qui écrit deux fois son argument (l'argument numéro 1).
Donc, si vous écrivez
\newcommand\Qcourt{\def\AMCbeginQuestion#1#2{\par\noindent{ \textbf{Q.#1}}\hspace*{0.5ex}}} % erreur

Les #1 et #2 représentent les arguments 1 et 2 de la commande \Qcourt (qui n'en a pas) : ce n'est pas ce qu'on veut. Doubler les # est comme un échappement des #, qui permet de faire marcher \Qcourt.

RE: Reponsesperso : erreur avec defAMCanswer#1#2 - Added by Frédéric Bréal about 10 years ago

Merci pour la commande et le cours.

À propos : joli sujet !

Merci

(1-8/8)