Créer exos aléatoires vers $\LaTeX$
Bonjour à tous,
Comme déjà évoqué par des intervenants, le but est de créer un énoncé sous format $\LaTeX$ avec des données aléatoires (noms de points, mesures de côtés, d’angles, etc.).
Ma première idée :
Utiliser excel comme base puis faire écrire le code $LaTeX$ avec VBA dans un fichier *.txt par exemple (ou *.tex ?).
Vient une première question : dans VBA, je vais sûrement trouver des tutos mais si c’est simple, quelqu’un pourrait m’indiquer un code VBA qui permet d’écrire le contenu d’une cellule par exemple, dans un fichier ?
Je le répète, si c’est un peu de travail chronophage, j’irai chercher les tutos.
Deuxième question :
Une autre idée pour générer ce texte ?
Cordialement
Dom
Comme déjà évoqué par des intervenants, le but est de créer un énoncé sous format $\LaTeX$ avec des données aléatoires (noms de points, mesures de côtés, d’angles, etc.).
Ma première idée :
Utiliser excel comme base puis faire écrire le code $LaTeX$ avec VBA dans un fichier *.txt par exemple (ou *.tex ?).
Vient une première question : dans VBA, je vais sûrement trouver des tutos mais si c’est simple, quelqu’un pourrait m’indiquer un code VBA qui permet d’écrire le contenu d’une cellule par exemple, dans un fichier ?
Je le répète, si c’est un peu de travail chronophage, j’irai chercher les tutos.
Deuxième question :
Une autre idée pour générer ce texte ?
Cordialement
Dom
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
On peut écrire un programme Python qui génère le fichier .tex et écrit dessus.
Je trouve un avantage à éditer du Excel (voire du Word) car ce n’est pas du code que l’on lit.
On voit bien le contenu de la feuille de calculs par exemple. Ensuite on code en VBA un code Latex.
Mais je peux m’adapter, bien sûr.
Merci pour la réponse.
Voici une façon de tout générer depuis le fichier .tex. J'ai donné un autre exemple plus complexe ici (calcul sur les fractions).
Merci pour la réponse.
Je me demandais s’il existait des « random » directement dans le code LateX.
Très intéressant.
Je n’ai pas encore essayé : le « point{B} » m’étonne au lieu de « pointB », vers la fin, juste avant le « begin{document} ».
\choixPoints, qui est un alias pour \dom_choisir_noms_points_aleatoires:n, initialise un certain nombre de points (ici, 3 mais ça pourrait être ce que l'on veut) en permutant aléatoirement la liste passée en argument puis en stockant le premier dans \l__dom_pointA_tl, le deuxième dans \l__dom_pointB_tl et le troisième dans \l__dom_pointC_tl.
Ces trois noms de macros utilisent les conventions de nommage expl3 (préfixe 'l' = variable locale, suivi de deux '_' = interface privée, espace de nommage 'dom' pour éviter les clashes, suffixe '_tl' = type token list). Tu ne peux pas les utiliser directement en dehors de \ExplSyntaxOn... \ExplSyntaxOff car en temps normal, le _ déclenche une erreur s'il n'est pas utilisé en mode maths (et même en mode maths, il ne peut faire partie d'un nom de macro, sauf à utiliser \csname... \endcsname pour fabriquer le token). Par contre, en régime \ExplSyntaxOn, _ et : sont considérés comme des lettres du point de vue de la table des catcodes de TeX ; ils peuvent donc être utilisés directement dans des noms de macros.
Tu pourrais écrire ton énoncé en syntaxe \ExplSyntaxOn comme ça : ou encore comme ça, parce que les espaces sont (presque partout) ignorés en régime \ExplSyntaxOn : On voit que ce “catcode régime” n'est pas très agréable pour écrire des phrases — il est plus prévu pour programmer. Pour cette raison, mon code crée trois macros \pointA, \pointB et \pointC qui, après une étape de développement, donnent chacune respectivement \l__dom_pointA_tl, \l__dom_pointB_tl et \l__dom_pointC_tl. Ainsi, on peut utiliser \pointA, \pointB et \pointC à la place de \l__dom_pointA_tl, \l__dom_pointB_tl et \l__dom_pointC_tl, et cela ne nécessite aucune acrobatie, y compris en régime \ExplSyntaxOff (« syntaxe LaTeX2e »).
Parenthèse. C'est presque la même chose pour \__dom_triangle_choisi: et \triangleChoisi. La seule différence est que \triangleChoisi est figé égal à la définition de \__dom_triangle_choisi: au moment où ceci est exécuté : (mieux car cela génère une erreur si \triangleChoisi est déjà défini). C'est un chouia plus efficace que ceci : qui nécessiterait une étape de développement pour passer de \triangleChoisi à : Par contre, si l'on s'amuse à redéfinir \__dom_triangle_choisi: après le cela n'affecte pas \triangleChoisi (c'est le principe de \let). Fin de la parenthèse.
Maintenant, revenons à ma « macro générique » \point. C'est tout simple : pour tout $x$, trois étapes de développement sur \point{x} donnent le control sequence token (“macro”) \l__dom_point$x$_tl (même si $x$ contient des caractères bizarres comme des espaces ou des '\'). Cette macro permet donc d'obtenir \l__dom_pointZZZ_tl avec \point{ZZZ}, sans qu'il soit nécessaire d'avoir préalablement exécuté :
Comme d’habitude, il y a du contenu !
Je vais bosser ça :-)
-- Schnoebelen, Philippe
Je prolonge un peu mon message précédent. Reprenons la définition ci-dessus : Avec le code donné dans mon message précédent, lorsque \pointA est développée, on obtient un lexème caractère explicite (explicit character token), par exemple X, Y ou Z après \choixPoints{X,Y,Z} ; autrement dit, pour TeX, après une étape de développement — qui se fait en général automatiquement —, c'est exactement comme si on avait tapé la lettre choisie aléatoirement à la place de \pointA (idem pour \pointB et \pointC). Pas de problème en vue. Mais si on a initialisé un peu différemment : on s'approche d'une zone dangereuse. Par exemple, après développement, ceci : peut devenir cela (n'oublions pas la permutation pseudo-aléatoire appliquée dans \choixPoints) : Ça passe encore, mais on sent les problèmes arriver. Si mon énoncé contient par exemple : là, c'est cuit, parce que « f_A_1 » en mode maths n'est pas syntaxiquement correct (c'est ambigu). Il fallait écrire « f_{\pointA} ». Pour éviter ce genre de problème, il vaut donc mieux mettre des accolades autour des paramètres (à supposer qu'on veuille bien en faire des \mathord : c'est effectivement le cas ici, car les paramètres représentent tous des noms de points : on ne veut pour aucun d'eux un espacement spécial autour comme pour les opérateurs ou relations binaires, les \mathop, les délimiteurs ouvrants ou fermants, etc.). On arrive donc à ceci, qui est un peu plus propre : (j'enlève exprès le deuxième paragaphe). On peut aussi décider d'expliciter les paramètres de la macro \enonce : Dans ce cas, il faudra faire \enonce{\pointA}{\pointB}{\pointC} ou \enonce{P}{Q}{R} lors de l'appel. Mais attention :
- avec cette façon de faire, on ne peut dépasser 9 paramètres ;
- la lisibilité du code décroît sensiblemement avec le nombre de paramètres.
Pour éviter ces écueils, on peut soit garder la première méthode (avec toutes les accolades pour être bien propre), soit utiliser une syntaxe d'entrée de type keyval list qui permet de passer un nombre arbitraire de « paramètres » nommés : Cette approche n'empêche pas d'utiliser en argument des macros quelconques contenant des noms choisis aléatoirement, telles que nos macros \pointA, \pointB et \pointC définies ci-dessus : Si cette façon de faire intéresse, je peux proposer une implémentation avec pgfkeys ou l3keys.Deuxième chose : je bricole un petit peu pour que mon code stocke dans \pointA, \pointB, \pointC non pas le contenu directement sorti du tirage aléatoire, mais celui-ci entouré d'accolades (vu comment sont écrites \dist et \triang, ça fait « ceinture et bretelles » avec elles ; mais ainsi, c'est robuste même si on n'utilise pas des macros aussi bien écrites :-D).
Troisième chose : idem mais en explicitant les paramètres de l'éononcé et en les passant sous la forme d'une keyval list (clé1=valeur1, clé2=valeur2...) comme proposé dans mon message précédent, ceci implémenté avec le package pgfkeys. La partie de ce fichier située entre $\backslash$begin{document} et $\backslash$end{document} est comme suit :
Ha oui, j’observe moins d’espace entre les lettres dans ces nouvelles versions que dans la première.
Apparemment j’ai trouvé quelque de plus pointilleux que moi sur la mise forme des documents (:D
Merci encore.