Le fichier
introhook.phtml Vous pouvez passer lors de votre première lecture
Si vous voulez rajouter du texte après la fenêtre de choix, vous devez créer
un fichier nommé impérativement
introhook.phtml.
Ce fichier s'incorporant dans la suite dans un grand tableau html doit avoir la forme suivante :
<tr>
<td>
</td>
<td>
</td>
</tr>
Bien sûr, cela n'a d'intérêt que si vous rajoutez quelque chose. L'utilisation première
est de créer des boutons de choix de paramètres.
Donnons juste un exemple, cela sera détaillé dans le paramétrage avancé.
<tr>
<td class="wimscenter">Catégorie : </td>
<td>
!formradio confparm1 from 1 to 3 prompt facile, moyen,difficile
</td>
</tr>
Modifier le bas de page des exercices
Le fichier endhook.phtml : Pour faire apparaître des lignes à la fin
de tous les exercices du module, vous pouvez rajouter du texte ici. Une utilisation courante est de mettre un lien sur les outils pouvant être utilisés.
!if $status=waiting
!read tool.phtml linear/vector linear/matrix linear/linsolver
!href module=U2/analysis/docstokes.fr Un document
!endif
Ce lien n'apparaîtra ici que lorsque l'exercice est en cours. Il disparaîtra lorsque l'exercice
est terminé et résolu (
status est une variable prédéfinie utilisée dans le module qui attend qu'on réponde (=waiting) et qui change de valeur lorsqu'on on a répondu à l'exercice.
)
Modifier l'à propos
Lorsque vous cliquez sur A propos dans un module d'exercices
OEF, c'est le contenu du fichier about.phtml :
!changeto oef/$module_language/about.phtml
Cette ligne permet de faire de manière automatique le tableau donnant l'adresse, le nom de l'auteur ... Si vous rajoutez une ligne de texte
AVANT, elle apparaîtra. Vous pouvez donc y mettre
les références que vous avez utilisées, vos remerciements etc !
Compte rendu de mise à jour
Le fichier NEWS sert à informer des mises à jours successives
du module. Par défaut, il contient les lignes suivantes
# This file registers changes to the module.
# Please write in reverse order: the last version first.
Version 1.00:
First publication.
Vous pouvez enlever les deux premières lignes, ... mais retenir le conseil.
Ce que vous écrirez là apparaîtra à la fin de l'A propos. Si vous le remplissez, il permettra
rapidement à l'utilisateur de voir que vous avez rajouté un exercice, que vous avez corrigé
un bogue dans tel exercice.
Mais, nous reverrons cela plus tard.
Modifier le fichier var.proc
# Change to 0 if you don't want the choice `I don't know'
idontknow=1
# Change to 1 of you want all choices to be present
allchoices=0
# Computational precisions: you can change the defaults here.
# pari_precision=18
# maxima_precision=8
# print_precision=8
# Change to no if you don't want classes to import exercises in this module.
# A typical situation is that these exercises use common resources of the module.
class_importation=yes
# Change to yes if you want to put images in common (images/) to all exercises.
# If you do so, you must disable class_importation.
common_images=no
!changeto oef/var.proc
Les lignes commençant par # sont des commentaires.
Vous voyez que vous pouvez, en décommentant la ligne
pari_precision=18
et en changeant le nombre, augmenter la précision des calculs
(bien sûr ne le faites que si nécessaire)
Si vous utilisez des images qui doivent être communes à
plusieurs exercices, mettez
common_images=yes
Il ne doit rien y avoir après la dernière ligne du fichier d'origine.
Publication
Le système de publication des modules permet aux auteurs ayant
corrigé
des erreurs de mettre très vite leurs corrections
à la disposition de tous les serveurs.
Publier un module signifie le rendre public
et utilisable par d'autres enseignants.
Il y a plusieurs sortes de publication possibles.
-
la publication centralisée sur tous les serveurs wims qui le désirent.
-
la publication sur le serveur sur lequel vous travaillez.
Dans le premier cas, pour pouvoir faire la publication, il faut demander
un compte à Xiao. Il est nécessaire d'avoir prouvé une certaine qualité dans
le module. Ensuite, il n'y a de vérification que par le public ou les collègues.
Dans le second cas, l'autorisation est à demander au gestionnaire du serveur.
Le module devra alors avoir comme zone local.
A mon avis, il ne faut pas considérer la zone
local comme un purgatoire pour la publication centralisée.
En effet, la zone du module changera alors nécessairement et il y aura
double module. Ma politique en tant que gestionnaire sera d'effacer tout
module dans la zone local qui est publié ensuite.
Avec comme inconvénient de couper les liens qui auraient été faits de l'extérieur
sur ce module.
Modification après publication
Ca y est, vous avez publié votre module. Et bien sûr, deux jours
après, vous y découvrez une erreur (ne vous inquiétez pas, c'est toujours
comme ça).
Il ne vous reste plus qu'à la corriger. Pour cela,
- Retournez dans votre compte Modtool.
- Si vous avez mis à la poubelle le module après publication,
allez à la page d'accueil de WIMS, cherchez le module que vous désirez modifier,
cliquez sur ce module, puis cliquez sur le lien
Copier dans Modtool en bas de page.
- Modifiez le module par Modtool.
- Vérifiez les différences par Check diff, tester, etc.
- Remplissez le fichier NEWS : indiquez la nouvelle version, les modifications importantes faites.
- Changez le numéro de version dans les propriétés
(Propriétés) : des centièmes, des dizièmes ou des unités
selon l'importance de la modification.
- Publiez en version stable.
- Effacez le module dans le compte Modtool quand la nouvelle version apparaît sur le serveur. Vous pouvez bien sûr le garder sur votre
compte Modtool, mais cela fait double emploi. Si vous avez à modifier,
vous pourrez toujours reprendre la version du serveur.
D'autre part, si vous avez fait un lien d'une feuille d'exercices sur ce module,
vous devez le garder. Cependant, l'année prochaine, changez votre feuille d'exercices
pour lier à la version publique.
Les serveurs WIMS ayant activé la mise à jour automatique récupéreront le
module modifié à leur prochaine mise à jour automatique. S'ils ne l'ont pas fait,
écrivez au gestionnaire ...
Règles de bonne conduite
Avant de publier :
Présentation générale
-
Vérifiez la présentation (titre compréhensible, orthographe,
règles typographiques, clarté de l'énoncé).
-
Vérifiez que toute question posée est bien analysée.
-
Testez suffisamment l'exercice (et faites tester) en particulier
en envoyant aussi des réponses fausses et en vérifiant les feedbacks.
-
Nettoyez le code html en enlevant les balises inutiles ou redondantes.
-
Présentez le code source le plus clairement possible (indentation ...).
-
N'utilisez pas l'option Soft Wrap text de certains éditeurs
et allez régulièrement à la ligne sauf si cela est interdit par le code.
Conseils typographiques
Les quelques conseils suivants sont des conseils de type
éditorial. Ils concernent les mathématiques mais aussi
les autres disciplines et sont finalement simplement de bon sens :
-
Pas d'abréviations inutiles: le titre doit
être sans abréviation, le plus parlant possible (ce n'est pas toujours
facile).
-
L'énoncé doit être parfaitement écrit avec les
règles typographiques en cours en France ainsi que des règles simples
concernant l'introduction des mathématiques.
Entre autres
-
un espace avant les signes de ponctuation en deux morceaux comme :?;!
-
un espace après les signes en un morceau, pas d'espace avant
(virgule, point)
-
Une phrase ne doit pas commencer par un
symbole mathématique : tourner la phrase autrement (raison : si vous
écrivez
P est sur la droite
D .
Q est sur le cercle
C, une lecture rapide pourrait faire croire que l'on parle du
produit scalaire de
D et de
Q).
-
Pour la clarté du texte, son utilise dans les livres une typographie différente pour les
mathématiques et le texte français. Faire de même ici en mettant les
formules mathématiques dans . Il y a quelques bogues concernant
cet emploi, mais en général essayer de ne pas faire des choses trop
compliquées. Cela est valable même si la formule mathématique est
réduite à une seule lettre.
-
Les formules sont plus visibles si
vous laissez un espace avant et après le signe =, + , -
. Cela n'est pas toujours possible, mais le faire si l'on peut.
Lorsque la formule est traduite en TeX, on n'a pas la maîtrise de ce
qui se passe, par contre pour le cas où le code html est utilisé, il
faut y penser.
-
Si les formules mathématiques risquent d'être un peu longues, aller à la ligne
et centrer. Cela les mettra en évidence et ce sera de toute façon plus clair.
-
Ne pas aller à la ligne au milieu d'une phrase en forçant avec <br />
ou
<p> par exemple (sauf raison valable).
Pas la peine de marquer les respirations du texte parlé en allant à la ligne.
De même, ne pas abuser des virgules.
-
Conseil sur le code html : faire du code html valide et le
plus correct et simple possible : fermer les balises (même la balise
<p>, cela évite des bogues de certains navigateurs),
ne pas laisser d'espaces entre la balise et le texte : par exemple
<div class="wimscenter">toto</div>
plutôt
que
<div class="wimscenter"> toto </div>
à moins qu'il n'y ait une réelle
intention. Eviter les balises successives en ajoutant un style css
<span style="color:red; font-weight:bold;">toto</span>
et même définir une classe css que vous mettrez dans la commande
{}
-
Si vous avez utilisé un outil stophistiqué pour produire du code html,
ce qui est inutile, nettoyez et enlevez tout ce qui est inutile.
Cela vous servira quand vous aurez à déboguer ou relire votre texte un peu plus tard.
-
Mettez de la couleur !
-
Mettez en italique les consignes de l'exercice qui ne font pas explicitement
partie de l'énoncé, par exemple :
Entrez non si aucun développement n'existe.
Maintenant l'exercice proprement dit : un intérêt majeur de WIMS est d'avoir
des exercices aléatoires. Donc vérifiez bien que vous avez tiré le
meilleur parti possible de cette possibilité.
Aide commune à plusieurs exercices
Aide commune
Vous désirez écrire une aide commune à plusieurs exercices de votre
module. Pour cela,
Vous pouvez bien sûr écrire plusieurs aides que vous mettrez soit dans des
fichiers différents soit dans le même mais sous la forme
:bla bla bla
etc
: blo blo blo
etc
et selon les exercices, vous irez chercher la première aide (entre le premier
: et le second) ou la seconde aide
\text{monaide=wims(record 1 of aide)}
\help{\monaide}
ou
\text{monaide=wims(record 2 of aide)}
\help{\monaide}
Paramètres supplémentaires
Paramètres supplémentaires
Vous désirez avoir le même exercice avec des difficultés différentes venant
de la taille des données. Par exemple, un exercice sur des matrices d'ordre
2 et un exercice sur des matrices d'ordre 5.
Il faut alors créer un fichier introhook.phtml, par exemple
<tr><td class="wimscenter">Niveau de difficulté</td>
<td>
!formbar confparm1 from 1 to 3
Taille du graphe
</td></tr>
L'utilisateur voit un formulaire lui demandant la "Taille du graphe'', et
peut répondre un entier compris entre 1 et 3. Il n'est pas obligé de
rentrer une valeur.
(On se trouve dans un tableau HTML, dont on vient de définir une ligne.)
Attention les seuls noms autorisés pour ces variables sont les mots
confparm1, confparm2, confparm3, confparm4, confparm5.
Dans les sources de l'exercice, on peut alors définir certaines des données à
l'aide de confparm1. Ne pas oublier de les définir aussi
si confparm1 n'a pas de valeur. Par exemple dans le
fichier toto.oef
\integer{ n = \confparm1=1? randint(3..4):randint(3..4) }
\integer{ n = \confparm1=2? randint(5..7) }
\integer{ n = \confparm1=3? randint(10..12)}
On peut utiliser d'autres types de paramètres. Par exemple,
<tr><td class="wimscenter">Choix d'animal</td>
<td>
!formradio confparm1 list A,B,C prompt Loup, Chèvre, Mouton
</td></tr>
Le paramètre vaut ici
A, B ou C.
En remplaçant formradio par formcheckbox,
on autorise la sélection de plusieurs animaux.
On peut même faire entrer à l'utilisateur une variable. Voici un exemple pris
dans l'exercice Classification périodique
<tr>
<td>Exclure les éléments au-dessus du numéro</td>
<td><input size="3" name="confparm3" value="54" /></td>
</tr>
<tr>
<td>ou une liste de numéros des éléments à tester :</td>
<td><input size="40" name="confparm4" /></td>
</tr>
Ne pas oublier de donner une valeur par défaut à tous les paramètres confparm1, ... .
et surtout une valeur par défaut à
toutes les variables aléatoires qui en dépendent.
Utiliser des fichiers de données
Utiliser des fichiers de données indépendamment des exercices
On peut stocker des données dans un fichier que nous appellerons ici
tableau et les utiliser ensuite dans un ou plusieurs exercices. Prenons l'exemple
de l'exercice de grammaire
suivant.
\title{Choix et/est/ai}
\language{fr}
\text{tableau =randomrow(
Je suis grand ??et,est,ai?? brun.
Le café ??est,et,ai?? chaud.
La fleur ??est,et,ai?? rouge.
Le soleil ??est,et,ai?? chaud
J'??ai,est,et?? chaud)}
\matrix{A = slib(text/cutchoices \tableau)}
\text{good=\A[2;]}
\text{cnt = items(\good)}
\text{mix = shuffle(\cnt)}
\matrix{good= \good[\mix]}
\text{rep = position(1,\mix)}
\statement{
Faire le bon choix :
<p align="center"> \A[1;] \embed{reply 1} \A[3;] </p>
}
\answer{}{\rep[1];\good}{type=menu}
Plutôt que d'avoir les phrases dans le fichier d'exercice, créez un fichier d'adresse
tableau (attention, cette fois-ci ne pas mettre src
). Et mettez-y
le texte suivant
:Je suis grand ??et,est,ai?? brun.
Le café ??est,et,ai?? chaud.
La fleur ??est,et,ai?? rouge.
Le soleil ??est,et,ai?? chaud
J'??ai,est,et?? chaud
:L'élève ??est,et?? sérieux ??et,est?? appliqué.
Paul se ramasse ??et,est?? se relève.
Le pull ??est,et?? chaud ??et,est?? léger.
La rue ??est,et?? étroite ??et,est?? en pente.
Pierre ??est,et?? fort en mathématiques ??et,est?? en français.
La lumière sur le vieux port ??est,et?? très belle en hiver ??et,est?? en été.
Remarquez le signe de ponctuation :
que nous avons un peu grossi. Il va être possible maintenant dans un exercice de
charger ces données soit en entier, soit sélectivement pour la partie entre deux
points consécutifs.
Donnons les premières commandes permettant cette utilisation et qui donneront un
exercice équivalent au précédent :
\text{Tableau = wims(record 1 of tableau)}
\text{a = randomrow(\Tableau)}
record 1 chargera les cinq premières lignes
du tableau, plus exactement celles entre le premier : et
le second.
\text{Tableau = wims(record 2 of tableau)}
\text{a = randomrow(\Tableau)}
record 2 chargera les six dernières lignes
du tableau (il faudra bien sûr changer la suite de l'exercice
qui ne fonctionnera plus)
\text{Tableau = wims(record 0 of tableau)}
\text{a = randomrow(\Tableau)}
record 0 chargera toutes
les lignes du fichier tableau
\integer{m = wims(recordcnt tableau)}
\matrix{Tableau = }
\for{ i = 1 to \m}{
\text{Tableau = \tableau
randrow(wims(record \i of tableau))}
Ici, on compte le nombre de "record" (ici 2,
mais il pourrait y en avoir plus). Et on prend une ligne par type.
On pourra donc poser une question de chaque type.
Un exemple d'exercice complet
\author{Ambali}
\integer{m = randint(1..wims(recordcnt tableau))}
\matrix{Tableau = }
\text{Tableau = randrow(wims(record \m of tableau))}
\matrix{A = slib(text/cutchoices \Tableau)}
\text{cntrow=rows(\A)}
\integer{cntQ=(\cntrow-\cntrow%2)/2}
\matrix{good1 =}
\text{rep = }
\for{i= 1 to \cntQ}{
\text{good=\A[2*\i;]}
\text{cnt = items(\good)}
\text{mix = shuffle(\cnt)}
\matrix{good1=\good1
\good[\mix]}
\text{rep = \rep, position(1,\mix)}
}
\text{rep =wims(nonempty items \rep)}
\text{STEP = wims(makelist r x for x = 1 to \cntQ)}
\steps{\STEP}
\statement{<p style="text-align : center;
background-color : #faffe6;
padding : 1%;
margin : 5% 20%;">
\for{k = 1 to \cntQ}{\A[2*\k-1;] \embed{r \k} }
\A[2*\cntQ+1;]
<p/>}
\answer{}{\rep[1];\good1[1;]}{type=menu}
\answer{}{\rep[2];\good1[2;]}{type=menu}
\answer{}{\rep[3];\good1[3;]}{type=menu}
Donnons un autre exemple d'utilisation de tableau extérieur aux exercices.
Il s'agit de tableau de type "dictionnaire" de la forme suivante :
azote:.....
hydrogene:....
On peut alors aller chercher la ligne associée à azote avec la commande lookup
\text{ligne= wims(lookup azote in tableau)}
et récupérer ensuite les informations qui suivent et dont vous avez besoin.
Utilisation de cpp
Un exemple d'utilisation de cette "technique" est le suivant :
Vous avez un exercice avec certaines variables et des relations entre A et B
et vous voulez faire un exercice où vous donnez A et demandez B et un exercice où
vous donnez B et vous demandez A . la première solution envisagée est de faire un
copier-coller et de changer juste l'énoncé.
Et puis, vous vous apercevez que vous auriez dû fixer autrement
l'aléatoire de vos variables, ou qu'il y a une erreur dans vos calculs.
Et vous devez faire attention de corriger toutes les erreurs dans tous les exercices (et si
vous êtes arrivé à en faire 6 avec les mêmes données de départ, c 'est du travail ... )
Une solution (meilleure) est alors de regrouper les parties communes dans un fichier
que vous appellerez
src/cpp/toto.cpp
La première ligne de ce fichier contiendra le nom des exercices que vous voulez
créer :
target= toto1 toto2 toto3 toto4
Ensuite, chaque exercice aura un titre différent
#if defined TARGET_toto1
\title{Premier exercice}
#endif
#if defined TARGET_toto2
\title{Second exercice}
#endif
#if defined TARGET_toto3
\title{Troisième exercice}
#endif
#if defined TARGET_toto4
\title{Quatrième exercice}
#endif
Etc ...
Vous pouvez tirer partie des commandes cpp :
Les directives #if, #ifdef, #ifndef, #else, #elif and #endif
peuvent être utilisées pour la compilation conditionnelle.
(tiré de
voir ici)
Montrons un exemple tiré de nouveau de la grammaire française
et emprunté à Jean-Baptiste Frondas
Exemple
L'exercice pour fonctionner demande qu'il
ait été créé des fichiers tableau_et, tableau_ou...
target= et_est ou_ou la_la
#define TITLE Choix
#if #TARGET(et_est)
\title{TITLE et/est}
\text{Type=tableau_et}
#endif
#if #TARGET(ou_ou)
\title{TITLE ou/où}
\text{Type=tableau_ou}
#endif
#if #TARGET(la_la)
\title{TITLE la/là/l'a}
\text{Type=tableau_la}
#endif
\language{fr}
\author{Jean-Baptiste Frondas}
\email{ambali@free.fr}
\computeanswer{no}
\format{html}
\text{tableau = wims(record 0 of \Type)}
\text{a = randomrow(\tableau)}
teste si le premier champ est une question
\text{testa= wims(nospace \a)}
\text{first = wims(replace internal ? by | in wims(char 1 of \testa))}
\text{u= \first issametext | ? 1 : 0}
\text{u1 = \u = 0 ? -1:1}
\matrix{A = slib(text/cutchoices \a)}
\text{cntrow = rows(\A)}
\integer{cntQ = (\cntrow+\u1*\cntrow%2)/2}
\matrix{good1 = }
\text{rep = }
\for{i= 1 to \cntQ}{
\text{good=\A[2*\i -\u;]}
\text{cnt = items(\good)}
\text{mix = shuffle(\cnt)}
\matrix{good1=\good1
\good[\mix]}
\text{rep = \rep, position(1,\mix)}
}
\text{rep =wims(nonempty items \rep)}
\text{STEP = wims(makelist r x for x = 1 to \cntQ)}
\steps{\STEP}
\statement{
<p style="text-align : center;
background-color : #FFFFFF;
padding : 1%;
margin : 5% 15%; ">
\for{k = 1 to \cntQ}{
\A[2*\k-1-\u;] \embed{r \k}
}
\A[2*\cntQ+1-\u;]
<p/>}
\answer{}{\rep[1];\good1[1;]}{type=menu}
\answer{}{\rep[2];\good1[2;]}{type=menu}
\answer{}{\rep[3];\good1[3;]}{type=menu}
\answer{}{\rep[4];\good1[4;]}{type=menu}
\answer{}{\rep[5];\good1[5;]}{type=menu}
\answer{}{\rep[6];\good1[6;]}{type=menu}
\answer{}{\rep[7];\good1[7;]}{type=menu}
\answer{}{\rep[8];\good1[8;]}{type=menu}
A suivre...
Liens sur d'autres modules
Si vous désirez faire un lien sur un autre module dans la page d'introduction, par exemple sur un document explicatif ou sur un
autre module d'exercices plus facile ou plus difficile,
rajoutez dans le fichier intro.phtml avant la ligne
!tail :
!set wims_ref_target=wims_internal
!href module=adresse_du_module nom du lien
par exemple
Vous pouvez aller voir le document
!set wims_ref_target=wims_internal
!href module=H2/algebra/docpuissance.fr Tout sur les puissances
pour réviser le cours.
Pour rajouter un tel lien en bas de chaque exercice, voir
Amélioration du module
.
Module multilangage
(Version préliminaire valable pour la version >4.09)
Si vous désirez faire ou faire faire une traduction dans une autre langue,
il faudra séparer un peu le code du langage. Une manière de procéder est la suivante.
Même si cela parait au départ un peu compliqué, cela est facile à mettre
en oeuvre si on y pense dès le début.
-
Copier tous les exercices *.oef qui ne sont pas créés par des fichiers cpp
dans le répertoire cpp en changeant l'extension
toto.oef devient cpp/toto.cpp
Pour un tel fichier, ajouter en haut du fichier
target=toto
(toto est le nom du fichier sans extension).
Tous les fichiers à créer dans la suite seront dans src/cpp .
-
Créer un fichier
"common.inc"
avec la ligne
\text{lang=slib(oef/env lang)}
On peut y mettre pour commodité des instructions communes à tous les exercices
comme \author{} \precision{}
L'inclure dans toto.cpp
#include "common.inc"
-
Créer un fichier lang_toto.inc , dans ce fichier,
mettre le texte de l'exercice (ou des morceaux) dépendant de la langue en créant des variables contenant
ce texte, tout en remplaçant ce texte par la variable dans l'exercice toto.cpp.
Les variables sont par exemple du type
name_xxx de manière à bien les distinguer des variables déjà définies.
Essayez de ne mettre que du texte et le moins d'environnements de styles possibles
(ceux-ci doivent être dans le fichier principal toto.cpp).
- Ecrire
#include "lang_toto.inc"
quelque part dans le fichier toto.cpp.
L'endroit dépend de ce qu'on met dedans (s'il y des variables de l'auteur, il faut bien
sûr que ces variables soient connues lorsque le fichier lang_toto.inc est inclus.)
Une fois le texte originel écrit, le recopier dans le même lang_toto.inc
encadré de
\if{\lang=en}{
}
et traduire !
-
Faire un fichier de titre
lang_title.inc
dans lequel on mettra les titres des exercices sous la forme
#if defined TARGET_toto
#define TITLE Titre de l'exercice
#define TITLE_en Title of the exercise
#endif
et continuer avec tous les exercices.
Dans le fichier toto.cpp, écrire
#include lang_title.inc
\title{TITLE}
\title_en{TITLE_en}
On peut bien sûr faire pareil pour toutes les langues.
-
Dans les propriétés, dans la partie Langue (onglet Langue),
rajouter "en" dans le champ Autres langues, sauver, puis y revenir :
un bouton Propriétés (Anglais) est apparu, cliquer dessus, remplir les propriétés
relatif au module (si les mots clés
ont été écrits en "anglais technique", inutile de les répéter).
Regarder l'aide pour les mots clés.
A partir de la version 4.09, un choix des langues apparait dans l'introduction du module.