Problème de compilation latex et python

Bonjour à tous
Je vous expose mon problème.

Je souhaiterais intégrer du python dans un document tex. Pour ce faire, j'utilise le package "Pythontex".
Je précise que je suis sous windows 7 et que j'utilise comme éditeur Texmaker.
J'ai Python (version 3.4 ) qui est bien installé sur mon pc.
Ci-dessous, vous trouverez le fichier Tex
Lorsque je compile mon document, j'ai bien un pdf qui sort mais avec des ?? comme résultat au lieu de 2 par exemple pour la première instruction.
La question est pourquoi Python ne s’exécute pas ?
Aurais-je oublié de préciser quelque chose ?
Je vous remercie pour l'aide apportée.
\documentclass[12pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{pythontex}
%
\usepackage[output-decimal-marker={,}]{siunitx} 
\mathcode`\.="013B

\begin{document}

\section{Pour s'échauffer :}
$1+1 = $ \py{1+1}

\section{Aller on essaye !} \noindent
Respect des priorités :  $1 + 2 \times 10 = $ \py{1+2*10} \\
Et les fractions ? $\frac{1}{3} + \frac{1}{2} \approx \py{1/3+1/2}$ \\
Et les racines carrées ? 

\begin{pycode}
from math import sqrt
\end{pycode}
%
$$\sqrt{2} \approx  \py{ sqrt(2) } $$
%
% Avec pycode il est possible de définir des variables utilisables dans tout le document
% comme avec des variables globales
\begin{pycode}
a=2
b=5
\end{pycode}
%
Les variables : si $a=2$ et $b=5$ alors $a \times b = $ \py{a*b}

\section{Un peu plus loin ...}\noindent
La division euclidienne de $3551$ par $7$ : le quotient est $\py{3551//7}$ et le reste est 
$\py{3551%7}$  \\
Vérification : $507 \times 7 + 2 = \py{507 * 7 + 2}$

\end{document}

Réponses

  • Bonjour,

    Il faut exécuter le code Python (via pythontex) à part puis relancer LaTeX pour récupérer et incorporer les résultats (cela remplace donc les ??).

    Si, sous Debian unstable, je fais :
    pdflatex docu.tex
    pythontex --interpreter python:python3 docu
    pdflatex docu.tex
    
    Sans '--interpreter python:python3', la deuxième commande compilerait le code avec Python 2.x, pas bon (1/3 = 0, etc.). À la place de 'pythontex --interpreter python:python3 docu', on pourrait aussi lancer
    python3 /usr/share/texlive/texmf-dist/scripts/pythontex/pythontex3.py docu
    
    J'ai corrigé plusieurs choses dans votre document, voir ci-dessous :
    • le \mathcode a l'air très louche ; je l'ai supprimé ;
    • ne pas utiliser de double-dollars avec LaTeX ;
    • ne surtout pas mettre les résultats des calculs hors des expressions mathématiques, ils en font partie ici !
    Bon :
    $1 + 2 \times 10 = \py{1+2*10}$
    
    Mauvais :
    $1 + 2 \times 10 = $ \py{1+2*10}
    
    Code complet :
    \documentclass[12pt,a4paper]{article}
    \usepackage{lmodern}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage[french]{babel}
    \usepackage{pythontex}
    
    \begin{document}
    
    \section{Pour s'échauffer}
    
    $1+1 = \py{1+1}$
    
    \section{Allez, on essaye !}
    
    \noindent
    Respect des priorités : $1 + 2 \times 10 = \py{1+2*10}$.\\
    Et les fractions ? $\frac{1}{3} + \frac{1}{2} \approx \py{1/3+1/2}$.\\
    Et les racines carrées ?
    %
    \begin{pycode}
    from math import sqrt
    \end{pycode}
    %
    \[ \sqrt{2} \approx \py{ sqrt(2) } \]
    %
    % Avec pycode il est possible de définir des variables utilisables dans tout le document
    % comme avec des variables globales
    \begin{pycode}
    a=2
    b=5
    \end{pycode}
    %
    Les variables : si $a=2$ et $b=5$, alors $a \times b = \py{a*b}$.
    
    \section{Un peu plus loin}
    
    \noindent
    Division euclidienne de $3551$ par $7$ : le quotient est $\py{3551//7}$ et le
    reste est $\py{3551%7}$.\\
    Vérification : $507 \times 7 + 2 = \py{507 * 7 + 2}$.
    
    \end{document}
    
    107894
  • Bonjour ,

    ça fonctionne , super ! (:P)
    Merci Brian.
  • Il n'y a pas de quoi. Autres petites choses :
    • Si tu veux, comme c'est le cas en anglais, que le paragraphe suivant un titre de chapitre, section, sous-section, etc., n'ait jamais d'alinéa, au lieu de mettre \noindent à chaque fois, tu peux mettre ceci après la ligne \usepackage[french]{babel} :
      \frenchsetup{IndentFirst=false}
      
      (faire 'texdoc babel-french' pour voir les autres possibilités).
    • Si, plus globalement, tu veux supprimer les alinéas de début de paragraphe, tu peux utiliser soit \setlength{\parindent}{0pt} par exemple avant \begin{document}, soit le package parskip.
    • Ne pas laisser de ligne blanche (= saut de paragraphe) avant une formule de type display ($\backslash [ \; \ldots \, \backslash ]$). La situation normale, qui produit un bon espacement vertical, est :
    Texte texte texte...
    \[ formule “display” \]
    suite du texte...
    
  • Bonjour à tous
    Grâce à vos indications, j'ai enfin réussi à compiler mon premier document avec du python.
    Pour ce faire, on m'a conseillé de passer par le terminal et de lancer la ligne de commande suivante :
    pdflatex doc.tex
    pythontex doc
    pdflatex .tex.
    Le problème est que lorsque je compile un nouveau document, les ?? réapparaissent. Je me dis que je ne vais pas passer à chaque fois par le terminal (de texmaker).
    J'ai configuré texmaker et je compile avec la commande suivante pdflatex :
    pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex| python C:\texlive\2020\texmf-dist\scripts\pythontex\pythontex.py %.tex|pdflatex --shell-escape -synctex=1 -interaction=nonstopmode %.tex

    Pouvez-vous me dire ce que je dois faire svp pour que cela fonctionne sans passer par le terminal ?
    Je vous remercie pour vos aides.

    [En typographie, on ne met jamais d'espace avant un point ou une virgule, mais toujours après. AD]
  • Bonjour,

    Ça marcherait peut-être mieux avec « ; » au lieu de « | », mais ce n'est a priori pas une très bonne solution. Il faudrait quelqu'un qui s'y connaît en TeXMaker, ce que je ne suis pas. Peut-être une piste serait-elle d'utiliser, pour lancer PythonTeX, la même infrastructure que pour compiler une bibliographie (où bibtex ou biber doit être exécuté entre deux commandes (pdf)latex, de la même façon).
  • J'ai mis à jour mon message ci-dessus : la commande canonique pour invoquer PythonTeX avec Python 3 sous Debian unstable actuelle semble être :
    pythontex --interpreter python:python3 docu
    
    D'après 'texdoc pythontex', l'équivalent sous Windows serait :
    pythontex --interpreter "python:py -3" docu
    
    Cette dernière commande suppose bien sûr que le
    lanceur Python pour Windows a été activé lors de l'installation de Python.
Connectez-vous ou Inscrivez-vous pour répondre.