listing python tcolorbox ou tikz

Tout ce qui concerne le langage LaTeX et ses variantes. Ce langage est supporté sur le forum via les balises tex.

Modérateur : gdm_tex

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.
marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

listing python tcolorbox ou tikz

Message par marco56 »

Bonsoir,
Dans mes polys de cours, j'ai des environnement faits avec tcolorbox ou tikz.
J'aimerais qqchose de semblable (un peu) pour mes programmes python, qui je le précise, sont appelés de l'extérieur.
Je souhaiterais un rendu avec le nom du programme en haut de la jolie boite, qui serait colorée, avec des arrondis et des ombres.
Voici le code que j'utilise en ce moment (il est un peu long mais peut intéresser des curieux) :

Code : Tout sélectionner

\documentclass{article}
\usepackage[utf8x]{inputenc}	
\usepackage{tcolorbox}
\usepackage{pythonhighlight}
\usepackage{listings}
\usepackage{xcolor}

\definecolor{intdef}{rgb}{0.9 1 0.8}
\definecolor{intprop}{rgb}{1 1 0.7}

\renewcommand*{\lstlistlistingname}{Code Listings}
\renewcommand*{\lstlistingname}{Code Listing}
\definecolor{gray}{gray}{0.5}
\colorlet{commentcolour}{green!60!black}

\colorlet{stringcolour}{red!80!black}
\colorlet{keywordcolour}{magenta!90!black}
\colorlet{exceptioncolour}{yellow!80!red}
\colorlet{commandcolour}{blue!60!black}
\colorlet{numpycolour}{blue!80!green}
\colorlet{literatecolour}{magenta!90!black}
\colorlet{promptcolour}{red!80!black}
\colorlet{specmethodcolour}{violet}

