% !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