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