Python dans un environnement figure

Tout ce qui concerne le langage TeX/LaTeX et ses variantes. Ce langage est utilisable sur le forum via les balises tex.
[participation réservée aux membres inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Python dans un environnement figure

Message non lu par ezize »

Bonjour,

Je voudrais créer un environnement pour mon code Python me permettant d'avoir un compteur : "Programme 1", "Programme 2",... avec en option une légende : "Programme 1 - mon titre", "Programme 2 - mon titre",...

En cherchant un peu partout et en bidouillant, je suis arrivé à faire ce code qui me donne des erreurs :

Code : Tout sélectionner

\documentclass[a4paper,french]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\setlength{\parindent}{0pt}
\usepackage[margin=1cm]{geometry}
\usepackage{xcolor}
\usepackage{enumitem}
\input{insbox}

\usepackage{graphicx}
\usepackage{caption}

\usepackage{listings}
\lstnewenvironment{python}
	{\lstset{%
		language=Python,%
		%identifierstyle=\color{red},%
		tabsize=4,%
		%numbers=left,%
		numberstyle=\tiny,%
		columns=flexible,%
		backgroundcolor=\color{black!05},%
		showstringspaces=true,%
		texcl=true,%
		escapechar=~,%
		literate=%
			{à}{{\`a}}1
			{â}{{\^a}}1
			{é}{{\'e}}1
			{è}{{\`e}}1
			{ê}{{\^e}}1
			{ë}{{\"e}}1
			{î}{{\^i}}1
			{ô}{{\^o}}1
			{ù}{{\`u}}1
			{«}{{\og}}1
			{»}{{\fg{}}}1}}
{}

\newenvironment{monpython}
{%
\begin{minipage}{.3\textwidth}
\begin{figure}[!h]
\begin{python}
}
{%
\end{python}
\end{figure}
\end{minipage}
}

\begin{document}

Test1: l'environnement "monpython". \\

\begin{python}
def f(x):
  y=x**2-x+3
  return(y)
\end{python}
\caption{mon programme python}

Test2: l'environnement avec "insertBox". \\

\InsertBoxR{0}{
\begin{monpython}
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}
\caption{mon programme python}
}
\begin{enumerate}[rightmargin=5cm, after=\vspace*{\dimexpr-\topsep+\partopsep}]
\item question 1...
\item question 2...
\item question 3...
\end{enumerate}

\end{document}
1- Apparemment l'imbrication des deux environnements "python" et "figure" ne passe pas et du coup "\caption" non plus...

2- J'ai encapsulé dans l'environnement "minipage" pour avoir le code dans une fenêtre de largeur définie à l'avance. Je ne sais pas s'il serait possible que cette largeur peut être définie dans le préambule de façon à ce qu'elle corresponde à la largeur du contenu ? Ici j'ai mis "{.3\textwidth}" en attendant une meilleure solution.

3- L'environnement "monpython" et même "python" ne passe pas non plus avec la commande "insertBox" !

Merci infiniment d'avance pour votre aide !
evariste_G
Utilisateur chevronné
Utilisateur chevronné
Messages : 1472
Inscription : vendredi 19 décembre 2008, 19:13
Statut actuel : Enseignant
Localisation : Bordeaux

Re: Python dans un environnement figure

Message non lu par evariste_G »

Bonjour.
Impossible de tester le code car il fait appel à un fichier externe (insbox) qui définit, a priori, une macro.
Cependant, le problème de la légende vient du fait que le \caption doit être inséré avant la fin de l'environnement figure.

Code : Tout sélectionner

\begin{figure}
\caption{...}
\end{figure}
Cela dit, il ne doit pas y avoir que ça comme erreur.
Mathématiques, LaTeX et Python : https://www.mathweb.fr
Cours particuliers de maths par webcam: https://courspasquet.fr
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Re: Python dans un environnement figure

Message non lu par ezize »

Merci evariste_G de s'être penché sur mon problème...

Concernant "insbox", c'est sur ce forum que j'ai appris son existence et ça a déjà marché pour moi pour d'autres codes et pourtant je ne dispose pas de ce fichier ! Honnêtement, je ne sais pas comment ça marche...

Concernant "caption", ne pourrait-on pas contourner ce problème ?

Merci !
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Re: Python dans un environnement figure

Message non lu par ezize »

Pour décomposer la difficulté, j'ai voulu tester les deux environnements imbriqués "python" et "minipage" avec ce code :

Code : Tout sélectionner

\documentclass[a4paper,french]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\setlength{\parindent}{0pt}
\usepackage[margin=1cm]{geometry}
\usepackage{xcolor}
\usepackage{enumitem}
\input{insbox}

\usepackage{graphicx}
%\usepackage{caption}

\usepackage{listings}
\lstnewenvironment{python}
	{\lstset{%
		language=Python,%
		%identifierstyle=\color{red},%
		tabsize=4,%
		%numbers=left,%
		numberstyle=\tiny,%
		columns=flexible,%
		backgroundcolor=\color{black!05},%
		showstringspaces=true,%
		texcl=true,%
		escapechar=~,%
		literate=%
			{à}{{\`a}}1
			{â}{{\^a}}1
			{é}{{\'e}}1
			{è}{{\`e}}1
			{ê}{{\^e}}1
			{ë}{{\"e}}1
			{î}{{\^i}}1
			{ô}{{\^o}}1
			{ù}{{\`u}}1
			{«}{{\og}}1
			{»}{{\fg{}}}1}}
{}

\newenvironment{monpython}
{%
\begin{minipage}{.3\textwidth}
%\begin{figure}[!h]
\begin{python}
}
{%
\end{python}
%\end{figure}
\end{minipage}
}

\begin{document}

1- l'environnement "python". \\

\begin{python}
def f(x):
  y=x**2-x+3
  return(y)
\end{python}

2- l'environnement "monpython". \\

\begin{monpython}
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}

\end{document}
Mais j'ai eu l'erreur :

Code : Tout sélectionner

! Emergency stop.
Le problème vient clairement de cette imbrication mais je ne vois pas comment y remédier. Une idée ?

Merci !
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 904
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Python dans un environnement figure

Message non lu par un bon petit »

ezize a écrit : mardi 29 juin 2021, 18:35 Je voudrais créer un environnement pour mon code Python me permettant d'avoir un compteur : "Programme 1", "Programme 2",... avec en option une légende : "Programme 1 - mon titre", "Programme 2 - mon titre",...

Code : Tout sélectionner

\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{xcolor,listings}
\newcount\pythoncnt
\lstnewenvironment{monpython}[1][]{%
	\def\pythontitle{#1}%
	\global\advance\pythoncnt1
	\ifhmode\endgraf\noindent\fi
	\vtop\bgroup
		\linewidth.3\linewidth\relax
		\hsize\linewidth
		\lstset{%
			language=Python,%
			%identifierstyle=\color{red},%
			tabsize=4,%
			%numbers=left,%
			numberstyle=\tiny,%
			columns=flexible,%
			backgroundcolor=\color{black!05},%
			showstringspaces=true,%
			texcl=true,%
			escapechar=~,%
			literate=%
				{à}{{\`a}}1
				{â}{{\^a}}1
				{é}{{\'e}}1
				{è}{{\`e}}1
				{ê}{{\^e}}1
				{ë}{{\"e}}1
				{î}{{\^i}}1
				{ô}{{\^o}}1
				{ù}{{\`u}}1
				{«}{{\og}}1
				{»}{{\fg{}}}1}%
		}{\hfill\textsc{Programme \the\pythoncnt}\ifx\pythontitle\empty\else\space-- \pythontitle\fi\hfill\null\egroup\endgraf\medbreak}
\parindent0pt
\begin{document}

Test1: l'environnement "monpython".

\begin{monpython}
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}

Test1: l'environnement "monpython".

\begin{monpython}[Titre]
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}
\end{document}
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Re: Python dans un environnement figure

Message non lu par ezize »

@ un bon petit,
Merci bien pour cette proposition !

Une question : En plus des deux choix déjà là : afficher le compteur et l'étiquette (Programme 1 - Titre) ou afficher le compteur uniquement (Programme 2), est-il possible d'avoir un troisième choix où l'on n'affiche ni le compteur ni l'étiquette et où le compteur ne sera pas incrémenté ?

J'ai pensé à créer un deuxième environnement similaire à "monpython" sans le compteur "pythoncnt", mais je voudrais savoir si l'on pourrait faire plus simple que ça et comment... Merci !
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 904
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Python dans un environnement figure

Message non lu par un bon petit »

ezize a écrit : vendredi 02 juillet 2021, 00:07J'ai pensé à créer un deuxième environnement similaire à "monpython" sans le compteur "pythoncnt", mais je voudrais savoir si l'on pourrait faire plus simple que ça et comment... Merci !
C'est totalement trivial à programmer. C'est juste une histoire de syntaxe.
Vous décidez selon quelle syntaxe vous voulez indiquer ces contraintes, et c'est fini. Comme c'est vous l'utilisateur, c'est mieux que vous définissiez vous-même la syntaxe.
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Re: Python dans un environnement figure

Message non lu par ezize »

Voici le code que j'ai pu réaliser :

Code : Tout sélectionner

\documentclass[a4paper]{article}
\usepackage[margin=1cm]{geometry}
\usepackage{xcolor,listings}
%-------------- monpython0 :
\lstnewenvironment{monpython0}{%[1][]{%
%	\def\pythontitle{#1}%
%\global\advance%\pythoncnt1
%	\ifhmode\endgraf\noindent\fi
%	\vtop\bgroup
		\linewidth.3\linewidth\relax
		\hsize\linewidth
		\lstset{%
			language=Python,%
			%identifierstyle=\color{red},%
			tabsize=4,%
			%numbers=left,%
			numberstyle=\tiny,%
			columns=flexible,%
			backgroundcolor=\color{black!05},%
			showstringspaces=true,%
			texcl=true,%
			escapechar=~,%
			literate=%
				{à}{{\`a}}1
				{â}{{\^a}}1
				{é}{{\'e}}1
				{è}{{\`e}}1
				{ê}{{\^e}}1
				{ë}{{\"e}}1
				{î}{{\^i}}1
				{ô}{{\^o}}1
				{ù}{{\`u}}1
				{«}{{\og}}1
				{»}{{\fg{}}}1}%
		}%
{}
%-------------- monpython :
\newcount\pythoncnt
\lstnewenvironment{monpython}[1][]{%
	\def\pythontitle{#1}%
	%\vspace*{-0.3cm}
	\global\advance\pythoncnt1
	\ifhmode\endgraf\noindent\fi
	\vtop\bgroup
		\linewidth.3\linewidth\relax
		\hsize\linewidth
		\lstset{%
			language=Python,%
			%identifierstyle=\color{red},%
			tabsize=4,%
			%numbers=left,%
			numberstyle=\tiny,%
			columns=flexible,%
			backgroundcolor=\color{black!05},%
			showstringspaces=true,%
			texcl=true,%
			escapechar=~,%
			literate=%
				{à}{{\`a}}1
				{â}{{\^a}}1
				{é}{{\'e}}1
				{è}{{\`e}}1
				{ê}{{\^e}}1
				{ë}{{\"e}}1
				{î}{{\^i}}1
				{ô}{{\^o}}1
				{ù}{{\`u}}1
				{«}{{\og}}1
				{»}{{\fg{}}}1}%
		}%
{\hfill\textsc{Programme \the\pythoncnt}\ifx\pythontitle\empty\else\space-- \pythontitle\fi\hfill\null\egroup\endgraf\medbreak}
%-------------------
\parindent0pt
\begin{document}

Choix1 - l'environnement "monpython" sans étiquette :

\begin{monpython}
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}

Choix2 - l'environnement "monpython" avec étiquette :

\begin{monpython}[Titre]
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython}

Choix3 - l'environnement "monpython0" sans compteur ni étiquette :

\begin{monpython0}
def f(x):
  y=x**2-x+3
  return(y)
\end{monpython0}
\end{document}
Je pense intuitivement qu'on peut faire mieux en combinant les deux environnements "monpython" et "monpython0" mais je n'ai aucune idée pour ça ! Je suis un débutant...
un bon petit
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 904
Inscription : vendredi 12 juin 2009, 22:35
Localisation : Chambéry

Re: Python dans un environnement figure

Message non lu par un bon petit »

Bof, votre code n'est pas factorisé et un environnement étoilé me semble plus pertinent que ce « 0 » !

Code : Tout sélectionner

\documentclass[a4paper]{article}
ezize
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 104
Inscription : samedi 05 août 2006, 13:01

Re: Python dans un environnement figure

Message non lu par ezize »

C'était un choix par défaut... Mais c'est vrai qu'avec une étoile, c'est mieux !

Sinon, le code que vous avez donné est incomplet...