-*- coding: utf-8; fill-column: 72; -*- La question initiale de Thomas Söll portait comment passer des points d'interpolation calculés avec xint à PSTricks via \listplot. Avant toute chose, il faut savoir que \listplot n'admet pas la notation scientifique ; donc, la syntaxe de base que l'on utilisera pour chaque coordonnée est du type \xintieval{[4] \xintfloatexpr \relax } Attention que poormantrig.tex ne définit sind() et cosd() que pour emploi dans \xintfloatexpr (contrairement à l'extension poormanlog qui rend log10() et exp10() utilisatble avec \xintexpr). Mais il y a une autre raison aussi d'utiliser \xintfloatexpr, c'est dans le cas d'un x^-20 par exemple, que xintexpr va représenter par 1/un nombre nécessitant jusque 159 chiffres si x a 8 chiffres au départ. Donc la virgule flottante est recommandée quoi qu'il en soit. Ce \xintieval{[4] \xintfloatexpr \relax } sera utilisé systématiquement à l'intérieur des \psdot, \psline, \listplot, etc..., afin d'envoyer à PSTricks des nombres en virgule fixe et 4 chiffres décimaux après la virgule (il semble inutile d'en utiliser 5). Mais avec l'emploi de variables on peut simplifier un peu la syntaxe. Il y a deux types de variables avec xint : A. les variables "macros" définies par un \edef : \edef\X{\xintfloatexpr sqrt(2)\relax} On note bien que \X est totalement évalué, mais conserve un format interne que l'on ne peut pas imprimer directement. Il devrait y avoir une interface plus directe du genre : \xintfloatedef\X{sqrt(2)} mais elle n'est pas encore ajoutée à xint. Bon, donc je l'ajoute aux préambules des documents pour en simplifier la lecture : \def\xintfloatedef#1#2{\edef#1{\xintfloatexpr #2\relax}} (en fait la définition fera \xintfloatexpr\empty#2\relax pour éviter une ambiguïté possible avec la syntaxe pour l'argument optionnel de \xintfloatexpr et celles pour les listes) Ces \X peuvent être utilisés dans d'autres calculs : \edef\Y{\xintfloatexpr 2\X + \X\X\X + \X^10\relax} avec comme l'on voit des multiplications tacites possibles. On peut aussi faire : \xintfloatedef\Point{sqrt(2), sqrt(3)} \xintfloatedef\Y{[\Point][0] + [\Point][1]} (voir la remarque sur le \empty plus haut) Mais ce n'est pas en interne très efficace, il vaut mieux avec 2 variables séparées \PX et \PY. B. les variables "nommées" avec \xintdeffloatvar : \xintdeffloatvar alpha_2 := sqrt(2); Les deux choses (A) et (B) sont presque équivalentes mais : - par (A), on est a priori limité à a-z, A-Z, par (B) on peut utiliser des chiffres, des tirets-bas et le caractère @ - l'utilisation d'une variable définie par (B) est un peu moins efficace qu'une variable définie par (A), car elle ajoute l'overhead de la reconnaissance de son nom ; de plus "alpha_2 3" ne va pas faire "alpha_2*3" mais essayer d'utiliser une variable "alpha_23", tandis que "\X3" fait "\X*3" automatiquement mais je ne recommande pas cette syntaxe. et avec "alpha_2(3)" tout dépend s'il y a aussi une fonction "alpha_2", sinon alors cela fait bien "alpha_2*3". Avec "\X(3)" aucune ambiguïté, mais encore une fois je ne recommande pas, par contre "\X(\Y+\Z)" est une chose normale à faire. - la définition d'une variable par (B) est légèrement plus coûteuse que par (A). L'avantage certain de (B) c'est de ne pas se préoccuper si une macro existe déjà dans TeX avec le nom que l'on veut utiliser ! Au final, je me suis mis à utiliser plutôt la syntaxe (A), surtout pour les calculs faits dans un pspicture car là on se sent libre d'utiliser les noms de macros que l'on veut. Pour des variables à scope global, j'utiliserai plutôt la syntaxe (B). Pour les deux types de variables on pourra faire \xintieval{[4]\X} ou \xintieval{[4]alpha} ce n'est pas grave que \X ou "alpha" aient utilisé le parseur pour la virgule flottante pour la définition ; les variables seront reconnues par \xintieval. Bien sûr, si l'on fait \xintieval{[4]\X^10/\Y^3} attention que le calcul est fait **exactement** avant l'arrondi à 4 chiffres après la virgule. Donc, a priori, plutôt \xintieval{[4]\xintfloatexpr \X^10/\Y^3 \relax} mais dans le cas d'un seul \X (ce qui est souvent le cas pour envoyer des coordonnées à \psdot par exemple) alors \xintieval{[4]\xintfloatexpr\X\relax} est inutile \xintieval{[4]\X} suffit. Attention que pour les **fonctions** c'est différent. Si l'on a défini une fonction MaFonction avec \xintdeffloatfunc, alors \xintieval{[4] MaFonction(2)} ne fonctionne pas il faut obligatoirement \xintieval{[4] \xintfloatexpr MaFonction(2)\relax} On peut bien sûr faire \xintieval{[4] \xintfloateval{MaFonction(2)}} mais ce n'est pas recommandé car il est moins efficace de quitter le format interne renvoyé par \xintfloatexpr. Cette discussion me donne l'idée d'ajouter à xint les "Fonctions-Macros" du type \xintfloatexpr{\MaFonction(2)} qui seraient reconnues très vite car un seul token au sens de TeX, mais toute en utilisant la syntaxe des fonctions avec parenthèses et virgulent. C'est très facile à ajouter à xint, je le ferai lorsque j'aurai le temps. Suite : LISMOI-xintthespaceseparated.txt Addendum : dans les fichiers j'utilise le wrapper \newcommand\FloatToFix[1]{\xintieval{[4]\xintfloatexpr\empty#1\relax}} pour des valeurs individuelles dans \psdot etc... Comme expliqué ci-dessus avec une variable-macro \X, on peut faire directement \xintieval{[4]\X} car l'origine dans un \xintfloatexpr n'est pas oubliée par \X. J.-F. B, 3 mars 2019