Impossible de mettre la liste Python dans LaTeX
J'essaie de mettre une liste Python dans un \fbox\parboxmais j'obtiens toujours des erreurs.
Voici mon code:
\documentclass[12pt]{article}
% Packages
\usepackage[utf8]{inputenc} % support for accents
\usepackage[T1]{fontenc}
\usepackage[francais]{babel} % doc language
\usepackage{lmodern}
\usepackage[a4paper]{geometry} % marges
\usepackage{xcolor} % text color
\usepackage{sectsty} % colorize sections
\usepackage{changepage}
\usepackage{moreverb} % code with indent
\usepackage{listings} % display code with magnification
\usepackage{amssymb}
\usepackage{amsmath} % Text into equation
\usepackage{enumitem} % Continue enumerate numbers
\usepackage{fourier} % Double brackets
% Python listing
\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\sffamily,
keywordstyle=\textbf,
commentstyle=\color{blue},
showstringspaces=false,
frame=tb, numbers=left }}
% Python environment
\lstnewenvironment{python}[1][]{
\pythonstyle \lstset{#1} }{}
\begin{document}
\begin{enumerate}
\item On suppose qu'on dispose d'une fonction \texttt{binom(n,k)}, prenant en entrée deux entiers, et qui calcule $\binom{n}{k}$. Ecrire en langage \textsc{Python} une fonction \texttt{bernoulli(n)}, qui prend en entrée un entier naturel, et qui renvoie la liste \texttt{[b\_0, b\_1, ..., b\_n]}. \par
\fbox{\parbox{\linewidth-2\fboxrule-2\fboxsep}{
La relation précédente donne, pour $n \ge 2$ :
\[ \binom{n}{n-1} b_{n-1} = - \sum_{j=0}^{n-2} \binom{n}{j} b_j \]
autrement dit on a la relation de récurrence, pour tout $m \ge 1$ :
\[ b_m = -\frac{1}{m+1} \sum_{j=0}^{m-1} \binom{n}{j} b_j \]
On en déduit le code demandé :
}}
\fbox{\parbox{\linewidth-2\fboxrule-2\fboxsep}{
\begin{python}
def bernoulli(n) :
liste_bj = [1]
for m in range(1,n+1):
b = 0
for j in range(m):
b -= binom(m+1,j) * liste_bj[j]
b /= m+1
liste_bj.append(b)
return liste_bj
\end{python}
}} %err1
\end{enumerate}
J'ai eu les erreurs suivantes:
- Sur documentclass: Arrêt d'urgence, erreur fatale, aucune sortie PDF produite!
- Sur err1: l'argument de \ lst @ next a un supplément}. Le paragraphe s'est terminé avant que \ lst @ next ne soit terminé. Extra} ou \ endgroup oublié
- On \ end {enumerate}: \ begin {python} terminé par \ end {enumerate}
- On \ end {document}: \ begin {enumerate} terminé par \ end {document}. Vous ne pouvez pas utiliser '\ end' en mode vertical interne. Manquant {inséré
J'ai essayé d'effacer la «liste python» et «l'environnement python» dans le préambule et de remplacer \begin{python}par \begin{listings}(idem avec \end) pour réinitialiser mon projet LaTeX avec la présentation standard du code, mais j'obtiens toujours les mêmes erreurs. Il semble donc que LaTeX a du mal à lire que ma commande de fermeture de liste est placée avant de fermer celle d'énumération. C'est peut-être parce que j'ai mis la liste dans un \fbox\parbox?
Le \fbox\parboxfonctionne bien avec du texte et des équations, donc le problème ne vient pas de là.
Réponses
Vous ne devez pas utiliser de contenu fragile, comme des listes, comme argument d'autres macros.
Quoi qu'il en soit, la fbox \ parbox est vraiment superflue - lstingsa une option de cadre pour cela:
\documentclass[12pt]{article}
% Packages
\usepackage[utf8]{inputenc} % support for accents
\usepackage[T1]{fontenc}
\usepackage[french]{babel} % doc language
\usepackage{lmodern}
\usepackage[a4paper]{geometry} % marges
\usepackage{xcolor} % text color
\usepackage{sectsty} % colorize sections
\usepackage{changepage}
\usepackage{moreverb} % code with indent
\usepackage{listings} % display code with magnification
\usepackage{amssymb}
\usepackage{amsmath} % Text into equation
\usepackage{enumitem} % Continue enumerate numbers
\usepackage{fourier} % Double brackets
% Python listing
\newcommand\pythonstyle{\lstset{
language=Python,
basicstyle=\sffamily,
keywordstyle=\textbf,
commentstyle=\color{blue},
showstringspaces=false,
frame=tb, numbers=left }}
% Python environment
\lstnewenvironment{python}[1][]{
\pythonstyle \lstset{#1} }{}
\begin{document}
\begin{enumerate}
\item On suppose qu'on dispose d'une fonction \texttt{binom(n,k)}, prenant en entrée deux entiers, et qui calcule $\binom{n}{k}$. Ecrire en langage \textsc{Python} une fonction \texttt{bernoulli(n)}, qui prend en entrée un entier naturel, et qui renvoie la liste \texttt{[b\_0, b\_1, ..., b\_n]}. \par
\fbox{\parbox{\linewidth-2\fboxrule-2\fboxsep}{
La relation précédente donne, pour $n \ge 2$ :
\[ \binom{n}{n-1} b_{n-1} = - \sum_{j=0}^{n-2} \binom{n}{j} b_j \]
autrement dit on a la relation de récurrence, pour tout $m \ge 1$ :
\[ b_m = -\frac{1}{m+1} \sum_{j=0}^{m-1} \binom{n}{j} b_j \]
On en déduit le code demandé :
}}
% \fbox{\parbox{\linewidth-2\fboxrule-2\fboxsep}{
\begin{python}[frame=single,linewidth=1.035\linewidth]
def bernoulli(n) :
liste_bj = [1]
for m in range(1,n+1):
b = 0
for j in range(m):
b -= binom(m+1,j) * liste_bj[j]
b /= m+1
liste_bj.append(b)
return liste_bj
\end{python}
% }} %err1
\end{enumerate}
\end{document}
(et \end{document}manquait manifestement)