Không thể đặt danh sách Python trong LaTeX

Aug 31 2020

Tôi đang cố gắng đưa một danh sách Python vào một \fbox\parboxnhưng tôi luôn gặp lỗi.

Đây là mã của tôi:

\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}

Tôi mắc các lỗi sau:

  • Trên lớp tài liệu: Dừng khẩn cấp, Đã xảy ra lỗi nghiêm trọng, không có tệp PDF đầu ra nào được tạo!
  • Trên err1: Đối số của \ lst @ next có thêm}. Đoạn văn đã kết thúc trước khi \ lst @ next hoàn tất. Thêm}, hoặc bị quên \ endgroup
  • On \ end {enumerate}: \ begin {python} kết thúc bằng \ end {enumerate}
  • Trên \ end {document}: \ begin {enumerate} kết thúc bằng \ end {document}. Bạn không thể sử dụng '\ end' ở chế độ dọc nội bộ. Thiếu {đã chèn

Tôi đã cố gắng xóa "danh sách python" và "môi trường python" trên phần mở đầu và thay thế \begin{python}bằng \begin{listings}(same with \end) để đặt lại dự án LaTeX của mình với trình bày mã chuẩn, nhưng tôi vẫn gặp lỗi tương tự. Vì vậy, có vẻ như LaTeX gặp khó khăn khi đọc rằng lệnh đóng danh sách của tôi được đặt trước khi đóng danh sách. Có lẽ là do tôi đặt danh sách vào một \fbox\parbox?

\fbox\parboxhoạt động tốt với văn bản và phương trình trong đó, vì vậy vấn đề không xuất phát từ đó.

Trả lời

samcarter_is_at_topanswers.xyz Aug 31 2020 at 06:38

Bạn không được sử dụng nội dung mỏng manh, chẳng hạn như danh sách, làm đối số của các macro khác.

Dù sao, fbox \ parbox thực sự không cần thiết - lstingscó một tùy chọn khung cho việc này:

\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}

(và \end{document}rõ ràng là bị mất tích)