diff options
author | Karl Berry <karl@freefriends.org> | 2018-12-07 22:50:03 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-12-07 22:50:03 +0000 |
commit | a1f7397ce297f5e4894be98f450e6357f5b9bb0e (patch) | |
tree | 2cb84716d322e4914e6c18f7be803a3c1d72b543 | |
parent | 417a5d7ad39682f003da25a0aba56b5c63cc8e1e (diff) |
xstring (7dec18
git-svn-id: svn://tug.org/texlive/trunk@49342 c570f23f-e606-0410-a88d-b1316a301751
13 files changed, 3019 insertions, 1171 deletions
diff --git a/Master/texmf-dist/doc/generic/xstring/README b/Master/texmf-dist/doc/generic/xstring/README index 6af0fd06ab1..06e95f6ed4d 100644 --- a/Master/texmf-dist/doc/generic/xstring/README +++ b/Master/texmf-dist/doc/generic/xstring/README @@ -1,8 +1,8 @@ _________________ xstring package - v 1.7c - 2013/10/13 + v 1.8 + 2018/12/07 _________________ This package provides macros manipulating strings for programming use. @@ -81,12 +81,5 @@ Les principales fonctionnalités sont : Pour des méthodes de programmation avancées, d'autres commandes permettent d'utiliser les caractères spéciaux interdits dans les chaines (# %). -Ce paquet contient les 7 fichiers suivants : - * xstring.sty (le fichier sty pour LaTeX) - * xstring.tex (le package lui même) - * xstring_doc_en.tex and xstring_doc_en.pdf (manuel en anglais) - * xstring_doc_fr.tex and xstring_doc_fr.pdf (manuel en français) - * README (ce fichier) - Christian Tellechea - <unbonpetit@gmail.com>
\ No newline at end of file + <unbonpetit@netc.fr> diff --git a/Master/texmf-dist/doc/generic/xstring/test_etex.pdf b/Master/texmf-dist/doc/generic/xstring/test_etex.pdf Binary files differnew file mode 100644 index 00000000000..214487739e8 --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/test_etex.pdf diff --git a/Master/texmf-dist/doc/generic/xstring/test_etex.tex b/Master/texmf-dist/doc/generic/xstring/test_etex.tex new file mode 100644 index 00000000000..e7c7cdfaad6 --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/test_etex.tex @@ -0,0 +1,992 @@ +%##################### WARNING ##################### +% This is NOT a LaTeX file, it is a TeX file. +% It must be compiled with eTeX typing <etex test_etex> +%#################### ATTENTION #################### +% Ceci n'est PAS un fichier LaTeX, c'est un fichier TeX. +% Il doit être compilé avec eteX en tapant <etex test_etex> +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\input xstring +\def\delimiteur{-{}} +\font\hugerm=ecbx2000 +\font\hugett=ectt1750 +\font\largeboldrm=ecbx1300 +\font\largett=ectt1300 +\font\textfont=ecrm1000 +\textfont +\catcode`\@=11\relax +\gdef\exemple{\csname xs_ifstar\endcsname{\def\frontiere{\delimiteur}\csname xs_toks_toverb\endcsname}{\def\frontiere{}\csname xs_toks_toverb\endcsname}} +\expandafter\def\csname xs_assign_verb\endcsname#1{% + \noexpandarg + \tokenize\cs@resultat{#1}% + \fullexpandarg + \leavevmode\hbox to0.7\hsize{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil\par}% +\catcode`\@=12\relax +\def\chapitre#1#2{\vskip 6pt plus 2pt minus 2pt{{\largeboldrm#1} {\largett#2}}\vskip 3pt plus 1pt minus 1pt} +\def\AvecArgOptionnel{\vskip 6pt plus 2pt minus 2pt Mêmes exemples avec l'argument optionnel :\par} +\hoffset-1.54cm\hsize19cm\parindent0pt +% debut du texte +\hfil{\hugerm Ceci est le fichier de test de xstring}\hfil{} + +\hrule\vskip0.5ex + +\hrule\vskip2ex + +Attention : ce fichier {\tt test\_etex.tex} produit une sortie quasiment identique au fichier {\tt test\_latex.tex}, mais il doit se lancer avec Plain $\varepsilon$-\TeX. Pour des raison d'encodage, contrairement au fichier {\tt test\_latex.tex}, les arguments des macros présentées ici ne contiennent pas de lettres accentuées.\vskip2em + +Toutes les situations ne sont pas envisagées, mais au moins un grand nombre ! Les macros sont examinées dans l'ordre logique du code. + +Lorsque le résultat contient des espaces ou peut conduire à des doutes, il sera entouré de ''\delimiteur``, étant entendu que ''\delimiteur\delimiteur`` est une chaine vide.\vskip2em + +\hfill{\hugerm Le mode \hugett\string\fullexpandarg}\hfill{} + +\vskip-1ex\hfil\hbox to8cm{\hrulefill}\hfil{}\vskip3.5ex + +\chapitre{Le test}{IfSubStr} + +\exemple|\IfSubStr{abcdef}{cd}{vrai}{faux}| +\exemple|\IfSubStr{a b c d }{b c}{vrai}{faux}| +\exemple|\IfSubStr{a b c d }{bc}{vrai}{faux}| +\exemple|\IfSubStr{abcdef}{}{vrai}{faux}| +\exemple|\IfSubStr{a}{a}{vrai}{faux}| +\exemple|\IfSubStr{aaaa}{aa}{vrai}{faux}| +\exemple|\IfSubStr{a}{aa}{vrai}{faux}| +\exemple|\IfSubStr{a}{}{vrai}{faux}| +\exemple|\IfSubStr{}{a}{vrai}{faux}| +\exemple|\IfSubStr{}{}{vrai}{faux}| +\exemple|\IfSubStr[2]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[3]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[4]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[-2]{abaca}{a}{vrai}{faux}| + +\chapitre{Le test}{IfBeginWith} + +\exemple|\IfBeginWith{abcdef}{adc}{vrai}{faux}| +\exemple|\IfBeginWith{abcdef}{abcd}{vrai}{faux}| +\exemple|\IfBeginWith{ a b c }{ a}{vrai}{faux}| +\exemple|\IfBeginWith{a b c d}{ab}{vrai}{faux}| +\exemple|\IfBeginWith{a}{a}{vrai}{faux}| +\exemple|\IfBeginWith{a}{aa}{vrai}{faux}| +\exemple|\IfBeginWith{a}{}{vrai}{faux}| +\exemple|\IfBeginWith{}{a}{vrai}{faux}| +\exemple|\IfBeginWith{}{}{vrai}{faux}| + +\chapitre{Le test}{IfEndWith} + +\exemple|\IfEndWith{abcdef}{ab}{vrai}{faux}| +\exemple|\IfEndWith{abcdef}{f}{vrai}{faux}| +\exemple|\IfEndWith{ a b c }{c}{vrai}{faux}| +\exemple|\IfEndWith{ a b c }{ }{vrai}{faux}| +\exemple|\IfEndWith{a}{a}{vrai}{faux}| +\exemple|\IfEndWith{a}{aa}{vrai}{faux}| +\exemple|\IfEndWith{a}{}{vrai}{faux}| +\exemple|\IfEndWith{}{a}{vrai}{faux}| +\exemple|\IfEndWith{}{}{vrai}{faux}| + +\chapitre{Le test}{IfSubStrBefore} + +\exemple|\IfSubStrBefore{abcdef}{b}{e}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{e}{c}{vrai}{faux}| +\exemple|\IfSubStrBefore{ a b c }{ }{b}{vrai}{faux}| +\exemple|\IfSubStrBefore{ a b c }{ b}{c }{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{z}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{y}{z}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{a}{z}{vrai}{faux}| +\exemple|\IfSubStrBefore{aaa}{a}{aa}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{a}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{a}{b}{vrai}{faux}| +\exemple|\IfSubStrBefore{a}{}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{}{}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,3]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,4]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,2]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBefore[4,2]{maman papa}{a}{p}{vrai}{faux}| + +\chapitre{Le test}{IfStrBehind} + +\exemple|\IfSubStrBehind{abcdef}{b}{e}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{e}{c}{vrai}{faux}| +\exemple|\IfSubStrBehind{ a b c }{ }{b}{vrai}{faux}| +\exemple|\IfSubStrBehind{ a b c }{ c}{ a}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{z}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{y}{z}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{a}{z}{vrai}{faux}| +\exemple|\IfSubStrBehind{aaa}{a}{aa}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{a}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{a}{b}{vrai}{faux}| +\exemple|\IfSubStrBehind{a}{}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{}{}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,2]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,3]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,2]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[4,2]{maman papa}{a}{p}{vrai}{faux}| + +\chapitre{Le test}{IfInteger} + +\exemple|\IfInteger{156}{vrai}{faux}| +\exemple|\IfInteger{1.6}{vrai}{faux}| +\exemple|\IfInteger{7a5}{vrai}{faux}| +\exemple|\IfInteger{+9}{vrai}{faux}| +\exemple|\IfInteger{-15}{vrai}{faux}| +\exemple|\IfInteger{0}{vrai}{faux}| +\exemple|\IfInteger{-1,2}{vrai}{faux}| +\exemple|\IfInteger{1.}{vrai}{faux}| +\exemple|\IfInteger{-00}{vrai}{faux}| +\exemple|\IfInteger{+}{vrai}{faux}| +\exemple|\IfInteger{-}{vrai}{faux}| +\exemple|\IfInteger{.}{vrai}{faux}| +\exemple|\IfInteger{}{vrai}{faux}| + +\chapitre{Le test}{IfDecimal} + +\exemple|\IfDecimal{6}{vrai}{faux}| +\exemple|\IfDecimal{-78}{vrai}{faux}| +\exemple|\IfDecimal{3.14}{vrai}{faux}| +\exemple|\IfDecimal{3,14}{vrai}{faux}| +\exemple|\IfDecimal{1..5}{vrai}{faux}| +\exemple|\IfDecimal{-9.8}{vrai}{faux}| +\exemple|\IfDecimal{+9.8}{vrai}{faux}| +\exemple|\IfDecimal{-9,8}{vrai}{faux}| +\exemple|\IfDecimal{+9,8}{vrai}{faux}| +\exemple|\IfDecimal{+6.7.}{vrai}{faux}| +\exemple|\IfDecimal{.5}{vrai}{faux}| +\exemple|\IfDecimal{1.}{vrai}{faux}| +\exemple|\IfDecimal{-.99}{vrai}{faux}| +\exemple|\IfDecimal{-5.}{vrai}{faux}| +\exemple|\IfDecimal{5a9.}{vrai}{faux}| +\exemple|\IfDecimal{+}{vrai}{faux}| +\exemple|\IfDecimal{-}{vrai}{faux}| +\exemple|\IfDecimal{.}{vrai}{faux}| +\exemple|\IfDecimal{}{vrai}{faux}| + +\chapitre{Le test}{IfStrEq} + +\exemple|\IfStrEq{abcdef}{abcdef}{vrai}{faux}| +\exemple|\IfStrEq{a b c}{a b c}{vrai}{faux}| +\exemple|\IfStrEq{abcd}{abc}{vrai}{faux}| +\exemple|\IfStrEq{aab}{ab}{vrai}{faux}| +\exemple|\IfStrEq{aab}{aa}{vrai}{faux}| +\exemple|\IfStrEq{1.2}{1.20}{vrai}{faux}| +\exemple|\IfStrEq{3,4}{3.4}{vrai}{faux}| +\exemple|\IfStrEq{ }{ }{vrai}{faux}| +\exemple|\IfStrEq{}{a}{vrai}{faux}| +\exemple|\IfStrEq{a}{}{vrai}{faux}| +\exemple|\IfStrEq{}{}{vrai}{faux}| + +\chapitre{Le test}{IfEq} + +\exemple|\IfEq{abcdef}{abcdef}{vrai}{faux}| +\exemple|\IfEq{a b c}{a b c}{vrai}{faux}| +\exemple|\IfEq{abcd}{abc}{vrai}{faux}| +\exemple|\IfEq{aab}{ab}{vrai}{faux}| +\exemple|\IfEq{aab}{aa}{vrai}{faux}| +\exemple|\IfEq{1.2}{1.20}{vrai}{faux}| +\exemple|\IfEq{+1.0000}{1}{vrai}{faux}| +\exemple|\IfEq{-10}{10}{vrai}{faux}| +\exemple|\IfEq{1,2}{1.2}{vrai}{faux}| +\exemple|\IfEq{.5}{0.5}{vrai}{faux}| +\exemple|\IfEq{,5}{0,5}{vrai}{faux}| +\exemple|\IfEq{10}{dix}{vrai}{faux}| +\exemple|\IfEq{123}{1a3}{vrai}{faux}| +\exemple|\IfEq{0}{}{vrai}{faux}| +\exemple|\IfEq{++10}{+10}{vrai}{faux}| +\exemple|\IfEq{--10}{+10}{vrai}{faux}| +\exemple|\IfEq{a}{}{vrai}{faux}| +\exemple|\IfEq{}{a}{vrai}{faux}| +\exemple|\IfEq{}{}{vrai}{faux}| + +\chapitre{La macro}{StrBefore} + +\exemple|\StrBefore{abcedef}{e}| +\exemple*|\StrBefore{abcdef}{a}| +\exemple*|\StrBefore{abcdef}{z}| +\exemple*|\StrBefore{a b c d}{c}| +\exemple*|\StrBefore{a b c d}{ }| +\exemple*|\StrBefore[2]{a b c d}{ }| +\exemple*|\StrBefore[3]{a b c d}{ }| +\exemple*|\StrBefore[9]{a b c d}{ }| +\exemple*|\StrBefore[-7]{a b c d}{ }| +\exemple*|\StrBefore{abcdef}{Z}| +\exemple*|\StrBefore[1]{aaaaaa}{aa}| +\exemple|\StrBefore[2]{aaaaaa}{aa}| +\exemple|\StrBefore[3]{aaaaaa}{aa}| +\exemple*|\StrBefore[4]{aaaaaa}{aa}| +\exemple*|\StrBefore{a}{}| +\exemple*|\StrBefore{}{a}| +\exemple*|\StrBefore{}{}| + +\AvecArgOptionnel +\exemple|\StrBefore{abcedef}{e}[\aa]\aa| +\exemple*|\StrBefore{abcdef}{a}[\aa]\aa| +\exemple*|\StrBefore{abcdef}{z}[\aa]\aa| +\exemple*|\StrBefore{a b c d}{c}[\aa]\aa| +\exemple*|\StrBefore{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[2]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[3]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[9]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[-7]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore{abcdef}{Z}[\aa]\aa| +\exemple*|\StrBefore[1]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBefore[2]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBefore[3]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBefore[4]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBefore{a}{}[\aa]\aa| +\exemple*|\StrBefore{}{a}[\aa]\aa| +\exemple*|\StrBefore{}{}[\aa]\aa| + +\chapitre{La macro}{StrBehind} + +\exemple|\StrBehind{abcedef}{e}| +\exemple*|\StrBehind{abcdef}{a}| +\exemple*|\StrBehind{abcdef}{z}| +\exemple*|\StrBehind{a b c d}{c}| +\exemple*|\StrBehind{a b c d}{ }| +\exemple*|\StrBehind[2]{a b c d}{ }| +\exemple*|\StrBehind[3]{a b c d}{ }| +\exemple*|\StrBehind[9]{a b c d}{ }| +\exemple*|\StrBehind[-7]{a b c d}{ }| +\exemple*|\StrBehind{abcdef}{Z}| +\exemple|\StrBehind[1]{aaaaaa}{aa}| +\exemple|\StrBehind[2]{aaaaaa}{aa}| +\exemple*|\StrBehind[3]{aaaaaa}{aa}| +\exemple*|\StrBehind[4]{aaaaaa}{aa}| +\exemple*|\StrBehind{a}{}| +\exemple*|\StrBehind{}{a}| +\exemple*|\StrBehind{}{}| + +\AvecArgOptionnel +\exemple|\StrBehind{abcedef}{e}[\aa]\aa| +\exemple*|\StrBehind{abcdef}{a}[\aa]\aa| +\exemple*|\StrBehind{abcdef}{z}[\aa]\aa| +\exemple*|\StrBehind{a b c d}{c}[\aa]\aa| +\exemple*|\StrBehind{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[2]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[3]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[9]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[-7]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind{abcdef}{Z}[\aa]\aa| +\exemple|\StrBehind[1]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBehind[2]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind[3]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind[4]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind{a}{}[\aa]\aa| +\exemple*|\StrBehind{}{a}[\aa]\aa| +\exemple*|\StrBehind{}{}[\aa]\aa| + +\chapitre{La macro}{StrBetween} + +\exemple|\StrBetween{abcdef}{b}{e}| +\exemple*|\StrBetween{aZaaaaZa}{Z}{Z}| +\exemple*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}| +\exemple*|\StrBetween{a b c d}{a}{c}| +\exemple*|\StrBetween{a b c d}{a }{ d}| +\exemple*|\StrBetween{abcdef}{a}{Z}| +\exemple*|\StrBetween{abcdef}{Y}{Z}| +\exemple*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}| +\exemple*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}| +\exemple*|\StrBetween[3,4]{a b c d e f}{ }{ }| +\exemple|\StrBetween[1,3]{aaaaaa}{aa}{aa}| +\exemple*|\StrBetween{abcdef}{a}{}| +\exemple*|\StrBetween{abcdef}{}{f}| +\exemple*|\StrBetween{}{a}{b}| + +\AvecArgOptionnel +\exemple|\StrBetween{abcdef}{b}{e}[\aa]\aa| +\exemple*|\StrBetween{aZaaaaZa}{Z}{Z}[\aa]\aa| +\exemple*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}[\aa]\aa| +\exemple*|\StrBetween{a b c d}{a}{c}[\aa]\aa| +\exemple*|\StrBetween{a b c d}{a }{ d}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{a}{Z}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{Y}{Z}[\aa]\aa| +\exemple*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}[\aa]\aa| +\exemple*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}[\aa]\aa| +\exemple*|\StrBetween[3,4]{a b c d e f}{ }{ }[\aa]\aa| +\exemple|\StrBetween[1,3]{aaaaaa}{aa}{aa}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{a}{}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{}{f}[\aa]\aa| +\exemple*|\StrBetween{}{a}{b}[\aa]\aa| + +\chapitre{La macro}{StrSubstitute} + +\exemple|\StrSubstitute{abcdef}{c}{ZZ}| +\exemple|\StrSubstitute{aaaaaaa}{aa}{w}| +\exemple|\StrSubstitute[0]{abacada}{a}{.}| +\exemple|\StrSubstitute[1]{abacada}{a}{.}| +\exemple|\StrSubstitute[2]{abacada}{a}{.}| +\exemple|\StrSubstitute[3]{abacada}{a}{.}| +\exemple|\StrSubstitute[4]{abacada}{a}{.}| +\exemple|\StrSubstitute[5]{abacada}{a}{.}| +\exemple|\StrSubstitute{a b c d e}{ }{,}| +\exemple|\StrSubstitute{a b c d e}{ }{}| +\exemple|\StrSubstitute{abcdef}{}{A}| +\exemple|\StrSubstitute{abcdef}{}{}| +\exemple*|\StrSubstitute{}{a}{b}| +\exemple*|\StrSubstitute{}{}{}| + +\AvecArgOptionnel +\exemple|\StrSubstitute{abcdef}{c}{ZZ}[\aa]\aa| +\exemple|\StrSubstitute{aaaaaaa}{aa}{w}[\aa]\aa| +\exemple|\StrSubstitute[0]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[1]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[2]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[3]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[4]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[5]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute{a b c d e}{ }{,}[\aa]\aa| +\exemple|\StrSubstitute{a b c d e}{ }{}[\aa]\aa| +\exemple|\StrSubstitute{abcdef}{}{A}[\aa]\aa| +\exemple|\StrSubstitute{abcdef}{}{}[\aa]\aa| +\exemple*|\StrSubstitute{}{a}{b}[\aa]\aa| +\exemple*|\StrSubstitute{}{}{}[\aa]\aa| + +\chapitre{La macro}{StrDel} + +\exemple|\StrDel{a1a2a3a4}{a}| +\exemple|\StrDel[2]{a1a2a3a4}{a}| +\exemple|\StrDel[-2]{a1a2a3a4}{a}| +\exemple|\StrDel[10]{a1a2a3a4}{a}| +\exemple|\StrDel[3]{a b c d e}{a}| + +\AvecArgOptionnel +\exemple|\StrDel{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[2]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[-2]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[10]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[3]{a b c d e}{a}[\aa]\aa| + +\chapitre{La macro}{StrLen} + + +\exemple|\StrLen{abcdef}| +\exemple|\StrLen{a b c}| +\exemple|\StrLen{ a b c }| +\exemple|\StrLen{a}| +\exemple|\StrLen{}| + +\AvecArgOptionnel +\exemple|\StrLen{abcdef}[\aa]\aa| +\exemple|\StrLen{a b c}[\aa]\aa| +\exemple|\StrLen{ a b c }[\aa]\aa| +\exemple|\StrLen{a}[\aa]\aa| +\exemple|\StrLen{}[\aa]\aa| + +\chapitre{la macro}{StrMid} + +\exemple|\StrMid{abcdef}{2}{5}| +\exemple*|\StrMid{a b c d}{2}{6}| +\exemple*|\StrMid{abcdef}{4}{2}| +\exemple|\StrMid{abcdef}{-4}{3}| +\exemple*|\StrMid{abcdef}{-4}{-1}| +\exemple|\StrMid{abcdef}{-4}{20}| +\exemple*|\StrMid{abcdef}{8}{10}| +\exemple|\StrMid{abcdef}{2}{2}| +\exemple|\StrMid{aaaaaa}{3}{6}| +\exemple*|\StrMid{}{4}{5}| + +\AvecArgOptionnel +\exemple|\StrMid{abcdef}{2}{5}[\aa]\aa| +\exemple*|\StrMid{a b c d}{2}{6}[\aa]\aa| +\exemple*|\StrMid{abcdef}{4}{2}[\aa]\aa| +\exemple|\StrMid{abcdef}{-4}{3}[\aa]\aa| +\exemple*|\StrMid{abcdef}{-4}{-1}[\aa]\aa| +\exemple|\StrMid{abcdef}{-4}{20}[\aa]\aa| +\exemple*|\StrMid{abcdef}{8}{10}[\aa]\aa| +\exemple|\StrMid{abcdef}{2}{2}[\aa]\aa| +\exemple|\StrMid{aaaaaa}{3}{6}[\aa]\aa| +\exemple*|\StrMid{}{4}{5}[\aa]\aa| + +\chapitre{La macro}{StrGobbleLeft} + +\exemple|\StrGobbleLeft{abcdef}{3}| +\exemple*|\StrGobbleLeft{a b c d}{3}| +\exemple|\StrGobbleLeft{abcdef}{-3}| +\exemple*|\StrGobbleLeft{abcdef}{9}| +\exemple|\StrGobbleLeft{aaaaa}{4}| +\exemple*|\StrGobbleLeft{}{2}| + +\AvecArgOptionnel +\exemple|\StrGobbleLeft{abcdef}{3}[\aa]\aa| +\exemple*|\StrGobbleLeft{a b c d}{3}[\aa]\aa| +\exemple|\StrGobbleLeft{abcdef}{-3}[\aa]\aa| +\exemple*|\StrGobbleLeft{abcdef}{9}[\aa]\aa| +\exemple|\StrGobbleLeft{aaaaa}{4}[\aa]\aa| +\exemple*|\StrGobbleLeft{}{2}[\aa]\aa| + +\chapitre{La macro}{StrGobbleRight} + +\exemple|\StrGobbleRight{abcdef}{3}| +\exemple*|\StrGobbleRight{a b c d}{3}| +\exemple|\StrGobbleRight{abcdef}{-3}| +\exemple*|\StrGobbleRight{abcdef}{9}| +\exemple|\StrGobbleRight{aaaaa}{4}| +\exemple*|\StrGobbleRight{}{2}| + +\AvecArgOptionnel +\exemple|\StrGobbleRight{abcdef}{3}[\aa]\aa| +\exemple*|\StrGobbleRight{a b c d}{3}[\aa]\aa| +\exemple|\StrGobbleRight{abcdef}{-3}[\aa]\aa| +\exemple*|\StrGobbleRight{abcdef}{9}[\aa]\aa| +\exemple|\StrGobbleRight{aaaaa}{4}[\aa]\aa| +\exemple*|\StrGobbleRight{}{2}[\aa]\aa| + +\chapitre{La macro}{StrLeft} + +\exemple|\StrLeft{abcdef}{3}| +\exemple*|\StrLeft{a b c d}{3}| +\exemple*|\StrLeft{abcdef}{-3}| +\exemple*|\StrLeft{abcdef}{9}| +\exemple|\StrLeft{aaaaa}{4}| +\exemple*|\StrLeft{}{2}| + +\AvecArgOptionnel +\exemple|\StrLeft{abcdef}{3}[\aa]\aa| +\exemple*|\StrLeft{a b c d}{3}[\aa]\aa| +\exemple*|\StrLeft{abcdef}{-3}[\aa]\aa| +\exemple*|\StrLeft{abcdef}{9}[\aa]\aa| +\exemple|\StrLeft{aaaaa}{4}[\aa]\aa| +\exemple*|\StrLeft{}{2}[\aa]\aa| + +\chapitre{La macro}{StrRight} + +\exemple|\StrRight{abcdef}{3}| +\exemple*|\StrRight{a b c d}{3}| +\exemple*|\StrRight{abcdef}{-3}| +\exemple*|\StrRight{abcdef}{9}| +\exemple|\StrRight{aaaaa}{4}| +\exemple*|\StrRight{}{2}| + +\AvecArgOptionnel +\exemple|\StrRight{abcdef}{3}[\aa]\aa| +\exemple*|\StrRight{a b c d}{3}[\aa]\aa| +\exemple*|\StrRight{abcdef}{-3}[\aa]\aa| +\exemple*|\StrRight{abcdef}{9}[\aa]\aa| +\exemple|\StrRight{aaaaa}{4}[\aa]\aa| +\exemple*|\StrRight{}{2}[\aa]\aa| + +\chapitre{la macro}{StrChar} + +\exemple|\StrChar{abcdef}{5}| +\exemple*|\StrChar{a b c d}{4}| +\exemple|\StrChar{a b c d}{7}| +\exemple*|\StrChar{abcdef}{10}| +\exemple*|\StrChar{abcdef}{-5}| +\exemple*|\StrChar{}{3}| + +\AvecArgOptionnel +\exemple|\StrChar{abcdef}{5}[\aa]\aa| +\exemple*|\StrChar{a b c d}{4}[\aa]\aa| +\exemple|\StrChar{a b c d}{7}[\aa]\aa| +\exemple*|\StrChar{abcdef}{10}[\aa]\aa| +\exemple*|\StrChar{abcdef}{-5}[\aa]\aa| +\exemple*|\StrChar{}{3}[\aa]\aa| + +\chapitre{La macro}{StrCount} + +\exemple|\StrCount{abcdef}{d}| +\exemple|\StrCount{a b c d}{ }| +\exemple|\StrCount{aaaaaa}{aa}| +\exemple|\StrCount{abcdef}{Z}| +\exemple|\StrCount{abcdef}{}| +\exemple|\StrCount{}{a}| +\exemple|\StrCount{}{}| + +\AvecArgOptionnel +\exemple|\StrCount{abcdef}{d}[\aa]\aa| +\exemple|\StrCount{a b c d}{ }[\aa]\aa| +\exemple|\StrCount{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrCount{abcdef}{Z}[\aa]\aa| +\exemple|\StrCount{abcdef}{}[\aa]\aa| +\exemple|\StrCount{}{a}[\aa]\aa| +\exemple|\StrCount{}{}[\aa]\aa| + +\chapitre{La macro}{StrPosition} + +\exemple|\StrPosition{abcdef}{c}| +\exemple|\StrPosition{abcdef}{Z}| +\exemple|\StrPosition{a b c d}{ }| +\exemple|\StrPosition[3]{a b c d}{ }| +\exemple|\StrPosition[8]{a b c d}{ }| +\exemple|\StrPosition{aaaaaa}{aa}| +\exemple|\StrPosition[2]{aaaaaa}{aa}| +\exemple|\StrPosition[3]{aaaaaa}{aa}| +\exemple|\StrPosition{abcdef}{}| +\exemple|\StrPosition{}{a}| +\exemple|\StrPosition{}{}| + +\AvecArgOptionnel +\exemple|\StrPosition{abcdef}{c}[\aa]\aa| +\exemple|\StrPosition{abcdef}{Z}[\aa]\aa| +\exemple|\StrPosition{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition[3]{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition[8]{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition[2]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition[3]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition{abcdef}{}[\aa]\aa| +\exemple|\StrPosition{}{a}[\aa]\aa| +\exemple|\StrPosition{}{}[\aa]\aa| + +\chapitre{La macro}{StrCompare} + +La tolérance normale :\par +\exemple|\StrCompare{abcdefghij}{abc}| +\exemple|\StrCompare{A}{A}| +\exemple|\StrCompare{abcdef}{a bd}| +\exemple|\StrCompare{ }{ }| +\exemple|\StrCompare{}{abcd}| +\exemple|\StrCompare{abcd}{}| +\exemple|\StrCompare{123456}{1234}| +\exemple|\StrCompare{a b c d}{a bcd}| +\exemple|\StrCompare{}{}| +\exemple|\StrCompare{eee}{eeee}| +\exemple|\StrCompare{eeee}{eee}| +\exemple|\StrCompare{totutu}{tututu}| +\exemple|\StrCompare{abcd}{abyz}| + +\AvecArgOptionnel +\exemple|\StrCompare{abcdefghij}{abc}[\aa]\aa| +\exemple|\StrCompare{A}{A}[\aa]\aa| +\exemple|\StrCompare{abcdef}{a bd}[\aa]\aa| +\exemple|\StrCompare{ }{ }[\aa]\aa| +\exemple|\StrCompare{}{abcd}[\aa]\aa| +\exemple|\StrCompare{abcd}{}[\aa]\aa| +\exemple|\StrCompare{123456}{1234}[\aa]\aa| +\exemple|\StrCompare{a b c d}{a bcd}[\aa]\aa| +\exemple|\StrCompare{}{}[\aa]\aa| +\exemple|\StrCompare{eee}{eeee}[\aa]\aa| +\exemple|\StrCompare{eeee}{eee}[\aa]\aa| +\exemple|\StrCompare{totutu}{tututu}[\aa]\aa| +\exemple|\StrCompare{abcd}{abyz}[\aa]\aa| + +La tolérance stricte :\par\comparestrict +\exemple|\StrCompare{abcdefghij}{abc}| +\exemple|\StrCompare{A}{A}| +\exemple|\StrCompare{abcdef}{a bd}| +\exemple|\StrCompare{ }{ }| +\exemple|\StrCompare{}{abcd}| +\exemple|\StrCompare{abcd}{}| +\exemple|\StrCompare{123456}{1234}| +\exemple|\StrCompare{a b c d}{a bcd}| +\exemple|\StrCompare{}{}| +\exemple|\StrCompare{eee}{eeee}| +\exemple|\StrCompare{eeee}{eee}| +\exemple|\StrCompare{totutu}{tututu}| +\exemple|\StrCompare{abcd}{abyz}| + +\AvecArgOptionnel +\exemple|\StrCompare{abcdefghij}{abc}[\aa]\aa| +\exemple|\StrCompare{A}{A}[\aa]\aa| +\exemple|\StrCompare{abcdef}{a bd}[\aa]\aa| +\exemple|\StrCompare{ }{ }[\aa]\aa| +\exemple|\StrCompare{}{abcd}[\aa]\aa| +\exemple|\StrCompare{abcd}{}[\aa]\aa| +\exemple|\StrCompare{123456}{1234}[\aa]\aa| +\exemple|\StrCompare{a b c d}{a bcd}[\aa]\aa| +\exemple|\StrCompare{}{}[\aa]\aa| +\exemple|\StrCompare{eee}{eeee}[\aa]\aa| +\exemple|\StrCompare{eeee}{eee}[\aa]\aa| +\exemple|\StrCompare{totutu}{tututu}[\aa]\aa| +\exemple|\StrCompare{abcd}{abyz}[\aa]\aa| +\vskip5em + +\hfill{\hugerm Le mode \hugett\string\noexpandarg}\hfill{} + +\vskip-1ex\hfil\hbox to8cm{\hrulefill}\hfil{}\vskip3.5ex + +Dans toute la suite sauf si c'est précisé, la commande {\tt\string\noexpandarg} est activée.\vskip1.5ex + +\catcode`\@=11\relax +\expandafter\long\expandafter\def\csname xs_assign_verb\endcsname#1{% + \tokenize\cs@resultat{#1}% + \leavevmode\hbox to0.7\hsize{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil\par}% +\catcode`\@=12\relax +\noexpandarg + +\chapitre{Le test}{IfSubStr} + +\exemple|\noexploregroups| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{2}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{34}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{{34}}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\b}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc5}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc{5}}{vrai}{faux}| +\exemple|\IfSubStr[1]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[2]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[3]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[4]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{2}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{34}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{{34}}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\b}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc5}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc{5}}{vrai}{faux}| +\exemple|\IfSubStr[1]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[2]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[3]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[4]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| + +\chapitre{Le test}{IfBeginWith} + +Les tests doivent donner des résultats identiques ci-dessous puisque {\tt\string\IfBeginWith} est indifférent au mode d'exploration des groupes !\vskip0.7ex + +\exemple|\noexploregroups| +\exemple|\IfBeginWith{{\a}123\b456}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{\a}123\b456}{{\a}}{vrai}{faux}| +\exemple|\IfBeginWith{{\a1}\b\c\d}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{12}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{1}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{{1}2}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfBeginWith{{\a}123\b456}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{\a}123\b456}{{\a}}{vrai}{faux}| +\exemple|\IfBeginWith{{\a1}\b\c\d}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{12}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{1}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{{1}2}{vrai}{faux}| + +\chapitre{Le test}{IfEndWith} + +Les tests doivent donner des résultats identiques ci-dessous puisque {\tt\string\IfEndWith} est indifférent au mode d'exploration des groupes !\vskip0.7ex + +\exemple|\noexploregroups| +\exemple|\IfEndWith{\a1\b2{\c3}}{\c3}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{{\c3}}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{3}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{56}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{6}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{5{6}}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfEndWith{\a1\b2{\c3}}{\c3}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{{\c3}}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{3}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{56}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{6}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{5{6}}{vrai}{faux}| + +\chapitre{Le test}{IfSubStrBefore} + +\exemple|\noexploregroups| +\exemple|\IfSubStrBefore[1,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,3]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{\a1{\a2\a3\b1}\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStrBefore[1,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,3]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{\a1{\a2\a3\b1}\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| + +\chapitre{Le test}{IfStrBehind} + +\exemple|\noexploregroups| +\exemple|\IfSubStrBehind[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1\a2\a3\b1\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{\a1{\a2\a3\b1}\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStrBehind[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1\a2\a3\b1\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{\a1{\a2\a3\b1}\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| + +\chapitre{Le test}{IfInteger} + +Dans les exemples ci-dessous, on examine la différence de comportement de la macro {\tt\string\IfInteger} selon les modes de développement des arguments.\vskip0.7ex + +\exemple|\def\nbA{-12}\def\nbB{498}| +\exemple|\def\nbAA{\nbA}\def\nbBB{\nbB}|\vskip0.7ex +\exemple|\fullexpandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}|\vskip0.7ex +\exemple|\expandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}|\vskip0.7ex +\exemple|\noexpandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}| + +\chapitre{Le test}{IfDecimal} + +Dans les exemples ci-dessous, on examine la différence de comportement de la macro {\tt\string\IfDecimal} selon les modes de développement des arguments.\vskip0.7ex + +\exemple|\def\nbA{-12}\def\nbB{498}| +\exemple|\def\nbAA{\nbA}\def\nbBB{\nbB}|\vskip0.7ex +\exemple|\fullexpandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}|\vskip0.7ex +\exemple|\expandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}|\vskip0.7ex +\exemple|\noexpandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}| + +\chapitre{La macro}{StrBefore} + +\exemple|\noexploregroups| +\exemple|\StrBefore[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrBefore[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBefore[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrBehind} + +\exemple|\noexploregroups| +\exemple|\StrBehind[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrBehind[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBehind[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrBetween} + +La commande {\tt\string\StrBetween} opère en mode {\tt\string\noexploregroups}, quelque soit le mode d'exploration en cours.\vskip0.7ex + +\exemple|\StrBetween[1,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{2}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBetween[2,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBetween[1,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{3}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrBetween[2,4]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{La macro}{StrSubstitute} + +\exemple|\noexploregroups| +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{2}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{3\a}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{a1{b1\bgroup c1}\egroup d1}{1}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{2}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{3\a}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| +\exemple|\StrSubstitute{a1{b1\bgroup c1}\egroup d1}{1}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrDel} + +\exemple|\noexploregroups| +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{2}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{3\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{2}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{3\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{La macro}{StrLen} + +\exemple|\noexploregroups| +\exemple|\StrLen{a1{a2}{\a\b}{a3}a4}| +\exemple|\exploregroups| +\exemple|\StrLen{a1{a2}{\a\b}{a3}a4}| + +\chapitre{la macro}{StrSplit} + +\exemple|\noexploregroups| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{2}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{3}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\exploregroups| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{2}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{3}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| + +\chapitre{la macro}{StrMid} + +La commande {\tt\string\StrMid} opère en mode {\tt\string\noexploregroups}, quelque soit le mode d'exploration en cours.\vskip0.7ex + +\exemple|\StrMid{\a\b{\c\d}\e\f\g\h}{2}{6}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\StrMid{\a\b{\c\d}\e\f\g\h}{3}{4}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{La macro}{StrGobbleLeft} + +\exemple|\noexploregroups| +\exemple|\StrGobbleLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrGobbleLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrGobbleRight} + +\exemple|\noexploregroups| +\exemple|\StrGobbleRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrGobbleRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{La macro}{StrLeft} + +\exemple|\noexploregroups| +\exemple|\StrLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrRight} + +\exemple|\noexploregroups| +\exemple|\StrRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{la macro}{StrChar} + +\exemple|\noexploregroups| +\exemple|\StrChar{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrChar{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex + +\chapitre{La macro}{StrCount} + +\exemple|\noexploregroups| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{\a}| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{2}| +\exemple|\exploregroups| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{\a}| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{2}| + +\chapitre{La macro}{StrPosition} + +\exemple|\noexploregroups| +\exemple|\StrPosition[3]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[4]{\a0\a1{\a{3\a4}5}\a6\a7}{\a}| +\exemple|\StrPosition[1]{\a0\a1{\a{2\a3}4}\a5\a6}{2}| +\exemple|\exploregroups| +\exemple|\StrPosition[3]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[4]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[1]{\a0\a1{\a{2\a3}4}\a5\a6}{2}| + +\chapitre{La macro}{StrCompare} + +La commande {\tt\string\StrCompare} n'est pas affectée par le mode d'exploration.\vskip0.7ex + +\exemple|\comparenormal| +\exemple|\StrCompare{\a{\b1}\c2}{\a\b1\c2}| +\exemple|\StrCompare{{1\a2}3}{{1\a2}3}| +\exemple|\StrCompare{{1\a2}3}{1\a23}| +\exemple|\StrCompare{\a{\b\c}}{\a{\b\c}\d}| +\exemple|\StrCompare{{\a}\b}{\a\b}| +\exemple|\comparestrict| +\exemple|\StrCompare{\a{\b1}\c2}{\a\b1\c2}| +\exemple|\StrCompare{{1\a2}3}{{1\a2}3}| +\exemple|\StrCompare{{1\a2}3}{1\a23}| +\exemple|\StrCompare{\a{\b\c}}{\a{\b\c}\d}| +\exemple|\StrCompare{{\a}\b}{\a\b}| + +\chapitre{La macro}{StrRemoveBraces} + +\exemple|\noexploregroups| +\exemple|\StrRemoveBraces{\a1{\b2{\c3{\d4}}}\e5}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\exemple|\exploregroups| +\exemple|\StrRemoveBraces{\a1{\b2{\c3{\d4}}}\e5}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\vskip0.7ex +\end
\ No newline at end of file diff --git a/Master/texmf-dist/doc/generic/xstring/test_latex.pdf b/Master/texmf-dist/doc/generic/xstring/test_latex.pdf Binary files differnew file mode 100644 index 00000000000..58a65961d6a --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/test_latex.pdf diff --git a/Master/texmf-dist/doc/generic/xstring/test_latex.tex b/Master/texmf-dist/doc/generic/xstring/test_latex.tex new file mode 100644 index 00000000000..ca5d54f0227 --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/test_latex.tex @@ -0,0 +1,1078 @@ +% Ceci est test_latex.tex, le fichier de test de xstring à compiler avec LaTeX +\documentclass[a4paper,10pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[margin=1cm,noheadfoot]{geometry} +\pagestyle{empty} +\usepackage{xstring} + +\makeatletter + +\newcommand*\exemple{\@ifstar{\def\frontiere{|}\csname xs_toks_toverb\endcsname}{\def\frontiere{}\csname xs_toks_toverb\endcsname}} +\expandafter\def\csname xs_assign_verb\endcsname#1{% + \noexpandarg + \tokenize\cs@resultat{#1}% + \fullexpandarg + \leavevmode\hbox to0.7\linewidth{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil\par}% +\makeatother + +\newcommand\chapitre[2]{\bigskip{\large\textbf{#1} \texttt{\textbackslash#2}}\smallskip} +\def\delimiteur{|} + +\begin{document} +\parindent0pt + +\begin{center}\Large{Ceci est le fichier de test de xstring}.\end{center} +\vspace{-1.8ex}\hrule\smallskip + +\hrule + +\bigskip +Toutes les situations ne sont pas envisagées, mais au moins un grand nombre ! Les macros sont examinées dans l'ordre logique du code. + +Lorsque le résultat contient des espaces ou peut conduire à des doutes, il sera entouré de ''\delimiteur``, étant entendu que ''\delimiteur\delimiteur`` est une chaîne vide.\bigskip + +\hfill{\Large Le mode \tt\textbackslash fullexpandarg}\hfill{} + +\vspace{-1.5ex}\hspace{6cm}\hrulefill\hspace{6cm} + +\bigskip +\chapitre{Le test}{IfSubStr} + +\exemple|\IfSubStr{abcdef}{cd}{vrai}{faux}| +\exemple|\IfSubStr{a b c d }{b c}{vrai}{faux}| +\exemple|\IfSubStr{a b c d }{bc}{vrai}{faux}| +\exemple|\IfSubStr{abcdef}{}{vrai}{faux}| +\exemple|\IfSubStr{a}{a}{vrai}{faux}| +\exemple|\IfSubStr{aaaa}{aa}{vrai}{faux}| +\exemple|\IfSubStr{a}{aa}{vrai}{faux}| +\exemple|\IfSubStr{éà èï}{à }{vrai}{faux}| +\exemple|\IfSubStr{éà èï}{ù}{vrai}{faux}| +\exemple|\IfSubStr{ÉÀÇ}{Ç}{vrai}{faux}| +\exemple|\IfSubStr{a}{}{vrai}{faux}| +\exemple|\IfSubStr{}{a}{vrai}{faux}| +\exemple|\IfSubStr{}{}{vrai}{faux}| +\exemple|\IfSubStr[2]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[3]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[4]{abaca}{a}{vrai}{faux}| +\exemple|\IfSubStr[-2]{abaca}{a}{vrai}{faux}| + +\chapitre{Le test}{IfBeginWith} + +\exemple|\IfBeginWith{abcdef}{adc}{vrai}{faux}| +\exemple|\IfBeginWith{abcdef}{abcd}{vrai}{faux}| +\exemple|\IfBeginWith{ a b c }{ a}{vrai}{faux}| +\exemple|\IfBeginWith{a b c d}{ab}{vrai}{faux}| +\exemple|\IfBeginWith{a}{a}{vrai}{faux}| +\exemple|\IfBeginWith{a}{aa}{vrai}{faux}| +\exemple|\IfBeginWith{éà èï}{è}{vrai}{faux}| +\exemple|\IfBeginWith{éà èï}{éà }{vrai}{faux}| +\exemple|\IfBeginWith{ÉÀÇ}{É}{vrai}{faux}| +\exemple|\IfBeginWith{a}{}{vrai}{faux}| +\exemple|\IfBeginWith{}{a}{vrai}{faux}| +\exemple|\IfBeginWith{}{}{vrai}{faux}| + +\chapitre{Le test}{IfEndWith} + +\exemple|\IfEndWith{abcdef}{ab}{vrai}{faux}| +\exemple|\IfEndWith{abcdef}{f}{vrai}{faux}| +\exemple|\IfEndWith{ a b c }{c}{vrai}{faux}| +\exemple|\IfEndWith{ a b c }{ }{vrai}{faux}| +\exemple|\IfEndWith{a}{a}{vrai}{faux}| +\exemple|\IfEndWith{a}{aa}{vrai}{faux}| +\exemple|\IfEndWith{éà èï}{è}{vrai}{faux}| +\exemple|\IfEndWith{éà èï}{ï}{vrai}{faux}| +\exemple|\IfEndWith{ÉÀÇ}{Ç}{vrai}{faux}| +\exemple|\IfEndWith{a}{}{vrai}{faux}| +\exemple|\IfEndWith{}{a}{vrai}{faux}| +\exemple|\IfEndWith{}{}{vrai}{faux}| + +\chapitre{Le test}{IfSubStrBefore} + +\exemple|\IfSubStrBefore{abcdef}{b}{e}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{e}{c}{vrai}{faux}| +\exemple|\IfSubStrBefore{ a b c }{ }{b}{vrai}{faux}| +\exemple|\IfSubStrBefore{ a b c }{ b}{c }{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{z}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{y}{z}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{a}{z}{vrai}{faux}| +\exemple|\IfSubStrBefore{aaa}{a}{aa}{vrai}{faux}| +\exemple|\IfSubStrBefore{abcdef}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{éà èï}{à }{ï}{vrai}{faux}| +\exemple|\IfSubStrBefore{éà èï}{é}{à }{vrai}{faux}| +\exemple|\IfSubStrBefore{ÉÀÇ}{Ç}{É}{vrai}{faux}| +\exemple|\IfSubStrBefore{a}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{a}{b}{vrai}{faux}| +\exemple|\IfSubStrBefore{a}{}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore{}{}{}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,3]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,4]{abacada}{d}{a}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,2]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBefore[4,2]{maman papa}{a}{p}{vrai}{faux}| + +\chapitre{Le test}{IfStrBehind} + +\exemple|\IfSubStrBehind{abcdef}{b}{e}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{e}{c}{vrai}{faux}| +\exemple|\IfSubStrBehind{ a b c }{ }{b}{vrai}{faux}| +\exemple|\IfSubStrBehind{ a b c }{ c}{ a}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{z}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{y}{z}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{a}{z}{vrai}{faux}| +\exemple|\IfSubStrBehind{aaa}{a}{aa}{vrai}{faux}| +\exemple|\IfSubStrBehind{abcdef}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{éà èï}{ï}{à }{vrai}{faux}| +\exemple|\IfSubStrBehind{éà èï}{à }{é}{vrai}{faux}| +\exemple|\IfSubStrBehind{ÉÀÇ}{À}{Ç}{vrai}{faux}| +\exemple|\IfSubStrBehind{a}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{a}{b}{vrai}{faux}| +\exemple|\IfSubStrBehind{a}{}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{a}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind{}{}{}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,2]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,3]{abacada}{c}{a}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,2]{maman papa}{a}{p}{vrai}{faux}| +\exemple|\IfSubStrBehind[4,2]{maman papa}{a}{p}{vrai}{faux}| + +\chapitre{Le test}{IfInteger} + +\exemple|\IfInteger{156}{vrai}{faux}| +\exemple|\IfInteger{1.6}{vrai}{faux}| +\exemple|\IfInteger{7a5}{vrai}{faux}| +\exemple|\IfInteger{+9}{vrai}{faux}| +\exemple|\IfInteger{-15}{vrai}{faux}| +\exemple|\IfInteger{0}{vrai}{faux}| +\exemple|\IfInteger{-1,2}{vrai}{faux}| +\exemple|\IfInteger{1.}{vrai}{faux}| +\exemple|\IfInteger{-00}{vrai}{faux}| +\exemple|\IfInteger{+}{vrai}{faux}| +\exemple|\IfInteger{-}{vrai}{faux}| +\exemple|\IfInteger{.}{vrai}{faux}| +\exemple|\IfInteger{}{vrai}{faux}| + +\chapitre{Le test}{IfDecimal} + +\exemple|\IfDecimal{6}{vrai}{faux}| +\exemple|\IfDecimal{-78}{vrai}{faux}| +\exemple|\IfDecimal{3.14}{vrai}{faux}| +\exemple|\IfDecimal{3,14}{vrai}{faux}| +\exemple|\IfDecimal{1..5}{vrai}{faux}| +\exemple|\IfDecimal{-9.8}{vrai}{faux}| +\exemple|\IfDecimal{+9.8}{vrai}{faux}| +\exemple|\IfDecimal{-9,8}{vrai}{faux}| +\exemple|\IfDecimal{+9,8}{vrai}{faux}| +\exemple|\IfDecimal{+6.7.}{vrai}{faux}| +\exemple|\IfDecimal{.5}{vrai}{faux}| +\exemple|\IfDecimal{1.}{vrai}{faux}| +\exemple|\IfDecimal{-.99}{vrai}{faux}| +\exemple|\IfDecimal{-5.}{vrai}{faux}| +\exemple|\IfDecimal{5a9.}{vrai}{faux}| +\exemple|\IfDecimal{+}{vrai}{faux}| +\exemple|\IfDecimal{-}{vrai}{faux}| +\exemple|\IfDecimal{.}{vrai}{faux}| +\exemple|\IfDecimal{}{vrai}{faux}| + +\chapitre{Le test}{IfStrEq} + +\exemple|\IfStrEq{abcdef}{abcdef}{vrai}{faux}| +\exemple|\IfStrEq{a b c}{a b c}{vrai}{faux}| +\exemple|\IfStrEq{abcd}{abc}{vrai}{faux}| +\exemple|\IfStrEq{aab}{ab}{vrai}{faux}| +\exemple|\IfStrEq{aab}{aa}{vrai}{faux}| +\exemple|\IfStrEq{1.2}{1.20}{vrai}{faux}| +\exemple|\IfStrEq{3,4}{3.4}{vrai}{faux}| +\exemple|\IfStrEq{ }{ }{vrai}{faux}| +\exemple|\IfStrEq{}{a}{vrai}{faux}| +\exemple|\IfStrEq{a}{}{vrai}{faux}| +\exemple|\IfStrEq{}{}{vrai}{faux}| + +\chapitre{Le test}{IfEq} + +\exemple|\IfEq{abcdef}{abcdef}{vrai}{faux}| +\exemple|\IfEq{a b c}{a b c}{vrai}{faux}| +\exemple|\IfEq{abcd}{abc}{vrai}{faux}| +\exemple|\IfEq{aab}{ab}{vrai}{faux}| +\exemple|\IfEq{aab}{aa}{vrai}{faux}| +\exemple|\IfEq{1.2}{1.20}{vrai}{faux}| +\exemple|\IfEq{+1.0000}{1}{vrai}{faux}| +\exemple|\IfEq{-10}{10}{vrai}{faux}| +\exemple|\IfEq{1,2}{1.2}{vrai}{faux}| +\exemple|\IfEq{.5}{0.5}{vrai}{faux}| +\exemple|\IfEq{,5}{0,5}{vrai}{faux}| +\exemple|\IfEq{10}{dix}{vrai}{faux}| +\exemple|\IfEq{123}{1a3}{vrai}{faux}| +\exemple|\IfEq{0}{}{vrai}{faux}| +\exemple|\IfEq{++10}{+10}{vrai}{faux}| +\exemple|\IfEq{--10}{+10}{vrai}{faux}| +\exemple|\IfEq{a}{}{vrai}{faux}| +\exemple|\IfEq{}{a}{vrai}{faux}| +\exemple|\IfEq{}{}{vrai}{faux}| + +\chapitre{La macro}{StrBefore} + +\exemple|\StrBefore{abcedef}{e}| +\exemple*|\StrBefore{abcdef}{a}| +\exemple*|\StrBefore{abcdef}{z}| +\exemple*|\StrBefore{a b c d}{c}| +\exemple*|\StrBefore{a b c d}{ }| +\exemple*|\StrBefore[2]{a b c d}{ }| +\exemple*|\StrBefore[3]{a b c d}{ }| +\exemple*|\StrBefore[9]{a b c d}{ }| +\exemple*|\StrBefore[-7]{a b c d}{ }| +\exemple*|\StrBefore{abcdef}{Z}| +\exemple|\StrBefore{éà èï}{è}| +\exemple|\StrBefore[2]{étété}{é}| +\exemple|\StrBefore{ÉÀÇ}{À}| +\exemple*|\StrBefore[1]{aaaaaa}{aa}| +\exemple|\StrBefore[2]{aaaaaa}{aa}| +\exemple|\StrBefore[3]{aaaaaa}{aa}| +\exemple*|\StrBefore[4]{aaaaaa}{aa}| +\exemple*|\StrBefore{a}{}| +\exemple*|\StrBefore{}{a}| +\exemple*|\StrBefore{}{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrBefore{abcedef}{e}[\aa]\aa| +\exemple*|\StrBefore{abcdef}{a}[\aa]\aa| +\exemple*|\StrBefore{abcdef}{z}[\aa]\aa| +\exemple*|\StrBefore{a b c d}{c}[\aa]\aa| +\exemple*|\StrBefore{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[2]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[3]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[9]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore[-7]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBefore{abcdef}{Z}[\aa]\aa| +\exemple|\StrBefore{éà èï}{è}[\aa]\aa| +\exemple|\StrBefore[2]{étété}{é}[\aa]\aa| +\exemple|\StrBefore{ÉÀÇ}{À}[\aa]\aa| +\exemple*|\StrBefore[1]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBefore[2]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBefore[3]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBefore[4]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBefore{a}{}[\aa]\aa| +\exemple*|\StrBefore{}{a}[\aa]\aa| +\exemple*|\StrBefore{}{}[\aa]\aa| + +\chapitre{La macro}{StrBehind} + +\exemple|\StrBehind{abcedef}{e}| +\exemple*|\StrBehind{abcdef}{a}| +\exemple*|\StrBehind{abcdef}{z}| +\exemple*|\StrBehind{a b c d}{c}| +\exemple*|\StrBehind{a b c d}{ }| +\exemple*|\StrBehind[2]{a b c d}{ }| +\exemple*|\StrBehind[3]{a b c d}{ }| +\exemple*|\StrBehind[9]{a b c d}{ }| +\exemple*|\StrBehind[-7]{a b c d}{ }| +\exemple*|\StrBehind{abcdef}{Z}| +\exemple|\StrBehind{éà èï}{è}| +\exemple|\StrBehind{ÉÀÇ}{À}| +\exemple|\StrBehind[1]{aaaaaa}{aa}| +\exemple|\StrBehind[2]{aaaaaa}{aa}| +\exemple*|\StrBehind[3]{aaaaaa}{aa}| +\exemple*|\StrBehind[4]{aaaaaa}{aa}| +\exemple*|\StrBehind{a}{}| +\exemple*|\StrBehind{}{a}| +\exemple*|\StrBehind{}{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrBehind{abcedef}{e}[\aa]\aa| +\exemple*|\StrBehind{abcdef}{a}[\aa]\aa| +\exemple*|\StrBehind{abcdef}{z}[\aa]\aa| +\exemple*|\StrBehind{a b c d}{c}[\aa]\aa| +\exemple*|\StrBehind{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[2]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[3]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[9]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind[-7]{a b c d}{ }[\aa]\aa| +\exemple*|\StrBehind{abcdef}{Z}[\aa]\aa| +\exemple|\StrBehind{éà èï}{è}[\aa]\aa| +\exemple|\StrBehind{ÉÀÇ}{À}[\aa]\aa| +\exemple|\StrBehind[1]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrBehind[2]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind[3]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind[4]{aaaaaa}{aa}[\aa]\aa| +\exemple*|\StrBehind{a}{}[\aa]\aa| +\exemple*|\StrBehind{}{a}[\aa]\aa| +\exemple*|\StrBehind{}{}[\aa]\aa| + +\chapitre{La macro}{StrBetween} + +\exemple|\StrBetween{abcdef}{b}{e}| +\exemple*|\StrBetween{aZaaaaZa}{Z}{Z}| +\exemple*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}| +\exemple*|\StrBetween{a b c d}{a}{c}| +\exemple*|\StrBetween{a b c d}{a }{ d}| +\exemple*|\StrBetween{abcdef}{a}{Z}| +\exemple*|\StrBetween{abcdef}{Y}{Z}| +\exemple*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}| +\exemple*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}| +\exemple*|\StrBetween[3,4]{a b c d e f}{ }{ }| +\exemple|\StrBetween[1,3]{aaaaaa}{aa}{aa}| +\exemple|\StrBetween{éà èï}{é}{ï}| +\exemple|\StrBetween{ÉÀÇ}{É}{Ç}| +\exemple*|\StrBetween{abcdef}{a}{}| +\exemple*|\StrBetween{abcdef}{}{f}| +\exemple*|\StrBetween{}{a}{b}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrBetween{abcdef}{b}{e}[\aa]\aa| +\exemple*|\StrBetween{aZaaaaZa}{Z}{Z}[\aa]\aa| +\exemple*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}[\aa]\aa| +\exemple*|\StrBetween{a b c d}{a}{c}[\aa]\aa| +\exemple*|\StrBetween{a b c d}{a }{ d}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{a}{Z}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{Y}{Z}[\aa]\aa| +\exemple*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}[\aa]\aa| +\exemple*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}[\aa]\aa| +\exemple*|\StrBetween[3,4]{a b c d e f}{ }{ }[\aa]\aa| +\exemple|\StrBetween[1,3]{aaaaaa}{aa}{aa}[\aa]\aa| +\exemple|\StrBetween{éà èï}{é}{ï}[\aa]\aa| +\exemple|\StrBetween{ÉÀÇ}{É}{Ç}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{a}{}[\aa]\aa| +\exemple*|\StrBetween{abcdef}{}{f}[\aa]\aa| +\exemple*|\StrBetween{}{a}{b}[\aa]\aa| + +\chapitre{La macro}{StrSubstitute} + +\exemple|\StrSubstitute{abcdef}{c}{ZZ}| +\exemple|\StrSubstitute{aaaaaaa}{aa}{w}| +\exemple|\StrSubstitute[0]{abacada}{a}{.}| +\exemple|\StrSubstitute[1]{abacada}{a}{.}| +\exemple|\StrSubstitute[2]{abacada}{a}{.}| +\exemple|\StrSubstitute[3]{abacada}{a}{.}| +\exemple|\StrSubstitute[4]{abacada}{a}{.}| +\exemple|\StrSubstitute[5]{abacada}{a}{.}| +\exemple|\StrSubstitute{a b c d e}{ }{,}| +\exemple|\StrSubstitute{a b c d e}{ }{}| +\exemple|\StrSubstitute{éà èï}{è}{Z}| +\exemple|\StrSubstitute{ÉÀÇ}{Ç}{c}| +\exemple|\StrSubstitute{abcdef}{}{A}| +\exemple|\StrSubstitute{abcdef}{}{}| +\exemple*|\StrSubstitute{}{a}{b}| +\exemple*|\StrSubstitute{}{}{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrSubstitute{abcdef}{c}{ZZ}[\aa]\aa| +\exemple|\StrSubstitute{aaaaaaa}{aa}{w}[\aa]\aa| +\exemple|\StrSubstitute[0]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[1]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[2]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[3]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[4]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute[5]{abacada}{a}{.}[\aa]\aa| +\exemple|\StrSubstitute{a b c d e}{ }{,}[\aa]\aa| +\exemple|\StrSubstitute{a b c d e}{ }{}[\aa]\aa| +\exemple|\StrSubstitute{éà èï}{è}{Z}[\aa]\aa| +\exemple|\StrSubstitute{ÉÀÇ}{Ç}{c}[\aa]\aa| +\exemple|\StrSubstitute{abcdef}{}{A}[\aa]\aa| +\exemple|\StrSubstitute{abcdef}{}{}[\aa]\aa| +\exemple*|\StrSubstitute{}{a}{b}[\aa]\aa| +\exemple*|\StrSubstitute{}{}{}[\aa]\aa| + +\chapitre{La macro}{StrDel} + +\exemple|\StrDel{a1a2a3a4}{a}| +\exemple|\StrDel[2]{a1a2a3a4}{a}| +\exemple|\StrDel[-2]{a1a2a3a4}{a}| +\exemple|\StrDel[10]{a1a2a3a4}{a}| +\exemple|\StrDel[3]{a b c d e}{a}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrDel{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[2]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[-2]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[10]{a1a2a3a4}{a}[\aa]\aa| +\exemple|\StrDel[3]{a b c d e}{a}[\aa]\aa| + +\chapitre{La macro}{StrLen} + +\exemple|\StrLen{abcdef}| +\exemple|\StrLen{a b c}| +\exemple|\StrLen{ a b c }| +\exemple|\StrLen{a}| +\exemple|\StrLen{éà èï}|% fonctionne mal en utf8 : donne 8 au lieu de 4 +\exemple|\StrLen{ÉÀÇ}|% idem +\exemple|\StrLen{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrLen{abcdef}[\aa]\aa| +\exemple|\StrLen{a b c}[\aa]\aa| +\exemple|\StrLen{ a b c }[\aa]\aa| +\exemple|\StrLen{a}[\aa]\aa| +\exemple|\StrLen{éà èï}[\aa]\aa|% fonctionne mal en utf8 : donne 8 au lieu de 4 +\exemple|\StrLen{ÉÀÇ}[\aa]\aa|% idem +\exemple|\StrLen{}[\aa]\aa| + +\chapitre{la macro}{StrSplit} + +\exemple|\StrSplit{abcde}{3}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{abcde}{1}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{abcde}{0}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{abcde}{-5}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{abcde}{20}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{a b c}{4}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{éà çù}{2}{\xx}{\yy}\#\xx\#\quad\#\yy\#| +\exemple|\StrSplit{}{3}{\xx}{\yy}\#\xx\#\quad\#\yy\#| + +\chapitre{la macro}{StrMid} + +\exemple|\StrMid{abcdef}{2}{5}| +\exemple*|\StrMid{a b c d}{2}{6}| +\exemple*|\StrMid{abcdef}{4}{2}| +\exemple|\StrMid{abcdef}{-4}{3}| +\exemple*|\StrMid{abcdef}{-4}{-1}| +\exemple|\StrMid{abcdef}{-4}{20}| +\exemple*|\StrMid{abcdef}{8}{10}| +\exemple|\StrMid{abcdef}{2}{2}| +\exemple|\StrMid{éà èï}{2}{3}| +\exemple|\StrMid{ÉÀÇ}{2}{3}| +\exemple|\StrMid{aaaaaa}{3}{6}| +\exemple*|\StrMid{}{4}{5}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrMid{abcdef}{2}{5}[\aa]\aa| +\exemple*|\StrMid{a b c d}{2}{6}[\aa]\aa| +\exemple*|\StrMid{abcdef}{4}{2}[\aa]\aa| +\exemple|\StrMid{abcdef}{-4}{3}[\aa]\aa| +\exemple*|\StrMid{abcdef}{-4}{-1}[\aa]\aa| +\exemple|\StrMid{abcdef}{-4}{20}[\aa]\aa| +\exemple*|\StrMid{abcdef}{8}{10}[\aa]\aa| +\exemple|\StrMid{abcdef}{2}{2}[\aa]\aa| +\exemple|\StrMid{éà èï}{2}{3}[\aa]\aa| +\exemple|\StrMid{ÉÀÇ}{2}{3}[\aa]\aa| +\exemple|\StrMid{aaaaaa}{3}{6}[\aa]\aa| +\exemple*|\StrMid{}{4}{5}[\aa]\aa| + +\chapitre{La macro}{StrGobbleLeft} + +\exemple|\StrGobbleLeft{abcdef}{3}| +\exemple*|\StrGobbleLeft{a b c d}{3}| +\exemple|\StrGobbleLeft{abcdef}{-3}| +\exemple*|\StrGobbleLeft{abcdef}{9}| +\exemple|\StrGobbleLeft{éà èï}{2}| +\exemple|\StrGobbleLeft{ÉÀÇ}{1}| +\exemple|\StrGobbleLeft{aaaaa}{4}| +\exemple*|\StrGobbleLeft{}{2}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrGobbleLeft{abcdef}{3}[\aa]\aa| +\exemple*|\StrGobbleLeft{a b c d}{3}[\aa]\aa| +\exemple|\StrGobbleLeft{abcdef}{-3}[\aa]\aa| +\exemple*|\StrGobbleLeft{abcdef}{9}[\aa]\aa| +\exemple|\StrGobbleLeft{éà èï}{2}[\aa]\aa| +\exemple|\StrGobbleLeft{ÉÀÇ}{1}[\aa]\aa| +\exemple|\StrGobbleLeft{aaaaa}{4}[\aa]\aa| +\exemple*|\StrGobbleLeft{}{2}[\aa]\aa| + +\chapitre{La macro}{StrGobbleRight} + +\exemple|\StrGobbleRight{abcdef}{3}| +\exemple*|\StrGobbleRight{a b c d}{3}| +\exemple|\StrGobbleRight{abcdef}{-3}| +\exemple*|\StrGobbleRight{abcdef}{9}| +\exemple|\StrGobbleRight{éà èï}{2}| +\exemple|\StrGobbleRight{ÉÀÇ}{1}| +\exemple|\StrGobbleRight{aaaaa}{4}| +\exemple*|\StrGobbleRight{}{2}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrGobbleRight{abcdef}{3}[\aa]\aa| +\exemple*|\StrGobbleRight{a b c d}{3}[\aa]\aa| +\exemple|\StrGobbleRight{abcdef}{-3}[\aa]\aa| +\exemple*|\StrGobbleRight{abcdef}{9}[\aa]\aa| +\exemple|\StrGobbleRight{éà èï}{2}[\aa]\aa| +\exemple|\StrGobbleRight{ÉÀÇ}{1}[\aa]\aa| +\exemple|\StrGobbleRight{aaaaa}{4}[\aa]\aa| +\exemple*|\StrGobbleRight{}{2}[\aa]\aa| + +\chapitre{La macro}{StrLeft} + +\exemple|\StrLeft{abcdef}{3}| +\exemple*|\StrLeft{a b c d}{3}| +\exemple*|\StrLeft{abcdef}{-3}| +\exemple*|\StrLeft{abcdef}{9}| +\exemple|\StrLeft{éà èï}{2}| +\exemple|\StrLeft{ÉÀÇ}{1}| +\exemple|\StrLeft{aaaaa}{4}| +\exemple*|\StrLeft{}{2}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrLeft{abcdef}{3}[\aa]\aa| +\exemple*|\StrLeft{a b c d}{3}[\aa]\aa| +\exemple*|\StrLeft{abcdef}{-3}[\aa]\aa| +\exemple*|\StrLeft{abcdef}{9}[\aa]\aa| +\exemple|\StrLeft{éà èï}{2}[\aa]\aa| +\exemple|\StrLeft{ÉÀÇ}{1}[\aa]\aa| +\exemple|\StrLeft{aaaaa}{4}[\aa]\aa| +\exemple*|\StrLeft{}{2}[\aa]\aa| + +\chapitre{La macro}{StrRight} + +\exemple|\StrRight{abcdef}{3}| +\exemple*|\StrRight{a b c d}{3}| +\exemple*|\StrRight{abcdef}{-3}| +\exemple*|\StrRight{abcdef}{9}| +\exemple|\StrRight{éà èï}{2}| +\exemple|\StrRight{ÉÀÇ}{1}| +\exemple|\StrRight{aaaaa}{4}| +\exemple*|\StrRight{}{2}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrRight{abcdef}{3}[\aa]\aa| +\exemple*|\StrRight{a b c d}{3}[\aa]\aa| +\exemple*|\StrRight{abcdef}{-3}[\aa]\aa| +\exemple*|\StrRight{abcdef}{9}[\aa]\aa| +\exemple|\StrRight{éà èï}{2}[\aa]\aa| +\exemple|\StrRight{ÉÀÇ}{1}[\aa]\aa| +\exemple|\StrRight{aaaaa}{4}[\aa]\aa| +\exemple*|\StrRight{}{2}[\aa]\aa| + +\chapitre{la macro}{StrChar} + +\exemple|\StrChar{abcdef}{5}| +\exemple*|\StrChar{a b c d}{4}| +\exemple|\StrChar{a b c d}{7}| +\exemple*|\StrChar{abcdef}{10}| +\exemple*|\StrChar{abcdef}{-5}| +\exemple*|\StrChar{}{3}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrChar{abcdef}{5}[\aa]\aa| +\exemple*|\StrChar{a b c d}{4}[\aa]\aa| +\exemple|\StrChar{a b c d}{7}[\aa]\aa| +\exemple*|\StrChar{abcdef}{10}[\aa]\aa| +\exemple*|\StrChar{abcdef}{-5}[\aa]\aa| +\exemple*|\StrChar{}{3}[\aa]\aa| + +\chapitre{La macro}{StrCount} + +\exemple|\StrCount{abcdef}{d}| +\exemple|\StrCount{a b c d}{ }| +\exemple|\StrCount{aaaaaa}{aa}| +\exemple|\StrCount{étété}{é}| +\exemple|\StrCount{abcdef}{Z}| +\exemple|\StrCount{éà èï}{é}| +\exemple|\StrCount{ÉÀÇ}{Ç}| +\exemple|\StrCount{abcdef}{}| +\exemple|\StrCount{}{a}| +\exemple|\StrCount{}{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrCount{abcdef}{d}[\aa]\aa| +\exemple|\StrCount{a b c d}{ }[\aa]\aa| +\exemple|\StrCount{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrCount{étété}{é}[\aa]\aa| +\exemple|\StrCount{abcdef}{Z}[\aa]\aa| +\exemple|\StrCount{éà èï}{é}[\aa]\aa| +\exemple|\StrCount{ÉÀÇ}{Ç}[\aa]\aa| +\exemple|\StrCount{abcdef}{}[\aa]\aa| +\exemple|\StrCount{}{a}[\aa]\aa| +\exemple|\StrCount{}{}[\aa]\aa| + +\chapitre{La macro}{StrPosition} + +\exemple|\StrPosition{abcdef}{c}| +\exemple|\StrPosition{abcdef}{Z}| +\exemple|\StrPosition{a b c d}{ }| +\exemple|\StrPosition[3]{a b c d}{ }| +\exemple|\StrPosition[8]{a b c d}{ }| +\exemple|\StrPosition{étété}{é}| +\exemple|\StrPosition[3]{étété}{é}| +\exemple|\StrPosition[5]{étété}{é}| +\exemple|\StrPosition{aaaaaa}{aa}| +\exemple|\StrPosition[2]{aaaaaa}{aa}| +\exemple|\StrPosition[3]{aaaaaa}{aa}| +\exemple|\StrPosition{éà èï}{è}| +\exemple|\StrPosition{ÉÀÇ}{À}| +\exemple|\StrPosition{abcdef}{}| +\exemple|\StrPosition{}{a}| +\exemple|\StrPosition{}{}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrPosition{abcdef}{c}[\aa]\aa| +\exemple|\StrPosition{abcdef}{Z}[\aa]\aa| +\exemple|\StrPosition{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition[3]{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition[8]{a b c d}{ }[\aa]\aa| +\exemple|\StrPosition{étété}{é}[\aa]\aa| +\exemple|\StrPosition[3]{étété}{é}[\aa]\aa| +\exemple|\StrPosition[5]{étété}{é}[\aa]\aa| +\exemple|\StrPosition{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition[2]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition[3]{aaaaaa}{aa}[\aa]\aa| +\exemple|\StrPosition{éà èï}{è}[\aa]\aa| +\exemple|\StrPosition{ÉÀÇ}{À}[\aa]\aa| +\exemple|\StrPosition{abcdef}{}[\aa]\aa| +\exemple|\StrPosition{}{a}[\aa]\aa| +\exemple|\StrPosition{}{}[\aa]\aa| + +\chapitre{La macro}{StrCompare} + +La tolérance normale :\par\comparenormal +\exemple|\StrCompare{abcdefghij}{abc}| +\exemple|\StrCompare{A}{A}| +\exemple|\StrCompare{éçà }{éçà }| +\exemple|\StrCompare{abcdef}{a bd}| +\exemple|\StrCompare{ }{ }| +\exemple|\StrCompare{}{abcd}| +\exemple|\StrCompare{abcd}{}| +\exemple|\StrCompare{123456}{1234}| +\exemple|\StrCompare{a b c d}{a bcd}| +\exemple|\StrCompare{}{}| +\exemple|\StrCompare{eee}{eeee}| +\exemple|\StrCompare{eeee}{eee}| +\exemple|\StrCompare{totutu}{tututu}| +\exemple|\StrCompare{abcd}{abyz}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrCompare{abcdefghij}{abc}[\aa]\aa| +\exemple|\StrCompare{A}{A}[\aa]\aa| +\exemple|\StrCompare{éçà }{éçà }[\aa]\aa| +\exemple|\StrCompare{abcdef}{a bd}[\aa]\aa| +\exemple|\StrCompare{ }{ }[\aa]\aa| +\exemple|\StrCompare{}{abcd}[\aa]\aa| +\exemple|\StrCompare{abcd}{}[\aa]\aa| +\exemple|\StrCompare{123456}{1234}[\aa]\aa| +\exemple|\StrCompare{a b c d}{a bcd}[\aa]\aa| +\exemple|\StrCompare{}{}[\aa]\aa| +\exemple|\StrCompare{eee}{eeee}[\aa]\aa| +\exemple|\StrCompare{eeee}{eee}[\aa]\aa| +\exemple|\StrCompare{totutu}{tututu}[\aa]\aa| +\exemple|\StrCompare{abcd}{abyz}[\aa]\aa| + +La tolérance stricte :\comparestrict\par +\exemple|\StrCompare{abcdefghij}{abc}| +\exemple|\StrCompare{A}{A}| +\exemple|\StrCompare{éçà }{éçà }| +\exemple|\StrCompare{abcdef}{a bd}| +\exemple|\StrCompare{ }{ }| +\exemple|\StrCompare{}{abcd}| +\exemple|\StrCompare{abcd}{}| +\exemple|\StrCompare{123456}{1234}| +\exemple|\StrCompare{a b c d}{a bcd}| +\exemple|\StrCompare{}{}| +\exemple|\StrCompare{eee}{eeee}| +\exemple|\StrCompare{eeee}{eee}| +\exemple|\StrCompare{totutu}{tututu}| +\exemple|\StrCompare{abcd}{abyz}| +\par\bigskip Mêmes exemples avec l'argument optionnel : + +\exemple|\StrCompare{abcdefghij}{abc}[\aa]\aa| +\exemple|\StrCompare{A}{A}[\aa]\aa| +\exemple|\StrCompare{éçà }{éçà }[\aa]\aa| +\exemple|\StrCompare{abcdef}{a bd}[\aa]\aa| +\exemple|\StrCompare{ }{ }[\aa]\aa| +\exemple|\StrCompare{}{abcd}[\aa]\aa| +\exemple|\StrCompare{abcd}{}[\aa]\aa| +\exemple|\StrCompare{123456}{1234}[\aa]\aa| +\exemple|\StrCompare{a b c d}{a bcd}[\aa]\aa| +\exemple|\StrCompare{}{}[\aa]\aa| +\exemple|\StrCompare{eee}{eeee}[\aa]\aa| +\exemple|\StrCompare{eeee}{eee}[\aa]\aa| +\exemple|\StrCompare{totutu}{tututu}[\aa]\aa| +\exemple|\StrCompare{abcd}{abyz}[\aa]\aa| +\vspace{10ex} + +\hfill{\Large Le mode \tt\textbackslash noexpandarg}\hfill{} + +\vspace{-1.5ex}\hspace{6cm}\hrulefill\hspace{6cm} + +\bigskip +Dans toute la suite sauf si c'est précisé, la commande \verb|\noexpandarg| est activée.\bigskip +\makeatletter + +\expandafter\long\expandafter\def\csname xs_assign_verb\endcsname#1{% + \tokenize\cs@resultat{#1}% + \leavevmode\hbox to0.7\linewidth{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil\par}% +\makeatother +\noexpandarg + +\bigskip +\chapitre{Le test}{IfSubStr} + +\exemple|\noexploregroups| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{2}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{34}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{{34}}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\b}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc5}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc{5}}{vrai}{faux}| +\exemple|\IfSubStr[1]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[2]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[3]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[4]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{2}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{34}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{{34}}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\b}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc5}{vrai}{faux}| +\exemple|\IfSubStr{1$2$\a{34}\bc5}{\bc{5}}{vrai}{faux}| +\exemple|\IfSubStr[1]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[2]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[3]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| +\exemple|\IfSubStr[4]{\a1{\a1{\a1}\a2}\a3}{\a}{vrai}{faux}| + +\chapitre{Le test}{IfBeginWith} + +Les tests doivent donner des résultats identiques ci-dessous puisque \verb|\IfBeginWith| est indifférent au mode d'exploration des groupes !\smallskip + +\exemple|\noexploregroups| +\exemple|\IfBeginWith{{\a}123\b456}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{\a}123\b456}{{\a}}{vrai}{faux}| +\exemple|\IfBeginWith{{\a1}\b\c\d}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{12}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{1}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{{1}2}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfBeginWith{{\a}123\b456}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{\a}123\b456}{{\a}}{vrai}{faux}| +\exemple|\IfBeginWith{{\a1}\b\c\d}{\a}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{12}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{1}{vrai}{faux}| +\exemple|\IfBeginWith{{1}23456}{{1}2}{vrai}{faux}| + +\chapitre{Le test}{IfEndWith} + +Les tests doivent donner des résultats identiques ci-dessous puisque \verb|\IfEndWith| est indifférent au mode d'exploration des groupes !\smallskip + +\exemple|\noexploregroups| +\exemple|\IfEndWith{\a1\b2{\c3}}{\c3}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{{\c3}}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{3}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{56}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{6}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{5{6}}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfEndWith{\a1\b2{\c3}}{\c3}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{{\c3}}{vrai}{faux}| +\exemple|\IfEndWith{\a1\b2{\c3}}{3}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{56}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{6}{vrai}{faux}| +\exemple|\IfEndWith{12345{6}}{5{6}}{vrai}{faux}| + +\chapitre{Le test}{IfSubStrBefore} + +\exemple|\noexploregroups| +\exemple|\IfSubStrBefore[1,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,3]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{\a1{\a2\a3\b1}\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStrBefore[1,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[2,3]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,1]{\a1{\a2\a3\b1}\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBefore[1,2]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| + +\chapitre{Le test}{IfStrBehind} + +\exemple|\noexploregroups| +\exemple|\IfSubStrBehind[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1\a2\a3\b1\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{\a1{\a2\a3\b1}\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| +\exemple|\exploregroups| +\exemple|\IfSubStrBehind[2,1]{\a1\a2\a3\b1\b2\b3}{2}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[3,1]{\a1\a2\a3\b1\b2\b3}{\a}{\b}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1\a2\a3\b1\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[2,1]{\a1{\a2\a3\b1}\b2\b3}{\b}{3}{vrai}{faux}| +\exemple|\IfSubStrBehind[1,1]{\a1{\a2\a3\b1}\b2\b3}{3}{\b}{vrai}{faux}| + +\chapitre{Le test}{IfInteger} + +Dans les exemples ci-dessous, on examine la différence de comportement de la macro \verb|\IfInteger| selon les modes de développement des arguments.\smallskip + +\exemple|\def\nbA{-12}\def\nbB{498}| +\exemple|\def\nbAA{\nbA}\def\nbBB{\nbB}|\smallskip +\exemple|\fullexpandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}|\smallskip +\exemple|\expandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}|\smallskip +\exemple|\noexpandarg| +\exemple|\IfInteger{\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA5\nbA}{vrai}{faux}| +\exemple|\IfInteger{\nbA6\nbB}{vrai}{faux}| +\exemple|\IfInteger{\nbAA7\nbBB}{vrai}{faux}| + +\chapitre{Le test}{IfDecimal} + +Dans les exemples ci-dessous, on examine la différence de comportement de la macro \verb|\IfDecimal| selon les modes de développement des arguments.\smallskip + +\exemple|\def\nbA{-12}\def\nbB{498}| +\exemple|\def\nbAA{\nbA}\def\nbBB{\nbB}|\smallskip +\exemple|\fullexpandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}|\smallskip +\exemple|\expandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}|\smallskip +\exemple|\noexpandarg| +\exemple|\IfDecimal{\nbA,\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbAA.\nbB}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{3\nbB,777}{vrai}{faux}| +\exemple|\IfDecimal{\nbB,\nbB}{vrai}{faux}| + +\chapitre{La macro}{StrBefore} + +\exemple|\noexploregroups| +\exemple|\StrBefore[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrBefore[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBefore[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrBehind} + +\exemple|\noexploregroups| +\exemple|\StrBehind[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrBehind[2]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[3]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[4]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[5]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBehind[6]{1\a2\a3{4\a5{6\a7}8\a}9\a0}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrBetween} + +La commande \verb|\StrBetween| opère en mode \verb|\noexploregroups|, quelque soit le mode d'exploration en cours.\smallskip + +\exemple|\StrBetween[1,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{2}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBetween[2,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBetween[1,3]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{3}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrBetween[2,4]{\a1\a2{3\a4}5\a6{7\a8}9\a0}{\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrSubstitute} + +\exemple|\noexploregroups| +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{2}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{3\a}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{a1{b1\bgroup c1}\egroup d1}{1}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}{\X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{2}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrSubstitute{\a1{2\a{3\a}4\a}\a5\a}{3\a}{XXX}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| +\exemple|\StrSubstitute{a1{b1\bgroup c1}\egroup d1}{1}{X}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrDel} + +\exemple|\noexploregroups| +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{2}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{3\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel[2]{\a1{2\a{3\a}4\a}\a5\a}{\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{2}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{{3\a}}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrDel{\a1{2\a{3\a}4\a}\a5\a}{3\a}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrLen} + +\exemple|\noexploregroups| +\exemple|\StrLen{a1{a2}{\a\b}{a3}a4}| +\exemple|\exploregroups| +\exemple|\StrLen{a1{a2}{\a\b}{a3}a4}| + +\chapitre{la macro}{StrSplit} + +\exemple|\noexploregroups| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{2}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{3}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\exploregroups| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{2}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| +\exemple|\StrSplit{\a{\b{\c\d}\e}\f\g}{3}\xx\yy| +\exemple|\#\detokenize\expandafter{\xx}\#\quad\#\detokenize\expandafter{\yy}\#| + +\chapitre{la macro}{StrMid} + +La commande \verb|\StrMid| opère en mode \verb|\noexploregroups|, quelque soit le mode d'exploration en cours.\smallskip + +\exemple|\StrMid{\a\b{\c\d}\e\f\g\h}{2}{6}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\StrMid{\a\b{\c\d}\e\f\g\h}{3}{4}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrGobbleLeft} + +\exemple|\noexploregroups| +\exemple|\StrGobbleLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrGobbleLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrGobbleRight} + +\exemple|\noexploregroups| +\exemple|\StrGobbleRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrGobbleRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrLeft} + +\exemple|\noexploregroups| +\exemple|\StrLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrLeft{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}| + +\chapitre{La macro}{StrRight} + +\exemple|\noexploregroups| +\exemple|\StrRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrRight{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{la macro}{StrChar} + +\exemple|\noexploregroups| +\exemple|\StrChar{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrChar{\a\b{\c\d\e}\f}{3}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip + +\chapitre{La macro}{StrCount} + +\exemple|\noexploregroups| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{\a}| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{2}| +\exemple|\exploregroups| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{\a}| +\exemple|\StrCount{\a1{\a2{\a3\a4}\a5}\a6\a7}{2}| + +\chapitre{La macro}{StrPosition} + +\exemple|\noexploregroups| +\exemple|\StrPosition[3]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[4]{\a0\a1{\a{3\a4}5}\a6\a7}{\a}| +\exemple|\StrPosition[1]{\a0\a1{\a{2\a3}4}\a5\a6}{2}| +\exemple|\exploregroups| +\exemple|\StrPosition[3]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[4]{\a0\a1{\a{2\a3}4}\a5\a6}{\a}| +\exemple|\StrPosition[1]{\a0\a1{\a{2\a3}4}\a5\a6}{2}| + +\chapitre{La macro}{StrCompare} + +La commande \verb|\StrCompare| n'est pas affectée par le mode d'exploration.\smallskip + +\exemple|\comparenormal| +\exemple|\StrCompare{\a{\b1}\c2}{\a\b1\c2}| +\exemple|\StrCompare{{1\a2}3}{{1\a2}3}| +\exemple|\StrCompare{{1\a2}3}{1\a23}| +\exemple|\StrCompare{\a{\b\c}}{\a{\b\c}\d}| +\exemple|\StrCompare{{\a}\b}{\a\b}| +\exemple|\comparestrict| +\exemple|\StrCompare{\a{\b1}\c2}{\a\b1\c2}| +\exemple|\StrCompare{{1\a2}3}{{1\a2}3}| +\exemple|\StrCompare{{1\a2}3}{1\a23}| +\exemple|\StrCompare{\a{\b\c}}{\a{\b\c}\d}| +\exemple|\StrCompare{{\a}\b}{\a\b}| + +\chapitre{La macro}{StrRemoveBraces} + +\exemple|\noexploregroups| +\exemple|\StrRemoveBraces{\a1{\b2{\c3{\d4}}}\e5}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\exemple|\exploregroups| +\exemple|\StrRemoveBraces{\a1{\b2{\c3{\d4}}}\e5}[\cmd]| +\exemple|\detokenize\expandafter{\cmd}|\smallskip +\end{document}
\ No newline at end of file diff --git a/Master/texmf-dist/doc/generic/xstring/xstring-en.pdf b/Master/texmf-dist/doc/generic/xstring/xstring-en.pdf Binary files differnew file mode 100644 index 00000000000..0f9c0d18b0f --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/xstring-en.pdf diff --git a/Master/texmf-dist/doc/generic/xstring/xstring_doc_en.tex b/Master/texmf-dist/doc/generic/xstring/xstring-en.tex index 4c95b0c1ae8..fc38260e4ea 100644 --- a/Master/texmf-dist/doc/generic/xstring/xstring_doc_en.tex +++ b/Master/texmf-dist/doc/generic/xstring/xstring-en.tex @@ -1,38 +1,16 @@ -% This is xtring_doc_en.tex, the english manual of xstring -% -% Christian Tellechea 2008-2013 -% -% email : unbonpetit@gmail.com -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% -% http://www.latex-project.org/lppl.txt -% -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\documentclass[a4paper,10pt]{article} +\documentclass[english,a4paper,10pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} -\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian Tellechea},pdftitle={xstring},pdfsubject={package for strings of tokens},pdfkeywords={xstring,latex,string},pdfcreator={LaTeX}]{hyperref} -\usepackage[a4paper,dvips,margin=1.9cm]{geometry} -\usepackage{amsmath,amssymb,amsfonts} -\usepackage{color} -\usepackage{fourier} +\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=blue,pdfauthor={Christian Tellechea},pdftitle={xstring},pdfsubject={package for strings of tokens},pdfkeywords={xstring,latex,string},pdfcreator={LaTeX}]{hyperref} +\usepackage[margin=1.9cm]{geometry} +\usepackage{libertine} \usepackage[scaled=.8]{luximono} -\usepackage{eurosym} -\usepackage{xspace} -\usepackage{listings} -\usepackage{xstring} \usepackage[bottom]{footmisc} -\usepackage[english]{babel} +\usepackage{amsmath,amssymb,amsfonts,color,eurosym,xspace,xstring,babel,listings} \makeatletter -\definecolor{@xs@bckgcolor}{rgb}{1,1,0.9} -\definecolor{@xs@keywordsxstring}{rgb}{0.7,0,0} -\definecolor{@xs@keywordslatex}{rgb}{0,0,1} +\definecolor{@xs@bckgcolor}{rgb}{0.9,1,1} +\definecolor{@xs@keywordsxstring}{rgb}{0,0,0.9} +\definecolor{@xs@keywordslatex}{rgb}{1,0,0} \definecolor{@xs@arguments}{rgb}{0,0,0} \definecolor{@xs@comments}{rgb}{0.5,0.5,0.5} \definecolor{violet}{rgb}{0.66,0,0.66} @@ -102,13 +80,13 @@ \newcommand\US{syntax unit\xspace} \newcommand\USs{syntax units\xspace} \newcommand\Xstring{\textsf{xstring}\xspace} -\newcommand\styleexemple{\small\vskip4pt} +\newcommand\styleexemple{\small\baselineskip1.03\baselineskip\vskip\baselineskip\relax} \newcommand\styleexercice{\footnotesize} \newcommand\verbinline{\lstinline[basicstyle=\normalsize\ttfamily]} \newcommand\colorise{\color{violet}} - +\def\xstringenglishdateaux#1/#2/#3\nil{\number#3\relax\space \ifcase #2 \or January\or February\or March\or April\or May\or June\or July\or August\or September\or October\or November\or December\fi\space#1} +\edef\xstringenglishdate{\expandafter\xstringenglishdateaux\xstringdate\nil} \begin{document} - \setlength{\parindent}{0pt} \begin{titlepage} \null\par\vfill @@ -124,7 +102,7 @@ \vspace{1cm} \begin{center} Christian {\sc Tellechea}\par\small - \href{mailto:unbonpetit@gmail.com}{\nolinkurl{unbonpetit@gmail.com}}\par\vspace{5pt} + \href{mailto:unbonpetit@netc.fr}{\nolinkurl{unbonpetit@netc.fr}}\par\vspace{5pt} \xstringenglishdate \end{center} \vfill\hrulefill @@ -175,7 +153,7 @@ This manual is a translation of the french manual. I apologize for my poor engli \subsection{Description} This extension\footnote{This extension does not require \LaTeX{} and can be compiled with Plain $\varepsilon$-\TeX{}.} provides macros and tests operating on "strings of tokens", as other programmation languages have. They provides the usual strings operations, such as: test if a string contains another, begins or ends with another, extractions of strings, calculation of the position of a substring, of the number of occurrences, etc.\medskip -A "string of tokens" is a list of tokens of any nature, except that braces must be balanced and tokens catcode 6 and 14 (usualy \verb|%| and \verb|#|) are not allowed. Apart from this, any token is allowed (including \verbinline|\par|), in any order in the list, whatever be the resulting code.\medskip +A "string of tokens" is a list of tokens of any nature, except that braces must be balanced and tokens catcode 6 and 14 (usualy \verb|%| et \verb|#|) are not allowed. Apart from this, any token is allowed (including \verbinline|\par|), in any order in the list, whatever be the resulting code.\medskip \Xstring reads the arguments of the macros \US by \US\footnote{In the \TeX{} code, a \US is a control sequence, a group between brace or a single char. See also page~\pageref{developpementarguments}.} : when \USs are \guill{simple} chars (catcode 10, 11 and 12), \Xstring logically read the argument char by char. \Xstring can also be used for programming purpose, including in arguments other tokens such as control sequences, braces and tokens with other catcodes. See chapter on reading mode and arguments expansion (page~\pageref{developpementarguments}), the command \verbinline|\verbtocs| (page~\pageref{verbtocs}) and the command \verbinline|\scancs| (page~\pageref{scancs}).\medskip @@ -381,7 +359,7 @@ Tests if \argu{string} ends with \argu{stringA}, and runs \argu{true} if so, and Tests if \argu{number} is an integer (i.e whose decimal part is empty or 0), and runs \argu{true} if so, and \argu{false} otherwise.\smallskip -If test is false because unexpected characters, the control sequence \verbinline|\@xs@afterinteger| contains the illegal part of \argu{number}.\medskip +If test is false because unexpected characters, the control sequence \verbinline|\@xs@afterinteger| and \verbinline|\afterinteger| both contain the illegal part of \argu{number}.\medskip \begin{minipage}[t]{0.65\linewidth} \begin{lstlisting} @@ -420,7 +398,7 @@ Tests if \argu{number} is a decimal, and runs \argu{true} if so, and \argu{false Counters \verbinline|\integerpart| and \verbinline|\decimalpart| contain the integer part and decimal part of \argu{number}. -If test is false because unexpected characters, the control sequence \verbinline|\@xs@afterdecimal| contains the illegal part of \argu{number}, whereas if test is false because decimal part is empty after decimal separator, it contains "X".\medskip +If test is false because unexpected characters, the control sequence \verbinline|\@xs@afterdecimal| and \verb|\afterdecimal| both contain the illegal part of \argu{number}, whereas if test is false because decimal part is empty after decimal separator, they contain "X".\medskip \begin{Conditions} \item Decimal separator can be a dot or a comma; @@ -691,7 +669,7 @@ In \argu{string}, returns what is rightwards the \argu{number}\th occurrence of \subsubsection{\ttfamily\textbackslash StrCut} Here is the syntax of this macro:\par\nobreak\smallskip -\verbinline|\StrCut|\etoile\arguC{number}\ARGU{string}\ARGU{stringA}\ARGU{macroA}\ARGU{macroB} +\verbinline|\StrCut|\etoile\arguC{nunber}\ARGU{string}\ARGU{stringA}\ARGU{macroA}\ARGU{macroB} \smallskip The optional argument \argu{number} is 1 by default.\par\nobreak\smallskip @@ -1007,7 +985,7 @@ In \argu{string}, returns the substring between\footnote{In the broad sense, i.e \item If \argu{string} is empty, an empty string is returned; \item If \argu{numberA}${}>{}$\argu{numberB}, an empty string is returned; \item If \argu{numberA}${}<1$ and \argu{numberB}${}<1$ an empty string is returned; -\item If \argu{numberA}${}>{}$\argu{lengthString} and \argu{numberB}${}>{}$\argu{lengthString}, an empty string is returned; +\item If \argu{numberA}${}>{}$\argu{lengthString} et \argu{numberB}${}>{}$\argu{lengthString}, an empty string is returned; \item If \argu{numberA}${}<1$, the macro behaves as if \argu{numberA}${}=1$; \item If \argu{numberB}${}>{}$\argu{lengthString}, the macro behaves as if \argu{numberB}${}={}$\argu{lengthString}. \end{Conditions} @@ -1378,9 +1356,9 @@ Let's see what this means with an example. We want to know what is on the left o \end{minipage}% \medskip -Exploring the groups\footnote{The file test of \Xstring has many examples underlining differences between exploration modes.} can change the behaviour of most of the macros of \Xstring, excepted these macros untouched by the exploration mode; their behaviour is the same in any case: \verbinline|\IfInteger|, \verbinline|\IfDecimal|, \verbinline|\IfStrEq|, \verbinline|\StrEq| and \verbinline|\StrCompare|. +Exploring the groups\footnote{The file test of \Xstring has many examples underlining differences between exploration modes.} can change the behaviour of most of the macros of \Xstring, excepted these macros untouched by the exploration mode; their behaviour is the same in any case: \verbinline|\IfInteger|, \verbinline|\IfDecimal|, \verbinline|\IfStrEq|, \verbinline|\StrEq| et \verbinline|\StrCompare|. -Moreover, 2 macros run in \verbinline|\noexploregroups| mode, whatever be the current mode: \verbinline|\StrBetween| and \verbinline|\StrMid|.\medskip +Moreover, 2 macros run in \verbinline|\noexploregroups| mode, whatever be the current mode: \verbinline|\StrBetween| et \verbinline|\StrMid|.\medskip It is possible to save the exploration mode with \verbinline|\saveexploremode|, then modify it and come back to the situation when it was saved with \verbinline|\restoreexploremode|. @@ -1865,7 +1843,7 @@ With this code, in both arguments, the first token \verbinline|\empty| is expand By this way, \verbinline|\empty| is a way to "hack" \verbinline|\expandarg|: it allows to avoid the expansion of all the other tokens. The control sequence \verbinline|\noexpand| can be used instead of \verbinline|\empty| for the same result. -\subsubsection{Example 2} +\subsubsection{Exemple 2} Here, we try to write a macro which gobbles \verb|n| \USs in a string from a given position, and assigns the result to a control sequence. Let's call this macro \verb|StringDel| and let's give it this syntax:\par\nobreak @@ -2070,6 +2048,6 @@ $\star$\quad$\star$ \end{center} \par\nobreak\bigskip\bigskip That's all, I hope you will find this package useful!\par\nobreak -Please, send me an \href{mailto:unbonpetit@gmail.com}{email} if you find a bug or if you have any idea of improvement\ldots\par\nobreak\medskip +Please, send me an \href{mailto:unbonpetit@netc.fr}{email} if you find a bug or if you have any idea of improvement\ldots\par\nobreak\medskip Christian Tellechea \end{document}
\ No newline at end of file diff --git a/Master/texmf-dist/doc/generic/xstring/xstring-fr.pdf b/Master/texmf-dist/doc/generic/xstring/xstring-fr.pdf Binary files differnew file mode 100644 index 00000000000..6d6a4ae8fb8 --- /dev/null +++ b/Master/texmf-dist/doc/generic/xstring/xstring-fr.pdf diff --git a/Master/texmf-dist/doc/generic/xstring/xstring_doc_fr.tex b/Master/texmf-dist/doc/generic/xstring/xstring-fr.tex index f808db42b29..d2c1c64b0e4 100644 --- a/Master/texmf-dist/doc/generic/xstring/xstring_doc_fr.tex +++ b/Master/texmf-dist/doc/generic/xstring/xstring-fr.tex @@ -1,38 +1,16 @@ -% Ceci est xtring_doc_fr.tex, le manuel en français de xstring -% -% Christian Tellechea 2008-2013 -% -% email : unbonpetit@gmail.com -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% -% http://www.latex-project.org/lppl.txt -% -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\documentclass[a4paper,10pt]{article} +\documentclass[a4paper,10pt,french]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} -\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=magenta,pdfauthor={Christian TELLECHEA},pdftitle={xstring},pdfsubject={package pour la manipulation de chaines de tokens},pdfkeywords={xstring,latex,tex,string,chaine},pdfcreator={LaTeX}]{hyperref} -\usepackage[a4paper,dvips,margin=1.9cm]{geometry} -\usepackage{amsmath,amssymb,amsfonts} -\usepackage{color} -\usepackage{fourier} +\usepackage[bookmarks=true,bookmarksopen=true,colorlinks=true,hyperfootnotes=false,filecolor=black,linkcolor=blue,urlcolor=blue,pdfauthor={Christian Tellechea},pdftitle={xstring},pdfsubject={package pour la manipulation de chaines de tokens},pdfkeywords={xstring,latex,tex,string,chaine},pdfcreator={LaTeX}]{hyperref} +\usepackage[margin=1.9cm]{geometry} +\usepackage{libertine} \usepackage[scaled=.8]{luximono} -\usepackage{eurosym} -\usepackage{xspace} -\usepackage{listings} -\usepackage{xstring} \usepackage[bottom]{footmisc} -\usepackage[frenchb]{babel} +\usepackage{amsmath,amssymb,amsfonts,color,eurosym,xspace,xstring,babel,listings} \makeatletter -\definecolor{@xs@bckgcolor}{rgb}{1,1,0.9} -\definecolor{@xs@keywordsxstring}{rgb}{0.7,0,0} -\definecolor{@xs@keywordslatex}{rgb}{0,0,1} +\definecolor{@xs@bckgcolor}{rgb}{0.9,1,1} +\definecolor{@xs@keywordsxstring}{rgb}{0,0,0.9} +\definecolor{@xs@keywordslatex}{rgb}{1,0,0} \definecolor{@xs@arguments}{rgb}{0,0,0} \definecolor{@xs@comments}{rgb}{0.5,0.5,0.5} \definecolor{violet}{rgb}{0.66,0,0.66} @@ -87,6 +65,7 @@ \newcommand\ARGU[1]{\texttt{\color{black}\{}\argu{#1}\texttt{\color{black}\}}} \newcommand\arguC[1]{\texttt{\color{black}[}\argu{#1}\texttt{\color{black}]}} \newcommand\arguCC[2]{\texttt{\color{black}[}\argu{#1}\texttt{\color{black},}\argu{#2}\texttt{\color{black}]}} +\newcommand\texte[1]{\texttt{text}${}_{#1}$} \newcommand\etoile{$\langle$\texttt{[*]}$\rangle$} \newenvironment{Conditions}[1][1cm]% {\begin{list}% @@ -101,11 +80,12 @@ \newcommand\US{unité syntaxique\xspace} \newcommand\USs{unités syntaxiques\xspace} \newcommand\Xstring{\textsf{xstring}\xspace} -\newcommand\styleexemple{\small\vskip4pt} +\newcommand\styleexemple{\small\baselineskip1.03\baselineskip\vskip\baselineskip\relax} \newcommand\styleexercice{\footnotesize} \newcommand\verbinline{\lstinline[basicstyle=\normalsize\ttfamily]} \newcommand\colorise{\color{violet}} -\listfiles +\def\xstringfrenchdateaux#1/#2/#3\nil{\number#3\relax\ifnum#3=1 \noexpand\ier\fi\space \ifcase #2 \or janvier\or f\'evrier\or mars\or avril\or mai\or juin\or juillet\or aout\or septembre\or octobre\or novembre\or d\'ecembre\fi\space#1} +\edef\xstringfrenchdate{\expandafter\xstringfrenchdateaux\xstringdate\nil} \begin{document} \setlength{\parindent}{0pt} \begin{titlepage} @@ -122,7 +102,7 @@ \vspace{1cm} \begin{center} Christian {\sc Tellechea}\par\small - \href{mailto:unbonpetit@gmail.com}{\nolinkurl{unbonpetit@gmail.com}}\par\vspace{5pt} + \href{mailto:unbonpetit@netc.fr}{\nolinkurl{unbonpetit@netc.fr}}\par\vspace{5pt} \xstringfrenchdate \end{center} \vfill\hrulefill @@ -168,11 +148,12 @@ \tableofcontents +% \section{Présentation} \subsection{Description} Cette extension\footnote{L'extension ne nécessite pas \LaTeX{} et peut être compilée sous Plain $\varepsilon$-\TeX{}.} regroupe des macros et des tests opérant sur des chaînes de tokens, un peu comme en disposent des langages dit \guill{évolués}. On y trouve les opérations habituelles sur les chaînes, comme par exemple : test si une chaîne en contient une autre, commence ou finit par une autre, test si une chaîne est un nombre entier ou décimal, extractions de sous-chaînes, calculs de position d'une sous-chaîne, calculs du nombre d'occurrences, etc.\medskip -On appelle \guill{chaîne de tokens} une suite de tokens quelconques, sachant qu'aucune supposition n'a été faite quant à leur nature, mis à part que dans les chaînes de tokens, les accolades doivent être équilibrées et que les tokens de catcode 6 et 14 (habituellement \verb|%| et \verb|#|) n'y sont pas admis. Tous les autres tokens, y compris \verbinline|\par|, sont \emph{à priori} permis dans n'importe quel ordre, quelque soit le code qu'ils représentent.\medskip +On appelle \guill{chaîne de tokens} une suite de tokens quelconques, sachant qu'aucune supposition n'a été faite quant à leur nature, mis à part que dans les chaînes de tokens, les accolades doivent être équilibrées et que les tokens de catcode 6 et 14 (habituellement \verb|%| et \verb|#|) n'y sont pas admis. Tous les autres tokens, y compris \verbinline|\par|, sont \emph{à priori} permis dans n'importe quel ordre, quel que soit le code qu'ils représentent.\medskip Les arguments contenant des chaînes de tokens sont lus par \Xstring \emph{\US par \US\footnote{Sauf cas particulier, une \US est un caractère lu dans le code à ces exceptions près : une séquence de contrôle est une \US, un groupe entre accolades est aussi une \US. Voir également page~\pageref{developpementarguments}.}}, ce qui revient à les lire caractère par caractère lorsque ceux-ci contiennent des tokens \guill{normaux}, c'est-à -dire dont les catcodes sont 10, 11 et 12. On peut également utiliser \Xstring à des fins de programmation en utilisant des arguments contenant des séquences de contrôle et des tokens dont les catcodes sont moins inoffensifs. Voir le chapitre sur le mode de lecture et de développement des arguments (page~\pageref{developpementarguments}), la commande \verbinline|\verbtocs| (page~\pageref{verbtocs}), la commande \verbinline|\scancs| (page~\pageref{scancs}).\medskip @@ -374,7 +355,7 @@ Teste si \argu{chaine} se termine par \argu{chaineA}, et exécute \argu{vrai} da \smallskip Teste si \argu{nombre} est un nombre entier relatif (c'est-à -dire dont la partie décimale est absente ou constituée d'une suite de 0), et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\par\nobreak\smallskip -Si le test est faux pour cause de caractères non autorisés, la séquence de contrôle \verb|\@xs@afterinteger| contient la partie illégale de \argu{nombre}.\medskip +Si le test est faux pour cause de caractères non autorisés, les séquences de contrôle \verb|\@xs@afterinteger| et \verb|\afterinteger| contiennent chacune la partie illégale de \argu{nombre}.\medskip \begin{minipage}[t]{0.65\linewidth} \begin{lstlisting} @@ -412,7 +393,7 @@ Si le test est faux pour cause de caractères non autorisés, la séquence de co Teste si \argu{nombre} est un nombre décimal, et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\par\nobreak\smallskip Les compteurs \verb|\integerpart| et \verb|\decimalpart| contiennent les parties entières et décimales de \argu{nombre}. -Si le test est faux pour cause de caractères non autorisés, la séquence de contrôle \verb|\@xs@afterdecimal| contient la partie illégale de \argu{nombre}, alors que si le test est faux parce que la partie décimale après le séparateur décimal est vide, elle contient \guill{X}.\medskip +Si le test est faux pour cause de caractères non autorisés, les séquences de contrôle \verb|\@xs@afterdecimal| et \verb|\afterdecimal| contiennent chacune la partie illégale de \argu{nombre}, alors que si le test est faux parce que la partie décimale après le séparateur décimal est vide, elles contiennent \guill{X}.\medskip \begin{Conditions} \item Le séparateur décimal peut être un point ou une virgule; @@ -2052,6 +2033,6 @@ $\star$\quad$\star$ \bigskip\bigskip C'est tout, j'espère que ce package vous sera utile !\par\nobreak -Merci de me signaler par \href{mailto:unbonpetit@gmail.com}{email} tout bug ou toute proposition d'amélioration\ldots\par\nobreak\bigskip +Merci de me signaler par \href{mailto:unbonpetit@netc.fr}{email} tout bug ou toute proposition d'amélioration\ldots\par\nobreak\bigskip Christian \textsc{Tellechea} \end{document}
\ No newline at end of file diff --git a/Master/texmf-dist/doc/generic/xstring/xstring_doc_en.pdf b/Master/texmf-dist/doc/generic/xstring/xstring_doc_en.pdf Binary files differdeleted file mode 100644 index 8d2903e233c..00000000000 --- a/Master/texmf-dist/doc/generic/xstring/xstring_doc_en.pdf +++ /dev/null diff --git a/Master/texmf-dist/doc/generic/xstring/xstring_doc_fr.pdf b/Master/texmf-dist/doc/generic/xstring/xstring_doc_fr.pdf Binary files differdeleted file mode 100644 index 138612eec17..00000000000 --- a/Master/texmf-dist/doc/generic/xstring/xstring_doc_fr.pdf +++ /dev/null diff --git a/Master/texmf-dist/tex/generic/xstring/xstring.sty b/Master/texmf-dist/tex/generic/xstring/xstring.sty index 9dc5a187f7c..18632cd8723 100644 --- a/Master/texmf-dist/tex/generic/xstring/xstring.sty +++ b/Master/texmf-dist/tex/generic/xstring/xstring.sty @@ -1,3 +1,3 @@ \input xstring.tex -\ProvidesPackage{xstring}[\xstringdate\space\space v\xstringversion\space\space String manipulations (C Tellechea)] +\ProvidesPackage{xstring}[\xstringdate\space v\xstringversion\space String manipulations (CT)] \endinput
\ No newline at end of file diff --git a/Master/texmf-dist/tex/generic/xstring/xstring.tex b/Master/texmf-dist/tex/generic/xstring/xstring.tex index 015fc656bae..aa72f9b6c4d 100644 --- a/Master/texmf-dist/tex/generic/xstring/xstring.tex +++ b/Master/texmf-dist/tex/generic/xstring/xstring.tex @@ -1,1218 +1,1039 @@ -% __________________________________________________ -% | | -% | | -% | xstring v1.7c | -% | | -% | 13 octobre 2013 | -% | | -% |__________________________________________________| +% !TeX encoding = ISO-8859-1 +% Ce fichier contient le code de l'extension "xstring" % -% This is xtring.tex -% -% "xstring" package consists of the 7 following files: -% xstring.tex (this file) -% xstring.sty -% README -% xstring_doc_fr.tex, xstring_doc_fr.pdf (manual in french) -% xstring_doc_en.tex, xstring_doc_en.pdf (manual in english) -% -% Christian Tellechea 2008-2013 -% email : unbonpetit@gmail.com -% ------------------------------------------------------------------- -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% -% http://www.latex-project.org/lppl.txt -% -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% ------------------------------------------------------------------- -% This work has the LPPL maintenance status `maintained'. -% -% The Current Maintainer of this work is Christian Tellechea -% ------------------------------------------------------------------- -\def\xstringversion {1.7c} -\def\xstringdate {2013/10/13} -\def\xstringfrenchdate {13 octobre 2013} -\def\xstringenglishdate {13 october 2013} -\edef\CurrentAtCatcode {\the\catcode`\@} -\catcode`\@=11 -\newwrite\@xs@message% canal pour les messages +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +\def\xstringname {xstring} % +\def\xstringversion {1.8} % +% % +\def\xstringdate {2018/12/07} % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Author : Christian Tellechea % +% Status : Maintained % +% Maintainer : Christian Tellechea % +% Email : unbonpetit@netc.fr % +% Package URL: https://www.ctan.org/pkg/xstring % +% Bug tracker: https://framagit.org/unbonpetit/xstring/issues % +% Repository : https://framagit.org/unbonpetit/xstring/tree/master % +% Copyright : Christian Tellechea 2008-2018 % +% Licence : Released under the LaTeX Project Public License v1.3c % +% or later, see http://www.latex-project.org/lppl.txt % +% Files : 1) xstring.tex % +% 2) xstring.sty % +% 3) xstring-fr.tex % +% 4) xstring-fr.pdf % +% 5) xstring-en.tex % +% 6) xstring-en.pdf % +% 7) README % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\ifdefined\usepackage\else + \immediate\write-1 {Package: xstring \xstringdate\space v\xstringversion\space String manipulations (CT)}% +\fi \newcount\integerpart -\newcount\decimalpart% compteurs utilis\'es par xstring - -\expandafter\ifx\csname @latexerr\endcsname\relax% on n'utilise pas LaTeX ? - \immediate\write\m@ne{Package: xstring \xstringdate\space\space v\xstringversion\space\space String manipulations}% - \long\def\@firstoftwo#1#2{#1} - \long\def\@secondoftwo#1#2{#2} - \long\def\@gobble#1{} - \long\def\@ifnextchar#1#2#3{% - \let\reserved@d=#1% - \def\reserved@a{#2}% - \def\reserved@b{#3}% - \futurelet\@let@arg\@ifnch} - \def\@ifnch{% - \ifx\@let@arg\@sptoken - \let\reserved@c\@xifnch - \else - \ifx\@let@arg\reserved@d - \let\reserved@c\reserved@a - \else - \let\reserved@c\reserved@b - \fi - \fi - \reserved@c} - \def\:{\let\@sptoken= } \: - \def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@arg\@ifnch} - \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} - \long\def\@testopt#1#2{\@ifnextchar[{#1}{#1[{#2}]}} - \def\@empty{} -\fi% fin des d\'efinitions LaTeX - -\long\def\@xs@ifempty#1{% - \expandafter\ifx\expandafter\relax\detokenize{#1}\relax - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi +\newcount\decimalpart% compteurs utilisés par xstring + +\edef\restorexstringcatcode{\catcode\number`\_ =\number\catcode`\_\relax} +\catcode`\_=11 + +\long\def\xs_execfirst#1#2{#1} +\long\def\xs_execsecond#1#2{#2} +\long\def\xs_gobarg#1{} +\expandafter\def\expandafter\xs_gobspace\space{} +\def\xs_deftok#1#2{\let#1= #2\relax}\xs_deftok\xs_sptoken{ } +\def\xs_ifnxttok#1#2#3{\xs_deftok\xs_toktotest{#1}\def\__truecode{#2}\def\__falsecode{#3}\xs_ifnxttok_a} +\def\xs_ifnxttok_a{\futurelet\__futurtok\xs_ifnxttok_b} +\def\xs_ifnxttok_b{% + \xs_ifx{\__futurtok\xs_sptoken} + {\afterassignment\xs_ifnxttok_a\let\__futurtok= } + {\xs_ifx{\__futurtok\xs_toktotest}\__truecode\__falsecode}% +} +\def\xs_ifstar#1{\xs_ifnxttok*{\xs_execfirst{#1}}} +\def\xs_testopt#1#2{\xs_ifnxttok[{#1}{#1[{#2}]}} +\long\def\xs_exparg#1#2{\expandafter\xs_exparg_a\expandafter{#2}{#1}}% +\long\def\xs_exparg_a#1#2{#2{#1}} +\long\def\xs_exptwoargs#1#2#3{\xs_exparg{\xs_exparg{#1}{#2}}{#3}} +\long\def\xs_eearg#1#2{\xs_exparg{\xs_exparg{#1}}{#2}} +\long\def\xs_edefaddtomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}} +\long\def\xs_addtomacro#1#2{\xs_exparg{\def#1}{#1#2}} +\long\def\xs_eaddtomacro#1#2{\xs_exparg{\xs_addtomacro#1}{#2}} +\long\def\xs_eeaddtomacro#1#2{\xs_exparg{\xs_eaddtomacro#1}{#2}} +\long\def\xs_endgroup_eaddtomacro#1#2{\xs_exparg{\endgroup\xs_addtomacro#1}{#2}} +\long\def\xs_beforespace#1 #2\_nil{#1} +\long\def\xs_afterspace#1 #2\_nil{#2} +\long\def\xs_gobtonil#1\_nil{} +\long\def\xs_gobtobrace#1#{} +\long\def\xs_ifx#1{\ifx#1\expandafter\xs_execfirst\else\expandafter\xs_execsecond\fi} +\def\xs_ifnum#1{\ifnum#1\expandafter\xs_execfirst\else\expandafter\xs_execsecond\fi} +\long\def\xs_ifempty#1{\expandafter\xs_ifx\expandafter{\expandafter\relax\detokenize{#1}\relax}} + +\def\xs_toks_toverb{% lit 1 argument et le transforme en verb + \begingroup + \def\do##1{\catcode`##112 }% + \dospecials + \obeyspaces + \xs_read_verb } -% Ouvre un groupe o\`u les catcodes sont \`a 12 et \`a 10 pour les espaces -% ensuite, appelle \@xs@ReadVerb qui lit un argument entre d\'elimiteurs verb -\def\@xs@MakeVerb{% lit 1 argument et le transforme en verb - \begingroup% groupe o\`u les catcodes sont \`a 12 pour la lecture suivante - \def\do##1{\catcode`##112\relax}% - \dospecials% on entre dans le mode verb - \obeyspaces% et on tient compte des espaces - \@xs@ReadVerb% et on va lire l'argument -} - -% D\'efinit \@xs@ReadVerb qui lit un argument entre d\'elimiteurs verb -\def\setverbdelim#1{% d\'efinit quel est le d\'elimiteur de verb - \expandafter\@xs@ifempty\expandafter{\@gobble#1}% - \relax - {\begingroup - \newlinechar`\^^J% - \immediate\write\@xs@message - {Package xstring Warning: verb delimiter is not a single token on input line \the\inputlineno^^J}% - \endgroup - }% - \def\@xs@ReadVerb##1#1##2#1{% lit ##2 qui est entre les d\'elimiteurs de verb - \endgroup% on ferme le groupe - \@xs@afterreadverb{##2}}% on appelle l'ex\'ecution de fin + +\def\setverbdelim#1{% définit quel est le délimiteur de verb + \xs_exparg\xs_ifempty{\xs_gobarg#1}% + {} + {\errmessage{Package xstring Warning: verb delimiter "\detokenize{#1}" is not a single token}}% + \def\xs_read_verb##1#1##2#1{\endgroup\xs_assign_verb{##2}}% on appelle l'exécution de fin } -% Assigne l'argument entre d\'elimiteur verb dans la sc #1' + +% Assigne l'argument entre délimiteur verb dans la sc #1 \def\verbtocs#1{% - \def\@xs@afterreadverb##1{\def#1{##1}}% - \@xs@MakeVerb + \def\xs_assign_verb##1{\def#1{##1}}% + \xs_toks_toverb } \begingroup - \catcode\z@3 \def\@xs@twochars{^^00}% - \catcode\z@7 \xdef\@xs@twochars{\@xs@twochars^^00}% + \catcode0 3 \gdef\xs_twozeroschars{^^00}% + \catcode0 7 \xdef\xs_twozeroschars{\xs_twozeroschars^^00}% \endgroup -\edef\@xs@reserved@A{\long\def\noexpand\@xs@AssignResult##1\@xs@twochars} - -\@xs@reserved@A#2{\endgroup\expandafter\def\expandafter#2\expandafter{\@gobble#1}} +\edef\xs_reserved_A{\long\def\noexpand\xs_assigntokenizeresult##1\xs_twozeroschars} +\xs_reserved_A#2{\endgroup\xs_exparg{\def#2}{\xs_gobarg#1}} \def\tokenize#1#2{% \begingroup - \@xs@def\@xs@reserved@A{#2}% on d\'eveloppe en accord avec \fullexpandarg ou \noexpandarg - \everyeof\expandafter{\@xs@twochars#1}% met "^^@^^@#1" \`a la fin du fichier virtuel - \endlinechar\m@ne - \expandafter\@xs@AssignResult\scantokens\expandafter{\expandafter\relax\@xs@reserved@A}% on fait l'assignation + \xs_def\xs_reserved_A{#2}% on développe en accord avec \fullexpandarg ou \noexpandarg + \everyeof\expandafter{\xs_twozeroschars#1}% + \endlinechar-1 + \expandafter\xs_assigntokenizeresult\scantokens\expandafter{\expandafter\relax\xs_reserved_A}% on fait l'assignation }% -% Macro tr\`es simple qui assigne ou affiche le r\'esultat, selon la pr\'esence -% ou non de #2 qui est l'argument optionnel venant en derni\`ere position des macros -\long\def\@xs@ReturnResult#1#2{% - \def\@xs@argument@A{#1}% - \@xs@ifempty{#2}% - \@xs@argument@A - {\let#2\@xs@argument@A}% -} - -\def\@xs@ldef{\long\def} +\long\def\xs_assign_xstringresult#1#2{\xs_ifempty{#2}{#1}{\def#2{#1}}} -\def\@xs@ledef{\long\edef} +\def\xs_ldef{\long\def} +\def\xs_ledef{\long\edef} -% Pas d'expansion des arguments \def\normalexpandarg{% - \let\@xs@def\@xs@ldef% on d\'efinit \@xs@call avec \def - \def\@xs@expand##1{\unexpanded\expandafter{##1}}} + \let\xs_def\xs_ldef% on définit \xs_call avec \def + \def\xs_expand##1{\unexpanded\expandafter{##1}}% +} \let\noexpandarg\normalexpandarg% synonyme -% 1-d\'eveloppement du premier token des arguments \def\expandarg{% - \let\@xs@def\@xs@ldef% on d\'efinit \@xs@call avec \def - \def\@xs@expand##1{\unexpanded\expandafter\expandafter\expandafter{##1}}% + \let\xs_def\xs_ldef% on définit \xs_call avec \def + \def\xs_expand##1{\unexpanded\expandafter\expandafter\expandafter{##1}}% } -% D\'eveloppement maximum des arguments \def\fullexpandarg{% - \let\@xs@def\@xs@ledef% on d\'efinit\@xs@call avec \edef - \def\@xs@expand##1{##1}% et on neutralise \@xs@expand + \let\xs_def\xs_ledef% on définit\xs_call avec \edef + \def\xs_expand##1{##1}% et on neutralise \xs_expand } -\def\saveexpandmode{\let\@xs@saved@def\@xs@defarg\let\@xs@saved@expand\@xs@expand} - -\def\restoreexpandmode{\let\@xs@defarg\@xs@saved@def\let\@xs@expand\@xs@saved@expand} +\def\saveexpandmode{\let\xs_saved_def\xs_defarg\let\xs_saved_expand\xs_expand} +\def\restoreexpandmode{\let\xs_defarg\xs_saved_def\let\xs_expand\xs_saved_expand} % Macro interne renvoyant #2 si son argument commence par une accolade ouvrante "{" % et #3 sinon (Ulrich Diez sur comp.text.tex) -\long\def\@xs@ifbeginwithbrace#1{% - \csname @% - \expandafter\@gobble\string{% - \expandafter\@gobble\expandafter{\expandafter{\string#1}% - \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\@firstoftwo - \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\@gobble - \expandafter\expandafter\expandafter\@gobble +\long\def\xs_ifbeginwithbrace#1{% + \csname xs_exec% + \expandafter\xs_gobarg\string{% + \expandafter\xs_gobarg\expandafter{\expandafter{\string#1}% + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\xs_execfirst + \expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\expandafter\xs_gobarg + \expandafter\expandafter\expandafter\xs_gobarg \expandafter\expandafter\expandafter{\expandafter\string\expandafter}\string}% - \expandafter\@gobble\string}% - \@secondoftwo{first}{second}oftwo% + \expandafter\xs_gobarg\string}% + \xs_execsecond{first}{second}% \endcsname } -% Cette macro interne prend la 1ere unit\'e syntaxique de #1 et assigne le r\'esultat \`a #2 -\long\def\@xs@returnfirstsyntaxunit#1#2{% - \def\@xs@groupfound{\expandafter\def\expandafter#2\expandafter{\expandafter{#2}}\@xs@gobbleall}% on met #2 dans des accolades et on finit - \long\def\@xs@assignfirsttok##1##2\@xs@nil{\let\@xs@toks0\def#2{##1}}% - \def\@xs@testfirsttok{% - \let\@xs@next\@xs@assignfirsttok - \ifx\@xs@toks\bgroup - \expandafter\@xs@ifbeginwithbrace\expandafter{\@xs@argument}{\def\@xs@next{\afterassignment\@xs@groupfound\def#2}}{}% - \fi - \@xs@next}% - \def\@xs@argument{#1}% - \edef\@xs@next{\expandafter\@xs@beforespace\detokenize{#1} \@xs@nil}% #1 commence par un espace ? - \ifx\@xs@next\@empty - \def\@xs@next{\expandafter\ifx\expandafter\@empty\detokenize\expandafter{\@xs@argument}\@empty\let#2\@empty\else\def#2{ }\let\@xs@toks0\fi}% - \else - \def\@xs@next{\expandafter\futurelet\expandafter\@xs@toks\expandafter\@xs@testfirsttok\@xs@argument\@xs@nil}% - \fi - \@xs@next +% Cette macro interne prend la 1ere unité syntaxique de #1 et assigne le résultat à #2 +\long\def\xs_returnfirstsyntaxunit#1#2{% + \let\xs_toks\relax + \xs_ifempty{#1} + {\let#2\empty + } + {\xs_eearg\xs_ifempty{\expandafter\xs_beforespace\detokenize{#1} \_nil}% #1 commence par un espace ? + {\def#2{ }} + {\xs_ifbeginwithbrace{#1} + {\def\xs_groupfound{\xs_exparg{\def#2}{\expandafter{#2}}\xs_gobtonil}% on met #2 dans des accolades et on finit + \let\xs_toks\bgroup + \afterassignment\xs_groupfound + \def#2% + } + {\long\def\xs_assignfirstarg##1##2\_nil{\def#2{##1}}% + \xs_assignfirstarg + }% + #1\_nil + }% + }% } -% Cette macro interne enl\`eve la 1ere unit\'e syntaxique de #1 et assigne le r\'esultat \`a #2 -\long\def\@xs@testsecondtoken#1\@xs@nil{\@xs@ifbeginwithbrace{#1}} - -\long\def\@xs@gobblespacebeforebrace#1#{}% supprime tout ce qui est avant la 1ere accolade ouvrante - -\long\def\@xs@removefirstsyntaxunit#1#2{% - \def\@xs@argument{#1}% - \expandafter\expandafter\expandafter\ifx\expandafter\expandafter\expandafter\@empty\expandafter\@xs@beforespace\detokenize\expandafter{\@xs@argument} \@xs@nil\@empty% #1 commence par un espace ? - \expandafter\@xs@ifempty\expandafter{\@xs@argument}% - {\let#2\@empty} - {\afterassignment\@xs@testsecondtoken% après avoir mangé le 1er token, on va tester si la suite commence par «{» - \expandafter\let\expandafter\@xs@secontoken\expandafter=\expandafter\@sptoken\@xs@argument\@xs@@nil\@xs@nil% on mange le 1er token et on rajoute \@xs@@nil à la fin pour éviter de perdre les accolades du groupe - {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2% - \expandafter\expandafter\expandafter{\expandafter\@xs@gobblespacebeforebrace\@xs@argument}}% - {\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2% - \expandafter\expandafter\expandafter{\expandafter\@xs@behindspace\@xs@argument\@xs@nil}}% +\long\def\xs_removefirstsyntaxunit#1#2{% + \xs_ifempty{#1} + {\let#2\empty + } + {\xs_eearg\xs_ifempty{\expandafter\xs_beforespace\detokenize{#1} \_nil}% #1 commence par un espace ? + {\xs_exparg\xs_ifbeginwithbrace{\xs_gobspace#1} + {\xs_exparg{\def#2}{\xs_gobtobrace#1}}% + {\xs_exparg{\def#2}{\xs_afterspace#1\_nil}}% }% - \else - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter#2% - \expandafter\expandafter\expandafter{\expandafter\@gobble\@xs@argument}% - \fi + {\xs_exparg{\def#2}{\xs_gobarg#1}}% + }% } -% Macros \`a arguments d\'elimit\'es pour les macros ci dessus -\long\def\@xs@beforespace#1 #2\@xs@nil{#1} - -\long\def\@xs@behindspace#1 #2\@xs@nil{#2} - -\long\def\@xs@returnfirstsyntaxunit@ii#1#2\@xs@nil{#1} - -\long\def\@xs@gobbleall#1\@xs@nil{} - -% Cette macro interne est utilis\'ee dans les macros \'etoil\'ees pour : -% 1) d\'evelopper l'argument selon qu'on a choisit \fullexpandarg -% ou \normalexpandarg, et ceci \`a l'aide de la macro \@xs@def -% 2) Ensuite, on d\'etokenize ce d\'eveloppement de façon n'avoir plus que +% Cette macro interne est utilisée dans les macros étoilées pour : +% 1) développer l'argument selon qu'on a choisit \fullexpandarg +% ou \normalexpandarg, et ceci à l'aide de la macro \xs_def +% 2) Ensuite, on détokenize ce développement de façon n'avoir plus que % des catcodes de 10 pour les espaces et 12 pour le reste. -\long\def\@xs@expand@and@detokenize#1#2{% +\long\def\xs_expand_and_detokenize#1#2{% \long\def#1{#2}% - \expandafter\edef\expandafter#1\expandafter{\@xs@expand#1}% on d\'eveloppe #2 selon le mode de d\'eveloppement - \long\edef#1{\detokenize\expandafter{#1}}% puis on d\'etokenize et on assigne \`a #1 + \expandafter\edef\expandafter#1\expandafter{\xs_expand#1}% on développe #2 selon le mode de développement + \long\edef#1{\detokenize\expandafter{#1}}% puis on détokenize et on assigne à #1 } -\long\def\@xs@expand@and@assign#1#2{\@xs@def#1{#2}}% on d\'eveloppe #2 selon \fullexpandarg ou \normalexpandarg - -\long\def\@xs@edefaddtomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}} - -\long\def\@xs@addtomacro#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}} - -\def\@xs@argstring{0########1########2########3########4########5########6########7########8########9} +\long\def\xs_expand_and_assign#1#2{\xs_def#1{#2}}% on développe #2 selon \fullexpandarg ou \normalexpandarg -% \@xs@DefArg{3} met dans la sc \@xs@myarg les tokens "####1####2####3" -\def\@xs@DefArg#1{\def\@xs@defarg0##1#1##2\@xs@nil{\def\@xs@myarg{##1#1}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil} +\def\xs_arglist{0########1########2########3########4########5########6########7########8########9} -% \@xs@DefArg@{3} met dans la sc \@xs@myarg les tokens "[####1]####2####3####4" -\def\@xs@DefArg@#1{\expandafter\@xs@defarg@\expandafter{\number\numexpr#1+1}} +% \xs_assign_args{3} met dans la sc \xs_myarg les tokens "####1####2####3" +\def\xs_assign_args#1{\def\xs_assign_args_i0##1#1##2\_nil{\def\xs_myarg{##1#1}}\expandafter\xs_assign_args_i\xs_arglist\_nil} -\def\@xs@defarg@#1{\def\@xs@defarg0##11##2#1##3\@xs@nil{\def\@xs@myarg{[##11]##2#1}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil} +% \xs_assign_opt_args{3} met dans la sc \xs_myarg les tokens "[####1]####2####3####4" +\def\xs_assign_opt_args#1{\xs_exparg\xs_assign_opt_args_i{\number\numexpr#1+1}} +\def\xs_assign_opt_args_i#1{\def\xs_assign_opt_args_ii0##11##2#1##3\_nil{\def\xs_myarg{[##11]##2#1}}\expandafter\xs_assign_opt_args_ii\xs_arglist\_nil} -% \@xs@OneArg{3} met dans la sc \@xs@myarg les tokens "####3" -\def\@xs@OneArg#1{\expandafter\@xs@onearg\expandafter{\number\numexpr#1-1}{#1}} +% \xs_assign_one_arg{3} met dans la sc \xs_myarg les tokens "####3" +\def\xs_assign_one_arg#1{\xs_exparg\xs_assign_one_arg_i{\number\numexpr#1-1}{#1}} +\def\xs_assign_one_arg_i#1#2{\def\xs_assign_one_arg_ii##1#1##2#2##3\_nil{\def\xs_myarg{##2#2}}\expandafter\xs_assign_one_arg_ii\xs_arglist\_nil} -\def\@xs@onearg#1#2{\def\@xs@defarg##1#1##2#2##3\@xs@nil{\def\@xs@myarg{##2#2}}\expandafter\@xs@defarg\@xs@argstring\@xs@nil} - -% #1 : num\'ero du 1er argument; #2 : nombre de lignes; #3 argument optionnel; #4 : dernier num\'ero de l'argument devant être d\'etokenis\'e si \'etoile -\def\@xs@BuildLines#1#2#3#4{% - \let\@xs@newlines\@empty - \let\@xs@newargs\@empty - \def\@xs@buildlines##1{% - \expandafter\@xs@OneArg\expandafter{\number\numexpr##1+#1-1}% - \edef\@xs@reserved@B{\noexpand\@xs@expand\csname @xs@arg@\romannumeral\numexpr##1\endcsname}% - \ifnum##1=\@ne% si c'est le premier argument - \@xs@ifempty{#3}% - {\expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter{\@xs@reserved@B}}% - \edef\@xs@reserved@B{\ifnum##1>#4 @xs@def\else @xs@assign\fi}% +% #1 : numéro du 1er argument; #2 : nombre de lignes; #3 argument optionnel; #4 : dernier numéro de l'argument devant être détokenisé si étoile +\def\xs_buildlines#1#2#3#4{% + \let\xs_newlines\empty + \let\xs_newargs\empty + \def\xs_buildlines_i##1{% + \xs_exparg\xs_assign_one_arg{\number\numexpr##1+#1-1}% + \edef\xs_reserved_B{\noexpand\xs_expand\csname xs_arg_\romannumeral\numexpr##1\endcsname}% + \xs_ifnum{##1=1 }% si c'est le premier argument + {\xs_ifempty{#3}% + {\xs_eaddtomacro\xs_newargs{\expandafter{\xs_reserved_B}}% + \edef\xs_reserved_B{\ifnum##1>#4 xs_def\else xs_assign\fi}% }% et s'il y a un argument optionnel alors, on met des crochets - {\expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter[\@xs@reserved@B]}% - \def\@xs@reserved@B{@xs@def}% ne pas d\'etok\'eniser l'argument optionnel grace au \@xs@def - } - \else - \expandafter\@xs@addtomacro\expandafter\@xs@newargs\expandafter{\expandafter{\@xs@reserved@B}}% - \edef\@xs@reserved@B{\ifnum##1>#4 @xs@def\else @xs@assign\fi}% - \fi - \edef\@xs@newlines{\unexpanded\expandafter{\@xs@newlines}\expandafter\noexpand\csname\@xs@reserved@B\endcsname\expandafter\noexpand\csname @xs@arg@\romannumeral\numexpr##1\endcsname{\@xs@myarg}}% - \ifnum##1<#2\relax - \def\@xs@next{\expandafter\@xs@buildlines\expandafter{\number\numexpr##1+1}}% - \expandafter\@xs@next - \fi}% - \@xs@buildlines\@ne + {\xs_eaddtomacro\xs_newargs{\expandafter[\xs_reserved_B]}% + \def\xs_reserved_B{xs_def}% ne pas détokéniser l'argument optionnel grace au \xs_def + }% + } + {\xs_eaddtomacro\xs_newargs{\expandafter{\xs_reserved_B}}% + \edef\xs_reserved_B{\ifnum##1>#4 xs_def\else xs_assign\fi}% + }% + \edef\xs_newlines{\unexpanded\expandafter{\xs_newlines}\expandafter\noexpand\csname\xs_reserved_B\endcsname\expandafter\noexpand\csname xs_arg_\romannumeral\numexpr##1\endcsname{\xs_myarg}}% + \xs_ifnum{##1<#2 } + {\xs_exparg\xs_buildlines_i{\number\numexpr##1+1}} + {}% + }% + \xs_buildlines_i1% } -\def\@xs@newmacro{% - \@ifstar - {\let\@xs@reserved@D\@empty\@xs@newmacro@} - {\let\@xs@reserved@D\relax\@xs@newmacro@0}% +\def\xs_newmacro{% + \xs_ifstar + {\let\xs_reserved_D\empty\xs_newmacro_} + {\let\xs_reserved_D\relax\xs_newmacro_0}% } -% #1 : dernier num\'ero de l'argument devant être d\'etokenis\'e +% #1 : dernier numéro de l'argument devant être détokenisé % #2 : nom de la macro publique % #3 : argument optionnel (vide si pas d'arg optionnel) % #4 : nombre d'arguments obligatoires % #5 : utilisation de testopt (1 si oui, 0 si non) % #6 : code de la macro -\def\@xs@newmacro@#1#2#3#4#5{% - \edef\@xs@reserved@A{@xs@\expandafter\@gobble\string#2}% - \edef\@xs@reserved@C{\expandafter\noexpand\csname\@xs@reserved@A @\ifx\@empty#3\@empty @\fi\endcsname}% - \edef\@xs@reserved@B{% - \ifx\@empty\@xs@reserved@D - \def\noexpand#2{\noexpand\@ifstar - {\let\noexpand\@xs@assign\noexpand\@xs@expand@and@detokenize\expandafter\noexpand\@xs@reserved@C}% - {\let\noexpand\@xs@assign\noexpand\@xs@expand@and@assign\expandafter\noexpand\@xs@reserved@C}% +\def\xs_newmacro_#1#2#3#4#5{% + \edef\xs_reserved_A{xs_\expandafter\xs_gobarg\string#2}% + \edef\xs_reserved_C{\expandafter\noexpand\csname\xs_reserved_A _\ifx\empty#3\empty _\fi\endcsname}% + \edef\xs_reserved_B{% + \long + \ifx\empty\xs_reserved_D + \def\noexpand#2{\noexpand\xs_ifstar + {\let\noexpand\xs_assign\noexpand\xs_expand_and_detokenize\expandafter\noexpand\xs_reserved_C}% + {\let\noexpand\xs_assign\noexpand\xs_expand_and_assign\expandafter\noexpand\xs_reserved_C}% }% \else - \def\noexpand#2{\let\noexpand\@xs@assign\noexpand\@xs@expand@and@assign\expandafter\noexpand\@xs@reserved@C}% + \def\noexpand#2{\let\noexpand\xs_assign\noexpand\xs_expand_and_assign\expandafter\noexpand\xs_reserved_C}% \fi - \ifx\@empty#3\@empty + \ifx\empty#3\empty \else - \def\expandafter\noexpand\@xs@reserved@C{% - \noexpand\@testopt{\expandafter\noexpand\csname\@xs@reserved@A @@\endcsname}{\ifx\@xs@def\@xs@ledef#3\else\unexpanded{#3}\fi}}% + \def\expandafter\noexpand\xs_reserved_C{% + \noexpand\xs_testopt{\expandafter\noexpand\csname\xs_reserved_A __\endcsname}{\ifx\xs_def\xs_ledef#3\else\unexpanded{#3}\fi}}% \fi }% - % Que fait \@xs@reserved@B ? Il d\'efinit : - % si #3 est vide : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@@}} - % si #3 existe : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@}} - % \@xs@NOM@{\@testopt{\@xs@NOM@@}{#3}}} - \long\@xs@reserved@B - \ifx\@empty#3\@empty - \@xs@BuildLines1{#4}{#3}{#1}% - \@xs@DefArg{#4}% + % Que fait \xs_reserved_B ? Il définit : + % si #3 est vide : \NOM{\xs_ifstar{\let\xs_assign\xs_expand_and_detokenize\xs_NOM__}{\let\xs_assign\xs_expand_and_assign\xs_NOM__}} + % si #3 existe : \NOM{\xs_ifstar{\let\xs_assign\xs_expand_and_detokenize\xs_NOM_}{\let\xs_assign\xs_expand_and_assign\xs_NOM_}} + % \xs_NOM_{\xs_testopt{\xs_NOM__}{#3}}} + \xs_reserved_B + \ifx\empty#3\empty + \xs_buildlines1{#4}{#3}{#1}% + \xs_assign_args{#4}% \else - \expandafter\@xs@BuildLines\expandafter1\expandafter{\number\numexpr#4+1}{#3}{#1}% - \@xs@DefArg@{#4}% + \xs_exparg{\xs_buildlines1}{\number\numexpr#4+1}{#3}{#1}% + \xs_assign_opt_args{#4}% \fi - \edef\@xs@reserved@B{\def\expandafter\noexpand\csname\@xs@reserved@A @@\endcsname\@xs@myarg}% - \edef\@xs@reserved@C{\unexpanded\expandafter{\@xs@newlines}\edef\noexpand\@xs@call}% - \edef\@xs@reserved@D{% - \noexpand\noexpand\expandafter\noexpand\csname\@xs@reserved@A\endcsname\unexpanded\expandafter{\@xs@newargs}% + \edef\xs_reserved_B{\def\expandafter\noexpand\csname\xs_reserved_A __\endcsname\xs_myarg}% + \edef\xs_reserved_C{\unexpanded\expandafter{\xs_newlines}\edef\noexpand\xs_call}% + \edef\xs_reserved_D{\noexpand\noexpand\expandafter\noexpand\csname\xs_reserved_A\endcsname\unexpanded\expandafter{\xs_newargs}}% + \ifnum#5=1 \edef\xs_reserved_D{\noexpand\noexpand\noexpand\xs_testopt{\unexpanded\expandafter{\xs_reserved_D}}{}}\fi + \xs_edefaddtomacro\xs_reserved_C{{\unexpanded\expandafter{\xs_reserved_D}}\noexpand\xs_call}% + \xs_edefaddtomacro\xs_reserved_B{{\unexpanded\expandafter{\xs_reserved_C}}}% + % Que fait \xs_reserved_B ? Il définit par exemple pour 3 arguments obligatoires et 1 facultatif : + % \def\xs_NOM__[##2]##3##4##5{% + % \xs_def\xs_arg_i{##2}\xs_assign\xs_arg_ii{##3}\xs_assign\xs_arg_iii{##4}\xs_asign\xs_arg_iv{##5}% + % si #5=0: \edef\xs_call{\noexpand\xs_NOM[\xs_expand\xs_arg_i]{\xs_expand\xs_arg_ii}{\xs_expand\xs_arg_iii}{\xs_expand\xs_arg_iv}}% + % si #5=1: \edef\xs_call{\noexpand\xs_testopt{\noexpand\xs_NOM[\xs_expand\xs_arg_i]{\xs_expand\xs_arg_i}{\xs_expand\xs_arg_ii}{\xs_expand\xs_arg_iii}{\xs_expand\xs_arg_iv}}{}}% + % \xs_call} + \long\xs_reserved_B + \edef\xs_reserved_B{% + \def\expandafter\noexpand\csname\xs_reserved_A\endcsname + \xs_myarg\ifnum#5=1 [\unexpanded{##}\number\numexpr\ifx\empty#3\empty#4+1\else#4+2\fi]\fi }% - \ifnum#5=\@ne\edef\@xs@reserved@D{\noexpand\noexpand\noexpand\@testopt{\unexpanded\expandafter{\@xs@reserved@D}}{}}\fi - \@xs@edefaddtomacro\@xs@reserved@C{{\unexpanded\expandafter{\@xs@reserved@D}}\noexpand\@xs@call}% - \@xs@edefaddtomacro\@xs@reserved@B{{\unexpanded\expandafter{\@xs@reserved@C}}}% - % Que fait \@xs@reserved@B ? Il d\'efinit par exemple pour 3 arguments obligatoires et 1 facultatif : - % \def\@xs@NOM@@[##2]##3##4##5{% - % \@xs@def\@xs@arg@i{##2}\@xs@assign\@xs@arg@ii{##3}\@xs@assign\@xs@arg@iii{##4}\@xs@asign\@xs@arg@iv{##5}% - % si #5=0: \edef\@xs@call{\noexpand\@xs@NOM[\@xs@expand\@xs@arg@i]{\@xs@expand\@xs@arg@ii}{\@xs@expand\@xs@arg@iii}{\@xs@expand\@xs@arg@iv}}% - % si #5=1: \edef\@xs@call{\noexpand\@testopt{\noexpand\@xs@NOM[\@xs@expand\@xs@arg@i]{\@xs@expand\@xs@arg@i}{\@xs@expand\@xs@arg@ii}{\@xs@expand\@xs@arg@iii}{\@xs@expand\@xs@arg@iv}}{}}% - % \@xs@call} - \long\@xs@reserved@B - \edef\@xs@reserved@B{% - \def\expandafter\noexpand\csname\@xs@reserved@A\endcsname - \@xs@myarg\ifnum#5=\@ne[\unexpanded{##}\number\numexpr\ifx\@empty#3\@empty#4+1\else#4+2\fi]\fi - }% - % Que fait \@xs@reserved@B ? Il d\'efinit par exemple pour 3 arguments obligatoires et 1 facultatif : - % \def \@xs@NOM[##2]##3##4##5[##6]{#6} - \long\@xs@reserved@B -} - -% macro g\'en\'erique qui lit \@xs@reserved@C us par us -% 3 sous-routines sont appel\'ees \`a des moments cl\'e : -% \@xs@atendofgroup (un groupe se finit, appel r\'ecursif) -% \@xs@atbegingroup (un groupe vient d'être ouvert) -% \@xs@atnextsyntaxunit (la future US n'est pas un groupe) -\def\@xs@read@reserved@C{% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\ifnum\@xs@nestlevel=\z@ - \let\@xs@next\relax - \else - \let\@xs@next\@xs@atendofgroup - \fi + % Que fait \xs_reserved_B ? Il définit par exemple pour 3 arguments obligatoires et 1 facultatif : + % \def \xs_NOM[##2]##3##4##5[##6]{#6} + \long\xs_reserved_B +} + +% macro générique qui lit \xs_reserved_C us par us +% 3 sous-routines sont appelées à des moments clé : +% \xs_atendofgroup (un groupe se finit, appel récursif) +% \xs_atbegingroup (un groupe vient d'être ouvert) +% \xs_atnextsyntaxunit (la future US n'est pas un groupe) +\def\xs_read_reserved_C{% + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\xs_ifnum{\xs_nestlevel=0 } + {} + {\xs_atendofgroup + \xs_read_reserved_C + }% } - {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C - \let\@xs@next\@xs@read@reserved@C - \@xs@exploregroups - \ifx\bgroup\@xs@toks - \advance\integerpart\@ne + {\xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_C}\xs_reserved_A + \xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_C}\xs_reserved_C + \xs_exploregroups + \xs_ifx{\bgroup\xs_toks} + {\advance\integerpart1 \begingroup - \expandafter\def\expandafter\@xs@reserved@C\@xs@reserved@A - \@xs@manage@groupID - \let\@xs@nestlevel\@ne - \integerpart\z@ - \@xs@atbegingroup - \else - \global\advance\decimalpart\@ne - \@xs@atnextsyntaxunit - \fi + \expandafter\def\expandafter\xs_reserved_C\xs_reserved_A + \xs_calc_grouIP + \def\xs_nestlevel{1}% + \integerpart0 + \xs_atbegingroup + } + {\advance\decimalpart1 + \xs_atnextsyntaxunit + }% + \xs_read_reserved_C }% - \@xs@next } -% macro g\'en\'erique qui lit \@xs@reserved@D en proc\'edant \`a des tests avec \IfBeginWith -% 2 sous-routines sont appel\'ees \`a des moments cl\'e : -% \@xs@atendofgroup (un groupe se finit, appel r\'ecursif) -% \@xs@atoccurfound (une occurrence a \'et\'e trouv\'ee) -\def\@xs@read@reserved@D{% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@D}% - {\ifnum\@xs@nestlevel=\z@ - \let\@xs@next\relax - \else - \let\@xs@next\@xs@atendofgroup - \fi +% macro générique qui lit \xs_reserved_D en procédant à des tests avec \IfBeginWith +% 1 sous-routine est appelée : +% \xs_atoccurfound (une occurrence a été trouvée) +\def\xs_read_reserved_D{% + \xs_exparg\xs_ifempty{\xs_reserved_D}% + {\xs_ifnum{\xs_nestlevel=0 } + {} + {\edef\__temp{% + \endgroup + \noexpand\decimalpart=\number\decimalpart\relax + \unexpanded{\xs_addtomacro\xs_reserved_C}{{\unexpanded\expandafter{\xs_reserved_C}}}% + }% + \__temp + \xs_read_reserved_D + }% }% - {\expandafter\expandafter\expandafter\@xs@IfBeginWith@i\expandafter\expandafter\expandafter - {\expandafter\@xs@reserved@D\expandafter}\expandafter{\@xs@reserved@E}% - {\global\advance\decimalpart\@ne - \let\@xs@reserved@D\@xs@reserved@A - \@xs@atoccurfound + {\xs_exptwoargs\xs_IfBeginWith_i\xs_reserved_D\xs_reserved_E + {\advance\decimalpart1 + \let\xs_reserved_D\xs_reserved_A + \xs_atoccurfound }% - {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@A - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@D - \let\@xs@next\@xs@read@reserved@D - \@xs@exploregroups - \ifx\bgroup\@xs@toks - \advance\integerpart\@ne + {\xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_D}\xs_reserved_A + \xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_D}\xs_reserved_D + \xs_exploregroups + \xs_ifx{\bgroup\xs_toks} + {\advance\integerpart1 \begingroup - \expandafter\def\expandafter\@xs@reserved@D\@xs@reserved@A - \@xs@manage@groupID - \let\@xs@reserved@C\@empty - \let\@xs@nestlevel\@ne - \integerpart\z@ - \else - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@A}% - \fi + \expandafter\def\expandafter\xs_reserved_D\xs_reserved_A + \xs_calc_grouIP + \let\xs_reserved_C\empty + \def\xs_nestlevel{1}% + \integerpart0 + } + {\xs_eaddtomacro\xs_reserved_C{\xs_reserved_A}% + }% }% + \xs_read_reserved_D }% - \@xs@next } -\@xs@newmacro\StrRemoveBraces{}{1}{1}{% - \def\@xs@reserved@C{#1}% - \let\@xs@reserved@B\@empty - \let\@xs@nestlevel\z@ - \@xs@StrRemoveBraces@i - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#2}% +\xs_newmacro\StrRemoveBraces{}{1}{1}{% + \def\xs_reserved_C{#1}% + \let\xs_reserved_B\empty + \def\xs_nestlevel{0}% + \xs_StrRemoveBraces_i + \xs_exparg\xs_assign_xstringresult{\xs_reserved_B}{#2}% } -\def\@xs@StrRemoveBraces@i{% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\ifnum\@xs@nestlevel=\z@ - \let\@xs@next\relax - \else - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@B}% - \let\@xs@next\@xs@StrRemoveBraces@i - \fi +\def\xs_StrRemoveBraces_i{% + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\xs_ifnum{\xs_nestlevel=0 } + {} + {\xs_endgroup_eaddtomacro\xs_reserved_B\xs_reserved_B + \xs_StrRemoveBraces_i + }% } - {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C - \let\@xs@next\@xs@StrRemoveBraces@i - \ifx\bgroup\@xs@toks - \ifx\@xs@exploregroups\relax% on explore les groupes ? - \begingroup - \expandafter\def\expandafter\@xs@reserved@C\@xs@reserved@A - \let\@xs@nestlevel\@ne - \integerpart\z@ - \let\@xs@reserved@B\@empty - \else - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\@xs@reserved@A - \fi - \else - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@A}% - \fi + {\xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_C}\xs_reserved_A + \xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_C}\xs_reserved_C + \xs_ifx{\bgroup\xs_toks} + {\xs_ifx{\xs_exploregroups\relax}% on explore les groupes ? + {\begingroup + \expandafter\def\expandafter\xs_reserved_C\xs_reserved_A + \def\xs_nestlevel{1}% + \let\xs_reserved_B\empty + } + {\expandafter\xs_addtomacro\expandafter\xs_reserved_B\xs_reserved_A + }% + } + {\xs_eaddtomacro\xs_reserved_B{\xs_reserved_A}% + }% + \xs_StrRemoveBraces_i }% - \@xs@next -} - -% \@xs@cutafteroccur coupe l'argument #1 apr\`es la #3\`eme occurrence de #2 -% \@xs@reserved@C : contient ce qui se trouve avant cette occurrence -% \@xs@reserved@D : contient ce qui se trouve avant cette occurrence y compris cette occurrence -% \@xs@reserved@E : contient ce qui se trouve apr\`es l'occurrence -% si l'occurrence n'existe pas ou qu'un des arguments est vide, toutes les chaines renvoy\'ees sont vides -\long\def\@xs@cutafteroccur#1#2#3{% - \ifnum#3<\@ne\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi - {\let\@xs@reserved@C\@empty - \let\@xs@reserved@E\@empty - \global\let\groupID\@empty - } - {\@xs@cutafteroccur@i{#1}{#2}{#3}}% +} + +% \xs_cutafteroccur coupe l'argument #1 après la #3ème occurrence de #2 +% \xs_reserved_C : contient ce qui se trouve avant cette occurrence +% \xs_reserved_D : contient ce qui se trouve avant cette occurrence y compris cette occurrence +% \xs_reserved_E : contient ce qui se trouve après l'occurrence +% si l'occurrence n'existe pas ou qu'un des arguments est vide, toutes les chaines renvoyées sont vides +\long\def\xs_cutafteroccur#1#2#3{% + \xs_ifnum{#3<1 } + {\let\xs_reserved_C\empty\let\xs_reserved_E\empty\gdef\groupID{}} + {\xs_cutafteroccur_i{#1}{#2}{#3}}% } -\long\def\@xs@cutafteroccur@i#1#2#3{% - \def\@xs@reserved@D{#1}\let\@xs@reserved@C\@empty\def\@xs@reserved@E{#2}% - \decimalpart\z@ - \integerpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}% - \@xs@read@reserved@D}% - \def\@xs@atoccurfound{% - \ifnum\decimalpart=\numexpr(#3)\relax - \global\let\@xs@reserved@D\@xs@reserved@D - \global\let\@xs@reserved@C\@xs@reserved@C - \@xs@exitallgroups - \let\@xs@next\relax - \else - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@E}% - \let\@xs@next\@xs@read@reserved@D - \fi}% - \@xs@read@reserved@D - \def\@xs@argument@A{#2}% - \ifnum\decimalpart=\numexpr(#3)\relax % occurrence trouv\'ee ? - \let\@xs@reserved@E\@xs@reserved@D - \expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\@xs@reserved@D\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\@xs@argument@A}% - \else - \let\@xs@reserved@C\@empty - \let\@xs@reserved@E\@empty - \global\let\groupID\@empty - \fi +\long\def\xs_cutafteroccur_i#1#2#3{% + \def\xs_reserved_D{#1}\let\xs_reserved_C\empty\def\xs_reserved_E{#2}% + \decimalpart0 \integerpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atoccurfound{% + \xs_ifnum{\decimalpart=\numexpr(#3)\relax} + {\edef\__temp{% + \def\noexpand\xs_reserved_C{\unexpanded\expandafter{\xs_reserved_C}}% + \def\noexpand\xs_reserved_D{\unexpanded\expandafter{\xs_reserved_D}}% + \noexpand\decimalpart=\number\decimalpart\relax + }% + \expandafter\xs_exitallgroups\__temp + \xs_gobarg% mange l'appel récursif \xs_read_reserved_D dans \xs_read_reserved_D + } + {\xs_eaddtomacro\xs_reserved_C{\xs_reserved_E}% + }% + }% + \xs_read_reserved_D + \xs_ifnum{\decimalpart=\numexpr(#3)\relax}% occurrence trouvée ? + {\let\xs_reserved_E\xs_reserved_D + \xs_exparg{\def\xs_reserved_D}{\xs_reserved_C#2}% + } + {\let\xs_reserved_C\empty + \let\xs_reserved_E\empty + \gdef\groupID{}% + }% } -\@xs@newmacro*3\IfSubStr{1}{2}{0}{% - \def\@xs@argument@A{#2}\def\@xs@argument@B{#3}% - \expandafter\expandafter\expandafter\@xs@cutafteroccur - \expandafter\expandafter\expandafter{\expandafter\@xs@argument@A\expandafter}\expandafter{\@xs@argument@B}{#1}% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@D}% - \@secondoftwo - \@firstoftwo +\xs_newmacro*3\IfSubStr{1}{2}{0}{% + \xs_cutafteroccur{#2}{#3}{#1}% + \xs_exparg\xs_ifempty{\xs_reserved_D}\xs_execsecond\xs_execfirst } -\@xs@newmacro*2\IfBeginWith{}{2}{0}{% - \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}% - \expandafter\@xs@ifempty\expandafter{\@xs@argument@B}% - {\let\@xs@next\@secondoftwo - } - {\def\@xs@next{% - \expandafter\expandafter\expandafter\@xs@IfBeginWith@i\expandafter\expandafter\expandafter - {\expandafter\@xs@argument@A\expandafter}\expandafter - {\@xs@argument@B}}% - }% - \@xs@next +\xs_newmacro*2\IfBeginWith{}{2}{0}{% + \xs_ifempty{#2}% + {\xs_execsecond} + {\xs_IfBeginWith_i{#1}{#2}}% } -\long\def\@xs@IfBeginWith@i#1#2{% - \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}% - \expandafter\@xs@ifempty\expandafter{\@xs@argument@B}% - {\let\@xs@next\@firstoftwo% #2 est vide, tous les tests sont pass\'es avec succ\`es : on renvoie #3 +\long\def\xs_IfBeginWith_i#1#2{% + \xs_ifempty{#2}% + {\xs_execfirst% #2 est vide, tous les tests sont passés avec succès : on renvoie #3 } - {\expandafter\@xs@ifempty\expandafter{\@xs@argument@A}% - {\let\@xs@next\@secondoftwo% #1 est vide, c'est que #2 est + long que #1 : on renvoie #4 + {\xs_ifempty{#1}% + {\xs_execsecond% #1 est vide, c'est que #2 est + long que #1 : on renvoie #4 } - {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@argument@B}\@xs@reserved@B - \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A - \ifx\@xs@reserved@A\@xs@reserved@B% il y a \'egalit\'e... - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@B}\@xs@reserved@B - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A% on enl\`eve les 1ere unit\'es syntaxiques - \def\@xs@next{% et on recommence avec ces arguments racourcis d'1 unit\'e syntaxique - \expandafter\expandafter\expandafter\@xs@IfBeginWith@i - \expandafter\expandafter\expandafter{\expandafter\@xs@reserved@A\expandafter}\expandafter{\@xs@reserved@B}}% - \else - \let\@xs@next\@secondoftwo - \fi + {\xs_returnfirstsyntaxunit{#2}\xs_reserved_B + \xs_returnfirstsyntaxunit{#1}\xs_reserved_A + \xs_ifx{\xs_reserved_A\xs_reserved_B}% il y a égalité... + {\xs_removefirstsyntaxunit{#2}\xs_reserved_B + \xs_removefirstsyntaxunit{#1}\xs_reserved_A% on enlève les 1ere unités syntaxiques + \xs_exptwoargs\xs_IfBeginWith_i\xs_reserved_A\xs_reserved_B + } + {\xs_execsecond + }% }% }% - \@xs@next } -\@xs@newmacro*2\IfEndWith{}{2}{0}{% - \def\@xs@argument@A{#1}\def\@xs@argument@B{#2}% - \@xs@ifempty{#2}% - {\let\@xs@reserved@A\@secondoftwo +\xs_newmacro*2\IfEndWith{}{2}{0}{% + \xs_ifempty{#2}% + {\xs_execsecond } - {\expandafter\expandafter\expandafter\@xs@StrCount - \expandafter\expandafter\expandafter{\expandafter\@xs@argument@A\expandafter}\expandafter - {\@xs@argument@B}[\@xs@reserved@A]% - \ifnum\@xs@reserved@A=\z@ - \let\@xs@reserved@A\@secondoftwo - \else - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\let\@xs@reserved@A\@firstoftwo} - {\let\@xs@reserved@A\@secondoftwo}% - \fi + {\xs_StrCount{#1}{#2}[\xs_reserved_A]% + \xs_ifnum{\xs_reserved_A=0 } + {\xs_execsecond} + {\xs_exparg\xs_ifempty{\xs_reserved_C}}% }% - \@xs@reserved@A } -\@xs@newmacro*4\IfSubStrBefore{1,1}{3}{0}{\@xs@IfSubStrBefore@i[#1]{#2}{#3}{#4}} +\xs_newmacro*4\IfSubStrBefore{1,1}{3}{0}{\xs_IfSubStrBefore_i[#1]{#2}{#3}{#4}} -\def\@xs@IfSubStrBefore@i[#1,#2]#3#4#5{% - \def\@xs@reserved@C{#3}% - \ifx\@xs@exploregroups\relax% si on explore les groupes - \let\@xs@reserved@B\@empty - \let\@xs@nestlevel\z@ - \@xs@StrRemoveBraces@i% on retire les accolades - \let\@xs@reserved@C\@xs@reserved@B - \fi - \def\@xs@reserved@A{#5}% - \expandafter\expandafter\expandafter\@xs@cutafteroccur\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@A}{#2}% - \def\@xs@reserved@A{#4}% - \expandafter\expandafter\expandafter\@xs@cutafteroccur\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@A}{#1}% - \global\let\groupID\@empty - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - \@secondoftwo - \@firstoftwo +\def\xs_IfSubStrBefore_i[#1,#2]#3#4#5{% + \def\xs_reserved_C{#3}% + \xs_ifx{\xs_exploregroups\relax}% si on explore les groupes + {\let\xs_reserved_B\empty + \def\xs_nestlevel{0}% + \xs_StrRemoveBraces_i% on retire les accolades + \let\xs_reserved_C\xs_reserved_B + } + {}% + \xs_exparg\xs_cutafteroccur\xs_reserved_C{#5}{#2}% + \xs_exparg\xs_cutafteroccur\xs_reserved_C{#4}{#1}% + \gdef\groupID{}% + \xs_exparg\xs_ifempty{\xs_reserved_C}% + \xs_execsecond + \xs_execfirst } -\@xs@newmacro*4\IfSubStrBehind{1,1}{3}{0}{\@xs@IfSubStrBehind@i[#1]{#2}{#3}{#4}} - -\long\def\@xs@IfSubStrBehind@i[#1,#2]#3#4#5{\@xs@IfSubStrBefore@i[#2,#1]{#3}{#5}{#4}} +\xs_newmacro*4\IfSubStrBehind{1,1}{3}{0}{\xs_IfSubStrBehind_i[#1]{#2}{#3}{#4}} +\long\def\xs_IfSubStrBehind_i[#1,#2]#3#4#5{\xs_IfSubStrBefore_i[#2,#1]{#3}{#5}{#4}} -\long\def\@xs@formatnumber#1#2{% - \def\@xs@argument@A{#1}% - \@xs@ifempty{#1}% +\long\def\xs_formatnumber#1#2{% + \xs_ifempty{#1}% {\def#2{0X}% si vide, renvoie 0X } - {\@xs@returnfirstsyntaxunit{#1}\@xs@reserved@A - \def\@xs@reserved@B{+}% - \ifx\@xs@reserved@A\@xs@reserved@B - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@C - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\def#2{+0X}} - {\expandafter\def\expandafter#2\expandafter{\expandafter+\expandafter0\@xs@reserved@C}}% - \else - \def\@xs@reserved@B{-}% - \ifx\@xs@reserved@A\@xs@reserved@B - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@argument@A}\@xs@reserved@A - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@A}% + {\xs_returnfirstsyntaxunit{#1}\xs_reserved_A + \def\xs_reserved_B{+}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\xs_removefirstsyntaxunit{#1}\xs_reserved_C + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\def#2{+0X}} + {\xs_exparg{\def#2}{\expandafter+\expandafter0\xs_reserved_C}}% + } + {\def\xs_reserved_B{-}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\xs_removefirstsyntaxunit{#1}\xs_reserved_A + \xs_exparg\xs_ifempty{\xs_reserved_A}% {\def#2{-0X}}% - {\expandafter\def\expandafter#2\expandafter{\expandafter-\expandafter0\@xs@reserved@A}}% - \else - \expandafter\def\expandafter#2\expandafter{\expandafter0\@xs@argument@A}% - \fi - \fi + {\xs_exparg{\def#2}{\expandafter-\expandafter0\xs_reserved_A}}% + } + {\def#2{0#1}% + }% + }% }% } -\@xs@newmacro\IfInteger{}{1}{0}{% - \@xs@formatnumber{#1}\@xs@reserved@A - \decimalpart\z@ - \afterassignment\@xs@defafterinteger\integerpart\@xs@reserved@A\relax\@xs@nil - \let\@xs@after@intpart\@xs@afterinteger - \expandafter\@xs@testdot\@xs@afterinteger\@xs@nil - \ifx\@empty\@xs@afterdecimal - \ifnum\decimalpart=\z@ - \let\@xs@next\@firstoftwo% partie décimale constituée de 0 --> seul cas où on renvoie vrai - \else - \let\@xs@afterinteger\@xs@after@intpart - \let\@xs@next\@secondoftwo - \fi - \else - \let\@xs@afterinteger\@xs@after@intpart - \let\@xs@next\@secondoftwo - \fi - \@xs@next +\xs_newmacro\IfInteger{}{1}{0}{% + \xs_formatnumber{#1}\xs_reserved_A + \decimalpart0 + \afterassignment\xs_defafterinteger\integerpart\xs_reserved_A\relax\_nil + \let\xs_after_intpart\afterinteger + \expandafter\xs_testdot\afterinteger\_nil + \xs_ifx{\empty\xs_afterdecimal} + {\xs_ifnum{\decimalpart=0 } + {\xs_execfirst% partie décimale constituée de 0 --> seul cas où on renvoie vrai + } + {\expandafter\xs_defafterinteger\xs_after_intpart\relax\_nil + \xs_execsecond + }% + } + {\expandafter\xs_defafterinteger\xs_after_intpart\relax\_nil + \xs_execsecond + }% } -\@xs@newmacro\IfDecimal{}{1}{0}{% - \@xs@formatnumber{#1}\@xs@reserved@A - \decimalpart\z@ - \afterassignment\@xs@defafterinteger\integerpart\@xs@reserved@A\relax\@xs@nil - \expandafter\@xs@testdot\@xs@afterinteger\@xs@nil - \ifx\@empty\@xs@afterdecimal - \expandafter\@firstoftwo - \else - \expandafter\@secondoftwo - \fi +\xs_newmacro\IfDecimal{}{1}{0}{% + \xs_formatnumber{#1}\xs_reserved_A + \decimalpart0 + \afterassignment\xs_defafterinteger\integerpart\xs_reserved_A\relax\_nil + \expandafter\xs_testdot\afterinteger\_nil + \xs_ifx{\empty\xs_afterdecimal} } -\long\def\@xs@defafterinteger#1\relax\@xs@nil{\def\@xs@afterinteger{#1}} +\begingroup\catcode`\@ 11 +\long\gdef\xs_defafterinteger#1\relax\_nil{\def\@xs@afterinteger{#1}\let\afterinteger\@xs@afterinteger} +\long\gdef\xs_defafterdecimal#1\_nil{\def\@xs@afterdecimal{#1}\let\afterdecimal\@xs@afterinteger} +\endgroup -\def\@xs@testdot{% - \let\xs@decsep\@empty - \@ifnextchar.% - {\def\xs@decsep{.}\@xs@readdecimalpart}% - {\@xs@testcomma}% +\def\xs_testdot{% + \let\xs_decsep\empty + \xs_ifnxttok. + {\def\xs_decsep{.}\xs_readdecimalpart}% + {\xs_testcomma}% } -\def\@xs@testcomma{% - \@ifnextchar,% - {\def\xs@dessep{,}\@xs@readdecimalpart}% - {\@xs@endnumber}% +\def\xs_testcomma{% + \xs_ifnxttok, + {\def\xs_dessep{,}\xs_readdecimalpart}% + {\xs_defafterdecimal}% } -\long\def\@xs@readdecimalpart#1#2\@xs@nil{% - \ifx\@empty#2\@empty - \def\@xs@reserved@A{0X}% - \else - \def\@xs@reserved@A{0#2}% - \fi - \afterassignment\@xs@defafterinteger\decimalpart\@xs@reserved@A\relax\@xs@nil - \expandafter\@xs@endnumber\@xs@afterinteger\@xs@nil +\long\def\xs_readdecimalpart#1#2\_nil{% + \xs_ifempty{#2} + {\def\xs_reserved_A{0X}} + {\def\xs_reserved_A{0#2}}% + \afterassignment\xs_defafterinteger\decimalpart\xs_reserved_A\relax\_nil + \expandafter\xs_defafterdecimal\afterinteger\_nil } -\long\def\@xs@endnumber#1\@xs@nil{\def\@xs@afterdecimal{#1}} - -% test d'\'egalit\'e sur des chaines (et des chaines contenant des nombres) -\long\def\@xs@IfStrEqFalse@i#1#2{\let\@xs@reserved@A\@secondoftwo} -\long\def\@xs@IfStrEqFalse@ii#1#2{% renvoie vrai si les 2 arg sont d\'ecimaux et s'ils sont \'egaux, faux sinon - \@xs@IfDecimal{#1}% - {\@xs@IfDecimal{#2}% +% test d'égalité sur des chaines (et des chaines contenant des nombres) +\long\def\xs_IfStrEqFalse_i#1#2{\let\xs_reserved_A\xs_execsecond} +\long\def\xs_IfStrEqFalse_ii#1#2{% renvoie vrai si les 2 arg sont décimaux et s'ils sont égaux, faux sinon + \xs_IfDecimal{#1}% + {\xs_IfDecimal{#2}% {\ifdim#1pt=#2pt - \let\@xs@reserved@A\@firstoftwo + \let\xs_reserved_A\xs_execfirst \else - \let\@xs@reserved@A\@secondoftwo - \fi% les 2 sont d\'ecimaux : on fait le test + \let\xs_reserved_A\xs_execsecond + \fi% les 2 sont décimaux : on fait le test }% - {\let\@xs@reserved@A\@secondoftwo}% un seul est d\'ecimal + {\let\xs_reserved_A\xs_execsecond}% un seul est décimal }% - {\let\@xs@reserved@A\@secondoftwo}% #1 n'est pas d\'ecimal + {\let\xs_reserved_A\xs_execsecond}% #1 n'est pas décimal } -\long\def\@xs@TestEqual#1#2{% teste si les 2 arguments sont \'egaux - \def\@xs@reserved@A{#1}\def\@xs@reserved@B{#2}% - \ifx\@xs@reserved@A\@xs@reserved@B - \let\@xs@reserved@A\@firstoftwo% \'egalit\'e parfaite des 2 chaines - \else - \expandafter\expandafter\expandafter\@xs@reserved@D\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@A\expandafter}\expandafter{\@xs@reserved@B}% - \fi - \@xs@reserved@A +\long\def\xs_TestEqual#1#2{% teste si les 2 arguments sont égaux + \def\xs_reserved_A{#1}\def\xs_reserved_B{#2}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\let\xs_reserved_A\xs_execfirst}% égalité parfaite des 2 chaines + {\xs_reserved_D{#1}{#2}}% + \xs_reserved_A } -\@xs@newmacro*2\IfStrEq{}{2}{0}{% teste si les deux chaines sont \'egales - \let\@xs@reserved@D\@xs@IfStrEqFalse@i - \@xs@TestEqual{#1}{#2}% +\xs_newmacro*2\IfStrEq{}{2}{0}{% teste si les deux chaines sont égales + \let\xs_reserved_D\xs_IfStrEqFalse_i + \xs_TestEqual{#1}{#2}% } -\@xs@newmacro*2\IfEq{}{2}{0}{% teste si les 2 arguments (chaine ou nombre) sont \'egaux - \let\@xs@reserved@D\@xs@IfStrEqFalse@ii - \@xs@TestEqual{#1}{#2}% +\xs_newmacro*2\IfEq{}{2}{0}{% teste si les 2 arguments (chaine ou nombre) sont égaux + \let\xs_reserved_D\xs_IfStrEqFalse_ii + \xs_TestEqual{#1}{#2}% } \def\IfStrEqCase{% - \@ifstar - {\def\@xs@reserved@E{\IfStrEq*}\@xs@IfStrCase}% - {\def\@xs@reserved@E{\IfStrEq}\@xs@IfStrCase}% + \xs_ifstar + {\def\xs_reserved_E{\IfStrEq*}\xs_IfStrCase}% + {\def\xs_reserved_E{\IfStrEq}\xs_IfStrCase}% } -\long\def\@xs@IfStrCase#1#2{\@testopt{\@xs@IfStringCase{#1}{#2}}{}} +\long\def\xs_IfStrCase#1#2{\xs_testopt{\xs_IfStringCase{#1}{#2}}{}} \def\IfEqCase{% - \@ifstar - {\def\@xs@reserved@E{\IfEq*}\@xs@IfEqCase}% - {\def\@xs@reserved@E{\IfEq}\@xs@IfEqCase}% + \xs_ifstar + {\def\xs_reserved_E{\IfEq*}\xs_IfEqCase}% + {\def\xs_reserved_E{\IfEq}\xs_IfEqCase}% } -\long\def\@xs@IfEqCase#1#2{\@testopt{\@xs@IfStringCase{#1}{#2}}{}} +\long\def\xs_IfEqCase#1#2{\xs_testopt{\xs_IfStringCase{#1}{#2}}{}} -\long\def\@xs@IfStringCase#1#2[#3]{% - \long\def\@xs@testcase##1##2##3\@xs@nil{% lit les 2 premieres unit\'es syntaxiques dans ##1 et ##2. Les autres dans ##3 - \@xs@reserved@E{#1}{##1}% - {##2}% le test est positif, on ex\'ecute le code correspondant - {\@xs@ifempty{##3}% - {#3}% s'il n'y a plus de cas, on ex\'ecute le code <autres cas> - {\@xs@testcase##3\@xs@nil}% sinon, on recommence avec ce qui reste - }% +\long\def\xs_IfStringCase#1#2[#3]{% + \long\def\xs_testcase##1##2##3\_nil{% lit les 2 premieres unités syntaxiques dans ##1 et ##2. Les autres dans ##3 + \xs_reserved_E{#1}{##1}% + {##2}% le test est positif, on exécute le code correspondant + {\xs_ifempty{##3}% + {#3}% s'il n'y a plus de cas, on exécute le code <autres cas> + {\xs_testcase##3\_nil}% sinon, on recommence avec ce qui reste + }% }% - \@xs@testcase#2\@xs@nil + \xs_testcase#2\_nil } -% Renvoie ce qui est \`a gauche de l'occurence n°#1 de la sous chaine #3 dans la chaine #2 -\@xs@newmacro*3\StrBefore{1}{2}{1}{% - \@xs@cutafteroccur{#2}{#3}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#4}% +% Renvoie ce qui est à gauche de l'occurence n°#1 de la sous chaine #3 dans la chaine #2 +\xs_newmacro*3\StrBefore{1}{2}{1}{% + \xs_cutafteroccur{#2}{#3}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_C}{#4}% } -% Renvoie ce qui est \`a droite de l'occurence n°#1 de la sous chaine #3 dans la chaine #2 -\@xs@newmacro*3\StrBehind{1}{2}{1}{% - \@xs@cutafteroccur{#2}{#3}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@E}{#4}% +% Renvoie ce qui est à droite de l'occurence n°#1 de la sous chaine #3 dans la chaine #2 +\xs_newmacro*3\StrBehind{1}{2}{1}{% + \xs_cutafteroccur{#2}{#3}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_E}{#4}% } -% Renvoie ce qui est strictement compris entre les occurrences n°#1 et n°#2 +% Renvoie ce qui est strictement compris entre les occurrences n°#1 et n°#2 % des chaines #4 et #5 dans la chaine #3 -\@xs@newmacro*4\StrBetween{1,1}{3}{1}{\@xs@StrBetween@i[#1]{#2}{#3}{#4}[#5]} - -\long\def\@xs@StrBetween@i[#1,#2]#3#4#5[#6]{% +\xs_newmacro*4\StrBetween{1,1}{3}{1}{\xs_StrBetween_i[#1]{#2}{#3}{#4}[#5]} +\long\def\xs_StrBetween_i[#1,#2]#3#4#5[#6]{% \begingroup \noexploregroups - \@xs@cutafteroccur{#3}{#5}{#2}% - \expandafter\@xs@cutafteroccur\expandafter{\@xs@reserved@C}{#4}{#1}% + \xs_cutafteroccur{#3}{#5}{#2}% + \xs_exparg\xs_cutafteroccur{\xs_reserved_C}{#4}{#1}% \expandafter \endgroup - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@E}{#6}% - \global\let\groupID\@empty + \expandafter\xs_assign_xstringresult\expandafter{\xs_reserved_E}{#6}% + \gdef\groupID{}% } -\def\exploregroups{\let\@xs@exploregroups\relax} - -\def\noexploregroups{\def\@xs@exploregroups{\let\@xs@toks0\relax}} - -\def\saveexploremode{\let\@xs@saveexploremode\@xs@exploregroups} +\def\exploregroups{\let\xs_exploregroups\relax} +\def\noexploregroups{\def\xs_exploregroups{\let\xs_toks\relax}} +\def\saveexploremode{\let\xs_saveexploremode\xs_exploregroups} +\def\restoreexploremode{\let\xs_exploregroups\xs_saveexploremode} -\def\restoreexploremode{\let\@xs@exploregroups\@xs@saveexploremode} - -% Remplace les #1 premi\`eres occurences de la chaine #3 +% Remplace les #1 premières occurences de la chaine #3 % par la chaine #4 dans la chaine #2 -\@xs@newmacro\StrSubstitute{0}{3}{1}{% - \def\@xs@reserved@D{#2}\let\@xs@reserved@C\@empty\def\@xs@reserved@E{#3}% - \def\@xs@argument@C{#3}\def\@xs@argument@D{#4}% - \decimalpart\z@ - \integerpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}% - \@xs@read@reserved@D - }% - \def\@xs@atoccurfound{% - \ifnum#1<\@ne - \let\@xs@reserved@A\@xs@argument@D - \else - \ifnum\decimalpart>#1 - \let\@xs@reserved@A\@xs@argument@C - \else - \let\@xs@reserved@A\@xs@argument@D - \fi - \fi - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@A}% - \@xs@read@reserved@D +\xs_newmacro\StrSubstitute{0}{3}{1}{% + \def\xs_reserved_D{#2}\let\xs_reserved_C\empty\def\xs_reserved_E{#3}% + \decimalpart0 \integerpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atoccurfound{% + \xs_ifnum{#1<1 } + {\def\xs_reserved_A{#4}} + {\xs_ifnum{\decimalpart>#1 } + {\def\xs_reserved_A{#3}} + {\def\xs_reserved_A{#4}}% + }% + \xs_eaddtomacro\xs_reserved_C{\xs_reserved_A}% }% - \@xs@ifempty{#3}% - {\expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@D}{#5}% + \xs_ifempty{#3}% + {\xs_exparg\xs_assign_xstringresult{\xs_reserved_D}{#5}% } - {\@xs@read@reserved@D - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#5}% + {\xs_read_reserved_D + \xs_exparg\xs_assign_xstringresult{\xs_reserved_C}{#5}% }% } -% Supprime les #1 premi\`eres occurrences de #3 dans #2 -\@xs@newmacro\StrDel{0}{2}{1}{\@xs@StrSubstitute[#1]{#2}{#3}{}[#4]} +% Supprime les #1 premières occurrences de #3 dans #2 +\xs_newmacro\StrDel{0}{2}{1}{\xs_StrSubstitute[#1]{#2}{#3}{}[#4]} -\def\@xs@exitallgroups{\ifnum\@xs@nestlevel>\z@\endgroup\expandafter\@xs@exitallgroups\fi} +\def\xs_exitallgroups{\ifnum\xs_nestlevel>0 \endgroup\expandafter\xs_exitallgroups\fi} -% Compte combien d'unit\'es syntaxiques contient la chaine #1 ? -\@xs@newmacro\StrLen{}{1}{1}{% - \def\@xs@reserved@C{#1}% - \decimalpart\z@ - \let\@xs@nestlevel\z@ - \gdef\groupID{0}% - \let\@xs@atbegingroup\relax - \def\@xs@atendofgroup{\endgroup\@xs@read@reserved@C}% - \let\@xs@atnextsyntaxunit\relax - \@xs@read@reserved@C - \expandafter\@xs@ReturnResult\expandafter{\number\decimalpart}{#2}% +% Compte combien d'unités syntaxiques contient la chaine #1 ? +\xs_newmacro\StrLen{}{1}{1}{% + \def\xs_reserved_C{#1}\decimalpart0 \def\xs_nestlevel{0}\gdef\groupID{0}% + \let\xs_atbegingroup\relax + \def\xs_atendofgroup{\expandafter\endgroup\expandafter\decimalpart\number\decimalpart\relax}% + \let\xs_atnextsyntaxunit\relax + \xs_read_reserved_C + \xs_exparg\xs_assign_xstringresult{\number\decimalpart}{#2}% } -% Macro interne fermant autant de groupes que n\'ecessaire pour trouver une unit\'e syntaxique derri\`ere -\def\@xs@continuetonext{% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\ifnum\@xs@nestlevel>\z@ - \expandafter\endgroup\expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}% on concat\`ene - \expandafter\expandafter\expandafter\@xs@continuetonext% on recommence +% Macro interne fermant autant de groupes que nécessaire pour trouver une unité syntaxique derrière +\def\xs_continuetonext{% + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\ifnum\xs_nestlevel>0 + \xs_endgroup_eaddtomacro\xs_reserved_B{\expandafter{\xs_reserved_B}}% on concatène + \expandafter\xs_continuetonext% on recommence \fi} - \relax + {}% }% -\def\@xs@manage@groupID{% - \begingroup\def\@xs@reserved@A{0}% - \ifx\@xs@reserved@A\groupID% si on arrive du groupe de niveau 0 - \endgroup - \xdef\groupID{\number\integerpart}% on met simplement le niveau - \else - \endgroup - \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\groupID\expandafter\expandafter\expandafter{\expandafter\groupID\expandafter,\number\integerpart}% - \fi +\def\xs_calc_grouIP{% + \begingroup\def\xs_reserved_A{0}% + \xs_ifx{\xs_reserved_A\groupID}% si on arrive du groupe de niveau 0 + {\endgroup\xdef\groupID{\number\integerpart}}% on met simplement le niveau + {\endgroup\xs_eearg{\gdef\groupID}{\expandafter\groupID\expandafter,\number\integerpart}}% } -% Cette macro coupe la chaine #1 apr\`es l'unit\'e syntaxique n°#2 +% Cette macro coupe la chaine #1 après l'unité syntaxique n°#2 \def\StrSplit{% - \@ifstar - {\let\@xs@reserved@E\@xs@continuetonext\StrSpl@t}% - {\let\@xs@reserved@E\relax\StrSpl@t}% -} - -\@xs@newmacro\StrSpl@t{}{2}{0}{\@xs@StrSplit@i{#2}{#1}\@xs@StrSplit@ii} - -% Cette macro interne coupe la chaine #2 apr\`es l'unit\'e syntaxique n°#1 -% Le d\'ebut est assign\'e dans \@xs@reserved@B et la fin dans \@xs@reserved@C -\long\def\@xs@StrSplit@i#1#2{% - \def\@xs@reserved@D{#1}% - \def\@xs@reserved@C{#2}% - \let\@xs@reserved@B\@empty - \global\let\groupID\@empty - \ifnum#1>\z@ - \decimalpart\z@ - \integerpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}% - \@xs@read@reserved@C + \xs_ifstar + {\let\xs_reserved_E\xs_continuetonext\StrSplit_i}% + {\let\xs_reserved_E\relax\StrSplit_i}% +} + +\xs_newmacro\StrSplit_i{}{2}{0}{\xs_StrSplit_ii{#2}{#1}\xs_StrSplit_iii} + +% Cette macro interne coupe la chaine #2 après l'unité syntaxique n°#1 +% Le début est assigné dans \xs_reserved_B et la fin dans \xs_reserved_C +\long\def\xs_StrSplit_ii#1#2{% + \let\xs_reserved_B\empty\def\xs_reserved_C{#2}\def\xs_reserved_D{#1}\gdef\groupID{}% + \ifnum#1>0 + \decimalpart0 \integerpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atendofgroup{% + \edef\__temp{% + \endgroup + \noexpand\decimalpart=\number\decimalpart\relax + \unexpanded{\xs_addtomacro\xs_reserved_B}{{\unexpanded\expandafter{\xs_reserved_B}}}% + }% + \__temp }% - \def\@xs@atbegingroup{\let\@xs@reserved@B\@empty}% - \def\@xs@atnextsyntaxunit{% - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\@xs@reserved@A}% - \ifnum\decimalpart=\@xs@reserved@D\relax - \ifx\@xs@reserved@C\@empty\@xs@reserved@E\fi - \global\let\@xs@reserved@B\@xs@reserved@B - \global\let\@xs@reserved@C\@xs@reserved@C - \@xs@exitallgroups - \let\@xs@next\relax - \fi + \def\xs_atbegingroup{\let\xs_reserved_B\empty}% + \def\xs_atnextsyntaxunit{% + \xs_eaddtomacro\xs_reserved_B{\xs_reserved_A}% + \xs_ifnum{\decimalpart=\xs_reserved_D\relax} + {\ifx\xs_reserved_C\empty\xs_reserved_E\fi + \edef\__temp{\def\noexpand\xs_reserved_B{\unexpanded\expandafter{\xs_reserved_B}}\def\noexpand\xs_reserved_C{\unexpanded\expandafter{\xs_reserved_C}}}% + \expandafter\xs_exitallgroups\__temp + \xs_gobarg% mange l'appel récursif \xs_read_reserved_C dans \xs_read_reserved_C + } + {}% }% - \@xs@read@reserved@C + \xs_read_reserved_C \fi } -\def\@xs@StrSplit@ii#1#2{\let#1\@xs@reserved@B\let#2\@xs@reserved@C} +\def\xs_StrSplit_iii#1#2{\let#1\xs_reserved_B\let#2\xs_reserved_C} % StrCut[n]{<texte>}{<motif>}\macroA\macroB -% \macroA reçoit ce qui se trouve avant la n ème occurrence <motif> dans <texte> -% \macroB reçoit ce qui est après cette n ème occurrence -\@xs@newmacro*3\StrCut{1}{2}{0}{% - \@xs@ifempty{#3}% - {\global\let\groupID\@empty - \let\@xs@reserved@C\@empty - \let\@xs@reserved@E\@empty +% \macroA reçoit ce qui se trouve avant la n ème occurrence <motif> dans <texte> +% \macroB reçoit ce qui est après cette n ème occurrence +\xs_newmacro*3\StrCut{1}{2}{0}{% + \xs_ifempty{#3}% + {\gdef\groupID{}\let\xs_reserved_C\empty\let\xs_reserved_E\empty } - {\ifnum#1<\@ne\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi - {\@xs@StrCut@ii{#2}{#3}1} - {\@xs@StrCut@ii{#2}{#3}{#1}}% + {\xs_ifnum{#1<1 } + {\xs_StrCut_ii{#2}{#3}1} + {\xs_StrCut_ii{#2}{#3}{#1}}% }% - \@xs@StrCut@iii -} - -\long\def\@xs@StrCut@ii#1#2#3{% - \def\@xs@reserved@D{#1}% - \let\@xs@reserved@C\@empty - \def\@xs@reserved@E{#2}% - \decimalpart\z@\integerpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}% - \@xs@read@reserved@D - }% - \def\@xs@atoccurfound{% - \ifnum\decimalpart=\numexpr(#3)\relax - \global\let\@xs@reserved@D\@xs@reserved@D - \global\let\@xs@reserved@C\@xs@reserved@C - \@xs@exitallgroups - \let\@xs@next\relax - \else - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\@xs@reserved@E}% - \let\@xs@next\@xs@read@reserved@D - \fi + \xs_StrCut_iii +} + +\long\def\xs_StrCut_ii#1#2#3{% + \let\xs_reserved_C\empty\def\xs_reserved_D{#1}\def\xs_reserved_E{#2}% + \decimalpart0 \integerpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atoccurfound{% + \xs_ifnum{\decimalpart=\numexpr(#3)\relax} + {\edef\__temp{% + \def\noexpand\xs_reserved_C{\unexpanded\expandafter{\xs_reserved_C}}% + \def\noexpand\xs_reserved_D{\unexpanded\expandafter{\xs_reserved_D}}% + \noexpand\decimalpart=\number\decimalpart\relax + }% + \expandafter\xs_exitallgroups\__temp + \xs_gobarg% stoppe la récursivité dans \xs_read_reserved_D + } + {\xs_eaddtomacro\xs_reserved_C{\xs_reserved_E}% + }% }% - \@xs@read@reserved@D - \def\@xs@argument@A{#2}% - \let\@xs@reserved@E\@xs@reserved@D - \expandafter\expandafter\expandafter - \def - \expandafter\expandafter\expandafter - \@xs@reserved@D - \expandafter\expandafter\expandafter - {\expandafter\@xs@reserved@C\@xs@argument@A}% + \xs_read_reserved_D + \let\xs_reserved_E\xs_reserved_D + \xs_exparg{\def\xs_reserved_D}{\xs_reserved_C#2}% } -\long\def\@xs@StrCut@iii#1#2{\let#1\@xs@reserved@C\let#2\@xs@reserved@E} +\long\def\xs_StrCut_iii#1#2{\let#1\xs_reserved_C\let#2\xs_reserved_E} % De la chaine #1, renvoie ce qui se trouve entre les positions -% #2 et #3, unit\'es syntaxiques aux positions compris ! -\@xs@newmacro\StrMid{}{3}{1}{% +% #2 et #3, unités syntaxiques aux positions compris ! +\xs_newmacro\StrMid{}{3}{1}{% \begingroup \noexploregroups - \let\@xs@reserved@E\relax - \@xs@StrSplit@i{#3}{#1}% - \edef\@xs@reserved@C{\number\numexpr#2-1}% - \let\@xs@reserved@E\relax - \expandafter\expandafter\expandafter\@xs@StrSplit@i\expandafter\expandafter\expandafter{\expandafter\@xs@reserved@C\expandafter}\expandafter{\@xs@reserved@B}% + \let\xs_reserved_E\relax + \xs_StrSplit_ii{#3}{#1}% + \edef\xs_reserved_C{\number\numexpr#2-1}% + \let\xs_reserved_E\relax + \xs_exptwoargs\xs_StrSplit_ii\xs_reserved_C\xs_reserved_B \expandafter\endgroup - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#4}% - \global\let\groupID\@empty -} - -% supprime #2 unit\'es syntaxiques \`a gauche dans la chaine #1 -\@xs@newmacro\StrGobbleLeft{}{2}{1}{% - \let\@xs@reserved@E\relax - \@xs@StrSplit@i{#2}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#3}% -} - -% extrait de #1 la chaine \`a gauche de longueur #2 -\@xs@newmacro\StrLeft{}{2}{1}{% - \let\@xs@reserved@E\relax - \@xs@StrSplit@i{#2}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}% -} - -% supprime #2 unit\'es syntaxiques \`a droite dans la chaine #1 -\@xs@newmacro\StrGobbleRight{}{2}{1}{% - \@xs@StrLen{#1}[\@xs@reserved@D]% - \let\@xs@reserved@E\relax - \expandafter\@xs@StrSplit@i\expandafter{\number\numexpr\@xs@reserved@D-#2}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}% -} - -% renvoie #2 unit\'es syntaxiques \`a la droite de la chaine #1 -\@xs@newmacro\StrRight{}{2}{1}{% - \@xs@StrLen{#1}[\@xs@reserved@D]% - \let\@xs@reserved@E\relax - \expandafter\@xs@StrSplit@i\expandafter{\number\numexpr\@xs@reserved@D-#2}{#1}% - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@C}{#3}% -} - -\@xs@newmacro\StrChar{}{2}{1}{% - \let\@xs@reserved@B\@empty - \def\@xs@reserved@C{#1}\def\@xs@reserved@D{#2}% - \ifnum#2>\z@ - \def\groupID{0}\let\@xs@nestlevel\z@\integerpart\z@\decimalpart\z@ - \let\@xs@atbegingroup\relax - \def\@xs@atendofgroup{\endgroup\@xs@read@reserved@C}% - \def\@xs@atnextsyntaxunit{% - \ifnum\decimalpart=\@xs@reserved@D% la n i\`eme US est atteinte ? - \global\let\@xs@reserved@B\@xs@reserved@A% on capture l'US en cours qui est celle cherch\'ee - \@xs@exitallgroups - \let\@xs@next\relax + \expandafter\xs_assign_xstringresult\expandafter{\xs_reserved_C}{#4}% + \gdef\groupID{}% +} + +% supprime #2 unités syntaxiques à gauche dans la chaine #1 +\xs_newmacro\StrGobbleLeft{}{2}{1}{% + \let\xs_reserved_E\relax + \xs_StrSplit_ii{#2}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_C}{#3}% +} + +% extrait de #1 la chaine à gauche de longueur #2 +\xs_newmacro\StrLeft{}{2}{1}{% + \let\xs_reserved_E\relax + \xs_StrSplit_ii{#2}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_B}{#3}% +} + +% supprime #2 unités syntaxiques à droite dans la chaine #1 +\xs_newmacro\StrGobbleRight{}{2}{1}{% + \xs_StrLen{#1}[\xs_reserved_D]% + \let\xs_reserved_E\relax + \xs_exparg\xs_StrSplit_ii{\number\numexpr\xs_reserved_D-#2}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_B}{#3}% +} + +% renvoie #2 unités syntaxiques à la droite de la chaine #1 +\xs_newmacro\StrRight{}{2}{1}{% + \xs_StrLen{#1}[\xs_reserved_D]% + \let\xs_reserved_E\relax + \xs_exparg\xs_StrSplit_ii{\number\numexpr\xs_reserved_D-#2}{#1}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_C}{#3}% +} + +\xs_newmacro\StrChar{}{2}{1}{% + \let\xs_reserved_B\empty\def\xs_reserved_C{#1}\def\xs_reserved_D{#2}% + \ifnum#2>0 + \def\groupID{0}\def\xs_nestlevel{0}\integerpart0 \decimalpart0 + \let\xs_atbegingroup\relax + \def\xs_atendofgroup{\expandafter\endgroup\expandafter\decimalpart\number\decimalpart\relax}% + \def\xs_atnextsyntaxunit{% + \ifnum\decimalpart=\xs_reserved_D% la n ième US est atteinte ? + \edef\__temp{\def\noexpand\xs_reserved_B{\unexpanded\expandafter{\xs_reserved_A}}}% on capture l'US en cours qui est celle cherchée + \expandafter\xs_exitallgroups\__temp + \expandafter\xs_gobarg% stoppe la récursivité dans \xs_read_reserved_C \fi }% - \@xs@read@reserved@C + \xs_read_reserved_C \fi - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@B}% - {\global\let\groupID\@empty} - \relax - \expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@B}{#3}% + \xs_exparg\xs_ifempty{\xs_reserved_B}% + {\gdef\groupID{}} + {}% + \xs_exparg\xs_assign_xstringresult{\xs_reserved_B}{#3}% } % Combien de fois compte t-on #2 dans #1 ? -\@xs@newmacro\StrCount{}{2}{1}{% - \def\@xs@reserved@D{#1}\def\@xs@reserved@E{#2}\let\@xs@reserved@C\@empty - \@xs@ifempty{#2}% - {\@xs@ReturnResult{0}{#3}} - {\decimalpart\z@ - \integerpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@C\expandafter{\expandafter{\@xs@reserved@C}}% - \@xs@read@reserved@D - }% - \def\@xs@atoccurfound{\let\@xs@reserved@C\@empty\@xs@read@reserved@D}% - \@xs@read@reserved@D - \expandafter\@xs@ReturnResult\expandafter{\number\decimalpart}{#3}% +\xs_newmacro\StrCount{}{2}{1}{% + \def\xs_reserved_D{#1}\def\xs_reserved_E{#2}\let\xs_reserved_C\empty + \xs_ifempty{#2}% + {\xs_assign_xstringresult{0}{#3}% + } + {\decimalpart0 \integerpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atoccurfound{\let\xs_reserved_C\empty\xs_read_reserved_D}% + \xs_read_reserved_D + \xs_exparg\xs_assign_xstringresult{\number\decimalpart}{#3}% }% } % renvoie la position de l'occurrence #1 de la sous chaine #3 dans la chaine #2 -\@xs@newmacro\StrPosition{1}{2}{1}{% - \@xs@cutafteroccur{#2}{#3}{#1}% - \let\@xs@reserved@E\groupID - \ifx\@xs@reserved@C\@xs@reserved@D - \@xs@ReturnResult{0}{#4}% - \let\@xs@reserved@E\@empty - \else - \expandafter\@xs@StrLen\expandafter{\@xs@reserved@C}[\@xs@reserved@C]% - \expandafter\@xs@ReturnResult\expandafter{\number\numexpr\@xs@reserved@C+1}{#4}% - \fi - \global\let\groupID\@xs@reserved@E +\xs_newmacro\StrPosition{1}{2}{1}{% + \xs_cutafteroccur{#2}{#3}{#1}% + \let\xs_reserved_E\groupID + \xs_ifx{\xs_reserved_C\xs_reserved_D} + {\xs_assign_xstringresult{0}{#4}% + \let\xs_reserved_E\empty + } + {\xs_exparg\xs_StrLen{\xs_reserved_C}[\xs_reserved_C]% + \xs_exparg\xs_assign_xstringresult{\number\numexpr\xs_reserved_C+1}{#4}% + }% + \global\let\groupID\xs_reserved_E } -\def\comparestrict{\let\@xs@comparecoeff\@ne} - -\def\comparenormal{\let\@xs@comparecoeff\z@} - -\def\savecomparemode{\let\@xs@saved@comparecoeff\@xs@comparecoeff} - -\def\restorecomparemode{\let\@xs@comparecoeff\@xs@saved@comparecoeff} +\def\comparestrict{\def\xs_comparecoeff{1}} +\def\comparenormal{\def\xs_comparecoeff{0}} +\def\savecomparemode{\let\xs_saved_comparecoeff\xs_comparecoeff} +\def\restorecomparemode{\let\xs_comparecoeff\xs_saved_comparecoeff} % Compare les deux arguments #1 et #2 -% Renvoie 0 s'ils sont \'egaux et renvoie la -% position de la premiere unit\'e syntaxiques diff\'erente sinon -\@xs@newmacro*2\StrCompare{}{2}{1}{% - \def\@xs@reserved@A{#1}% - \def\@xs@reserved@B{#2}% - \ifx\@xs@reserved@B\@xs@reserved@A - \@xs@ReturnResult{0}{#3}% - \else - \def\@xs@next{\@xs@StrCompare@i{#1}{#2}{#3}}% - \expandafter\@xs@next - \fi -} - -\long\def\@xs@StrCompare@i#1#2#3{% - \def\@xs@StrCompare@iii##1{% - \let\@xs@reserved@A\@empty - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\def\@xs@reserved@A{*\@xs@comparecoeff}}% - {\expandafter\@xs@ifempty\expandafter{\@xs@reserved@D}% - {\def\@xs@reserved@A{*\@xs@comparecoeff}} - \relax +% Renvoie 0 s'ils sont égaux et renvoie la +% position de la premiere unité syntaxiques différente sinon +\xs_newmacro*2\StrCompare{}{2}{1}{% + \def\xs_reserved_A{#1}% + \def\xs_reserved_B{#2}% + \xs_ifx{\xs_reserved_B\xs_reserved_A} + {\xs_assign_xstringresult{0}{#3}} + {\xs_StrCompare_i{#1}{#2}{#3}}% +} + +\long\def\xs_StrCompare_i#1#2#3{% + \def\xs_StrCompare_iii##1{% + \let\xs_reserved_A\empty + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\edef\xs_reserved_A{*\xs_comparecoeff}}% + {\xs_exparg\xs_ifempty{\xs_reserved_D}% + {\edef\xs_reserved_A{*\xs_comparecoeff}} + {}% }% - \def\@xs@next{% - \expandafter\@xs@ReturnResult\expandafter - {\number\numexpr##1\@xs@reserved@A\relax}{#3}% - }% + \def\xs_next{\xs_exparg\xs_assign_xstringresult{\number\numexpr##1\xs_reserved_A\relax}{#3}}% }% - \def\@xs@StrCompare@ii##1{% ##1 est la position - \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@A - \expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@B - \ifx\@xs@reserved@B\@xs@reserved@A - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@A}% - {\@xs@StrCompare@iii{##1}% les 2 unit\'es syntaxiques sont \'egales, on renvoie la position + \def\xs_StrCompare_ii##1{% ##1 est la position + \xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_C}\xs_reserved_A + \xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_D}\xs_reserved_B + \xs_ifx{\xs_reserved_B\xs_reserved_A} + {\xs_exparg\xs_ifempty{\xs_reserved_A}% + {\xs_StrCompare_iii{##1}% les 2 unités syntaxiques sont égales, on renvoie la position } - {\def\@xs@next{\expandafter\@xs@StrCompare@ii\expandafter{\number\numexpr##1+1}}% les 2 unit\'es syntaxiques sont \'egales et non vides, on recommence - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@D}\@xs@reserved@D + {\def\xs_next{\xs_exparg\xs_StrCompare_ii{\number\numexpr##1+1}}% les 2 unités syntaxiques sont égales et non vides, on recommence + \xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_C}\xs_reserved_C + \xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_D}\xs_reserved_D }% - \else% les 2 unit\'es syntaxiques sont diff\'erentes : on renvoie la position - \@xs@StrCompare@iii{##1}% - \fi - \@xs@next + }% les 2 unités syntaxiques sont différentes : on renvoie la position + {\xs_StrCompare_iii{##1}% + }% + \xs_next }% - \def\@xs@reserved@C{#1}\def\@xs@reserved@D{#2}% - \@xs@StrCompare@ii1% + \def\xs_reserved_C{#1}\def\xs_reserved_D{#2}% + \xs_StrCompare_ii1% } -\@xs@newmacro\StrFindGroup{}{2}{1}{% - \def\@xs@reserved@A{#2}\def\@xs@reserved@B{0}% - \ifx\@xs@reserved@A\@xs@reserved@B - \def\@xs@next{\@xs@ReturnResult{{#1}}{#3}}% - \else - \def\@xs@next{\@xs@StrFindGroup@i{#1}{#2}[#3]}% - \fi - \@xs@next +\xs_newmacro\StrFindGroup{}{2}{1}{% + \def\xs_reserved_A{#2}\def\xs_reserved_B{0}% + \xs_ifx{\xs_reserved_A\xs_reserved_B} + {\xs_assign_xstringresult{{#1}}{#3}} + {\xs_StrFindGroup_i{#1}{#2}[#3]}% } -\long\def\@xs@StrFindGroup@i#1#2[#3]{% - \def\@xs@StrFindGroup@ii{% - \expandafter\@xs@ifempty\expandafter{\@xs@reserved@C}% - {\def\@xs@next{\@xs@ReturnResult{}{#3}}% s'il ne reste plus rien, on renvoie vide +\long\def\xs_StrFindGroup_i#1#2[#3]{% + \def\xs_StrFindGroup_ii{% + \xs_exparg\xs_ifempty{\xs_reserved_C}% + {\xs_assign_xstringresult{}{#3}% s'il ne reste plus rien, on renvoie vide } - {\expandafter\@xs@returnfirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@D - \ifx\bgroup\@xs@toks% si la 1\`ere unit\'e syntaxique est un groupe explicite - \advance\decimalpart\@ne% on augmente le compteur - \ifnum\decimalpart=\@xs@reserved@A% on est au groupe cherch\'e lors de la profondeur courante ? - \ifx\@empty\@xs@reserved@B% on est \`a la profondeur maximale ? - \def\@xs@next{\expandafter\@xs@ReturnResult\expandafter{\@xs@reserved@D}{#3}}% on renvoie ce groupe - \else% sinon - \expandafter\def\expandafter\@xs@next\expandafter{\expandafter\@xs@StrFindGroup@i\@xs@reserved@D}% on recommence avec ce groupe - \expandafter\@xs@addtomacro\expandafter\@xs@next\expandafter{\expandafter{\@xs@reserved@B}[#3]}% et les profondeurs de recherche restantes - \fi - \else - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C - \let\@xs@next\@xs@StrFindGroup@ii - \fi - \else - \expandafter\@xs@removefirstsyntaxunit\expandafter{\@xs@reserved@C}\@xs@reserved@C - \let\@xs@next\@xs@StrFindGroup@ii - \fi + {\xs_exparg\xs_returnfirstsyntaxunit{\xs_reserved_C}\xs_reserved_D + \xs_ifx{\bgroup\xs_toks}% si la 1ère unité syntaxique est un groupe explicite + {\advance\decimalpart1 % on augmente le compteur + \xs_ifnum{\decimalpart=\xs_reserved_A\relax}% on est au groupe cherché lors de la profondeur courante ? + {\xs_ifx{\empty\xs_reserved_B}% on est à la profondeur maximale ? + {\xs_exparg\xs_assign_xstringresult{\xs_reserved_D}{#3}}% on renvoie ce groupe + {\xs_exparg{\expandafter\xs_StrFindGroup_i\xs_reserved_D}{\xs_reserved_B}[#3]}% on recommence avec ce groupe et les profondeurs de recherche restantes + } + {\xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_C}\xs_reserved_C + \xs_StrFindGroup_ii + }% + } + {\xs_exparg\xs_removefirstsyntaxunit{\xs_reserved_C}\xs_reserved_C + \xs_StrFindGroup_ii + }% }% - \@xs@next }% - \@xs@extractgroupnumber{#2}\@xs@reserved@A\@xs@reserved@B - \decimalpart\z@ - \ifnum\@xs@reserved@A>\z@\def\@xs@reserved@C{#1}\else\let\@xs@reserved@C\@empty\fi - \@xs@StrFindGroup@ii + \xs_extractgroupnumber{#2}\xs_reserved_A\xs_reserved_B + \decimalpart0 + \xs_ifnum{\xs_reserved_A>0 } + {\def\xs_reserved_C{#1}} + {\let\xs_reserved_C\empty}% + \xs_StrFindGroup_ii } -\def\@xs@extractgroupnumber#1#2#3{% - \def\@xs@extractgroupnumber@i##1,##2\@xs@nil{\def#2{##1}\def#3{##2}}% - \@xs@extractgroupnumber@i#1,\@xs@nil - \ifx\@empty#3\else\@xs@extractgroupnumber@i#1\@xs@nil\fi +\def\xs_extractgroupnumber#1#2#3{% + \def\xs_extractgroupnumber_i##1,##2\_nil{\def#2{##1}\def#3{##2}}% + \xs_extractgroupnumber_i#1,\_nil + \ifx\empty#3\else\xs_extractgroupnumber_i#1\_nil\fi } -\def\expandingroups{\let\@xs@expandingroups\exploregroups} +\def\expandingroups{\let\xs_expandingroups\exploregroups} -\def\noexpandingroups{\let\@xs@expandingroups\noexploregroups} +\def\noexpandingroups{\let\xs_expandingroups\noexploregroups} -\def\StrExpand{\@testopt{\@xs@StrExpand}{1}} -\long\def\@xs@StrExpand[#1]#2#3{% +\def\StrExpand{\xs_testopt{\xs_StrExpand}{1}} +\long\def\xs_StrExpand[#1]#2#3{% \begingroup - \@xs@expandingroups - \ifnum#1>\z@ - \integerpart#1\relax - \decimalpart\z@ - \gdef\groupID{0}% - \let\@xs@nestlevel\z@ - \def\@xs@atendofgroup{% - \expandafter\endgroup - \expandafter\@xs@addtomacro\expandafter\@xs@reserved@B\expandafter{\expandafter{\@xs@reserved@B}}% - \@xs@read@reserved@C - }% - \def\@xs@atbegingroup{\let\@xs@reserved@B\@empty}% - \def\@xs@atnextsyntaxunit{% - \expandafter\expandafter\expandafter\@xs@addtomacro - \expandafter\expandafter\expandafter\@xs@reserved@B - \expandafter\expandafter\expandafter{\@xs@reserved@A}% - }% - \def\@xs@reserved@C{#2}% - \@xs@StrExpand@i{#1}% Appel de la macro r\'ecursive - \else - \def\@xs@reserved@B{#2}% - \fi - \global\let\@xs@reserved@B\@xs@reserved@B + \xs_expandingroups + \xs_ifnum{#1>0 } + {\integerpart#1 \decimalpart0 \gdef\groupID{0}\def\xs_nestlevel{0}% + \def\xs_atendofgroup{\xs_endgroup_eaddtomacro\xs_reserved_B{\expandafter{\xs_reserved_B}}}% + \def\xs_atbegingroup{\let\xs_reserved_B\empty}% + \def\xs_atnextsyntaxunit{\xs_eeaddtomacro\xs_reserved_B{\xs_reserved_A}}% + \def\xs_reserved_C{#2}% + \xs_StrExpand_i{#1}% Appel de la macro récursive + } + {\def\xs_reserved_B{#2}% + } + \expandafter \endgroup - \let#3\@xs@reserved@B - \global\let\groupID\@empty + \expandafter\def\expandafter#3\expandafter{\xs_reserved_B}% + \gdef\groupID{}% } -\long\def\@xs@StrExpand@i#1{% - \ifnum#1>\z@ - \let\@xs@reserved@B\@empty - \@xs@read@reserved@C - \let\@xs@reserved@C\@xs@reserved@B - \def\@xs@reserved@A{\expandafter\@xs@StrExpand@i\expandafter{\number\numexpr#1-1}}% - \else - \let\@xs@reserved@A\relax - \fi - \@xs@reserved@A +\long\def\xs_StrExpand_i#1{% + \xs_ifnum{#1>0 } + {\let\xs_reserved_B\empty + \xs_read_reserved_C + \let\xs_reserved_C\xs_reserved_B + \def\xs_reserved_A{\xs_exparg\xs_StrExpand_i{\number\numexpr#1-1}}% + } + {\let\xs_reserved_A\relax + }% + \xs_reserved_A } -\def\scancs{\@testopt{\@xs@scancs}{1}} -\long\def\@xs@scancs[#1]#2#3{% - \@xs@StrExpand[#1]{#3}{#2}% +\def\scancs{\xs_testopt{\xs_scancs}{1}} +\long\def\xs_scancs[#1]#2#3{% + \xs_StrExpand[#1]{#3}{#2}% \edef#2{\detokenize\expandafter{#2}}% } -% Restaure le code de @ -\catcode`\@=\CurrentAtCatcode\relax +\restorexstringcatcode -% D\'efinit le d\'elimiteur verb -% d\'efinit les diff\'erents modes et les m\'emorise \setverbdelim{|}% \fullexpandarg\saveexpandmode \comparenormal\savecomparemode @@ -1221,169 +1042,174 @@ \endinput % -% Historique +% H I S T O R I Q U E %------------------------------------------------------------------------------ -%% v1.0 4/7/2008 : - Package achev\'e. -% 7/7/2008 : - Package publi\'e sur CTAN. +%% v1.0 4/7/2008 : - Package achevé. +% 7/7/2008 : - Package publié sur CTAN. %------------------------------------------------------------------------------ % v1.1 15/8/2008 -% - Le package ne n\'ecessite plus LaTeX et est d\'esormais utilisable sous +% - Le package ne nécessite plus LaTeX et est désormais utilisable sous % Plain eTeX. % - Ajout des macros \IfInteger et \IfDecimal. -% Pour cette derni\`ere, la partie enti\`ere et la partie d\'ecimale sont -% r\'ecup\'erables dans les compteurs \integerpart et \decimalpart. Ce -% qu'il reste apr\`es qu'un caract\`ere non attendu soit rencontr\'e est -% dispo dans \@xs@remainafterdecimal +% Pour cette dernière, la partie entière et la partie décimale sont +% récupérables dans les compteurs \integerpart et \decimalpart. Ce +% qu'il reste après qu'un caractère non attendu soit rencontré est +% dispo dans \xs_remainafterdecimal % - Correction d'un bug dans \tokenize : -% suppression de l'expansion avec \normalexpandarg pour \'eviter le bug -% avec les lettres accentu\'ees dans l'exemple : \tokenize\aa{\'e\`u} -% - Am\'elioration du code de la plupart des macros. -% - \'Ecriture d'une routine \@xs@newmacro d\'efinissant les macros. -% - Suppression de tous les compteurs grace \`a \numexpr. -% - Nouvelles fonctionnalit\'es internes dans : +% suppression de l'expansion avec \normalexpandarg pour éviter le bug +% avec les lettres accentuées dans l'exemple : \tokenize\aa{éù} +% - Amélioration du code de la plupart des macros. +% - écriture d'une routine \xs_newmacro définissant les macros. +% - Suppression de tous les compteurs grace à \numexpr. +% - Nouvelles fonctionnalités internes dans : % \IfSubStr -% ajout des chaines se trouvant avant et apr\`es l'occurrence test\'ee -% dans les sc \@xs@behind@IfSubStr et \@xs@before@IfSubStr +% ajout des chaines se trouvant avant et après l'occurrence testée +% dans les sc \xs_behind_IfSubStr et \xs_before_IfSubStr % \StrCount -% a) ajout de ce qui se trouve apr\`es la derni\`ere occurrence dans la -% sc \@xs@StrCount@afterlastocccur -% b) la macro ne d\'epend plus d'aucune autre +% a) ajout de ce qui se trouve après la dernière occurrence dans la +% sc \xs_StrCount_afterlastocccur +% b) la macro ne dépend plus d'aucune autre %------------------------------------------------------------------------------ % v1.2 23/8/2008 -% - Am\'elioration du code de \StrMid \StrGobbleLeft, \StrLeft, -% \StrGobbleRight et \StrRight \`a l'aide de la nouvelle macro -% \@xs@StrSplit@i +% - Amélioration du code de \StrMid \StrGobbleLeft, \StrLeft, +% \StrGobbleRight et \StrRight à l'aide de la nouvelle macro +% \xs_StrSplit_i % - Nouveau test \IfStrEq qui compare 2 chaines % - Nouveau test \IfEq qui compare 2 chaines (ou 2 nombres si les 2 chaines % contiennent un nombre) -% - Correction d'un bug dans \@xs@formatnumber. La macro n'envisageait pas le -% cas o\`u son argument \'etait vide ce qui faiasait planter +% - Correction d'un bug dans \xs_formatnumber. La macro n'envisageait pas le +% cas où son argument était vide ce qui faiasait planter % \IfDecimal{}{V}{F} et \IfInteger{}{V}{F} %------------------------------------------------------------------------------ % v1.3 21/9/2008 -% - Am\'elioration du code, mise en place de r\'ecursivit\'es terminales dans -% toutes les macros r\'ecursives, simplification de \@xs@TestEqual en +% - Amélioration du code, mise en place de récursivités terminales dans +% toutes les macros récursives, simplification de \xs_TestEqual en % utilisant \ifx % - Nouvelles macros \IfStrEqCase et \IfEqCase -% Teste si une chaîne est \'egale \`a plusieurs cha\^ines donn\'ee et -% ex\'ecute un code sp\'ecifique -% - Cr\'eation de la macro publique \StrSplit -% Coupe la chaine en 2 \`a une position donn\'ee +% Teste si une chaîne est égale à plusieurs chaines données et +% exécute un code spécifique +% - Création de la macro publique \StrSplit +% Coupe la chaine en 2 à une position donnée % - Nouvelle macro \StrCompare -% Compare 2 chaînes et renvoie la position du 1er caract\`ere diff\'erent. -% Renvoie 0 si elles sont \'egales. +% Compare 2 chaînes et renvoie la position du 1er caractère différent. +% Renvoie 0 si elles sont égales. %------------------------------------------------------------------------------ % v1.3a 29/9/2008 % - Correction d'un bug : \expandafter#1 % dans les macros \IfSubStrBefore et \StrBetween qui buggue si #1 est un % nombre > 9 ! -% - R\'e \'ecriture de \@xs@returnfirstsyntaxunit et \@gobble qui -% deviennent purement d\'eveloppables. -% - R\'e \'ecriture de \StrLen -% - Nouvelle macro interne \@xs@cutafteroccur -% Coupe la chaine apr\`es la ni\`eme occurrence d'une sous chaine. -% - Code am\'elior\'e de \StrMid, \StrLeft, \StrGobbleLeft, \StrRight, -% \StrGobbleRight grace \`a \@xs@cutafteroccur +% - Ré écriture de \xs_returnfirstsyntaxunit et \xs_gobarg qui +% deviennent purement développables. +% - Ré écriture de \StrLen +% - Nouvelle macro interne \xs_cutafteroccur +% Coupe la chaine après la nième occurrence d'une sous chaine. +% - Code amélioré de \StrMid, \StrLeft, \StrGobbleLeft, \StrRight, +% \StrGobbleRight grace à \xs_cutafteroccur %------------------------------------------------------------------------------ % v1.4 4/11/2008 -% - xstring traite ses arguments par unit\'e syntaxique, et donc toutes les -% macros internes ont \'et\'e r\'e-\'ecrites \`a cette fin. -% - Le manuel a \'et\'e r\'e-\'ecrit, rendu plus clair et mieux structur\'e. -% - Nouvelle fonctionnalit\'e : \expandarg -% le 1er lex\`eme de chaque argument est 1-d\'evelopp\'e avant que la -% macro ne soit appel\'ee. Si un argument comporte plus qu'1 lex\`eme, -% il faut passer par \scancs*[1] pour 1-d\'evelopper toutes les unit\'es +% - xstring traite ses arguments par unité syntaxique, et donc toutes les +% macros internes ont été ré-écrites à cette fin. +% - Le manuel a été ré-écrit, rendu plus clair et mieux structuré. +% - Nouvelle fonctionnalité : \expandarg +% le 1er lexème de chaque argument est 1-développé avant que la +% macro ne soit appelée. Si un argument comporte plus qu'1 lexème, +% il faut passer par \scancs*[1] pour 1-développer toutes les unités % syntaxiques. % - Correction de 2 erreurs dans le manuel anglais : 0 est la valeur par -% d\'efaut dans \StrSubstitute et \StrDel -% - Coh\'erence dans les nom des s\'equences de contr\^oles temporaires qui -% sont d\'esormais : \@xs@reserved@A \`a \@xs@reserved@E +% défaut dans \StrSubstitute et \StrDel +% - Cohérence dans les nom des séquences de contrôles temporaires qui +% sont désormais : \xs_reserved_A à \xs_reserved_E %------------------------------------------------------------------------------ % v1.4a 12/11/2008 -% - Correction d'un bug dans \@xs@StrSplit dans le cas o\`u l'argument -% num\'erique est <1 : la 1ere coupure doit être vide et le seconde doit -% être \'egale \`a l'argument. +% - Correction d'un bug dans \xs_StrSplit dans le cas où l'argument +% numérique est <1 : la 1ere coupure doit être vide et le seconde doit +% être égale à l'argument. %------------------------------------------------------------------------------ % v1.4b 16/11/2008 -% - Correction de 2 bugs dans \@xs@returnfirstsyntaxunit +% - Correction de 2 bugs dans \xs_returnfirstsyntaxunit %------------------------------------------------------------------------------ % v1.5 31/12/2008 -% - Nouvelles fonctionnalit\'es dans la recherche de groupes par un -% identificateur caract\'erisant leur imbrication. Impl\'ementation de : +% - Nouvelles fonctionnalités dans la recherche de groupes par un +% identificateur caractérisant leur imbrication. Implémentation de : % 1) \StrFindGroup % 2) \groupID -% - Ajout des nouvelles macros g\'en\'eriques \@xs@read@reserved@C et -% \@xs@read@reserved@D +% - Ajout des nouvelles macros génériques \xs_read_reserved_C et +% \xs_read_reserved_D % - Correction d'un bug dans \StrSplit : \StrSplit{{a}bc}{1}[\truc] faisait -% que \truc contenait «a{a}». -% - Correction d'un bug dans \@xs@newmacro : l'argument optionnel \'etait -% d\'etok\'enis\'e \`a tort dans les macros \'etoil\'ees. -% - Dans \@xs@newmacro, on doit choisir le num\'ero du dernier argument devant -% être d\'etok\'enis\'e dans le cas d'une macro \'etoil\'ee (sachant que +% que \truc contenait «a{a}». +% - Correction d'un bug dans \xs_newmacro : l'argument optionnel était +% détokénisé à tort dans les macros étoilées. +% - Dans \xs_newmacro, on doit choisir le numéro du dernier argument devant +% être détokénisé dans le cas d'une macro étoilée (sachant que % l'argument optionnel ne l'est jamais) %------------------------------------------------------------------------------ % v1.5a 09/2/2009 % - Nouvelle macro \StrExpand, sensible au mode d'exploration. La macro est -% indépendante du mode d'exploration et dispose de ses propres commandes +% indépendante du mode d'exploration et dispose de ses propres commandes % d'exploration : \expandingroups et \noexpandingroups -% - R\'e-\'ecriture de \scancs, qui devient triviale puisque d\'ependant de -% \StrExpand. Il n'y a plus de version \'étoil\'ee et d\'esormais, \scancs +% - Ré-écriture de \scancs, qui devient triviale puisque dépendant de +% \StrExpand. Il n'y a plus de version étoilée et désormais, \scancs % est sensible au mode d'exploration. % - Correction d'un bug dans \IfInteger : \IfInteger{2.0}{V}{F} affichait F -% - Correction de bugs : mettre \let\@xs@reserved@E\relax avant d'appeler -% \@xs@StrSplit@i +% - Correction de bugs : mettre \let\xs_reserved_E\relax avant d'appeler +% \xs_StrSplit_i % - Suppression des messages d'erreur, de warning et d'info. xstring devient % donc silencieux ;) -% - Passage de 3 \'a 2 compteurs -% - Le manuel est d\'esormais plus color\'e, en esp\'erant qu'il sera un peu -% plus agr\'eable \`a lire ! +% - Passage de 3 à 2 compteurs +% - Le manuel est désormais plus coloré, en espérant qu'il sera un peu +% plus agréable à lire ! %------------------------------------------------------------------------------ % v1.5b 13/3/2009 % - Modification d'un grand nombre de macros de telle sorte que vraiment -% n'importe quel code peut d\'esormais \^etre plac\'e dans les arguments des -% macros (comme par exemple des \if, \ifx ou autre, m\^eme sans leur \fi, ce -% qui n'\'etait pas possible jusqu'alors) +% n'importe quel code peut désormais être placé dans les arguments des +% macros (comme par exemple des \if, \ifx ou autre, même sans leur \fi, ce +% qui n'était pas possible jusqu'alors) %------------------------------------------------------------------------------ % v1.5c 05/6/2009 % - Correction d'un bug dans \IfBeginWith : il faut appeler -% \@xs@returnfirstsyntaxunit pour l'argument #2 puis pour l'argument #1 et -% non pas l'inverse pour que \@xs@toks reflète ce qui se trouve dans #1 -% - Correction d'un bug dans \@xs@returnfirstsyntaxunit au cas où #1 commence -% par un espace : mettre \@xs@toks à 0 -% - Correction d'un bug dans \@xs@returnfirstsyntaxunit : -% \@xs@returnfirstsyntaxunit{{}}\truc -% faisait que \truc se développait en un espace. -% - Correction d'un bug dans \@xs@removefirstsyntaxunit où le cas -% \@xs@removefirstsyntaxunit{ {b}}\truc -% donnait \truc se développant en «b» au lieu de «{b}». +% \xs_returnfirstsyntaxunit pour l'argument #2 puis pour l'argument #1 et +% non pas l'inverse pour que \xs_toks reflète ce qui se trouve dans #1 +% - Correction d'un bug dans \xs_returnfirstsyntaxunit au cas où #1 commence +% par un espace : mettre \xs_toks à 0 +% - Correction d'un bug dans \xs_returnfirstsyntaxunit : +% \xs_returnfirstsyntaxunit{{}}\truc +% faisait que \truc se développait en un espace. +% - Correction d'un bug dans \xs_removefirstsyntaxunit où le cas +% \xs_removefirstsyntaxunit{ {b}}\truc +% donnait \truc se développant en «b» au lieu de «{b}». %------------------------------------------------------------------------------ % v1.5d 28/3/2010 -% - Correction d'un bug dans \IfInteger : \@xs@afterinteger ne donnait pas le -% bon r\'esultat. Par exemple avec 1.23 il renvoyait {} au lieu de {.23} -% - \xs@formatnumber ne detokenize plus ses arguments (que m'est-il pass\'e -% par la t\^ete pour que je code un truc comme ca ?), et donc -% \@xs@afterinteger et \@xs@afterdecimal ont des tokens ayant le bon +% - Correction d'un bug dans \IfInteger : \afterinteger ne donnait pas le +% bon résultat. Par exemple avec 1.23 il renvoyait {} au lieu de {.23} +% - \xs_formatnumber ne detokenize plus ses arguments (que m'est-il passé +% par la tête pour que je code un truc comme ca ?), et donc +% \afterinteger et \xs_afterdecimal ont des tokens ayant le bon % catcode %------------------------------------------------------------------------------ % v1.6 24/10/2012 -% - Correction d'un bug dans \@xs@cutafteroccur au cas o\`u #3<1 +% - Correction d'un bug dans \xs_cutafteroccur au cas où #3<1 % - \IfDecimal ne \detokenize plus l'argument. % - Nouvelle version de \tokenize qui enlevait les accolades si son argument -% \'etait entre accolades +% était entre accolades % - Nouvelle macro \StrCut -% - \@xs@cutafteroccur@i ne produit plus d'espace indésirable si #3 était -% évalué par \numexpr +% - \xs_cutafteroccur_i ne produit plus d'espace indésirable si #3 était +% évalué par \numexpr %------------------------------------------------------------------------------ % v1.7 13/1/2013 % - Correction d'un manque de rigueur dans les assignations concernant -% \groupID : elles sont toutes globales d\'esormais +% \groupID : elles sont toutes globales désormais % - Les macros de xstring sont \long %------------------------------------------------------------------------------ % v1.7a 28/2/2013 -% - Correction d'un espace parasite dans \@xs@removefirstsyntaxunit +% - Correction d'un espace parasite dans \xs_removefirstsyntaxunit %------------------------------------------------------------------------------ % v1.7b 29/7/2013 -% - La date contenue dans \xstringdate est désormais conforme +% - La date contenue dans \xstringdate est désormais conforme +%------------------------------------------------------------------------------ +% v1.7c 13/10/2013 +% - les macros impliquées dans \IfStrCase et \IfStrEqCase sont désormais \long %------------------------------------------------------------------------------ -% v1.7c 13/10/2013 -% - les macros impliquées dans \IfStrCase et \IfStrEqCase sont désormais \long
\ No newline at end of file +% v1.8 07/12/2018 +% - affectations globales supprimées (sauf pour \groupID) afin de ne pas +% surcharger la pile de sauvegarde +% - nettoyage du code, corrections de lourdeurs et maladresses
\ No newline at end of file |