Category ArchiveLaTeX

Lemniscate et parabole

Le but est de créer le GIF suivant:

Code Python

tikz = open("tikz.tex", "w")
text = ''
      
x = -5
while x < 5:
    y = 1/x
    r = (x**2+y**2)**0.5
    if r<10 and abs(y)<10:
        text = text + '\\begin{tikzpicture}[>=latex]\\labase'
        k = -5
        while k <= x:
            p = 1/k
            rr = (k**2+p**2)**0.5
            if rr<10 and abs(p)<10:
                text = text+'\\draw[red] ('+str(k)+','+str(p)+') circle ('+str(rr)+' cm);\n'
            k += 0.1
        text = text + '\\end{tikzpicture}\n'
    x += 0.1

tikz.write(text)
tikz.close()

Ce script génère un fichier tikz.tex dans lequel les dessins sont faits.

Le fichier \(LaTeX\)

\documentclass{article}
\usepackage{tikz}
\usepackage[paperwidth=10cm,paperheight=10cm,margin=0cm]{geometry}
\setlength{\parindent}{0pt}
\newcommand{\labase}{%
\clip (-5,-5) rectangle (5,5);
\draw[->] (-5,0) -- (5,0);
\draw[->] (0,-5) -- (0,5);
\draw plot[domain=-5:-0.1,samples=100] (\x,{1/\x});
\draw plot[domain=0.1:5,samples=100] (\x,{1/\x});
\node[below left] at (0,0) {$O$};
}
\begin{document}
\include{tikz}
\end{document}

En compilant via PdfLaTeX (par exemple), on génère un PDF de 49 pages.

Construction du GIF

J’ai pour habitude d’utiliser GIMP en ouvrant le PDF, puis en inversant l’ordre des calques, puis en sauvegardant en tant qu’animation dans un fichier .gif. Et voilà !

Avec Pythontex

On peut bien entendu créer un tel GIF directement avec pythontex:

% en utilisant Pythontex
\documentclass{article}
\usepackage{tikz}
\usepackage{pythontex}
\usepackage[paperwidth=10cm,paperheight=10cm,margin=0cm]{geometry}
\setlength{\parindent}{0pt}
\newcommand{\labase}{%
\clip (-5,-5) rectangle (5,5);
\draw[->] (-5,0) -- (5,0);
\draw[->] (0,-5) -- (0,5);
\draw plot[domain=-5:-0.1,samples=100] (\x,{1/\x});
\draw plot[domain=0.1:5,samples=100] (\x,{1/\x});
\node[below left] at (0,0) {$O$};
}
\begin{document}
\begin{pycode}
x = -5
while x < 5:
    y = 1/x
    r = (x**2+y**2)**0.5
    if r<10 and abs(y)<10:
        print('\\begin{tikzpicture}[>=latex]\\labase')
        k = -5
        while k <= x:
            p = 1/k
            rr = (k**2+p**2)**0.5
            if rr<10 and abs(p)<10:
                print('\\draw[red] ('+str(k)+','+str(p)+') circle ('+str(rr)+' cm);')
            k += 0.1
        print('\\end{tikzpicture}')
    x += 0.1
\end{pycode}
\end{document}

Les tableaux en \(\LaTeX\)

Je ne sais pas vous, mais perso, je trouve un peu chiant de créer un tableau en \(\LaTeX\), surtout s’il est complexe… Je suis toujours obligé de rechercher à droite et à gauche, et même au milieu, où trouver telle ou telle commande.

C’est la raison pour laquelle j’ai envie de réunir dans cet article tout ce qu’il faut savoir sur les tableaux. Projet ambitieux qui, je présume, s’enrichira au fil du temps…

Les bases

Je ne vais pas tout reprendre, car il existe une page assez complète ici :

https://fr.wikibooks.org/wiki/LaTeX/Tableaux

Les dimensions

Marges des cellules

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}
Sans redéfinir les marges :
\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d\\
\hline
\end{tabular}

\bigskip

En redéfinissant les marges: 
\setlength{\tabcolsep}{1cm}
\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d\\
\hline
\end{tabular}

\end{document}
Redéfinition de la dimension \tabcolsep

Le package cellspace

