Créer une table de multiplication en LaTeX à l’aide de Python

table multiplication latex python

Créer une table de multiplication en LaTeX à l’aide de Python

Pour m’occuper, j’ai eu envie de créer une table de multiplication en LaTeX à l’aide de Python.

Vous allez me dire : “mais pourquoi pas la faire en \(\LaTeX\) directement ? Pourquoi passer par Python triple buse ? Question à laquelle je vous répondrai: “Pourquoi pas ?”

Une table de multiplication en LaTeX: plusieurs alternatives

multido et tabular ?

Effectivement, on peut tenter de construire notre table de multiplication directement en \(\LaTeX\), mais c’est bigrement compliqué… sauf si on souhaite taper un à un tous les résultats. Et moi, je en veux pas car je suis un gros flemmard.

Il faudrait faire appel à une boucle: Le package multido fait des boucles, mais dans un environnement tabular, ça devient problématique car la macro \multido.

Il existe bien la macro \Multido (avec une majuscule) qui fonctionne dans un environnement tabular, mais la documentation n’est pas loquace du tout sur celle-ci, et je n’ai trouvé aucun script qui pourrait m’aider… Bref, trop compliqué!

tikz ?

La solution graphique TiKZ est envisageable en effet, bien que lourde à mes yeux:

\documentclass{standalone}
\usepackage{amssymb}
\usepackage{tikz}

\newcommand{\tabmul}[1]{%
\begin{tikzpicture}
\fill[gray!20] (-0.5,0.5) rectangle (#1+0.5,-0.5);
\fill[gray!20] (-0.5,0.5) rectangle (0.5,-#1-0.5);
\pgfmathparse{-#1-0.5}\let\e\pgfmathresult
\foreach \y in {0.5,-0.5,...,\e}
{
	\draw (-0.5,\y) -- (#1+0.5,\y);
	\draw (-\y,0.5) -- (-\y,-#1-0.5);
}
\foreach\x in {1,2,...,#1}
{
	\node at (\x,0) {\textbf{\x}};
	\node at (0,-\x) {\textbf{\x}};
}
\node at (0,0) {$\times$};
\foreach\y in {1,2,...,#1}
{
	\foreach\x in {1,2,...,#1}
	{
		\pgfmathparse{int(\x*\y)}\let\r\pgfmathresult
		\node at (\x,-\y) {\r};
	}
}
\end{tikzpicture}%
}
\begin{document}
\tabmul{15}
\end{document}
table multiplication LaTeX TiKZ

Ouais, c’est vrai, c’est assez cool… La solution graphique offre un large éventail de personnalisation.

Une table de multiplication en LaTeX: à l’aide de Python

J’entends déjà (peut-être à juste titre) certain·e·s d’entre vous crier au scandale: générer un fichier \(\LaTeX\) via Python, c’est lourd, c’est pas direct, ça pue des pieds… Mouaich… Ben j’m’en fiche un peu au final… Si ça m’amuse et que ça ne fait de mal à personne, pourquoi pas ? En plus, ça donne l’occasion de manipuler le langage… Alors voici une solution:

def table(n,pdf=True):
    table = '\\documentclass{standalone}\n\\usepackage{amssymb}\n\\usepackage{xcolor}\n\\usepackage{colortbl}\n\\usepackage{cellspace}\n\\setlength{\\cellspacetoplimit}{3mm}\n\\setlength{\\cellspacebottomlimit}{3mm}\n\\begin{document}\n'
    T = [ [i*j for j in range(1,n+1) ] for i in range(1,n+1) ]
    table += '\\begin{tabular}{|>{\\columncolor{gray!20}}Sc|*{'+str(n)+'}{Sc|}}\n\\rowcolor{gray!20}\n\\hline\n$\\times$ '
    for i in range(1,n+1):
        table += '& ' + str(i)
    table += '\\\\\n\\hline\n'
    for j in range(1,n+1):
        table += str(j)
        for i in range(1,n+1):
            table += ' & ' + str(T[i-1][j-1])
        table += '\\\\\n\\hline\n'
    table += '\\end{tabular}\n\\end{document}'
    
    Fichier = open('table.tex', 'w' , encoding='utf8')
    Fichier.write( table )
    Fichier.close()
    
    if pdf:
        from os import system
        system("pdflatex table.tex")
        system("START table.pdf")
>>> table(10,True)
table multiplication LaTeX python

L’argument “True” passé dans la fonction table sert uniquement à lancer la compilation via PdfLaTeX directement. Par défaut, il vaut False; dans ce cas, seul le fichier \(\LaTeX\) est créé.

Dans cet article déjà, je vous exposais une manière de construire le triangle de Pascal à l’aide de PythonTeX… D’ailleurs, plutôt que de faire un script Python, on pourrait en effet tout mettre dans le fichier \(\LaTeX\) (ça plaira sûrement à quelques personnes).

\documentclass{standalone}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{colortbl}
\usepackage{cellspace}
\setlength{\cellspacetoplimit}{3mm}
\setlength{\cellspacebottomlimit}{3mm}
\usepackage{pythontex}

\begin{pycode}
def table(n,pdf=True):
    T = [ [i*j for j in range(1,n+1) ] for i in range(1,n+1) ]
    table = '\\begin{tabular}{|>{\\columncolor{gray!20}}Sc|*{'+str(n)+'}{Sc|}}\n\\rowcolor{gray!20}\n\\hline\n$\\times$ '
    for i in range(1,n+1):
        table += '& ' + str(i)
    table += '\\\\\n\\hline\n'
    for j in range(1,n+1):
        table += str(j)
        for i in range(1,n+1):
            table += ' & ' + str(T[i-1][j-1])
        table += '\\\\\n\\hline\n'
    table += '\\end{tabular}'
    
    return table
\end{pycode}

\begin{document}
\begin{pycode}
print(table(10))
\end{pycode}
\end{document}

Attention: si vous utilisez PythonTeX, la chaîne de compilation est différente. Personnellement, j’utilise la chaîne suivante sur TexMaker sous Windows 10 (Menu : Utilisateur > Commandes Utilisateur > Éditer Commandes Utilisateur):

pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex|C:\Users\Stephane\AppData\Local\Programs\Python\Python38-32\python.exe "C:\Users\Stephane\AppData\Local\Programs\MiKTeX 2.9\scripts\pythontex\pythontex.py" %.tex|pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex|"C:/Program Files (x86)/Adobe/Acrobat 11.0/Acrobat/Acrobat.exe" %.pdf
Stéphane Pasquet
Stéphane Pasquet

Laissez votre message