diff options
author | Karl Berry <karl@freefriends.org> | 2019-05-18 21:15:12 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-05-18 21:15:12 +0000 |
commit | 20bfb136906fc9e1af89bf0acd394849ed222944 (patch) | |
tree | 8cb88697a90a18ae9a9675608a351576eef378e0 /Master/texmf-dist/tex/generic/listofitems | |
parent | 13ba2a905cf4855cd84ff334c7d1e6efdf113fd4 (diff) |
listofitems (18may19)
git-svn-id: svn://tug.org/texlive/trunk@51156 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/generic/listofitems')
-rw-r--r-- | Master/texmf-dist/tex/generic/listofitems/listofitems.sty | 1 | ||||
-rw-r--r-- | Master/texmf-dist/tex/generic/listofitems/listofitems.tex | 313 |
2 files changed, 170 insertions, 144 deletions
diff --git a/Master/texmf-dist/tex/generic/listofitems/listofitems.sty b/Master/texmf-dist/tex/generic/listofitems/listofitems.sty index 4625f5a4608..fb45d1dfab2 100644 --- a/Master/texmf-dist/tex/generic/listofitems/listofitems.sty +++ b/Master/texmf-dist/tex/generic/listofitems/listofitems.sty @@ -1,3 +1,4 @@ +\expandafter\let\csname loi_fromsty\endcsname\relax \input listofitems.tex \ProvidesPackage\loiname[\loidate\space v\loiver\space Grab items in lists using user-specified sep char (CT)] \endinput
\ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/listofitems/listofitems.tex b/Master/texmf-dist/tex/generic/listofitems/listofitems.tex index 644200a6f0a..992765cb1d7 100644 --- a/Master/texmf-dist/tex/generic/listofitems/listofitems.tex +++ b/Master/texmf-dist/tex/generic/listofitems/listofitems.tex @@ -4,9 +4,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \def\loiname {listofitems} % -\def\loiver {1.61} % +\def\loiver {1.62} % % % -\def\loidate {2019/03/03} % +\def\loidate {2019/05/18} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % @@ -29,40 +29,46 @@ % 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 %%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%% 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 - \def\loi_error#1{\PackageError\loiname{#1}{Read the manual}}% pour LaTeX + \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 \fi %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%% vérification de la présence de etex %%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% vérification des prérequis %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\begingroup -\edef\__tempa{\meaning\eTeXversion}\edef\__tempb{\string\eTeXversion}% -\ifx\__tempa\__tempb - \endgroup -\else +\def\loi_checkprimitive#1#2#3{% Vérifie que #1 est une primitive et sinon, émet le message #2 et exécute #3 + \begingroup + \edef\__tempa{\meaning#1}\edef\__tempb{\string#1}\expandafter \endgroup - \loi_error{You are not using an eTeX engine, listofitems cannot work.}% - \loi_restorecatcode\expandafter\endinput -\fi + \ifx\__tempa\__tempb\else + \loi_error{#2}% + \def\loi_temp{#3}% + \loi_restorecatcode\expandafter\loi_temp + \fi +} +\loi_checkprimitive\eTeXversion + {You are not using an eTeX engine, listofitems cannot work.} + {\endinput}% +\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}% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%% macros auxiliaires %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chardef\loi_stop=0 \def\loi_quark{\loi_quark} \long\def\loi_identity#1{#1} \long\def\loi_gobarg#1{} @@ -86,34 +92,35 @@ \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é d'une sc _développable_ ? +\edef\loi_escapechar{\expandafter\loi_gobarg\string\\} +\long\def\loi_ifcsexpandable#1{% #1 est-il constitué d'une seule sc _développable_ ? \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}% + {\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% si plusieurs tokens, faux + {\loi_second }% }% }% } -\def\loi_ifinrange#1[[#2:#3]]{\loi_ifnum{\numexpr(#1-#2)*(#1-#3)>0 }\loi_second\loi_first} +\def\loi_ifinrange#1[[#2:#3]]{\expandafter\unless\loi_ifnum{\numexpr(#1-#2)*(#1-#3)>0 }} \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 %%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%% macro \loi_foreach %%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcount\loi_cnt_foreach_nest \loi_cnt_foreach_nest=0 \def\end_foreach{\end_foreach} @@ -136,7 +143,7 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%% macros gérant l'appariement %%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%% macros gérant l'appariement %%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \long\def\defpair#1{% \let\loi_listofpair\empty @@ -205,7 +212,11 @@ \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_expafter{\long\def\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 @@ -248,32 +259,38 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%% macro \loi_fornum %%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% 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% + \edef#1{\number\numexpr#2}% + \expandafter\loi_fornum_a + \csname loi_fornum_\string#1\expandafter\endcsname\expandafter + {\number\numexpr#3\expandafter}% + \expanded{\ifnum#1<\numexpr#3\relax>+\else<-\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% } -\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êmes %%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%% 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_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} +\loi_expafter{\def\loi_gobspace}\space{} +\def\loi_removefirstspaces#1{\loi_ifspacefirst{#1}{\loi_exparg\loi_removefirstspaces{\loi_gobspace#1}}{\unexpanded{#1}}} +\begingroup \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ù les espaces extrêmes sont retirés - \romannumeral\expandafter\expandafter\expandafter\loi_removelastspaces\expandafter\expandafter\expandafter - {\expandafter\expandafter\expandafter\loi_stop\loi_removefirstspaces{#1}}% -} +\long\gdef\loi_removelastspaces#1{\loi_removelastspaces_a#1^^00 ^^00\_nil} +\long\gdef\loi_removelastspaces_a#1 ^^00{\loi_removelastspaces_b#1^^00} +\long\gdef\loi_removelastspaces_b#1^^00#2\_nil{\loi_ifspacefirst{#2}{\loi_removelastspaces_a#1^^00 ^^00\_nil}{\unexpanded{#1}}} +\endgroup +\long\def\loi_removeextremespaces#1{\expanded{\loi_exparg\loi_removelastspaces{\expanded{\loi_removefirstspaces{#1}}}}} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%% macro publique \setsepchar %%%%%%%%%%%%%%%%%%%%% @@ -296,9 +313,9 @@ \let\loi_list_ofpair\empty \loi_ifempty{#2} {\loi_error{Empty list of separators not allowed, "," used}% - \readlist_e1{,}% + \readlist_g1{,}% } - {\readlist_e1{#2}% + {\readlist_g1{#2}% }% \loi_argcsname\let\nestdepth{loi_listofseplen[0]}% \loi_argcsname\let\loi_currentsep{loi_listofsep[1]}% 1er car de séparation @@ -307,12 +324,12 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%% macro normalisant l'index %%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%% macro normalisant l'index %%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\loi_normalizeindex#1#2#3{% #1=macroname #2=liste d'index #3=profondeur max --> renvoie {err}{indx norm} +\def\loi_normalizeindex#1#2{% #1=macroname #2=liste d'index --> renvoie {err}{indx norm} \loi_ifempty{#2} - {\loi_stop{}{}} - {\loi_normalizeindex_a1{}{#3}{#1}#2,\loi_quark,}% + {{}{}} + {\loi_exparg{\loi_normalizeindex_a1{}}{\number\csname#1nest\endcsname}{#1}#2,\loi_quark,}% }% \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} @@ -328,10 +345,10 @@ }% } \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_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,{\loi_stop{#1[#3]#2}{#3}}% #4= index ignorés +\def\loi_invalidindex_b#1[.]#2\loi_quark#3,\loi_quark#4\loi_quark,{{#1[#3]#2}{#3}}% #4= index ignorés %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%% macro publique \readlist %%%%%%%%%%%%%%%%%%%%%% @@ -349,88 +366,91 @@ {\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è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_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 - }% + \loi_exparg{\readlist_c#1{#2}}{\loi_listname}%% + }% +} +\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ère + \loi_argcsname\loi_def{#3sep[]}{}% séparateur vide + \loi_ifempty{#2} + {\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}}}% + \readlist_e{#2}% + \loi_argcsname\loi_argcsname\loi_let{#3len}{#3len[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_d#1#2#3{% + \unexpanded\expandafter\expandafter\expandafter{\csname#3[#2]\expandafter\endcsname\expandafter}% + \expanded{\loi_ifempty{#1}{}{\unexpanded{\unexpanded{\loi_error{#1}}}}}% } -\def\readlist_c{% +\def\readlist_e{% \loi_argcsname\loi_let\loi_currentsep{loi_listofsep[\number\loi_nestcnt]}% - \expandafter\readlist_d\loi_currentsep||\_nil + \expandafter\readlist_f\loi_currentsep||\_nil } -\long\def\readlist_d#1||#2\_nil#3{\readlist_e1{#3#1}}% #1=<sep courant simple> #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 <sep courant simple> >>RIEN laissé après +\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_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 + {\loi_expafter{\readlist_h{#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é> #3=<sep courant> +\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_g##1\_nil##2{\loi_exparg{\readlist_h{##2}{}}{\loi_gobarg##1}{#2}}% ##2=compteur d'index + {\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éfinies ? - {\long\def\readlist_g##1#2##2\_nil##3{\loi_exparg{\readlist_h{##3}{##2}}{\loi_gobarg##1}{#2}}% + {\long\def\readlist_i##1#2##2\_nil##3{\loi_exparg{\readlist_j{##3}{##2}}{\loi_gobarg##1}{#2}}% } - {\long\def\readlist_g##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_h{##2}}{\loi_grabpaired_remain}}{\loi_grabpaired_result}{#2}}% + \loi_exparg{\loi_exparg{\readlist_j{##2}}{\loi_grabpaired_remain}}{\loi_grabpaired_result}{#2}}% }% }% - \readlist_g\relax% le \relax meuble l'argument délimité + \readlist_i\relax% le \relax meuble l'argument délimité } - {\long\def\readlist_g##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_f{#1}{#2}% recommencer avec le même <sep utile> + {\readlist_h{#1}{#2}% recommencer avec le même <sep utile> }% {\loi_ifx{\loi_listofpair\empty}% si pas de paires définies - {\loi_exparg\readlist_f{\loi_gobarg##1#3}{#3}% raccourcir <liste restante> et <sep courant>:=<sep utile>% ##BUGFIX v1.53 + {\loi_exparg\readlist_h{\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}% + \loi_exparg\readlist_h{\loi_grabpaired_result#3}{#3}% }% }% }% - \readlist_g\relax#1#3\_nil% ##BUGFIX v1.53 + \readlist_i\relax#1#3\_nil% ##BUGFIX v1.53 }% } -\long\def\readlist_h#1#2#3{% #1=compteur d'index #2=liste restante #3=élément courant +\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_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}}% + {\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_i#1#2#3#4{% #1=compteur d'index #2=liste restante #3=élément courant #4=sep utilisé +\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_ignoreemptyitems1\fi\loi_ifempty{#3}1{}=11 } - {\readlist_e{#1}{#2}% si l'on n'ignore pas les éléments vides + {\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 de l'item ctuel à la macro \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 \loi_argcsname\edef{loi_previndex[\number\loi_nestcnt]}{\csname loi_previndex[\number\numexpr\loi_nestcnt-1]\endcsname#1,}% - \readlist_c{#3}% recommencer avec l'élément courant + \readlist_e{#3}% recommencer avec l'élément courant } {}% - \loi_exparg\readlist_e{\number\numexpr#1+1}{#2}% puis chercher l'élément suivant dans la liste restante + \loi_exparg\readlist_g{\number\numexpr#1+1}{#2}% puis chercher l'élément suivant dans la liste restante }% } @@ -438,16 +458,18 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%% 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}}% + \expanded{% + \loi_ifempty{#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é prendre <profondeur max-1> - \loi_exparg{\expandafter\listlen_b\romannumeral\loi_normalizeindex{#1}{#2}}{\number\numexpr\csname#1nest\endcsname-1}{#1}% + \expandafter\listlen_b\expanded{\loi_normalizeindex{#1}{#2}}{#1}% } \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}}% + \csname#3len[#2,0]\expandafter\endcsname + \expanded{\loi_ifempty{#1}{}{\unexpanded{\unexpanded{\loi_error{#1}}}}}% } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -459,7 +481,7 @@ } \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}% + \expandafter\foreachitem_d\expanded{\loi_normalizeindex{#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é #5=nom de macrolist #6=code @@ -471,12 +493,12 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%% macro \showitem %%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%% 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}}}} +\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églages identiques à LaTeX \def\fbox#1{% imitation de la macro \fbox de LaTeX, voir pages 271 à 274 de "Apprendre à programmer en TeX" @@ -499,11 +521,11 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \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 + \expandafter\itemtomacro_a\expanded{\loi_normalizeindex{\loi_listname}{#2}}\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}% + \expandafter\itemtomacro_a\expanded{\loi_normalizeindex{\loi_listname}{#2}}{\global\let}% } \def\itemtomacro_a#1#2#3#4{% \loi_ifempty{#1}{}{\loi_error{#1}}% @@ -511,62 +533,65 @@ } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%% réglages par défaut %%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%% 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 +\reademptyitems +\setsepchar{,} +\defpair{} \endinput -###################################################################### -############################ Historique ############################# -###################################################################### - -v1.0 19/8/2016 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%% historique %%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +v1.0 19/8/2016 - Première version publique - -v1.1 01/09/2016 +---------------------------------------------------------------------- +v1.1 01/09/2016 - Stockage des séparateurs dans <macrolist>sep - bug corrigé dans \loi_restorecatcode - -v1.2 22/10/2016 +---------------------------------------------------------------------- +v1.2 22/10/2016 - macros \greadlist et \gitemtomacro pour la globalité - -v1.3 18/11/2016 +---------------------------------------------------------------------- +v1.3 18/11/2016 - bugs corrigés dans la gestion de la globalité - -v1.4 05/10/2017 +---------------------------------------------------------------------- +v1.4 05/10/2017 - 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 - -v1.5 06/10/2017 + - 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 +---------------------------------------------------------------------- +v1.51 24/10/2017 - correction d'un bug dans \loi_ifcs - -v1.52 13/01/2018 +---------------------------------------------------------------------- +v1.52 13/01/2018 - le dernier séparateur est <vide> - -v1.53 13/03/2018 - - correction d'un bug dans \readlist_g - -v1.6 01/11/2018 +---------------------------------------------------------------------- +v1.53 13/03/2018 + - correction d'un bug dans \readlist_i +---------------------------------------------------------------------- +v1.6 01/11/2018 - 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éveloppable pour renvoyer vrai car il existe des sc - non développables && qui ne sont _pas_ des primitives. - Macro rebaptisée \loi_ifcsexpandable
\ No newline at end of file +---------------------------------------------------------------------- +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éveloppable pour + renvoyer vrai car il existe des sc non développables && qui ne + sont _pas_ des primitives. + Macro rebaptisée \loi_ifcsexpandable +---------------------------------------------------------------------- +v1.62 18/05/2019 + - utilisation de la nouvelle primitive \expanded au lieu du + désormais obsolète \romannumeral + - bug corrigé dans \loi_ifcsexpandable
\ No newline at end of file |