From 15360daf880519448794c8bc606dad9d850bb7a8 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 1 Nov 2018 22:08:53 +0000 Subject: listofitems (1nov18) git-svn-id: svn://tug.org/texlive/trunk@49044 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/generic/listofitems/listofitems.tex | 454 ++++++++++++++------- 1 file changed, 312 insertions(+), 142 deletions(-) (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/generic/listofitems/listofitems.tex b/Master/texmf-dist/tex/generic/listofitems/listofitems.tex index 5ea3de69500..27cd340aeef 100644 --- a/Master/texmf-dist/tex/generic/listofitems/listofitems.tex +++ b/Master/texmf-dist/tex/generic/listofitems/listofitems.tex @@ -1,32 +1,33 @@ +% !TeX encoding = ISO-8859-1 % Ce fichier contient le code de l'extension "listofitems" % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\loiname {listofitems} % -\def\loiver {1.53} % +\def\loiver {1.6} % % % -\def\loidate {2018/03/13} % +\def\loidate {2018/11/01} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% -% Author : Christian Tellechea, Steven B. Segletes -% Status : Maintained -% Maintainer : Christian Tellechea -% Email : unbonpetit@netc.fr -% steven.b.segletes.civ@mail.mil -% Package URL: https://www.ctan.org/pkg/listofitems -% Bug tracker: https://framagit.org/unbonpetit/listofitems/issues +% % +% Author : Christian Tellechea, Steven B. Segletes % +% Status : Maintained % +% Maintainer : Christian Tellechea % +% Email : unbonpetit@netc.fr % +% steven.b.segletes.civ@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 2017-2018 -% 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 +% Copyright : Christian Tellechea 2016-2018 % +% 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 {% @@ -46,7 +47,7 @@ \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%% v\'erification de la pr`'esence de etex %%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%% vérification de la présence de etex %%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begingroup \edef\__tempa{\meaning\eTeXversion}\edef\__tempb{\string\eTeXversion}% @@ -55,38 +56,41 @@ \else \endgroup \loi_error{You are not using an eTeX engine, listofitems cannot work.}% - \expandafter\loi_restorecatcode\expandafter\endinput + \loi_restorecatcode\expandafter\endinput \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% macros auxiliaires %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%---- macros de d\'eveloppement et de manipulation d'arguments \chardef\loi_stop=0 \def\loi_quark{\loi_quark} \long\def\loi_identity#1{#1} -\def\loi_gobarg#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_i\expandafter{#2}{#1}}% \loi_exparg{}{} devient {<*b>} -\long\def\loi_exparg_i#1#2{#2{#1}} -\long\def\loi_expafter#1#2{\expandafter\loi_expafter_i\expandafter{#2}{#1}}% \loi_expafter{}{} devient <*b> -\long\def\loi_expafter_i#1#2{#2#1} +\long\def\loi_exparg#1#2{\expandafter\loi_exparg_a\expandafter{#2}{#1}}% \loi_exparg{}{} devient {<*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{}{} devient <*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_i{#1}} -\def\loi_argcsname_i#1#2{\loi_expafter{#1}{\csname#2\endcsname}} +\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 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% 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_i{\loi_ifx{*\loi_nxttok}{\loi_first{#1}}{#2}}\futurelet\loi_nxttok\loi_ifstar_i} +\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_ifprimitive#1{\edef\loi_tempa{\meaning#1}\edef\loi_tempb{\string#1}\loi_ifx{\loi_tempa\loi_tempb}} -\long\def\loi_ifcs#1{% #1 est-il une sc (n'\'etant pas une primitive) ? +\long\def\loi_ifcs#1{% #1 est-il une sc (n'étant pas une primitive) ? \loi_ifempty{#1} - \loi_second% si #1 est vide, faux + {\loi_second + } {\loi_ifspacefirst{#1} \loi_second% si espace en 1er, faux {\loi_exparg\loi_ifempty{\loi_gobarg#1}% 1 seul token ? @@ -99,36 +103,176 @@ \endgroup\expandafter\loi_second \fi } - \loi_second% si plusieurs tokens, faux + {\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 +} -%--- macro de type for -% Voir codes 150 \`a 155 ici --> http://progtex.fr/wp-content/uploads/2014/09/code.txt -% et pages 175 \`a 184 du livre "Apprendre \`a programmer en TeX" +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%% 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écute le code + \loi_foreach_a##1% + }% + }% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%% macros gérant 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é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}% + }% + \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éparateur #4=résultat #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é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}% + }% + }% + \expandafter\loi_grabpaired_expr_b\loi_remain\_nil + }% +} +\def\insidepair#1#2#3#4{% #1#2=paire #3=expr #4=macro reçevant le resultat + \loi_if_validpair#1#2% + {\loi_ifcs{#3} + {\loi_exparg{\insidepair#1#2}{#3}#4% + } + {\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}}% + {\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à, 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_i\csname loi_fornum_\string#1\expandafter\endcsname\expandafter{\number\numexpr#3\expandafter}\loi_sgncmp#1% + \expandafter\loi_fornum_a\csname loi_fornum_\string#1\expandafter\endcsname\expandafter{\number\numexpr#3\expandafter}\loi_sgncmp#1% } -\long\def\loi_fornum_i#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} +\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} -%--- macros retirant les espaces extr\^emes -% Voir codes 320 \`a 324 ici --> http://progtex.fr/wp-content/uploads/2014/09/code.txt -% et pages 339 \`a 343 de "Apprendre \`a programmer en TeX" -\long\def\loi_ifspacefirst#1{\expandafter\loi_ifspacefirst_i\detokenize{#10} \_nil} -\long\def\loi_ifspacefirst_i#1 #2\_nil{\loi_ifempty{#1}} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%% 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}} \expandafter\def\expandafter\loi_gobspace\space{} -\def\loi_removefirstspaces{\romannumeral\loi_removefirstspaces_i} -\long\def\loi_removefirstspaces_i#1{\loi_ifspacefirst{#1}{\expandafter\loi_removefirstspaces_i\expandafter{\loi_gobspace#1}}{\loi_stop#1}} +\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_i#1^^00 ^^00\_nil} -\long\def\loi_removelastspaces_i#1 ^^00{\loi_removelastspaces_ii#1^^00} -\long\def\loi_removelastspaces_ii#1^^00#2\_nil{\loi_ifspacefirst{#2}{\loi_removelastspaces_i#1^^00 ^^00\_nil}{\loi_stop#1}} +\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\`u les espaces extr\^emes sont retir\'es +\long\def\loi_removeextremespaces#1{% #1=texte où les espaces extrêmes sont retirés \romannumeral\expandafter\expandafter\expandafter\loi_removelastspaces\expandafter\expandafter\expandafter {\expandafter\expandafter\expandafter\loi_stop\loi_removefirstspaces{#1}}% } @@ -136,27 +280,31 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% macro publique \setsepchar %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\setsepchar{\futurelet\loi_nxttok\setsepchar_i} -\def\setsepchar_i{\loi_ifx{[\loi_nxttok}\setsepchar_ii{\setsepchar_ii[/]}} -\long\def\setsepchar_ii[#1]#2{% #1=sepcar de #2= +\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 #2= \loi_ifempty{#1} {\loi_error{Empty separator not allowed, separator "/" used}% - \setsepchar_ii[/]{#2}% + \setsepchar_b[/]{#2}% } {\def\loi_currentsep{#1}% \_removeextremespacesfalse - \loi_nestcnt1 % r\'einitaliser niveau initial \`a 1 + \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_listofpair_saved\loi_list_ofpair + \let\loi_list_ofpair\empty \loi_ifempty{#2} {\loi_error{Empty list of separators not allowed, "," used}% - \readlist_iv1{,}% + \readlist_e1{,}% } - {\readlist_iv1{#2}}% + {\readlist_e1{#2}% + }% \loi_argcsname\let\nestdepth{loi_listofseplen[0]}% - \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de s\'eparation + \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de séparation + \let\loi_listofpair\loi_listofpair_saved }% } @@ -166,108 +314,125 @@ \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_i1{}{#3}{#1}#2,\loi_quark,}% + {\loi_normalizeindex_a1{}{#3}{#1}#2,\loi_quark,}% }% -\def\loi_normalizeindex_i#1#2#3#4#5,{% #1=compteur de profondeur #2=index pr\'ec\'edents #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_iii#2\loi_quark}% supprimer la derni\`ere 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_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_ii{\number\numexpr#5\ifnum\numexpr#5<0 +\csname #4len[#20]\endcsname+1\fi}{#1}{#2}{#3}{#4}} + {\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_ii#1#2#3{\loi_exparg\loi_normalizeindex_i{\number\numexpr#2+1}{#3#1,}}% #1=index \`a rajouter #2=compteur de profondeur #3=index pr\'ec\'edents -\def\loi_normalizeindex_iii#1,\loi_quark{\loi_stop{}{#1}} -\def\loi_invalidindex#1#2{\loi_ifempty{#2}{\loi_invalidindex_i{#1},}\loi_invalidindex_i{#1}{#2}} -\def\loi_invalidindex_i#1#2{\loi_invalidindex_ii#1\loi_quark#2\loi_quark} -\def\loi_invalidindex_ii#1[.]#2\loi_quark#3,\loi_quark#4\loi_quark,{\loi_stop{#1[#3]#2}{#3}}% #4= index ignor\'es +\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{\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és %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% macro publique \readlist %%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcount\loi_nestcnt -\def\greadlist{\let\loi_def\gdef\let\loi_edef\xdef\def\loi_let{\global\let}\readlist_o}% -\def\readlist{\let\loi_def\def\let\loi_edef\edef\let\loi_let\let\readlist_o} -\def\readlist_o{% +\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_i}{\_removeextremespacesfalse\readlist_i}% + \loi_ifstar{\_removeextremespacestrue\readlist_b}{\_removeextremespacesfalse\readlist_b}% } -\long\def\readlist_i#1#2{% #1=macro stockant les \'el\'ements #2=liste des \'el\'ements +\long\def\readlist_b#1#2{% #1=macro stockant les éléments #2=liste des éléments \loi_ifcs{#2} - {\loi_exparg{\readlist_i#1}{#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\`ere - \loi_argcsname\loi_def{\loi_listname sep[]}{}% s\'eparateur vide + \loi_argcsname\loi_def{\loi_listname[]}{#2}% la liste entière + \loi_argcsname\loi_def{\loi_listname sep[]}{}% séparateur 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_auxmacrolistitem\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_auxmacrolistitem\romannumeral\loi_normalizeindex}{\loi_listname}{##1}{\csname\loi_listname nest\endcsname}{\loi_listname sep}}% - \readlist_ii{#2}% + {\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_auxmacrolistitem#1#2#3{% +\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_ii{% +\def\readlist_c{% \loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}% - \expandafter\readlist_iii\loi_currentsep||\_nil + \expandafter\readlist_d\loi_currentsep||\_nil } -\long\def\readlist_iii#1||#2\_nil#3{\readlist_iv1{#3#1}}% #1= #3=liste -> rajoute un \'el\'ement vide pour le test ifempty ci dessous -\long\def\readlist_iv#1#2{% #1=compteur d'index #2=liste d'\'el\'ements \`a examiner +\long\def\readlist_d#1||#2\_nil#3{\readlist_e1{#3#1}}% #1= #3=liste -> rajoute un élément vide pour le test \ifempty ci dessous +\long\def\readlist_e#1#2{% #1=compteur d'index #2=liste d'éléments à examiner terminée par >>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_let{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname\number\numexpr#1-1\relax]}\empty% le dernier est ##NEW v1.52 \advance\loi_nestcnt-1 \loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}% } - {\loi_expafter{\readlist_vi{#2}{}}\loi_currentsep||\loi_quark||#2\_nil{#1}}% aller isoler le 1er item -} -\long\def\readlist_v#1#2{\readlist_vi{#2}{}#1||\loi_quark||#2\_nil}% #1=liste s\'eparateurs (s\'ep=||) #2=chaine de tokens -\long\def\readlist_vi#1#2#3||{% #1=liste restante #2=dernier #3= - \loi_ifx{\loi_quark#3} - {\loi_ifempty{#2}% si #1 vide, aucun n'a \'et\'e trouv\'e, il reste \`a lire "\_nil" - {\long\def\readlist_vii##1\_nil##2{\loi_exparg{\readlist_ix{##2}{}}{\loi_gobarg##1}{#2}}}% ##2=compteur d'index - {\long\def\readlist_vii##1#2{\loi_exparg\readlist_viii{\loi_gobarg##1}\relax}% - \long\def\readlist_viii##1##2\_nil##3{\loi_exparg{\readlist_ix{##3}}{\loi_gobarg##2}{##1}{#2}}% ##3=compteur d'index + {\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= #3= + \loi_ifx{\loi_quark#3}% on a épuisé tous les ? RESTE à lire \_nil{} + {\loi_ifempty{#2}% si #2 vide, aucun n'a été trouvé, il reste à lire "\_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éfinies ? + {\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_vii\relax% le \relax meuble l'argument d\'elimit\'e + \readlist_g\relax% le \relax meuble l'argument délimité } - {\long\def\readlist_vii##1#3##2\_nil{% + {\long\def\readlist_g##1#3##2\_nil{% \loi_ifempty{##2}% si ne contient pas le - {\readlist_vi{#1}{#2}}% recommencer avec le m\^eme - {\loi_exparg\readlist_vi{\loi_gobarg##1#3}{#3}}% sinon raccourcir et :=% ##BUGFIX v1.53 + {\readlist_f{#1}{#2}% recommencer avec le même + }% + {\loi_ifx{\loi_listofpair\empty}% si pas de paires définies + {\loi_exparg\readlist_f{\loi_gobarg##1#3}{#3}% raccourcir et :=% ##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_vii\relax#1#3\_nil% ##BUGFIX v1.53 + \readlist_g\relax#1#3\_nil% ##BUGFIX v1.53 }% } -\long\def\readlist_ix#1#2#3{% #1=compteur d'index #2=liste restante #3=\'el\'ement courant - \loi_ifnum{0\loi_exparg\loi_ifspacefirst{\loi_currentsep}{}1\if_removeextremespaces1\fi=11 }% s'il faur retirer les espaces extr\^emes - {\loi_exparg{\loi_exparg{\readlist_x{#1}{#2}}}{\loi_removeextremespaces{#3}}}% red\'efinir l'\'el\'ement courant - {\readlist_x{#1}{#2}{#3}}% +\long\def\readlist_h#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_removeextremespaces1\fi=11 }% s'il faur retirer les espaces extrêmes + {\loi_exparg{\loi_exparg{\readlist_i{#1}{#2}}}{\loi_removeextremespaces{#3}}}% redéfinir l'élément courant + {\readlist_i{#1}{#2}{#3}}% } -\long\def\readlist_x#1#2#3#4{% #1=compteur d'index #2=liste restante #3=\'el\'ement courant #4=sep utilis\'e +\long\def\readlist_i#1#2#3#4{% #1=compteur d'index #2=liste restante #3=élément courant #4=sep utilisé \loi_ifnum{0\if_ignoreemptyitems1\fi\loi_ifempty{#3}1{}=11 } - {\readlist_iv{#1}{#2}}% si l'on n'ignore pas les \'el\'ements vides : - {\loi_argcsname\loi_def{\loi_listname[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#3}% assignation de l'item ctuel \`a la macro - \loi_argcsname\loi_def{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#4}% assignation du actuel \`a la macro \sep + {\readlist_e{#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 de l'item ctuel à la macro + \loi_argcsname\loi_def{\loi_listname sep[\csname loi_previndex[\number\loi_nestcnt]\endcsname#1]}{#4}% assignation du actuel à la macro \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_ii{#3}% recommencer avec l'\'el\'ement courant + \readlist_c{#3}% recommencer avec l'élément courant } {}% - \loi_exparg\readlist_iv{\number\numexpr#1+1}{#2}% puis chercher l'\'el\'ement suivant dans la liste restante + \loi_exparg\readlist_e{\number\numexpr#1+1}{#2}% puis chercher l'élément suivant dans la liste restante }% } @@ -277,12 +442,12 @@ \def\listlen#1[#2]{% \romannumeral\loi_ifempty{#2} {\expandafter\expandafter\expandafter\loi_stop\csname\loi_macroname#1len[0]\endcsname} - {\loi_exparg\listlen_i{\romannumeral-`\.\loi_macroname#1}{#2}}% + {\loi_exparg\listlen_a{\romannumeral-`\.\loi_macroname#1}{#2}}% } -\def\listlen_i#1#2{% #1=macro name #2=index non normalis\'e prendre - \loi_exparg{\expandafter\listlen_ii\romannumeral\loi_normalizeindex{#1}{#2}}{\number\numexpr\csname#1nest\endcsname-1}{#1}% +\def\listlen_a#1#2{% #1=macro name #2=index non normalisé prendre + \loi_exparg{\expandafter\listlen_b\romannumeral\loi_normalizeindex{#1}{#2}}{\number\numexpr\csname#1nest\endcsname-1}{#1}% } -\def\listlen_ii#1#2#3{% #1=err #2=index normalis\'e #3=macroname +\def\listlen_b#1#2#3{% #1=err #2=index normalisé #3=macroname \expandafter\expandafter\expandafter\loi_stop\csname#3len[#2,0]\expandafter\endcsname \romannumeral\loi_ifempty{#1}{\loi_stop}{\loi_stop\loi_error{#1}}% } @@ -291,15 +456,15 @@ %%%%%%%%%%%%%%%%%%%%%%%%% macro \foreachitem %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\foreachitem#1\in#2{% - \edef\foreachitem_i{\noexpand\foreachitem_iii\noexpand#1{\expandafter\noexpand\csname\loi_macroname#1cnt\endcsname}{\loi_macroname#2}}% - \futurelet\loi_nxttok\foreachitem_ii + \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_ii{\loi_ifx{\loi_nxttok[}\foreachitem_i{\foreachitem_i[]}} -\def\foreachitem_iii#1#2#3[#4]{% prendre - \loi_exparg{\expandafter\foreachitem_iv\romannumeral\loi_normalizeindex{#3}{#4}}{\number\numexpr\csname#3nest\endcsname-1}#1{#2}{#3}% +\def\foreachitem_b{\loi_ifx{\loi_nxttok[}\foreachitem_a{\foreachitem_a[]}} +\def\foreachitem_c#1#2#3[#4]{% prendre + \loi_exparg{\expandafter\foreachitem_d\romannumeral\loi_normalizeindex{#3}{#4}}{\number\numexpr\csname#3nest\endcsname-1}#1{#2}{#3}% } -\def\foreachitem_iv#1#2{\loi_ifempty{#2}{\foreachitem_v{#1}{}}{\foreachitem_v{#1}{#2,}}}% #1=err #2=index norm -\long\def\foreachitem_v#1#2#3#4#5#6{% #1=err #2=index norm #3=macroiter #4=compteur associ\'e #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_fornum#4=1to\csname#5len[#20]\endcsname\do{\loi_argcsname\let#3{#5[#2#4]}#6}% @@ -310,14 +475,14 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%% macro \showitem %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\showitems{\loi_ifstar{\let\showitems_cmd\detokenize\showitems_i}{\let\showitems_cmd\loi_identity\showitems_i}} -\def\showitems_i#1{\def\showitems_ii{\showitems_iv#1}\futurelet\loi_nxttok\showitems_iii} -\def\showitems_iii{\loi_ifx{\loi_nxttok[}\showitems_ii{\showitems_ii[]}} -\def\showitems_iv#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_ater\in#1[#2]{\showitemsmacro{\expandafter\showitems_cmd\expandafter{\showitems_ater}}}} \unless\ifdefined\fbox - \newdimen\fboxrule \newdimen\fboxsep \fboxrule=.4pt \fboxsep=3pt % r\'eglages identiques \`a LaTeX - \def\fbox#1{% imitation de la macro \fbox de LaTeX, voir codes 251 \`a 254 ici --> http://progtex.fr/wp-content/uploads/2014/09/code.txt - \hbox{% et pages 271 \`a 274 de "Apprendre \`a 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}}% @@ -326,7 +491,7 @@ }% } \fi -\def\showitemsmacro#1{% encadrement par d\'efaut +\def\showitemsmacro#1{% encadrement par défaut \begingroup\fboxsep=0.25pt \fboxrule=0.5pt \fbox{\strut#1}\endgroup \hskip0.25em\relax } @@ -336,50 +501,52 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \def\itemtomacro#1[#2]{% #1[#2]=item non encore lu: #3=macro \edef\loi_listname{\loi_macroname#1}% - \loi_exparg{\expandafter\itemtomacro_i\romannumeral\expandafter\loi_normalizeindex\expandafter{\loi_listname}{#2}}{\csname\loi_listname nest\endcsname}\let + \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_i\romannumeral\expandafter\loi_normalizeindex\expandafter{\loi_listname}{#2}}{\csname\loi_listname nest\endcsname}{\global\let}% + \loi_exparg{\expandafter\itemtomacro_a\romannumeral\expandafter\loi_normalizeindex\expandafter{\loi_listname}{#2}}{\csname\loi_listname nest\endcsname}{\global\let}% } -\def\itemtomacro_i#1#2#3#4{% +\def\itemtomacro_a#1#2#3#4{% \loi_ifempty{#1}{}{\loi_error{#1}}% \loi_argcsname#3#4{\loi_listname[#2]}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%% r\'eglages par d\'efaut %%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%% réglages par défaut %%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newif\if_removeextremespaces \newif\if_ignoreemptyitems \let\ignoreemptyitems\_ignoreemptyitemstrue \let\reademptyitems\_ignoreemptyitemsfalse \setsepchar{,} +\defpair{} +\loi_def_foreachsep{,} \reademptyitems \loi_restorecatcode \endinput ###################################################################### -# Historique # +############################ Historique ############################# ###################################################################### v1.0 19/8/2016 - - Premi\`ere version publique + - Première version publique v1.1 01/09/2016 - - Stockage des s\'eparateurs dans sep - - bug corrig\'e dans \loi_restorecatcode + - Stockage des séparateurs dans sep + - bug corrigé dans \loi_restorecatcode v1.2 22/10/2016 - - macros \greadlist et \gitemtomacro pour la globalit\'e + - macros \greadlist et \gitemtomacro pour la globalité v1.3 18/11/2016 - - bugs corrig\'es dans la gestion de la globalit\'e + - bugs corrigés dans la gestion de la globalité v1.4 05/10/2017 - - test \loi_ifprimitive ajout\'e au test \loi_ifcs - - suppression de \loi_expafternil, cr\'eation 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 @@ -391,7 +558,10 @@ v1.51 24/10/2017 - correction d'un bug dans \loi_ifcs v1.52 13/01/2018 - - le dernier s\'eparateur est + - le dernier séparateur est v1.53 13/03/2018 - - correction d'un bug dans \readlist_vii \ No newline at end of file + - correction d'un bug dans \readlist_g + +v1.6 01/11/2018 + - possibilité d'appariement de tokens dans les items \ No newline at end of file -- cgit v1.2.3