\makeatletter
\lstdefinestyle{mypython_list}{
inputencoding=utf8,
language=python,
showtabs=true,
tab=,
tabsize=2,
basicstyle=\ttfamily,
stringstyle=\color{stringcolour},
showstringspaces=false,
keepspaces=true,
alsoletter={1234567890},
otherkeywords={\%, \}, \{, \&, \|},
morekeywords={as},
keywordstyle=\color{keywordcolour}\bfseries,
emph={and,break,class,continue,def,yield,del,elif ,else,%
except,exec,finally,for,from,global,if,import,in,%
lambda,not,or,pass,print,raise,return,try,while,assert,with},
emphstyle=\color{blue}\bfseries,
emph={[2]True, False, None},
emphstyle=[2]\color{keywordcolour},
emph={[3]object,type,isinstance,copy,deepcopy,zip,enumerate,reversed,list,len,dict,tuple,xrange,append,execfile,real,imag,reduce,str,repr},
emphstyle=[3]\color{commandcolour},
emph={Exception,NameError,IndexError,SyntaxError,TypeError,ValueError,OverflowError,ZeroDivisionError},
emphstyle=\color{exceptioncolour}\bfseries,
morecomment=[s]{"""}{"""},
commentstyle=\color{commentcolour}\slshape,
emph={[4]ode, fsolve, sqrt, exp, sin, cos,arctan, arctan2, arccos, pi,  array,
norm, solve, dot, arange, , isscalar, max, sum, flatten, flat, size, new, open, Image, save, load,
getdata, putpixel, putdata, getpixel, shape, reshape, find,
any, all, abs, plot, show, linspace, legend, quad, polyval,polyfit, hstack,
concatenate,vstack,column_stack,empty,zeros,ones,rand,vander,grid,pcolor,eig,
eigs,eigvals,svd,qr,tan,det,logspace,roll,min,mean,cumsum,cumprod,diff,vectorize
,lstsq,cla,eye,xlabel,ylabel,squeeze},
emphstyle=[4]\color{numpycolour},
emph={[5]__init__,__add__,__mul__,__div__,__sub__,__call__,__getitem__,__setitem__,__eq__,__ne__,__nonzero__,__rmul__,__radd__,__repr__,__str__,__get__,__truediv__,__pow__,__name__,__future__,__all__},
emphstyle=[5]\color{specmethodcolour},
emph={[6]assert,yield},
emphstyle=[6]\color{keywordcolour}\bfseries,
emph={[7]range},
emphstyle={[7]\color{keywordcolour}\bfseries},
escapeinside={<@}{@>},
literate=
{é}{{\'e}}{1}%
{è}{{\`e}}{1}%
{à}{{\`a}}{1}%
{â}{{\^a}}{1}%
{ç}{{\c{c}}}{1}%
{æ}{{\ae}}{1}%
{œ}{{\oe}}{1}%
{ù}{{\`u}}{1}%
{É}{{\'E}}{1}%
{È}{{\`E}}{1}%
{À}{{\`A}}{1}%
{Ç}{{\c{C}}}{1}%
{Æ}{{\AE}}{1}%
{Œ}{{\OE}}{1}%
{Ê}{{\^E}}{1}%
{ê}{{\^e}}{1}%
{î}{{\^i}}{1}%
{ï}{{\"i}}{1}%
{ô}{{\^o}}{1}%
{û}{{\^u}}{1}%
{:}{{\literatecolour:}}{1}%
{=}{{\literatecolour=}}{1}%
{-}{{\literatecolour-}}{1}%
{+}{{\literatecolour+}}{1}%
{*}{{\literatecolour*}}{1}%
{**}{{\literatecolour{**}}}2%
{/}{{\literatecolour/}}{1}%
{//}{{\literatecolour{//}}}2%
{!}{{\literatecolour!}}{1}%
{[}{{\literatecolour[}}{1}%
{]}{{\literatecolour]}}{1}%
{<}{{\literatecolour<}}{1}%
{>}{{\literatecolour>}}{1}%
{>>>}{\pythonprompt}{3}%
,
backgroundcolor=\color{violet!10}
}
\makeatother

\newcommand*{\inputpythonini}[4]{
\lstinputlisting[
firstline=#2,
lastline=#3,
firstnumber=#4,
breakindent=.5\textwidth,
numbers=left,
framexleftmargin=8mm,
frame=shadowbox,
frameround=tttt,
rulesepcolor=\color{lightgray},
numberstyle=\ttfamily \footnotesize \bf \color{blue},
numbersep=11pt,
xleftmargin=1cm,
breaklines=true,
columns=flexible,
style=mypython_list]{#1}}

\begin{document}
\inputpythonini{condition-compacte.py}{1}{100}{3}
\end{document}
Voici le contenu du programme condition-compacte.py :

Code : Tout sélectionner

# -*- coding: utf-8 -*-

print("Entrez 2 entiers :")
x=int(input("x ? "))
y=int(input("y ? "))

# méthode classique :
if x < y:
    petit = x
else:
    petit = y
    
# méthode compacte :
petit = x if x < y else y

print("\nLe plus petit est", petit)
Comme vous pouvez le constater, les premières lignes ne sont pas affichées grâce à ma bidouille du \inputpythonini.
Si vous avez des choses jolies à proposer...
Je ne souhaite pas utiliser minted pour éviter shell-escape.
Dernière modification par marco56 le mercredi 27 mai 2020, 10:03, modifié 4 fois.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: listing python tcolorbox ou tikz

Message par marco56 »

Bon, à force de réfléchir dessus depuis hier, en fait, j'ai trouvé une solution.
Désolé pour le bruit.
Si qqn trouve mieux, je prends aussi. Voici mon nouveau code :

Code : Tout sélectionner

\RequirePackage{etex}
\documentclass{article}
\usepackage[utf8x]{inputenc}	
\usepackage{tcolorbox}
\usepackage{pythonhighlight}
\usepackage{listings}
\usepackage{xcolor}

\definecolor{intdef}{rgb}{0.9 1 0.8}
\definecolor{intprop}{rgb}{1 1 0.7}

\renewcommand*{\lstlistlistingname}{Code Listings}
\renewcommand*{\lstlistingname}{Code Listing}
\definecolor{gray}{gray}{0.5}
\colorlet{commentcolour}{green!60!black}

\colorlet{stringcolour}{red!80!black}
\colorlet{keywordcolour}{magenta!90!black}
\colorlet{exceptioncolour}{yellow!80!red}
\colorlet{commandcolour}{blue!60!black}
\colorlet{numpycolour}{blue!80!green}
\colorlet{literatecolour}{magenta!90!black}
\colorlet{promptcolour}{red!80!black}
\colorlet{specmethodcolour}{violet}

\makeatletter
\lstdefinestyle{mypython_list}{
inputencoding=utf8,
language=python,
showtabs=true,
tab=,
tabsize=2,
basicstyle=\ttfamily,
stringstyle=\color{stringcolour},
showstringspaces=false,
keepspaces=true,
alsoletter={1234567890},
otherkeywords={\%, \}, \{, \&, \|},
morekeywords={as},
keywordstyle=\color{keywordcolour}\bfseries,
emph={and,break,class,continue,def,yield,del,elif ,else,%
except,exec,finally,for,from,global,if,import,in,%
lambda,not,or,pass,print,raise,return,try,while,assert,with},
emphstyle=\color{blue}\bfseries,
emph={[2]True, False, None},
emphstyle=[2]\color{keywordcolour},
emph={[3]object,type,isinstance,copy,deepcopy,zip,enumerate,reversed,list,len,dict,tuple,xrange,append,execfile,real,imag,reduce,str,repr},
emphstyle=[3]\color{commandcolour},
emph={Exception,NameError,IndexError,SyntaxError,TypeError,ValueError,OverflowError,ZeroDivisionError},
emphstyle=\color{exceptioncolour}\bfseries,
morecomment=[s]{"""}{"""},
commentstyle=\color{commentcolour}\slshape,
emph={[4]ode, fsolve, sqrt, exp, sin, cos,arctan, arctan2, arccos, pi,  array,
norm, solve, dot, arange, , isscalar, max, sum, flatten, flat, size, new, open, Image, save, load,
getdata, putpixel, putdata, getpixel, shape, reshape, find,
any, all, abs, plot, show, linspace, legend, quad, polyval,polyfit, hstack,
concatenate,vstack,column_stack,empty,zeros,ones,rand,vander,grid,pcolor,eig,
eigs,eigvals,svd,qr,tan,det,logspace,roll,min,mean,cumsum,cumprod,diff,vectorize
,lstsq,cla,eye,xlabel,ylabel,squeeze},
emphstyle=[4]\color{numpycolour},
emph={[5]__init__,__add__,__mul__,__div__,__sub__,__call__,__getitem__,__setitem__,__eq__,__ne__,__nonzero__,__rmul__,__radd__,__repr__,__str__,__get__,__truediv__,__pow__,__name__,__future__,__all__},
emphstyle=[5]\color{specmethodcolour},
emph={[6]assert,yield},
emphstyle=[6]\color{keywordcolour}\bfseries,
emph={[7]range},
emphstyle={[7]\color{keywordcolour}\bfseries},
escapeinside={<@}{@>},
literate=
{é}{{\'e}}{1}%
{è}{{\`e}}{1}%
{à}{{\`a}}{1}%
{â}{{\^a}}{1}%
{ç}{{\c{c}}}{1}%
{æ}{{\ae}}{1}%
{œ}{{\oe}}{1}%
{ù}{{\`u}}{1}%
{É}{{\'E}}{1}%
{È}{{\`E}}{1}%
{À}{{\`A}}{1}%
{Ç}{{\c{C}}}{1}%
{Æ}{{\AE}}{1}%
{Œ}{{\OE}}{1}%
{Ê}{{\^E}}{1}%
{ê}{{\^e}}{1}%
{î}{{\^i}}{1}%
{ï}{{\"i}}{1}%
{ô}{{\^o}}{1}%
{û}{{\^u}}{1}%
{:}{{\literatecolour:}}{1}%
{=}{{\literatecolour=}}{1}%
{-}{{\literatecolour-}}{1}%
{+}{{\literatecolour+}}{1}%
{*}{{\literatecolour*}}{1}%
{**}{{\literatecolour{**}}}2%
{/}{{\literatecolour/}}{1}%
{//}{{\literatecolour{//}}}2%
{!}{{\literatecolour!}}{1}%
{[}{{\literatecolour[}}{1}%
{]}{{\literatecolour]}}{1}%
{<}{{\literatecolour<}}{1}%
{>}{{\literatecolour>}}{1}%
{>>>}{\pythonprompt}{3}%
,
backgroundcolor=\color{violet!10}
}
\makeatother

\newcommand*{\inputpythonini}[5]{
\begin{tcolorbox}[colback=violet!10,colframe=blue!60!black!30,coltitle=black,title=\textbf{#5}]
{\lstinputlisting[
firstline=#2,
lastline=#3,
firstnumber=#4,
breakindent=.5\textwidth,
numbers=left,
framexleftmargin=8mm,
numberstyle=\ttfamily \footnotesize \bf \color{blue},
numbersep=11pt,
xleftmargin=1cm,
breaklines=true,
columns=flexible,
style=mypython_list]{
#1}
}
\end{tcolorbox}
}

\begin{document}
\inputpythonini{condition-compacte.py}{1}{100}{3}{condition-compacte.py}
\end{document}

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: [Résolu] listing python tcolorbox ou tikz

Message par marco56 »

Et si cela intéresse du monde, je me suis fait mon petit fichier .sty qui va bien avec le code suivant :

Code : Tout sélectionner

\RequirePackage{etex}
\documentclass{article}
\usepackage[utf8x]{inputenc}	

\usepackage{pythonhighlight_marco_ter}
\begin{document}
\inputpythonini{condition-compacte.py}{1}{100}{3}{condition-compacte.py}

\inputpython{condition-compacte.py}{1}{100}{condition-compacte.py}

\end{document}
qui me donne le rendu ci-joint.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: listing python tcolorbox ou tikz

Message par marco56 »

Bon, et bien, je me suis emballé un peu tôt.
Tout semblait fonctionner mais j'ai parfois des programmes qui prennent plus d'une page.
Du coup, j'ai ajouté l'option "breakable" qui en principe est supportée par ma version de tcolorbox.
Sauf que j'ai le message suivant :

Code : Tout sélectionner

! Package pgfkeys Error: I do not know the key '/tcb/breakable' and I am going 
Si quelqu'un comprend ce qu'il se passe...

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

[Résolu] Re: listing python tcolorbox ou tikz

Message par marco56 »

Trouvé ! Il fallait mettre le "breakable" en option du package.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: listing python tcolorbox ou tikz

Message par marco56 »

Bon, en fait, moyennement satisfaisant : j'ai des coupures parfois étranges d'une part et à à un endroit, j'ai un programme totalement illisible. Incompréhensible.
Bref, si vous avez une solution esthétique, je suis preneur.

marco56
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 864
Inscription : jeudi 25 novembre 2010, 22:10

Re: listing python tcolorbox ou tikz

Message par marco56 »

Bon, apparemment, un problème d'environnements imbriqués par endroits...