Category ArchiveLaTeX

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.

Tangente et nombre dérivé

Voici ici un GIF que j’ai créé en LaTeX pour illustrer la notion de nombre dérivé.

Les sources : sur cette page

La démonstration d’Euclide du théorème de Pythagore

Le théorème de Pythagore, tout le monde en a déjà entendu parlé. Il y a plus de 100 démonstrations de ce théorème. J’avais envie de vous exposer la démonstration d’Euclide… mais sous forme de GIF (créé à l’aide de LaTeX). Alors, la voici…

La démonstration d'Euclide du théorème de Pythagore sous forme de GIF
Théorème de Pythagore : la démonstration d’Euclide

Les sources : sur cette page

Des packages \(\LaTeX\) certainement méconnus

Dans cet article, j’avais envie d’explorer CTAN afin d’y dénicher des extensions qui pourrait servir à mes chers visiteurs.

Des packages \(\LaTeX\) made in France

On pourrait penser que la création de packages (extensions) \(\LaTeX\) est réservée aux personnes étrangères à la France. En tout cas, c’est ce que je pensais quand j’ai débuté. Mais aujourd’hui, il en existe des bien sympathiques et pratiques et qui sont créés en France.

En voici quelques exemples.