Il permet de définir des marges verticales par défaut pour éviter que du texte colle aux traits horizontaux.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{amsmath}
\usepackage{cellspace}
\setlength{\cellspacebottomlimit}{5pt}
\setlength{\cellspacetoplimit}{5pt}
\setlength{\parindent}{0pt}

\begin{document}

Sans utiliser \textit{cellspace} :
\begin{tabular}{|*4{c|}}
\hline
$\dfrac{p}{q}$ & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}

\bigskip

En utilisant \textit{cellspace}:
\begin{tabular}{|*4{Sc|}}
\hline
$\dfrac{p}{q}$ & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}
\end{document}
Utilisation de cellspace dans un tableau LaTeX

Hauteur des cellules : \morestretch

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}

\renewcommand{\arraystretch}{2}
\begin{tabular}{|*4{c|}}
\hline
a & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}

\end{document}
Agrandir la hauteur des cellules d’un tableau LaTeX avec \morestretch

Hauteur personnalisée pour une ligne

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|*4{c|}}
\hline
a & b & c & d\\[1cm]
\hline
e & f & g & h \\
\hline
\end{tabular}


\end{document}
Hauteur personnalisée d’une ligne dans un tableau LaTeX

Ici, nous utilisons l’alias “\\” suivi de la dimensions (avec unité) que nous souhaitons en dessous du texte et avant le trait horizontal suivant (donc la marge basse de la ligne)

Les filets (les traits du tableau)

Épaisseur des filets

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}
Sans redéfinir les marges :
\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d\\
\hline
\end{tabular}

\bigskip

En redéfinissant les marges: \setlength{\arrayrulewidth}{3pt}
\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d\\
\hline
\end{tabular}

\end{document}
Redéfinition de l’épaisseur des traits d’un tableau avec \arrayrulewidth

Un trait vertical dans une cellule : \vline

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d \vline~ e\\
\hline
\end{tabular}

\end{document}
Trait vertical dans une cellule : la commande \vline

Traits en pointillés

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{arydshln}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c:c|}
\hline
a & b\\
\hdashline
c & d \\
\hline
\end{tabular}

\end{document}
Traits en pointillés dans un tableau LaTeX

Traits horizontaux sur quelques cellules

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|c|c|c|}
\hline
a & b & c & d\\
\cline{1-1}\cline{4-4}
e & f & g & h \\
\hline
\end{tabular}

\end{document}
Traits horizontaux sur quelques cellules uniquement dans un tableau LaTeX

Déliminateur “@{…}”

On l’utilise quand on souhaite autre chose qu’un trait entre deux cellules.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{xspace}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c@{\xspace$\to$\xspace}c|}
\hline
a & b\\
\hline
c & d \\
\hline
\end{tabular}

\end{document}
Autre chose qu’un filet entre deux cellules

Les couleurs

Lignes sur fond de couleurs

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|c|}
\rowcolor{orange!50}
\hline
a & b\\
\hline
c & d \\
\hline
\end{tabular}

\end{document}
Ligne sur fond de couleur dans un tableau LaTeX

Colonne sur fond de couleur

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|>{\columncolor{orange!50}}c|c|}
\hline
a & b\\
\hline
c & d \\
\hline
\end{tabular}

\end{document}
Colonne sur fond de couleur dans un tableau LaTeX

Une seule cellule sur fond de couleur

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|c|}
\hline
\cellcolor{orange!50}a & b\\
\hline
c & d \\
\hline
\end{tabular}

\end{document}
Une seule cellule sur fond de couleur dans un tableau LaTeX

La couleur des filets

Couleur de tous les filets

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}
\arrayrulecolor{red}
\begin{tabular}{|c|c|}
\hline
a & b\\
\hline
c & d \\
\hline
\end{tabular}

\end{document}
Tous les traits en couleurs dans un tableau LaTeX

Couleur d’un trait vertical

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|c|}
\hline
a & b\\
\arrayrulecolor{red}\hline\arrayrulecolor{black}
c & d \\
\hline
\end{tabular}

\end{document}
Un trait vertical en couleur dans un tableau LaTeX

Un trait vertical en couleur

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[table]{xcolor}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|cc!{\color{red}\setlength{\arrayrulewidth}{2pt}\vline}cc|}
\hline
a & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}

\end{document}
Un seul trait vertical en couleur dans un tableau LaTeX

Fusions

