Vous êtes ici : Accueil > LaTeX > Générateur d’interrogations > Literate programming et shell-escape dans LaTeX
Publié : 24 février 2007
Format PDF Enregistrer au format PDF

Literate programming et shell-escape dans LaTeX

Comment appeler giac, maple ou maxima dans un document LaTeX

Le rêve est de faire générer par LaTeX les calculs de mes interros, cours, exercices, examens... Après tout, ce sont toujours les mêmes calculs.

Ce n’est évidemment pas simple.

La recherche de cette solution particulière a relevé de l’enquête policière : les fausses pistes furent nombreuses.

Dans l’article suivant, je présente un exemple de 3 questions d’exercices dont 2 sont générées par cette méthode.


Un petit mot d’introduction pour donner le contexte :

Gràce au package "answers", je peux générer un questionnaire et son solutionnaire séparément à partir d’un seul document maître. Si je peux "injecter" des valeurs numériques aléatoires et faire faire les calculs par un programme externe, puis les réinjecter dans LaTeX, je peux distribuer des contrôles différents à mes élèves. (C’est toujours drôle d’avoir la réponse A dans le questionnaire B !) Les élèves peuvent "méta-communiquer" sur un devoir mais pas recopier simplement les réponses.

Ceci est dans l’idée de "wims" un serveur web d’exercices mathématiques. Mais ici, je peux générer des documents papiers (interros, devoirs, examens, ...).


Première étape : permettre à LaTeX d’éxécuter un programme extérieur

Dans un document LaTeX

\immediate\write18{Nom_de_commande}

permet d’exécuter la commande "Nom_de_commande" si vous compilez votre document avec l’option "—shell-escape".

latex --shell-escape bc.tex

Si vous travaillez dans un environnement de développement, il faut que LaTeX recoive cet arguement automatiquement. Sinon, la commande n’est pas exécutée !

DANGER : ceci est un trou de sécurité. LaTeX peu alors exécuter des commandes du type

# cd; rm -rf *

Bon, vous êtes prévenu.

- Première solution :

Faire en sorte qu’il ne soit pas nécessaire de passer cet argument et que LaTeX accepte d’office d’exécuter une commande. Il faut modifier la configuration globale de LaTeX dans texmf.cnf.
- Trouver texmf.cnf kpsewhich permet de trouver un fichier spécifique à LaTeX

kpsewhich texmf.cnf

En root, éditer le fichier

#vi /usr/share/texmf/web2c/texmf.cnf

et remplacer

"shell_escape= f" par "shell_escape= t"

Chez moi, ça marche !

- Deuxième solution :

Dans votre environnement de développement LaTeX (J’utilise Kile), donner " —shell-escape" comme argument à LaTeX dans les options de compilation.


- Deuxième étape : envoyer les bonnes instructions à Giac ou Maxima

Je me limiterai à deux programmes d’algèbre sur ordinateur : Maxima et Giac

POURQUOI :
- Il sont open source !
- De plus, l’avantage de ces programmes est leur capacité à générer du code LaTeX comme sortie de leurs calculs.
- Ce sont des programmes "généralistes" [1] d’algèbre sur ordinateur.

J’ai pas mal travaillé avec Maple quand j’étais au CSO. Maple était un excellent programme "généraliste" d’algèbre sur ordinateur. Ces 2 programmes sont "apparentés" à Maple et me sont plus familiers que d’autres.

Maxima est l’ancêtre de Maple. Avant d’être mis en open-source, il s’appelait MacSyma. Il est écrit en LISP et je le juge assez lourd. MAIS il a l’avantage d’être très présent dans le monde linux.

Giac/xcas est un petit nouveau mais il a BEAUCOUP d’avantage pour moi. Commencons par le seul point noir : il n’est pas inclus dans les distributions officielles debian/ubuntu. Mais sur son site, on trouve des packages debian sarge / ubunutu qui tournent bien.

Son ENORME avantage pour moi est sa capacité à lire les worksheets maple. [2]

Et puis, pas de bol pour maxima, le premier exemple fonctionnel de ce projet fonctionne avec Giac/xcas

