Créer une arborescence avec Python et \(\LaTeX\)

Créer une arborescence avec Python et \(\LaTeX\)

Dans cet article, nous parlerons d’une façon de construire une arborescence en \(\LaTeX\) à l’aide de Python. Nous allons parler d’arbre informatique pour obtenir un résultat comme celui-ci:

Arborescence créée en \(\LaTeX\) à l’aide de Python

Parlons classe en Python

Nous allons commencer par le script Python : c’est lui qui va générer le fichier \(\LaTeX\).

En Python, os.walk (du module os) permet de parcourir une arborescence. Nous allons nous en servir dans une classe “Node”. Cette classe aura pour but de construire un arbre correspondant à notre arborescence.

class Node:
    def __init__(self,nodeValue):
        self.subNodes = []
        self.value = nodeValue

    def addSubNode(self,node):
        self.subNodes.append(node)

Le constructeur de cette classe définit une liste (initialement vide) nommée subNodes, qui contiendra les nœuds-fils, ainsi qu’une variable nommée value qui, on s’en doute, contiendra la valeur du nœud.

On définit ensuite une méthode addSubNode qui, comme son nom l’indique, ajoute à la liste subNodes les nœuds-fils d’un nœud.

À cela, on doit ajouter une autre méthode qui aura pour mission de construire le fichier \(\LaTeX\). C’est là que ça devient compliqué.

Je ne vais pas mettre le script de cette méthode ici, mais les abonné.e.s de mathweb.fr pourront télécharger le script complet (lien à la fin de l’article).

Une fonction pour construire l’arbre

Une fois la classe définie, il nous faut construire l’arbre:

def getDirectoryNode(path):
    node = Node(os.path.split(path)[1])
    
    if os.path.isdir(path):
        for itemName in os.listdir(path):
            fullPathName = os.path.join(path,itemName)
            node.addSubNode(getDirectoryNode(fullPathName))
    return node

Cette fonction permet de définit un arbre. Par exemple:

tree = getDirectoryNode("exemple")

définit un arbre correspondant à l’arborescence d’un dossier nommé “exemple”. Il ne reste plus qu’à construire le fichier \(\LaTeX\):

tree.construct()

Construction du fichier \(\LaTeX\)

Pour être honnête, la méthode construct() de mon fichier ne fait que définir une chaîne de caractères (nommée affichage) contenant le code \(\LaTeX\) principal. La construction même du fichier TEX est faite par la fonction suivante:

def create_latex(filename):
    document = "\\documentclass{standalone}\n"
    document += "\\usepackage{tikz}\\usetikzlibrary{calc,decorations.pathmorphing}\n"
    document += "\\begin{document}\n"
    document += "\\newsavebox{\\arbor}%\n"
    document += "\\begin{lrbox}{\\arbor}%\n"
    document += affichage
    document += "\\end{tikzpicture}\n"
    document += "\\end{lrbox}%\n"
    document += "\\begin{tikzpicture}\n"
    document += "\\node[inner sep=0pt,outer sep=0pt,fill=yellow!25,draw,thick,decorate, decoration={random steps,segment length=3pt,amplitude=1pt}] {\\usebox{\\arbor}};\n"
    document += "\\end{tikzpicture}\n"
    document += "\\end{document}"
    
    if os.path.isfile(filename+".tex"):
        os.remove(filename+".tex")
    
    fichier = open(filename+".tex","x")
    fichier.write(document)
    fichier.close()

    # compilation PdfLaTeX dans le répertoire courant

    cmd = "pdflatex  --shell-escape -synctex=1 -interaction=nonstopmode "+filename+".tex"
    os.system(cmd)

Les icônes

Vous avez sans doute remarqué sur l’image que les icônes variaient suivant le type de fichier rencontré. C’est grâce au dictionnaire suivant:

dico_ext = { 'png' : 'img' , 'jpg' : 'img' , 'gif' : 'img' , 'tiff' : 'img' , 'pdf' : 'pdf' }

où les clés sont les extensions et les valeurs, le nom de l’icône. Pour simplifier les choses, je n’ai souhaité afficher qu’une icône pour les fichiers images; c’est pour cela que les fichiers png, jpg, gif et tiff sont associés à l’icone “img.png” (une icône est une image que j’ai mise au format png). Mais grâce à ce dictionnaire, vous pouvez mettre autant d’icônes que vous le souhaitez !

Téléchargez le script

Si vous êtes abonné.e.s. à mathweb.fr, vous trouverez le fichier arborescence.zip contenant le script Python ainsi que les dossiers exemples sur cette page.

Stéphane Pasquet
Stéphane Pasquet

Laissez votre message