Fusionner des colonnes

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|*4{c|}}
\hline
a & \multicolumn{2}{|c|}{b et c} & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}


\end{document}
Fusionner des cellules avec \multicolumn

Fusionner des lignes

Il est ici nécessaire d’utiliser le package multirows.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{multirow}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|*4{c|}}
\hline
a & \multirow{2}{*}{b et f} & c & d\\
\cline{1-1}\cline{3-4}
e &  & g & h \\
\hline
\end{tabular}

\end{document}
Fusion de lignes dans un tableau LaTeX avec \multirow

Des traits en diagonale dans une cellule : le package diagbox

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{diagbox}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|ccc|}
\hline
\diagbox{$a$}{$b$} & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}


\end{document}
Utilisation de diagbox dans un tableau LaTeX

Une croix dans une cellule

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage{diagbox}
\setlength{\parindent}{0pt}

\begin{document}

\begin{tabular}{|c|ccc|}
\hline
\diagbox[width=7mm,height=5mm]{\diagbox[width=7mm,height=5mm,dir=SW]{}{}}{} & b & c & d\\
\hline
e & f & g & h \\
\hline
\end{tabular}

\end{document}
Une croix dans une cellule de tableau LaTeX

Il y a toutefois un petit inconvénient à cette méthode : il faut jouer manuellement sur les dimensions de la cellule.

Alors maintenant, bien entendu, si vous constatez qu’il manque quelque chose d’important, n’hésitez pas à intervenir en commentaire !

Triangle de Pascal construit avec Python et \(\LaTeX\)

Le code Python

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:
            for k in range(n+1):
                if k == 0:
                    T[n][0] = 1
                else:
                    T[n][k] = T[n-1][k-1] + T[n-1][k]
    return T

T = trianglePascal(9)

Ce premier code est intéressant pour voir comment construire une matrice (dont les coefficients sont ceux du triangle de Pascal).

On commence par initialiser notre matrice T en la remplissant de “0”. Puis on la remplit selon la propriété bien connue : \(\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}\).

Le code \(\LaTeX\)

On va utiliser PythonTeX :

% sous windows 
% pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex|python C:\Users\trash\AppData\Local\Programs\MiKTeX\scripts\pythontex\pythontex.py %.tex|pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex
% Sous Linux, remplacer "--shell-espace" par "-write18"

\documentclass[10pt,a0paper,landscape]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{diagbox}
\usepackage{pythontex}
\usepackage{nopageno}
\usepackage{colortbl}
\usepackage{tikz}
\usepackage[margin=5mm]{geometry}
\setlength{\parindent}{0pt}
\newcommand{\dashed}{\tikz[baseline=1mm]\draw[gray!50,dashed](0,0)--(0,0.5);}
\begin{document}

\begin{pycode}
n = 50

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:
            for k in range(n+1):
                if k == 0:
                    T[n][0] = 1
                else:
                    T[n][k] = T[n-1][k-1] + T[n-1][k]
    return T


T = trianglePascal(n)

print('\\begin{tabular}{|>{\\columncolor{orange!10}}c|*{',n,'}{c!{\\dashed}}c|}\\rowcolor{orange!10}\\hline\\diagbox[height=8mm]{$n$}{$k$}')
for k in range(n+1):
    print('&',k)
    
for j in range(n+1):
	print('\\\\\\hline ',j)
	for k in range(n+1):
		if k == 0:
			print('&1')
		else:
			if T[j][k] != 0:
				print('&',T[j][k])
			else:
				print('&')

print('\\\\\\hline\\end{tabular}')
\end{pycode} 

\end{document}

Une précision ici : j’ai souhaité séparer chaque colonne par des pointillés. Pour cela, j’ai utilisé une macro TiKZ (pour si peu, ça fait un peu mal quand-même…) car le package arydshln (qui permet de le faire simplement) rentre en conflit avec diagbox… Il fallait donc en sacrifier un! (en fait, ils ne rentrent pas vraiment en conflit mais si on utilise des pointillés dans le tableau, une boîte noire apparaît à la place de l’étiquette “n”). On obtient le document suivant :

Pour les curieux, voici un aperçu des premières lignes et colonnes:

Aperçu du document affichant le triangle de Pascal pour n = 50

Construire le graphe d’une suite avec Python

