texlive[71932] Master/texmf-dist: piton (30jul24)

commits+karl at tug.org commits+karl at tug.org
Tue Jul 30 22:11:06 CEST 2024


Revision: 71932
          https://tug.org/svn/texlive?view=revision&revision=71932
Author:   karl
Date:     2024-07-30 22:11:05 +0200 (Tue, 30 Jul 2024)
Log Message:
-----------
piton (30jul24)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.pdf
    trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.tex
    trunk/Master/texmf-dist/doc/lualatex/piton/piton.pdf
    trunk/Master/texmf-dist/source/lualatex/piton/piton.dtx
    trunk/Master/texmf-dist/tex/lualatex/piton/piton.lua
    trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty

Modified: trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.tex
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.tex	2024-07-29 23:42:00 UTC (rev 71931)
+++ trunk/Master/texmf-dist/doc/lualatex/piton/piton-french.tex	2024-07-30 20:11:05 UTC (rev 71932)
@@ -107,8 +107,9 @@
 \maketitle
 
 \begin{abstract}
-L'extension \pkg{piton} propose des outils pour composer des codes informatiques avec coloration syntaxique. Elle
-nécessite l'emploi de la LuaLaTeX car le travail principal est fait en utilisant la bibliothèque Lua LPEG. 
+L'extension \pkg{piton} propose des outils pour composer des codes informatiques avec
+coloration syntaxique. Elle nécessite l'emploi de la LuaLaTeX car le travail principal est
+fait en utilisant la bibliothèque Lua LPEG.
 \end{abstract}
 
 
@@ -115,13 +116,16 @@
 
 \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» des listings informatiques avec
-coloriage syntaxique. Comme elle utilise le Lua de LuaLaTeX, 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.
+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» des listings informatiques
+avec coloriage syntaxique. Comme elle utilise le Lua de LuaLaTeX, 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}.
@@ -149,20 +153,21 @@
 \end{Piton}
 
 \bigskip
-Les principaux concurrents de l'extension \pkg{piton} sont certainement les extensions bien connues \pkg{listings}
-et \pkg{minted}.
+Les principaux concurrents de l'extension \pkg{piton} sont certainement les extensions
+bien connues \pkg{listings} et \pkg{minted}.
 
 \bigskip
-Le nom de cette extension (\pkg{piton}) a été choisi un peu arbitrairement en référence aux pitons d'alpinisme qui
-servent à gravir les montagnes.
+Le nom de cette extension (\pkg{piton}) a été choisi un peu arbitrairement en référence
+aux pitons d'alpinisme qui servent à gravir les montagnes.
 
 
 
 \section{Installation}
 
-L'extension \pkg{piton} est composée de deux fichiers : |piton.sty| et |piton.lua| (le fichier LaTeX |piton.sty|
-chargé par |\usepackage| va à son tour charger le fichier |piton.lua|). Les deux fichiers doivent être présents
-dans un répertoire où LaTeX pourra les trouver, de préférence dans une arborescence |texmf|. Le mieux reste néanmoins
+L'extension \pkg{piton} est composée de deux fichiers : |piton.sty| et |piton.lua| (le
+fichier LaTeX |piton.sty| chargé par |\usepackage| va à son tour charger le fichier
+|piton.lua|). Les deux fichiers doivent être présents dans un répertoire où LaTeX pourra
+les trouver, de préférence dans une arborescence |texmf|. Le mieux reste néanmoins
 d'installer \pkg{piton} avec une distribution TeX comme MiKTeX, TeX~Live ou MacTeX.
 
 