Sur le site de giac, l’auteur renseigne un fichier LaTeX qui fonctionne mais qui fait plusieurs choses que je ne désire pas :
- Il est écrit en TeX. (Ma consommation d’aspirine à quintuplé quand j’ai essayé de comprendre !)
- Il inclut la commande d’entrée dans la sortie LaTeX. Or je veux éviter ça !
- Il faut lancer giac "à la main", entre 2 compilations latex.

\$latex calcul.tex
\$giac calcul.giac
\$latex calcul.tex

- troisième étape : Créer un environnement en LaTeX pour automatiser celà

Le premier exemple fournit ici n’est pas encore optimum, mais c’est un "proof of concept". Il écrit des guillemets "parasites" dont je n’arrive pas encore à me débarasser. Il n’exécute q’une seule commande à la fois. Les noms de fichiers doivent être encore automatisés...

Le deuxième exemple, corrigé gràce à l’aide fort obligeante de Bernard Parisse, permet d’enchaîner les calculs et élimine les guillemets dans l’output.

Il faut compiler deux fois

\$latex env_giac.tex
\$latex env_giac.tex

Mais il est 23h48 et Sander va se lever tôt demain et moi aussi ! Dodo !


Le deuxième exemple, corrigé gràce à l’aide fort obligeante de Bernard Parisse, permet d’enchaîner les calculs et élimine les guillemets dans l’output.

% inspired by http://www.mathematex.net/phpBB2/2-vt1220-20.html
\documentclass[12pt]{article}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{graphics}
\usepackage{moreverb}
\makeatletter
%commande pour faire appel à giac
\newcommand{\executGiac}[1]{
%\immediate\write18{@echo off}
\immediate\write18{giac  <#1 } }
\makeatother
\begin{document}

% on écrit les  commande giac  dans le fichier test2.in
\begin{verbatimwrite}{test2.in}
maple_mode(0);
Sortie:=fopen("test2.out.tex");
1+1;
Resultat:=cat("\$\$",latex(ans()),"\$\$");
diff(sin(x^2),x);
Resultat:=cat(Resultat," ","\$\$",latex(ans()),"\$\$");
int(exp(x)*cos(x),x);
Resultat:=cat(Resultat," ","\$\$",latex(ans()),"\$\$");
fprint(Sortie,Unquoted,Resultat);
fclose(Sortie);
    % quitter giac
\end{verbatimwrite}

\executGiac{test2.in}
% on va inclure  l'output crée par giac  dans le document
\input{test2.out}


\end{document}

Exemple de sortie :

\$\$2\$\$ \$\$\mbox{cos}(x^{2})\* 2\* x\$\$ \$\$e^{x}\* (\frac{1}{2} \* \mbox{cos}(x)-(\frac{1}{-2} \* \mbox{sin}(x)))\$\$

- TODO :
- Faire en sorte que giac ne soit appelé qu’une seule fois. Càd. ne pas lancer 5 giac si j’ai 5 "\executGiac" ds. mon code. (Avec des compteurs ?)
- Les "mode_maple(0)", "fopen", "fwrite", "fclose", etc. devrait pouvoir être envoyés dans la définition de l’environnement.

- WEBOGRAPHIE :

Les sites où j’ai trouvé de l’information.
- Inspiration générale : http://www-cs-faculty.stanford.edu/...

- Première étape : voir les derniers posts sur ces deux pages : Avec bc : http://www.mathematex.net/phpBB2/ca...

avec matlab : http://www.mathematex.net/phpBB2/2-...

Documents joints

Post-scriptum

Toutes ces commandes sont très très très spécifiques à un environnement Linux ! Désolé pour les utilisateursde Vindoze et autres Macinbroches !

Il existe des environnements (comme emaxima) qui permettent d’avoir les résultats de calculs effectués par maxima dans du code LaTeX, mais ceux-ci s’obstinent toujours à inclure les commandes maxima !! Or, JE NE VEUX PAS CA !!!

Notes

[1] Càd. possédant une vaste librairie de fonctions et pas spécialisé presque exclusivement dans la théorie des groupes comme d’autres.

[2] J’ai encore plein de worksheets que j’avais écrites en Maple 5 pour illustrer mes cours. Or Maple 5 ne tourne plus sous debian sarge/libc6 (même avec les compat libs !). Je n’ai aucune envie d’acheter maple 9 qui est un mamouth mégalomane atteint d’elephantiasis !!! (en plus d’être stupidement cher !)