Dans cet article, nous allons nous intéresser à la construction du graphe d’une suite définie par \(u_{n+1}=f(u_n)\).

Mon objectif est de créer un programme Python qui demande à la personne utilisatrice :

  • la fonction;
  • le premier terme de la suite;
  • le nombre de termes à construire;
  • la fenêtre \( (x_{\min}) \), \( (x_{\max}) \), \( (y_{\min}) \) et \( (y_{\max}) \);
  • le nom sous lequel la figure sera sauvegardée (vide si on ne souhaite pas la sauvegarder).

Les modules

import numpy as np
import matplotlib.pyplot as plt
from sympy import *
x=Symbol('x')
  • Nous aurons besoin du module numpy pour effectuer quelques calculs;
  • ensuite, matplotlib nous servira à effectuer les tracés;
  • le module sympy nous servira à interpréter la saisie de la fonction comme une fonction. À ce titre, on indique que le symbole de la variable est ‘x’.

Saisie de la fonction

def definite_function():
    fonction = input("Entrez l'expression de la fonction : ")
    # convertit la chaîne de caractères en 'fonction'
    f = lambdify(x,fonction,'math') # on utilise le module 'math' ici plutôt que 'numpy' car plus pratique
    fonction_latex = input('Syntaxe LaTeX : ')
    return f,fonction_latex

Ici, on demande de saisir d’une part la fonction (avec une syntaxe “classique”), chaîne de caractères que l’on s’empresse tout de suite de transformer en fonction avec la fonction lambdify du module simpy. Puis, on demande la syntaxe \(\LaTeX\) pour que l’affichage du titre soit plus joli. La fonction retourne un couple constitué de la fonction et de la syntaxe “latexienne” de la fonction.

Les autres saisies

def window():
    xmin = float(input('xmin = '))
    xmax = float(input('xmax = '))
    ymin = float(input('ymin = '))
    ymax = float(input('ymax = '))
    return xmin,xmax,ymin,ymax
    
def definite_first_term():
    u = float(input("Entrez le premier terme : "))
    return u

def definite_nb_terms():
    n = int(input('Nombre de termes à construire : '))
    return n

def definite_name():
    name = input("Entrez le nom de l'image à sauvegarder (appuyez sur [Entrée] si vous ne voulez pas sauvegarder l'image) : ")
    return name

Rien de bien compliqué pour ces quelques fonctions qui permettent de saisir le reste des paramètres.

La fonction de construction du graphe

Nous allons la nommer :

def construct_graph(xmin,xmax,ymin,ymax,f,fonction,u,n,name):

et pour commencer, nous allons nommer la figure:

fig = plt.gcf()

dans l’objectif de la sauvegarder (éventuellement) plus tard.

Tracé de la grille

# tracé du repère et de la grille
    ax = axes([xmin,ymin,xmax,ymax])
    ax.set_xlim(xmin,xmax)
    ax.set_ylim(ymin,ymax)
    ax.xaxis.set_major_locator(MultipleLocator(1.0))
    ax.xaxis.set_minor_locator(MultipleLocator(0.1))
    ax.yaxis.set_major_locator(MultipleLocator(1.0))
    ax.yaxis.set_minor_locator(MultipleLocator(0.1))
    ax.grid(which='minor', axis='x', linewidth=0.25, linestyle='--', color='0.75')
    ax.grid(which='minor', axis='y', linewidth=0.25, linestyle='--', color='0.75')

Tracé de la courbe

# tracé des courbes
    x = np.linspace(xmin, xmax, 201)
    y = [f(x) for x in [xmin+i*(xmax-xmin)/200 for i in range(201)]]
    plt.plot(x,y,color='green')
    plt.plot(x,x,color='red')

On trace ici la courbe représentative de la fonction f ainsi que la droite d’équation \(y=x\).

Construction des termes

for i in range(0,n):
        x = [u,u]
        y = [u,f(u)]
        plt.plot(x,y,linestyle='--',color='blue',linewidth=0.5)
        x = [u,f(u)]
        y = [f(u),f(u)]
        plt.plot(x,y,linestyle='--',color='blue',linewidth=0.5)
        if i != n-1:
            x = [f(u),f(u)]
            y = [f(u),0]
            plt.plot(x,y,linestyle='--',color='orange',linewidth=0.5)
        if i%2 == 0:
            yunder=-0.05
        else:
            yunder = -0.1
        plt.text(u-0.02,yunder,np.around(u,2))
        u = f(u)