@@ -169,8 +174,9 @@
 
 \section{Utilisation de l'extension}
 
-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.
+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.
 
 
 \subsection{Choix du langage}
@@ -177,12 +183,12 @@
 
 Les langages informatiques pris en charge par \pkg{piton} se classent en deux catégories :
 \begin{itemize}
-\item les langages reconnus nativement par \pkg{piton} qui sont au nombre de cinq : Python, OCaml, SQL, C (ou 
-plutôt \CC) et un langage nommé |minimal|\footnote{Le langage |minimal| peut servir pour formater du pseudo-code
-  : cf.~p.~\pageref{minimal}.} ;
+\item les langages reconnus nativement par \pkg{piton} qui sont au nombre de cinq :
+Python, OCaml, SQL, C (ou plutôt \CC) et un langage nommé |minimal|\footnote{Le langage
+  |minimal| peut servir pour formater du pseudo-code : cf.~p.~\pageref{minimal}.} ;
 \item les langages définis par l'utilisateur avec la commande |\NewPitonLanguage| décrite
-p.~\pageref{NewPitonLanguage} (les parseurs de ces langages ne pourront jamais être aussi précis que ceux proposés
-nativement par \pkg{piton)}.
+p.~\pageref{NewPitonLanguage} (les parseurs de ces langages ne pourront jamais être aussi
+précis que ceux proposés nativement par \pkg{piton)}.
 \end{itemize}
 
 
@@ -197,15 +203,16 @@
 |\PitonOptions{language = OCaml}|
 
 \smallskip
-En fait, le nom des langages, pour \pkg{piton}, est toujours \textbf{insensible à la casse}. Dans cet exemple, on
-aurait tout aussi bien pu écrire |Ocaml| ou |ocaml|.
+En fait, le nom des langages, pour \pkg{piton}, est toujours \textbf{insensible à la
+  casse}. Dans cet exemple, on aurait tout aussi bien pu écrire |Ocaml| ou |ocaml|.
 
 \smallskip
-Pour les développeurs, précisons que le nom du langage courant est stocké (en minuscules) dans la variable publique
-L3 nommée |\l_piton_language_str|. 
+Pour les développeurs, précisons que le nom du langage courant est stocké (en minuscules)
+dans la variable publique L3 nommée |\l_piton_language_str|.
 
 \smallskip
-Dans la suite de ce document, on parlera de Python mais les fonctionnalités s'appliquent aussi aux autres langages.
+Dans la suite de ce document, on parlera de Python mais les fonctionnalités s'appliquent
+aussi aux autres langages.
 
 
 
@@ -215,21 +222,21 @@
 L'extension \pkg{piton} se charge simplement avec |\usepackage{piton}|.
 
 \smallskip
-Si, à la fin du prambule, l'extension \pkg{xcolor} n'a pas été chargée (par l'utilisateur ou par une extension
-chargée dans le préambule), \pkg{piton} charge l'extension \pkg{xcolor} avec |\usepackage{xcolor}|, c'est-à-dire
-sans aucune option. L'extension \pkg{piton} ne charge pas d'autre extension. Elle n'utilise pas de programme
-extérieur. 
+Si, à la fin du prambule, l'extension \pkg{xcolor} n'a pas été chargée (par l'utilisateur
+ou par une extension chargée dans le préambule), \pkg{piton} charge l'extension
+\pkg{xcolor} avec |\usepackage{xcolor}|, c'est-à-dire sans aucune option. L'extension
+\pkg{piton} ne charge pas d'autre extension. Elle n'utilise pas de programme extérieur.
 
 \subsection{Les commandes et environnements à la disposition de l'utilisateur}
 
 \indexenv{Piton}
 
-L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les commandes |\piton|,
-l'environnement |{Piton}| et la commande |\PitonInputFile|. 
+L'extension \pkg{piton} fournit plusieurs outils pour composer du code Python: les
+commandes |\piton|, l'environnement |{Piton}| et la commande |\PitonInputFile|.
 
 \begin{itemize} \setlength{\fboxsep}{1pt}
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée pour composer de petits éléments de code à l'intérieur d'un
-paragraphe. Par exemple : 
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash piton} doit être utilisée
+pour composer de petits éléments de code à l'intérieur d'un paragraphe. Par exemple :
 
 {\color{gray}\verb|\piton{def carré(x): return x*x}|}\qquad 
 \piton{def carré(x): return x*x}
@@ -237,26 +244,28 @@
 La syntaxe et les particularités de la commande sont détaillées ci-après.
 
 
-\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour composer des codes de
-plusieurs lignes. Comme cet environnement prend son argument selon un mode verbatim, il ne peut pas être utilisé
-dans l'argument d'une commande LaTeX. Pour les besoins de personnalisation, il est possible de définir de nouveaux
-environnements similaires à |{Piton}| en utilisant la commande \DefinitionCommand{NewPitonEnvironment} : cf. partie
-\ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
+\item L'environnement \colorbox{gray!20}{\ttfamily \{Piton\}} doit être utilisé pour
+composer des codes de plusieurs lignes. Comme cet environnement prend son argument selon
+un mode verbatim, il ne peut pas être utilisé dans l'argument d'une commande LaTeX. Pour
+les besoins de personnalisation, il est possible de définir de nouveaux environnements
+similaires à |{Piton}| en utilisant la commande \DefinitionCommand{NewPitonEnvironment} :
+cf. partie \ref{NewPitonEnvironment} p.~\pageref{NewPitonEnvironment}.
 
-\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être utilisée pour insérer et
-composer un fichier externe.
+\item La commande \colorbox{gray!20}{\ttfamily \textbackslash PitonInputFile} doit être
+utilisée pour insérer et composer un fichier externe.
 
 Il est possible de n'insérer qu'une partie de ce fichier : cf. partie~\ref{part-of-a-file},
 p.~\pageref{part-of-a-file}.
 
-La clé \Definition{path} de la commande |\PitonOptions| permet de spécifier une \emph{liste} de chemins où sera
-recherché le fichier à inclure (dans cette liste, les chemins sont séparés par des virgules).
+La clé \Definition{path} de la commande |\PitonOptions| permet de spécifier une
+\emph{liste} de chemins où sera recherché le fichier à inclure (dans cette liste, les
+chemins sont séparés par des virgules).
 
-L'extension \pkg{piton} propose aussi des commandes \colorbox{gray!20}{\ttfamily\textbackslash PitonInputFileT}, 
-\colorbox{gray!20}{\ttfamily \textbackslash PitonInputFileF} et
-\colorbox{gray!20}{\ttfamily \textbackslash PitonInputFileTF} avec des arguments correspondant aux lettres |T| et
-|F|, arguments qui seront executés dans le
-cas où le fichier a été trouvé (lettre |T|) ou pas (lettre |F|).
+L'extension \pkg{piton} propose aussi des commandes
+\colorbox{gray!20}{\ttfamily\textbackslash PitonInputFileT}, \colorbox{gray!20}{\ttfamily
+  \textbackslash PitonInputFileF} et \colorbox{gray!20}{\ttfamily \textbackslash
+  PitonInputFileTF} avec des arguments correspondant aux lettres |T| et |F|, arguments qui
+seront executés dans le cas où le fichier a été trouvé (lettre |T|) ou pas (lettre |F|).
 
 \end{itemize}
 
@@ -265,19 +274,23 @@
 
 \indexcommand{piton}
 
-La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme une commande standard de
-LaTeX prenant son argument entre accolades (|\piton{...}|), ou bien selon la syntaxe de la commande |\verb| où l'argument est
-délimité entre deux caractères identiques (par ex. : \verb!\piton|...|!). On détaille maintenant ces deux syntaxes.
+La commande |\piton| possède en fait une syntaxe double. Elle est peut être utilisée comme
+une commande standard de LaTeX prenant son argument entre accolades (|\piton{...}|), ou
+bien selon la syntaxe de la commande
+|\verb| où l'argument est délimité entre deux caractères 
+identiques (par ex. : \verb!\piton|...|!).
+On détaille maintenant ces deux syntaxes.
 
 \bigskip
 \begin{itemize}
 \item {\color{blue} \textsf{Syntaxe} \verb|\piton{...}|}\par\nobreak
 
-Quand son argument est donné entre accolades, la commande |\piton| ne prend pas son argument en mode verbatim. Les
-points suivants doivent être remarqués :
+Quand son argument est donné entre accolades, la commande |\piton| ne prend pas son
+argument en mode verbatim. Les points suivants doivent être remarqués :
 
 \begin{itemize}
-\item plusieurs espaces successives sont remplacées par une unique espace, ainsi que les retours à la ligne
+\item plusieurs espaces successives sont remplacées par une unique espace, ainsi que les
+retours à la ligne
 
 {\color{cyan} mais la commande |\|␣ est fournie pour forcer l'insertion d'une espace} ;
 
@@ -287,7 +300,8 @@
 
 \item les accolades doivent apparaître par paires correctement imbriquées, 
 
-{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des accolades individuelles} ;
+{\color{cyan} mais les commandes |\{| et |\}| sont aussi fournies pour insérer des
+  accolades individuelles} ;
 
 \item les commandes LaTeX\footnote{Cela s'applique aux commandes commençant par une contre-oblique |\| mais
   également aux caractères actifs, c'est-à-dire ceux de catcode~13.} sont complètement développées sans être
@@ -316,16 +330,16 @@
 \end{tabular}
 
 \bigskip
-La commande |\piton| avec son argument entre accolades peut être utilisée dans les arguments des autres commandes LaTeX.\footnote{La commande
-  |\piton| peut par exemple être
+La commande |\piton| avec son argument entre accolades peut être utilisée dans les
+arguments des autres commandes LaTeX.\footnote{La commande |\piton| peut par exemple être
   utilisée dans une note de bas de page. Exemple : \piton{s = 'Une chaîne'}.}
 
 \bigskip
 \item {\color{blue} \textsf{Syntaxe} \verb!\piton|...|!}\par\nobreak
 
-Quand la commande |\piton| prend son argument entre deux caractères identiques, cet argument est pris \emph{en mode
-  verbatim}. De ce fait, avec cette syntaxe, la commande |\piton| ne peut \emph{pas} être utilisée dans l'argument d'une
-autre fonction.  
+Quand la commande |\piton| prend son argument entre deux caractères identiques, cet
+argument est pris \emph{en mode verbatim}. De ce fait, avec cette syntaxe, la commande
+|\piton| ne peut \emph{pas} être utilisée dans l'argument d'une autre fonction.
 
 \medskip
 \begin{tabular}{>{\color{gray}}w{l}{75mm}@{\hspace*{1cm}}l}
@@ -347,9 +361,10 @@
 
 \section{Personnalisation}
 
-Concernant la fonte de caractères utilisée dans les listings produits par l'extension \pkg{piton}, il s'agit
-simplement de la fonte mono-chasse courante (\pkg{piton} utilise simplement en interne la commande LaTeX standard
-|\ttfamily|). Pour la changer, le mieux est d'utiliser |\setmonofont| de \pkg{fontspec}.
+Concernant la fonte de caractères utilisée dans les listings produits par l'extension
+\pkg{piton}, il s'agit simplement de la fonte mono-chasse courante (\pkg{piton} utilise
+simplement en interne la commande LaTeX standard |\ttfamily|). Pour la changer, le mieux
+est d'utiliser |\setmonofont| de \pkg{fontspec}.
 
 \subsection{Les clés de la commande \textbackslash PitonOptions}
 
@@ -356,76 +371,92 @@
 
 \indexcommand{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.}
+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.}
 
-Ces clés peuvent aussi être appliquées à un environnement |{Piton}| individuel (entre crochets).
+Ces clés peuvent aussi être appliquées à un environnement |{Piton}| individuel (entre
+crochets).
 
 \begin{itemize}
-\item La clé \Definition{language} spécifie le langage informatique considéré (la casse n'est pas prise en compte).
-Cinq valeurs sont possibles : |Python|, |OCaml|, |C|, |SQL| et |minimal|. La valeur initiale est |Python|.
+\item La clé \Definition{language} spécifie le langage informatique considéré (la casse
+n'est pas prise en compte). Cinq valeurs sont possibles : |Python|, |OCaml|, |C|, |SQL| et
+|minimal|. La valeur initiale est |Python|.
 
 \item \index{path} La clé \Definition{path} indique un chemin où seront cherchés les fichiers inclus par
 |\PitonInputFile|. 
 
-\item \index{gobble}\label{gobble} La clé \Definition{gobble} prend 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}|.
-Ces $n$ caractères ne sont pas nécessairement des espaces.
+\item \index{gobble}\label{gobble} La clé \Definition{gobble} prend 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}|. Ces $n$ caractères ne sont pas
+nécessairement des espaces.
 
-\item \index{auto-gobble}\index{gobble!auto-gobble} Quand la clé \Definition{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'environnement |{Piton}| et applique |gobble|
-avec cette valeur de~$n$.
+\item \index{auto-gobble}\index{gobble!auto-gobble} Quand la clé \Definition{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'environnement |{Piton}| et applique
+|gobble| avec cette valeur de~$n$.
 
-\item \index{env-gobble}\index{gobble!env-gobble} Quand la clé \Definition{env-gobble} est activée, \pkg{piton}
-analyse la dernière ligne de l'environnement, c'est-à-dire celle qui contient le |\end{Piton}| et détermine si
-cette ligne ne comporte que des espaces suivis par |\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre
-$n$ de ces espaces et applique |gobble| avec cette valeur de~$n$. Le nom de cette clé vient de \emph{environment
-  gobble}: le nombre d'espaces à retirer ne dépend que de la position des délimiteurs |\begin{Piton}| et
-|\end{Piton}| de l'environnement.
+\item \index{env-gobble}\index{gobble!env-gobble} Quand la clé \Definition{env-gobble} est
+activée, \pkg{piton} analyse la dernière ligne de l'environnement, c'est-à-dire celle qui
+contient le |\end{Piton}| et détermine si cette ligne ne comporte que des espaces suivis
+par |\end{Piton}|. Si c'est le cas, \pkg{piton} calcule le nombre $n$ de ces espaces et
+applique |gobble| avec cette valeur de~$n$. Le nom de cette clé vient de \emph{environment
+  gobble}: le nombre d'espaces à retirer ne dépend que de la position des délimiteurs
+|\begin{Piton}| et |\end{Piton}| de l'environnement.
 
-\item \index{write} La clé \Definition{write} prend en argument un nom de fichier (avec l'extension) et écrit le
-contenu\footnote{En fait, il ne s'agit pas exactement du contenu de l'environnement mais de la valeur renvoyée par
-  l'instruction Lua 
-  |piton.get_last_code()| qui en est une version sans les surcharges de formatage LaTeX (voir la partie \ref{API}, p.~\pageref{API}).} de l'environnement courant dans ce fichier. À la première utilisation du fichier par \pkg{piton}, celui-ci
-est effacé.
+\item \index{write} La clé \Definition{write} prend en argument un nom de fichier (avec
+l'extension) et écrit le contenu\footnote{En fait, il ne s'agit pas exactement du contenu
+  de l'environnement mais de la valeur renvoyée par l'instruction Lua
+  |piton.get_last_code()| qui en est une version sans les surcharges de formatage LaTeX
+  (voir la partie \ref{API}, p.~\pageref{API}).} de l'environnement courant dans ce
+fichier. À la première utilisation du fichier par \pkg{piton}, celui-ci est effacé.
 
-\item \index{path-write} La clé \Definition{path-write} indique un chemin où seront écrits les fichiers écrits par
-l'emploi de la clé |write| précédente.
+\item \index{path-write} La clé \Definition{path-write} indique un chemin où seront écrits
+les fichiers écrits par l'emploi de la clé |write| précédente.
 
-\item \index{line-numbers} La clé \Definition{line-numbers} active la numérotation des lignes (en débordement à
-gauche) dans les environnements |{Piton}| et dans les listings produits par la commande |\PitonInputFile|.
+\item \index{line-numbers} La clé \Definition{line-numbers} active la numérotation des
+lignes (en débordement à gauche) dans les environnements |{Piton}| et dans les listings
+produits par la commande |\PitonInputFile|.
 
 Cette clé propose en fait plusieurs sous-clés.
 \begin{itemize}
-\item La clé \Definition{line-numbers/skip-empty-lines} demande que les lignes vides (qui ne contiennent que des
-espaces) soient considérées comme non existantes en ce qui concerne la numérotation des lignes (si la clé
-|/absolute|, décrite plus bas, est active, la clé |/skip-empty-lines| n'a pas d'effet dans |\PitonInputFile|). La
-valeur initiale de cette clé est |true| (et non |false|).\footnote{Avec le langage Python, les lignes vides des \emph{docstrings} sont
-  prises en compte.}
+\item La clé \Definition{line-numbers/skip-empty-lines} demande que les lignes vides (qui
+ne contiennent que des espaces) soient considérées comme non existantes en ce qui concerne
+la numérotation des lignes (si la clé |/absolute|, décrite plus bas, est active, la clé
+|/skip-empty-lines| n'a pas d'effet dans |\PitonInputFile|). La valeur initiale de cette
+clé est |true| (et non |false|).\footnote{Avec le langage Python, les lignes vides des
+  \emph{docstrings} sont prises en compte.}
 
-\item La clé \Definition{line-numbers/label-empty-lines} demande que les labels (c'est-à-dire les numéros) des
-lignes vides soient affichés. Si la clé |/skip-empty-lines| est active, la clé |/label-empty-lines| est sans effet.
-La valeur initiale de cette clé est |true|.\footnote{Quand la clé |split-on-empty-lines| est activée, les labels des
+\item La clé \Definition{line-numbers/label-empty-lines} demande que les labels
+(c'est-à-dire les numéros) des lignes vides soient affichés. Si la clé |/skip-empty-lines|
+est active, la clé |/label-empty-lines| est sans effet. La valeur initiale de cette clé
+est |true|.\footnote{Quand la clé |split-on-empty-lines| est activée, les labels des
   lignes vides ne sont jamais imprimés.}
 
-\item La clé \Definition{line-numbers/absolute} demande, pour les listings générés par |\PitonInputFile|, que les
-numéros de lignes affichés soient absolus (c'est-à-dire ceux du fichier d'origine). Elle n'a d'intérêt que si on
-n'insère qu'une partie du fichier (cf. partie~\ref{part-of-a-file}, p.~\pageref{part-of-a-file}). La clé
-|/absolute| est sans effet dans les environnements |{Piton}|.
+\item La clé \Definition{line-numbers/absolute} demande, pour les listings générés par
+|\PitonInputFile|, que les numéros de lignes affichés soient absolus (c'est-à-dire ceux du
+fichier d'origine). Elle n'a d'intérêt que si on n'insère qu'une partie du fichier (cf.
+partie~\ref{part-of-a-file}, p.~\pageref{part-of-a-file}). La clé |/absolute| est sans
+effet dans les environnements |{Piton}|.
 
-\item La clé \Definition{line-numbers/resume} reprend la numérotation là où elle avait été laissée au dernier
-listing. En fait, la clé |line-numbers/resume| a un alias, qui est |resume| tout court (car on peut être amené à
-l'utiliser souvent).
+\item La clé \Definition{line-numbers/resume} reprend la numérotation là où elle avait été
+laissée au dernier listing. En fait, la clé |line-numbers/resume| a un alias, qui est
+|resume| tout court (car on peut être amené à l'utiliser souvent).
 
-\item La clé \Definition{line-numbers/start} impose que la numérotation commence à ce numéro. 
+\item La clé \Definition{line-numbers/start} impose que la numérotation commence à ce
+numéro.
 
-\item La clé \Definition{line-numbers/sep} est la distance horizontale entre les numéros de lignes (insérés par
-|line-numbers|) et les lignes du code informatique. La valeur initiale est 0.7~em.
+\item La clé \Definition{line-numbers/sep} est la distance horizontale entre les numéros
+de lignes (insérés par |line-numbers|) et les lignes du code informatique. La valeur
+initiale est 0.7~em.
+
+\item \colorbox{yellow!50}{\bfseries Nouveau 3.1}\enskip La clé
+\Definition{line-numbers/format} est une liste de tokens qui est insérée avant le numéro de
+ligne pour le formater. La valeur initiale est |\footnotesize \color{gray}|.
 \end{itemize}
 
-Pour la commodité, un dispositif de factorisation du préfixe |line-numbers| est disponible, c'est-à-dire que l'on
-peut écrire :
+Pour la commodité, un dispositif de factorisation du préfixe |line-numbers| est
+disponible, c'est-à-dire que l'on peut écrire :
 
 \begin{Verbatim}
 \PitonOptions
@@ -440,47 +471,58 @@
 \end{Verbatim}
 
 
-\item \index{left-margin} La clé \Definition{left-margin} fixe une marge sur la gauche. Cette clé peut être utile, en particulier, en
-conjonction avec la clé |line-numbers| si on ne souhaite pas que les numéros de ligne soient dans une position en
-débordement sur la gauche.
+\item \index{left-margin} La clé \Definition{left-margin} fixe une marge sur la gauche.
+Cette clé peut être utile, en particulier, en conjonction avec la clé |line-numbers| si on
+ne souhaite pas que les numéros de ligne soient dans une position en débordement sur la
+gauche.
 
-Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette valeur, une marge est
-insérée automatiquement pour les numéros de ligne quand la clé |line-numbers| est utilisée. Voir un exemple à la
-partie \ref{example-numbering} p.~\pageref{example-numbering}.
+Il est possible de donner à la clé |left-margin| la valeur spéciale~|auto|. Avec cette
+valeur, une marge est insérée automatiquement pour les numéros de ligne quand la clé
+|line-numbers| est utilisée. Voir un exemple à la partie \ref{example-numbering}
+p.~\pageref{example-numbering}.
 
-\item \index{background-color} La clé \Definition{background-color} fixe la couleur de fond des environnements |{Piton}| et des listings
-produits par |\PitonInputFile| (ce fond a une largeur que l'on peut fixer avec la clé |width| décrite ci-dessous).
-La clé |background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut écrire par exemple
-|background-color = [cmyk]{0.1,0.05,0,0}|
+\item \index{background-color} La clé \Definition{background-color} fixe la couleur de
+fond des environnements |{Piton}| et des listings produits par |\PitonInputFile| (ce fond
+a une largeur que l'on peut fixer avec la clé |width| décrite ci-dessous). La clé
+|background-color| accepte une couleur définie «à la volée», c'est-à-dire que l'on peut
+écrire par exemple |background-color = [cmyk]{0.1,0.05,0,0}|
 
 \smallskip
-La clé |background-color| accepte aussi en argument une \emph{liste} de couleurs. Les lignes sont alors coloriées
-de manière cyclique avec ces couleurs.
+La clé |background-color| accepte aussi en argument une \emph{liste} de couleurs. Les
+lignes sont alors coloriées de manière cyclique avec ces couleurs.
 
 \emph{Exemple} : |\PitonOptions{background-color = {gray!5,white}}|
 
-\item \index{prompt-background-color} Avec la clé \Definition{prompt-background-color}, \pkg{piton} ajoute un fond coloré aux lignes débutant par
-le prompt «|>>>|» (et sa continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
-(\emph{read-eval-print loop}). Pour un exemple d'utilisation de cette clé, voir la partie \ref{pythonrepl}
-p.~\pageref{pythonrepl}.
+\item \index{prompt-background-color} Avec la clé \Definition{prompt-background-color},
+\pkg{piton} ajoute un fond coloré aux lignes débutant par le prompt «|>>>|» (et sa
+continuation «|...|») caractéristique des consoles Python avec boucle \textsc{repl}
+(\emph{read-eval-print loop}). Pour un exemple d'utilisation de cette clé, voir la partie
+\ref{pythonrepl} p.~\pageref{pythonrepl}.
 
-\item \index{width} La clé \Definition{width} fixe la largeur du listing produit. Cette largeur s'applique aux fonds colorés
-spécifiés par les clés |background-color| et |prompt-background-color| et également quand une coupure automatique
-des lignes est demandée par |break-lines| (cf.~\ref{line-breaks}, p.~\pageref{line-breaks}).
+\item \index{width} La clé \Definition{width} fixe la largeur du listing produit. Cette
+largeur s'applique aux fonds colorés spécifiés par les clés |background-color| et
+|prompt-background-color| et également quand une coupure automatique des lignes est
+demandée par |break-lines| (cf.~\ref{line-breaks}, p.~\pageref{line-breaks}).
 
-Cette clé peut prendre comme valeur une longueur explicite mais aussi la valeur spéciale~|min|. Avec cette valeur,
-la largeur sera calculée à partir de la largeur maximale des lignes de code. Attention : l'usage de cette valeur
-spéciale~|min| requiert deux compilations LuaLaTeX\footnote{La largeur maximale est calculée lors de la première
-compilation, écrite sur le fichier~|aux|, puis réutilisée lors de la compilation suivante. Certains outils comme
-|latexmk| (utilisé par Overleaf) effectuent automatiquement un nombre suffisant de compilations.}.
+Cette clé peut prendre comme valeur une longueur explicite mais aussi la valeur
+spéciale~|min|. Avec cette valeur, la largeur sera calculée à partir de la largeur
+maximale des lignes de code. Attention : l'usage de cette valeur spéciale~|min| requiert
+deux compilations LuaLaTeX\footnote{La largeur maximale est calculée lors de la première
+  compilation, écrite sur le fichier~|aux|, puis réutilisée lors de la compilation
+  suivante. Certains outils comme |latexmk| (utilisé par Overleaf) effectuent
+  automatiquement un nombre suffisant de compilations.}.
 
-Pour un exemple d'utilisation de |width=min|, voir la partie~\ref{example-comments} sur les exemples, p.~\pageref{example-comments}.
+Pour un exemple d'utilisation de |width=min|, voir la partie~\ref{example-comments} sur
+les exemples, p.~\pageref{example-comments}.
 
-\item \index{show-spaces-in-strings} En activant la clé \Definition{show-spaces-in-strings}, les espaces dans les
-chaînes de caractères\footnote{Pour le language Python, cela ne s'applique que pour les chaînes courtes, c'est-à-dire
-celles délimitées par~\verb|'| ou~\verb|"|. En OCaml, cela ne s'applique pas pour les \emph{quoted strings}.} sont
-matérialisés par le caractère ␣ (U+2423 : \textsc{open box}). Bien sûr, le caractère U+2423 doit être présent dans la fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise
-  simplement la fonte mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
+\item \index{show-spaces-in-strings} En activant la clé
+\Definition{show-spaces-in-strings}, les espaces dans les chaînes de
+caractères\footnote{Pour le language Python, cela ne s'applique que pour les chaînes
+  courtes, c'est-à-dire celles délimitées par~\verb|'| ou~\verb|"|. En OCaml, cela ne
+  s'applique pas pour les \emph{quoted strings}.} sont matérialisés par le caractère ␣
+(U+2423 : \textsc{open box}). Bien sûr, le caractère U+2423 doit être présent dans la
+fonte mono-chasse utilisée.\footnote{L'extension \pkg{piton} utilise simplement la fonte
+  mono-chasse courante. Pour la changer, le mieux est d'utiliser |\setmonofont| de
   \pkg{fontspec}.}\par\nobreak
 %
 \begingroup
@@ -488,10 +530,12 @@
 Exemple : \piton{my_string = 'Très bonne réponse'}
 \endgroup
 
-\item \index{show-spaces} Avec la clé \Definition{show-spaces}, tous les espaces sont matérialisés (et aucune
-coupure de ligne ne peut plus intervenir sur ces espaces matérialisés, même si la clé |break-lines|\footnote{cf.
-  \ref{line-breaks} p.~\pageref{line-breaks}.} est active). Il faut néanmoins remarquer que les espaces en fin de
-ligne sont tous supprimés par \pkg{piton}. Les tabulations de début de ligne sont représentées par des flèches.
+\item \index{show-spaces} Avec la clé \Definition{show-spaces}, tous les espaces sont
+matérialisés (et aucune coupure de ligne ne peut plus intervenir sur ces espaces
+matérialisés, même si la clé |break-lines|\footnote{cf. \ref{line-breaks}
+  p.~\pageref{line-breaks}.} est active). Il faut néanmoins remarquer que les espaces en
+fin de ligne sont tous supprimés par \pkg{piton}. Les tabulations de début de ligne sont
+représentées par des flèches.
 \end{itemize}
 
 \bigskip
@@ -544,8 +588,8 @@
 
 
 \bigskip
-La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en particulier la coupure des
-pages et des lignes p.~\pageref{breakable}).
+La commande |\PitonOptions| propose d'autres clés qui seront décrites plus loin (voir en
+particulier la coupure des pages et des lignes p.~\pageref{breakable}).
 
 
 \subsection{Les styles}
@@ -555,24 +599,26 @@
 
 \subsubsection{Notion de style}
 
-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.}
+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
-\indexcommand{SetPitonStyle}
-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.
+\indexcommand{SetPitonStyle} 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.
+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|). Elle utilise la commande |\highLight| de \pkg{lua-ul} (qui nécessite
-lui-même le chargement de \pkg{luacolor}).
+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|). Elle utilise la commande
+|\highLight| de \pkg{lua-ul} (qui nécessite lui-même le chargement de \pkg{luacolor}).
 
 \begin{Verbatim}
 \SetPitonStyle
@@ -579,8 +625,9 @@
   { Name.Function = \bfseries \hightLight[red!50] }
 \end{Verbatim}
 
-Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend exactement un argument,
-puisque, habituellement, elle est utilisée avec |\highLight[red!50]{|\texttt{\slshape text}|}|.
+Ici, |\highLight[red!50]| doit être considéré comme le nom d'une fonction LaTeX qui prend
+exactement un argument, puisque, habituellement, elle est utilisée avec
+|\highLight[red!50]{|\texttt{\slshape text}|}|.
 
 \medskip
 \begingroup
@@ -591,29 +638,31 @@
 
 
 \bigskip
-L'usage des différents styles suivant le langage informatique considéré est décrit dans la partie \ref{Semantic}, à
-partir de la page \pageref{Semantic}. 
+L'usage des différents styles suivant le langage informatique considéré est décrit dans la
+partie \ref{Semantic}, à partir de la page \pageref{Semantic}.
 
 
 
 \bigskip
-\indexcommand{PitonStyle}
-La commande \DefinitionCommand{PitonStyle} prend en argument le nom d'un style et permet de récupérer la valeur (en
-tant que liste d'instructions LaTeX) de ce style.
+\indexcommand{PitonStyle} La commande \DefinitionCommand{PitonStyle} prend en argument le
+nom d'un style et permet de récupérer la valeur (en tant que liste d'instructions LaTeX)
+de ce style.
 
 \smallskip
-Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et on aura 
-le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
+Par exemple, on peut écrire, dans le texte courant, |{\PitonStyle{Keyword}{function}}| et
+on aura le mot {\PitonStyle{Keyword}{function}} formaté comme un mot-clé.
 
 \smallskip
-La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir tenir compte à la fois des commandes
-semi-globales et des commandes à argument présentes dans la valeur courante du style \texttt{\textsl{style}}.
+La syntaxe |{\PitonStyle{|\textsl{\texttt{style}}|}{...}}| est nécessaire pour pouvoir
+tenir compte à la fois des commandes semi-globales et des commandes à argument présentes
+dans la valeur courante du style \texttt{\textsl{style}}.
 
 
 \subsubsection{Styles locaux et globaux}
 
-Un style peut être défini de manière globale avec la commande |\SetPitonStyle|. Cela veut dire qu'il s'appliquera
-par défaut à tous les langages informatiques qui utilisent ce style.
+Un style peut être défini de manière globale avec la commande |\SetPitonStyle|. Cela veut
+dire qu'il s'appliquera par défaut à tous les langages informatiques qui utilisent ce
+style.
 
 \medskip
 Par exemple, avec la commande 
@@ -620,13 +669,14 @@
 \begin{Verbatim}
 \SetPitonStyle{Comment = \color{gray}}
 \end{Verbatim}
-tous les commentaires (que ce soit en Python, en C, en OCaml, etc. ou dans un langage défini avec
-|\NewPitonLanguage|) seront composés en gris. 
+tous les commentaires (que ce soit en Python, en C, en OCaml, etc. ou dans un langage
+défini avec |\NewPitonLanguage|) seront composés en gris.
 
 \bigskip
-Mais il est aussi possible de définir un style localement pour un certain langage informatique en passant le nom du
-langage en argument optionnel (entre crochets) de la commande |\SetPitonStyle|.\footnote{On rappelle que, dans
-  \pkg{piton}, les noms des langages informatiques ne sont pas sensibles à la casse.}
+Mais il est aussi possible de définir un style localement pour un certain langage
+informatique en passant le nom du langage en argument optionnel (entre crochets) de la
+commande |\SetPitonStyle|.\footnote{On rappelle que, dans \pkg{piton}, les noms des
+  langages informatiques ne sont pas sensibles à la casse.}
 
 \medskip
 Par exemple, avec la commande 
@@ -633,15 +683,17 @@
 \begin{Verbatim}
 \SetPitonStyle~emphase#[SQL]@{Keywords = \color[HTML]{006699} \bfseries \MakeUppercase}
 \end{Verbatim}
-les mots-clés dans les listings SQL seront composés en lettres capitales, même s'ils s'apparaissent en minuscules
-dans le fichier source LaTeX (on rappelle que, en SQL, les mot-clés ne sont pas sensibles à la casse et donc forcer
-leur mise en capitales peut être envisagé).
+les mots-clés dans les listings SQL seront composés en lettres capitales, même s'ils
+s'apparaissent en minuscules dans le fichier source LaTeX (on rappelle que, en SQL, les
+mot-clés ne sont pas sensibles à la casse et donc forcer leur mise en capitales peut être
+envisagé).
 
 \medskip
-Comme on s'en doute, si un langage informatique utilise un certain style et que ce style n'est pas défini
-localement pour ce langage, c'est la version globale qui est utilisée. Cette notion de globalité n'a pas de
-rapport avec la notion de liaison locale de TeX (notion de groupe TeX).\footnote{Du point de vue des groupes de
-  TeX, les liaisons faites par |\SetPitonStyle| sont toujours locales.}
+Comme on s'en doute, si un langage informatique utilise un certain style et que ce style
+n'est pas défini localement pour ce langage, c'est la version globale qui est utilisée.
+Cette notion de globalité n'a pas de rapport avec la notion de liaison locale de TeX
+(notion de groupe TeX).\footnote{Du point de vue des groupes de TeX, les liaisons faites
+  par |\SetPitonStyle| sont toujours locales.}
 
 \medskip
 Les styles fournis par défaut par \pkg{piton} sont tous définis globalement.
@@ -652,16 +704,19 @@
 \index{UserFunction (style)}
 
 \bigskip
-Il existe un style spécial nommé |UserFunction|. Ce style s'applique aux noms des fonctions précédemment définies
-par l'utilisateur (par exemple, avec le langage Python, ces noms de fonctions sont ceux qui apparaissent après le
-mot-clé \piton{def} dans un listing Python précédent). La valeur initiale de ce style est nulle (=vide), ce qui
-fait que ces noms de fonctions sont formatés comme du texte courant (en noir). Néanmoins, il est possible de
-changer la valeur de ce style, comme tous les autres styles, avec la commande |\SetPitonStyle|.
+Il existe un style spécial nommé |UserFunction|. Ce style s'applique aux noms des
+fonctions précédemment définies par l'utilisateur (par exemple, avec le langage Python,
+ces noms de fonctions sont ceux qui apparaissent après le mot-clé \piton{def} dans un
+listing Python précédent). La valeur initiale de ce style est nulle (=vide), ce qui fait
+que ces noms de fonctions sont formatés comme du texte courant (en noir). Néanmoins, il
+est possible de changer la valeur de ce style, comme tous les autres styles, avec la
+commande |\SetPitonStyle|.
 
 \medskip
-Dans l'exemple suivant, on règle les styles |Name.Function| et |UserFunction| de manière à ce que, quand on clique
-sur le nom d'une fonction Python précédemment définie par l'utilisateur, on soit renvoyé vers la définition
-(informatique) de cette fonction. Cette programmation utilise les fonctions |\hypertarget| et |\hyperlink| de \pkg{hyperref}.
+Dans l'exemple suivant, on règle les styles |Name.Function| et |UserFunction| de manière à
+ce que, quand on clique sur le nom d'une fonction Python précédemment définie par
+l'utilisateur, on soit renvoyé vers la définition (informatique) de cette fonction. Cette
+programmation utilise les fonctions |\hypertarget| et |\hyperlink| de \pkg{hyperref}.
 
 \begingroup
 
@@ -698,7 +753,8 @@
 \end{Piton}
 
 \medskip
-(Certains lecteurs de \textsc{pdf} affichent un cadre autour du mot |transpose| cliquable et d'autres non.) 
+(Certains lecteurs de \textsc{pdf} affichent un cadre autour du mot |transpose| cliquable
+et d'autres non.)
 
 
 \endgroup
@@ -707,12 +763,14 @@
 
 \bigskip
 \begin{small}
-Bien sûr, la liste des noms de fonctions Python précédemment définies est gardée en mémoire de LuaLaTeX (de manière
-globale, c'est-à-dire indépendamment des groupes TeX). L'extension \pkg{piton} fournit une commande qui permet de
-vider cette liste : c'est la commande \DefinitionCommand{PitonClearUserFunctions}. Quand elle est utilisée sans argument, cette
-commande s'applique à tous les langages informatiques utilisées par l'utilisateur mais on peut spécifier en
-argument optionnel (entre crochets) une liste de langages informatiques auxquels elle s'appliquera.\footnote{On
-  rappelle que, dans \pkg{piton}, les noms des langages informatiques ne sont pas sensibles à la casse. }
+Bien sûr, la liste des noms de fonctions Python précédemment définies est gardée en
+mémoire de LuaLaTeX (de manière globale, c'est-à-dire indépendamment des groupes TeX).
+L'extension \pkg{piton} fournit une commande qui permet de vider cette liste : c'est la
+commande \DefinitionCommand{PitonClearUserFunctions}. Quand elle est utilisée sans
+argument, cette commande s'applique à tous les langages informatiques utilisées par
+l'utilisateur mais on peut spécifier en argument optionnel (entre crochets) une liste de
+langages informatiques auxquels elle s'appliquera.\footnote{On rappelle que, dans
+  \pkg{piton}, les noms des langages informatiques ne sont pas sensibles à la casse. }
 \end{small}
 
 
@@ -722,24 +780,26 @@
 \label{NewPitonEnvironment}
 \indexcommand{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| (de LaTeX standard) et |\NewDocumentEnvironment| (de
-LaTeX3). 
+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| (de LaTeX standard) et |\NewDocumentEnvironment| (de LaTeX3).
 
-C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a la même syntaxe que la
-commande classique |\NewDocumentEnvironment|.\footnote{Néanmoins, le spécificateur d'argument~|b|, qui sert à
-  capter le corps de l'environnement comme un argument LaTeX, n'est pas autorisé.}
+C'est pourquoi \pkg{piton} propose une commande |\NewPitonEnvironment|. Cette commande a
+la même syntaxe que la commande classique |\NewDocumentEnvironment|.\footnote{Néanmoins,
+  le spécificateur d'argument~|b|, qui sert à capter le corps de l'environnement comme un
+  argument LaTeX, n'est pas autorisé.}
 
 \bigskip
-Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini avec le même comportement
-que l'environnement |{Piton}|:
+Par exemple, avec l'instruction suivante, un nouvel environnement |{Python}| sera défini
+avec le même comportement que l'environnement |{Piton}|:
 
 {\color{gray}|\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 (à condition, bien entendu, d'avoir chargé l'extension \pkg{tcolorbox}):
+Si on souhaite un environnement |{Python}| qui compose le code inclus dans une boîte de
+\pkg{tcolorbox}, on peut écrire (à condition, bien entendu, d'avoir chargé l'extension
+\pkg{tcolorbox}):
 
 \begin{Verbatim}
 \NewPitonEnvironment{Python}{}
@@ -780,21 +840,25 @@
 L'extension \pkg{listings} est une célèbre extension LaTeX pour formater des codes informatiques.  
 
 \medskip
-Elle propose une commande |\lstdefinelanguage| pour définir de nouveaux langages. Cette commande est aussi
-utilisée en interne par \pkg{listings} pour sa définition des languages (en fait, pour cela, \pkg{listings} utilise
-une commande nommée |\lst at definelanguage| mais celle-ci a la même syntaxe que |\lstdefinelanguage|).
+Elle propose une commande |\lstdefinelanguage| pour définir de nouveaux langages. Cette
+commande est aussi utilisée en interne par \pkg{listings} pour sa définition des languages
+(en fait, pour cela, \pkg{listings} utilise une commande nommée |\lst at definelanguage| mais
+celle-ci a la même syntaxe que |\lstdefinelanguage|).
 
 \medskip
-L'extension \pkg{piton} propose une commande \DefinitionCommand{NewPitonLanguage} pour définir de nouveaux
-langages (utilisables avec les outils de \pkg{piton}) avec quasiment la même syntaxe que |\lstdefinelanguage|.
+L'extension \pkg{piton} propose une commande \DefinitionCommand{NewPitonLanguage} pour
+définir de nouveaux langages (utilisables avec les outils de \pkg{piton}) avec quasiment
+la même syntaxe que |\lstdefinelanguage|.
 
 \medskip
-Précisons tout de suite que l'extension \pkg{piton} n'utilise \emph{pas} cette commande pour définir les langages
-qu'elle propose nativement (Python, C, OCaml, \CC\ et |minimal|), ce qui permet de proposer des parseurs plus puissants.
+Précisons tout de suite que l'extension \pkg{piton} n'utilise \emph{pas} cette commande
+pour définir les langages qu'elle propose nativement (Python, C, OCaml, \CC\ et
+|minimal|), ce qui permet de proposer des parseurs plus puissants.
 
 \medskip
-Par exemple, dans le fichier |lstlang1.sty|, qui est un des fichiers de definition des langages proposés par défaut
-par \pkg{listings}, on trouve les instructions suivantes (dans la version 1.10a).
+Par exemple, dans le fichier |lstlang1.sty|, qui est un des fichiers de definition des
+langages proposés par défaut par \pkg{listings}, on trouve les instructions suivantes
+(dans la version 1.10a).
 
 \begin{Verbatim}[formatcom=\small\color{gray}]
 \lst~@definelanguage{Java}%
@@ -813,9 +877,10 @@
 \end{Verbatim}
 
 \medskip
-Pour définir un language nommé |Java| pour \pkg{piton}, il suffit d'écrire le code suivant, 
-{\bfseries où le dernier argument de |\lst at definelanguage|, qui est entre crochets, a été supprimé} 
-(en fait, les symboles \verb+%+ pourraient être supprimés sans problème).
+Pour définir un language nommé |Java| pour \pkg{piton}, il suffit d'écrire le code
+suivant, {\bfseries où le dernier argument de |\lst at definelanguage|, qui est entre
+  crochets, a été supprimé} (en fait, les symboles \verb+%+ pourraient être supprimés sans
+problème).
 
 \begin{Verbatim}[formatcom=\small\color{gray}]
 ~emphase#\NewPitonLanguage@{Java}%
@@ -850,11 +915,13 @@
 
 
 \medskip
-On peut alors utiliser le language Java comme n'importe quel autre langage prédéfini de \pkg{piton}. 
+On peut alors utiliser le language Java comme n'importe quel autre langage prédéfini de
+\pkg{piton}.
 
-Voici un exemple de code Java formaté dans un environnement~|{Piton}| avec la clé~|language=Java|.\footnote{On
-  rappelle que, pour \pkg{piton}, les noms de langages informatiques ne sont pas sensibles à la casse, ce qui fait
-  que l'on aurait pu aussi bien utiliser : |language=java|.}
+Voici un exemple de code Java formaté dans un environnement~|{Piton}| avec la
+clé~|language=Java|.\footnote{On rappelle que, pour \pkg{piton}, les noms de langages
+  informatiques ne sont pas sensibles à la casse, ce qui fait que l'on aurait pu aussi
+  bien utiliser : |language=java|.}
 
 \bigskip
 \begingroup
@@ -893,12 +960,14 @@
 \endgroup
 
 \bigskip
-Les clés de la commande |\lstdefinelanguage| de \pkg{listings} prises en charge par |\NewPitonLanguage| sont :
-|morekeywords|, |otherkeywords|, |sensitive|, |keywordsprefix|, |moretexcs|, |morestring| (avec les lettres |b|,
-|d|, |s| et |m|), |morecomment| (avec les lettres |i|, |l|, |s| et |n|), |moredelim| (avec les lettres |i|,
-|l|, |s|, |*| et |**|), |moredirectives|, |tag|, |alsodigit|, |alsoletter| et |alsoother|.
+Les clés de la commande |\lstdefinelanguage| de \pkg{listings} prises en charge par
+|\NewPitonLanguage| sont : |morekeywords|, |otherkeywords|, |sensitive|, |keywordsprefix|,
+|moretexcs|, |morestring| (avec les lettres |b|, |d|, |s| et |m|), |morecomment| (avec les
+lettres |i|, |l|, |s| et |n|), |moredelim| (avec les lettres |i|, |l|, |s|, |*| et |**|),
+|moredirectives|, |tag|, |alsodigit|, |alsoletter| et |alsoother|.
 
-Pour la description de ces clés, on renvoie à la documentation de \pkg{listings} (taper |texdoc| |listings| dans un terminal). 
+Pour la description de ces clés, on renvoie à la documentation de \pkg{listings} (taper
+|texdoc| |listings| dans un terminal).
 
 \bigskip
 Par exemple, pour formater du code LaTeX, on pourra créer le language suivant : 
@@ -907,10 +976,9 @@
 \begin{verbatim}
 \NewPitonLanguage{LaTeX}{keywordsprefix = \ , alsoletter = @_ }
 \end{verbatim}
-}
-Initialement, les caractères |@| et |_| sont des considérés comme des lettres car de nombreux langages de
-programmation les autorisent dans les mots-clés et les identificateurs. Avec \verb|alsoletter = @_|, on les retire
-de la catégorie des lettres.
+} Initialement, les caractères |@| et |_| sont des considérés comme des lettres car de
+nombreux langages de programmation les autorisent dans les mots-clés et les
+identificateurs. Avec \verb|alsoletter = @_|, on les retire de la catégorie des lettres.
 
 
 \section{Fonctionnalités avancées}
@@ -926,37 +994,41 @@
 \index{split-on-empty-lines}
 \index{split-separation}
 
-Par défaut, les listings produits par l'environnement |{Piton}| et par la commande |\PitonInputFile| sont
-insécables.
+Par défaut, les listings produits par l'environnement |{Piton}| et par la commande
+|\PitonInputFile| sont insécables.
 
 
-Néanmoins, la commande |\PitonOptions| propose les clés |split-on-empty-lines| et |splittable| pour autoriser de
-telles coupures. 
+Néanmoins, la commande |\PitonOptions| propose les clés |split-on-empty-lines| et
+|splittable| pour autoriser de telles coupures.
 
 \begin{itemize}
-\item La clé \Definition{split-on-empty-lines} autorise les coupures sur les lignes vides\footnote{Les lignes considérées
-  comme vides sont celles qui ne comportent que des espaces.} du listing. Dans les listings informatiques, les
-lignes vides séparent le plus souvent les définitions des fonctions informatiques et il est donc souvent judicieux
-de pouvoir couper au niveau de ces lignes.
+\item La clé \Definition{split-on-empty-lines} autorise les coupures sur les lignes
+vides\footnote{Les lignes considérées comme vides sont celles qui ne comportent que des
+  espaces.} du listing. Dans les listings informatiques, les lignes vides séparent le plus
+souvent les définitions des fonctions informatiques et il est donc souvent judicieux de
+pouvoir couper au niveau de ces lignes.
 
-Quand la clé |split-on-empty-lines| est activée, le travail effectué va en fait un peu plus loin : les lignes vides
-successives sont supprimées et remplacées par le contenu du paramètre correspondant à la clé
-\Definition{split-separation}. 
+Quand la clé |split-on-empty-lines| est activée, le travail effectué va en fait un peu
+plus loin : les lignes vides successives sont supprimées et remplacées par le contenu du
+paramètre correspondant à la clé \Definition{split-separation}.
 
-La valeur initiale de ce paramètre est |\vspace{\baselineskip}\vspace{-1.25pt}|, ce qui, au final, correspond à une
-ligne vide dans le PDF produit (cet espace vertical est supprimé s'il tombe au niveau d'un saut de page).
+La valeur initiale de ce paramètre est |\vspace{\baselineskip}\vspace{-1.25pt}|, ce qui,
+au final, correspond à une ligne vide dans le PDF produit (cet espace vertical est
+supprimé s'il tombe au niveau d'un saut de page).
 
 \medskip
-\item La clé |split-on-empty-lines| peut bien sûr être insuffisante et c'est pourquoi \pkg{piton} propose la clé
-\Definition{splittable}. 
+\item La clé |split-on-empty-lines| peut bien sûr être insuffisante et c'est pourquoi
+\pkg{piton} propose la clé \Definition{splittable}.
 
-Quand la clé |splittable| est utilisée avec la valeur numérique $n$ (qui doit être un entier naturel non nul) le
-listing, ou bien chaque partie de ce listing située entre des lignes vides (quand |split-on-empty-lines| est
-utilisée), pourra être coupé n'importe où avec cette exception qu'aucune coupure ne pourra avoir lieu entre les
-$n$~premières lignes, ni entre les $n$~dernières. Par exemple, |splittable = 4| pourrait être un réglage raisonnable.
+Quand la clé |splittable| est utilisée avec la valeur numérique $n$ (qui doit être un
+entier naturel non nul) le listing, ou bien chaque partie de ce listing située entre des
+lignes vides (quand |split-on-empty-lines| est utilisée), pourra être coupé n'importe où
+avec cette exception qu'aucune coupure ne pourra avoir lieu entre les $n$~premières
+lignes, ni entre les $n$~dernières. Par exemple, |splittable = 4| pourrait être un réglage
+raisonnable.
 
-Employée sans argument, la clé |splittable| est équivalente à |splittable = 1|, et les listings sont alors sécables
-n'importe où (ce n'est pas recommandable). 
+Employée sans argument, la clé |splittable| est équivalente à |splittable = 1|, et les
+listings sont alors sécables n'importe où (ce n'est pas recommandable).
 
 \end{itemize}
 
@@ -963,12 +1035,13 @@
 \medskip
 \emph{Remarque}\par\nobreak
 
-Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont possibles, à partir du moment
-où |split-on-empty-lines| ou |splittable| est utilisée.\footnote{Avec la clé |splittable|, 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|.}
+Même avec une couleur de fond (fixée avec |background-color|), les sauts de page sont
+possibles, à partir du moment où |split-on-empty-lines| ou |splittable| est
+utilisée.\footnote{Avec la clé |splittable|, 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|.}
 
 
 \subsubsection{Coupure des lignes}
@@ -975,35 +1048,44 @@
 
 \label{line-breaks}
 
-Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin de ligne. Il existe
-néanmoins des clés pour autoriser de telles coupures (les points de coupure possibles sont les espaces, y compris
-les espaces dans les chaînes Python).
+Par défaut, les éléments produits par \pkg{piton} ne peuvent pas être coupés par une fin
+de ligne. Il existe néanmoins des clés pour autoriser de telles coupures (les points de
+coupure possibles sont les espaces, y compris les espaces dans les chaînes Python).
 \begin{itemize}
-\item \index{break-lines!break-lines-in-piton} Avec la clé \Definition{break-lines-in-piton}, les coupures de ligne sont autorisées dans la commande
-|\piton{...}| (mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe verbatim). 
+\item \index{break-lines!break-lines-in-piton} Avec la clé
+\Definition{break-lines-in-piton}, les coupures de ligne sont autorisées dans la commande
+|\piton{...}| (mais pas dans la commande \verb+\piton|...|+, c'est-à-dire avec la syntaxe
+verbatim).
 
-\item \index{break-lines!break-lines-in-Piton} Avec la clé \Definition{break-lines-in-Piton}, les coupures de ligne sont autorisées dans l'environnement
-|{Piton}| (d'où la lettre |P| capitale dans le nom) et les listings produits par |\PitonInputFile|.
+\item \index{break-lines!break-lines-in-Piton} Avec la clé
+\Definition{break-lines-in-Piton}, les coupures de ligne sont autorisées dans
+l'environnement |{Piton}| (d'où la lettre |P| capitale dans le nom) et les listings
+produits par |\PitonInputFile|.
 
-\item \index{break-lines} La clé \Definition{break-lines} est la conjonction des deux clés précédentes.
+\item \index{break-lines} La clé \Definition{break-lines} est la conjonction des deux clés
+précédentes.
 \end{itemize}
 
 \medskip
-L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des coupures de ligne autorisées par |break-lines-in-Piton|.
+L'extension \pkg{piton} fournit aussi plusieurs clés pour contrôler l'apparence des
+coupures de ligne autorisées par |break-lines-in-Piton|.
 
 \begin{itemize}
-\item \index{indent-broken-lines} Avec la clé \Definition{indent-broken-lines}, l'indentation de la ligne coupée est respectée à chaque retour
-à la ligne. 
+\item \index{indent-broken-lines} Avec la clé \Definition{indent-broken-lines},
+l'indentation de la ligne coupée est respectée à chaque retour à la ligne.
 
-\item \index{end-of-broken-line} La clé \Definition{end-of-broken-line} correspond au symbole placé à la fin d'une ligne coupée. Sa valeur initiale est : 
+\item \index{end-of-broken-line} La clé \Definition{end-of-broken-line} correspond au
+symbole placé à la fin d'une ligne coupée. Sa valeur initiale est :
 |\hspace*{0.5em}\textbackslash|.
 
-\item \index{continuation-symbol} La clé \Definition{continuation-symbol} correspond au symbole placé à chaque retour de ligne dans la marge
-gauche. Sa valeur initiale est : |+\;| (la commande |\;| insère un petit espace horizontal). 
+\item \index{continuation-symbol} La clé \Definition{continuation-symbol} correspond au
+symbole placé à chaque retour de ligne dans la marge gauche. Sa valeur initiale est :
+|+\;| (la commande |\;| insère un petit espace horizontal).
 
-\item \index{continuation-symbol-on-indentation} La clé \Definition{continuation-symbol-on-indentation} correspond au symbole placé à chaque retour de ligne
-au niveau de l'indentation (uniquement dans le cas où la clé |indent-broken-lines| est active). Sa valeur initiale
-est : |$\hookrightarrow\;$|.
+\item \index{continuation-symbol-on-indentation} La clé
+\Definition{continuation-symbol-on-indentation} correspond au symbole placé à chaque
+retour de ligne au niveau de l'indentation (uniquement dans le cas où la clé
+|indent-broken-lines| est active). Sa valeur initiale est : |$\hookrightarrow\;$|.
 \end{itemize}
 
 \bigskip
@@ -1039,21 +1121,25 @@
 
 \indexcommand{PitonInputFile}
 
-La commande |\PitonInputFile| permet d'insérer (avec formatage) le contenu d'un fichier. En fait, il existe des
-mécanismes permettant de n'insérer qu'une partie du fichier en question.
+La commande |\PitonInputFile| permet d'insérer (avec formatage) le contenu d'un fichier.
+En fait, il existe des mécanismes permettant de n'insérer qu'une partie du fichier en
+question.
 \begin{itemize}
-\item On peut spécifier la partie à insérer par les numéros de lignes (dans le fichier d'origine).
+\item On peut spécifier la partie à insérer par les numéros de lignes (dans le fichier
+d'origine).
 \item On peut aussi spécifier la partie à insérer par des marqueurs textuels.
 \end{itemize}
-Dans les deux cas, si on souhaite numéroter les lignes avec les numéros des lignes du fichier d'origine, il
-convient d'utiliser la clé |line-numbers/absolute|.
+Dans les deux cas, si on souhaite numéroter les lignes avec les numéros des lignes du
+fichier d'origine, il convient d'utiliser la clé |line-numbers/absolute|.
 
 \subsubsection{Avec les numéros de lignes absolus}
 
-La commande |\PitonInputFile| propose les clés \Definition{first-line} et \Definition{last-line} pour n'insérer que
-la partie du fichier comprise entre les lignes correspondantes. Ne pas confondre avec la clé |line-numbers/start|
-qui demande un numérotage des lignes commençant à la valeur donnée à cette clé (en un sens |line-numbers/start|
-concerne la sortie alors que |first-line| et |last-line| concernent l'entrée).
+La commande |\PitonInputFile| propose les clés \Definition{first-line} et
+\Definition{last-line} pour n'insérer que la partie du fichier comprise entre les lignes
+correspondantes. Ne pas confondre avec la clé |line-numbers/start| qui demande un
+numérotage des lignes commençant à la valeur donnée à cette clé (en un sens
+|line-numbers/start| concerne la sortie alors que |first-line| et |last-line| concernent
+l'entrée).
 
 
 \subsubsection{Avec des marqueurs textuels}
@@ -1062,15 +1148,17 @@
 \index{marker/end}
 
 
-Pour utiliser cette technique, il convient d'abord de spécifier le format des marqueurs marquant le début et la fin
-de la partie du fichier à inclure. Cela se fait avec les deux clés \Definition{marker/beginning} et
-\Definition{marker/end} (usuellement dans la commande |\PitonOptions|). 
+Pour utiliser cette technique, il convient d'abord de spécifier le format des marqueurs
+marquant le début et la fin de la partie du fichier à inclure. Cela se fait avec les deux
+clés \Definition{marker/beginning} et \Definition{marker/end} (usuellement dans la
+commande |\PitonOptions|).
 
 \medskip
 Prenons d'abord un exemple.
 
 \medskip
-Supposons que le fichier à inclure contienne des solutions à des exercices de programmation sur le modèle suivant :  
+Supposons que le fichier à inclure contienne des solutions à des exercices de
+programmation sur le modèle suivant :
 
 \begin{Verbatim}[formatcom=\small\color{gray}]
 ~#[Exercice 1] Version itérative
@@ -1087,25 +1175,27 @@
 ~#<Exercice 1>
 \end{Verbatim}
 
-Les marqueurs de début de début et de fin sont les chaînes |#[Exercice 1]| et |#<Exercice 1>|. La chaîne
-«|Exercice 1|» sera appelée le \emph{label} de l'exercice (ou de la partie du fichier à inclure).
+Les marqueurs de début de début et de fin sont les chaînes |#[Exercice 1]| et 
+|#<Exercice 1>|. La chaîne «|Exercice 1|» sera appelée le \emph{label} de l'exercice (ou
+de la partie du fichier à inclure).
 
-Pour spécifier des marqueurs de cette sorte dans \pkg{piton}, on utilisera les clés |marker/beginning| et |marker/end|
-de la manière suivante (le caractère |#| des commentaires de Python doit être inséré sous la forme échappée |\#|). 
+Pour spécifier des marqueurs de cette sorte dans \pkg{piton}, on utilisera les clés
+|marker/beginning| et |marker/end| de la manière suivante (le caractère |#| des
+commentaires de Python doit être inséré sous la forme échappée |\#|).
 
 \begin{Verbatim}
 \PitonOptions{ ~emphase#marker/beginning@ = \~#[~#1] , ~emphase#marker/end@ = \~#<~#1> } 
 \end{Verbatim}
 
-Comme on le voit, |marker/beginning| est une expression correspondant à la fonction mathématique qui, au nom du
-label (par exemple |Exercice 1|), associe le marqueur de début (dans l'exemple |#[Exercice 1]|). La chaîne |#1|
-correspond aux occurrences de l'argument de cette fonction (c'est la syntaxe habituelle de TeX). De même pour
-|marker/end|.
+Comme on le voit, |marker/beginning| est une expression correspondant à la fonction
+mathématique qui, au nom du label (par exemple |Exercice 1|), associe le marqueur de début
+(dans l'exemple |#[Exercice 1]|). La chaîne |#1| correspond aux occurrences de l'argument
+de cette fonction (c'est la syntaxe habituelle de TeX). De même pour |marker/end|.
 
 
 \bigskip
-Pour insérer une partie marquée d'un fichier, il suffit alors d'utiliser la clé \Definition{range} de
-|\PitonInputFile|. 
+Pour insérer une partie marquée d'un fichier, il suffit alors d'utiliser la clé
+\Definition{range} de |\PitonInputFile|.
 
 \smallskip
 \begin{Verbatim}
@@ -1126,9 +1216,8 @@
         return v
 \end{Piton}
 
-\vspace{1cm}
-\index{marker/include-lines}
-La clé \Definition{marker/include-lines} demande que les lignes contenant les marqueurs soient également insérées.
+\vspace{1cm} \index{marker/include-lines} La clé \Definition{marker/include-lines} demande
+que les lignes contenant les marqueurs soient également insérées.
 
 \begin{Verbatim}
 \PitonInputFile[~emphase#marker/include-lines@,range = Exercice 1]{~textsl#nom_du_fichier@}
@@ -1151,13 +1240,12 @@
 
 
 \bigskip
-\index{begin-range}
-\index{end-range}
-Il existe en fait aussi les clés \Definition{begin-range} et \Definition{end-range} pour insérer plusieurs
-contenus marqués simultanément. 
+\index{begin-range} \index{end-range} Il existe en fait aussi les clés
+\Definition{begin-range} et \Definition{end-range} pour insérer plusieurs contenus marqués
+simultanément.
 
-Par exemple, pour insérer les solutions des exercices 3 à 5, on pourra écrire (à condition que le fichier soit
-structuré correctement!):
+Par exemple, pour insérer les solutions des exercices 3 à 5, on pourra écrire (à condition
+que le fichier soit structuré correctement!):
 
 \begin{Verbatim}
 \PitonInputFile[~emphase#begin-range = Exercice 3, end-range = Exercice 5@]{~textsl#nom_du_fichier@}
@@ -1171,27 +1259,31 @@
 \indexcommand{SetPitonIdentifier}
 \label{SetPitonIdentifier}
 
-La commande \DefinitionCommand{SetPitonIdentifier} permet de changer le formatage de certains identificateurs.
+La commande \DefinitionCommand{SetPitonIdentifier} permet de changer le formatage de
+certains identificateurs.
 
 \smallskip
 Cette commande prend trois arguments : un optionnel et deux obligatoires.
 
 \begin{itemize}
-\item L'argument optionnel (entre crochets) indique le langage (informatique) concerné ; si cet
-argument est absent, les réglages faits par |\SetPitonIdentifier| s'appliqueront à tous les langages.\footnote{On rappelle que, dans \pkg{piton}, les noms des langages informatiques ne sont pas
-  sensibles à la casse.}
+\item L'argument optionnel (entre crochets) indique le langage (informatique) concerné ;
+si cet argument est absent, les réglages faits par |\SetPitonIdentifier| s'appliqueront à
+tous les langages.\footnote{On rappelle que, dans \pkg{piton}, les noms des langages
+  informatiques ne sont pas sensibles à la casse.}
 
-\item Le premier argument obligatoire est une liste de noms d'identificateurs séparés par des virgules.
+\item Le premier argument obligatoire est une liste de noms d'identificateurs séparés par
+des virgules.
 
-\item Le deuxième argument obligatoire est une liste d'instructions LaTeX de formatage du même type que pour les
-styles précédemment définis (cf. \ref{styles}, p.~\pageref{styles}).
+\item Le deuxième argument obligatoire est une liste d'instructions LaTeX de formatage du
+même type que pour les styles précédemment définis (cf. \ref{styles},
+p.~\pageref{styles}).
 
 
 \end{itemize}
 
-\emph{Attention} : Seuls les identificateurs peuvent voir leur formatage affecté. Les mots-clés et les noms de
-fonctions prédéfinies ne seront pas affectés, même s'ils figurent dans le premier argument de
-|\SetPitonIdentifier|. 
+\emph{Attention} : Seuls les identificateurs peuvent voir leur formatage affecté. Les
+mots-clés et les noms de fonctions prédéfinies ne seront pas affectés, même s'ils figurent
+dans le premier argument de |\SetPitonIdentifier|.
 
 \begin{Verbatim}
 ~emphase#\SetPitonIdentifier{l1,l2}{\color{red}}@
@@ -1230,8 +1322,9 @@
 \endgroup
 
 \bigskip
-Avec la commande |\SetPitonIdentifiers|, on peut ajouter à un langage informatique de nouvelles fonctions
-prédéfinies (ou de nouveaux mots-clés, etc.) qui seront détectées par \pkg{piton}.
+Avec la commande |\SetPitonIdentifiers|, on peut ajouter à un langage informatique de
+nouvelles fonctions prédéfinies (ou de nouveaux mots-clés, etc.) qui seront détectées par
+\pkg{piton}.
 
 
 \begin{Verbatim}
@@ -1272,16 +1365,18 @@
 L'extension \pkg{piton} propose plusieurs mécanismes d'échappement vers LaTeX :
 \begin{itemize}
 \item Il est possible d'avoir des commentaires entièrement composés en LaTeX.
-\item Il est possible d'avoir, dans les commentaires Python, les éléments entre \texttt{\$} composés en mode
-mathématique de LaTeX.
-\item Il est possible de demander à \pkg{piton} de détecter directement certaines commandes LaTeX avec leur argument.
+\item Il est possible d'avoir, dans les commentaires Python, les éléments entre
+\texttt{\$} composés en mode mathématique de LaTeX.
+\item Il est possible de demander à \pkg{piton} de détecter directement certaines
+commandes LaTeX avec leur argument.
 \item Il est possible d'insérer du code LaTeX à n'importe quel endroit d'un listing Python.
 \end{itemize}
 Ces mécanismes vont être détaillés dans les sous-parties suivantes.
 
 \smallskip
-À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe \cls{beamer}, \pkg{piton} détecte
-la plupart des commandes et environnements de Beamer : voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
+À remarquer également que, dans le cas où \pkg{piton} est utilisée dans la classe
+\cls{beamer}, \pkg{piton} détecte la plupart des commandes et environnements de Beamer :
+voir la sous-section \ref{beamer}, p.~\pageref{beamer}.
 
 
 \subsubsection{Les «commentaires LaTeX»}
@@ -1289,14 +1384,16 @@
 \index{comment-latex}
 \index{commentaires LaTeX}
 
-Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|. Tout ce qui suit ces deux 
-caractères, et jusqu'à la fin de la ligne, sera composé comme du code LaTeX standard.
+Dans ce document, on appelle «commentaire LaTeX» des commentaires qui débutent par |#>|.
+Tout ce qui suit ces deux caractères, et jusqu'à la fin de la ligne, sera composé comme du
+code LaTeX standard.
 
 Il y a deux outils pour personnaliser ces commentaires.
 
 \begin{itemize}
-\item Il est possible de changer le marquage syntaxique utilisé (qui vaut initialement~|#>|). Pour ce faire, il
-existe une clé \Definition{comment-latex}, \emph{disponible uniquement dans le préambule du document}, qui permet de choisir les
+\item Il est possible de changer le marquage syntaxique utilisé (qui vaut
+initialement~|#>|). Pour ce faire, il existe une clé \Definition{comment-latex},
+\emph{disponible uniquement dans le préambule du document}, qui permet de choisir les
 caractères qui (précédés par~|#|) serviront de marqueur syntaxique.
 
 Par exemple, avec le réglage suivant (fait dans le préambule du document) :
@@ -1305,18 +1402,18 @@
 
 les commentaires LaTeX commenceront par~|#LaTeX|.
 
-Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python (débutant par~|#|) seront en
-fait des «commentaires LaTeX».
+Si on donne la valeur nulle à la clé |comment-latex|, tous les commentaires Python
+(débutant par~|#|) seront en fait des «commentaires LaTeX».
 
 \smallskip
-\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant le style \pkg{piton}
-|Comment.LaTeX|.
+\item Il est possible de changer le formatage du commentaire LaTeX lui-même en changeant
+le style \pkg{piton} |Comment.LaTeX|.
 
-Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les commentaires LaTeX seront composés
-en bleu.
+Par exemple, avec |\SetPitonStyle{Comment.LaTeX = \normalfont\color{blue}}|, les
+commentaires LaTeX seront composés en bleu.
 
-Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le \textsc{pdf}, on peut régler
-|Comment.LaTeX| de la manière suivante :
+Si on souhaite qu'un croisillon (|#|) soit affiché en début de commentaire dans le
+\textsc{pdf}, on peut régler |Comment.LaTeX| de la manière suivante :
 
 \begin{Verbatim}
 \SetPitonStyle{Comment.LaTeX = \color{gray}\~#\normalfont\space }
@@ -1328,11 +1425,12 @@
 
 
 \bigskip 
-Si l'utilisateur a demandé l'affichage des numéros de ligne avec |line-numbers|, il est possible de faire référence
-à ce numéro de ligne avec la commande |\label| placée dans un commentaire LaTeX.\footnote{Cette fonctionnalité est
-  implémentée en redéfinissant, dans les environnements |{Piton}|, la commande |\label|. Il peut donc y avoir des
-  incompatibilités avec les extensions qui redéfinissent (globalement) cette commande |\label| (comme
-  \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
+Si l'utilisateur a demandé l'affichage des numéros de ligne avec |line-numbers|, il est
+possible de faire référence à ce numéro de ligne avec la commande |\label| placée dans un
+commentaire LaTeX.\footnote{Cette fonctionnalité est implémentée en redéfinissant, dans
+  les environnements |{Piton}|, la commande |\label|. Il peut donc y avoir des
+  incompatibilités avec les extensions qui redéfinissent (globalement) cette commande
+  |\label| (comme \pkg{varioref}, \pkg{refcheck}, \pkg{showlabels}, etc.)}
 
 
 
@@ -1341,15 +1439,17 @@
 
 \index{math-comments}
 
-Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire débutant par~|#| (et non par
-|#>|), les éléments placés entre symboles \texttt{\$} soient composés en mode mathématique de LaTeX (le reste du
-commentaire restant composé en verbatim).
+Il est possible de demander que, dans les commentaires Python normaux, c'est-à-dire
+débutant par~|#| (et non par |#>|), les éléments placés entre symboles \texttt{\$} soient
+composés en mode mathématique de LaTeX (le reste du commentaire restant composé en
+verbatim).
 
-La clé \Definition{math-comments} (\emph{qui ne peut être activée que dans le préambule du document}) active ce
-comportement.
+La clé \Definition{math-comments} (\emph{qui ne peut être activée que dans le préambule du
+  document}) active ce comportement.
 
 \bigskip
-Dans l'exemple suivant, on suppose que |\PitonOptions{math-comments}| a été utilisé dans le préambule du document.
+Dans l'exemple suivant, on suppose que |\PitonOptions{math-comments}| a été utilisé dans
+le préambule du document.
 
 \begin{Verbatim}
 \begin{Piton}
@@ -1369,23 +1469,25 @@
 \index{detected-commands (key)}
 \label{detected-commands}
 
-La clé \Definition{detected-commands} de |\PitonOptions| permet de spécifier une liste de noms de commandes LaTeX
-qui seront directement détectées par \pkg{piton}.
+La clé \Definition{detected-commands} de |\PitonOptions| permet de spécifier une liste de
+noms de commandes LaTeX qui seront directement détectées par \pkg{piton}.
 
 \begin{itemize}
-\item Cette clé |detected-commands| ne peut être utilisée que dans le préambule du document.
+\item Cette clé |detected-commands| ne peut être utilisée que dans le préambule du
+document.
 
-\item Les noms de commandes LaTeX doivent apparaître sans la contre-oblique 
-(ex. : |detected-commands = { emph , textbf }|). 
+\item Les noms de commandes LaTeX doivent apparaître sans la contre-oblique (ex. :
+|detected-commands = { emph , textbf }|).
 
-\item Ces commandes doivent être des commandes LaTeX à un seul argument obligatoire entre accolades (et ces
-accolades doivent apparaître explicitement dans le listing).
+\item Ces commandes doivent être des commandes LaTeX à un seul argument obligatoire entre
+accolades (et ces accolades doivent apparaître explicitement dans le listing).
 \end{itemize}
 
 \medskip
-Dans l'exemple suivant, qui est une programmation récursive de la factorielle, on décide de surligner en jaune
-l'appel récursif. La commande |\highLight| de \pkg{lua-ul} (cette extension requiert elle-même l'extension
-\pkg{luacolor}) permet de le faire avec la syntaxe |\hightLight{...}|.
+Dans l'exemple suivant, qui est une programmation récursive de la factorielle, on décide
+de surligner en jaune l'appel récursif. La commande |\highLight| de \pkg{lua-ul} (cette
+extension requiert elle-même l'extension \pkg{luacolor}) permet de le faire avec la
+syntaxe |\hightLight{...}|.
 
 \smallskip
 On suppose que l'on a mis dans le préambule du document LaTeX l'instruction suivante :
@@ -1419,16 +1521,19 @@
 \index{end-escape}
 \label{escape}
 
-Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu près n'importe où (mais
-entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas activée par défaut par \pkg{piton}. Pour
-l'utiliser, il faut spécifier les deux délimiteurs marquant l'échappement (le premier le commençant et le deuxième
-le terminant) en utilisant les clés \Definition{begin-escape} et \Definition{end-escape} (\emph{qui ne sont accessibles
-que dans le préambule du document}). Les deux délimiteurs peuvent être identiques.
+Il est aussi possible de surcharger les listings Python pour y insérer du code LaTeX à peu
+près n'importe où (mais entre deux lexèmes, bien entendu). Cette fonctionnalité n'est pas
+activée par défaut par \pkg{piton}. Pour l'utiliser, il faut spécifier les deux
+délimiteurs marquant l'échappement (le premier le commençant et le deuxième le terminant)
+en utilisant les clés \Definition{begin-escape} et \Definition{end-escape} (\emph{qui ne
+  sont accessibles que dans le préambule du document}). Les deux délimiteurs peuvent être
+identiques.
 
 \medskip
-On reprend l'exemple précédent de la factorielle et on souhaite surligner en rose l'instruction qui contient l'appel
-récursif. La commande |\highLight| de \pkg{lua-ul} permet de le faire avec la syntaxe |\highLight[LightPink]{...}|.
-Du fait de la présence de l'argument optionnel entre crochets, on ne peut pas utiliser la clé |detected-commands|
+On reprend l'exemple précédent de la factorielle et on souhaite surligner en rose
+l'instruction qui contient l'appel récursif. La commande |\highLight| de \pkg{lua-ul}
+permet de le faire avec la syntaxe |\highLight[LightPink]{...}|. Du fait de la présence de
+l'argument optionnel entre crochets, on ne peut pas utiliser la clé |detected-commands|
 comme précédemment mais on peut utiliser le mécanisme «escape».
 
 \smallskip
@@ -1460,10 +1565,10 @@
 
 
 \bigskip
-\emph{Attention} : L'échappement vers LaTeX permis par les clés |begin-escape| et |end-escape| 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
-|#>|).
+\emph{Attention} : L'échappement vers LaTeX permis par les clés |begin-escape| et
+|end-escape| 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 |#>|).
 
 
 \subsubsection{Le mécanisme «escape-math»}
@@ -1472,24 +1577,27 @@
 \index{begin-escape-math}
 \index{end-escape-math}
 
-Le mécanisme «|escape-math|» est très similaire au mécanisme «|escape|» puisque la seule différence est que les
-éléments en échappement LaTeX y sont composés en mode mathématique.
+Le mécanisme «|escape-math|» est très similaire au mécanisme «|escape|» puisque la seule
+différence est que les éléments en échappement LaTeX y sont composés en mode mathématique.
 
-On active ce mécanisme avec les clés \Definition{begin-escape-math} et \Definition{end-escape-math} (\emph{qui ne sont
-accessibles que dans le préambule du document}).
+On active ce mécanisme avec les clés \Definition{begin-escape-math} et
+\Definition{end-escape-math} (\emph{qui ne sont accessibles que dans le préambule du
+  document}).
 
 \medskip
-Malgré la proximité technique, les usages du mécanisme «|escape-math|» sont en fait assez différents de ceux du
-mécanisme «|escape|». En effet, comme le contenu en échappement est composé en mode mathématique, il est en
-particulier composé dans un groupe TeX et ne pourra donc pas servir à changer le formatage d'autres unités lexicales.
+Malgré la proximité technique, les usages du mécanisme «|escape-math|» sont en fait assez
+différents de ceux du mécanisme «|escape|». En effet, comme le contenu en échappement est
+composé en mode mathématique, il est en particulier composé dans un groupe TeX et ne
+pourra donc pas servir à changer le formatage d'autres unités lexicales.
 
 \medskip
-Dans les langages où le caractère |$| ne joue pas un rôle syntaxique important, on peut assez naturellement
-vouloir activer le mécanisme «|escape-math|» avec le caractère |$|:
+Dans les langages où le caractère
+|$| ne joue pas un rôle syntaxique important, on peut assez naturellement vouloir activer
+le mécanisme «|escape-math|» avec le caractère |$|:
 \begin{Verbatim}
 \PitonOptions{~emphase#begin-escape-math=$,end-escape-math=$@}
 \end{Verbatim}
-Remarquer que le caractère |$| ne doit \emph{pas} être protégé par une contre-oblique.
+Remarquer que le caractère |$| ne doit \emph{pas} être protégé par une contre-oblique. % $
 
 \bigskip
 Néanmoins, il est sans doute plus prudent d'utiliser |\(| et |\)|.
@@ -1538,25 +1646,29 @@
 
 \index{Beamer@\cls{Beamer} (classe)}
 
-\emph{Première remarque}\par\nobreak
-Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim, il convient, ce qui
-n'est pas surprenant, de l'utiliser dans des environnements |{frame}| de Beamer protégés par la clé |fragile|,
-c'est-à-dire débutant par |\begin{frame}[fragile]|.\footnote{On rappelle que pour un environnement |{frame}| de Beamer qui
-  utilise la clé |fragile|, l'instruction |\end{frame}| doit être seule sur une ligne (à l'exception d'éventuels
-  espaces en début de ligne).}
+\emph{Première remarque}\par\nobreak 
 
+Remarquons que, comme l'environnement |{Piton}| prend son argument selon un mode verbatim,
+il convient, ce qui n'est pas surprenant, de l'utiliser dans des environnements |{frame}|
+de Beamer protégés par la clé |fragile|, c'est-à-dire débutant par
+|\begin{frame}[fragile]|.\footnote{On rappelle que pour un environnement |{frame}| de
+  Beamer qui utilise la clé |fragile|, l'instruction |\end{frame}| doit être seule sur une
+  ligne (à l'exception d'éventuels espaces en début de ligne).}
 
+
 \medskip
-Quand l'extension \pkg{piton} est utilisée dans la classe \cls{beamer}\footnote{L'extension \pkg{piton} détecte la
-  classe \cls{beamer} et l'extension \pkg{beamerarticle} si elle est chargée précédemment, mais il est aussi
-  possible, si le besoin s'en faisait sentir, d'activer ce comportement avec la clé |beamer| au chargement de
-  \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement de \pkg{piton} est légèrement modifié, comme décrit
-maintenant.
+Quand l'extension \pkg{piton} est utilisée dans la classe
+\cls{beamer}\footnote{L'extension \pkg{piton} détecte la classe \cls{beamer} et
+  l'extension \pkg{beamerarticle} si elle est chargée précédemment, mais il est aussi
+  possible, si le besoin s'en faisait sentir, d'activer ce comportement avec la clé
+  |beamer| au chargement de \pkg{piton} : |\usepackage[beamer]{piton}|}, le comportement
+de \pkg{piton} est légèrement modifié, comme décrit maintenant.
 
 \subsubsection{\{Piton\} et \textbackslash PitonInputFile sont ``overlay-aware''}
 
-Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande |\PitonInputFile| acceptent
-l'argument optionnel |<...>| de Beamer pour indiquer les «\emph{overlays}» concernés.
+Quand \pkg{piton} est utilisé avec Beamer, l'environnement |{Piton}| et la commande
+|\PitonInputFile| acceptent l'argument optionnel |<...>| de Beamer pour indiquer les
+«\emph{overlays}» concernés.
 
 On peut par exemple écrire :
 
@@ -1575,27 +1687,37 @@
 
 \subsubsection{Commandes de Beamer reconnues dans \{Piton\} et \textbackslash PitonInputFile}
 
-Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de \cls{beamer} (classées selon
-leur nombre d'arguments obligatoires) sont directement reconnues dans les environnements |{Piton}| (ainsi que dans
-les listings composés par la commande |\PitonInputFile|, même si c'est sans doute moins utile).
+\index{detected-beamer-commands}
+
+Quand \pkg{piton} est utilisé dans la classe \cls{beamer}, les commandes suivantes de
+\cls{beamer} (classées selon leur nombre d'arguments obligatoires) sont directement
+reconnues dans les environnements |{Piton}| (ainsi que dans les listings composés par la
+commande |\PitonInputFile|, même si c'est sans doute moins utile).
 %
 \begin{itemize}
-\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut aussi utiliser |\pause|
-  dans un «commentaire LaTeX», c'est-à-dire en écrivant |#> \pause|. Ainsi, si le code Python est copié, il est
-  interprétable par Python.} ;
-\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et |\visible| ;
-\item deux arguments obligatoires : |\alt| ; 
+\item aucun argument obligatoire : |\pause|\footnote{On remarquera que, bien sûr, on peut
+aussi utiliser |\pause| dans un «commentaire LaTeX», c'est-à-dire en écrivant 
+|#> \pause|. Ainsi, si le code Python est copié, il est   interprétable par Python.} ;  
+\item un argument obligatoire : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| et
+|\visible| ; \newline 
+\colorbox{yellow!50}{\bfseries Nouveau 3.1} on peut rajouter à cette liste de
+nouveaux noms de commandes avec la clé \Definition{detected-beamer-commands} (les noms de
+commandes ne doivent \emph{pas} être précédés de la contre-oblique) ;
+\item deux arguments obligatoires : |\alt| ;
 \item trois arguments obligatoires : |\temporal|.
 \end{itemize}
 
 \medskip
-Les accolades dans les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les accolades
-présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont les chaînes (string) délimitées par
-  les caractères \texttt{'} ou \texttt{"} non triplés. En Python, les chaînes de caractères courtes ne peuvent pas
-  s'étendre sur plusieurs lignes de code.} de Python ne sont pas prises en compte).
+Ces commandes doivent être utilisées précédées et suivies d'un espace. Les accolades dans
+les arguments obligatoires de ces commandes doivent être équilibrées (cependant, les
+accolades présentes dans des chaînes courtes\footnote{Les chaînes courtes de Python sont
+  les chaînes (string) délimitées par les caractères \texttt{'} ou \texttt{"} non triplés.
+  En Python, les chaînes de caractères courtes ne peuvent pas s'étendre sur plusieurs
+  lignes de code.} de Python ne sont pas prises en compte).
 
 \medskip
-Concernant les fonctions |\alt| et |\temporal|, aucun retour à la ligne ne doit se trouver dans les arguments de ces fonctions.
+Concernant les fonctions |\alt| et |\temporal|, aucun retour à la ligne ne doit se trouver
+dans les arguments de ces fonctions.
 
 
 \medskip
@@ -1618,8 +1740,8 @@
 \end{document}
 \end{Verbatim}
 
-Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et |"}"| sont correctement
-interprétées (sans aucun caractère d'échappement).
+Dans l'exemple précédent, les accolades des deux chaînes de caractères Python |"{"| et
+  |"}"| sont correctement interprétées (sans aucun caractère d'échappement).
 
 
 
@@ -1626,14 +1748,21 @@
 \bigskip
 \subsubsection{Environnements de Beamer reconnus dans \{Piton\} et \textbackslash PitonInputFile}
 
-Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de Beamer sont directement
-reconnus dans les environnements |{Piton}| (ainsi que dans les listings composés par la commande |\PitonInputFile|
-même si c'est sans doute moins utile) : |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}|
-et |{visibleenv}|.
+Quand \pkg{piton} est utilisé dans la classe \pkg{beamer}, les environnements suivants de
+Beamer sont directement reconnus dans les environnements |{Piton}| (ainsi que dans les
+listings composés par la commande |\PitonInputFile| même si c'est sans doute moins utile)
+: |{actionenv}|, |{alertenv}|, |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| et
+|{visibleenv}|.
 
+\smallskip
+\index{detected-beamer-environments} \colorbox{yellow!50}{\bfseries Nouveau 3.1}\enskip On
+peut ajouter de nouveaux environnements à cette liste d'environnements reconnus avec la
+clé \Definition{detected-beamer-environments}.
 
 \medskip
-Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes entières de code Python}.
+Il y a néanmoins une restriction : ces environnements doivent englober des \emph{lignes
+  entières de code Python}. Les instructions |\begin{...}| et |\end{...}| doivent être
+seules sur leurs lignes.
 
 
 \medskip
@@ -1657,25 +1786,29 @@
 
 
 
-\vspace{1cm}
-\textbf{Remarque à propos de la commande \textbackslash alert et de l'environnement \{alertenv\} de Beamer}\par\nobreak
+\vspace{1cm} 
+\textbf{Remarque à propos de la commande \textbackslash alert et de
+  l'environnement \{alertenv\} de Beamer}\par\nobreak
 
 \smallskip
-Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement |{alertenv}| (et par la commande
-|\alert| qui s'appuie dessus). Par exemple, on peut écrire:
+Beamer propose un moyen aisé de changer la couleur utilisée par l'environnement
+|{alertenv}| (et par la commande |\alert| qui s'appuie dessus). Par exemple, on peut
+écrire:
 
 \begin{Verbatim}
 \setbeamercolor{~emphase#alerted text@}{fg=blue} 
 \end{Verbatim}
 
-Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel réglage n'est sans doute
-pas pertinent, puisque, justement, \pkg{piton} va (le plus souvent) changer la couleur des élements selon leur
-valeur lexicale. On préfèrera sans doute un environnement |{alertenv}| qui change la couleur de fond des
-éléments à mettre en évidence.
+Néanmoins, dans le cas d'une utilisation à l'intérieur d'un environnement |{Piton}| un tel
+réglage n'est sans doute pas pertinent, puisque, justement, \pkg{piton} va (le plus
+souvent) changer la couleur des élements selon leur valeur lexicale. On préfèrera sans
+doute un environnement |{alertenv}| qui change la couleur de fond des éléments à mettre en
+évidence.
 
 \smallskip
-Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la commande |\@highLight| de
-l'extension \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+Voici un code qui effectuera ce travail en mettant un fond jaune. Ce code utilise la
+commande |\@highLight| de l'extension \pkg{lua-ul} (cette extension nécessite elle-même
+l'extension \pkg{luacolor}).
 
 \begingroup
 \fvset{commandchars=\~\#\+,formatcom=\color{gray}}
@@ -1688,8 +1821,9 @@
 \end{Verbatim}
 \endgroup
 
-Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement |{Piton}| (on rappelle
-que la commande |\alert| s'appuie sur cet environnement |{alertenv}|). 
+Ce code redéfinit localement l'environnement |{alertenv}| à l'intérieur de l'environnement
+|{Piton}| (on rappelle que la commande |\alert| s'appuie sur cet environnement
+|{alertenv}|).
 
 
 
@@ -1707,33 +1841,35 @@
 \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|. 
+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
-Néanmoins, il est également possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien
-l'extension \pkg{footnotehyper}.
+Néanmoins, il est également 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 \Definition{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.
+Si \pkg{piton} est chargée avec l'option \Definition{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 \Definition{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.
+Si \pkg{piton} est chargée avec l'option \Definition{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}.
+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}| : voir un exemple sur la première page de ce document. 
+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}| : voir un
+exemple sur la première page de ce document.
 
 \subsection{Tabulations}
 
@@ -1741,17 +1877,22 @@
 \index{tab-size}
 
 \smallskip
-Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8), \pkg{piton} accepte les
-caractères de tabulations (U+0009) en début de ligne. Chaque caractère U+0009 est remplacé par $n$ espaces. La
-valeur initiale de~$n$ est~4 mais on peut la changer avec la clé \Definition{tab-size} de |\PitonOptions|. 
+Même s'il est recommandé d'indenter les listings Python avec des espaces (cf. PEP~8),
+\pkg{piton} accepte les caractères de tabulations (U+0009) en début de ligne. Chaque
+caractère U+0009 est remplacé par $n$ espaces. La valeur initiale de~$n$ est~4 mais on
+peut la changer avec la clé \Definition{tab-size} de |\PitonOptions|.
 
 \smallskip
-Il existe aussi une clé \Definition{tabs-auto-gobble} qui détermine le nombre minimal de caractères U+0009 débutant
-chaque ligne (non vide) de l'environnement |{Piton}| et applique |gobble| avec cette valeur (avant le remplacement
-des caractères U+0009 par des espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit
-sur des caractères U+0009 au lieu de caractères U+0020 (espaces).
+Il existe aussi une clé \Definition{tabs-auto-gobble} qui détermine le nombre minimal de
+caractères U+0009 débutant chaque ligne (non vide) de l'environnement |{Piton}| et
+applique |gobble| avec cette valeur (avant le remplacement des caractères U+0009 par des
+espaces, bien entendu). Cette clé est donc similaire à la clé |auto-gobble| mais agit sur
+des caractères U+0009 au lieu de caractères U+0020 (espaces).
 
+\smallskip
+La clé |env-gobble| n'est pas compatible avec les tabulations.
 
+
 \section{API pour les développeurs}
 
 
@@ -1764,22 +1905,24 @@
 
 \colorbox{yellow!50}{\textbf{Nouveau 2.6}}\par\nobreak
 
-L'extension \pkg{piton} fournit une fonction Lua |piton.get_last_code| sans argument permettant de récupérer le
-code contenu dans le dernier environnement de \pkg{piton}. 
+L'extension \pkg{piton} fournit une fonction Lua |piton.get_last_code| sans argument
+permettant de récupérer le code contenu dans le dernier environnement de \pkg{piton}.
 \begin{itemize}
-\item Les retours à la ligne (présents dans l'environnement de départ) apparaissent comme des caractères |\r|
-(c'est-à-dire des caractères U+000D).
+\item Les retours à la ligne (présents dans l'environnement de départ) apparaissent comme
+des caractères |\r| (c'est-à-dire des caractères U+000D).
 
-\item Le code fourni par |piton.get_last_code()| tient compte de l'éventuelle application d'une clé |gobble| (cf.
-p.~\pageref{gobble}). 
+\item Le code fourni par |piton.get_last_code()| tient compte de l'éventuelle application
+d'une clé |gobble| (cf. p.~\pageref{gobble}).
 
-\item Les surcharges du code (qui entraînent des échappements vers LaTeX) ont été retirées du code fourni par
-|piton.get_last_code()|. Cela s'applique aux commandes LaTeX déclarées par la clé |detected-commands| (cf.
-partie~\ref{detected-commands}) et aux éléments insérés avec le mécanisme «|escape|» (cf. partie~\ref{escape}).
+\item Les surcharges du code (qui entraînent des échappements vers LaTeX) ont été retirées
+du code fourni par |piton.get_last_code()|. Cela s'applique aux commandes LaTeX déclarées
+par la clé |detected-commands| (cf. partie~\ref{detected-commands}) et aux éléments
+insérés avec le mécanisme «|escape|» (cf. partie~\ref{escape}).
 
-\item |piton.get_last_code| est une fonction Lua et non une chaîne de caractères : les traitements présentés
-précédemment sont exécutés lorsque la fonction est appelée. De ce fait, il peut être judicieux de stocker la valeur  
-renvoyée par |piton.get_last_code()| dans une variable Lua si on doit l'utiliser plusieurs fois.
+\item |piton.get_last_code| est une fonction Lua et non une chaîne de caractères : les
+traitements présentés précédemment sont exécutés lorsque la fonction est appelée. De ce
+fait, il peut être judicieux de stocker la valeur renvoyée par |piton.get_last_code()|
+dans une variable Lua si on doit l'utiliser plusieurs fois.
 \end{itemize}
 
 \medskip
@@ -1794,12 +1937,15 @@
 \label{example-numbering}
 \index{numérotation des lignes de code|emph}
 
-On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé |line-numbers|.
+On rappelle que l'on peut demander la numérotation des lignes des listings avec la clé
+|line-numbers|.
 
-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).
+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, on peut utiliser l'option |left-margin=auto| qui va insérer une marge adaptée aux
-numéros qui seront insérés (elle est plus large quand les numéros dépassent 10).
+Si on ne veut pas de débordement, on peut utiliser l'option |left-margin=auto| qui va
+insérer une marge adaptée aux numéros qui seront insérés (elle est plus large quand les
+numéros dépassent 10).
 
 
 \begingroup
@@ -1841,8 +1987,8 @@
 \label{example-comments}
 \index{commentaires LaTeX|emph}
 
-On peut modifier le style |Comment.LaTeX| (avec |\SetPitonStyle|) pour faire afficher les commentaires 
-LaTeX (qui débutent par |#>|) en butée à droite.
+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}}
@@ -1876,10 +2022,10 @@
 \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 la clé |width|. Dans l'exemple qui suit, on utilise la clé |width| avec la valeur
-spéciale~|min|. Plusieurs compilations sont nécessaires.
+\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 la clé |width|. Dans l'exemple
+qui suit, on utilise la clé |width| avec la valeur spéciale~|min|. Plusieurs compilations
+sont nécessaires.
 
 
 \begingroup
@@ -1929,12 +2075,14 @@
 
 \index{notes dans les listings|emph}
 
-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|.
+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.
+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}}
@@ -1968,9 +2116,9 @@
 
 \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. 
+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
@@ -2014,11 +2162,13 @@
 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}.
+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}.
 
-Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite elle-même l'extension \pkg{luacolor}).
+Ce réglage utilise la commande |\highLight| de \pkg{lua-ul} (cette extension nécessite
+elle-même l'extension \pkg{luacolor}).
 
 
 \begin{Verbatim}
@@ -2044,10 +2194,11 @@
 \end{Verbatim}
 
 
-Dans ce réglage, de nombreuses valeurs fournies aux clés sont vides, ce qui signifie que le style correspondant
-n'insèrera aucune instruction de formatage (l'élément sera composé dans la couleur standard, le plus souvent, en noir,
-etc.). Ces entrées avec valeurs nulles sont néanmoins nécessaires car la valeur initiale de ces styles dans
-\pkg{piton} n'est \emph{pas} vide.
+Dans ce réglage, de nombreuses valeurs fournies aux clés sont vides, ce qui signifie que
+le style correspondant n'insèrera aucune instruction de formatage (l'élément sera composé
+dans la couleur standard, le plus souvent, en noir, etc.). Ces entrées avec valeurs nulles
+sont néanmoins nécessaires car la valeur initiale de ces styles dans \pkg{piton} n'est
+\emph{pas} vide.
 
 \begingroup
 
@@ -2105,11 +2256,13 @@
 \label{pyluatex}
 \index{pyluatex@{\pkg{pyluatex}} (extension)}
 
-L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à partir de |lualatex| (pourvu
-que Python soit installé sur la machine et que la compilation soit effectuée avec |lualatex| et |--shell-escape|).
+L'extension \pkg{pyluatex} est une extension qui permet l'exécution de code Python à
+partir de |lualatex| (pourvu que Python soit installé sur la machine et que la compilation
+soit effectuée avec |lualatex| et |--shell-escape|).
 
-Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python (avec \pkg{piton}) et qui
-affiche également dessous le résultat de l'exécution de ce code avec Python.
+Voici, à titre d'exemple, un environnement |{PitonExecute}| qui formate un listing Python
+(avec \pkg{piton}) et qui affiche également dessous le résultat de l'exécution de ce code
+avec Python.
 
 
 \begin{Verbatim}
@@ -2129,12 +2282,12 @@
    \ignorespacesafterend}
 
 
-On a utilisé la fonction Lua |piton.get_last_code| fournie dans l'API de \pkg{piton} : cf.~partie~\ref{API},
-p.~\pageref{API}. 
+ On a utilisé la fonction Lua |piton.get_last_code| fournie dans l'API de \pkg{piton} :
+ cf.~partie~\ref{API}, p.~\pageref{API}.
 
 \bigskip
-Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les options proposées par la
-commande |\PitonOptions|.
+Cet environnement |{PitonExecute}| prend en argument optionnel (entre crochets) les
+options proposées par la commande |\PitonOptions|.
 
 \begin{Verbatim}
 \begin{~emphase#PitonExecute@}[background-color=gray!15]
@@ -2162,23 +2315,26 @@
 
 \index{pythonrepl@\texttt{\{pythonrepl\}} (environnement de \pkg{pyluatex})}
 
-L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce que l'on obtient quand on
-fournit ce code à une boucle \textsc{repl} (\emph{read-eval-print loop}) de Python. On obtient un entrelacement
-d'instructions précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui a été
-demandé d'être affiché avec des \piton{print} de Python).
+L'environnement |{pythonrepl}| de \pkg{pyluatex} passe son contenu à Python et renvoie ce
+que l'on obtient quand on fournit ce code à une boucle \textsc{repl}
+(\emph{read-eval-print loop}) de Python. On obtient un entrelacement d'instructions
+précédées par le prompt |>>>| de Python et des valeurs renvoyées par Python (et de ce qui
+a été demandé d'être affiché avec des \piton{print} de Python).
 
 \medskip
-Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un coloriage syntaxique 
-et mettre sur fond grisé les lignes correspondant aux instructions fournies à l'interpréteur Python (grâce à la clé
-|prompt-background-color| de |\PitonOptions|).
+Il est ensuite possible de passer cela à un environnement |{Piton}| qui va faire un
+coloriage syntaxique et mettre sur fond grisé les lignes correspondant aux instructions
+fournies à l'interpréteur Python (grâce à la clé |prompt-background-color| de
+|\PitonOptions|).
 
 
 \medskip
-Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des raisons techniques, le
-|!| est ici obligatoire dans la signature de l'environnement). On ne peut pas procéder comme précédemment (dans
-l'utilisation «standard» de \pkg{pyluatex}) car, bien sûr, c'est le retour fait par |{pythonrepl}| qui doit être
-traité par \pkg{piton}. De ce fait, il ne sera pas possible de mettre des surcharges (avec |detected-commands| ou
-le mécanisme |escape|) dans le code.
+Voici la programmation d'un environnement |{PitonREPL}| qui effectue ce travail (pour des
+raisons techniques, le |!| est ici obligatoire dans la signature de l'environnement). On
+ne peut pas procéder comme précédemment (dans l'utilisation «standard» de \pkg{pyluatex})
+car, bien sûr, c'est le retour fait par |{pythonrepl}| qui doit être traité par
+\pkg{piton}. De ce fait, il ne sera pas possible de mettre des surcharges (avec
+|detected-commands| ou le mécanisme |escape|) dans le code.
 
 \begin{Verbatim}
 \ExplSyntaxOn
@@ -2263,11 +2419,12 @@
 
 
 \bigskip
-En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les chaînes de caractères
-|>>>| et |...|). En effet, \pkg{piton} propose un style pour ces éléments, qui est appelé |Prompt|. Par défaut, la
-valeur de ce style est vide, ce qui fait qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés
-tels quels. En fournissant comme valeur une fonction qui se contente de gober son argument, on peut demander à ce
-qu'ils ne soient pas affichés.
+En fait, il est possible de ne pas faire afficher les prompts eux-mêmes (c'est-à-dire les
+chaînes de caractères |>>>| et |...|). En effet, \pkg{piton} propose un style pour ces
+éléments, qui est appelé |Prompt|. Par défaut, la valeur de ce style est vide, ce qui fait
+qu'aucune action n'est exécutée sur ces éléments qui sont donc affichés tels quels. En
+fournissant comme valeur une fonction qui se contente de gober son argument, on peut
+demander à ce qu'ils ne soient pas affichés.
 
 \bigskip
 \begin{savenotes}
@@ -2328,16 +2485,17 @@
 
 \subsection{Le langage Python}
 
-Le langage par défaut de l'extension \pkg{piton} est Python. Si besoin est, on peut revenir au langage Python avec
-|\PitonOptions{language=Python}|. 
+Le langage par défaut de l'extension \pkg{piton} est Python. Si besoin est, on peut
+revenir au langage Python avec |\PitonOptions{language=Python}|.
 
 \bigskip
 
-Les réglages initiaux effectués par \pkg{piton} dans |piton.sty| sont inspirés par le style \pkg{manni} de Pygments
-tel qu'il est appliqué au langage Python par 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|. Il est possible d'avoir la même couleur dans |{Piton}| avec l'instruction :
-  |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
+Les réglages initiaux effectués par \pkg{piton} dans |piton.sty| sont inspirés par le
+style \pkg{manni} de Pygments tel qu'il est appliqué au langage Python par
+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|. Il est possible d'avoir la même couleur dans |{Piton}| avec
+  l'instruction : |\PitonOptions{background-color = [HTML]{F0F3F3}}|}
 
 \vspace{1cm}
 
@@ -2349,33 +2507,40 @@
   \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 (qui sont gérées par |String.Doc|)\\
+  String.Long & les chaînes de caractères longues (entre \texttt{'''} ou \texttt{"""})
+                sauf les chaînes de documentation (qui sont gérées par |String.Doc|)\\
   String & cette clé fixe à la fois |String.Short| et |String.Long| \\
   String.Doc & les chaînes de documentation (seulement entre |"""| suivant PEP~257) \\
-  String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les caractères \texttt{\{} et
-                    \texttt{\}}) ; ce style hérite des styles |String.Short| et |String.Long| (suivant la chaîne où
-                    apparaît l'interpolation)\\
-  Interpol.Inside & le contenu des interpolations dans les f-strings (c'est-à-dire les éléments qui se trouvent entre
-                    \texttt{\{} et~\texttt{\}} ; si l'utilisateur n'a pas fixé ce style, ces éléments sont analysés et formatés par \pkg{piton}
-                    au même titre que le reste du code. \\
-                    Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ |@| \\
+  String.Interpol & les éléments syntaxiques des champs des f-strings (c'est-à-dire les
+                    caractères \texttt{\{} et \texttt{\}}) ; ce style hérite des styles
+                    |String.Short| et |String.Long| (suivant la chaîne où apparaît
+                    l'interpolation)\\ 
+  Interpol.Inside & le contenu des interpolations dans les f-strings (c'est-à-dire les
+                    éléments qui se trouvent entre \texttt{\{} et~\texttt{\}} ; si
+                    l'utilisateur n'a pas fixé ce style, ces éléments sont analysés et
+                    formatés par \pkg{piton} au même titre que le reste du code. \\ 
+  Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .}
+             \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.Decorator & les décorateurs (instructions débutant par \verb|@|) \\
   Name.Namespace & le nom des modules (= bibliothèques extérieures) \\
-  Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé \verb|class| \\
-  Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition} (après le
-                  mot-clé |def|) \\
-  UserFunction & le nom des fonctions précédemment définies par l'utilisateur (la valeur initiale de ce paramètre est
-                 vide et ces éléments sont affichés en noir --- ou plutôt dans la couleur courante) \\
+  Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le
+               mot-clé \verb|class| \\ 
+  Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur
+                  définition} (après le mot-clé |def|) \\
+  UserFunction & le nom des fonctions précédemment définies par l'utilisateur (la valeur
+                 initiale de ce paramètre est vide et ces éléments sont affichés en noir
+                 --- ou plutôt dans la couleur courante) \\ 
   Exception & les exceptions prédéfinies (ex.: \texttt{SyntaxError}) \\
-  InitialValues & les valeurs initiales (et le symbole |=| qui précède) des arguments optionnels dans les définitions
-                  de fonctions ; si l'utilisateur n'a pas fixé ce style, ces éléments sont analysés et formatés par \pkg{piton}
+  InitialValues & les valeurs initiales (et le symbole |=| qui précède) des arguments
+                  optionnels dans les définitions de fonctions ; si l'utilisateur n'a pas
+                  fixé ce style, ces éléments sont analysés et formatés par \pkg{piton} 
                   au même titre que le reste du code.\\
   Comment & les commentaires commençant par \texttt{\#} \\
-  Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés par \pkg{piton} comme du code LaTeX (et
-                  appelés simplement «commentaires LaTeX» dans ce document) \\
+  Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés par
+                  \pkg{piton} comme du code LaTeX (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,
@@ -2421,17 +2586,18 @@
   String.Long & les chaînes de caractères, entre |"| mais aussi les \emph{quoted-strings} \\
   String & cette clé fixe à la fois |String.Short| et |String.Long| \\
   Operator & les opérateurs, en particulier |+|, |-|, |/|, |*|, |@|, |!=|, |==|, |&&| \\
-  Operator.Word & les opérateurs suivants : |and|, |asr|, |land|, |lor|, |lsl|, |lxor|, |mod| et |or| \\
+  Operator.Word & les opérateurs suivants : |and|, |asr|, |land|, |lor|, |lsl|, |lxor|,
+                  |mod| et |or| \\ 
   Name.Builtin & les fonctions |not|, |incr|, |decr|, |fst| et |snd| \\
   Name.Type & le nom des types OCaml \\
   Name.Field & le nom d'un champ de module \\
   Name.Constructor & le nom des constructeurs de types (qui débutent par une majuscule) \\
   Name.Module & le nom des modules \\
-  Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition} (après le
-                  mot-clé |let|) \\
-  UserFunction & le nom des fonctions précédemment définies par l'utilisateur 
-                 (la valeur initiale de ce paramètre est
-                 vide et ces éléments sont affichés en noir --- ou plutôt dans la couleur courante) \\
+  Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur
+                  définition} (après le mot-clé |let|) \\  
+  UserFunction & le nom des fonctions précédemment définies par l'utilisateur (la valeur
+                 initiale de ce paramètre est vide et ces éléments sont affichés en noir
+                 --- ou plutôt dans la couleur courante) \\ 
   Exception & les exceptions prédéfinies (ex. : |End_of_File|) \\
   TypeParameter & les paramétreurs de type \\
   Comment & les commentaires, entre |(*| et |*)| ; ces commentaires peuvent être imbriqués \\
@@ -2477,28 +2643,33 @@
 \midrule
 Number & les nombres \\
 String.Long & les chaînes de caractères (entre \texttt{"}) \\
-String.Interpol &  les éléments \texttt{\%d}, \texttt{\%i}, \texttt{\%f}, \texttt{\%c}, etc. dans les chaînes de
-                  caractères ; ce style hérite du style |String.Long| \\
+String.Interpol & les éléments \texttt{\%d}, \texttt{\%i}, \texttt{\%f}, \texttt{\%c},
+                  etc. dans les chaînes de caractères ; ce style hérite du style
+                  |String.Long| \\ 
 Operator & les opérateurs suivants : \texttt{!= == << >> - \~{} + / * \% = < > \& .} \verb+|+ |@| \\
-Name.Type & les types prédéfinis suivants :
-  |bool|, |char|, |char16_t|, |char32_t|, |double|, |float|, |int|, |int8_t|, |int16_t|, |int32_t|, 
-  |int64_t|, |long|, |short|, |signed|, |unsigned|, |void| et |wchar_t| \\ 
-Name.Builtin & les fonctions prédéfinies suivantes : |printf|, |scanf|, |malloc|, |sizeof| et  |alignof|  \\
-  Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le mot-clé |class| \\
+Name.Type & les types prédéfinis suivants : |bool|, |char|, |char16_t|, |char32_t|,
+            |double|, |float|, |int|, |int8_t|, |int16_t|, |int32_t|, |int64_t|, |long|,
+            |short|, |signed|, |unsigned|, |void| et |wchar_t| \\  
+Name.Builtin & les fonctions prédéfinies suivantes : |printf|, |scanf|, |malloc|, |sizeof|
+               et  |alignof|  \\ 
+  Name.Class & le nom des classes au moment de leur définition, c'est-à-dire après le
+               mot-clé |class| \\ 
 Name.Function & le nom des fonctions définies par l'utilisateur \emph{au moment de leur définition} \\
-UserFunction & le nom des fonctions précédemment définies par l'utilisateur (la valeur initiale de ce paramètre est
-               vide et ces éléments sont affichés en noir --- ou plutôt dans la couleur courante) \\
+UserFunction & le nom des fonctions précédemment définies par l'utilisateur (la valeur
+               initiale de ce paramètre est vide et ces éléments sont affichés en noir ---
+               ou plutôt dans la couleur courante) \\ 
 Preproc & les instructions du préprocesseur (commençant par |#|) \\
 Comment & les commentaires (commençant par \texttt{//} ou entre |/*| et |*/|) \\
-Comment.LaTeX & les commentaires commençant par \texttt{//>} qui sont composés par \pkg{piton} comme du code LaTeX (et
-                appelés simplement «commentaires LaTeX» dans ce document) \\
+Comment.LaTeX & les commentaires commençant par \texttt{//>} qui sont composés par
+                \pkg{piton} comme du code LaTeX (et appelés simplement «commentaires
+                LaTeX» dans ce document) \\ 
 Keyword.Constant & |default|, |false|, |NULL|, |nullptr| et |true| \\
-Keyword & les mots-clés suivants :
-|alignas|, |asm|, |auto|, |break|, |case|, |catch|, |class|, 
-|constexpr|, |const|, |continue|, |decltype|, |do|, |else|, |enum|,
-|extern|, |for|, |goto|, |if|, |nexcept|, |private|, |public|, |register|, |restricted|, |try|, 
-|return|, |static|, |static_assert|, |struct|, |switch|, |thread_local|, |throw|, 
-|typedef|, |union|, |using|, |virtual|, |volatile| et |while|
+Keyword & les mots-clés suivants : |alignas|, |asm|, |auto|, |break|, |case|, |catch|,
+          |class|, |constexpr|, |const|, |continue|, |decltype|, |do|, |else|, |enum|,
+          |extern|, |for|, |goto|, |if|, |nexcept|, |private|, |public|, |register|,
+          |restricted|, |try|, |return|, |static|, |static_assert|, |struct|, |switch|,
+          |thread_local|, |throw|, |typedef|, |union|, |using|, |virtual|, |volatile| et
+          |while| 
 \\
 \bottomrule
 \end{tabularx}
@@ -2534,31 +2705,32 @@
 Number & les nombres \\
 String.Long & les chaînes de caractères (entre \texttt{'} et non entre \texttt{"} car les éléments entre \texttt{"}
               sont des noms de champs et formatés avec |Name.Field|) \\
-Operator & les opérateurs suivants : 
-\texttt{= != <> >= > < <= * + / } \\
+Operator & les opérateurs suivants : \texttt{= != <> >= > < <= * + / } \\
 Name.Table & les noms des tables \\
 Name.Field & les noms des champs des tables \\
-Name.Builtin & les fonctions prédéfinies suivantes (leur nom n'est \emph{pas} sensible à la casse) : 
-   |avg|, |count|, |char_lenght|, |concat|, |curdate|, |current_date|,
-   |date_format|, |day|, |lower|, |ltrim|, |max|, |min|, |month|, |now|,
-   |rank|, |round|, |rtrim|, |substring|, |sum|, |upper| et |year|. \\
+Name.Builtin & les fonctions prédéfinies suivantes (leur nom n'est \emph{pas} sensible à
+               la casse) : |avg|, |count|, |char_lenght|, |concat|, |curdate|,
+               |current_date|, |date_format|, |day|, |lower|, |ltrim|, |max|, |min|,
+               |month|, |now|, |rank|, |round|, |rtrim|, |substring|, |sum|, |upper| et
+               |year|. \\ 
 Comment & les commentaires (débutant par |--| ou bien entre |/*| et |*/|) \\
-Comment.LaTeX & les commentaires commençant par \texttt{-->} qui sont composés par \pkg{piton} comme du code LaTeX (et
-                appelés simplement «commentaires LaTeX» dans ce document) \\
-Keyword & les mots-clés suivants (leur nom n'est \emph{pas} sensible à la casse) :
-   |add|, |after|, |all|, |alter|, |and|, |as|, |asc|, |between|, |by|,
-   |change|, |column|, |create|, |cross join|, |delete|, |desc|, |distinct|, 
-   |drop|, |from|, |group|, |having|, |in|, |inner|, |insert|, |into|, |is|, 
-   |join|, |left|, |like|, |limit|, |merge|, |not|, |null|, |on|, |or|, 
-   |order|, |over|, |right|, |select|, |set|, |table|, |then|, |truncate|, 
-   |union|, |update|, |values|, |when|, |where| et |with|. \\
+Comment.LaTeX & les commentaires commençant par \texttt{-->} qui sont composés par
+                \pkg{piton} comme du code LaTeX (et appelés simplement «commentaires
+                LaTeX» dans ce document) \\ 
+Keyword & les mots-clés suivants (leur nom n'est \emph{pas} sensible à la casse) : |add|,
+          |after|, |all|, |alter|, |and|, |as|, |asc|, |between|, |by|, |change|,
+          |column|, |create|, |cross join|, |delete|, |desc|, |distinct|, |drop|, |from|,
+          |group|, |having|, |in|, |inner|, |insert|, |into|, |is|, |join|, |left|,
+          |like|, |limit|, |merge|, |not|, |null|, |on|, |or|, |order|, |over|, |right|,
+          |select|, |set|, |table|, |then|, |truncate|, |union|, |update|, |values|,
+          |when|, |where| et |with|. \\ 
 \bottomrule
 \end{tabularx}
 \end{center}
 
 \bigskip
-Si on souhaite que les mots-clés soient capitalisés automatiquement, on peut modifier le style |Keywords|
-localement pour le langage SQL avec l'instruction :
+Si on souhaite que les mots-clés soient capitalisés automatiquement, on peut modifier le
+style |Keywords| localement pour le langage SQL avec l'instruction :
 \begin{Verbatim}
 \SetPitonStyle~emphase#[SQL]@{Keywords = \bfseries \MakeUppercase}
 \end{Verbatim}
@@ -2598,16 +2770,18 @@
 Number & les nombres \\
 String & les chaînes de caractères (qui sont entre \texttt{"}) \\
 Comment & les commentaires (qui débutent par |#|) \\
-Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés par \pkg{piton} comme du code LaTeX (et
-                appelés simplement «commentaires LaTeX» dans ce document) \\
+Comment.LaTeX & les commentaires commençant par \texttt{\#>} qui sont composés par
+                \pkg{piton} comme du code LaTeX (et appelés simplement «commentaires
+                LaTeX» dans ce document) \\ 
 \bottomrule
 \end{tabularx}
 \end{center}
 
 \bigskip
-Ce langage «|minimal|» est proposé par \pkg{piton} à l'utilisateur final pour qu'il puisse y ajouter des
-formatages de mots-clés avec la commande |\SetPitonIdentifier| (cf. \ref{SetPitonIdentifier},
-p.~\pageref{SetPitonIdentifier}) et créer par exemple un langage pour pseudo-code.
+Ce langage «|minimal|» est proposé par \pkg{piton} à l'utilisateur final pour qu'il puisse
+y ajouter des formatages de mots-clés avec la commande |\SetPitonIdentifier| (cf.
+\ref{SetPitonIdentifier}, p.~\pageref{SetPitonIdentifier}) et créer par exemple un langage
+pour pseudo-code.
 
 
 \newpage
@@ -2617,8 +2791,8 @@
 \indexcommand{NewPitonLanguage}
 
 \vspace{1cm}
-La commande |\NewPitonLanguage|, qui permet de définir de nouveaux langages en utilisant la syntaxe de l'extension
-\pkg{listings}, a été présentée p.~\pageref{NewPitonLanguage}.
+La commande |\NewPitonLanguage|, qui permet de définir de nouveaux langages en utilisant
+la syntaxe de l'extension \pkg{listings}, a été présentée p.~\pageref{NewPitonLanguage}.
 
 Tous les langages définis avec la commande |\NewPitonLanguage| partagent les mêmes styles.
 
@@ -2630,15 +2804,17 @@
 \normalfont Style  & Usage \\
 \midrule
 Number & les nombres \\
-String.Long & les chaînes de caractères définies dans |\NewPitonLanguage| par la clé |morestring| \\ 
+String.Long & les chaînes de caractères définies dans |\NewPitonLanguage| par la clé
+              |morestring| \\  
 Comment & les commentaires définis dans |\NewPitonLanguage| par la clé |morecomment|  \\
 Comment.LaTeX & les commentaires qui sont composés par \pkg{piton} comme du code LaTeX (et
                 appelés simplement «commentaires LaTeX» dans ce document) \\
-Keyword & les mots-clés, définis dans |\NewPitonLanguage| par les clés |morekeywords| et |moretexcs| (et également
-          la clé |sensitive| qui indique si les mots-clés sont sensibles à la casse) \\ 
+Keyword & les mots-clés, définis dans |\NewPitonLanguage| par les clés |morekeywords| et
+          |moretexcs| (et également la clé |sensitive| qui indique si les mots-clés sont
+          sensibles à la casse) \\  
 Directive & les directives définies dans |\NewPitonLanguage| par la clé |moredirectives| \\
-Tag & les «tags» définis par la clé |tag| (les lexèmes détectés à l'intérieur d'un tag seront
-      aussi composés avec leur propre style) \\
+Tag & les «tags» définis par la clé |tag| (les lexèmes détectés à l'intérieur d'un tag
+      seront aussi composés avec leur propre style) \\
 \bottomrule
 \end{tabularx}
 \end{center}

Modified: trunk/Master/texmf-dist/doc/lualatex/piton/piton.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/lualatex/piton/piton.dtx
===================================================================
--- trunk/Master/texmf-dist/source/lualatex/piton/piton.dtx	2024-07-29 23:42:00 UTC (rev 71931)
+++ trunk/Master/texmf-dist/source/lualatex/piton/piton.dtx	2024-07-30 20:11:05 UTC (rev 71932)
@@ -79,12 +79,12 @@
 % \iffalse
 %<*STY>
 % \fi
-\def\PitonFileVersion{3.0b}
-\def\PitonFileDate{2024/05/23}
+\def\PitonFileVersion{3.1}
+\def\PitonFileDate{2024/07/30}
 % \iffalse
 %</STY>
 %<*LUA>
-piton_version = "3.0b" -- 2024/05/23
+piton_version = "3.1" -- 2024/07/30
 %</LUA>
 %\fi
 %
@@ -431,6 +431,10 @@
 % \item The key \Definition{line-numbers/sep} is the horizontal distance between
 % the numbers of lines (inserted by |line-numbers|) and the beginning of the
 % lines of code. The initial value is 0.7~em.
+% \item \colorbox{yellow!50}{\bfseries New 3.1}\enskip The key
+% \Definition{line-numbers/format} is a list of tokens which are inserted before
+% the number of line in order to format it. The initial value is
+% |\footnotesize\color{gray}|. 
 % \end{itemize}
 %
 % For convenience, a mechanism of factorisation of the prefix |line-numbers| is
@@ -1654,6 +1658,8 @@
 % 
 % \subsubsection{Commands of Beamer allowed in \{Piton\} and \textbackslash PitonInputFile}
 %
+% \index{detected-beamer-commands}
+%
 % When \pkg{piton} is used in the class \cls{beamer} , the following commands of
 % \cls{beamer} (classified upon their number of arguments) are automatically
 % detected in the environments |{Piton}| (and in the listings processed by
@@ -1663,17 +1669,23 @@
 % also  possible to use the command \texttt{\textbackslash pause} in a ``LaTeX
 % comment'', that is to say by writing \texttt{\#> \textbackslash pause}. By
 % this way, if the Python code is copied, it's still executable by Python}.  ;
-% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible| ;
+% \item one mandatory argument : |\action|, |\alert|, |\invisible|, |\only|,
+% |\uncover| and |\visible| ; \newline
+% \colorbox{yellow!50}{\bfseries New 3.1}\newline
+% It's possible to add new commands to that list with the key
+% \Definition{detected-beamer-commands} (the names of the commands must
+% \emph{not} be preceded by a backslash). 
 % \item two mandatory arguments : |\alt| ; 
 % \item three mandatory arguments  : |\temporal|.
 % \end{itemize}
 
-% \medskip
-% In the mandatory arguments of these commands, the braces must be balanced.
-% However, the braces included in short strings\footnote{The short strings of
-% Python are the strings delimited by characters \texttt{'} or the characters
-% \texttt{"} and not \texttt{'''} nor \texttt{"""}. In Python, the short strings
-% can't extend on several lines.} of Python are not considered. 
+% \medskip 
+% These commands must be used preceded and following by a space. In the
+% mandatory arguments of these commands, the braces must be balanced. However,
+% the braces included in short strings\footnote{The short strings of Python are
+% the strings delimited by characters \texttt{'} or the characters \texttt{"}
+% and not \texttt{'''} nor \texttt{"""}. In Python, the short strings can't
+% extend on several lines.} of Python are not considered.
 %
 % \medskip
 % Regarding the functions |\alt| and |\temporal| there should be no carriage
@@ -1713,8 +1725,18 @@
 % listings processed by |\PitonInputFile|): |{actionenv}|, |{alertenv}|,
 % |{invisibleenv}|, |{onlyenv}|, |{uncoverenv}| and |{visibleenv}|.
 %
+% \smallskip
+% \index{detected-beamer-environments}
+% \colorbox{yellow!50}{\bfseries New 3.1} 
+% 
+% It's possible to add new environments to that list with the key
+% \Definition{detected-beamer-environments}. 
+%
+% \smallskip
+%
 % However, there is a restriction: these environments must contain only \emph{whole
-% lines of Python code} in their body.
+% lines of Python code} in their body. The instructions |\begin{...}| and
+% |\end{...}| must be alone on their lines.
 %
 %\medskip
 % Here is an example:
@@ -1835,7 +1857,9 @@
 % course). Hence, that key is similar to the key |auto-gobble| but acts on
 % U+0009 instead of U+0020 (spaces).
 %
+% The key |env-gobble| is not compatible with the tabulations.
 %
+%
 % \bigskip
 % \section{API for the developpers}
 %
@@ -2957,7 +2981,11 @@
 %    \begin{macrocode}
 \lua_now:n 
   { 
-    piton.ListCommands = lpeg.P ( false ) 
+    piton.BeamerCommands = lpeg.P ( "\\uncover" ) 
+          + "\\only" + "\\visible" + "\\invisible" + "\\alert" + "\\action" 
+    piton.beamer_environments = { "uncoverenv" , "onlyenv" , "visibleenv" , 
+               "invisibleenv" ,  "alertenv" ,  "actionenv" }
+    piton.DetectedCommands = lpeg.P ( false ) 
     piton.last_code = ''
     piton.last_language = ''
   }
@@ -3213,11 +3241,6 @@
 \dim_set:Nn \l_@@_numbers_sep_dim { 0.7 em }
 %    \end{macrocode}
 % 
-% \medskip
-% The tabulators will be replaced by the content of the following token list.
-%    \begin{macrocode}
-\tl_new:N \l_@@_tab_tl
-%    \end{macrocode}
 %
 % \medskip
 % Be careful. The following sequence |\g_@@_languages_seq| is not the list of
@@ -3233,30 +3256,26 @@
 %
 % \medskip
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_set_tab_tl:n #1
-  { 
-    \tl_clear:N \l_@@_tab_tl
-    \prg_replicate:nn { #1 } 
-      { \tl_put_right:Nn \l_@@_tab_tl { ~ } }
-  }
-\@@_set_tab_tl:n { 4 }
+\int_new:N \l_@@_tab_size_int 
+\int_set:Nn \l_@@_tab_size_int { 4 }
 %    \end{macrocode}
 %
-% \medskip
-% When the key |show-spaces| is in force, |\l_@@_tab_tl| will be replaced by an
-% arrow by using the following command.
 %    \begin{macrocode}
-\cs_new_protected:Npn \@@_convert_tab_tl:
-  {
-    \hbox_set:Nn \l_tmpa_box { \l_@@_tab_tl }
-    \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
-    \tl_set:Nn \l_@@_tab_tl 
+\cs_new_protected:Npn \@@_tab:
+  { 
+    \bool_if:NTF \l_@@_show_spaces_bool
       { 
+        \hbox_set:Nn \l_tmpa_box 
+          { \prg_replicate:nn \l_@@_tab_size_int { ~ } } 
+        \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
         \( \mathcolor { gray } 
-             { \hbox_to_wd:nn \l_tmpa_dim { \rightarrowfill } \) } 
+             { \hbox_to_wd:nn \l_tmpa_dim { \rightarrowfill } } \)
       }
+      { \hbox:n { \prg_replicate:nn \l_@@_tab_size_int { ~ } } }
+    \int_gadd:Nn \g_@@_indentation_int \l_@@_tab_size_int 
   }
 %    \end{macrocode}
+%
 % 
 % \medskip
 % The following integer corresponds to the key |gobble|.
@@ -3637,6 +3656,8 @@
 \bool_new:N \l_@@_skip_empty_lines_bool 
 \bool_set_true:N \l_@@_skip_empty_lines_bool 
 \bool_new:N \l_@@_line_numbers_absolute_bool
+\tl_new:N \l_@@_line_numbers_format_bool
+\tl_set:Nn \l_@@_line_numbers_format_tl { \footnotesize \color { gray } }
 \bool_new:N \l_@@_label_empty_lines_bool
 \bool_set_true:N \l_@@_label_empty_lines_bool 
 \int_new:N \l_@@_number_lines_start_int
@@ -3715,6 +3736,9 @@
     sep .dim_set:N = \l_@@_numbers_sep_dim ,
     sep .value_required:n = true , 
 
+    format .tl_set:N = \l_@@_line_numbers_format_tl ,
+    format .value_required:n = true ,
+
     unknown .code:n = \@@_error:n { Unknown~key~for~line-numbers } 
   }
 %    \end{macrocode}
@@ -3730,9 +3754,17 @@
 % First, we put keys that should be available only in the preamble.
 %    \begin{macrocode}
     detected-commands .code:n =  
-       \lua_now:n { piton.addListCommands('#1') } ,
+       \lua_now:n { piton.addDetectedCommands('#1') } ,
     detected-commands .value_required:n = true , 
     detected-commands .usage:n = preamble , 
+    detected-beamer-commands .code:n =  
+       \lua_now:n { piton.addBeamerCommands('#1') } ,
+    detected-beamer-commands .value_required:n = true , 
+    detected-beamer-commands .usage:n = preamble , 
+    detected-beamer-environments .code:n =  
+       \lua_now:n { piton.addBeamerEnvironments('#1') } ,
+    detected-beamer-environments .value_required:n = true , 
+    detected-beamer-environments .usage:n = preamble , 
 %    \end{macrocode}
 %
 % Remark that the command |\lua_escape:n| is fully expandable. That's why we use
@@ -3849,11 +3881,9 @@
         } ,
     left-margin      .value_required:n  = true ,
 
-    tab-size         .code:n            = \@@_set_tab_tl:n { #1 } ,
+    tab-size         .int_set:N         = \l_@@_tab_size_int ,
     tab-size         .value_required:n  = true , 
-    show-spaces      .code:n            = 
-         \bool_set_true:N \l_@@_show_spaces_bool 
-         \@@_convert_tab_tl: ,
+    show-spaces      .bool_set:N        = \l_@@_show_spaces_bool ,
     show-spaces      .value_forbidden:n = true ,
     show-spaces-in-strings .code:n      = \tl_set:Nn \l_@@_space_tl { ␣ } , % U+2423
     show-spaces-in-strings .value_forbidden:n = true ,
@@ -3974,8 +4004,7 @@
     \hbox_overlap_left:n
       { 
         { 
-          \color { gray } 
-          \footnotesize 
+          \l_@@_line_numbers_format_tl 
           \int_to_arabic:n \g_@@_visual_line_int 
         } 
         \skip_horizontal:N \l_@@_numbers_sep_dim  
@@ -4347,7 +4376,7 @@
        {
         \hbox_set:Nn \l_tmpa_box
           {
-            \footnotesize
+            \l_@@_line_numbers_format_tl 
             \bool_if:NTF \l_@@_skip_empty_lines_bool
               {
                 \lua_now:n 
@@ -4726,7 +4755,6 @@
       \@@_compute_left_margin:no { CountNonEmptyLinesFile } \l_@@_file_name_str
       \@@_compute_width:
       \ttfamily
-      % \leavevmode
       \lua_now:e
         { 
           piton.ParseFile(
@@ -5274,6 +5302,8 @@
     break-lines-in-Piton,~
     continuation-symbol,~ 
     continuation-symbol-on-indentation,~
+    detected-beamer-commands,~
+    detected-beamer-environments,~
     detected-commands,~
     end-of-broken-line,~
     end-range,~
@@ -5386,9 +5416,29 @@
 %    \begin{macrocode}
            F = space ^ 0 * ( ( alpha ^ 1 ) / "\\%0" ) * space ^ 0 
         }
-    function piton.addListCommands( key_value )
-      piton.ListCommands = piton.ListCommands + my_lpeg : match ( key_value ) 
+    function piton.addDetectedCommands( key_value )
+      piton.DetectedCommands = piton.DetectedCommands + my_lpeg : match ( key_value ) 
     end
+    function piton.addBeamerCommands( key_value )
+      piton.BeamerCommands 
+       = piton.BeamerCommands + my_lpeg : match ( key_value ) 
+    end
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+    local function insert(...)
+          local s = piton.beamer_environments
+          for _ , x in ipairs({...}) do table.insert(s,x) end  
+          return s 
+          end
+    local my_lpeg_bis = 
+      P {  "E" ,
+           E = ( V "F" * ( "," * V "F" ) ^ 0 ) / insert ,
+           F = space ^ 0 * ( alpha ^ 1 ) * space ^ 0 
+        }
+    function piton.addBeamerEnvironments( key_value )
+      piton.beamer_environments = my_lpeg_bis : match ( key_value ) 
+    end
 \end{luacode*}
 %</STY>
 %    \end{macrocode}
@@ -5427,7 +5477,7 @@
 local function sprintL3 ( s ) 
       tex.sprint ( luatexbase.catcodetables.expl , s ) 
 end 
-%    \end{uncoverenv}
+%    \end{macrocode}
 % 
 % \bigskip
 % \subsubsection{Special functions dealing with LPEG}
@@ -5648,7 +5698,7 @@
 
 local Punct = Q ( S ".,:;!" )
 
-local Tab = "\t" * Lc "\\l_@@_tab_tl"
+local Tab = "\t" * Lc "\\@@_tab:"
 %    \end{macrocode}
 % 
 % \bigskip
@@ -5703,6 +5753,8 @@
 end 
 %    \end{macrocode}
 %
+% 
+%         
 % \bigskip
 % The following Lua function will compute the \text{lpeg} |DetectedCommands|
 % which is a \textsc{lpeg} with captures).
@@ -5709,10 +5761,11 @@
 %    \begin{macrocode}
 local function Compute_DetectedCommands ( lang , braces ) return 
   Ct ( Cc "Open" 
-        * C ( piton.ListCommands * P "{" ) 
+        * C ( piton.DetectedCommands * P "{" ) 
         * Cc "}" 
      ) 
-   * ( braces / (function ( s ) return LPEG1[lang] : match ( s ) end ) )
+   * ( braces 
+       / ( function ( s ) if s ~= '' then return  LPEG1[lang] : match ( s ) end end ) )
    * P "}" 
    * Ct ( Cc "Close" ) 
 end
@@ -5721,9 +5774,10 @@
 % \bigskip
 %    \begin{macrocode}
 local function Compute_LPEG_cleaner ( lang , braces ) return 
-  Ct ( ( piton.ListCommands * "{" 
+  Ct ( ( piton.DetectedCommands * "{" 
           * (  braces 
-              / ( function ( s ) return LPEG_cleaner[lang] : match ( s ) end ) )
+              / ( function ( s ) 
+                  if s ~= '' then return LPEG_cleaner[lang] : match ( s ) end  end ) )
           * "}" 
          + EscapeClean
          +  C ( P ( 1 ) )
@@ -5744,21 +5798,13 @@
 local BeamerEndEnvironments = P ( true ) 
 %    \end{macrocode}
 %
-% \bigskip
 %    \begin{macrocode}
-local list_beamer_env =
-  { "uncoverenv" , "onlyenv" , "visibleenv" , 
-    "invisibleenv" , "alertenv" , "actionenv" }
-%    \end{macrocode}
-%
-% \bigskip
-%    \begin{macrocode}
-local BeamerNamesEnvironments = P ( false ) 
-for _ , x in ipairs ( list_beamer_env ) do
-  BeamerNamesEnvironments = BeamerNamesEnvironments + x 
+piton.BeamerEnvironments = P ( false ) 
+for _ , x  in ipairs ( piton.beamer_environments )  do
+  piton.BeamerEnvironments = piton.BeamerEnvironments + x 
 end 
 %    \end{macrocode}
-%
+% 
 % \bigskip
 %    \begin{macrocode}
 BeamerBeginEnvironments = 
@@ -5765,7 +5811,7 @@
     ( space ^ 0 * 
       L 
         ( 
-          P "\\begin{" * BeamerNamesEnvironments * "}"
+          P "\\begin{" * piton.BeamerEnvironments * "}"
           * ( "<" * ( 1 - P ">" ) ^ 0 * ">" ) ^ -1
         )
       * "\r" 
@@ -5776,11 +5822,12 @@
 %    \begin{macrocode}
 BeamerEndEnvironments = 
     ( space ^ 0 * 
-      L ( P "\\end{" * BeamerNamesEnvironments * "}" ) 
+      L ( P "\\end{" * piton.BeamerEnvironments * "}" ) 
       * "\r" 
     ) ^ 0 
 %    \end{macrocode}
 %
+%
 % 
 % \bigskip
 % The following Lua function will be used to compute the \textsc{lpeg} |Beamer|
@@ -5795,14 +5842,14 @@
   local lpeg = L ( P "\\pause" * ( "[" * ( 1 - P "]" ) ^ 0 * "]" ) ^ -1 ) 
   lpeg = lpeg + 
       Ct ( Cc "Open" 
-            * C ( ( P "\\uncover" + "\\only" + "\\alert" + "\\visible"
-                    + "\\invisible" + "\\action" ) 
+            * C ( piton.BeamerCommands
                   * ( "<" * ( 1 - P ">" ) ^ 0 * ">" ) ^ -1 
                   * P "{" 
                 ) 
             * Cc "}" 
          ) 
-       * ( braces / ( function ( s ) return LPEG1[lang] : match ( s ) end ) )
+       * ( braces / 
+           ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
        * "}" 
        * Ct ( Cc "Close" ) 
 %    \end{macrocode}
@@ -5814,9 +5861,11 @@
 %    \begin{macrocode}
   lpeg = lpeg +
     L ( P "\\alt" * "<" * ( 1 - P ">" ) ^ 0 * ">" * "{" )
-     * K ( 'ParseAgain.noCR' , braces ) 
+     * ( braces / 
+         ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
      * L ( P "}{" )
-     * K ( 'ParseAgain.noCR' , braces ) 
+     * ( braces / 
+         ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
      * L ( P "}" )
 %    \end{macrocode}
 %
@@ -5825,11 +5874,14 @@
 %    \begin{macrocode}
   lpeg = lpeg +
       L ( ( P "\\temporal" ) * "<" * ( 1 - P ">" ) ^ 0 * ">" * "{" )
-      * K ( 'ParseAgain.noCR' , braces ) 
+      * ( braces 
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}{" )
-      * K ( 'ParseAgain.noCR' , braces ) 
+      * ( braces 
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}{" )
-      * K ( 'ParseAgain.noCR' , braces ) 
+      * ( braces 
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}" )
 %    \end{macrocode}
 %
@@ -5836,7 +5888,7 @@
 % \bigskip
 % Now, the environments of Beamer.
 %    \begin{macrocode}
-  for _ , x in ipairs ( list_beamer_env ) do
+  for _ , x in ipairs ( piton.beamer_environments ) do
   lpeg = lpeg + 
         Ct ( Cc "Open" 
              * C ( 
@@ -5847,7 +5899,11 @@
             ) 
         * ( 
             ( ( 1 - P ( "\\end{" .. x .. "}" ) ) ^ 0 ) 
-                / ( function ( s ) return LPEG1[lang] : match ( s ) end ) 
+                / ( function ( s ) 
+                    if s ~= '' 
+                    then return LPEG1[lang] : match ( s ) 
+                    end 
+                    end ) 
           )
         * P ( "\\end{" .. x .. "}" ) 
         * Ct ( Cc "Close" ) 
@@ -5959,6 +6015,17 @@
 
 local OperatorWord = 
   K ( 'Operator.Word' , P "in" + "is" + "and" + "or" + "not" )
+%    \end{macrocode}
+%
+% \smallskip
+% The keyword |in| in a construction such as ``|for i in range(n)|'' must be
+% formatted as a keyword and not as an |Operator.Word|.
+%    \begin{macrocode}
+local For = K ( 'Keyword' , P "for" ) 
+            * Space
+            * Identifier
+            * Space 
+            * K ( 'Keyword' , P "in" ) 
 
 local Keyword = 
   K ( 'Keyword' ,
@@ -6413,12 +6480,16 @@
 % \bigskip
 % \paragraph{The main LPEG for the language Python}
 %
+%    \begin{macrocode}
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1 
+%    \end{macrocode}
+%
 % First, the main loop :
 %    \begin{macrocode}
 local Main = 
-       space ^ 1 * -1
-     + space ^ 0 * EOL 
-     + Space 
+     --   space ^ 1 * -1
+     -- + space ^ 0 * EOL 
+     Space 
      + Tab
      + Escape + EscapeMath
      + CommentLaTeX
@@ -6429,7 +6500,7 @@
      + ExceptionInConsole
      + Delim
      + Operator
-     + OperatorWord * ( Space + Punct + Delim + EOL + -1 ) 
+     + OperatorWord * EndKeyword
      + ShortString
      + Punct
      + FromImport
@@ -6436,9 +6507,10 @@
      + RaiseException 
      + DefFunction
      + DefClass 
-     + Keyword * ( Space + Punct + Delim + EOL + -1 ) 
+     + For
+     + Keyword * EndKeyword
      + Decorator
-     + Builtin * ( Space + Punct + Delim + EOL + -1 ) 
+     + Builtin * EndKeyword
      + Identifier 
      + Number
      + Word
@@ -6464,7 +6536,7 @@
        * Lc '\\@@_begin_line:'
        * Prompt 
        * SpaceIndentation ^ 0 
-       * LPEG1['python']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
        * -1 
        * Lc '\\@@_end_line:' 
      )
@@ -6555,7 +6627,7 @@
   (
       K ( 'Name.Module' , cap_identifier ) 
         * Q "." 
-        * ( Identifier + Constructor + Q "(" + Q "[" + Q "{" ) 
+        * ( Identifier + Constructor + Q "(" + Q "[" + Q "{" ) ^ ( -1 ) 
       + 
       Identifier 
         * Q "."
@@ -6616,7 +6688,7 @@
 %    \begin{macrocode}
 braces = Compute_braces ( "\"" * ( 1 - S "\"" ) ^ 0 * "\"" ) 
 if piton.beamer then 
-  Beamer = Compute_Beamer ( 'ocaml' , "\"" * ( 1 - S "\"" ) ^ 0 * "\"" ) 
+  Beamer = Compute_Beamer ( 'ocaml' , braces ) -- modified 2024/07/24
 end
 %    \end{macrocode}
 % 
@@ -6826,12 +6898,14 @@
 % \bigskip
 % \paragraph{The main LPEG for the language OCaml}
 %
+%    \begin{macrocode}
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1 
+%    \end{macrocode}
+% 
 % First, the main loop :
 %    \begin{macrocode}
 local Main = 
-       space ^ 1 * -1
-     + space ^ 0 * EOL 
-     + Space 
+     Space 
      + Tab
      + Escape + EscapeMath
      + Beamer 
@@ -6847,9 +6921,9 @@
      + DefFunction
      + DefModule
      + Record 
-     + Keyword * ( Space + Punct + Delim + EOL + -1 ) 
-     + OperatorWord * ( Space + Punct + Delim + EOL + -1 ) 
-     + Builtin * ( Space + Punct + Delim + EOL + -1 ) 
+     + Keyword * EndKeyword
+     + OperatorWord * EndKeyword
+     + Builtin * EndKeyword 
      + DotNotation
      + Constructor
      + Identifier 
@@ -6872,7 +6946,7 @@
        * BeamerBeginEnvironments 
        * Lc '\\@@_begin_line:' 
        * SpaceIndentation ^ 0 
-       * LPEG1['ocaml']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
        * -1 
        * Lc '\\@@_end_line:' 
      )
@@ -7015,12 +7089,14 @@
 % \bigskip
 % \paragraph{The main LPEG for the language C}
 %
+%    \begin{macrocode}
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1 
+%    \end{macrocode}
+%
 % First, the main loop :
 %    \begin{macrocode}
 local Main = 
-       space ^ 1 * -1
-     + space ^ 0 * EOL 
-     + Space 
+     Space 
      + Tab
      + Escape + EscapeMath 
      + CommentLaTeX
@@ -7034,9 +7110,9 @@
      + Punct
      + DefFunction
      + DefClass 
-     + Type * ( Q "*" ^ -1 + Space + Punct + Delim + EOL + -1 ) 
-     + Keyword * ( Space + Punct + Delim + EOL + -1 ) 
-     + Builtin * ( Space + Punct + Delim + EOL + -1 ) 
+     + Type * ( Q "*" ^ -1 + EndKeyword ) 
+     + Keyword * EndKeyword
+     + Builtin * EndKeyword
      + Identifier 
      + Number
      + Word
@@ -7060,7 +7136,7 @@
        * BeamerBeginEnvironments 
        * Lc '\\@@_begin_line:'
        * SpaceIndentation ^ 0 
-       * LPEG1['c']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
        * -1 
        * Lc '\\@@_end_line:' 
      )
@@ -7203,6 +7279,9 @@
 % \bigskip
 % \paragraph{The main LPEG for the language SQL}
 %
+%    \begin{macrocode}
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1 
+%    \end{macrocode}
 %
 %    \begin{macrocode}
 local TableField = 
@@ -7245,13 +7324,15 @@
     * ( Space + EOL ) * OneTable 
 %    \end{macrocode}
 % 
+%    \begin{macrocode}
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1 
+%    \end{macrocode}
 %
+%
 % First, the main loop :
 %    \begin{macrocode}
 local Main = 
-       space ^ 1 * -1
-     + space ^ 0 * EOL 
-     + Space 
+     Space 
      + Tab
      + Escape + EscapeMath 
      + CommentLaTeX
@@ -7286,7 +7367,7 @@
        * BeamerBeginEnvironments 
        * Lc [[ \@@_begin_line: ]]
        * SpaceIndentation ^ 0 
-       * LPEG1['sql']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
        * -1 
        * Lc [[ \@@_end_line: ]]
      )
@@ -7328,9 +7409,7 @@
 local Delim = Q ( S "{[()]}" )
 
 local Main = 
-       space ^ 1 * -1
-     + space ^ 0 * EOL 
-     + Space 
+     Space 
      + Tab
      + Escape + EscapeMath 
      + CommentLaTeX
@@ -7352,7 +7431,7 @@
        * BeamerBeginEnvironments 
        * Lc [[ \@@_begin_line: ]]
        * SpaceIndentation ^ 0 
-       * LPEG1['minimal']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
        * -1 
        * Lc [[ \@@_end_line: ]]
      )
@@ -7394,14 +7473,14 @@
 %
 % Here is an example of an item beginning with |"Open"|.
 %
-% |{ "Open" , "\begin{uncover}<2>" , "\end{cover}" }|
+% |{ "Open" , "\begin{uncover}<2>" , "\end{uncover}" }|
 %
 % In order to deal with the ends of lines, we have to close the environment
-% (|{cover}| in this example) at the end of each line and reopen it at the
+% (|{uncover}| in this example) at the end of each line and reopen it at the
 % beginning of the new line. That's why we use two Lua stacks, called
 % |left_stack| and |right_stack|. |left_stack| will be for the elements like
 % |\begin{uncover}<2>| and |right_stack| will be for the elements like
-% |\end{cover}|. 
+% |\end{uncover}|. 
 %    \begin{macrocode}
       if one_item[1] == "Open" then
         tex.sprint( one_item[2] ) 
@@ -7813,7 +7892,7 @@
 % |tag| (mainly for the language \textsc{html}) for the character |/| in the
 % closing tags |</....>|).
 %    \begin{macrocode}
-       other = other + P "c"
+       other = other + P ( c )
      end 
   end 
 %    \end{macrocode}
@@ -8208,12 +8287,7 @@
 % 
 %    \begin{macrocode}
   local Main = 
-         space ^ 1 * -1
-%    \end{macrocode}
-% The spaces at the end of the lines are discarded.
-%    \begin{macrocode}
-       + space ^ 0 * EOL 
-       + Space 
+       Space 
        + Tab
        + Escape + EscapeMath 
        + CommentLaTeX
@@ -8249,7 +8323,7 @@
          * BeamerBeginEnvironments 
          * Lc [[\@@_begin_line:]]
          * SpaceIndentation ^ 0 
-         * LPEG1[lang]
+         * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0 
          * -1 
          * Lc [[\@@_end_line:]]
        )
@@ -8327,6 +8401,12 @@
 %
 % \verb|https://github.com/fpantigny/piton|
 %
+% \subsection*{Changes between versions 3.0 and 3.1}
+%
+% New keys |line-numbers/format|, |detected-beamer-commands| and
+% |detected-beamer-environments|. 
+%
+%
 % \subsection*{Changes between versions 2.8 and 3.0}
 %
 % New command |\NewPitonLanguage|. Thanks to that command, it's now possible to
@@ -8396,62 +8476,7 @@
 % The key |escape-inside| is deprecated: use |begin-escape| and |end-escape|.
 %
 %
-% \subsection*{Changes between versions 1.6 and 2.0}
 %
-% The extension \pkg{piton} now supports the computer languages OCaml and C
-% (and, of course, Python).
-%
-% \subsection*{Changes between versions 1.5 and 1.6}
-%
-% New key |width| (for the total width of the listing).
-%
-% New style |UserFunction| to format the names of the Python functions
-% previously defined by the user. Command |\PitonClearUserFunctions| to clear
-% the list of such functions names.
-%
-% \subsection*{Changes between versions 1.4 and 1.5}
-%
-% New key |numbers-sep|.
-%
-%
-% \subsection*{Changes between versions 1.3 and 1.4}
-%
-% New key |identifiers| in |\PitonOptions|.
-%
-% New command |\PitonStyle|.
-%
-% |background-color| now accepts as value a \emph{list} of colors.
-%
-% \subsection*{Changes between versions 1.2 and 1.3}
-%
-% When the class Beamer is used, the environment |{Piton}| and the command 
-% |\PitonInputFile| are ``overlay-aware'' (that is to say, they accept a
-% specification of overlays between angular brackets).
-%
-% New key |prompt-background-color|
-%
-% It's now possible to use the command |\label| to reference a line of code in
-% an environment |{Piton}|.
-%
-% A new command |\|␣ is available in the argument of the command |\piton{...}| to
-% insert a space (otherwise, several spaces are replaced by a single space).
-% 
-% \subsection*{Changes between versions 1.1 and 1.2}
-%
-% New keys |break-lines-in-piton| and |break-lines-in-Piton|.
-% 
-% New key |show-spaces-in-string| and modification of the key |show-spaces|.
-%
-% When the class \cls{beamer} is used, the environments |{uncoverenv}|,
-% |{onlyenv}|, |{visibleenv}| and |{invisibleenv}|
-%
-%
-% \subsection*{Changes between versions 1.0 and 1.1}
-%
-% The extension \pkg{piton} detects the class \cls{beamer} and activates the
-% commands |\action|, |\alert|, |\invisible|, |\only|, |\uncover| and |\visible|
-% in the environments |{Piton}| when the class \cls{beamer} is used.
-%
 % \tableofcontents
 %
 % \end{document}

Modified: trunk/Master/texmf-dist/tex/lualatex/piton/piton.lua
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/piton/piton.lua	2024-07-29 23:42:00 UTC (rev 71931)
+++ trunk/Master/texmf-dist/tex/lualatex/piton/piton.lua	2024-07-30 20:11:05 UTC (rev 71932)
@@ -20,7 +20,7 @@
 -- -------------------------------------------
 -- 
 -- This file is part of the LuaLaTeX package 'piton'.
-piton_version = "3.0b" -- 2024/05/23
+piton_version = "3.1" -- 2024/07/30
 
 
 
@@ -124,7 +124,7 @@
 
 local Punct = Q ( S ".,:;!" )
 
-local Tab = "\t" * Lc "\\l__piton_tab_tl"
+local Tab = "\t" * Lc "\\__piton_tab:"
 local SpaceIndentation = Lc "\\__piton_an_indentation_space:" * Q " "
 local Delim = Q ( S "[({})]" )
 local VisualSpace = space * Lc "\\l__piton_space_tl"
@@ -146,17 +146,19 @@
 end
 local function Compute_DetectedCommands ( lang , braces ) return
   Ct ( Cc "Open"
-        * C ( piton.ListCommands * P "{" )
+        * C ( piton.DetectedCommands * P "{" )
         * Cc "}"
      )
-   * ( braces / (function ( s ) return LPEG1[lang] : match ( s ) end ) )
+   * ( braces
+       / ( function ( s ) if s ~= '' then return  LPEG1[lang] : match ( s ) end end ) )
    * P "}"
    * Ct ( Cc "Close" )
 end
 local function Compute_LPEG_cleaner ( lang , braces ) return
-  Ct ( ( piton.ListCommands * "{"
+  Ct ( ( piton.DetectedCommands * "{"
           * (  braces
-              / ( function ( s ) return LPEG_cleaner[lang] : match ( s ) end ) )
+              / ( function ( s )
+                  if s ~= '' then return LPEG_cleaner[lang] : match ( s ) end  end ) )
           * "}"
          + EscapeClean
          +  C ( P ( 1 ) )
@@ -165,18 +167,15 @@
 local Beamer = P ( false )
 local BeamerBeginEnvironments = P ( true )
 local BeamerEndEnvironments = P ( true )
-local list_beamer_env =
-  { "uncoverenv" , "onlyenv" , "visibleenv" ,
-    "invisibleenv" , "alertenv" , "actionenv" }
-local BeamerNamesEnvironments = P ( false )
-for _ , x in ipairs ( list_beamer_env ) do
-  BeamerNamesEnvironments = BeamerNamesEnvironments + x
+piton.BeamerEnvironments = P ( false )
+for _ , x  in ipairs ( piton.beamer_environments )  do
+  piton.BeamerEnvironments = piton.BeamerEnvironments + x
 end
 BeamerBeginEnvironments =
     ( space ^ 0 *
       L
         (
-          P "\\begin{" * BeamerNamesEnvironments * "}"
+          P "\\begin{" * piton.BeamerEnvironments * "}"
           * ( "<" * ( 1 - P ">" ) ^ 0 * ">" ) ^ -1
         )
       * "\r"
@@ -183,7 +182,7 @@
     ) ^ 0
 BeamerEndEnvironments =
     ( space ^ 0 *
-      L ( P "\\end{" * BeamerNamesEnvironments * "}" )
+      L ( P "\\end{" * piton.BeamerEnvironments * "}" )
       * "\r"
     ) ^ 0
 local function Compute_Beamer ( lang , braces )
@@ -190,31 +189,36 @@
   local lpeg = L ( P "\\pause" * ( "[" * ( 1 - P "]" ) ^ 0 * "]" ) ^ -1 )
   lpeg = lpeg +
       Ct ( Cc "Open"
-            * C ( ( P "\\uncover" + "\\only" + "\\alert" + "\\visible"
-                    + "\\invisible" + "\\action" )
+            * C ( piton.BeamerCommands
                   * ( "<" * ( 1 - P ">" ) ^ 0 * ">" ) ^ -1
                   * P "{"
                 )
             * Cc "}"
          )
-       * ( braces / ( function ( s ) return LPEG1[lang] : match ( s ) end ) )
+       * ( braces /
+           ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
        * "}"
        * Ct ( Cc "Close" )
   lpeg = lpeg +
     L ( P "\\alt" * "<" * ( 1 - P ">" ) ^ 0 * ">" * "{" )
-     * K ( 'ParseAgain.noCR' , braces )
+     * ( braces /
+         ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
      * L ( P "}{" )
-     * K ( 'ParseAgain.noCR' , braces )
+     * ( braces /
+         ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
      * L ( P "}" )
   lpeg = lpeg +
       L ( ( P "\\temporal" ) * "<" * ( 1 - P ">" ) ^ 0 * ">" * "{" )
-      * K ( 'ParseAgain.noCR' , braces )
+      * ( braces
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}{" )
-      * K ( 'ParseAgain.noCR' , braces )
+      * ( braces
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}{" )
-      * K ( 'ParseAgain.noCR' , braces )
+      * ( braces
+          / ( function ( s ) if s ~= '' then return LPEG1[lang] : match ( s ) end end ) )
       * L ( P "}" )
-  for _ , x in ipairs ( list_beamer_env ) do
+  for _ , x in ipairs ( piton.beamer_environments ) do
   lpeg = lpeg +
         Ct ( Cc "Open"
              * C (
@@ -225,7 +229,11 @@
             )
         * (
             ( ( 1 - P ( "\\end{" .. x .. "}" ) ) ^ 0 )
-                / ( function ( s ) return LPEG1[lang] : match ( s ) end )
+                / ( function ( s )
+                    if s ~= ''
+                    then return LPEG1[lang] : match ( s )
+                    end
+                    end )
           )
         * P ( "\\end{" .. x .. "}" )
         * Ct ( Cc "Close" )
@@ -270,6 +278,11 @@
 
 local OperatorWord =
   K ( 'Operator.Word' , P "in" + "is" + "and" + "or" + "not" )
+local For = K ( 'Keyword' , P "for" )
+            * Space
+            * Identifier
+            * Space
+            * K ( 'Keyword' , P "in" )
 
 local Keyword =
   K ( 'Keyword' ,
@@ -509,10 +522,11 @@
       * StringDoc ^ 0 -- there may be additional docstrings
     ) ^ -1
 local ExceptionInConsole = Exception *  Q ( ( 1 - P "\r" ) ^ 0 ) * EOL
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1
 local Main =
-       space ^ 1 * -1
-     + space ^ 0 * EOL
-     + Space
+     --   space ^ 1 * -1
+     -- + space ^ 0 * EOL
+     Space
      + Tab
      + Escape + EscapeMath
      + CommentLaTeX
@@ -523,7 +537,7 @@
      + ExceptionInConsole
      + Delim
      + Operator
-     + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
+     + OperatorWord * EndKeyword
      + ShortString
      + Punct
      + FromImport
@@ -530,9 +544,10 @@
      + RaiseException
      + DefFunction
      + DefClass
-     + Keyword * ( Space + Punct + Delim + EOL + -1 )
+     + For
+     + Keyword * EndKeyword
      + Decorator
-     + Builtin * ( Space + Punct + Delim + EOL + -1 )
+     + Builtin * EndKeyword
      + Identifier
      + Number
      + Word
@@ -545,7 +560,7 @@
        * Lc '\\__piton_begin_line:'
        * Prompt
        * SpaceIndentation ^ 0
-       * LPEG1['python']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
        * -1
        * Lc '\\__piton_end_line:'
      )
@@ -598,7 +613,7 @@
   (
       K ( 'Name.Module' , cap_identifier )
         * Q "."
-        * ( Identifier + Constructor + Q "(" + Q "[" + Q "{" )
+        * ( Identifier + Constructor + Q "(" + Q "[" + Q "{" ) ^ ( -1 )
       +
       Identifier
         * Q "."
@@ -637,7 +652,7 @@
   K ( 'String.Short' , "'" * ( ( 1 - P "'" ) ^ 0 + "\\'" ) * "'" )
 braces = Compute_braces ( "\"" * ( 1 - S "\"" ) ^ 0 * "\"" )
 if piton.beamer then
-  Beamer = Compute_Beamer ( 'ocaml' , "\"" * ( 1 - S "\"" ) ^ 0 * "\"" )
+  Beamer = Compute_Beamer ( 'ocaml' , braces ) -- modified 2024/07/24
 end
 DetectedCommands = Compute_DetectedCommands ( 'ocaml' , braces )
 LPEG_cleaner['ocaml'] = Compute_LPEG_cleaner ( 'ocaml' , braces )
@@ -754,10 +769,9 @@
   K ( 'Keyword' , P "include" + "open" )
   * Space * K ( 'Name.Module' , cap_identifier )
 local TypeParameter = K ( 'TypeParameter' , "'" * alpha * # ( 1 - P "'" ) )
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1
 local Main =
-       space ^ 1 * -1
-     + space ^ 0 * EOL
-     + Space
+     Space
      + Tab
      + Escape + EscapeMath
      + Beamer
@@ -773,9 +787,9 @@
      + DefFunction
      + DefModule
      + Record
-     + Keyword * ( Space + Punct + Delim + EOL + -1 )
-     + OperatorWord * ( Space + Punct + Delim + EOL + -1 )
-     + Builtin * ( Space + Punct + Delim + EOL + -1 )
+     + Keyword * EndKeyword
+     + OperatorWord * EndKeyword
+     + Builtin * EndKeyword
      + DotNotation
      + Constructor
      + Identifier
@@ -789,7 +803,7 @@
        * BeamerBeginEnvironments
        * Lc '\\__piton_begin_line:'
        * SpaceIndentation ^ 0
-       * LPEG1['ocaml']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
        * -1
        * Lc '\\__piton_end_line:'
      )
@@ -859,10 +873,9 @@
                * ( CommentMath + Q ( ( 1 - P "*/" - S "$\r" ) ^ 1 ) + EOL ) ^ 0
                * Q "*/"
             ) -- $
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1
 local Main =
-       space ^ 1 * -1
-     + space ^ 0 * EOL
-     + Space
+     Space
      + Tab
      + Escape + EscapeMath
      + CommentLaTeX
@@ -876,9 +889,9 @@
      + Punct
      + DefFunction
      + DefClass
-     + Type * ( Q "*" ^ -1 + Space + Punct + Delim + EOL + -1 )
-     + Keyword * ( Space + Punct + Delim + EOL + -1 )
-     + Builtin * ( Space + Punct + Delim + EOL + -1 )
+     + Type * ( Q "*" ^ -1 + EndKeyword )
+     + Keyword * EndKeyword
+     + Builtin * EndKeyword
      + Identifier
      + Number
      + Word
@@ -889,7 +902,7 @@
        * BeamerBeginEnvironments
        * Lc '\\__piton_begin_line:'
        * SpaceIndentation ^ 0
-       * LPEG1['c']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
        * -1
        * Lc '\\__piton_end_line:'
      )
@@ -967,6 +980,7 @@
                * ( CommentMath + Q ( ( 1 - P "*/" - S "$\r" ) ^ 1 ) + EOL ) ^ 0
                * Q "*/"
             ) -- $
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1
 local TableField =
        K ( 'Name.Table' , identifier )
      * Q "."
@@ -1005,10 +1019,9 @@
       + LuaKeyword "TABLE"
     )
     * ( Space + EOL ) * OneTable
+local EndKeyword = Space + Punct + Delim + EOL + Beamer + DetectedCommands + -1
 local Main =
-       space ^ 1 * -1
-     + space ^ 0 * EOL
-     + Space
+     Space
      + Tab
      + Escape + EscapeMath
      + CommentLaTeX
@@ -1030,7 +1043,7 @@
        * BeamerBeginEnvironments
        * Lc [[ \__piton_begin_line: ]]
        * SpaceIndentation ^ 0
-       * LPEG1['sql']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
        * -1
        * Lc [[ \__piton_end_line: ]]
      )
@@ -1066,9 +1079,7 @@
 local Delim = Q ( S "{[()]}" )
 
 local Main =
-       space ^ 1 * -1
-     + space ^ 0 * EOL
-     + Space
+     Space
      + Tab
      + Escape + EscapeMath
      + CommentLaTeX
@@ -1090,7 +1101,7 @@
        * BeamerBeginEnvironments
        * Lc [[ \__piton_begin_line: ]]
        * SpaceIndentation ^ 0
-       * LPEG1['minimal']
+       * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
        * -1
        * Lc [[ \__piton_end_line: ]]
      )
@@ -1334,7 +1345,7 @@
   function add_to_other ( c )
      if c ~= " " then
        extra_others[c] = true
-       other = other + P "c"
+       other = other + P ( c )
      end
   end
   local strict_braces  =
@@ -1599,9 +1610,7 @@
   local Delim = Q ( S "{[()]}" )
   local Punct = Q ( S "=,:;!\\'\"" )
   local Main =
-         space ^ 1 * -1
-       + space ^ 0 * EOL
-       + Space
+       Space
        + Tab
        + Escape + EscapeMath
        + CommentLaTeX
@@ -1623,7 +1632,7 @@
          * BeamerBeginEnvironments
          * Lc [[\__piton_begin_line:]]
          * SpaceIndentation ^ 0
-         * LPEG1[lang]
+         * ( space ^ 1 * -1 + space ^ 0 * EOL + Main ) ^ 0
          * -1
          * Lc [[\__piton_end_line:]]
        )

Modified: trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty	2024-07-29 23:42:00 UTC (rev 71931)
+++ trunk/Master/texmf-dist/tex/lualatex/piton/piton.sty	2024-07-30 20:11:05 UTC (rev 71932)
@@ -19,8 +19,8 @@
 %% LaTeX version 2005/12/01 or later.
 %% -------------------------------------------
 %% 
-\def\PitonFileVersion{3.0b}
-\def\PitonFileDate{2024/05/23}
+\def\PitonFileVersion{3.1}
+\def\PitonFileDate{2024/07/30}
 
 
 
@@ -165,7 +165,11 @@
   }
 \lua_now:n
   {
-    piton.ListCommands = lpeg.P ( false )
+    piton.BeamerCommands = lpeg.P ( "\\uncover" )
+          + "\\only" + "\\visible" + "\\invisible" + "\\alert" + "\\action"
+    piton.beamer_environments = { "uncoverenv" , "onlyenv" , "visibleenv" ,
+               "invisibleenv" ,  "alertenv" ,  "actionenv" }
+    piton.DetectedCommands = lpeg.P ( false )
     piton.last_code = ''
     piton.last_language = ''
   }
@@ -210,24 +214,21 @@
 \bool_new:N \l__piton_left_margin_auto_bool
 \dim_new:N \l__piton_numbers_sep_dim
 \dim_set:Nn \l__piton_numbers_sep_dim { 0.7 em }
-\tl_new:N \l__piton_tab_tl
 \seq_new:N \g__piton_languages_seq
-\cs_new_protected:Npn \__piton_set_tab_tl:n #1
+\int_new:N \l__piton_tab_size_int
+\int_set:Nn \l__piton_tab_size_int { 4 }
+\cs_new_protected:Npn \__piton_tab:
   {
-    \tl_clear:N \l__piton_tab_tl
-    \prg_replicate:nn { #1 }
-      { \tl_put_right:Nn \l__piton_tab_tl { ~ } }
-  }
-\__piton_set_tab_tl:n { 4 }
-\cs_new_protected:Npn \__piton_convert_tab_tl:
-  {
-    \hbox_set:Nn \l_tmpa_box { \l__piton_tab_tl }
-    \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
-    \tl_set:Nn \l__piton_tab_tl
+    \bool_if:NTF \l__piton_show_spaces_bool
       {
+        \hbox_set:Nn \l_tmpa_box
+          { \prg_replicate:nn \l__piton_tab_size_int { ~ } }
+        \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box }
         \( \mathcolor { gray }
-             { \hbox_to_wd:nn \l_tmpa_dim { \rightarrowfill } \) }
+             { \hbox_to_wd:nn \l_tmpa_dim { \rightarrowfill } } \)
       }
+      { \hbox:n { \prg_replicate:nn \l__piton_tab_size_int { ~ } } }
+    \int_gadd:Nn \g__piton_indentation_int \l__piton_tab_size_int
   }
 \int_new:N \l__piton_gobble_int
 \tl_new:N \l__piton_space_tl
@@ -431,6 +432,8 @@
 \bool_new:N \l__piton_skip_empty_lines_bool
 \bool_set_true:N \l__piton_skip_empty_lines_bool
 \bool_new:N \l__piton_line_numbers_absolute_bool
+\tl_new:N \l__piton_line_numbers_format_bool
+\tl_set:Nn \l__piton_line_numbers_format_tl { \footnotesize \color { gray } }
 \bool_new:N \l__piton_label_empty_lines_bool
 \bool_set_true:N \l__piton_label_empty_lines_bool
 \int_new:N \l__piton_number_lines_start_int
@@ -500,14 +503,25 @@
     sep .dim_set:N = \l__piton_numbers_sep_dim ,
     sep .value_required:n = true ,
 
+    format .tl_set:N = \l__piton_line_numbers_format_tl ,
+    format .value_required:n = true ,
+
     unknown .code:n = \__piton_error:n { Unknown~key~for~line-numbers }
   }
 \keys_define:nn { PitonOptions }
   {
     detected-commands .code:n =
-       \lua_now:n { piton.addListCommands('#1') } ,
+       \lua_now:n { piton.addDetectedCommands('#1') } ,
     detected-commands .value_required:n = true ,
     detected-commands .usage:n = preamble ,
+    detected-beamer-commands .code:n =
+       \lua_now:n { piton.addBeamerCommands('#1') } ,
+    detected-beamer-commands .value_required:n = true ,
+    detected-beamer-commands .usage:n = preamble ,
+    detected-beamer-environments .code:n =
+       \lua_now:n { piton.addBeamerEnvironments('#1') } ,
+    detected-beamer-environments .value_required:n = true ,
+    detected-beamer-environments .usage:n = preamble ,
     begin-escape .code:n =
       \lua_now:e { piton.begin_escape = "\lua_escape:n{#1}" } ,
     begin-escape .value_required:n = true ,
@@ -610,11 +624,9 @@
         } ,
     left-margin      .value_required:n  = true ,
 
-    tab-size         .code:n            = \__piton_set_tab_tl:n { #1 } ,
+    tab-size         .int_set:N         = \l__piton_tab_size_int ,
     tab-size         .value_required:n  = true ,
-    show-spaces      .code:n            =
-         \bool_set_true:N \l__piton_show_spaces_bool
-         \__piton_convert_tab_tl: ,
+    show-spaces      .bool_set:N        = \l__piton_show_spaces_bool ,
     show-spaces      .value_forbidden:n = true ,
     show-spaces-in-strings .code:n      = \tl_set:Nn \l__piton_space_tl { ␣ } , % U+2423
     show-spaces-in-strings .value_forbidden:n = true ,
@@ -695,8 +707,7 @@
     \hbox_overlap_left:n
       {
         {
-          \color { gray }
-          \footnotesize
+          \l__piton_line_numbers_format_tl
           \int_to_arabic:n \g__piton_visual_line_int
         }
         \skip_horizontal:N \l__piton_numbers_sep_dim
@@ -912,7 +923,7 @@
        {
         \hbox_set:Nn \l_tmpa_box
           {
-            \footnotesize
+            \l__piton_line_numbers_format_tl
             \bool_if:NTF \l__piton_skip_empty_lines_bool
               {
                 \lua_now:n
@@ -1136,7 +1147,6 @@
       \__piton_compute_left_margin:no { CountNonEmptyLinesFile } \l__piton_file_name_str
       \__piton_compute_width:
       \ttfamily
-      % \leavevmode
       \lua_now:e
         {
           piton.ParseFile(
@@ -1480,6 +1490,8 @@
     break-lines-in-Piton,~
     continuation-symbol,~
     continuation-symbol-on-indentation,~
+    detected-beamer-commands,~
+    detected-beamer-environments,~
     detected-commands,~
     end-of-broken-line,~
     end-range,~
@@ -1555,9 +1567,26 @@
            E = ( V "F" * ( "," * V "F" ) ^ 0 ) / add ,
            F = space ^ 0 * ( ( alpha ^ 1 ) / "\\%0" ) * space ^ 0
         }
-    function piton.addListCommands( key_value )
-      piton.ListCommands = piton.ListCommands + my_lpeg : match ( key_value )
+    function piton.addDetectedCommands( key_value )
+      piton.DetectedCommands = piton.DetectedCommands + my_lpeg : match ( key_value )
     end
+    function piton.addBeamerCommands( key_value )
+      piton.BeamerCommands
+       = piton.BeamerCommands + my_lpeg : match ( key_value )
+    end
+    local function insert(...)
+          local s = piton.beamer_environments
+          for _ , x in ipairs({...}) do table.insert(s,x) end
+          return s
+          end
+    local my_lpeg_bis =
+      P {  "E" ,
+           E = ( V "F" * ( "," * V "F" ) ^ 0 ) / insert ,
+           F = space ^ 0 * ( alpha ^ 1 ) * space ^ 0
+        }
+    function piton.addBeamerEnvironments( key_value )
+      piton.beamer_environments = my_lpeg_bis : match ( key_value )
+    end
 \end{luacode*}
 
 \endinput



More information about the tex-live-commits mailing list.