texlive[69791] Master/texmf-dist: listofitems (10feb24)
commits+karl at tug.org
commits+karl at tug.org
Sun Feb 11 03:14:23 CET 2024
Revision: 69791
https://tug.org/svn/texlive?view=revision&revision=69791
Author: karl
Date: 2024-02-11 03:14:22 +0100 (Sun, 11 Feb 2024)
Log Message:
-----------
listofitems (10feb24)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/generic/listofitems/README
trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.pdf
trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.tex
trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.pdf
trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.tex
trunk/Master/texmf-dist/tex/generic/listofitems/listofitems.tex
Added Paths:
-----------
trunk/Master/texmf-dist/doc/generic/listofitems/test/
trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf
trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.tex
trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf
trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.tex
Removed Paths:
-------------
trunk/Master/texmf-dist/tex/generic/listofitems/listofitemsold.tex
Modified: trunk/Master/texmf-dist/doc/generic/listofitems/README
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/README 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/README 2024-02-11 02:14:22 UTC (rev 69791)
@@ -4,27 +4,27 @@
listofitems
package
- v1.63
+ v1.64
- 21/08/2019
+ 10/02/2024
___________________________________
-Authors : Christian Tellechea, Steven B. Segletes
-Maintainer: Christian Tellechea
-E-mail : unbonpetit at netc.fr (CT)
- steven.b.segletes.civ at mail.mil (SBS)
- Comments, bug reports and suggestions are welcome.
-Licence : Released under the LaTeX Project Public License v1.3c or
- later, see http://www.latex-project.org/lppl.txt
+Maintainer : Christian Tellechea
+E-mail : unbonpetit at netc.fr (CT)
+ Comments, bug reports and suggestions are welcome.
+Translation: Steven B. Segletes
+ steven.b.segletes.civ at mail.mil
+Licence : Released under the LaTeX Project Public License v1.3c or
+ later, see http://www.latex-project.org/lppl.txt
----------------------------------------------------------------------
-Cette extension permet de capturer tous les \'el\'ements d'une liste
-dont le s\'eparateur a \'et\'e choisi par l'utilisateur et d'acc\'eder
-\`a tout \'el\'ement par une syntaxe simple.
+Cette extension permet de capturer tous les éléments d'une liste dont
+le séparateur a été choisi par l'utilisateur et d'accéder à tout
+élément par une syntaxe simple.
----------------------------------------------------------------------
This package allows one to capture all the items of a list, for which
the parsing character has been selected by the user, and to access any
-of these items with a simple syntax.
\ No newline at end of file
+of these items with a simple syntax.
Modified: trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.tex 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-en.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -1,16 +1,11 @@
+% !TeX TS-program = lualatex
% This is the AMERICAN ENGLISH package documentation for "listofitems"
-\documentclass[american]{article}
-\usepackage[T1]{fontenc}
-\usepackage[utf8]{inputenc}
-\usepackage{listofitems,babel,xspace}
+\documentclass[american,10pt]{article}
+\usepackage[a4paper,margin=2.5cm,footskip=10mm]{geometry}
\usepackage[bottom]{footmisc}
-\usepackage{libertine}\usepackage[italic]{mathastext}
-\usepackage[scaled=0.8]{luximono}
-\usepackage[margin=3cm]{geometry}
-\usepackage{fancybox}
-\usepackage{xcolor}
-\usepackage{listings,MnSymbol}
-\def\listofitems{\textsf{\loiname}\xspace}
+\usepackage{fancybox,xcolor,xspace,listings,libertinus-otf,listofitems,babel}
+\usepackage[scaled=0.8]{GoMono}
+\def\listofitems{\textsf\loiname\xspace}
\def\eTeX{\hbox{$\varepsilon$-\TeX}}
\makeatletter
\def\code{\expandafter\code at i\string}
@@ -114,7 +109,8 @@
\smallbreak
\americanloidate
\vskip1.5cm
- {Christian \bsc{Tellechea}\footnote{\texttt{unbonpetit at netc.fr}}\par Steven B. \bsc{Segletes}\footnote{steven.b.segletes.civ at mail.mil}}
+ {Christian \bsc{Tellechea}\footnote{\texttt{unbonpetit at netc.fr}}\bigbreak
+ {\footnotesize Translation: Steven B. \bsc{Segletes}\footnote{\texttt{steven.b.segletes.civ at mail.mil}}}}%
\par
\endgroup
\vskip2cm
@@ -137,10 +133,10 @@
\def\listofitems{\textsf\loiname\xspace}
\section{Preface}
-\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important}: As of version 1.62, \listofitems requires a \TeX{} engine that provides the \texttt{\string\expanded} primitive. If this is not available, an error message will be issued and version 1.61 will be loaded (last version working without the primitive \texttt{\string\expanded}); it is strongly recommended that you update your \LaTeX{} distribution in order to take advantage of the newer \TeX{} engines that provide for the use of this new primitive.}}\medbreak
+\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important}: for any modification to the source code of this extension (bug reports, requests to add or modify a feature), \listofitems users should send an email to \texttt{unbonpetit at netc.fr}. In particular, there's no point in sending an e-mail to another address or posting on a specialized website.}}\medbreak
This package loads no external packages, must be used with the
- \eTeX{} engine, and must be called in (pdf)\hskip0pt(Xe)\hskip0pt(lua)\LaTeX{} with
+ \eTeX{} engine providing \verb|\expanded| primitive, and must be called in (pdf)\hskip0pt(Xe)\hskip0pt(lua)\LaTeX{} with
the invocation
\code|\usepackage{listofitems}|
@@ -544,17 +540,13 @@
"\insmallparen"/
\section{The Code}
-
-Any suggestion, bug report, remark, request, addition or modification
- of functionality is welcome; in this case, I invite users of
- \listofitems to send me an email to \verb|unbonpetit at netc.fr|.\medbreak
-
The code below is the exact verbatim of the file \verb|listofitems.tex|.
I hope that the few comments scattered throughout it will
be enough for the user or the curious to understand the internal
machinery of this package:
-
-
+\newpage
+\pagecolor{black!85}%
+\newgeometry{margin=1.25cm}%
\lstinputlisting[
language=TeX,
inputencoding=latin1,
@@ -571,9 +563,9 @@
showspaces=false,
showstringspaces=false,
numbers=left,
- numberstyle=\tiny\ttfamily\color{black},
+ numberstyle=\tiny\ttfamily\color{white},
breaklines=true,
- prebreak={\hbox{$\rhookswarrow$}},
+ prebreak={\hbox{$\swarrow$}},
breakindent=3em,
breakautoindent=true,
xleftmargin=1em,
Modified: trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.tex 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/listofitems-fr.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -1,17 +1,11 @@
-% !TeX encoding = UTF-8
+% !TeX TS-program = lualatex
% Ceci est la documentation du package "listofitems"
-%
-% Fichier compilé avec pdflatex
-\documentclass[french,a4paper]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage{listofitems,babel}
+\documentclass[10pt,french]{article}
+\usepackage[a4paper,margin=2.5cm,footskip=10mm]{geometry}
\usepackage[bottom]{footmisc}
-\usepackage{libertine}\usepackage[italic,frenchmath]{mathastext}
-\usepackage[scaled=0.8]{luximono}
-\usepackage[margin=3cm]{geometry}
-\usepackage{fancybox,xcolor,xspace,listings,MnSymbol}
-\def\listofitems{\loiname\xspace}
+\usepackage{fancybox,xcolor,xspace,listings,libertinus-otf,listofitems,babel}
+\usepackage[scaled=0.8]{GoMono}
+\def\listofitems{\textsf\loiname\xspace}
\def\eTeX{\hbox{$\varepsilon$-\TeX}}
\makeatletter
\def\code{\expandafter\code at i\string}
@@ -108,7 +102,8 @@
\smallbreak
\longfrloidate
\vskip1.5cm
- {Christian \bsc{Tellechea}\footnote{\texttt{unbonpetit at netc.fr}}\par Steven B. \bsc{Segletes}\footnote{steven.b.segletes.civ at mail.mil}}
+ {Christian \bsc{Tellechea}\footnote{\texttt{unbonpetit at netc.fr}}\bigbreak
+ {\footnotesize Traducteur : Steven B. \bsc{Segletes}}\footnote{\texttt{steven.b.segletes.civ at mail.mil}}}
\par
\endgroup
\vskip2cm
@@ -117,16 +112,16 @@
Un élément peut à son tour être une liste disposant d'un autre séparateur que celui de la liste de niveau supérieur, ce qui ouvre la voie à des imbrications et donne une syntaxe rappelant celle des tableaux à plusieurs dimensions du type \verb|\foo[3,2]| pour accéder à l'élément \no2 de la liste contenue dans l'élément \no3 de la liste de plus haut niveau.
\end{titlepage}
-\def\listofitems{\textsf\loiname\xspace}
\section{Avant-propos}
-\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important} : à partir de la version 1.62, \listofitems nécessite un moteur \TeX{} fournissant la primitive \texttt{\string\expanded}. Si ce n'est pas le cas, un message d'erreur sera émis et la version 1.61 sera chargée (dernière version fonctionnant sans la primitive \texttt{\string\expanded}) : il est vivement conseillé de mettre à jour sa distribution \LaTeX{} afin de profiter d'un moteur \TeX{} récent permettant l'utilisation de cette nouvelle primitive.}}\medbreak
+\fbox{\vbox{\hsize\dimexpr\linewidth-2\fboxsep-2\fboxrule\relax\textbf{Important} : pour toute modification du code source de cette extension (remontée de bug, demande d'ajout ou modification de fonctionnalité), j'invite les utilisateurs de \listofitems à envoyer un email à \texttt{unbonpetit at netc.fr}. Il est notamment inutile d'envoyer un email à une autre adresse ou de poster sur un site internet spécialisé.}}\medbreak
-Cette extension ne requiert aucun package, doit être utilisée avec un moteur \eTeX, et doit être appelée sous (pdf)(Xe)(lua)\LaTeX{} par
+Cette extension ne requiert aucun package, doit être utilisée avec un moteur \eTeX{} fournissant la primitive \verb|\expanded|, et doit être appelée sous (pdf)(Xe)(lua)\LaTeX{} par
\code|\usepackage{listofitems}|
et sous (pdf)(Xe)(lua)\TeX{} par
\code|\input listofitems.tex|
+Je remercie Steven B.~\bsc{Segletes} pour la traduction de ce manuel mais aussi pour l'énergie, la motivation et la persévérance qu'il déploie pour apporter de l'aide aux utilisateurs de \listofitems en répondant à leurs questions sur un site spécialisé. J'avoue que, vu l'ampleur et la répétitivité de la tâche, je serais lassé depuis belle lurette.
\section{Lire une liste simple}
\paragraph{Définir le séparateur}
Le \verb|<séparateur>| par défaut est la virgule et si l'on souhaite en changer, il faut, avant de lire une liste d'éléments, le définir avec \verb|\setsepchar{<séparateur>}|. Un \verb|<séparateur>| est un ensemble de tokens dont les catcodes sont différents de 1 et 2 (les accolades ouvrantes et fermantes), 14 (habituellement \verb|%|) et 15. Le token de catcode 6 (habituellement \verb|#|) n'est accepté que s'il est suivi d'un entier auquel cas l'ensemble désigne l'argument d'une macro; en aucun cas ce token ne doit se trouver seul dans le \verb|<séparateur>|. Des commandes peuvent se trouver dans cet ensemble de tokens, y compris la primitive \verb|\par|.
@@ -151,7 +146,7 @@
\def\liste{12,abc, x y ,{\bfseries z}, ,\TeX,,!}
\readlist\foo\liste|
-La macro \verb|\greadlist| agit comme \verb|\readlist| mais effectue des assignations \emph{globales} et par conséquent, la \verb|<macroliste>| est utilisable hors du groupe où a été exécutée \verb|\greadlist|.
+La macro \verb|\greadlist| agit comme \verb|\readlist|, mais effectue des assignations \emph{globales} et donc, la \verb|<macroliste>| est utilisable hors du groupe où a été exécutée \verb|\greadlist|.
\paragraph{Accéder à un élément}
La macro \verb|\foo| attend un argument numérique \emph{obligatoire} entre crochets, que nous notons $i$ et qui désigne le rang de l'élément auquel on souhaite accéder. Ainsi, \verb|\foo[1]| est\footnote{Il faut 2 développements à \texttt{\textbackslash foo[}$i$\texttt] pour obtenir l'élément \no$i$.} \og\verb|12|\fg. De la même façon, \verb|\foo[4]| est \og\verb|{\bfseries z}|\fg.
@@ -219,7 +214,7 @@
\showitems\foo|
\paragraph{Itérer sur la liste}
-Une fois une liste lue par \verb|\readlist| et stockée dans une \verb|<macroliste>|, la commande \verb|\foreachitem <variable> \in <macroliste>{<code>}| itère sur la liste : la \verb|<variable>| est une macro choisire par l'utilisateur qui prendra tour à tour la valeur de chaque élément.
+Une fois une liste lue par \verb|\readlist| et stockée dans une \verb|<macroliste>|, la commande \verb|\foreachitem <variable> \in <macroliste>{<code>}| itère sur la liste : la \verb|<variable>| est une macro choisie par l'utilisateur qui prendra tour à tour la valeur de chaque élément.
La macro \verb|<variable>cnt| représente le numéro de l'élément contenu dans \verb|<variable>|.
@@ -241,8 +236,12 @@
On parle de liste \og imbriquée\fg lorsque l'on demande à \listofitems de lire une liste où les éléments sont à leur tour compris comme une liste (dont le séparateur est différent de la liste de niveau supérieur). Le nombre d'imbrication n'est pas limité, mais dans la pratique, un niveau d'imbrication de 2, voire 3, semble un maximum.
\paragraph{Définir les séparateurs}\label{sep.listes.imbriquees}
-Pour indiquer que les éléments de la liste doivent eux-mêmes être compris comme des listes et que la recherche des éléments sera récursive, il faut spécifier plusieurs \verb|<séparateurs>|, chacun correspondant à un niveau d'imbrication. Pour déclarer une \verb|<liste de séparateurs>| il faut définir le \verb|<séparateur>| de cette \verb|<liste de séparateurs>| à l'aide de l'argument optionnel de la macro \verb|\setsepchar| et écrire \verb|\setsepchar[<separateur>]{<liste des séparateurs>}|.
+Pour indiquer que les éléments de la liste doivent eux-mêmes être compris comme des listes et que la recherche des éléments sera récursive, il faut spécifier plusieurs \verb|<séparateurs>|, chacun correspondant à un niveau d'imbrication.
+Pour déclarer une \verb|<liste de séparateurs>| il faut définir le \verb|<séparateur>| de cette \verb|<liste de séparateurs>| à l'aide de l'argument optionnel de la macro \verb|\setsepchar| et écrire
+
+\code|\setsepchar[<separateur>]{<liste des séparateurs>}|
+
Par défaut, le \verb|<séparateur>| est \og\verb-/-\fg. Ainsi, si l'on donne l'ordre
\code|\setsepchar{\\/,/ }|
@@ -297,7 +296,7 @@
La \verb|<profondeur>| de l'\verb|<index>| doit être strictement inférieure à celle de la \verb|<liste>|.\medbreak
-Dans le cas d'un \verb|<index>| vide, \verb|\listlen<macrolist>[]| donne en 2 développements le même résultat que \verb|<macrolist>len| qui le donne en 1.
+Dans le cas d'un \verb|<index>| vide, \verb|\listlen<macrolist>[]| donne en deux développements le même résultat que \verb|<macrolist>len| qui le donne en un seul.
\exemple|\setsepchar{\\/,/ }
\readlist\baz{1,2 a b,3 c\\4 d e f,5,6\\7,,8, ,9 xy z}
@@ -399,10 +398,10 @@
"\insmallparen"/
\section{Le code}
-Toute suggestion, remontée de bug, remarque, demande, ajout ou modification de fonctionnalité est bienvenue; dans ce cas, j'invite les utilisateurs de \listofitems à m'envoyer un email à \verb|unbonpetit at netc.fr|.\medbreak
-
Le code ci-dessous est l'exact verbatim du fichier \verb|listofitems.tex|. J'espère que les quelques commentaires qui le parsèment de-ci de-là seront suffisants pour que l'utilisateur ou le curieux comprenne la machinerie interne de ce package :
-
+\newpage
+\pagecolor{black!85}%
+\newgeometry{margin=1.25cm}%
\lstinputlisting[
language=TeX,
inputencoding=latin1,
@@ -419,9 +418,9 @@
showspaces=false,
showstringspaces=false,
numbers=left,
- numberstyle=\tiny\ttfamily\color{black},
+ numberstyle=\tiny\ttfamily\color{white},
breaklines=true,
- prebreak={\hbox{$\rhookswarrow$}},
+ prebreak={\hbox{$\swarrow$}},
breakindent=3em,
breakautoindent=true,
xleftmargin=1em,
Added: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf 2024-02-11 02:14:22 UTC (rev 69791)
Property changes on: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -0,0 +1,123 @@
+% !TeX TS-program = lualatex
+% Ceci est le fichier de test (pdf)(Xe)(lua)latex de l'entension listofitems
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Mise en garde : lorsqu'il est compilé, ce fichier DOIT générer des erreurs aux %
+% endroits où figure "ERREUR" dans le code source. %
+% Ces erreurs sont émises par l'extension listofitems lorsqu'un %
+% argument ou un index est erroné et qu'une solution est %
+% prévue. %
+% Le fichier pdf DOIT être généré. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\documentclass[french]{article}
+\usepackage[margin=2cm]{geometry}
+\usepackage{listofitems,babel}
+\begin{document}
+\parindent=0pt
+{\hfill\huge\bfseries Fichier de test\hfill\null\par}
+\section{Séparateur vide}
+Séparateur vide :\setsepchar{}% ERREUR : le séparateur "," est pris par défaut
+\readlist\castordu{a aa, b , c cc }
+\showitems\castordu
+
+\section{Liste vide}
+Liste vide :\setsepchar{*}
+\readlist\listevide{}% ERREUR
+Showitems = \showitems\listevide\par% ne donne rien, pas d'erreur
+3\ieme{} élément = \listevide[3]\par% ne donne rien, pas d'erreur
+Longueur = \listevidelen% affiche 0
+
+\section{Cas standard}
+\setsepchar{+}
+Lecture par défaut,\readlist\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Lecture sans élément vide,\ignoreemptyitems
+\readlist\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Lecture sans élément vide ni espace extrêmes,\ignoreemptyitems
+\readlist*\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Longueur = \malistelen\par
+liste entière = \maliste[]\par
+2\ieme{} élément = \maliste[2]\par
+-1\ieme{} élément = \maliste[-1]\par
+-2\ieme{} élément = \maliste[-2]\par
+-7\ieme{} élément = \maliste[-7]\par% ERREUR, doit afficher la liste entière
+7\ieme{} élément = \maliste[7]% ERREUR, doit afficher la liste entière
+
+\section{Séparateur = \char`\\par}
+\def\laliste{a b c \par def\par\par xyz}
+\reademptyitems
+\setsepchar{\par}
+Lecture par défaut, \readlist\maliste\laliste
+showitems = \showitems\maliste
+
+Lecture sans élément vide, \ignoreemptyitems
+\readlist\maliste\laliste
+showitems = \showitems\maliste
+
+\section{Séparateur = caractère actif}
+\begingroup
+\catcode`\!=13 \def!{|}
+\setsepchar{!}
+\readlist\foo{!1 ! 2 !! 3!}
+Showitems = \showitems\foo\par
+liste entière = \foo[]\par
+2\ieme{} élément = \foo[2]\par
+-1\ieme{} élément = \foo[-1]\par
+-5\ieme{} élément = \foo[-5]\par% ERREUR, doit afficher la liste entière
+\endgroup
+
+\section{Séparateurs = +\quad -\quad *\quad /}
+\setsepchar[.]{+||-||*||/}
+\def\expression{3 + 2*7 - 4*9/5 - 1}
+\readlist*\nombres\expression
+Showitems = \showitems\nombres\par
+liste entière = \nombres[]\par
+Longueur = \nombreslen\par
+2\ieme{} élément = \nombres[2]\par
+-1\ieme{} élément = \nombres[-1]\par
+-5\ieme{} élément = \nombres[-5]
+
+\section{Séparateurs = \char`\&{} et \char`\\\char `\\}
+\setsepchar{\\/&}
+\readlist\foo{1 & 2 & 3\\ a & b& \\ x & & z}
+Showitems[] = \showitems*\foo\par
+Showitems[2] = \showitems*\foo[2]\par
+Showitems[2,1] = \showitems*\foo[2,1]\par% ERREUR : trop grande profondeur
+Foreachitem = \foreachitem\myitem\in\foo[3]{\myitemcnt = "\myitem"\qquad}\par
+élément [-2,-3] = "\foo[-2,-3]"\par
+
+\section{Séparateurs = \char`\^\char`\^M actif et ponctuations}
+\begingroup
+\obeylines
+\ignoreemptyitems
+\setsepchar{^^M/ ||,||'||-||:||;||.}%
+\readlist\poeme{C'est un trou de verdure où chante une rivière,
+Accrochant follement aux herbes des haillons
+D'argent ; où le soleil, de la montagne fière,
+Luit : c'est un petit val qui mousse de rayons.}% « Le dormeur du val », Arthur Rimbaud
+\begingroup% dans ce groupe
+\renewcommand\showitemsmacro[1]{% aller à la ligne (\par) après chaque élément
+ \begingroup\fboxsep=0.25pt \fboxrule=0.5pt \fbox{\strut#1}\endgroup\par
+}
+Showitems[] =
+\showitems\poeme
+\endgroup% revenir à la macro \showitemsmacro par défaut
+\medbreak
+
+Nombre de vers = \poemelen{} ou \listlen\poeme[]
+Mots du 1\ier{} vers = \showitems\poeme[1]
+Mots du dernier vers = \showitems\poeme[-1]
+4\ieme{} mot du premier vers = "\poeme[1,4]"
+5\ieme{} mot du 3\ieme{} vers = "\poeme[3,5]"
+\medbreak
+
+\textbf{Rimes} :
+\foreachitem\vers\in\poeme{vers \no\verscnt{} : \poeme[\verscnt,-1]\par}
+\endgroup
+\end{document}
\ No newline at end of file
Property changes on: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-latex.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf
===================================================================
(Binary files differ)
Index: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf 2024-02-11 02:14:22 UTC (rev 69791)
Property changes on: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.tex (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -0,0 +1,140 @@
+% !TeX TS-program = luatex
+% Ceci est le fichier de test (pdf)(Xe)(lua)tex de l'entension listofitems
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Mise en garde : lorsqu'il est compilé, ce fichier DOIT générer des erreurs aux %
+% endroits où figure "ERREUR" dans le code source. %
+% Ces erreurs sont émises par l'extension listofitems lorsqu'un %
+% argument ou un index est erroné et qu'une solution est %
+% prévue. %
+% Le fichier pdf DOIT être généré. %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+\hsize = \dimexpr 21cm - 2in \relax
+\vsize = \dimexpr 29.7cm - 2in \relax
+
+\input listofitems.tex
+
+\newcount\sectioncnt
+\def\section#1{\advance \sectioncnt1 \bigbreak{\loisectionfont \the\sectioncnt\quad #1\par}\smallbreak}
+\def\expo#1{\penalty10000 \raise0.66667ex \hbox{\loiexpofont#1}}
+\font\loititlefont=ecbx2000 % titre
+\font\loisectionfont=ecbx1200 % section
+\font\loiexpofont=ecrm1000 at 8pt % exposant
+\font\loitextfont=ecrm1000 % texte
+\font\loitextfontbf=ecbx1000 % gras
+
+\catcode`\;=13 \def;{\unskip\penalty10000 \ \string;}% caractères actifs de ponctuation française
+\catcode`\:=13 \def:{\unskip\penalty10000 \ \string:}
+
+%%%%% DÉBUT DU DOCUMENT
+\loitextfont
+\parindent=0pt
+\centerline{\loititlefont Fichier de test (luatex)}
+\par\vskip1.5cm
+
+\section{Séparateur vide}
+Separateur vide :\setsepchar{}% ERREUR : le séparateur "," est pris par défaut
+\readlist\castordu{a aa, b , c cc }
+\showitems\castordu
+
+\section{Liste vide}
+Liste vide :\setsepchar{*}
+\readlist\listevide{}% ERREUR
+Showitems = \showitems\listevide\par% ne donne rien, pas d'erreur
+3\expo{e} élément = \listevide[3]\par% ne donne rien, pas d'erreur
+Longueur = \listevidelen% affiche 0
+
+\section{Cas standard}
+\setsepchar{+}
+Lecture par défaut,\readlist\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Lecture sans élément vide,\ignoreemptyitems
+\readlist\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Lecture sans élément vide ni espace extrêmes,\ignoreemptyitems
+\readlist*\maliste{123+ 456 + ++\par+{+}+* *}
+showitems = \showitems*\maliste
+
+Longueur = \malistelen\par
+liste entière = \maliste[]\par
+2\expo{e} élément = \maliste[2]\par
+-1\expo{e} élément = \maliste[-1]\par
+-2\expo{e} élément = \maliste[-2]\par
+-7\expo{e} élément = \maliste[-7]\par% ERREUR, doit afficher la liste entière
+7\expo{e} élément = \maliste[7]% ERREUR, doit afficher la liste entière
+
+\section{Séparateur = \char`\\par}
+\def\laliste{a b c \par def\par\par xyz}
+\reademptyitems
+\setsepchar{\par}
+Lecture par défaut, \readlist\maliste\laliste
+showitems = \showitems\maliste
+
+Lecture sans élément vide, \ignoreemptyitems
+\readlist\maliste\laliste
+showitems = \showitems\maliste
+
+\section{Séparateur = caractère actif}
+\begingroup
+\catcode`\!=13 \def!{|}
+\setsepchar{!}
+\readlist\foo{!1 ! 2 !! 3!}
+Showitems = \showitems\foo\par
+liste entière = \foo[]\par
+2\expo{e} élément = \foo[2]\par
+-1\expo{er} élément = \foo[-1]\par
+-5\expo{e} élément = \foo[-5]\par% ERREUR, doit afficher la liste entière
+\endgroup
+
+\section{Séparateurs = +\quad -\quad *\quad /}
+\setsepchar[.]{+||-||*||/}
+\def\expression{3 + 2*7 - 4*9/5 - 1}
+\readlist*\nombres\expression
+Showitems = \showitems\nombres\par
+liste entière = \nombres[]\par
+Longueur = \nombreslen\par
+2\expo{e} élément = \nombres[2]\par
+-1\expo{e} élément = \nombres[-1]\par
+-5\expo{e} élément = \nombres[-5]
+
+\section{Séparateurs = \char`\&{} et \char`\\\char `\\}
+\setsepchar{\\/&}
+\readlist\foo{1 & 2 & 3\\ a & b& \\ x & & z}
+Showitems[] = \showitems*\foo\par
+Showitems[2] = \showitems*\foo[2]\par
+Showitems[2,1] = \showitems*\foo[2,1]\par% ERREUR : trop grande profondeur
+Foreachitem = \foreachitem\myitem\in\foo[3]{\myitemcnt = "\myitem"\qquad}\par
+élément [-2,-3] = "\foo[-2,-3]"\par
+
+\section{Séparateurs = \char`\^\char`\^M actif et ponctuations}
+\begingroup
+\obeylines
+\ignoreemptyitems
+\setsepchar{^^M/ ||,||'||-||:||;||.}%
+\readlist\poeme{C'est un trou de verdure où chante une rivière,
+Accrochant follement aux herbes des haillons
+D'argent ; où le soleil, de la montagne fière,
+Luit : c'est un petit val qui mousse de rayons.}% « Le dormeur du val », Arthur Rimbaud
+\begingroup% dans ce groupe
+\def\showitemsmacro#1{% aller à la ligne (\par) après chaque élément
+ \begingroup\fboxsep=0.25pt \fboxrule=0.5pt \fbox{\strut#1}\endgroup\par
+}
+Showitems[] =
+\showitems\poeme
+\endgroup% revenir à la macro \showitemsmacro par défaut
+\medbreak
+
+Nombre de vers = \poemelen{} ou \listlen\poeme[]
+Mots du 1er vers = \showitems\poeme[1]
+Mots du dernier vers = \showitems\poeme[-1]
+4\expo{e} mot du premier vers = "\poeme[1,4]"
+5\expo{e} mot du 3e vers = "\poeme[3,5]"
+\medbreak
+
+{\loitextfontbf Rimes} :
+\foreachitem\vers\in\poeme{vers n\expo{\unkern o}\verscnt{} : \poeme[\verscnt,-1]\par}
+\endgroup
+\bye
\ No newline at end of file
Property changes on: trunk/Master/texmf-dist/doc/generic/listofitems/test/listofitems-test-tex.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/generic/listofitems/listofitems.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/listofitems/listofitems.tex 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/tex/generic/listofitems/listofitems.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -1,24 +1,20 @@
-% !TeX encoding = ISO-8859-1
% Ce fichier contient le code de l'extension "listofitems"
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
\def\loiname {listofitems} %
-\def\loiver {1.63} %
+\def\loiver {1.64} %
% %
-\def\loidate {2019/08/21} %
+\def\loidate {2024/02/10} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
-% Author : Christian Tellechea, Steven B. Segletes (contributor) %
+% Author : Christian Tellechea %
% Status : Maintained %
% Maintainer : Christian Tellechea %
% Email : unbonpetit at netc.fr %
-% steven.b.segletes.civ at mail.mil %
% Package URL: https://www.ctan.org/pkg/listofitems %
-% Bug tracker: https://framagit.org/unbonpetit/listofitems/issues %
-% Repository : https://framagit.org/unbonpetit/listofitems/tree/master
-% Copyright : Christian Tellechea 2016-2019 %
+% Copyright : Christian Tellechea 2016-2024 %
% Licence : Released under the LaTeX Project Public License v1.3c %
% or later, see http://www.latex-project.org/lppl.txt %
% Files : 1) listofitems.tex %
@@ -28,43 +24,51 @@
% 5) listofitems-en.tex %
% 6) listofitems-en.pdf %
% 7) README %
+% 8) listofitems-test-tex.tex %
+% 9) listofitems-test-tex.pdf %
+% 10) listofitems-test-latex.tex %
+% 11) listofitems-test-latex.pdf %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\expandafter\edef\csname loi_restorecatcode\endcsname{\catcode\number`\_=\number\catcode`\_\relax}
+\csname loiloadonce\endcsname
+\let\loiloadonce\endinput
+\expandafter\edef\csname loi_restorecatcode\endcsname{%
+ \catcode\number`\_=\number\catcode`\_\relax
+}
\catcode`\_11
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% gestion des erreurs + annonce package %%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\unless\ifdefined\loi_fromsty
- \immediate\write -1 {Package: \loidate\space v\loiver\space Grab items in lists using user-specified sep char (CT)}%
-\fi
-
-\ifdefined\PackageError
+\ifdefined\loi_fromsty
\def\loi_error#1{\PackageError\loiname{#1}{Read the \loiname\space manual}}% pour LaTeX
\else
\def\loi_error#1{\errmessage{Package \loiname\space Error: #1^^J}}% pour TeX
+ \immediate\write -1 {Package: \loidate\space v\loiver\space Grab items in lists using user-specified sep char (CT)}%
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%% v\xE9rification des pr\xE9requis %%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%% vérification des prérequis %%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\loi_checkprimitive#1#2#3{% V\xE9rifie que #1 est une primitive et sinon, \xE9met le message #2 et ex\xE9cute #3
+\def\loi_checkprimitive#1#2{% Vérifie que #1 est une primitive et sinon, émet le message #2 et exécute \endinput
\begingroup
- \edef\__tempa{\meaning#1}\edef\__tempb{\string#1}\expandafter
+ \edef\__tempa{\meaning#1}%
+ \edef\__tempb{\string #1}%
+ \expandafter
\endgroup
\ifx\__tempa\__tempb\else
\loi_error{#2}%
- \def\loi_temp{#3}%
- \loi_restorecatcode\expandafter\loi_temp
+ \loi_restorecatcode
+ \expandafter\endinput
\fi
}
\loi_checkprimitive\eTeXversion
- {You are not using an eTeX engine, listofitems cannot work.}
- {\endinput}%
+ {%
+ You are not using an eTeX engine, listofitems cannot work.%
+ }%
\loi_checkprimitive\expanded
- {the \string\expanded\space primitive is not provided by your TeX engine, listofitems v\loiver\space cannot work: loading listofitems v1.61}
- {\input listofitemsold.tex\relax\endinput}%
+ {%
+ The \string\expanded\space primitive is not provided by your TeX engine, , listofitems cannot work.%
+ }%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% macros auxiliaires %%%%%%%%%%%%%%%%%%%%%%%%%
@@ -76,11 +80,22 @@
\long\def\loi_second#1#2{#2}
\long\def\loi_firsttonil#1#2\_nil{#1}
\long\def\loi_antefi#1#2\fi{#2\fi#1}
-\long\def\loi_exparg#1#2{\expandafter\loi_exparg_a\expandafter{#2}{#1}}% \loi_exparg{<a>}{<b>} devient <a>{<*b>}
+\long\def\loi_exparg#1#2{%
+ \expandafter\loi_exparg_a\expandafter{#2}{#1}% \loi_exparg{<a>}{<b>} devient <a>{<*b>}
+}
\long\def\loi_exparg_a#1#2{#2{#1}}
-\long\def\loi_expafter#1#2{\expandafter\loi_expafter_a\expandafter{#2}{#1}}% \loi_expafter{<a>}{<b>} devient <a><*b>
+\long\def\loi_expafter#1#2{%
+ \expandafter\loi_expafter_a\expandafter{#2}{#1}% \loi_expafter{<a>}{<b>} devient <a><*b>
+}
\long\def\loi_expafter_a#1#2{#2#1}
-\def\loi_macroname{\loi_ifinrange\escapechar[[0:255]]{\expandafter\loi_gobarg}{}\string}
+\def\loi_macroname{%
+ \loi_ifinrange\escapechar[[0:255]]%
+ {%
+ \expandafter\loi_gobarg
+ }
+ {%
+ }%
+ \string}
\def\loi_argcsname#1#{\loi_argcsname_a{#1}}
\def\loi_argcsname_a#1#2{\loi_expafter{#1}{\csname#2\endcsname}}
\long\def\loi_addtomacro#1#2{\loi_exparg{\def#1}{#1#2}}
@@ -88,34 +103,64 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%% macros de test %%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\long\def\loi_ifnum#1{\ifnum#1\expandafter\loi_first\else\expandafter\loi_second\fi}
-\long\def\loi_ifx#1{\ifx#1\expandafter\loi_first\else\expandafter\loi_second\fi}
-\long\def\loi_ifempty#1{\loi_exparg\loi_ifx{\expandafter\relax\detokenize{#1}\relax}}
-\def\loi_ifstar#1#2{\def\loi_ifstar_a{\loi_ifx{*\loi_nxttok}{\loi_first{#1}}{#2}}\futurelet\loi_nxttok\loi_ifstar_a}
+\long\def\loi_ifnum#1{%
+ \ifnum#1%
+ \expandafter\loi_first
+ \else
+ \expandafter\loi_second
+ \fi
+}
+\long\def\loi_ifx#1{%
+ \ifx#1%
+ \expandafter\loi_first
+ \else
+ \expandafter\loi_second
+ \fi
+}
+\long\def\loi_ifempty#1{%
+ \loi_exparg\loi_ifx{\expandafter\relax\detokenize{#1}\relax}%
+}
+\def\loi_ifstar#1#2{%
+ \def\loi_ifstar_a{\loi_ifx{*\loi_nxttok}{\loi_first{#1}}{#2}}%
+ \futurelet\loi_nxttok\loi_ifstar_a
+}
\edef\loi_escapechar{\expandafter\loi_gobarg\string\\}
-\long\def\loi_ifcsexpandable#1{% #1 est-il constitu\xE9 d'une seule sc _d\xE9veloppable_ ?
+\long\def\loi_ifcsexpandable#1{% #1 est-il constitué d'une seule sc _développable_ ?
\loi_ifempty{#1}
- {\loi_second
+ {%
+ \loi_second
}
{\loi_ifspacefirst{#1}
- {\loi_second% si espace en 1er, faux
+ {%
+ \loi_second% si espace en 1er, faux
}
- {\csname loi_\if\loi_escapechar\expandafter\loi_firsttonil\detokenize{#1}\_nil first\else second\fi\endcsname
- {\loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul arg commen\xE7ant par "\" ?
- {\def\loi_tempa{#1}\loi_exparg{\def\loi_tempb}{#1}% est-il d\xE9veloppable ?
+ {%
+ \csname loi_\if\loi_escapechar\expandafter\loi_firsttonil\detokenize{#1}\_nil first\else second\fi\endcsname
+ {%
+ \loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul arg commençant par "\" ?
+ {%
+ \def\loi_tempa{#1}\loi_exparg{\def\loi_tempb}{#1}% est-il développable ?
\expandafter\unless\loi_ifx{\loi_tempa\loi_tempb}%
}
- {\loi_second
+ {%
+ \loi_second
}%
}
- {\loi_second
+ {%
+ \loi_second
}%
}%
}%
}
-\def\loi_ifinrange#1[[#2:#3]]{\expandafter\unless\loi_ifnum{\numexpr(#1-#2)*(#1-#3)>0 }}
+\def\loi_ifinrange#1[[#2:#3]]{%
+ \expandafter\unless\loi_ifnum{\numexpr(#1-#2)*(#1-#3)>0 }%
+}
\def\loi_ifstring#1#2{% si la chaine #1 est contenue dans #2
- \def\loi_ifstring_a##1#1##2\_nil{\loi_ifempty{##2}\loi_second\loi_first}%
+ \def\loi_ifstring_a##1#1##2\_nil{%
+ \loi_ifempty{##2}
+ \loi_second
+ \loi_first
+ }%
\loi_ifstring_a#2#1\_nil% appel de la macro auxiliaire
}
@@ -122,8 +167,9 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%% macro \loi_foreach %%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcount\loi_cnt_foreach_nest \loi_cnt_foreach_nest=0
-\def\end_foreach{\end_foreach}
+\newcount\loi_cnt_foreach_nest
+\loi_cnt_foreach_nest=0
+\def\end_foreach{\end_foreach}% quark
\def\loi_def_foreachsep#1{%
\long\def\loi_foreach##1\in##2##3{%
\global\advance\loi_cnt_foreach_nest1
@@ -136,7 +182,8 @@
\def##1{##2}%
\loi_ifx{\end_foreach##1}
{}
- {\csname loop_code_\number\loi_cnt_foreach_nest\endcsname% ex\xE9cute le code
+ {%
+ \csname loop_code_\number\loi_cnt_foreach_nest\endcsname% exécute le code
\loi_foreach_a##1%
}%
}%
@@ -143,29 +190,38 @@
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%% macros g\xE9rant l'appariement %%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%% macros gérant l'appariement %%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\long\def\defpair#1{%
\let\loi_listofpair\empty
\loi_ifempty{#1}
- {}
- {\defpair_a{}#1\loi_quark\loi_quark}%
+ {%
+ }
+ {%
+ \defpair_a{}#1\loi_quark\loi_quark
+ }%
}
\long\def\defpair_a#1#2#3{%
\loi_ifx{\loi_quark#2}
- {\def\loi_sanitizelist##1,\_nil{\def\loi_listofpair{##1}}%
+ {%
+ \def\loi_sanitizelist##1,\_nil{\def\loi_listofpair{##1}}%
\loi_sanitizelist#1\_nil
}
- {\loi_if_validpair#2#3%
- {\long\def\loi_paired_a{#2}\long\def\loi_paired_b{#3}%
+ {%
+ \loi_if_validpair#2#3%
+ {%
+ \long\def\loi_paired_a{#2}\long\def\loi_paired_b{#3}%
\loi_ifx{\loi_paired_a\loi_paired_b}
- {\loi_error{Paired tokens must not be equal, the pair \detokenize{#2#3} is ignored}%
+ {%
+ \loi_error{Paired tokens must not be equal, the pair \detokenize{#2#3} is ignored}%
\defpair_a{#1}%
}
- {\defpair_a{#1#2#3,}%
+ {%
+ \defpair_a{#1#2#3,}%
}%
}
- {\loi_error{Invalid paired tokens, the pair "\detokenize{#2}" and "\detokenize{#3}" is ignored}%
+ {%
+ \loi_error{Invalid paired tokens, the pair "\detokenize{#2}" and "\detokenize{#3}" is ignored}%
\defpair_a{#1}%
}%
}%
@@ -172,92 +228,138 @@
}
\long\def\loi_if_validpair#1#2{%
\def\loi_validpair{1}%
- \loi_if_invalid_pairtoken{#1}{\def\loi_validpair{0}}%
- \loi_if_invalid_pairtoken{#2}{\def\loi_validpair{0}}%
+ \loi_if_invalid_pairtoken{#1}
+ {%
+ \def\loi_validpair{0}%
+ }%
+ \loi_if_invalid_pairtoken{#2}
+ {%
+ \def\loi_validpair{0}%
+ }%
\loi_ifnum{\loi_validpair=1 }
}
\long\def\loi_if_invalid_pairtoken#1{%
\loi_ifempty{#1}
- {\loi_identity
+ {%
+ \loi_identity
}
- {\loi_ifspacefirst{#1}
- {\loi_identity
+ {%
+ \loi_ifspacefirst{#1}
+ {%
+ \loi_identity
}
- {\loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul token ?
- {\ifcat\relax\noexpand#1\expandafter\loi_identity\else\expandafter\loi_gobarg\fi}
- {\loi_identity}% si plusieurs tokens, faux
+ {%
+ \loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul token ?
+ {%
+ \ifcat\relax\noexpand#1%
+ \expandafter\loi_identity
+ \else
+ \expandafter\loi_gobarg
+ \fi
+ }
+ {%
+ \loi_identity% si plusieurs tokens, faux
+ }%
}%
}%
}
-\long\def\loi_count_occur#1\in#2:#3{% compte le nombre d'occurrences de #1 dans #2 et met le r\xE9sultat dans la macro #3
+\long\def\loi_count_occur#1\in#2:#3{% compte le nombre d'occurrences de #1 dans #2 et met le résultat dans la macro #3
\long\def\loi_count_occur_a##1##2#1##3\_nil{%
\loi_ifempty{##3}
- {\def#3{##1}}
- {\expandafter\loi_count_occur_a\number\numexpr##1+1\relax##3\_nil}%
+ {%
+ \def#3{##1}%
+ }
+ {%
+ \expandafter\loi_count_occur_a\number\numexpr##1+1\relax##3\_nil
+ }%
}%
\loi_count_occur_a0#2#1\_nil
}
\long\def\loi_check_pair#1#2\in#3{% teste l'appariement de #1 et #2 dans #3
\loi_ifempty{#3}
- {\loi_second
+ {%
+ \loi_second
}
- {\loi_count_occur#1\in#3:\loi_tempa
+ {%
+ \loi_count_occur#1\in#3:\loi_tempa
\loi_count_occur#2\in#3:\loi_tempb
\loi_ifnum{\loi_tempa=\loi_tempb\relax}%
}%
}
-\long\def\loi_grabpaired_expr#1#2#3#4#5{% #1=liste de paires #2=expression #3=s\xE9parateur #4=r\xE9sultat #5=ce qui reste
+\long\def\loi_grabpaired_expr#1#2#3#4#5{% #1=liste de paires #2=expression #3=séparateur #4=résultat #5=reste
\let#4\empty
\def\loi_remain{#2#3}%
- \loi_foreach\loi_pair\in{#1}{\expandafter\loi_grabpaired_expr_a\loi_pair{#3}#4}%
+ \loi_foreach\loi_pair\in{#1}{%
+ \expandafter\loi_grabpaired_expr_a\loi_pair{#3}#4%
+ }%
\def\loi_remove_lastsep##1#3\_nil{\def#4{##1}}%
\expandafter\loi_remove_lastsep#4\_nil
\loi_expafter{\long\def\loi_grab_remain}#4##1\_nil{%
\loi_ifempty{##1}
- {\let#5\empty}
- {\loi_exparg{\def#5}{\loi_gobarg##1}}%
+ {%
+ \let#5\empty
+ }
+ {%
+ \loi_exparg{\def#5}{\loi_gobarg##1}%
+ }%
}%
\loi_grab_remain#2\_nil
}
-\long\def\loi_grabpaired_expr_a#1#2#3#4{% #1#2=paire en cours #3=s\xE9parateur #4=r\xE9sultat
- \loi_exparg{\loi_check_pair#1#2\in}#4% si les paires sont appari\xE9es dans le r\xE9sultat
- {}% passer \xE0 la paire suivante
- {\long\def\loi_grabpaired_expr_b##1#3##2\_nil{%
- \loi_addtomacro#4{##1#3}% ajouter au r\xE9sultat ce qui est jusqu'au prochain s\xE9parateur
+\long\def\loi_grabpaired_expr_a#1#2#3#4{% #1#2=paire en cours #3=séparateur #4=résultat
+ \loi_exparg{\loi_check_pair#1#2\in}#4% si les paires sont appariées dans le résultat
+ {%
+ }% passer à la paire suivante
+ {%
+ \long\def\loi_grabpaired_expr_b##1#3##2\_nil{%
+ \loi_addtomacro#4{##1#3}% ajouter au résultat ce qui est jusqu'au prochain séparateur
\def\loi_remain{##2}%
\loi_exparg{\loi_check_pair#1#2\in}{#4}
- {}
- {\loi_ifempty{##2}
- {\loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired}}
- {\loi_grabpaired_expr_b##2\_nil}%
+ {%
+ }
+ {%
+ \loi_ifempty{##2}
+ {%
+ \loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired}%
+ }
+ {%
+ \loi_grabpaired_expr_b##2\_nil
+ }%
}%
}%
\expandafter\loi_grabpaired_expr_b\loi_remain\_nil
}%
}
-\def\insidepair#1#2#3#4{% #1#2=paire #3=expr #4=macro re\xE7evant le resultat
+\def\insidepair#1#2#3#4{% #1#2=paire #3=expr #4=macro reçevant le resultat
\loi_if_validpair#1#2%
- {\loi_ifcsexpandable{#3}
- {\loi_exparg{\insidepair#1#2}{#3}#4%
+ {%
+ \loi_ifcsexpandable{#3}
+ {%
+ \loi_exparg{\insidepair#1#2}{#3}#4%
}
- {\loi_check_pair#1#2\in{#3}% si les paires sont appari\xE9es dans le r\xE9sultat
- {\def\insidepair_a##1#1##2\_nil{\insidepair_b##2\_nil{#1}}%
+ {%
+ \loi_check_pair#1#2\in{#3}% si les paires sont appariées dans le résultat
+ {%
+ \def\insidepair_a##1#1##2\_nil{\insidepair_b##2\_nil{#1}}%
\def\insidepair_b##1#2##2\_nil##3{%
\loi_check_pair#1#2\in{##3##1#2}
- {\loi_exparg{\def#4}{\loi_gobarg##3##1}%
+ {%
+ \loi_exparg{\def#4}{\loi_gobarg##3##1}%
\def\loi_remainafterparen{##2}%
}%
- {\insidepair_b##2\_nil{##3##1#2}%
+ {%
+ \insidepair_b##2\_nil{##3##1#2}%
}%
}%
\insidepair_a#3\_nil
}
- {\loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired in "#3"}%
+ {%
+ \loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired in "#3"}%
}%
}%
}
- {\loi_error{Invalid paired tokens "\detokenize{#1}" and "\detokenize{#2}", empty \string#4 returned}% et bim
- \let#4\empty% voil\xE0, bien fait pour vos gueules
+ {%
+ \loi_error{Invalid paired tokens "\detokenize{#1}" and "\detokenize{#2}", empty \string#4 returned}% et bim
+ \let#4\empty% voilà, bien fait pour vos gueules
}%
}
@@ -276,17 +378,26 @@
\def#1{%
\unless\ifnum#5#3#2\relax
\loi_antefi{#6\edef#5{\number\numexpr#5#41\relax}#1}%
- \fi}%
+ \fi%
+ }%
#1%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%% macro retirant les espaces extr\xEAmes %%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%% macro retirant les espaces extrêmes %%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\long\def\loi_ifspacefirst#1{\expandafter\loi_ifspacefirst_a\detokenize{#10} \_nil}
-\long\def\loi_ifspacefirst_a#1 #2\_nil{\loi_ifempty{#1}}
+\long\def\loi_ifspacefirst#1{%
+ \expandafter\loi_ifspacefirst_a\detokenize{#10} \_nil
+}
+\long\def\loi_ifspacefirst_a#1 #2\_nil{%
+ \loi_ifempty{#1}%
+}
\loi_expafter{\def\loi_gobspace}\space{}
-\long\def\loi_removefirstspaces#1{\loi_ifspacefirst{#1}{\loi_exparg\loi_removefirstspaces{\loi_gobspace#1}}{\unexpanded{#1}}}%##BUGFIX v1.63
+\long\def\loi_removefirstspaces#1{%##BUGFIX v1.63
+ \loi_ifspacefirst{#1}
+ {\loi_exparg\loi_removefirstspaces{\loi_gobspace#1}}
+ {\unexpanded{#1}}%
+}%
\begingroup
\catcode0 12
\long\gdef\loi_removelastspaces#1{\loi_removelastspaces_a#1^^00 ^^00\_nil}
@@ -299,29 +410,43 @@
%%%%%%%%%%%%%%%%%%%%% macro publique \setsepchar %%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\setsepchar{\futurelet\loi_nxttok\setsepchar_a}
-\def\setsepchar_a{\loi_ifx{[\loi_nxttok}\setsepchar_b{\setsepchar_b[/]}}
+\def\setsepchar_a{%
+ \loi_ifx{[\loi_nxttok}
+ {%
+ \setsepchar_b
+ }
+ {%
+ \setsepchar_b[/]%
+ }%
+}
\long\def\setsepchar_b[#1]#2{% #1=sepcar de <liste des sepcar> #2=<liste des sepcar>
\loi_ifempty{#1}
- {\loi_error{Empty separator not allowed, separator "/" used}%
+ {%
+ \loi_error{Empty separator not allowed, separator "/" used}%
\setsepchar_b[/]{#2}%
}
- {\def\loi_currentsep{#1}%
- \_removeextremespacesfalse
- \loi_nestcnt1 % r\xE9initaliser niveau initial \xE0 1
+ {%
+ \def\loi_currentsep{#1}%
+ \_loi_removeextremespacesfalse
+ \loi_nestcnt1 % réinitaliser niveau initial à 1
\def\nestdepth{1}%
\loi_argcsname\let{loi_previndex[\number\loi_nestcnt]}\empty
\def\loi_listname{loi_listofsep}%
- \let\loi_def\def \let\loi_edef\edef \let\loi_let\let
+ \let\loi_def\def
+ \let\loi_edef\edef
+ \let\loi_let\let
\let\loi_listofpair_saved\loi_list_ofpair
\let\loi_list_ofpair\empty
\loi_ifempty{#2}
- {\loi_error{Empty list of separators not allowed, "," used}%
+ {%
+ \loi_error{Empty list of separators not allowed, "," used}%
\readlist_g1{,}%
}
- {\readlist_g1{#2}%
+ {%
+ \readlist_g1{#2}%
}%
\loi_argcsname\let\nestdepth{loi_listofseplen[0]}%
- \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de s\xE9paration
+ \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de séparation
\let\loi_listofpair\loi_listofpair_saved
}%
}
@@ -329,60 +454,113 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%% macro normalisant l'index %%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\loi_normalizeindex#1#2{% #1=macroname #2=liste d'index --> renvoie {err}{indx norm}
- \loi_ifempty{#2}
- {{}{}}
- {\loi_exparg{\loi_normalizeindex_a1{}}{\number\csname#1nest\endcsname}{#1}#2,\loi_quark,}%
+\def\loi_normalizeindex#1#2#3{% #1=correction de profondeur #2=macroname #3=liste d'index --> renvoie {err}{indx norm}
+ \loi_ifempty{#3}
+ {%
+ {}{}%
+ }
+ {%
+ \loi_exparg{\loi_normalizeindex_a1{}}{\number\numexpr\csname#2nest\endcsname-#1\relax}{#2}#3,\loi_quark,%
+ }%
}%
-\def\loi_normalizeindex_a#1#2#3#4#5,{% #1=compteur de profondeur #2=index pr\xE9c\xE9dents #3=profondeur max #4=macroname #5=index courant
+\def\loi_normalizeindex_a#1#2#3#4#5,{% #1=compteur de profondeur #2=index précédents #3=profondeur max #4=macroname #5=index courant
\loi_ifx{\loi_quark#5}
- {\loi_normalizeindex_c#2\loi_quark% supprimer la derni\xE8re virgule
+ {%
+ \loi_normalizeindex_c#2\loi_quark% supprimer la dernière virgule
}
- {\loi_ifnum{#1>#3 }
- {\loi_invalidindex{Too deeply nested index, index [.] retained}{#2}% si profondeur trop grande
+ {%
+ \loi_ifnum{#1>#3 }
+ {%
+ \loi_invalidindex{Too deeply nested index, index [.] retained}{#2}% si profondeur trop grande
}
- {\loi_ifinrange\ifnum\numexpr#5<0 -1*\fi(#5)[[1:\csname #4len[#20]\endcsname]]% si abs(#5) hors de [1,len]
- {\loi_exparg\loi_normalizeindex_b{\number\numexpr#5\ifnum\numexpr#5<0 +\csname #4len[#20]\endcsname+1\fi}{#1}{#2}{#3}{#4}}
- {\loi_invalidindex{#5 is an invalid index, index [.] retained}{#2}}%
+ {%
+ \loi_ifinrange\ifnum\numexpr#5<0 -1*\fi(#5)[[1:\csname #4len[#20]\endcsname]]% si abs(#5) hors de [1,len]
+ {%
+ \loi_exparg\loi_normalizeindex_b
+ {\number\numexpr#5\ifnum\numexpr#5<0 +\csname #4len[#20]\endcsname+1\fi}%
+ {#1}%
+ {#2}%
+ {#3}%
+ {#4}%
+ }
+ {%
+ \loi_invalidindex{#5 is an invalid index, index [.] retained}{#2}%
+ }%
}%
}%
}
-\def\loi_normalizeindex_b#1#2#3{\loi_exparg\loi_normalizeindex_a{\number\numexpr#2+1}{#3#1,}}% #1=index \xE0 rajouter #2=compteur de profondeur #3=index pr\xE9c\xE9dents
+\def\loi_normalizeindex_b#1#2#3{%
+ \loi_exparg\loi_normalizeindex_a{\number\numexpr#2+1}{#3#1,}% #1=index à rajouter #2=compteur de profondeur #3=index précédents
+}
\def\loi_normalizeindex_c#1,\loi_quark{{}{#1}}
-\def\loi_invalidindex#1#2{\loi_ifempty{#2}{\loi_invalidindex_a{#1},}\loi_invalidindex_a{#1}{#2}}
-\def\loi_invalidindex_a#1#2{\loi_invalidindex_b#1\loi_quark#2\loi_quark}
-\def\loi_invalidindex_b#1[.]#2\loi_quark#3,\loi_quark#4\loi_quark,{{#1[#3]#2}{#3}}% #4= index ignor\xE9s
+\def\loi_invalidindex#1#2{%
+ \loi_ifempty{#2}
+ {%
+ \loi_invalidindex_a{#1},%
+ }
+ {%
+ \loi_invalidindex_a{#1}{#2}% BUGFIX 1.64
+ }%
+}
+\def\loi_invalidindex_a#1#2{%
+ \loi_invalidindex_b#1\loi_quark#2\loi_quark
+}
+\def\loi_invalidindex_b#1[.]#2\loi_quark#3,\loi_quark#4\loi_quark,{% #4= index ignorés
+ {#1[#3]#2}{#3}%
+}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%% macro publique \readlist %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcount\loi_nestcnt
-\def\greadlist{\let\loi_def\gdef\let\loi_edef\xdef\def\loi_let{\global\let}\readlist_a}%
-\def\readlist{\let\loi_def\def\let\loi_edef\edef\let\loi_let\let\readlist_a}
+\def\greadlist{%
+ \let\loi_def\gdef
+ \let\loi_edef\xdef
+ \def\loi_let{\global\let}%
+ \readlist_a
+}%
+\def\readlist{%
+ \let\loi_def\def
+ \let\loi_edef\edef
+ \let\loi_let\let
+ \readlist_a%
+}
\def\readlist_a{%
\loi_nestcnt1 % niveau initial = 1
\loi_argcsname\let{loi_previndex[\number\loi_nestcnt]}\empty
- \loi_ifstar{\_removeextremespacestrue\readlist_b}{\_removeextremespacesfalse\readlist_b}%
+ \loi_ifstar
+ {%
+ \_loi_removeextremespacestrue
+ \readlist_b
+ }
+ {%
+ \_loi_removeextremespacesfalse
+ \readlist_b
+ }%
}
-\long\def\readlist_b#1#2{% #1=macro stockant les \xE9l\xE9ments #2=liste des \xE9l\xE9ments
+\long\def\readlist_b#1#2{% #1=macro stockant les éléments #2=liste des éléments
\loi_ifcsexpandable{#2}
- {\loi_exparg{\readlist_b#1}{#2}%
+ {%
+ \loi_exparg{\readlist_b#1}{#2}%
}
- {\loi_edef\loi_listname{\loi_macroname#1}%
+ {%
+ \loi_edef\loi_listname{\loi_macroname#1}%
\loi_exparg{\readlist_c#1{#2}}{\loi_listname}%%
}%
}
-\long\def\readlist_c#1#2#3{% #1=macro stockant les \xE9l\xE9ments #2=liste des \xE9l\xE9ments #3=macroname
+\long\def\readlist_c#1#2#3{% #1=macro stockant les éléments #2=liste des éléments #3=macroname
\loi_argcsname\loi_let{#3nest}\nestdepth
- \loi_argcsname\loi_def{#3[]}{#2}% la liste enti\xE8re
- \loi_argcsname\loi_def{#3sep[]}{}% s\xE9parateur vide
+ \loi_argcsname\loi_def{#3[]}{#2}% la liste entière
+ \loi_argcsname\loi_def{#3sep[]}{}% séparateur vide
\loi_ifempty{#2}
- {\loi_def#1[##1]{}%
+ {%
+ \loi_def#1[##1]{}%
\loi_argcsname\loi_def{#3len}{0}\loi_argcsname\loi_def{#3len[0]}{0}%
\loi_error{Empty list ignored, nothing to do}%
}
- {\loi_def#1[##1]{\expanded{\expandafter\readlist_d\expanded{\loi_normalizeindex{#3}{##1}}{#3}}}%
- \loi_argcsname\loi_def{#3sep}[##1]{\expanded{\expandafter\readlist_d\expanded{\loi_normalizeindex{#3}{##1}}{#3sep}}}%
+ {%
+ \loi_def#1[##1]{\expanded{\expandafter\readlist_d\expanded{\loi_normalizeindex0{#3}{##1}}{#3}}}%
+ \loi_argcsname\loi_def{#3sep}[##1]{\expanded{\expandafter\readlist_d\expanded{\loi_normalizeindex0{#3}{##1}}{#3sep}}}%
\readlist_e{#2}%
\loi_argcsname\loi_argcsname\loi_let{#3len}{#3len[0]}% longueur du niveau 0
}%
@@ -395,67 +573,90 @@
\loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}%
\expandafter\readlist_f\loi_currentsep||\_nil
}
-\long\def\readlist_f#1||#2\_nil#3{\readlist_g1{#3#1}}% #1=<sep courant simple> #3=liste -> rajoute un \xE9l\xE9ment vide pour le test \ifempty ci dessous
-\long\def\readlist_g#1#2{% #1=compteur d'index #2=liste d'\xE9l\xE9ments \xE0 examiner termin\xE9e par <sep courant simple> >>RIEN laiss\xE9 apr\xE8s
+\long\def\readlist_f#1||#2\_nil#3{\readlist_g1{#3#1}}% #1=<sep courant simple> #3=liste -> rajoute un élément vide pour le test \ifempty ci dessous
+\long\def\readlist_g#1#2{% #1=compteur d'index #2=liste d'éléments à examiner terminée par <sep courant simple> >>RIEN laissé après
\loi_ifempty{#2}
- {\loi_argcsname\loi_edef{\loi_listname len[\csname loi_previndex[\number\loi_nestcnt]\endcsname0]}{\number\numexpr#1-1\relax}%
+ {%
+ \loi_argcsname\loi_edef{\loi_listname len[\csname loi_previndex[\number\loi_nestcnt]\endcsname0]}{\number\numexpr#1-1\relax}%
\loi_argcsname\loi_let{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname\number\numexpr#1-1\relax]}\empty% le dernier <sep> est <vide> ##NEW v1.52
\advance\loi_nestcnt-1
\loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}%
}
- {\loi_expafter{\readlist_h{#2}{}}\loi_currentsep||\loi_quark||#2\_nil{#1}% aller isoler le 1er item
+ {%
+ \loi_expafter{\readlist_h{#2}{}}\loi_currentsep||\loi_quark||#2\_nil{#1}% aller isoler le 1er item
}%
}
-\long\def\readlist_h#1#2#3||{% #1=liste restante #2=<dernier sep utilis\xE9> #3=<sep courant>
- \loi_ifx{\loi_quark#3}% on a \xE9puis\xE9 tous les <s\xE9parateurs> ? RESTE \xE0 lire <expr+sep1>\_nil{<compteur>}
- {\loi_ifempty{#2}% si #2 vide, aucun <sep utilis\xE9> n'a \xE9t\xE9 trouv\xE9, il reste \xE0 lire "<liste compl\xE8te>\_nil"
- {\long\def\readlist_i##1\_nil##2{\loi_exparg{\readlist_j{##2}{}}{\loi_gobarg##1}{#2}}% ##2=compteur d'index
+\long\def\readlist_h#1#2#3||{% #1=liste restante #2=<dernier sep utilisé> #3=<sep courant>
+ \loi_ifx{\loi_quark#3}% on a épuisé tous les <séparateurs> ? RESTE à lire <expr+sep1>\_nil{<compteur>}
+ {%
+ \loi_ifempty{#2}% si #2 vide, aucun <sep utilisé> n'a été trouvé, il reste à lire "<liste complète>\_nil"
+ {%
+ \long\def\readlist_i##1\_nil##2{\loi_exparg{\readlist_j{##2}{}}{\loi_gobarg##1}{#2}}% ##2=compteur d'index
}
- {\loi_ifx{\loi_listofpair\empty}% paires d\xE9finies ?
- {\long\def\readlist_i##1#2##2\_nil##3{\loi_exparg{\readlist_j{##3}{##2}}{\loi_gobarg##1}{#2}}%
+ {%
+ \loi_ifx{\loi_listofpair\empty}% paires définies ?
+ {%
+ \long\def\readlist_i##1#2##2\_nil##3{\loi_exparg{\readlist_j{##3}{##2}}{\loi_gobarg##1}{#2}}%
}
- {\long\def\readlist_i##1\_nil##2{%
+ {%
+ \long\def\readlist_i##1\_nil##2{%
\loi_exparg{\loi_exparg\loi_grabpaired_expr\loi_listofpair}{\loi_gobarg##1}{#2}\loi_grabpaired_result\loi_grabpaired_remain
\loi_exparg{\loi_exparg{\readlist_j{##2}}{\loi_grabpaired_remain}}{\loi_grabpaired_result}{#2}}%{#}
}%
}%
- \readlist_i\relax% le \relax meuble l'argument d\xE9limit\xE9
+ \readlist_i\relax% le \relax meuble l'argument délimité
}
- {\long\def\readlist_i##1#3##2\_nil{%
+ {%
+ \long\def\readlist_i##1#3##2\_nil{%
\loi_ifempty{##2}% si <liste restante> ne contient pas le <sep courant>
- {\readlist_h{#1}{#2}% recommencer avec le m\xEAme <sep utile>
+ {%
+ \readlist_h{#1}{#2}% recommencer avec le même <sep utile>
}%
- {\loi_ifx{\loi_listofpair\empty}% si pas de paires d\xE9finies
- {\loi_exparg\readlist_h{\loi_gobarg##1#3}{#3}% raccourcir <liste restante> et <sep courant>:=<sep utile>% ##BUGFIX v1.53
+ {%
+ \loi_ifx{\loi_listofpair\empty}% si pas de paires définies
+ {%
+ % ##BUGFIX v1.53 (manger le \relax)
+ % ##BUGFIX v 1.64 (##2 n'étant pas vide, ne pas ajouter #3 après ##1
+ % puisque #3 subsiste toujours avant le \_nil)
+ \loi_exparg\readlist_h{\loi_gobarg##1}{#3}% raccourcir <liste restante> et <sep courant>:=<sep utile>
}%
- {\loi_exparg\loi_grabpaired_expr\loi_listofpair{#1#3}{#3}\loi_grabpaired_result\loi_grabpaired_remain
+ {%
+ \loi_exparg\loi_grabpaired_expr\loi_listofpair{#1#3}{#3}\loi_grabpaired_result\loi_grabpaired_remain
\loi_ifx{\loi_grabpaired_remain\empty}% si liste non raccourcie #BUGFIX 1.63
- {\loi_exparg\readlist_h{\loi_grabpaired_result}{#2}}% garder le pr\xE9c\xE9dent <sep>
+ {\loi_exparg\readlist_h{\loi_grabpaired_result}{#2}}% garder le précédent <sep>
{\loi_exparg\readlist_h{\loi_grabpaired_result}{#3}}%
}%
}%
}%
- \readlist_i\relax#1#3\_nil% ##BUGFIX v1.53
+ \readlist_i\relax#1#3\_nil% ##BUGFIX v1.53 (ajouter \relax)
}%
}
-\long\def\readlist_j#1#2#3{% #1=compteur d'index #2=liste restante #3=\xE9l\xE9ment courant
- \loi_ifnum{0\loi_exparg\loi_ifspacefirst{\loi_currentsep}{}1\if_removeextremespaces1\fi=11 }% s'il faur retirer les espaces extr\xEAmes
- {\loi_exparg{\loi_exparg{\readlist_k{#1}{#2}}}{\loi_removeextremespaces{#3}}}% red\xE9finir l'\xE9l\xE9ment courant
- {\readlist_k{#1}{#2}{#3}}%
+\long\def\readlist_j#1#2#3{% #1=compteur d'index #2=liste restante #3=élément courant
+ \loi_ifnum{0\loi_exparg\loi_ifspacefirst{\loi_currentsep}{}1\if_loi_removeextremespaces1\fi=11 }% s'il faur retirer les espaces extrêmes
+ {%
+ \loi_exparg{\loi_exparg{\readlist_k{#1}{#2}}}{\loi_removeextremespaces{#3}}% redéfinir l'élément courant
+ }%
+ {%
+ \readlist_k{#1}{#2}{#3}%
+ }%
}
-\long\def\readlist_k#1#2#3#4{% #1=compteur d'index #2=liste restante #3=\xE9l\xE9ment courant #4=sep utilis\xE9
- \loi_ifnum{0\if_ignoreemptyitems1\fi\loi_ifempty{#3}1{}=11 }
- {\readlist_g{#1}{#2}% si l'on n'ignore pas les \xE9l\xE9ments vides
+\long\def\readlist_k#1#2#3#4{% #1=compteur d'index #2=liste restante #3=élément courant #4=sep utilisé
+ \loi_ifnum{0\if_loi_ignoreemptyitems1\fi\loi_ifempty{#3}1{}=11 }
+ {%
+ \readlist_g{#1}{#2}% si l'on n'ignore pas les éléments vides
}%
- {\loi_argcsname\loi_def{\loi_listname[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#3}% assignation
- \loi_argcsname\loi_def{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#4}% assignation du <sep> actuel \xE0 la macro \<macrolist>sep
+ {%
+ \loi_argcsname\loi_def{\loi_listname[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#3}% assignation
+ \loi_argcsname\loi_def{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#4}% assignation du <sep> actuel à la macro \<macrolist>sep
\loi_ifnum{\loi_nestcnt<\nestdepth\relax}% si imbrication max non atteinte
- {\advance\loi_nestcnt1
+ {%
+ \advance\loi_nestcnt1
\loi_argcsname\edef{loi_previndex[\number\loi_nestcnt]}{\csname loi_previndex[\number\numexpr\loi_nestcnt-1]\endcsname#1,}%
- \readlist_e{#3}% recommencer avec l'\xE9l\xE9ment courant
+ \readlist_e{#3}% recommencer avec l'élément courant
}
- {}%
- \loi_exparg\readlist_g{\number\numexpr#1+1}{#2}% puis chercher l'\xE9l\xE9ment suivant dans la liste restante
+ {%
+ }%
+ \loi_exparg\readlist_g{\number\numexpr#1+1}{#2}% puis chercher l'élément suivant dans la liste restante
}%
}
@@ -465,16 +666,27 @@
\def\listlen#1[#2]{%
\expanded{%
\loi_ifempty{#2}
- {\csname\loi_macroname#1len[0]\endcsname}
- {\loi_exparg\listlen_a{\expanded{\loi_macroname#1}}{#2}}%
+ {%
+ \csname\loi_macroname#1len[0]\endcsname
+ }
+ {%
+ \loi_exparg\listlen_a{\expanded{\loi_macroname#1}}{#2}%
+ }%
}%
}
-\def\listlen_a#1#2{% #1=macro name #2=index non normalis\xE9 prendre <profondeur max-1>
- \expandafter\listlen_b\expanded{\loi_normalizeindex{#1}{#2}}{#1}%
+\def\listlen_a#1#2{% #1=macro name #2=index non normalisé prendre <profondeur max-1>
+ \expandafter\listlen_b\expanded{\loi_normalizeindex1{#1}{#2}}{#1}%
}
-\def\listlen_b#1#2#3{% #1=err #2=index normalis\xE9 #3=macroname
+\def\listlen_b#1#2#3{% #1=err #2=index normalisé #3=macroname
\csname#3len[#2,0]\expandafter\endcsname
- \expanded{\loi_ifempty{#1}{}{\unexpanded{\unexpanded{\loi_error{#1}}}}}%
+ \expanded{%
+ \loi_ifempty{#1}
+ {%
+ }
+ {%
+ \unexpanded{\unexpanded{\loi_error{#1}}}%
+ }%
+ }%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -486,38 +698,86 @@
}
\def\foreachitem_b{\loi_ifx{\loi_nxttok[}\foreachitem_a{\foreachitem_a[]}}
\def\foreachitem_c#1#2#3[#4]{% prendre <profondeur max-1>
- \expandafter\foreachitem_d\expanded{\loi_normalizeindex{#3}{#4}}#1{#2}{#3}%
+ \expandafter\foreachitem_d\expanded{\loi_normalizeindex1{#3}{#4}}#1{#2}{#3}%
}
-\def\foreachitem_d#1#2{\loi_ifempty{#2}{\foreachitem_e{#1}{}}{\foreachitem_e{#1}{#2,}}}% #1=err #2=index norm
-\long\def\foreachitem_e#1#2#3#4#5#6{% #1=err #2=index norm #3=macroiter #4=compteur associ\xE9 #5=nom de macrolist #6=code
+\def\foreachitem_d#1#2{%
+ \loi_ifempty{#2}
+ {%
+ \foreachitem_e{#1}{}%
+ }
+ {%
+ \foreachitem_e{#1}{#2,}% #1=err #2=index norm
+ }%
+}%
+\long\def\foreachitem_e#1#2#3#4#5#6{% #1=err #2=index norm #3=macroiter #4=compteur associé #5=nom de macrolist #6=code
\loi_ifnum{\csname#5len[#20]\endcsname>0 }
- {\loi_ifempty{#1}{}{\loi_error{#1}}%
+ {%
+ \loi_ifempty{#1}
+ {%
+ }
+ {%
+ \loi_error{#1}%
+ }%
\loi_fornum#4=1to\csname#5len[#20]\endcsname\do{\loi_argcsname\let#3{#5[#2#4]}#6}%
}
- {}%
+ {%
+ }%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%% macro \showitem %%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\showitems{\loi_ifstar{\let\showitems_cmd\detokenize\showitems_a}{\let\showitems_cmd\loi_identity\showitems_a}}
-\def\showitems_a#1{\def\showitems_b{\showitems_d#1}\futurelet\loi_nxttok\showitems_c}
-\def\showitems_c{\loi_ifx{\loi_nxttok[}\showitems_b{\showitems_b[]}}
-\def\showitems_d#1[#2]{\foreachitem\showitems_iter\in#1[#2]{\showitemsmacro{\expandafter\showitems_cmd\expandafter{\showitems_iter}}}}
+\def\showitems{%
+ \loi_ifstar
+ {%
+ \let\showitems_cmd\detokenize
+ \showitems_a
+ }
+ {%
+ \let\showitems_cmd\loi_identity
+ \showitems_a
+ }%
+}
+\def\showitems_a#1{%
+ \def\showitems_b{\showitems_d#1}%
+ \futurelet\loi_nxttok\showitems_c
+}
+\def\showitems_c{%
+ \loi_ifx{\loi_nxttok[}
+ {%
+ \showitems_b
+ }
+ {%
+ \showitems_b[]}%
+}
+\def\showitems_d#1[#2]{%
+ \foreachitem\showitems_iter\in#1[#2]
+ {%
+ \showitemsmacro{\expandafter\showitems_cmd\expandafter{\showitems_iter}}%
+ }%
+}
\unless\ifdefined\fbox
- \newdimen\fboxrule \newdimen\fboxsep \fboxrule=.4pt \fboxsep=3pt % r\xE9glages identiques \xE0 LaTeX
- \def\fbox#1{% imitation de la macro \fbox de LaTeX, voir pages 271 \xE0 274 de "Apprendre \xE0 programmer en TeX"
+ \newdimen\fboxrule
+ \newdimen\fboxsep
+ \fboxrule=.4pt
+ \fboxsep=3pt % réglages identiques à LaTeX
+ \def\fbox#1{% imitation de la macro \fbox de LaTeX, voir pages 271 à 274 de "Apprendre à programmer en TeX"
\hbox{%
\vrule width\fboxrule
\vtop{%
\vbox{\hrule height\fboxrule \kern\fboxsep \hbox{\kern\fboxsep#1\kern\fboxsep}}%
\kern\fboxsep \hrule height\fboxrule
- }\vrule width\fboxrule
+ }%
+ \vrule width\fboxrule
}%
}
\fi
-\def\showitemsmacro#1{% encadrement par d\xE9faut
- \begingroup\fboxsep=0.25pt \fboxrule=0.5pt \fbox{\strut#1}\endgroup
+\def\showitemsmacro#1{% encadrement par défaut
+ \begingroup
+ \fboxsep=0.25pt
+ \fboxrule=0.5pt
+ \fbox{\strut#1}%
+ \endgroup
\hskip0.25em\relax
}
@@ -526,11 +786,11 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\itemtomacro#1[#2]{% #1[#2]=item non encore lu: #3=macro
\edef\loi_listname{\loi_macroname#1}%
- \expandafter\itemtomacro_a\expanded{\loi_normalizeindex{\loi_listname}{#2}}\let
+ \expandafter\itemtomacro_a\expanded{\loi_normalizeindex0{\loi_listname}{#2}}\let
}
\def\gitemtomacro#1[#2]{% #1[#2]=item
\xdef\loi_listname{\loi_macroname#1}%
- \expandafter\itemtomacro_a\expanded{\loi_normalizeindex{\loi_listname}{#2}}{\global\let}%
+ \expandafter\itemtomacro_a\expanded{\loi_normalizeindex0{\loi_listname}{#2}}{\global\let}%
}
\def\itemtomacro_a#1#2#3#4{%
\loi_ifempty{#1}{}{\loi_error{#1}}%
@@ -538,12 +798,12 @@
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%% r\xE9glages par d\xE9faut %%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%% réglages par défaut %%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\if_removeextremespaces
-\newif\if_ignoreemptyitems
-\let\ignoreemptyitems\_ignoreemptyitemstrue
-\let\reademptyitems\_ignoreemptyitemsfalse
+\newif\if_loi_removeextremespaces
+\newif\if_loi_ignoreemptyitems
+\let\ignoreemptyitems\_loi_ignoreemptyitemstrue
+\let\reademptyitems\_loi_ignoreemptyitemsfalse
\loi_def_foreachsep{,}
\loi_restorecatcode
\reademptyitems
@@ -555,21 +815,21 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%% historique %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
v1.0 19/8/2016
- - Premi\xE8re version publique
+ - Première version publique
----------------------------------------------------------------------
v1.1 01/09/2016
- - Stockage des s\xE9parateurs dans <macrolist>sep
- - bug corrig\xE9 dans \loi_restorecatcode
+ - Stockage des séparateurs dans <macrolist>sep
+ - bug corrigé dans \loi_restorecatcode
----------------------------------------------------------------------
v1.2 22/10/2016
- - macros \greadlist et \gitemtomacro pour la globalit\xE9
+ - macros \greadlist et \gitemtomacro pour la globalité
----------------------------------------------------------------------
v1.3 18/11/2016
- - bugs corrig\xE9s dans la gestion de la globalit\xE9
+ - bugs corrigés dans la gestion de la globalité
----------------------------------------------------------------------
v1.4 05/10/2017
- - test \loi_ifprimitive ajout\xE9 au test \loi_ifcs
- - suppression de \loi_expafternil, cr\xE9ation de \loi_expafter,
+ - test \loi_ifprimitive ajouté au test \loi_ifcs
+ - suppression de \loi_expafternil, création de \loi_expafter,
modification de \loi_argcsname
- correction d'un bug : \setsepchar{\par} ne provoque plus d'erreur.
\loi_ifnum devient \long
@@ -581,26 +841,40 @@
- correction d'un bug dans \loi_ifcs
----------------------------------------------------------------------
v1.52 13/01/2018
- - le dernier s\xE9parateur est <vide>
+ - le dernier séparateur est <vide>
----------------------------------------------------------------------
v1.53 13/03/2018
- correction d'un bug dans \readlist_i
----------------------------------------------------------------------
v1.6 01/11/2018
- - possibilit\xE9 d'appariement de tokens dans les items
+ - possibilité d'appariement de tokens dans les items
----------------------------------------------------------------------
v1.61 03/03/2019
- la macro \loi_ifcs contient une erreur de conception. Il faut
- tester si le token est un sc && s'il est d\xE9veloppable pour
- renvoyer vrai car il existe des sc non d\xE9veloppables && qui ne
+ tester si le token est un sc && s'il est développable pour
+ renvoyer vrai car il existe des sc non développables && qui ne
sont _pas_ des primitives.
- Macro rebaptis\xE9e \loi_ifcsexpandable
+ Macro rebaptisée \loi_ifcsexpandable
----------------------------------------------------------------------
v1.62 18/05/2019
- utilisation de la nouvelle primitive \expanded au lieu du
- d\xE9sormais obsol\xE8te \romannumeral
- - bug corrig\xE9 dans \loi_ifcsexpandable
+ désormais obsolète \romannumeral
+ - bug corrigé dans \loi_ifcsexpandable
----------------------------------------------------------------------
v1.63 21/08/2019
- - bug corrig\xE9 dans \readlist_h avec les tokens appari\xE9s
- - bug corrig\xE9 \loi_removefirstspaces est d\xE9sormais \long
\ No newline at end of file
+ - bug corrigé dans \readlist_h avec les tokens appariés
+ - bug corrigé \loi_removefirstspaces est désormais \long
+ ----------------------------------------------------------------------
+v1.64 10/02/2024
+ - bug corrigé dans \readlist_h. Bug découvert plus d'un an après (sic)
+ avoir été signalé dans la question :
+ tex.stackexchange.com/questions/670379
+ et donc désormais, le code suivant ne plante plus
+ \setsepchar{10||00}%
+ \readlist\mylist{A10B}%
+ - bug corrigé dans \loi_normalizeindex : la profondeur maxi de
+ l'index peut être diminuée de 1 (pour notamment \foreachitem et
+ \listlen)
+ - la primitive \expanded est désormais obligatoire
+ - code source UFT8, manuel compilé avec luaLaTeX
+ - code plus lisiblement formaté
\ No newline at end of file
Deleted: trunk/Master/texmf-dist/tex/generic/listofitems/listofitemsold.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/listofitems/listofitemsold.tex 2024-02-11 02:14:07 UTC (rev 69790)
+++ trunk/Master/texmf-dist/tex/generic/listofitems/listofitemsold.tex 2024-02-11 02:14:22 UTC (rev 69791)
@@ -1,572 +0,0 @@
-% !TeX encoding = ISO-8859-1
-% Ce fichier contient le code de l'extension "listofitems"
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-\def\loiname {listofitems} %
-\def\loiver {1.61} %
-% %
-\def\loidate {2019/03/03} %
-% %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-% Author : Christian Tellechea, Steven B. Segletes %
-% Status : Maintained %
-% Maintainer : Christian Tellechea %
-% Email : unbonpetit at netc.fr %
-% steven.b.segletes.civ at mail.mil %
-% Package URL: https://www.ctan.org/pkg/listofitems %
-% Bug tracker: https://framagit.org/unbonpetit/listofitems/issues %
-% Repository : https://framagit.org/unbonpetit/listofitems/tree/master
-% Copyright : Christian Tellechea 2016-2019 %
-% Licence : Released under the LaTeX Project Public License v1.3c %
-% or later, see http://www.latex-project.org/lppl.txt %
-% Files : 1) listofitems.tex %
-% 2) listofitems.sty %
-% 3) listofitems-fr.tex %
-% 4) listofitems-fr.pdf %
-% 5) listofitems-en.tex %
-% 6) listofitems-en.pdf %
-% 7) README %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifdefined\ProvidesPackage\else
- \immediate\write -1 {%
- Package: \loidate\space v\loiver\space Grab items in lists using user-specified sep char (CT)}%
-\fi
-
-\expandafter\edef\csname loi_restorecatcode\endcsname{\catcode\number`\_=\number\catcode`\_\relax}
-\catcode`\_11
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%% gestion des erreurs %%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\ifdefined\PackageError
- \def\loi_error#1{\PackageError\loiname{#1}{Read the manual}}% pour LaTeX
-\else
- \def\loi_error#1{\errmessage{Package \loiname\space Error: #1^^J}}% pour TeX
-\fi
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%% v\xE9rification de la pr\xE9sence de etex %%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\begingroup
-\edef\__tempa{\meaning\eTeXversion}\edef\__tempb{\string\eTeXversion}%
-\ifx\__tempa\__tempb
- \endgroup
-\else
- \endgroup
- \loi_error{You are not using an eTeX engine, listofitems cannot work.}%
- \loi_restorecatcode\expandafter\endinput
-\fi
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% macros auxiliaires %%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\chardef\loi_stop=0
-\def\loi_quark{\loi_quark}
-\long\def\loi_identity#1{#1}
-\long\def\loi_gobarg#1{}
-\long\def\loi_first#1#2{#1}
-\long\def\loi_second#1#2{#2}
-\long\def\loi_firsttonil#1#2\_nil{#1}
-\long\def\loi_antefi#1#2\fi{#2\fi#1}
-\long\def\loi_exparg#1#2{\expandafter\loi_exparg_a\expandafter{#2}{#1}}% \loi_exparg{<a>}{<b>} devient <a>{<*b>}
-\long\def\loi_exparg_a#1#2{#2{#1}}
-\long\def\loi_expafter#1#2{\expandafter\loi_expafter_a\expandafter{#2}{#1}}% \loi_expafter{<a>}{<b>} devient <a><*b>
-\long\def\loi_expafter_a#1#2{#2#1}
-\def\loi_macroname{\loi_ifinrange\escapechar[[0:255]]{\expandafter\loi_gobarg}{}\string}
-\def\loi_argcsname#1#{\loi_argcsname_a{#1}}
-\def\loi_argcsname_a#1#2{\loi_expafter{#1}{\csname#2\endcsname}}
-\long\def\loi_addtomacro#1#2{\loi_exparg{\def#1}{#1#2}}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%% macros de test %%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\long\def\loi_ifnum#1{\ifnum#1\expandafter\loi_first\else\expandafter\loi_second\fi}
-\long\def\loi_ifx#1{\ifx#1\expandafter\loi_first\else\expandafter\loi_second\fi}
-\long\def\loi_ifempty#1{\loi_exparg\loi_ifx{\expandafter\relax\detokenize{#1}\relax}}
-\def\loi_ifstar#1#2{\def\loi_ifstar_a{\loi_ifx{*\loi_nxttok}{\loi_first{#1}}{#2}}\futurelet\loi_nxttok\loi_ifstar_a}
-\long\def\loi_ifstuffexpandable#1{\def\loi_tempa{#1}\loi_exparg{\def\loi_tempb}{#1}\expandafter\unless\loi_ifx{\loi_tempa\loi_tempb}}
-\long\def\loi_ifcsexpandable#1{% #1 est-il constitu\xE9 d'une sc _d\xE9veloppable_ ?
- \loi_ifempty{#1}
- {\loi_second
- }
- {\loi_ifspacefirst{#1}
- {\loi_second% si espace en 1er, faux
- }
- {%
- \loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul token ?
- {\begingroup\escapechar`\_\def\_{#1}\expandafter\endgroup
- \csname loi_\if\expandafter\expandafter\expandafter\loi_firsttonil\expandafter\string\_\_nil\string _first\else second\fi\endcsname
- {\loi_ifstuffexpandable{#1}}
- {\loi_second}%
- }
- {\loi_second% si plusieurs tokens, faux
- }%
- }%
- }%
-}
-\def\loi_ifinrange#1[[#2:#3]]{\loi_ifnum{\numexpr(#1-#2)*(#1-#3)>0 }\loi_second\loi_first}
-\def\loi_ifstring#1\in#2{% si la chaine #1 est contenue dans #2
- \def\loi_ifstring_a##1#1##2\_nil{\loi_ifempty{##2}\loi_second\loi_first}%
- \loi_ifstring_a#2#1\@nil% appel de la macro auxiliaire
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% macros \loi_foreach %%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcount\loi_cnt_foreach_nest \loi_cnt_foreach_nest=0
-\def\end_foreach{\end_foreach}
-\def\loi_def_foreachsep#1{%
- \long\def\loi_foreach##1\in##2##3{%
- \global\advance\loi_cnt_foreach_nest1
- \loi_argcsname\def{loop_code_\number\loi_cnt_foreach_nest}{##3}%
- \loi_foreach_a##1##2#1\end_foreach#1%
- \loi_argcsname\let{loop_code_\number\loi_cnt_foreach_nest}\empty
- \global\advance\loi_cnt_foreach_nest-1
- }%
- \long\def\loi_foreach_a##1##2#1{%
- \def##1{##2}%
- \loi_ifx{\end_foreach##1}
- {}
- {\csname loop_code_\number\loi_cnt_foreach_nest\endcsname% ex\xE9cute le code
- \loi_foreach_a##1%
- }%
- }%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%% macros g\xE9rant l'appariement %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\long\def\defpair#1{%
- \let\loi_listofpair\empty
- \loi_ifempty{#1}
- {}
- {\defpair_a{}#1\loi_quark\loi_quark}%
-}
-\long\def\defpair_a#1#2#3{%
- \loi_ifx{\loi_quark#2}
- {\def\loi_sanitizelist##1,\_nil{\def\loi_listofpair{##1}}%
- \loi_sanitizelist#1\_nil
- }
- {\loi_if_validpair#2#3%
- {\long\def\loi_paired_a{#2}\long\def\loi_paired_b{#3}%
- \loi_ifx{\loi_paired_a\loi_paired_b}
- {\loi_error{Paired tokens must not be equal, the pair \detokenize{#2#3} is ignored}%
- \defpair_a{#1}%
- }
- {\defpair_a{#1#2#3,}%
- }%
- }
- {\loi_error{Invalid paired tokens, the pair "\detokenize{#2}" and "\detokenize{#3}" is ignored}%
- \defpair_a{#1}%
- }%
- }%
-}
-\long\def\loi_if_validpair#1#2{%
- \def\loi_validpair{1}%
- \loi_if_invalid_pairtoken{#1}{\def\loi_validpair{0}}%
- \loi_if_invalid_pairtoken{#2}{\def\loi_validpair{0}}%
- \loi_ifnum{\loi_validpair=1 }
-}
-\long\def\loi_if_invalid_pairtoken#1{%
- \loi_ifempty{#1}
- {\loi_identity
- }
- {\loi_ifspacefirst{#1}
- {\loi_identity
- }
- {\loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul token ?
- {\ifcat\relax\noexpand#1\expandafter\loi_identity\else\expandafter\loi_gobarg\fi}
- {\loi_identity}% si plusieurs tokens, faux
- }%
- }%
-}
-\long\def\loi_count_occur#1\in#2:#3{% compte le nombre d'occurrences de #1 dans #2 et met le r\xE9sultat dans la macro #3
- \long\def\loi_count_occur_a##1##2#1##3\_nil{%
- \loi_ifempty{##3}
- {\def#3{##1}}
- {\expandafter\loi_count_occur_a\number\numexpr##1+1\relax##3\_nil}%
- }%
- \loi_count_occur_a0#2#1\_nil
-}
-\long\def\loi_check_pair#1#2\in#3{% teste l'appariement de #1 et #2 dans #3
- \loi_ifempty{#3}
- {\loi_second
- }
- {\loi_count_occur#1\in#3:\loi_tempa
- \loi_count_occur#2\in#3:\loi_tempb
- \loi_ifnum{\loi_tempa=\loi_tempb\relax}%
- }%
-}
-\long\def\loi_grabpaired_expr#1#2#3#4#5{% #1=liste de paires #2=expression #3=s\xE9parateur #4=r\xE9sultat #5=ce qui reste
- \let#4\empty
- \def\loi_remain{#2#3}%
- \loi_foreach\loi_pair\in{#1}{\expandafter\loi_grabpaired_expr_a\loi_pair{#3}#4}%
- \def\loi_remove_lastsep##1#3\_nil{\def#4{##1}}%
- \expandafter\loi_remove_lastsep#4\_nil
- \expandafter\long\expandafter\def\expandafter\loi_grab_remain#4##1\_nil{\loi_ifempty{##1}{\let#5\empty}{\loi_exparg{\def#5}{\loi_gobarg##1}}}%
- \loi_grab_remain#2\_nil
-}
-\long\def\loi_grabpaired_expr_a#1#2#3#4{% #1#2=paire en cours #3=s\xE9parateur #4=r\xE9sultat
- \loi_exparg{\loi_check_pair#1#2\in}#4% si les paires sont appari\xE9es dans le r\xE9sultat
- {}% passer \xE0 la paire suivante
- {\long\def\loi_grabpaired_expr_b##1#3##2\_nil{%
- \loi_addtomacro#4{##1#3}% ajouter au r\xE9sultat ce qui est jusqu'au prochain s\xE9parateur
- \def\loi_remain{##2}%
- \loi_exparg{\loi_check_pair#1#2\in}{#4}
- {}
- {\loi_ifempty{##2}
- {\loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired}}
- {\loi_grabpaired_expr_b##2\_nil}%
- }%
- }%
- \expandafter\loi_grabpaired_expr_b\loi_remain\_nil
- }%
-}
-\def\insidepair#1#2#3#4{% #1#2=paire #3=expr #4=macro re\xE7evant le resultat
- \loi_if_validpair#1#2%
- {\loi_ifcsexpandable{#3}
- {\loi_exparg{\insidepair#1#2}{#3}#4%
- }
- {\loi_check_pair#1#2\in{#3}% si les paires sont appari\xE9es dans le r\xE9sultat
- {\def\insidepair_a##1#1##2\_nil{\insidepair_b##2\_nil{#1}}%
- \def\insidepair_b##1#2##2\_nil##3{%
- \loi_check_pair#1#2\in{##3##1#2}
- {\loi_exparg{\def#4}{\loi_gobarg##3##1}}%
- {\insidepair_b##2\_nil{##3##1#2}}%
- }%
- \insidepair_a#3\_nil
- }
- {\loi_error{"\detokenize{#1}" and "\detokenize{#2}" are not paired in "#3"}%
- }%
- }%
- }
- {\loi_error{Invalid paired tokens "\detokenize{#1}" and "\detokenize{#2}", empty \string#4 returned}% et bim
- \let#4\empty% voil\xE0, bien fait pour vos gueules
- }%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% macro \loi_fornum %%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\loi_fornum#1=#2to#3\do{%
- \edef#1{\number\numexpr#2}\edef\loi_sgncmp{\ifnum#1<\numexpr#3\relax>+\else<-\fi}%
- \expandafter\loi_fornum_a\csname loi_fornum_\string#1\expandafter\endcsname\expandafter{\number\numexpr#3\expandafter}\loi_sgncmp#1%
-}
-\long\def\loi_fornum_a#1#2#3#4#5#6{\def#1{\unless\ifnum#5#3#2\relax\loi_antefi{#6\edef#5{\number\numexpr#5#41\relax}#1}\fi}#1}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%% macro retirant les espaces extr\xEAmes %%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\long\def\loi_ifspacefirst#1{\expandafter\loi_ifspacefirst_a\detokenize{#10} \_nil}
-\long\def\loi_ifspacefirst_a#1 #2\_nil{\loi_ifempty{#1}}
-\expandafter\def\expandafter\loi_gobspace\space{}
-\def\loi_removefirstspaces{\romannumeral\loi_removefirstspaces_a}
-\long\def\loi_removefirstspaces_a#1{\loi_ifspacefirst{#1}{\expandafter\loi_removefirstspaces_a\expandafter{\loi_gobspace#1}}{\loi_stop#1}}
-\edef\loi_restorezerocatcode{\catcode0=\number\catcode0 \relax}
-\catcode0 12
-\long\def\loi_removelastspaces#1{\romannumeral\loi_removelastspaces_a#1^^00 ^^00\_nil}
-\long\def\loi_removelastspaces_a#1 ^^00{\loi_removelastspaces_b#1^^00}
-\long\def\loi_removelastspaces_b#1^^00#2\_nil{\loi_ifspacefirst{#2}{\loi_removelastspaces_a#1^^00 ^^00\_nil}{\loi_stop#1}}
-\loi_restorezerocatcode
-\long\def\loi_removeextremespaces#1{% #1=texte o\xF9 les espaces extr\xEAmes sont retir\xE9s
- \romannumeral\expandafter\expandafter\expandafter\loi_removelastspaces\expandafter\expandafter\expandafter
- {\expandafter\expandafter\expandafter\loi_stop\loi_removefirstspaces{#1}}%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%% macro publique \setsepchar %%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\setsepchar{\futurelet\loi_nxttok\setsepchar_a}
-\def\setsepchar_a{\loi_ifx{[\loi_nxttok}\setsepchar_b{\setsepchar_b[/]}}
-\long\def\setsepchar_b[#1]#2{% #1=sepcar de <liste des sepcar> #2=<liste des sepcar>
- \loi_ifempty{#1}
- {\loi_error{Empty separator not allowed, separator "/" used}%
- \setsepchar_b[/]{#2}%
- }
- {\def\loi_currentsep{#1}%
- \_removeextremespacesfalse
- \loi_nestcnt1 % r\xE9initaliser niveau initial \xE0 1
- \def\nestdepth{1}%
- \loi_argcsname\let{loi_previndex[\number\loi_nestcnt]}\empty
- \def\loi_listname{loi_listofsep}%
- \let\loi_def\def \let\loi_edef\edef \let\loi_let\let
- \let\loi_listofpair_saved\loi_list_ofpair
- \let\loi_list_ofpair\empty
- \loi_ifempty{#2}
- {\loi_error{Empty list of separators not allowed, "," used}%
- \readlist_e1{,}%
- }
- {\readlist_e1{#2}%
- }%
- \loi_argcsname\let\nestdepth{loi_listofseplen[0]}%
- \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de s\xE9paration
- \let\loi_listofpair\loi_listofpair_saved
- }%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%% macro normalisant l'index %%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\loi_normalizeindex#1#2#3{% #1=macroname #2=liste d'index #3=profondeur max --> renvoie {err}{indx norm}
- \loi_ifempty{#2}
- {\loi_stop{}{}}
- {\loi_normalizeindex_a1{}{#3}{#1}#2,\loi_quark,}%
-}%
-\def\loi_normalizeindex_a#1#2#3#4#5,{% #1=compteur de profondeur #2=index pr\xE9c\xE9dents #3=profondeur max #4=macroname #5=index courant
- \loi_ifx{\loi_quark#5}
- {\loi_normalizeindex_c#2\loi_quark% supprimer la derni\xE8re virgule
- }
- {\loi_ifnum{#1>#3 }
- {\loi_invalidindex{Too deeply nested index, index [.] retained}{#2}% si profondeur trop grande
- }
- {\loi_ifinrange\ifnum\numexpr#5<0 -1*\fi(#5)[[1:\csname #4len[#20]\endcsname]]% si abs(#5) hors de [1,len]
- {\loi_exparg\loi_normalizeindex_b{\number\numexpr#5\ifnum\numexpr#5<0 +\csname #4len[#20]\endcsname+1\fi}{#1}{#2}{#3}{#4}}
- {\loi_invalidindex{#5 is an invalid index, index [.] retained}{#2}}%
- }%
- }%
-}
-\def\loi_normalizeindex_b#1#2#3{\loi_exparg\loi_normalizeindex_a{\number\numexpr#2+1}{#3#1,}}% #1=index \xE0 rajouter #2=compteur de profondeur #3=index pr\xE9c\xE9dents
-\def\loi_normalizeindex_c#1,\loi_quark{\loi_stop{}{#1}}
-\def\loi_invalidindex#1#2{\loi_ifempty{#2}{\loi_invalidindex_a{#1},}\loi_invalidindex_a{#1}{#2}}
-\def\loi_invalidindex_a#1#2{\loi_invalidindex_b#1\loi_quark#2\loi_quark}
-\def\loi_invalidindex_b#1[.]#2\loi_quark#3,\loi_quark#4\loi_quark,{\loi_stop{#1[#3]#2}{#3}}% #4= index ignor\xE9s
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%% macro publique \readlist %%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcount\loi_nestcnt
-\def\greadlist{\let\loi_def\gdef\let\loi_edef\xdef\def\loi_let{\global\let}\readlist_a}%
-\def\readlist{\let\loi_def\def\let\loi_edef\edef\let\loi_let\let\readlist_a}
-\def\readlist_a{%
- \loi_nestcnt1 % niveau initial = 1
- \loi_argcsname\let{loi_previndex[\number\loi_nestcnt]}\empty
- \loi_ifstar{\_removeextremespacestrue\readlist_b}{\_removeextremespacesfalse\readlist_b}%
-}
-\long\def\readlist_b#1#2{% #1=macro stockant les \xE9l\xE9ments #2=liste des \xE9l\xE9ments
- \loi_ifcsexpandable{#2}
- {\loi_exparg{\readlist_b#1}{#2}%
- }
- {\loi_edef\loi_listname{\loi_macroname#1}%
- \loi_argcsname\loi_let{\loi_listname nest}\nestdepth
- \loi_argcsname\loi_def{\loi_listname[]}{#2}% la liste enti\xE8re
- \loi_argcsname\loi_def{\loi_listname sep[]}{}% s\xE9parateur vide
- \loi_ifempty{#2}
- {\loi_def#1[##1]{}%
- \loi_argcsname\loi_def{\loi_listname len}{0}\loi_argcsname\loi_def{\loi_listname len[0]}{0}%
- \loi_error{Empty list ignored, nothing to do}%
- }
- {\loi_edef#1[##1]{\unexpanded{\romannumeral\expandafter\loi_checkindex\romannumeral\loi_normalizeindex}{\loi_listname}{##1}{\csname\loi_listname nest\endcsname}{\loi_listname}}%
- \loi_argcsname\loi_edef{\loi_listname sep}[##1]{\unexpanded{\romannumeral\expandafter\loi_checkindex\romannumeral\loi_normalizeindex}{\loi_listname}{##1}{\csname\loi_listname nest\endcsname}{\loi_listname sep}}%
- \readlist_c{#2}%
- \loi_argcsname\loi_argcsname\loi_let{\loi_listname len}{\loi_listname len[0]}% longueur du niveau 0
- }%
- }%
-}
-\def\loi_checkindex#1#2#3{%
- \expandafter\expandafter\expandafter\loi_stop\csname#3[#2]\expandafter\endcsname
- \romannumeral\loi_ifempty{#1}{\loi_stop}{\loi_stop\loi_error{#1}}%
-}
-\def\readlist_c{%
- \loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}%
- \expandafter\readlist_d\loi_currentsep||\_nil
-}
-\long\def\readlist_d#1||#2\_nil#3{\readlist_e1{#3#1}}% #1=<sep courant simple> #3=liste -> rajoute un \xE9l\xE9ment vide pour le test \ifempty ci dessous
-\long\def\readlist_e#1#2{% #1=compteur d'index #2=liste d'\xE9l\xE9ments \xE0 examiner termin\xE9e par <sep courant simple> >>RIEN laiss\xE9 apr\xE8s
- \loi_ifempty{#2}
- {\loi_argcsname\loi_edef{\loi_listname len[\csname loi_previndex[\number\loi_nestcnt]\endcsname0]}{\number\numexpr#1-1\relax}%
- \loi_argcsname\loi_let{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname\number\numexpr#1-1\relax]}\empty% le dernier <sep> est <vide> ##NEW v1.52
- \advance\loi_nestcnt-1
- \loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}%
- }
- {\loi_expafter{\readlist_f{#2}{}}\loi_currentsep||\loi_quark||#2\_nil{#1}% aller isoler le 1er item
- }%
-}
-\long\def\readlist_f#1#2#3||{% #1=liste restante #2=<dernier sep utilis\xE9> #3=<sep courant>
- \loi_ifx{\loi_quark#3}% on a \xE9puis\xE9 tous les <s\xE9parateurs> ? RESTE \xE0 lire <expr+sep1>\_nil{<compteur>}
- {\loi_ifempty{#2}% si #2 vide, aucun <sep utilis\xE9> n'a \xE9t\xE9 trouv\xE9, il reste \xE0 lire "<liste compl\xE8te>\_nil"
- {\long\def\readlist_g##1\_nil##2{\loi_exparg{\readlist_h{##2}{}}{\loi_gobarg##1}{#2}}% ##2=compteur d'index
- }
- {\loi_ifx{\loi_listofpair\empty}% paires d\xE9finies ?
- {\long\def\readlist_g##1#2##2\_nil##3{\loi_exparg{\readlist_h{##3}{##2}}{\loi_gobarg##1}{#2}}%
- }
- {\long\def\readlist_g##1\_nil##2{%
- \loi_exparg{\loi_exparg\loi_grabpaired_expr\loi_listofpair}{\loi_gobarg##1}{#2}\loi_grabpaired_result\loi_grabpaired_remain
- \loi_exparg{\loi_exparg{\readlist_h{##2}}{\loi_grabpaired_remain}}{\loi_grabpaired_result}{#2}}%
- }%
- }%
- \readlist_g\relax% le \relax meuble l'argument d\xE9limit\xE9
- }
- {\long\def\readlist_g##1#3##2\_nil{%
- \loi_ifempty{##2}% si <liste restante> ne contient pas le <sep courant>
- {\readlist_f{#1}{#2}% recommencer avec le m\xEAme <sep utile>
- }%
- {\loi_ifx{\loi_listofpair\empty}% si pas de paires d\xE9finies
- {\loi_exparg\readlist_f{\loi_gobarg##1#3}{#3}% raccourcir <liste restante> et <sep courant>:=<sep utile>% ##BUGFIX v1.53
- }%
- {\loi_exparg\loi_grabpaired_expr\loi_listofpair{#1}{#3}\loi_grabpaired_result\loi_grabpaired_remain
- \loi_exparg\readlist_f{\loi_grabpaired_result#3}{#3}%
- }%
- }%
- }%
- \readlist_g\relax#1#3\_nil% ##BUGFIX v1.53
- }%
-}
-\long\def\readlist_h#1#2#3{% #1=compteur d'index #2=liste restante #3=\xE9l\xE9ment courant
- \loi_ifnum{0\loi_exparg\loi_ifspacefirst{\loi_currentsep}{}1\if_removeextremespaces1\fi=11 }% s'il faur retirer les espaces extr\xEAmes
- {\loi_exparg{\loi_exparg{\readlist_i{#1}{#2}}}{\loi_removeextremespaces{#3}}}% red\xE9finir l'\xE9l\xE9ment courant
- {\readlist_i{#1}{#2}{#3}}%
-}
-\long\def\readlist_i#1#2#3#4{% #1=compteur d'index #2=liste restante #3=\xE9l\xE9ment courant #4=sep utilis\xE9
- \loi_ifnum{0\if_ignoreemptyitems1\fi\loi_ifempty{#3}1{}=11 }
- {\readlist_e{#1}{#2}% si l'on n'ignore pas les \xE9l\xE9ments vides
- }%
- {\loi_argcsname\loi_def{\loi_listname[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#3}% assignation de l'item ctuel \xE0 la macro
- \loi_argcsname\loi_def{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#4}% assignation du <sep> actuel \xE0 la macro \<macrolist>sep
- \loi_ifnum{\loi_nestcnt<\nestdepth\relax}% si imbrication max non atteinte
- {\advance\loi_nestcnt1
- \loi_argcsname\edef{loi_previndex[\number\loi_nestcnt]}{\csname loi_previndex[\number\numexpr\loi_nestcnt-1]\endcsname#1,}%
- \readlist_c{#3}% recommencer avec l'\xE9l\xE9ment courant
- }
- {}%
- \loi_exparg\readlist_e{\number\numexpr#1+1}{#2}% puis chercher l'\xE9l\xE9ment suivant dans la liste restante
- }%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%% macro \listlen %%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\listlen#1[#2]{%
- \romannumeral\loi_ifempty{#2}
- {\expandafter\expandafter\expandafter\loi_stop\csname\loi_macroname#1len[0]\endcsname}
- {\loi_exparg\listlen_a{\romannumeral-`\.\loi_macroname#1}{#2}}%
-}
-\def\listlen_a#1#2{% #1=macro name #2=index non normalis\xE9 prendre <profondeur max-1>
- \loi_exparg{\expandafter\listlen_b\romannumeral\loi_normalizeindex{#1}{#2}}{\number\numexpr\csname#1nest\endcsname-1}{#1}%
-}
-\def\listlen_b#1#2#3{% #1=err #2=index normalis\xE9 #3=macroname
- \expandafter\expandafter\expandafter\loi_stop\csname#3len[#2,0]\expandafter\endcsname
- \romannumeral\loi_ifempty{#1}{\loi_stop}{\loi_stop\loi_error{#1}}%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% macro \foreachitem %%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\foreachitem#1\in#2{%
- \edef\foreachitem_a{\noexpand\foreachitem_c\noexpand#1{\expandafter\noexpand\csname\loi_macroname#1cnt\endcsname}{\loi_macroname#2}}%
- \futurelet\loi_nxttok\foreachitem_b
-}
-\def\foreachitem_b{\loi_ifx{\loi_nxttok[}\foreachitem_a{\foreachitem_a[]}}
-\def\foreachitem_c#1#2#3[#4]{% prendre <profondeur max-1>
- \loi_exparg{\expandafter\foreachitem_d\romannumeral\loi_normalizeindex{#3}{#4}}{\number\numexpr\csname#3nest\endcsname-1}#1{#2}{#3}%
-}
-\def\foreachitem_d#1#2{\loi_ifempty{#2}{\foreachitem_e{#1}{}}{\foreachitem_e{#1}{#2,}}}% #1=err #2=index norm
-\long\def\foreachitem_e#1#2#3#4#5#6{% #1=err #2=index norm #3=macroiter #4=compteur associ\xE9 #5=nom de macrolist #6=code
- \loi_ifnum{\csname#5len[#20]\endcsname>0 }
- {\loi_ifempty{#1}{}{\loi_error{#1}}%
- \loi_fornum#4=1to\csname#5len[#20]\endcsname\do{\loi_argcsname\let#3{#5[#2#4]}#6}%
- }
- {}%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%% macro \showitem %%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\showitems{\loi_ifstar{\let\showitems_cmd\detokenize\showitems_a}{\let\showitems_cmd\loi_identity\showitems_a}}
-\def\showitems_a#1{\def\showitems_b{\showitems_d#1}\futurelet\loi_nxttok\showitems_c}
-\def\showitems_c{\loi_ifx{\loi_nxttok[}\showitems_b{\showitems_b[]}}
-\def\showitems_d#1[#2]{\foreachitem\showitems_ater\in#1[#2]{\showitemsmacro{\expandafter\showitems_cmd\expandafter{\showitems_ater}}}}
-\unless\ifdefined\fbox
- \newdimen\fboxrule \newdimen\fboxsep \fboxrule=.4pt \fboxsep=3pt % r\xE9glages identiques \xE0 LaTeX
- \def\fbox#1{% imitation de la macro \fbox de LaTeX, voir pages 271 \xE0 274 de "Apprendre \xE0 programmer en TeX"
- \hbox{%
- \vrule width\fboxrule
- \vtop{%
- \vbox{\hrule height\fboxrule \kern\fboxsep \hbox{\kern\fboxsep#1\kern\fboxsep}}%
- \kern\fboxsep \hrule height\fboxrule
- }\vrule width\fboxrule
- }%
- }
-\fi
-\def\showitemsmacro#1{% encadrement par d\xE9faut
- \begingroup\fboxsep=0.25pt \fboxrule=0.5pt \fbox{\strut#1}\endgroup
- \hskip0.25em\relax
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% macro \itemtomacro %%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\itemtomacro#1[#2]{% #1[#2]=item non encore lu: #3=macro
- \edef\loi_listname{\loi_macroname#1}%
- \loi_exparg{\expandafter\itemtomacro_a\romannumeral\expandafter\loi_normalizeindex\expandafter{\loi_listname}{#2}}{\csname\loi_listname nest\endcsname}\let
-}
-\def\gitemtomacro#1[#2]{% #1[#2]=item
- \xdef\loi_listname{\loi_macroname#1}%
- \loi_exparg{\expandafter\itemtomacro_a\romannumeral\expandafter\loi_normalizeindex\expandafter{\loi_listname}{#2}}{\csname\loi_listname nest\endcsname}{\global\let}%
-}
-\def\itemtomacro_a#1#2#3#4{%
- \loi_ifempty{#1}{}{\loi_error{#1}}%
- \loi_argcsname#3#4{\loi_listname[#2]}%
-}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%% r\xE9glages par d\xE9faut %%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newif\if_removeextremespaces
-\newif\if_ignoreemptyitems
-\let\ignoreemptyitems\_ignoreemptyitemstrue
-\let\reademptyitems\_ignoreemptyitemsfalse
-\setsepchar{,}
-\defpair{}
-\loi_def_foreachsep{,}
-\reademptyitems
-
-\loi_restorecatcode
-\endinput
-
-######################################################################
-############################ Historique #############################
-######################################################################
-
-v1.0 19/8/2016
- - Premi\xE8re version publique
-
-v1.1 01/09/2016
- - Stockage des s\xE9parateurs dans <macrolist>sep
- - bug corrig\xE9 dans \loi_restorecatcode
-
-v1.2 22/10/2016
- - macros \greadlist et \gitemtomacro pour la globalit\xE9
-
-v1.3 18/11/2016
- - bugs corrig\xE9s dans la gestion de la globalit\xE9
-
-v1.4 05/10/2017
- - test \loi_ifprimitive ajout\xE9 au test \loi_ifcs
- - suppression de \loi_expafternil, cr\xE9ation de \loi_expafter,
- modification de \loi_argcsname
- - correction d'un bug : \setsepchar{\par} ne provoque plus
- d'erreur. \loi_ifnum devient \long
-
-v1.5 06/10/2017
- - correction d'un bug dans \loi_ifcs
-
-v1.51 24/10/2017
- - correction d'un bug dans \loi_ifcs
-
-v1.52 13/01/2018
- - le dernier s\xE9parateur est <vide>
-
-v1.53 13/03/2018
- - correction d'un bug dans \readlist_g
-
-v1.6 01/11/2018
- - possibilit\xE9 d'appariement de tokens dans les items
-
-v1.61 03/03/2019
- - la macro \loi_ifcs contient une erreur de conception.
- Il faut tester si le token est un sc && s'il est
- d\xE9veloppable pour renvoyer vrai car il existe des sc
- non d\xE9veloppables && qui ne sont _pas_ des primitives.
- Macro rebaptis\xE9e \loi_ifcsexpandable
\ No newline at end of file
More information about the tex-live-commits
mailing list.