On fait une boucle dont le nombre d’itérations est égal au nombre de points que l’on veut. Dans un premier temps, on trace en pointillés la ligne verticale qui va de (u,0) à (u,f(u)), dans un deuxième temps, la ligne horizontale qui va de (u,f(u)) à (f(u),f(u)) puis la ligne verticale qui va de (f(u),f(u)) à (f(u),0) pour avoir le terme suivant sur l’axe des abscisses.

Le titre

#params = {'mathtext.default': 'regular' }
#plt.rcParams.update(params) 
    plt.rc('text', usetex=True)
    plt.rc('font', family='serif')
    title = "Construction des "+str(n)+" premiers termes de la suite définie par\n$u_{n+1}=f(u_n)$ avec $f(x)="+fonction+"$"
    plt.title(title)
    if name != '':
        fig.savefig(name+'.png',dpi=100,bbox_inches='tight')
    plt.show()

On insère maintenant le titre; les deux premières lignes commentées affichent un titre avec une police de caractères par défaut sous Python (ce qui ne me convient pas, mais qui peut plaire à certaines personnes). Les deux lignes suivantes spécifient que l’on souhaite un affichage \(\LaTeX\).

Fonction principale

if __name__ == '__main__':
    f,fonction = definite_function()
    u = definite_first_term()
    xmin,xmax,ymin,ymax = window()
    n = definite_nb_terms()
    name = definite_name()
    construct_graph(xmin,xmax,ymin,ymax,f,fonction,u,n,name)

En exécutant ce programme avec les paramètres suivants:

Saisie

on obtient l’image suivante:

Résultat

Retrouvez le programme complet sur cette page.

Créer un fichier LaTeX avec Python

Dans un article précédent, je vous expliquais comment, dans un fichier \(\LaTeX\), on pouvait se servir de Python grâce à l’extension Pythontex.

Maintenant, je vais vous expliquer comment faire l’inverse, à savoir comment créer et compiler un fichier \(\LaTeX\) avec un programme Python.

L’objectif va être le même que dans l’article précédent (cas d’école) : créer 20 développements (avec double distributivité) aléatoires.

Créer un fichier TeX et le compiler sous Python

Importation des modules nécessaires

import os.path
import random
from sympy import Symbol
from sympy import expand
x=Symbol('x')

J’importe le module os car il va me servir à exécuter des commandes en lignes.

Ensuite, j’importe le module random car il est nécessaire dans notre contexte (dès lors qu’il y a choix aléatoire…).

J’utilise ensuite sympy pour les manipulations algébriques (c’est spécifique ici à ce que je souhaite faire). Je définis alors “x” comme le symbole désignant l’inconnue.

Construction du fichier

Le contenu du fichier va être défini par une succession de texte.

Définir le préambule

def preambule(*packages):
	p = ""
	for i in packages:
		p = p+"\\usepackage{"+i+"}\n"
	return p

Cette fonction a pour but d’appeler tous les packages nécessaires.

start = "\\documentclass[12pt,a4paper,french]{article}\n\\usepackage[utf8]{inputenc}\n"
start = start+preambule('amsmath','lmodern','babel')
start = start+"\\begin{document}\n\\begin{align*}\n"

end = "\\end{align*}\n\\end{document}"

On commence par définir la classe utilisée (avec les options souhaitées) ainsi que l’encodage. Puis, on appelle tous les packages souhaités. Enfin, on commence le document.

Génération des égalités

body = ""

for n in range(21):
    a = random.choice([1, -1]) * random.randint(2, 9)
    b = random.choice([1, -1]) * random.randint(2, 9)
    c = random.choice([1, -1]) * random.randint(2, 9)
    d = random.choice([1, -1]) * random.randint(2, 9)
    e = (a*x+b)*(c*x+d)
    eresultchain = str(expand(e)) # on convertit le résultat en chaîne de caractères
    eresultchain = eresultchain.replace('**','^') # on met au format TeX les exposants
    eresultchain = eresultchain.replace('*','') # on élimine les symboles '*'
    echain = str(e)
    echain = echain.replace('*','')

    body = body+echain+" & = "+eresultchain+"\\\\\n"

