Download Pythontex pour latex and more Study Guides, Projects, Research Computer science in PDF only on Docsity!
IREM
Lille
ArCSiN
PYTHON et LATEX
Comment générer des sujets aléatoirement à
l’aide du package pythontex?
Laurence LE FOLL - Jean-Marc DUQUESNOY - Fabrice EUDES Groupe ArCSiN — IREM de Lille Dernière version : 25 mars 2025
IREM
Lille
ArCSiN
U˜b˘u‹n˚tˇuffl, ”no˘tˇio“nffl ˛h˚u‹ma‹n˚i¯sfi˚t´e,o˘r˚igˇi‹na˚i˚red˚uffl S˚udfflde ˜l„A˜fˇr˚iqfi˚ue,qfi˚u˚iffl ¯po˘u˚r˚ra˚i˚t êˇtˇre ˚tˇrad˚u˚i˚t´e ¯p`a˚rffl
« ¯j´e ¯sfi˚u˚i¯s c´eqfi˚ue ¯j´e ¯sfi˚u˚i¯sgˇrâc´e àfflc´e qfi˚ue ” no˘u¯s ¯sfio“m‹m`e˙s ˚t´o˘u¯s »
Re´g´a˚rdeˇz ” vfleˇr¯s ˜l´e˙séˇt´o˘i˜l´e˙s eˇt ¯pa¯s ” vfleˇr¯s ” vˆo¸s ¯p˚ie´d¯s. E˙sfi¯sfia‹y´eˇz de do“n‹neˇrffl ˚u‹nffl ¯sfie›n¯s àfflc´e qfi˚ue ” vˆo˘u¯s
”vˆo“y´eˇz, eˇtde›ma‹ndeˇz-”vˆo˘u¯s c´eqfi˚u˚iffl ˜f´a˚i˚t qfi˚ue ˜l„˚u‹n˚i‹vfleˇr¯s e›xˇi¯sfi˚t´e. So“y´eˇz cˇu˚r˚ieˇu‹x.
Stephen Hawking , physicien théoricien et cosmologiste.
Table des matières
- 1 Introduction
- 2 Quelles compilations?
- 3 Quelques balises pythontex utiles
- 3.1 On peut afficher une console « virtuelle »
- 3.2 Afficher un script Python non interprété à la compilation
- 3.3 Compiler du code Python sans afficher le script associé
- 3.4 Compiler du code Python qui génère et affiche un graphique
- 4 Insérer un tableau de valeurs
- 4.1 Tableau de valeurs associées à une fonction
- 4.2 Remplir une table de vérité (programme BTS SIO)
- 5 Utiliser la librairie sympy
- 5.1 Développement, factorisation
- 5.2 Dérivée et primitive d’une fonction, intégrale d’une fonction sur un intervalle
- 6 Aide aux développements
- 7 Une liste de dérivées et de primitives
- 8 Nombres premiers, décomposition en facteurs premiers, PGCD
- 9 Triangle de Pascal
- 10 Générer plusieurs sujets
- 10.1 Le meilleur arrive!
- 10.2 Exemple 1 : Méthode de Héron pour approcher la racine carrée d’un nombre
- 10.3 Exemple 2 : Un sujet du DNB de
- 10.4 Exemple 3 : Une évaluation en BTS SIO sur la numération et la logique
- 10.5 exemple 4 : Un exercice type BAC sur les probabilités conditionnelles et la loi binomiale
On remarque que la librairie sympy est installée. Exemple 2 : la librairie pyspark La console de gauche indique que cette librairie n’est pas installée. On ouvre une deuxième console et la ligne de
commande python -m pip install va alors installer la librairie.
3 Quelques balises pythontex utiles
3.1 On peut afficher une console « virtuelle »
On utilise la balise pyconsole.
Voici un exemple d’utilisation qui compile quelques commandes PYTHON, on insère dans un source LATEX le script qui suit :
Code LATEX
\begin {pyconsole}
from math import *
x=
y=
z=x+y
x,y,z=y,x,3*z
x
y
z
L=[3,1,8,9,2]
L.append(99)
L
z==
a=
b=
c=5sin(a)+2cos(b)
print(c)
for i in range(5):
print(2iexp(-i))
\end {pyconsole}
Ce qui donne à l’exécution :
Sortie LATEX
>>> from math import *
>>> x=
>>> y=
>>> z=x+y
>>> x,y,z=y,x,3*z
>>> x
>>> y
>>> z
>>> L=[3,1,8,9,2]
>>> L.append(99)
>>> L
[3, 1, 8, 9, 2, 99]
>>> z==
False
>>> a=
>>> b=
>>> c=5sin(a)+2cos(b)
>>> print(c)
>>> for i in range(5):
... print(2iexp(-i))
3.2 Afficher un script Python non interprété à la compilation
Il suffit d’insérer le code suivant, par exemple, à l’aide de la balise pyblock :
Code LATEX
\begin {pyblock}
from math import *
a=
b=
c=5sin(a)+2cos(b)
\end {pyblock}
qui affiche en sortie :
Sortie LATEX
from math import *
a=
b=
c=5sin(a)+2cos(b)
Code LATEX
La dernière valeur de $u$ calculée est égale à \py {u}, et celle de $n$ à \py {n}.
Ce qui donne :
Sortie LATEX
La dernière valeur de u calculée est égale à 10.356813643179308, et celle de n à 13.
3.4 Compiler du code Python qui génère et affiche un graphique
Par exemple, on va générer les graphes des fonctions sinus et cosinus sur l’intervalle [0; 5] et les insérer dans le pdf. On insère le code suivant dans le source LATEX :
Code LATEX
\begin {pycode}
from math import *
from matplotlib import pyplot
X=linspace(0,5)
plt.plot(X,cos(X))
plt.plot(X,sin(X))
# On sauvegarde la figure suivant le chemin (relatif) mentionné
plt.savefig('Figures/graphique.pdf',bbox_inches='tight')
print(r' \includegraphics [scale=0.5]{Figures/graphique.pdf}')
\end {pycode}
Ce qui donne, après les trois compilations, une figure insérée dans le pdf :
Sortie LATEX
0 1 2 3 4 5
La méthode alternative suivante permet de gérer le placement de la figure.
- Le code LATEX suivant remplace le précédent :
Code LATEX
\begin {pycode}
from math import *
from matplotlib import pyplot
X=linspace(0,5)
plt.plot(X,cos(X))
plt.plot(X,sin(X))
# On sauvegarde la figure suivant le chemin (relatif) mentionné
plt.savefig('Figures/graphique.pdf',bbox_inches='tight')
\end {pycode}
On remarque que la ligne suivante a été supprimée.
Code LATEX
print(r' \includegraphics [scale=0.5]{Figures/graphique.pdf}')
- Après compilations, le graphique a été généré et enregistré dans l’arborescence à l’emplacement
« Figures/graphique.pdf ».
On peut alors insérer dans « MonSource.tex » la ligne qui suit à l’endroit désiré :
Code LATEX
\begin {center}
\IfFileExists {Figures/graphique.pdf}{ \includegraphics [scale=0.57] ⌋
,→ {Figures/graphique.pdf}}{}
\end {center}
L’avantage est que la figure peut être placée n’importe où dans le fichier PDF généré, par exemple ici.
0 1 2 3 4 5
4 Insérer un tableau de valeurs
Dans ce paragraphe, nous allons proposer quelques scripts à insérer dans un source LATEX afin de générer un(des) tableau(x).
Le lecteur (et utilisateur ?) remarquera qu’une ligne de code LATEX est insérée dans print(r"ligne de code LATEX").
4.1 Tableau de valeurs associées à une fonction
Soit f la fonction définie sur R par f ( x ) = x e− x^. Déterminons les valeurs de f ( x ) pour x variant de 0 à 5, avec un pas de 1, valeurs que l’on va insérer dans un tableau centré sur la page. Insérons le code suivant dans le source LATEX :
L=[True,False]
Tab3=[]
for i in L:
for j in L:
for k in L:
Tab3.append([str(i),str(j),str(k),str(nor(i,nand(j,k))) ⌋
,→ ,str(nand(nor(i,j),nor(i,k)))])
print(r' \begin {tabular}{|c|c|c|c|c|}')
print(r' \hline ')
print(r'$P$ & $Q$ & $R$ & $P \downarrow (Q \mid R)$ & $(P \downarrow Q) \mid (P
,→ \downarrow R)$ \ \hline ')
for i in range(len(Tab3)):
print(r' %s & %s & %s & %s & %s \ \hline' %(str(Tab3[i][0]),str(Tab3[i][1]) ⌋
,→ ,str(Tab3[i][2]),str(Tab3[i][3]),str(Tab3[i][4])))
print(r' \end {tabular}')
\end {pycode}
Ce qui donne, après exécution du script :
Sortie LATEX
P Q R P ↓ (Q | R) (P ↓ Q) | (P ↓ R) True True True False True True True False False True True False True False True True False False False True False True True True True False True False False True False False True False True False False False False False
5 Utiliser la librairie sympy
La librairie sympy permet le calcul symbolique.
Cette librairie sympy n’est pas nécessairement installée dans la configuration par défaut de l’interpréteur PY- THON.
5.1 Développement, factorisation
Le code suivant, inséré dans une source LATEX, donne un exemple pour développer ou factoriser une expression.
Code LATEX
\begin {pycode}
from math import *
from sympy import *
x=Symbol('x')
y=Symbol('y')
exp=x(5x+2)(-6x+4)
exp3=(x+y)**
exp2=x3-4x2+5x-
\end {pycode}
Développement : $\py{latex(exp)}=\py{latex(expand(exp))}$
Développement : $\py{latex(exp3)}=\py{latex(expand(exp3))}$
Factorisation : $\py{latex(exp2)}=\py{latex(factor(exp2))}$
Ce qui donne :
Sortie LATEX
Développement : x (4 − 6 x ) (5 x + 2) = − 30 x^3 + 8 x^2 + 8 x Développement :
x + y
= x^6 + 6 x^5 y + 15 x^4 y^2 + 20 x^3 y^3 + 15 x^2 y^4 + 6 x y^5 + y^6 Factorisation : x^3 − 4 x^2 + 5 x − 2 = (^) ( x − 2) ( x − 1)^2
5.2 Dérivée et primitive d’une fonction, intégrale d’une fonction sur un intervalle
Dérivée d’une fonction
On insère le code suivant dans le source LATEX pour déclarer une fonction et calculer sa dérivée :
Code LATEX
\begin {pycode}
from math import *
from sympy import *
x=Symbol("x")
f=x3+x2-5*x+
deriv=diff(f,x)
\end {pycode}
Puis le code suivant dans le source LATEX pour afficher la fonction, sa dérivée et l’expression factorisée de cette dernière.
Code LATEX
Soit $f$ la fonction définie sur \R par: $f(x)=\py{latex(f)}$
La fonction dérivée est la fonction $f':x \longmapsto \py{latex(deriv)} =
,→ \py{latex(factor(deriv))}$
On obtient :
Sortie LATEX
Soit f la fonction définie sur R par : f ( x ) = x^3 + x^2 − 5 x + 10 La fonction dérivée est la fonction f ′^ : x 7 −→ 3 x^2 + 2 x − 5 = ( x − 1) (3 x + 5)
Code LATEX
$f(x)=0$ si $x \in \py{latex(d)}$
Ce qui donne :
Sortie LATEX
f ( x ) = 0 si x ∈
PYTHON renvoie l’ensemble des solutions entre crochets, cela peut prêter à confusion.
6 Aide aux développements
Le script PYTHON qui suit génère aléatoirement les coefficients de différents polynômes de degré 1, pour proposer une liste permettant aux élèves de se familiariser avec la distributivité de la multiplication par rapport à l’addition :
Code PYTHON
\begin{pyblock}
from math import *
from sympy import *
from random import *
# x variable symbolique
x=symbols('x')
# ou bien x=Symbol('x'), ou bien x=Var('x')
# La liste C va contenir les 20 polynômes de degré 1 dont les coefficients
# sont générés aléatoirement.
C=[]
for i in range(20):
C.append((randint(1,10)*x+randint(-10,10)))
# la liste d contient les coefficients placés devant le produit de 2 éléments
# de la liste C. Certains coefficients seront des rationnels
d=[]
for i in range(6):
k=randint(-20,20)
if k!=0:
d.append(k)
\end{pyblock}
On insère alors le code suivant dans le source LATEX.
Code LATEX
\begin {multicols}{2}
\raggedcolumns %
Les développements proposés :
\begin {enumerate}
\item $A(x)=(\py{latex(C[0])}) \times (\py{latex(C[1])})$
\item $A(x)=(\py{latex(C[2])}) \times (\py{latex(C[3])})$
\item $A(x)=(\py{latex(C[4])}) \times (\py{latex(C[5])})$
\item $A(x)=(\py{latex(C[6])}) \times (\py{latex(C[7])})$
\item $A(x)=(\py{latex(C[8])}) \times (\py{latex(C[9])})$
\item $A(x)=(\py{latex(C[10])}) \times (\py{latex(C[11])})$
\item $A(x)=\py{d[0]} \times(\py{latex(C[12])}) \times (\py{latex(C[13])})$
\item $A(x)=\py{d[1]} \times(\py{latex(C[14])}) \times (\py{latex(C[15])})$
% Rational(5,8) renvoie le rationnel 5/
\item $A(x)=\py{latex(Rational(d[2],d[3]))} \times(\py{latex(C[16])}) \times
,→ (\py{latex(C[17])})$
\item $A(x)=\py{latex(Rational(d[4],d[5]))} \times(\py{latex(C[18])}) \times
,→ (\py{latex(C[19])})$
\end {enumerate}
\columnbreak
Les réponses sont ici :
\begin {enumerate}
\item $A(x)=\py{latex(expand(C[0]*C[1]))}$
\item $A(x)=\py{latex(expand(C[2]*C[3]))}$
\item $A(x)=\py{latex(expand(C[4]*C[5]))}$
\item $A(x)=\py{latex(expand(C[6]*C[7]))}$
\item $A(x)=\py{latex(expand(C[8]*C[9]))}$
\item $A(x)=\py{latex(expand(C[10]*C[11]))}$
\item $A(x)=\py{latex(expand(d[0]C[12]C[13]))}$
\item $A(x)=\py{latex(expand(d[1]C[14]C[15]))}$
\item $A(x)=\py{latex(expand(Rational(d[2],d[3])C[16]C[17]))}$
\item $A(x)=\py{latex(expand(Rational(d[4],d[5])C[18]C[19]))}$
\end {enumerate}
\end {multicols}
Ce qui donne :
Sortie LATEX
Les développements proposés :
- A( x ) = (5 x − 2) × (4 x − 2)
- A( x ) = (9 x − 4) × (7 x − 5)
- A( x ) = (9 x + 6) × (10 x + 10)
- A( x ) = (5 x − 1) × (10 x + 5)
- A( x ) = (7 x + 2) × (7 x − 9)
- A( x ) = (5 x + 5) × (3 x + 1)
- A( x ) = 16 × (2 x − 10) × (4 x + 8)
- A( x ) = − 12 × (5 x + 4) × (3 x − 5)
- A( x ) = −
× ( x − 2) × (8 x − 1)
- A( x ) = −
× (7 x − 6) × (7 x + 6)
Les réponses sont ici :
- A( x ) = 20 x^2 − 18 x + 4
- A( x ) = 63 x^2 − 73 x + 20
- A( x ) = 90 x^2 + 150 x + 60
- A( x ) = 50 x^2 + 15 x − 5
- A( x ) = 49 x^2 − 49 x − 18
- A( x ) = 15 x^2 + 20 x + 5
- A( x ) = 128 x^2 − 384 x − 1280
- A( x ) = − 180 x^2 + 156 x + 240
- A( x ) = − 56 x^2 19
119 x 19
- A( x ) = 39 − 637 x^2 12
Sortie LATEX
Expression de f ( x ) Dérivée de f Primitive de f
x^2 2 x x^3 3 x x + 1
x ( x^ +^ 1)^2
x + 1
x − log ( x + 1)
x sin ( x ) x cos ( x ) + sin ( x ) − x cos ( x ) + sin ( x ) xe − x^ − xe − x^ + e − x^ (− x − 1) e − x sin ( x ) cos ( x ) − cos ( x ) cos ( x ) − sin ( x ) sin ( x ) tan ( x ) tan^2 ( x ) + 1 − log (cos ( x ))
sin^2 ( x ) 2 sin ( x ) cos ( x )
x 2
sin ( x ) cos ( x ) 2 cos^2 ( x ) −2 sin ( x ) cos ( x ) x 2
sin ( x ) cos ( x ) 2 tan^2 ( x )
2 tan^2 ( x ) + 2
tan ( x ) − x + sin ( x ) cos ( x )
x log ( x ) log ( x ) + 1 x^2 log ( x ) 2
x^2 4
atan ( x )
x^2 + 1 x atan ( x ) −
log
x^2 + 1
sin (3 x ) 3 cos (3 x ) − cos (3 x ) 3 cos (5 x ) −5 sin (5 x )
sin (5 x ) 5 tan ( x ) tan^2 ( x ) + 1 − log (cos ( x ))
asin ( x )
p 1 − x^2
x asin ( x ) +
p 1 − x^2
acos ( x ) −
p 1 − x^2
x acos ( x ) −
p 1 − x^2
8 Nombres premiers, décomposition en facteurs premiers, PGCD
Pour obtenir ce qui suit, il suffit de compiler le source LATEX « NombresPremiers.tex »
Lien de téléchargement : https://nuage03.apps.education.fr/index.php/s/s2ZSZ8BiE8wY6TJ
Les compilations donnent
Sortie LATEX
On donne la liste L 130 des nombres premiers inférieurs à 130 :
L 130 = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127]
- Déterminer la décomposition en facteurs premiers du pgcd de 2^1 × 32 × 53 × 74 et de 2^2 × 33 × 53 × 72.
- Décomposer le nombre 226 en produit de facteurs premiers.
- Décomposer le nombre 122 en produit de facteurs premiers.
- Justifier que le nombre 2029 est premier.
Éléments de correction
- Déterminer la décomposition en facteurs premiers du pgcd de 2^1 × 32 × 53 × 74 et de 2^2 × 33 × 53 × 72. Le pgcd de 2^1 × 32 × 53 × 74 et de 2^2 × 33 × 53 × 72 est égal à 2^1 × 32 × 53 × 72.
- Décomposer le nombre 226 en produit de facteurs premiers. Voici la décomposition en facteurs premiers de 226, obtenue à l’aide des divisions successives :
226 2 113 113 1 1
Ce qui donne :
226 = 21 × 1131
- Décomposer le nombre 122 en produit de facteurs premiers. Voici la décomposition en facteurs premiers de 122, obtenue à l’aide des divisions successives :
122 2 61 61 1 1
Ce qui donne :
122 = 21 × 611
- Justifier que le nombre 2029 est premier. On calcule
p 2029 ≈ 45,044422518220834. On remarque qu’aucun nombre premier (voir la liste L 130 ) plus petit que 45 n’est un diviseur de 2029. Donc 2029 est premier.
9 Triangle de Pascal
On insère le code suivant dans le source LATEX.
Code LATEX
Voici le triangle de Pascal qui affiche les $\binom{n}{k}$ pour $n$ variant de 0 à
\vspace {2ex}
\begin {pycode}
n = 13
def trianglePascal(n):
T = [[0] * (n+1) for p in range(n+1)]
for n in range(n+1):
if n == 0:
T[n][0] = 1
else:
10 Générer plusieurs sujets
10.1 Le meilleur arrive!
Le package pythontex permet, à partir d’un source LATEX dans lequel on a inséré un script PYTHON appelant la librai- rie random , de créer plusieurs versions d’un même sujet identique dont les données sont générées aléatoirement.
Le script qui suit, enregistré dans le fichier « Plusieurs.sh », à exécuter en console sous le shell bash 6 , permet
d’illustrer cette idée en créant plusieurs versions différentes à partir d’une même source LATEX présent dans le même répertoire.
Script Bash
#!/bin/bash
# On utilise deux répertoires nommés SUJETS et CORRIGES
# comme lieu de stockage temporaire.
# Si les répertoires existent, on les renomme le temps
# d'exécution du script à l'aide d'une marque horaire.
timestamp= $( date +%s )
if [ -e "SUJETS" ]; then
mv SUJETS SUJETS-$timestamp
fi
if [ -e "CORRIGES" ]; then
mv CORRIGES CORRIGES-$timestamp
fi
mkdir SUJETS
mkdir CORRIGES
# Paramètres du script
read -p "Nom du source LaTeX? " fichier
read -p "Nombre de pages de l'énoncé? " enonce
read -p "Nombre de sujets? " nb
# Boucle pour le nombre de sujets demandés.
for i in seq 1 $nb; do
# On copie le source LaTeX puis on effectue les trois compilations
# nécessaires pour obtenir le PDF contenant sujet et corrigé.
cp $fichier.tex exemplaire$i.tex
pdflatex exemplaire$i.tex
pythontex exemplaire$i.tex
pdflatex exemplaire$i.tex
# On utilise pdftk pour séparer l'énoncé du corrigé associé et les
# placer dans les dossiers ad-hoc.
pdftk exemplaire$i.pdf cat 1-$enonce output SUJETS/sujet$i.pdf
pdftk exemplaire$i.pdf cat $(( 1+$enonce )) -end output CORRIGES/corrige$i.pdf
# On supprime les fichiers générés par les compilations.
rm -rf pythontex-files-exemplaire$i
rm exemplaire$i.*
# Fichiers d'extensions 'aux', 'log', 'pdf', 'pytxcode', 'tex'
# et éventuellement 'out'.
done
- Dans le cas d’un système d’exploitation de type GNU/Linux.
# pdftk permet de concaténer les énoncés ainsi que les corrigés associés pour
# n'avoir que deux pdf à imprimer si besoin.
pdftk SUJETS/*.pdf cat output Enonces-$fichier.pdf
pdftk CORRIGES/*.pdf cat output Corriges-$fichier.pdf
# On efface les fichiers et répertoires temporaires
rm -rf SUJETS CORRIGES
# Si nécessaire, on rétablit les anciens noms des répertoires
if [ -e "SUJETS-$timestamp" ]; then
mv SUJETS-$timestamp SUJETS
fi
if [ -e "CORRIGES-$timestamp" ]; then
mv CORRIGES-$timestamp CORRIGES
fi
Pour les lecteurs travaillant sous Window$, on peut procéder de façon similaire avec un script Powershell.
Script PowerShell
# Suppression de l'affichage des commandes exécutées.
Set-PSDebug -off
# Efface la console
Clear-Host
# On utilise deux répertoires comme lieux de stockage temporaire pour les énoncés et
,→ les corrigés.
# On ajoute un horodatage pour s'assurer de ne pas utiliser de répertoires
,→ existants.
$marque=Get-Date -Format FileDateTimeUniversal
$sujets="SUJETS-"+$marque
$corriges="CORRIGES-"+$marque
mkdir $sujets
mkdir $corriges
# Paramètres du script
$fichier=Read-Host "Nom du source LaTeX? (sans extension) "
[int]$n=Read-Host "Nombre de pages de l'énoncé? "
[int]$m=$n+
[int]$nb=Read-Host "Nombre de sujets? "
# Boucle pour le nombre de sujets demandés.
for ($i=1;$i -le $nb;$i++)
Write-Host "Génération du sujet"$i
# préparation
$source="exemplaire"+$i+".tex"
$resultat="exemplaire"+$i+".pdf"
copy ($fichier+".tex") $source