% -*- coding: utf-8 ; -*- \documentclass[dvipsnames]{article} \usepackage{fontspec} \usepackage[french]{babel} \frenchsetup{og = « , fg = »} \usepackage[footnotehyper,escape-inside=$$]{piton} \usepackage{xcolor} \usepackage{geometry} \geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}} \usepackage{enumitem} \usepackage{verbatim} \usepackage{amsmath} \usepackage{tabularx} \usepackage{booktabs} \usepackage{caption} % We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb % because we don't want the contents of short verbatim colored in gray \usepackage{shortvrb} \MakeShortVerb{\|} \usepackage{varwidth} \skip\footins = 2\bigskipamount \usepackage{fancyvrb} \fvset{commandchars=\~\#\@,formatcom=\color{gray}} \def\emphase{\bgroup\color{RoyalPurple}\let\next=} \usepackage{titlesec} \titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex} \titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex} \def\interitem{\vspace{7mm plus 2 mm minus 3mm}} \usepackage[hyperfootnotes = false]{hyperref} \hypersetup { pdfinfo = { Title = L’extension piton , Subject = Une extension LaTeX , Author = F. Pantigny } } \NewDocumentEnvironment {scope} {} {} {} \NewDocumentCommand {\pkg} {m} {\textsf{#1}} \NewDocumentCommand {\cls} {m} {\textsf{#1}} \setlength{\parindent}{0pt} \begin{document} \VerbatimFootnotes \title{L'extension LaTeX \pkg{piton}\thanks{Ce document correspond à la version~\myfileversion\space de \pkg{piton}, à la date du~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}} \maketitle \begin{abstract} L'extension \pkg{piton} propose des outils pour composer du code Python avec une coloration syntaxique en utilisant la bibliothèque Lua LPEG. L'extension \pkg{piton} nécessite l'emploi de LuaLaTeX. \end{abstract} \section{Présentation} L'extension \pkg{piton} utilise la librairie Lua nommée LPEG\footnote{LPEG est une librairie de capture de motifs (\emph{pattern-matching} en anglais) pour Lua, écrite en C, fondée sur les PEG (\emph{parsing expression grammars}): \url{http://www.inf.puc-rio.br/~roberto/lpeg/}} pour «parser» le code Python et le composer avec un coloriage syntaxique. Comme elle utilise du code Lua, elle fonctionne uniquement avec |lualatex| (et ne va pas fonctionner avec les autres moteurs de compilation LaTeX, que ce soit |latex|, |pdflatex| ou |xelatex|). Elle n'utilise aucun programme extérieur et la compilation ne requiert donc pas |--shell-escape|. La compilation est très rapide puisque tout le travail du parseur est fait par la librairie LPEG, écrite en C. \bigskip Voici un exemple de code Python composé avec l'environnement |{Piton}| proposé par \pkg{piton}. \bigskip \begin{Piton} from math import pi def arctan(x,n=10): '''Compute the value of arctan(x) n is the number of terms if the sum''' if x < 0: return -arctan(-x) # appel récursif elif x > 1: return pi/2 - arctan(1/x) ## (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$)\footnote{Cet échappement vers LaTeX a été obtenu en débutant par \ttfamily\#\#.} else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} \bigskip L'extension LaTeX \pkg{piton} est entièrement contenue dans le fichier |piton.sty|. Ce fichier peut être placé dans le répertoire courant ou dans une arborescence |texmf|. Le mieux reste néanmoins d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX. \section{Utilisation de l'extension} L'extension \pkg{piton} se charge simplement avec la commande |\usepackage| : |\usepackage{piton}|. On a néanmoins deux remarques à formuler : \begin{itemize} \item l'extension \pkg{piton} utilise l'extension \pkg{xcolor} (néanmoins \pkg{piton} charge pas \pkg{xcolor} : si \pkg{xcolor} n'est pas chargée avant le |\begin{document}|, une erreur fatale sera levée) ; \item l'extension \pkg{piton} n'est utilisable qu'avec LuaLaTeX : si un autre moteur de compilation (comme |latex|, |pdflatex| ou |xelatex|) est utilisé, une erreur fatale sera levée. \end{itemize} \medskip L'extension \pkg{piton} fournit trois outils pour composer du code Python: la commande |\piton|, l'environnement |{Piton}| et la commande |\PitonInputFile|. \begin{itemize} \item La commande |\piton| doit être utilisée pour composer de petits éléments de code à l'intérieur d'un paragraphe. \emph{Attention} : Cette fonction prend son argument en mode \emph{verbatim} (comme la commande \verb|\verb|) et, de ce fait, cette fonction ne peut pas être utilisée à l'intérieur d'un argument d'une autre fonction (on peut néanmoins l'utiliser à l'intérieur d'un environnement). \item L'environnement |{Piton}| doit être utilisé pour composer des codes de plusieurs lignes. Pour les besoins de personnalisation, il est possible de définir de nouveaux environnements similaires à |{Piton}| en utilisant la commande |\NewPitonEnvironment| : cf. partie \ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}. \item La commande |\PitonInputFile| doit être utilisée pour insérer et composer un fichier extérieur. \end{itemize} \bigskip Il est possible de composer des commentaires en LaTeX en commençant par |##| (c'est un échappement vers LaTeX). Les caractères |##| eux-mêmes ne seront pas imprimés et les espaces qui les suivent sont supprimés. Ces commentaires seront simplement appelés «commentaires LaTeX» dans ce document. \section{Personnalisation} \subsection{La commande \textbackslash PitonOptions} La commande |\PitonOptions| prend en argument une liste de couples \textsl{clé=valeur}. La portée des réglages effectués par cette commande est le groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.} \begin{itemize} \item La clé |gobble| peut comme valeur un entier positif $n$ : les $n$ premiers caractères de chaque ligne sont alors retirés (avant formatage du code) dans les environnements |{Piton}|. \item Quand la clé |auto-gobble| est activée, l'extension \pkg{piton} détermine la valeur minimale $n$ du nombre d'espaces successifs débutant chaque ligne (non vide) de l'environnment |{Piton}| et applique |gobble| avec cette valeur de~$n$. \item Quand la clé |env-gobble| est activée, \pkg{piton} applique la clé |gobble| avec une valeur de $n$ égale au nombre d'espaces sur la ligne précédant le |\end{Piton}| (si cette ligne ne comporte que des espaces). \item Avec la clé |line-numbers|, les lignes \emph{non vides} sont numérotées dans les environnements \verb|{Piton}| et dans les listings produits par la commande |\PitonInputFile|. \item Avec la clé |all-line-numbers|, \emph{toutes} les lignes sont numérotées, y compris les lignes vides. \item Avec la clé |resume|, le compteur de lignes n'est pas remis à zéro comme il l'est normalement au début d'un environnement |{Piton}| ou bien au début d'un listing produit par |\PitonInputFile|. \item La clé |splittable| autorise un saut de page dans les environnements |{Piton}| et les listings produits par |\PitonInputFile|. \item La clé |background-color| fixe la couleur de fond des environnements |{Piton}| et des listings produits par |\PitonInputFile| (ce fond a une largeur égale à la valeur courante de |\linewidth|). Même avec une couleur de fond, les sauts de page sont possibles, à partir du moment où la clé |splittable| est utilisée.\footnote{Un environnement |{Piton}| est sécable même dans un environnement de \pkg{tcolorbox}, à partir du moment où la clé |breakable| de \pkg{tcolorbox} est utilisée. On précise cela parce que, en revanche, un environnement de \pkg{tcolorbox} inclus dans un autre environnement de \pkg{tcolorbox} n'est pas sécable, même quand les deux utilisent la clé |breakable|.} \item \colorbox{yellow!50}{\textbf{Nouveau 0.8}}\enskip La clé |left-margin| fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en conjonction avec l'une des clés |line-numbers| et |all-line-numbers| si on ne souhaite pas que les numéros de ligne soient dans une position en débordement sur la gauche. \end{itemize} \bigskip \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} ~emphase&\PitonOptions{line-numbers,auto-gobble,background-color = gray!15}@ \begin{Piton} from math import pi def arctan(x,n=10): '''Compute the value of arctan(x) n is the number of terms if the sum''' if x < 0: return -arctan(-x) # appel récursif elif x > 1: return pi/2 - arctan(1/x) ## (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$) else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} \end{Verbatim} \endgroup \begingroup \PitonOptions{line-numbers,auto-gobble,background-color = gray!15} \begin{Piton} from math import pi def arctan(x,n=10): '''Compute the value of arctan(x) n is the number of terms if the sum''' if x < 0: return -arctan(-x) # appel récursif elif x > 1: return pi/2 - arctan(1/x) ## (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$) else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} \endgroup \subsection{L'option escape-inside} L'option |escape-inside| doit être utilisée au chargement de \pkg{piton} (c'est-à-dire dans l'instruction |\usepackage|). Pour des raisons techniques, elle ne peut pas être fixée dans |\PitonOptions|. Elle prend comme valeur deux caractères qui seront utilisés pour délimiter des parties qui seront composées en LaTeX. \bigskip Dans l'exemple suivant, on suppose que l'extension \pkg{piton} a été chargée de la manière suivante : \smallskip \begin{Verbatim} \usepackage[~emphase#escape-inside=$$@]{piton} \end{Verbatim} \medskip Dans le code suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune l'instruction qui contient l'appel récursif. \begin{Verbatim} \begin{Piton} def fact(n): if n==0: return 1 else: ~emphase#$\colorbox{yellow!50}{$@return n*fact(n-1)~emphase#$}$@ \end{Piton} \end{Verbatim} \begin{Piton} def fact(n): if n==0: return 1 else: $\colorbox{yellow!50}{$return n*fact(n-1)$}$ \end{Piton} \bigskip \emph{Attention} : L'échappement vers LaTeX permis par les caractères de |escape-inside| n'est pas actif dans les chaînes de caractères ni dans les commentaires (pour avoir un commentaire entièrement en échappement vers LaTeX, c'est-à-dire ce qui est appelé dans ce document «commentaire LateX», il suffit de le faire débuter par |##|). \subsection{Les styles} \label{styles} L'extension \pkg{piton} fournit la commande |\SetPitonStyle| pour personnaliser les différents styles utilisés pour formater les éléments syntaxiques des listings Python. Ces personnalisations ont une portée qui correspond au groupe TeX courant.\footnote{On rappelle que tout environnement LaTeX est, en particulier, un groupe.} \bigskip La commande |\SetPitonStyle| prend en argument une liste de couples \textsl{clé=valeur}. Les clés sont les noms des styles et les valeurs sont les instructions LaTeX de formatage correspondantes. \bigskip Ces instructions LaTeX doivent être des instructions de formatage du type de |\bfseries|, |\slshape|, |\color{...}|, etc. (les commandes de ce type sont parfois qualifiées de \emph{semi-globales}). Il est aussi possible de mettre, \emph{à la fin de la liste d'instructions}, une commande LaTeX prenant exactement un argument. \bigskip Voici un exemple qui change le style utilisé pour le nom d'une fonction Python, au moment de sa définition (c'est-à-dire après le mot-clé |def|). \begin{Verbatim} \SetPitonStyle { Name.Function = \bfseries \setlength{\fboxsep}{1pt}\colorbox{yellow!50} } \end{Verbatim} Dans cet exemple, |\colorbox{yellow!50}| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument, puisque, habituellement, elle est utilisée avec la syntaxe |\colorbox{yellow!50}{|\texttt{\slshape text}|}|. \medskip \begingroup \SetPitonStyle { Name.Function = \bfseries \setlength{\fboxsep}{1pt}\colorbox{yellow!50} } Avec ce réglage, on obtient : \piton{def cube(x) : return x * x * x } \endgroup \bigskip Les différents styles sont décrits dans la table \ref{Semantic}. Les réglages initiaux effectués par \pkg{piton} dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments.\footnote{Voir \url{https://pygments.org/styles/}. À remarquer que, par défaut, Pygments propose pour le style \pkg{manni} un fond coloré dont la couleur est la couleur HTML |#F0F3F3|.} \begin{table}[htb] \centering \caption{Les styles proposés par \pkg{piton}} \label{Semantic} \begin{tabularx}{0.9\textwidth}{@{}>{\ttfamily}l>{\raggedright\arraybackslash}X@{}} \toprule \normalfont Style & Usage \\ \midrule Number & les nombres \\ String.Short & les chaînes de caractères courtes (entre \texttt{'} ou \texttt{"}) \\ String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""}) sauf les chaînes de documentation \\ String & cette clé fixe à la fois |String.Short| et |String.Long| \\ String.Doc & les chaînes de documentation \\ String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{}, \texttt{\}} et \texttt{:}) \\ Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ \verb|@| \\ Operator.Word & les opérateurs suivants : |in|, |is|, |and|, |or| et |not| \\ Name.Builtin & la plupart des fonctions prédéfinies par Python \\ Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition}, c'est-à-dire après le mot-clé \verb|def| \\ Name.Decorator & les décorateurs (instructions débutant par \verb|@| dans les classes) \\ Name.Namespace & le nom des modules (= bibliothèques extérieures) \\ Name.Class & le nom des classes au moment de leur définition \\ Exception & le nom des exceptions prédéfinies (eg: SyntaxError) \\ Comment & les commentaires commençant par \texttt{\#} \\ Comment.LaTeX & les commentaires commençant par \texttt{\#\#} qui sont composés en LaTeX par \pkg{piton} (et appelés simplement «commentaires LaTeX» dans ce document) \\ Keyword.Constant & |True|, |False| et |None| \\ Keyword & les mots-clés suivants : \ttfamily assert, break, case, continue, del, elif, else, except, exec, finally, for, from, global, if, import, lambda, non local, pass, raise, return, try, while, with, yield, yield from.\\ \bottomrule \end{tabularx} \end{table} \subsection{Définition de nouveaux environnements} \label{NewPitonEnvironment} Comme l'environnement |{Piton}| a besoin d'absorber son contenu d'une manière spéciale (à peu près comme du texte verbatim), il n'est pas possible de définir de nouveaux environnements directement au-dessus de l'environnement |{Piton}| avec les commandes classiques |\newenvironment| et |\NewDocumentEnvironment|. C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la commande classique |\NewDocumentEnvironment|. \bigskip Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement que l'environnement |{Piton}|: {\color{gray}\verb|\NewPitonEnvironment{Python}{}{}{}|} \bigskip Si on souhaite un environnement |{Python}| qui prenne en argument optionnel entre crochets les clés de |\PitonOptions|, on peut écrire : {\color{gray}\verb|\NewPitonEnvironment{Python}{O{}}{\PitonOptions{#1}}{}|} \bigskip Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de \pkg{tcolorbox}, on peut écrire: \begin{verbatim} \NewPitonEnvironment{Python}{} {\begin{tcolorbox}} {\end{tcolorbox}} \end{verbatim} \section{Fonctionnalités avancées} \bigskip \subsection{Notes de pied de page dans les environnements de piton} \label{footnote} Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{piton} (ou bien dans un listing produit par |\PitonInputFile|, bien que cela paraisse moins pertinent dans ce cas-là) vous pouvez utiliser une paire |\footnotemark|--|\footnotetext|. \smallskip Il est aussi possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien l'extension \pkg{footnotehyper}. \smallskip Si \pkg{piton} est chargée avec l'option |footnote| (avec |\usepackage[footnote]{piton}|) l'extension \pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page. \smallskip Si \pkg{piton} est chargée avec l'option |footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire les notes de pied de page. \smallskip Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles. L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote} et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ; en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement compatible avec \pkg{hyperref}. \medskip Dans ce document, l'extension \pkg{piton} a été chargée avec l'option |footnotehyper| et c'est pourquoi des notes peuvent être mises dans les environnements |{Piton}|: cf. première page de ce document. \section{Exemples} \PitonOptions{splittable} \subsection{Numérotation des lignes} Par défaut, les numéros de ligne sont composés par \pkg{piton} en débordement à gauche (en utilisant en interne la commande |\llap| de LaTeX). Si on ne veut pas de débordement, il faut réserver une place à gauche pour les numéros de lignes avec la clé |left-margin|. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} ~emphase&\PitonOptions{background-color=gray!10, left-margin = 5mm, line-numbers}@ \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## (appel récursif) elif x > 1: return pi/2 - arctan(1/x) ## (autre appel récursif) else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{Verbatim} \endgroup \begingroup \PitonOptions{background-color=gray!10,left-margin = 5mm, line-numbers} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## (appel récursif) elif x > 1: return pi/2 - arctan(1/x) ## (autre appel récursif) else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \endgroup \subsection{Formatage des commentaires LaTeX} On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires LaTeX (qui débutent par |##|) en butée à droite. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} \PitonOptions{background-color=gray!10} ~emphase&\SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}}@ \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## appel récursif elif x > 1: return pi/2 - arctan(1/x) ## autre appel récursif else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{Verbatim} \endgroup \begingroup \PitonOptions{background-color=gray!10} \SetPitonStyle{Comment.LaTeX = \hfill \normalfont\color{gray}} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## appel récursif elif x > 1: return pi/2 - arctan(1/x) ## autre appel récursif else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \endgroup \vspace{1cm} On peut aussi faire afficher les commentaires dans une deuxième colonne à droite si on limite la largeur du code proprement dit avec un environnement |{minipage}| de LaTeX. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} \PitonOptions{background-color=gray!10} ~emphase&\NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}}@ ~emphase&\SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand}@ ~emphase&\begin{minipage}{12cm}@ \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## appel récursif elif x > 1: return pi/2 - arctan(1/x) ## autre appel récursif else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} ~emphase&\end{minipage}@ \end{Verbatim} \endgroup \begingroup \PitonOptions{background-color=gray!10} \NewDocumentCommand{\MyLaTeXCommand}{m}{\hfill \normalfont\itshape\rlap{\quad #1}} \SetPitonStyle{Comment.LaTeX = \MyLaTeXCommand} \begin{minipage}{12cm} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x) ## appel récursif elif x > 1: return pi/2 - arctan(1/x) ## autre appel récursif else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} \end{minipage} \endgroup \subsection{Notes dans les listings} Pour pouvoir extraire les notes (introduites par |\footnote|), l'extension |piton| doit être chargée, soit avec la clé |footnote|, soit avec la clé |footnotehyper|, comme expliqué à la section \ref{footnote} p.~\pageref{footnote}. Dans le présent document, l'extension \pkg{piton} a été chargée par la clé |footnotehyper|. Bien entendu, une commande |\footnote| ne peut apparaître que dans un commentaire LaTeX (qui débute par |##|). Un tel commentaire peut se limiter à cette unique commande |\footnote|, comme dans l'exemple suivant. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} \PitonOptions{background-color=gray!10} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)~emphase&##\footnote{Un premier appel récursif.}]@ elif x > 1: return pi/2 - arctan(1/x)~emphase&##\footnote{Un deuxième appel récursif.}@ else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{Verbatim} \endgroup \begingroup \PitonOptions{background-color=gray!10} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)##\footnote{Un premier appel récursif.} elif x > 1: return pi/2 - arctan(1/x)##\footnote{Un deuxième appel récursif.} else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \endgroup \vspace{1cm} Si on utilise l'environnement |{Piton}| dans un environnement |{minipage}| de LaTeX, les notes sont, bien entendu, composées au bas de l'environnement |{minipage}|. Rappelons qu'une telle |{minipage}| ne peut être coupée par un saut de page. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} \PitonOptions{background-color=gray!10} \emphase\begin{minipage}{\linewidth} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)~emphase&##\footnote{Un premier appel récursif.}@ elif x > 1: return pi/2 - arctan(1/x)~emphase&##\footnote{Un deuxième appel récursif.}@ else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{minipage} \end{Verbatim} \endgroup \begingroup \PitonOptions{background-color=gray!10} \begin{minipage}{\linewidth} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)##\footnote{Un premier appel récursif.} elif x > 1: return pi/2 - arctan(1/x)##\footnote{Un deuxième appel récursif.} else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{minipage} \endgroup \vspace{1cm} Si on encapsule l'environnement |{Piton}| dans un environnement |{minipage}| pour, typiquement, limiter la largeur d'un fond coloré, il faut encadrer l'ensemble dans un environnement |{savenotes}| (de \pkg{footnote} ou \pkg{footnotehyper}) si on veut avoir les notes reportées en pied de page. \begingroup \fvset{commandchars=\~\&\@,formatcom=\small\color{gray}} \begin{Verbatim} \PitonOptions{background-color=gray!10} ~emphase&\begin{savenotes}@ \begin{minipage}{13cm} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)~emphase&##\footnote{Un premier appel récursif.}@ elif x > 1: return pi/2 - arctan(1/x)~emphase&##\footnote{Un deuxième appel récursif.}@ else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{minipage} ~emphase&\end{savenotes}@ \end{Verbatim} \endgroup \begin{savenotes} \PitonOptions{background-color=gray!10} \begin{minipage}{13cm} \begin{Piton} def arctan(x,n=10): if x < 0: return -arctan(-x)##\footnote{Un premier appel récursif.} elif x > 1: return pi/2 - arctan(1/x)##\footnote{Un deuxième appel récursif.} else: return sum( (-1)**k/(2*k+1)*x**(2*k+1) for k in range(n) ) \end{Piton} \end{minipage} \end{savenotes} \subsection{Un exemple de réglage des styles} Les styles graphiques ont été présentés à la partie \ref{styles}, p.~\pageref{styles}. \smallskip On présente ici un réglage de ces styles adapté pour les documents en noir et blanc. On l'utilise avec la fonte \emph{DejaVu Sans Mono}\footnote{Voir: \url{https://dejavu-fonts.github.io}} spécifiée avec la commande |\setmonofont| de \pkg{fontspec}. \begin{Verbatim} \setmonofont[Scale=0.85]{DejaVu Sans Mono} \SetPitonStyle { Number = , String = \itshape , String.Doc = \color{gray} \itshape , Operator = , Operator.Word = \bfseries , Name.Builtin = , Name.Function = \bfseries \colorbox{gray!20} , Comment = \color{gray} , Comment.LaTeX = \color{gray}, Keyword = \bfseries , Name.Namespace = , Name.Class = , Name.Type = , InitialValues = \color{gray} } \end{Verbatim} \setmonofont[Scale=0.85]{DejaVu Sans Mono} \SetPitonStyle { Number = , String = \itshape , String.Doc = \color{gray} \itshape , Operator = , Operator.Word = \bfseries , Name.Builtin = , Name.Function = \bfseries \colorbox{gray!20} , Comment = \color{gray} , Comment.LaTeX = \color{gray}, Keyword = \bfseries , Name.Namespace = , Name.Class = , Name.Type = , InitialValues = \color{gray} } \bigskip \begin{Piton} from math import pi def arctan(x,n=10): '''Compute the value of arctan(x) n is the number of terms if the sum''' if x < 0: return -arctan(-x) # appel récursif elif x > 1: return pi/2 - arctan(1/x) ## (on a utilisé le fait que $\arctan(x)+\arctan(1/x)=\pi/2$ pour $x>0$) else: s = 0 for k in range(n): s += (-1)**k/(2*k+1)*x**(2*k+1) return s \end{Piton} \section*{Autre documentation} Le document |piton.pdf| (fourni avec l'extension \pkg{piton}) contient une traduction anglaise de la documentation ici présente, ainsi que le code source commenté et un historique des versions. \end{document}