Il est ici nécessaire d’anticiper sur la syntaxe \(\LaTeX\) pour remplacer certains caractères…

Ecriture du fichier

container = start+body+end

file = "monfichier.tex"
if os.path.exists(file):
	os.remove(file)

fichier = open("monfichier.tex","x") # "x" pour la création et l'écriture
fichier.write(container)
fichier.close()

Compilation

Une fois le fichier créé, il est pratique de le compiler directement puis de l’afficher.

instructions = "pdflatex "+file#"
os.system(instructions)

readpdf = "START "+file[:-4]+".pdf"
os.system(readpdf)

Et voilà ! Une feuille d’exercices créée en à peine 2 secondes…

Le code complet

Les abonné.e.s de ce site trouveront le code complet sur cette page.

Ecrire un isotope en LaTeX

Allons droit au but : quand on écrit le code suivant en \(\LaTeX\):

^{235}_{92}U

il s’affiche ceci \(^{235}_{92}U\). Les nombres ne sont pas alignés à droite, ce qui peut déranger certains yeux (dont les miens).

Il existe plusieurs façons d’y remédier. Nous allons voir quelques façons de définir une macro \isotope ayant 3 arguments.

Avec un tableau

C’est la méthode bourrin… mais qui donne un résultat satisfaisant.

\newcommand{\isotope}[3]{\begin{tabular}{@{}r@{}}#1\\#2\end{tabular}#3}

qui donne ceci :

Un isotope écrit en \(LaTeX\) avec un tableau

On peut ensuite affiner le résultat en modifiant la taille des nombres ainsi que leur espacement vertical :

\newcommand{\isotope}[3]{\begin{tabular}{@{}r@{}}\small#1\\[-0.5ex]\small#2\end{tabular}#3}

qui donne, en tapant \isotope{235}{92}{U} dans un texte:

Un isotope écrit en \(LaTeX\) avec un tableau

La méthode pour faire le kéké

\makeatletter
\newcommand{\isotope}[3]{%
   \settowidth\@tempdimb{\ensuremath{\scriptstyle#1}}%
   \settowidth\@tempdimc{\ensuremath{\scriptstyle#2}}%
   \ifnum\@tempdimb>\@tempdimc%
   	\setlength{\@tempdima}{\@tempdimb}%
   \else%
   	\setlength{\@tempdima}{\@tempdimc}%
   \fi%
  \begingroup%
  \ensuremath{^{\makebox[\@tempdima][r]{\ensuremath{\scriptstyle#1}}}_{\makebox[\@tempdima][r]{\ensuremath{\scriptstyle#2}}}\text{#3}}%
  \endgroup%
}%
\makeatother

J’ai trouvé ce bout de code je ne sais où il y a fort longtemps… L’intérêt n’est pas tant dans le résultat que dans les explications car au final, le résultat n’est pas beaucoup mieux que le précédent :

Un isotope écrit en \(\LaTeX\)

Explications du code :

  • d’abord, on fixe les largeurs qu’occupent les deux nombres (avec la commande \settowidth\@tempdimb{blabla}, on stocke la largeur dans la macro \@tempdimb);
  • ensuite, on stocke dans la macro \@tempdima la dimension la plus grande (c’est le rôle du test \ifnum);
  • après, on commence l’affichage en le mettant dans un broupe (\begingroup)
  • on s’assure que l’affichage sera en mode mathématique (\ensuremath) car il y a un exposant et un indice;
  • on créé en exposant et en indice une boîte dont la largeur est égale à \@tempdima (la plus grande des largeurs des deux nombres);
  • et on finit par afficher en mode texte l’élément.

Méthode graphique avec TiKZ

Bon, cette méthode, autant vous le dire, n’est là que pour le fun car je vous déconseille de faire une macro graphique pour si peut (même si vous faites ce que vous voulez après tout…).

 \newcommand{\isotope}[3]{\tikz[baseline=-0.33\baselineskip,outer xsep=0pt,inner xsep=0pt]{\node (elt) {#3};\node[left] at (elt.north west) {\small#1}; \node[left] at (elt.south west) {\small#2};}}

Voici les trois méthodes les unes à la suite des autres, dans l’ordre traité ici:

Comparatif des méthodes d’affichage d’un isotope en \(\LaTeX\)

Mon conseil

Si j’étais vous, ce qui n’est pas le cas, fort heureusement pour vous, j’opterais pour la méthode en \(\LaTeX\) pur car lors de changement de taille de caractères, elle reste insensible et se comporte toujours de la même façon. Par exemple, si on fixe la taille des caractères à 30pt, voilà ce que cela donne:

Affichage d’un isotope en \(\LaTeX\) avec une grande taille de caractères

Python, turtle et un arbre de Pythagore

Un arbre de Pythagore est un arbre qui ressemble à ça:

Arbre de Pythagore réalisé avec Python

On peut s’apercevoir que c’est une figure récursive (ou fractale) et donc qu’il est possible de la dessiner en la programmant plutôt qu’en la dessinant “à la main”. Python (par exemple) est donc notre ami pour la construire.

from turtle import *
import math
from random import uniform

def change_color():
    e1 = uniform(0,1)
    e2 = uniform(0,1)
    e3 = uniform(0,1)
    return e1,e2,e3

def tree(s,e1,e2,e3):
    if s < 5:
        return
    square(s,e1,e2,e3)
    e1,e2,e3 = change_color()
    forward(s)
    s1 = s / math.sqrt(2)
    left(45)
    tree(s1,e1,e2,e3)
    right(90)
    forward(s1)
    tree(s1,e1,e2,e3)
    back(s1)
    left(45)
    back(s)

def square(s,e1,e2,e3):
    pencolor("white")
    fillcolor(e1,e2,e3)
    begin_fill()
    for i in range(4):
        forward(s)
        right(90)
    end_fill()

e1,e2,e3 = change_color()
penup()
left(180)
forward(100)
right(90)
pendown()
tree(100,e1,e2,e3)

Dans le code Python, j’ai fait appel au module random afin de choisir au hasard les couleurs.

À la découvert d’un nouveau package \(\LaTeX\)

Quand je m’ennuie, j’aime bien traîner sur le site CTAN, où l’on peut découvrir de nombreux packages \(\LaTeX\). Et même si la plupart ne m’intéressent pas, de temps en temps, je tombe sur une pépite… Et c’est le cas aujourd’hui.

tikz-page.sty

C’est bien connu (de ma grand-mère), j’aime écrire des livres, même s’ils sont à public confidentiel la plupart du temps. Et c’est aussi bien connu (toujours par ma grand-mère) que je passe souvent beaucoup de temps à trouver une mise en page sympa.

C’est la raison pour laquelle cette extension a attiré mon attention. En effet, elle semble promettre une mise en page facilitée… et ça, c’est cool ! On peut notamment mettre des petites fioritures en marges comme dans l’exemple suivant:

Mise en page possible avec tikz-page.sty
\documentclass{article}
\usepackage{tikz-page}
\usepackage{lipsum}
\definecolor{halfgray}{gray}{0.55}
\newcommand\anglei{-45}
\newcommand\angleii{45}
\newcommand\angleiii{225}
\newcommand\angleiv{135}
\newcommand{\tikzpagelayout}{
\tpflip{
\coordinate (aux1) at ([yshift=-15pt]page.northeast);
\coordinate (aux2) at ([yshift=-410pt]page.northeast);
\coordinate (aux3) at ([xshift=-4.5cm]page.northeast);
\coordinate (aux4) at ([yshift=-150pt]page.northeast);
}{
\coordinate (aux1) at ([yshift=-15pt]page.northwest);
\coordinate (aux2) at ([yshift=-410pt]page.northwest);
\coordinate (aux3) at ([xshift=4.5cm]page.northwest);
\coordinate (aux4) at ([yshift=-150pt]page.northwest);
\renewcommand\anglei{-135}
\renewcommand\angleii{135}
\renewcommand\angleiii{-45}
\renewcommand\angleiv{45}
}
\begin{scope}[halfgray!40,line width=12pt,rounded corners=12pt]
\draw (aux1) -- coordinate (a) ++(\angleiii:5) -- ++(\anglei:5.1)
coordinate (b);
\draw[shorten <= -10pt] (aux3) -- (a) -- (aux1);
\draw[opacity=0.6,halfgray,shorten <= -10pt] (b) -- ++(\angleiii:2.2) -- ++(\anglei:2.2);
\end{scope}
\draw[halfgray,line width=8pt,rounded corners=8pt,shorten <= -10pt]
(aux4) -- ++(\angleiii:0.8) -- ++(\anglei:0.8);
\begin{scope}[halfgray!70,line width=6pt,rounded corners=8pt]
\draw[shorten <= -10pt] (aux2) -- ++(\angleiii:3) coordinate[pos=0.45]
(c) -- ++(\anglei:3.1);
\draw (aux2) -- (c) -- ++(\angleiv:2.5) -- ++(\angleii:2.5) -- ++(\anglei:2.5) coordinate[pos=0.3] (d);
\draw (d) -- +(\angleii:1);
\end{scope}
}
\pagestyle{plain}
\begin{document}
\lipsum
\end{document}

Vous imaginez bien qu’avec un peu d’imagination, on peut embellir nos documents plutôt facilement avec ce package ! Et vous, qu’en pensez-vous ?

Jusqu’à présent, j’utilisais le package eso-pic pour mettre en arrière plan des pages ce que je voulais, mais il se peut que j’utilise tikz-page la prochaine fois que je voudrais faire un document élégant…

Liste aléatoire en \(\LaTeX\)

Nous allons voir dans cet article une façon (parmi d’autres) de créer une liste aléatoire de n’importe quoi, et ce à l’aide du package pgffor.

Création d’une liste d’items

Après avoir fait appel à l’extension pgffor, on peut déclarer une liste ainsi:

\pgfmathdeclarerandomlist{<nom de la liste>}{%
{item1}%
{item2}%
{item3}%
...
{itemN}%
}

Par exemple, pour créer une liste de couleurs aléatoires:

\pgfmathdeclarerandomlist{MyColors}{%
{red}%
{magenta}%
{olive}%
{brown}%
{violet}%
{gray}%
{purple}%
{yellow}%
{orange}%
{cyan}%
{green}%
{blue}% 
}

Utilisation de la liste

Imaginons que l’on souhaite dessiner plusieurs disques de couleurs différentes dans un cercle. Alors, on pourra faire ainsi :

\clip (5,5) circle (5cm);
\foreach \i in {0,1,...,10}{
	\foreach \j in {0,1,...,10}{
		\pgfmathparse{10*rnd}\let\x\pgfmathresult
		\pgfmathparse{10*rnd}\let\y\pgfmathresult
		\pgfmathrandomitem{\RandomColor}{MyColors}
		\fill[\RandomColor] (\x,\y) circle (5mm);
	}
}

Le résultat est alors :

Plusieurs disques de couleurs aléatoires dans un cercle, créés avec \(\LaTeX\)

On peut même ajouter un effet aux disques pour un rendu peut-être plus esthétique:

Balles à couleurs aléatoires créées avec \(\LaTeX\)

Un fichier source complet est disponible pour les abonné.e.s de mathweb.fr sur cette page.

Créer des titres originaux sous \(\LaTeX\)

Par défaut, les titres de chapitres sous \(\LaTeX\) sont assez peu esthétiques, et je suis sûr que plus d’une fois, vous avez eu envie de les changer pour les rendre plus jolis.

De mon côté, j’aime créer, j’aime innover et j’aime bien créer des styles originaux pour les titres. Je vous en propose un ici.

Un exemple

Voici ce que je souhaite vous présenter:

Un style de titres \(\LaTeX\) original

Le principe est le suivant : le numéro du chapitre doit être écrit au centre et en relief par rapport aux autres numéros.

De quel packages avons-nous besoin?

J’utilise TiKZ pour la partie graphique (bien que PST soit aussi une bonne solution). Pour la programmation, elle est uniquement basée sur \(\TeX\). Quant à la partie modification de titre, je fais appel à l’extension titlesec.

Nous allons dans un premier temps compiler le document en entier, et à la fin du code source, nous allons inscrire dans un fichier auxiliaire le nombre de chapitres. Ainsi, la première compilation entraîne une erreur car le nombre de chapitres n’est pas encore défini.

De même, si on ajoute un chapitre à une compilation déjà effectuée, un message d’erreur s’affichera (du type divide by 0), mais ce n’est pas grave! Une autre compilation résoudra le problème.

Galerie des titres successifs

Le fichier source

Il est disponible uniquement aux abonné.e.s de ce site sur cette page.