summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-08-15 22:50:14 +0000
committerKarl Berry <karl@freefriends.org>2008-08-15 22:50:14 +0000
commit596484dfdaa714a68b70527f186721a49cd47577 (patch)
tree8eb638849b27efa67a3902fcd45ac8629e3aa5a7
parent5678264eb318e7ca4f57a6b5a46abeaa005aef1d (diff)
xstring 1.1 (15aug08)
git-svn-id: svn://tug.org/texlive/trunk@10365 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/xstring/README16
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_etex.pdfbin0 -> 27969 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_etex.tex488
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_latex.pdfbin0 -> 47805 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_latex.tex562
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring.tex645
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdfbin169550 -> 173436 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex348
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdfbin180189 -> 184363 bytes
-rwxr-xr-xMaster/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex338
-rwxr-xr-xMaster/texmf-dist/doc/latex/xstring/xstring_test.pdfbin45911 -> 0 bytes
-rwxr-xr-xMaster/texmf-dist/doc/latex/xstring/xstring_test.tex552
-rw-r--r--Master/texmf-dist/tex/latex/xstring/xstring.sty705
13 files changed, 2101 insertions, 1553 deletions
diff --git a/Master/texmf-dist/doc/latex/xstring/README b/Master/texmf-dist/doc/latex/xstring/README
index e057dd49d3b..4193278a183 100644
--- a/Master/texmf-dist/doc/latex/xstring/README
+++ b/Master/texmf-dist/doc/latex/xstring/README
@@ -1,13 +1,20 @@
_________________
xstring package
- v1.0
+ v1.1
+ 2008/08/15
_________________
+--------------
+Warning
+This package does not require LaTeX (although eTeX is still required).
+Consequently, the xstring.tex file should be installed in the tex/ subtree.
+--------------
This package provides macros manipulating strings, such as:
* tests:
- does a string contains at least n times an another?
- does a string starts (or ends) with another? etc.
+ - is a string an integer? A decimal?
* extractions of substrings:
- what is on the left (or the right) of the nth occurrence of a
substring;
@@ -25,11 +32,18 @@ For programming purposes, other macros allow to use special characters
#######################################################################
+--------------
+Attention
+Cette extension ne nécessite plus LaTeX (bien que eTeX soit toujours requis).
+Par conséquent, le fichier xstring.tex devrait être placé dans le sous
+répertoire tex/
+--------------
Cette extension regroupe un ensemble de macros manipulant des chaînes
de caractères :
* des tests :
- une chaîne en contient elle une autre au moins n fois ?
- une chaîne commence t-elle ou finit-elle par une autre ? etc.
+ - une chaîne est-elle un entier relatif ? Un décimal ?
* des extractions de chaines :
- renvoi de ce qui se trouve avant (ou après) la nieme occurrence
d'une sous-chaîne;
diff --git a/Master/texmf-dist/doc/latex/xstring/test_etex.pdf b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf
new file mode 100644
index 00000000000..d184fdd4db4
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/test_etex.tex b/Master/texmf-dist/doc/latex/xstring/test_etex.tex
new file mode 100644
index 00000000000..4468c4bfdab
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/xstring/test_etex.tex
@@ -0,0 +1,488 @@
+%%%%%%%% ATTENTION %%%%%%%%
+% Ceci est un fichier TeX. Il doit être compilé avec eteX en tapant <etex test_etex>
+%%%%%%%% WARNING %%%%%%%%
+% This is a TeX file. It must be compiled with eTeX typing <etex test_etex>
+\input xstring
+\def\delimiteur{-{}}
+\font\hugerm=cmr10 scaled 1750
+\font\largeboldrm=cmbx10 scaled 1300
+\font\largett=cmtt10 scaled 1300
+\catcode`\@=11\relax
+\gdef\exemple{\@ifstar{\def\frontiere{\delimiteur}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
+\gdef\@xs@afterreadverb#1{%
+ \normalexpandarg
+ \tokenize\cs@resultat{#1}%
+ \fullexpandarg
+ \hbox to 16.5cm{\hbox to 11.5cm{\hfil\tt#1}\hskip1em\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\^emes exemples avec l'argument optionnel :\par}
+\parindent0pt
+% debut du texte
+\hfil{\hugerm Ceci est le fichier de test de xstring}\hfil{}\vskip2em
+
+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\'esent\'ees ici ne contiennent pas de lettres accentu\'ees.\vskip2em
+
+Toutes les situations ne sont pas envisag\'ees, mais au moins un grand nombre ! Les macros sont examin\'ees dans l'ordre logique du code.
+
+Lorsque le r\'esultat contient des espaces ou peut conduire \`a des doutes, il sera entour\'e de ''\delimiteur``, \'etant entendu que ''\delimiteur\delimiteur`` est une cha\^\i ne vide.\vskip2em
+
+\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{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|
+
+\end \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/xstring/test_latex.pdf b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf
new file mode 100644
index 00000000000..511f3e4b04d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/test_latex.tex b/Master/texmf-dist/doc/latex/xstring/test_latex.tex
new file mode 100644
index 00000000000..0aee06e3721
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/xstring/test_latex.tex
@@ -0,0 +1,562 @@
+\documentclass[a4paper,10pt]{article}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage[dvips,margin=1.5cm,noheadfoot]{geometry}
+\pagestyle{empty}
+\usepackage{xstring}
+
+\makeatletter
+
+\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
+\def\@xs@afterreadverb#1{%
+ \normalexpandarg
+ \tokenize\cs@resultat{#1}%
+ \fullexpandarg
+ \hbox to\linewidth{\hbox to0.7\linewidth{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil}\par}
+
+\makeatother
+
+\newcommand\chapitre[2]{\medskip{\large\textbf{#1} \texttt{\textbackslash#2}}\smallskip}
+\def\delimiteur{|}
+
+\begin{document}
+\setlength{\parindent}{0pt}
+
+\begin{center}\Large{Ceci est le fichier de test de xstring}.\end{center}\medskip
+
+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
+
+\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{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}{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|
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring.tex b/Master/texmf-dist/doc/latex/xstring/xstring.tex
new file mode 100644
index 00000000000..71623a89b58
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/xstring/xstring.tex
@@ -0,0 +1,645 @@
+% __________________________________________________
+% | |
+% | |
+% | xstring v1.1 |
+% | |
+% | August 15 2008 |
+% | |
+% |__________________________________________________|
+%
+% This is xtring.sty
+%
+% Christian Tellechea 2008
+% 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
+%
+% This work consists of the 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)
+% test_latex.tex, test_latex.pdf (test file with LaTeX)
+% test_etex.tex, test_etex.pdf (test file with Plain eTeX)
+%
+\def\xstringversion {1.1}
+\def\xstringdate {2008/08/15}
+\def\xstringfrenchdate {15 ao\^ut 2008}
+\def\xstringenglishdate{August $15^{\mathrm{th}}$ 2008}
+\edef\CurrentAtCatcode{\the\catcode`\@}
+\catcode`\@=11
+\newwrite\@xs@unused% pour lesmessages
+\newcount\integerpart% pour les tests sur les nombres
+\newcount\decimalpart
+
+\immediate\write\@xs@unused{Package: xstring v\xstringversion\space<\xstringdate>\space Extended macros for strings (C Tellechea).}%
+
+\expandafter\ifx\csname @latexerr\endcsname\relax% on n'utilise pas LaTeX ?
+ \long\def\@firstoftwo#1#2{#1}
+ \long\def\@secondoftwo#1#2{#2}
+ \long\def\@ifnextchar#1#2#3{%
+ \let\reserved@d=#1%
+ \def\reserved@a{#2}%
+ \def\reserved@b{#3}%
+ \futurelet\@let@token\@ifnch}
+ \def\@ifnch{%
+ \ifx\@let@token\@sptoken
+ \let\reserved@c\@xifnch
+ \else
+ \ifx\@let@token\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@token\@ifnch}
+ \def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}}
+ \long\def\@testopt#1#2{\@ifnextchar[{#1}{#1[{#2}]}}
+ \def\@empty{}
+\fi% fin des définitions LaTeX
+
+\def\@xs@gobblefirstchar#1#2\@nil{#2}
+\def\@xs@returnfirstchar#1#2\@nil{#1}
+
+% Gestion des messages d'erreur
+\def\@xs@linenumber{on input line \the\inputlineno}
+\def\@xs@errorwrite#1#2{%
+ \begingroup
+ \newlinechar`\^^J%
+ \errhelp{#2}%
+ \errmessage{Package xstring Error: \@xs@linenumber\space#1^^J%
+ See user manual for further information.^^J%
+ Type \space H <return> \space for immediate help.}%
+ \endgroup}
+
+\def\@xs@warningwrite#1{%
+ \begingroup
+ \newlinechar`\^^J%
+ \immediate\write\@xs@unused{Package xstring Warning: #1 \@xs@linenumber^^J}%
+ \endgroup}
+
+\def\@xs@infowrite#1{%
+ \begingroup
+ \newlinechar`\^^J%
+ \immediate\write\m@ne{Package xstring Info: #1}%
+ \endgroup}
+
+% Messages d'information pour situations particulières
+\def\@xs@BadNumArg {\@xs@infowrite{numerical argument out of range}}
+\def\@xs@ArgNotFound {\@xs@infowrite{substring not found in string}}
+\def\@xs@ArgEmpty {\@xs@infowrite{empty argument}}
+
+% Ouvre un groupe où les catcodes sont à 12 et à 10 pour les espaces
+% ensuite, appelle \@xs@ReadVerb qui lit un argument entre délimiteurs verb
+\def\@xs@MakeVerb{% lit 1 argument et le transforme en verb
+ \begingroup% groupe où les catcodes sont à 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éfinit \@xs@ReadVerb qui lit un argument entre délimiteurs verb
+\def\setverbdelim#1{% définit quel est le délimiteur de verb
+ \expandafter\ifx\expandafter\@empty\@xs@gobblefirstchar#1\@nil\@empty
+ \else
+ \@xs@warningwrite{verb delimiter is not a single char}%
+ \fi
+ \def\@xs@ReadVerb##1#1##2#1{% lit ##2 qui est entre les délimiteurs de verb
+ \endgroup% on ferme le groupe
+ \@xs@afterreadverb{##2}}}% on appelle l'exécution de fin
+
+% Assigne l'argument entre délimiteur verb dans la sc #1
+\def\verbtocs#1{%
+ \def\@xs@afterreadverb##1{\edef#1{##1}}%
+ \@xs@MakeVerb}
+
+% A l'aide d'un pont d'\expandafter, développe d'un niveau toutes
+% les sc de #1 puis et assigne le résultat à \@xs@result@expandallonelevel
+\def\@xs@expandallonelevel#1#2\@nil{%
+ \expandafter\expandafter\expandafter\def% plein d'expandafter
+ \expandafter\expandafter\expandafter\@xs@result@expandallonelevel% pour développer #1 d'un niveau
+ \expandafter\expandafter\expandafter{\expandafter\@xs@result@expandallonelevel#1}% et l'ajouter à \@xs@result@expandallonelevel
+ \ifx\@empty#2\@empty\else\@xs@expandallonelevel#2\@nil\fi}% s'il reste des sc, on boucle
+
+\def\@xs@notestcs#1\@nil{\relax}%
+\def\@xs@testcs#1#2\@nil{%
+ \ifx\@empty#2\@empty
+ \else% si la séquence de contrôle n'est pas seule, on gueule
+ \@xs@errorwrite{third argument or its expansion^^Jis not a single control sequence! Use \string\scancs* instead of \string\scancs (see manual).}{With \scancs, the third argument (or one of its expansion) cannot contain^^Jmore than one control sequence. If so, use the starred version \scancs*,^^Jand read manual for more information about this starred version...}%
+ \fi}
+
+% \scancs développe #3 autant de fois que spécifié en #1
+% puis le développement obtenu est verbatimisé.
+% On utilise \@xs@expandalltodepth autant de fois que #1 le spécifie
+% puis on invoque \detokenize à la fin
+\def\scancs{%
+ \@ifstar%
+ {\@xs@warningwrite{\string\scancs* has limitations:^^Jif third argument or its expansion have braces or spaces,^^Jthey will be removed when scanned}%
+ \def\@xs@testornot{\@xs@notestcs}%
+ \@xs@scancs}%
+ {\def\@xs@testornot{\@xs@testcs}%
+ \@xs@scancs}}
+\def\@xs@scancs{\@ifnextchar[{\@xs@scancs@}{\@xs@scancs@[1]}}
+\def\@xs@scancs@[#1]#2#3{%
+% #1 : profondeur à développer avant de verbatimiser
+% #2 : nom de la sc recevant la chaine verb
+% #3 : nom de la sc à développer et à transformer en verb
+ \def\@xs@expandalltodepth##1\@nil##2\@nil{% développe de #1 niveaux toutes les sc de #3 et l'assigne à \@xs@result@scancs
+ \def\@xs@result@expandallonelevel{}%
+ \ifnum\numexpr##2<#1% tant que la profondeur de développement n'est pas atteinte
+ \@xs@testornot##1\@nil% on teste éventuellement si le développement comporte 1 seule sc
+ \expandafter\@xs@expandallonelevel\@xs@result@scancs\@nil% on développe tout d'un niveau
+ \expandafter\def\expandafter\@xs@result@scancs\expandafter{\@xs@result@expandallonelevel}%
+ \expandafter\@xs@expandalltodepth\@xs@result@scancs\@nil##2+1\@nil% et on recommence
+ \fi}%
+ \def\@xs@result@scancs{#3}%
+ \@xs@expandalltodepth#3\@nil0\@nil
+ \expandafter\def\expandafter#2\expandafter{\detokenize\expandafter{\@xs@result@scancs}}}
+
+% Cette macro développe #2 au maximum (ce qui doit donner du texte),
+% puis le transforme en token et l'assigne à #1
+% On ouvre un groupe dans lequel un \@nil est inséré à la fin du fichier virtuel
+% lu avec \scantokens. Ce \@nil sert à l'argument délimité de \@xs@AssignResult
+\def\tokenize#1#2{%
+ \begingroup
+ %\expandafter\@xs@def\expandafter\@xs@expansion@tokenize\expandafter{#2}% on développe en accord avec \fullexpandarg ou \noexpandarg
+ \@xs@def\@xs@expansion@tokenize{#2}% on développe en accord avec \fullexpandarg ou \noexpandarg ## Correction [v1.1] ##
+ \def\@xs@AssignResult##1\@nil{\def#1{##1}}% on assigne en tenant compte du \@nil qui vient de la fin du fichier virtuel
+ \everyeof{\@nil}% met un \@nil à la fin du fichier virtuel
+ \endlinechar\m@ne
+ \expandafter\expandafter\expandafter\endgroup% on retarde la fermeture du groupe
+ \expandafter\@xs@AssignResult\scantokens\expandafter{\@xs@expansion@tokenize}}% pout faire l'assignation
+
+% Macro très simple qui assigne ou affiche le résultat, selon la présence
+% ou non de #2 qui est l'argument optionnel venant en dernière position des macros
+\def\@xs@ReturnResult#1#2{%
+ \expandafter\ifx\expandafter\@empty\detokenize{#2}\@empty% pas de nom ?
+ #1% on affiche #1
+ \else% il y a un nom donc
+ \edef#2{#1}% on assigne #1 dans #3 avec edef
+ \fi}
+
+% Pas d'expansion des arguments
+\def\normalexpandarg{%
+ \let\@xs@def\def% on définit \@xs@call avec \def
+ \def\@xs@expand##1{\expandafter\unexpanded\expandafter{##1}}}
+
+% Expansion des arguments
+\def\fullexpandarg{%
+ \let\@xs@def\edef% on définit\@xs@call avec \edef
+ \def\@xs@expand##1{##1}}% et on neutralise \@xs@expand
+
+
+% Cette macro interne enlève le 1er caractère de la chaine passée en argument
+\def\@xs@RemoveFirst#1[#2]{%
+ \ifx\@empty#1\@empty
+ \edef#2{}%
+ \else
+ \@xs@IfBeginWith{#1}{ }%
+ {\@xs@StrBehind[1]{#1}{ }[#2]}%
+ {\def\@xs@RemoveFirst@ii##1##2\@nil{\edef#2{##2}}%
+ \@xs@RemoveFirst@ii#1\@nil}%
+ \fi}
+
+% Cette macro interne renvoie le 1er caractère de la chaine passée en argument
+\def\@xs@ReturnFirst#1[#2]{%
+ \ifx\@empty#1\@empty%
+ \edef#2{}%
+ \else
+ \@xs@IfBeginWith{#1}{ }%
+ {\edef#2{ }}%
+ {\def\@xs@ReturnFirst@ii##1##2\@nil{\edef#2{##1}}%
+ \@xs@ReturnFirst@ii#1\@nil}%
+ \fi}
+
+% 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.
+\def\@xs@expand@and@detokenize#1#2{%
+ \@xs@def#1{#2}% on développe #2 selon \fullexpandarg ou \normalexpandarg
+ \edef#1{\detokenize\expandafter{#1}}}% puis on détokenize et on assigne à #1
+
+\def\@xs@expand@and@assign#1#2{%
+ \@xs@def#1{#2}}% on développe #2 selon \fullexpandarg ou \normalexpandarg
+
+\def\@xs@expand@and@addtomacro#1#2{\edef#1{\unexpanded\expandafter{#1}#2}}
+\def\@xs@argstring{0########1########2########3########4########5########6########7########8########9}
+\def\@xs@DefArg#1{\def\@xs@defarg0##1#1##2\@nil{\def\@xs@myarg{##1#1}}\expandafter\@xs@defarg\@xs@argstring\@nil}
+\def\@xs@DefArg@#1{\expandafter\@xs@defarg@\expandafter{\number\numexpr#1+1}}
+\def\@xs@defarg@#1{\def\@xs@defarg0##11##2#1##3\@nil{\def\@xs@myarg{[##11]##2#1}}\expandafter\@xs@defarg\@xs@argstring\@nil}
+\def\@xs@OneArg#1{\expandafter\@xs@onearg\expandafter{\number\numexpr#1-1}{#1}}
+\def\@xs@onearg#1#2{\def\@xs@defarg##1#1##2#2##3\@nil{\def\@xs@myarg{##2#2}}\expandafter\@xs@defarg\@xs@argstring\@nil}
+
+\def\@xs@BuildLines#1#2{% #1 : numéro du 1er argument et % #2 : nombre de lignes
+ \def\@xs@newlines{}%
+ \def\@xs@newargs{}%
+ \def\@xs@buildlines##1\@nil{%
+ \expandafter\@xs@OneArg\expandafter{\number\numexpr##1+#1-1}%
+ \@xs@expand@and@addtomacro\@xs@newlines{\noexpand\@xs@assign{\expandafter\noexpand\csname @xs@arg@\romannumeral\numexpr##1\endcsname}{\@xs@myarg}}%
+ \@xs@expand@and@addtomacro\@xs@newargs{{\noexpand\@xs@expand\expandafter\noexpand\csname @xs@arg@\romannumeral\numexpr##1\endcsname}}%
+ \ifnum\numexpr##1<#2\@xs@buildlines##1+1\@nil\fi}
+ \@xs@buildlines1\@nil}
+
+\def\@xs@newmacro#1#2#3#4#5{%
+% #1 : nom de la macro publique
+% #2 : argument optionnel (vide si pas d'arg optionnel)
+% #3 : nombre d'arguments obligatoires
+% #4 : utilisation de testopt (1 si oui, 0 si non)
+% #5 : code de la macro
+% Cette macro construit les macros privées suivantes :
+% si #2 est vide : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@}}
+% si #2 existe : \NOM{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@NOM@@}{\let\@xs@assign\@xs@expand@and@assign\@xs@NOM@@}}
+% \@xs@NOM@@{\@ifnextchar[{\@xs@NOM@}{\@xs@NOM@[#2]}}
+ \edef\@xs@macronameroot{@xs@\expandafter\@xs@gobblefirstchar\string#1\@nil}%
+ \edef\@macro@name{\expandafter\noexpand\csname\@xs@macronameroot @\ifx\@empty#2\@empty @\fi\endcsname}%
+ \edef\@xs@temp@{%
+ \def\noexpand#1{\noexpand\@ifstar
+ {\noexpand\let\noexpand\@xs@assign\noexpand\@xs@expand@and@detokenize\expandafter\noexpand\@macro@name}%
+ {\noexpand\let\noexpand\@xs@assign\noexpand\@xs@expand@and@assign\expandafter\noexpand\@macro@name}}%
+ \ifx\@empty#2\@empty
+ \else
+ \def\expandafter\noexpand\@macro@name{\noexpand\@ifnextchar[%
+ {\expandafter\noexpand\csname\@xs@macronameroot @@\endcsname}%
+ {\expandafter\noexpand\csname\@xs@macronameroot @@\endcsname[#2]}}%
+ \fi}%
+ \@xs@temp@
+ \ifx\@empty#2\@empty
+ \@xs@BuildLines{1}{#3}%
+ \@xs@DefArg{#3}%
+ \else
+ \@xs@BuildLines{2}{#3}%
+ \@xs@DefArg@{#3}%
+ \fi
+ \edef\@xs@temp@{\def\expandafter\noexpand\csname\@xs@macronameroot @@\endcsname\@xs@myarg}%
+ \edef\@xs@temp@@{\unexpanded\expandafter{\@xs@newlines}\edef\noexpand\@xs@call}%
+ \edef\@xs@temp@@@{\noexpand\noexpand\expandafter\noexpand\csname\@xs@macronameroot\endcsname\ifx\@empty#2\@empty\else[\unexpanded{\@xs@expand{##1}}]\fi\unexpanded\expandafter{\@xs@newargs}}%
+ \ifnum#4=\@ne\edef\@xs@temp@@@{\noexpand\noexpand\noexpand\@testopt{\unexpanded\expandafter{\@xs@temp@@@}}\unexpanded{{}}}\fi
+ \@xs@expand@and@addtomacro\@xs@temp@@{{\unexpanded\expandafter{\@xs@temp@@@}}\noexpand\@xs@call}%
+ \@xs@expand@and@addtomacro\@xs@temp@{{\unexpanded\expandafter{\@xs@temp@@}}}%
+ \@xs@temp@
+ \edef\@xs@temp@{\def\expandafter\noexpand\csname\@xs@macronameroot\endcsname\@xs@myarg\ifnum#4=\@ne[\unexpanded{##}\number\numexpr\ifx\@empty#2\@empty#3+1\else#3+2\fi]\fi{\unexpanded{#5}}}%
+ \@xs@temp@}
+
+% Cette macro teste si une chaine (#2) en contient au moins (#1) fois une autre (#3)
+% Au final, \@xs@behind@IfSubStr et \@xs@before@IfSubStr contiennent
+% ce qui se trouve après et avant la (#1)èmé occurrence de la chaine (#2)
+% si elle existe,et contiennent des chaines vides sinon.
+\def\@xs@strip@delimit#1\@delimit#2\@nil{#1}
+\def\@xs@IfSubStr@case@false{%
+ \def\@xsresult@IfSubStr{\expandafter\@secondoftwo}% on exécute #5
+ \def\@xs@behind@IfSubStr{}%
+ \def\@xs@before@IfSubStr{}}
+\@xs@newmacro\IfSubStr{1}{2}{0}{%
+ \ifnum#1<\@ne% on gère les cas spéciaux
+ \@xs@BadNumArg
+ \@xs@IfSubStr@case@false
+ \else
+ \ifx\@empty#2\@empty\@xs@ArgEmpty\fi
+ \ifx\@empty#3\@empty
+ \@xs@ArgEmpty
+ \@xs@IfSubStr@case@false
+ \else
+ \def\@xs@before@IfSubStr{}%
+ \def\@xs@IfSubStr@i##1#3##2\@nil##3\@nil{%
+ \ifx\@empty##2\@empty% rien après la sous chaine ?
+ \@xs@IfSubStr@case@false
+ \else% si ce qu'il est reste n'est pas vide
+ \ifnum\numexpr##3<#1% tant que le nombre d'occurrence n'est pas atteint
+ \edef\@xs@before@IfSubStr{\@xs@before@IfSubStr##1#3}%
+ \@xs@IfSubStr@i##2\@nil##3+1\@nil% on recommence
+ \else
+ \def\@xsresult@IfSubStr{\expandafter\@firstoftwo}% nombre d'occurrences atteint : on renvoie #4
+ \edef\@xs@before@IfSubStr{\@xs@before@IfSubStr##1}%
+ \edef\@xs@behind@IfSubStr{\@xs@strip@delimit##2\@nil}%
+ \fi
+ \fi}%
+ \@xs@IfSubStr@i#2\@delimit#3\@nil1\@nil% \@delimit pour éviter le cas de \IfSubStr{a}{aa}{V}{F} qui renverrait V
+ \fi
+ \fi
+ \@xsresult@IfSubStr}
+
+\@xs@newmacro\IfBeginWith{}{2}{0}{%
+ \@xs@IfSubStr[\@ne]{#1}{#2}%
+ {\ifx\@empty\@xs@before@IfSubStr\@empty
+ \def\@xs@result@IfBeginWith{\expandafter\@firstoftwo}%
+ \else
+ \def\@xs@result@IfBeginWith{\expandafter\@secondoftwo}%
+ \fi}%
+ {\def\@xs@result@IfBeginWith{\expandafter\@secondoftwo}}%
+ \@xs@result@IfBeginWith}
+
+\@xs@newmacro\IfEndWith{}{2}{0}{%
+ \@xs@StrCount{#1}{#2}[\@xs@result@IfEndWith]%
+ \ifnum\@xs@result@IfEndWith=\z@
+ \def\@xs@result@IfEndWith{\expandafter\@secondoftwo}%
+ \else
+ \ifx\@empty\@xs@after@StrCount\@empty
+ \def\@xs@result@IfEndWith{\expandafter\@firstoftwo}%
+ \else
+ \def\@xs@result@IfEndWith{\expandafter\@secondoftwo}%
+ \fi
+ \fi
+ \@xs@result@IfEndWith}
+
+% Renvoie ce qui est à gauche de l'occurence n°#1 de la sous chaine #3 dans la chaine
+\@xs@newmacro\StrBefore{1}{2}{1}{%
+ \@xs@IfSubStr[#1]{#2}{#3}%
+ {\@xs@ReturnResult{\@xs@before@IfSubStr}{#4}}%
+ {\@xs@ReturnResult{}{#4}}}
+
+% Renvoie ce qui est à droite de l'occurence n°#1 de la sous chaine #3 dans la chaine #2
+\@xs@newmacro\StrBehind{1}{2}{1}{%
+ \@xs@IfSubStr[#1]{#2}{#3}%
+ {\@xs@ReturnResult{\@xs@behind@IfSubStr}{#4}}%
+ {\@xs@ReturnResult{}{#4}}}
+
+\@xs@newmacro\IfSubStrBefore{1,1}{3}{0}{\@xs@IfSubStrBefore@i[#1]{#2}{#3}{#4}}
+\def\@xs@IfSubStrBefore@i[#1,#2]#3#4#5{%
+ \@xs@IfSubStr[#2]{#3}{#5}%
+ {\expandafter\@xs@IfSubStr\expandafter[\expandafter#1\expandafter]\expandafter{\@xs@before@IfSubStr}{#4}%
+ {\def\@xs@result@IfSubStrBefore{\expandafter\@firstoftwo}}%
+ {\def\@xs@result@IfSubStrBefore{\expandafter\@secondoftwo}}%
+ }%
+ {\def\@xs@result@IfSubStrBefore{\expandafter\@secondoftwo}}%
+ \@xs@result@IfSubStrBefore}
+
+\@xs@newmacro\IfSubStrBehind{1,1}{3}{0}{\@xs@IfSubStrBehind@i[#1]{#2}{#3}{#4}}
+\def\@xs@IfSubStrBehind@i[#1,#2]#3#4#5{\@xs@IfSubStrBefore@i[#2,#1]{#3}{#5}{#4}}
+
+% tests sur les nombres \IfInteger et \IfDecimal
+\def\@xs@putXifempty#1{\ifx\@empty#1\@empty X\else#1\fi}
+\def\@xs@formatnumber#1{%
+ \expandafter\ifx\@xs@returnfirstchar#1\@nil+%
+ +0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
+ \else
+ \expandafter\ifx\@xs@returnfirstchar#1\@nil-%
+ -0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
+ \else
+ 0#1%
+ \fi
+ \fi}
+\def\@xs@formatdecimalpart#1{}
+
+\@xs@newmacro\IfInteger{}{1}{0}{%
+ \@xs@def\@xs@formattednumber{\@xs@formatnumber{#1}}%
+ \decimalpart=0
+ \afterassignment\@xs@defafterinteger\integerpart=\@xs@formattednumber\relax\@nil
+ \if\relax\@xs@afterinteger
+ \def\@xs@result@IfInteger{\expandafter\@firstoftwo}%
+ \else
+ \def\@xs@result@IfInteger{\expandafter\@secondoftwo}%
+ \fi
+ \@xs@result@IfInteger}
+
+\@xs@newmacro\IfDecimal{}{1}{0}{%
+ \@xs@def\@xs@formattednumber{\@xs@formatnumber{#1}}%
+ \decimalpart=0\relax
+ \afterassignment\@xs@defafterinteger\integerpart=\@xs@formattednumber\relax\@nil
+ \expandafter\@xs@testdot\@xs@afterinteger\@nil
+ \if\relax\@xs@afterdecimal
+ \def\@xs@result@IfDecimal{\expandafter\@firstoftwo}%
+ \else
+ \def\@xs@result@IfDecimal{\expandafter\@secondoftwo}%
+ \fi
+ \@xs@result@IfDecimal}
+\def\@xs@defafterinteger#1\@nil{\def\@xs@afterinteger{#1}}%
+\def\@xs@testdot{\@ifnextchar.{\@xs@readdecimalpart}{\@xs@testcomma}}
+\def\@xs@testcomma{\@ifnextchar,{\@xs@readdecimalpart}{\@xs@endnumber}}
+\def\@xs@readdecimalpart#1#2\@nil{%
+ \if\relax#2\def\@xs@formattednumber{0X}\else\def\@xs@formattednumber{0#2}\fi
+ \afterassignment\@xs@defafterinteger\decimalpart=\@xs@formattednumber\@nil
+ \expandafter\@xs@endnumber\@xs@afterinteger\@nil}
+\def\@xs@endnumber#1\@nil{\def\@xs@afterdecimal{#1}}
+
+% 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\StrBetween{1,1}{3}{1}{\@xs@StrBetween@i[#1]{#2}{#3}{#4}[#5]}
+\def\@xs@StrBetween@i[#1,#2]#3#4#5[#6]{%
+ \@xs@IfSubStr[#2]{#3}{#5}%
+ {\expandafter\@xs@IfSubStr\expandafter[\expandafter#1\expandafter]\expandafter{\@xs@before@IfSubStr}{#4}%
+ {\@xs@ReturnResult{\@xs@behind@IfSubStr}{#6}}%
+ {\@xs@ReturnResult{}{#6}}%
+ }%
+ {\@xs@ReturnResult{}{#6}}}
+
+% Remplace les #1 premières occurences de la chaine #3
+% par la chaine #4 dans la chaine #2
+\@xs@newmacro\StrSubstitute{0}{3}{1}{%
+ \ifx\@empty#3\@empty% si #3 est vide, on ne fait rien
+ \@xs@ArgEmpty% warning
+ \edef\@xs@result@StrSubstitute{#2}%
+ \else
+ \edef\@xs@result@StrSubstitute{}% on initialise à vide, histoire d'enlever le statut undefined
+ \ifnum#1>\z@
+ \def\@xs@StrSubstitute@i##1#3##2\@nil##3\@nil{% ici, on compte les occurrences
+ \edef\@xs@result@StrSubstitute{\@xs@result@StrSubstitute##1#4}% on recopie jusqu'à la 1ere occurrence, et on remplace #3 par #4
+ \@xs@IfSubStr[1]{##2}{#3}% tant que la chaine restante contient #3
+ {\ifnum\numexpr##3<#1% tant qu'on n'a pas atteint la bonne occurrence,
+ \@xs@StrSubstitute@i##2\@nil##3+1\@nil% on recommence
+ \else
+ \edef\@xs@result@StrSubstitute{\@xs@result@StrSubstitute##2}% l'occurrence est atteinte : on rajoute ce qui reste
+ \fi}%
+ {\edef\@xs@result@StrSubstitute{\@xs@result@StrSubstitute##2}}}% si on ne peut plus substituter, on rajoute ce qui reste
+ \@xs@IfSubStr[1]{#2}{#3}%
+ {\@xs@StrSubstitute@i#2\@nil1\@nil}% si #2 contient #3, on exécute la macro
+ {\edef\@xs@result@StrSubstitute{#2}}% sinon, on renvoie la chaine #2
+ \else
+ \def\@xs@StrSubstitute@i##1#3##2\@nil{% ici, on ne compte pas les occurrences
+ \edef\@xs@result@StrSubstitute{\@xs@result@StrSubstitute##1#4}% on recopie jusqu'à la 1ere occurrence, et on remplace #3 par #4
+ \@xs@IfSubStr[1]{##2}{#3}% ...tant que la chaine restante contient #3
+ {\@xs@StrSubstitute@i##2\@nil}% on recommence
+ {\edef\@xs@result@StrSubstitute{\@xs@result@StrSubstitute##2}}}% si on ne peut plus substituter, on rajoute ce qui reste
+ \@xs@IfSubStr[1]{#2}{#3}%
+ {\@xs@StrSubstitute@i#2\@nil}% si #2 contient #3, on exécute la macro
+ {\edef\@xs@result@StrSubstitute{#2}}% sinon, on renvoie la chaine #2
+ \fi
+ \fi
+ \@xs@ReturnResult{\@xs@result@StrSubstitute}{#5}}
+
+% Supprime les #1 premières occurrences de #3 dans #2
+\@xs@newmacro\StrDel{0}{2}{1}{\@xs@StrSubstitute[#1]{#2}{#3}{}[#4]}
+
+% Compte combien de caractères contient la chaine #1 ?
+\@xs@newmacro\StrLen{}{1}{1}{\@xs@StrLen@i#1\@nil0\@nil#2\@nil}
+\def\@xs@StrLen@i#1\@nil#2\@nil#3\@nil{%
+ \ifx\@empty#1\@empty%
+ \@xs@ReturnResult{\number\numexpr#2}{#3}%
+ \else
+ \@xs@RemoveFirst{#1}[\@xs@remain@StrLen]%
+ \expandafter\@xs@StrLen@i\@xs@remain@StrLen\@nil#2+1\@nil#3\@nil
+ \fi}
+
+\def\StrMid{\@ifstar{\let\@xs@assign\@xs@expand@and@detokenize\@xs@StrMid@@}{\let\@xs@assign\@xs@expand@and@assign\@xs@StrMid@@}}
+\def\@xs@StrMid@@#1#2#3{%
+ \@xs@def\@xs@First@StrMid{\@xs@expand#2}%
+ \@xs@def\@xs@Last@StrMid{\@xs@expand#3}% position début et fin
+ \ifnum#2>#3\@xs@BadNumArg\fi
+ \@xs@assign{\@xs@arg@i}{#1}%
+ \edef\@xs@call{\noexpand\@testopt{\noexpand\@xs@StrMid{\@xs@expand\@xs@arg@i}}{}}%
+ \@xs@call}
+% cette sous macro supprime le nombre de caractère nécessaires
+% à la gauche de son argument, et renvoie le résultat dans \@xs@result@MidGobble
+\def\@xs@MidGobble#1\@nil#2\@nil{%
+ \ifnum\numexpr#2=\@xs@First@StrMid% si on a atteint la position
+ \edef\@xs@result@MidGobble{#1}% on renvoie ce qui reste
+ \else% sinon
+ \@xs@RemoveFirst{#1}[\@xs@remain@StrMid]% on enlève un caractère
+ \expandafter\@xs@MidGobble\@xs@remain@StrMid\@nil#2+1\@nil% et on recommence
+ \fi}
+% cette sous macro prend le nombre de caractères nécessaires
+% à la gauche de son argument, et renvoie le résultat dans \@xs@result@StrMid
+\def\@xs@MidConcat#1\@nil#2\@nil{%
+ \@xs@ReturnFirst{#1}[\@xs@CharToAdd@StrMid]% prend le 1er caractère
+ \edef\@xs@result@StrMid{\@xs@result@StrMid\@xs@CharToAdd@StrMid}% l'ajoute au résultat final
+ \@xs@RemoveFirst{#1}[\@xs@remain@StrMid]% puis l'enlève de la chaine
+ \ifnum\numexpr#2<\numexpr\@xs@Last@StrMid-\@xs@First@StrMid% si pas encore fini
+ \expandafter\@xs@MidConcat\@xs@remain@StrMid\@nil#2+1\@nil% on recommence
+ \fi}
+\def\@xs@StrMid#1[#2]{%
+% renvoie la sous chaine de #1 comprise entre les positions \@xs@First@StrMid et \@xs@Last@StrMid
+ \@xs@StrLen{#1}[\@len@StrMid]%
+ \ifnum\@xs@First@StrMid>\@xs@Last@StrMid% mauvais ordre ?
+ \@xs@ReturnResult{}{#2}% on renvoie rien
+ \else
+ \ifnum\@xs@Last@StrMid<\@ne% si position fin trop petite
+ \@xs@ReturnResult{}{#2}% on renvoie rien
+ \else
+ \ifnum\@xs@First@StrMid<\@ne% 1ère position trop petite ?
+ \edef\@xs@First@StrMid{1}% on limite à 1
+ \@xs@BadNumArg% avertissement
+ \fi
+ \ifnum\@xs@Last@StrMid>\@len@StrMid% dernière position trop grande ?
+ \edef\@xs@Last@StrMid{\@len@StrMid}% on limite à la longueur de la chaine
+ \@xs@BadNumArg% avertissement
+ \fi
+ \@xs@MidGobble#1\@nil1\@nil% on supprime ce qu'il faut à gauche
+ \edef\@xs@result@StrMid{}% rien dans le résultat final pour l'instant
+ \expandafter\@xs@MidConcat\@xs@result@MidGobble\@nil0\@nil% on prend les caractères qu'il faut à gauche
+ \@xs@ReturnResult{\@xs@result@StrMid}{#2}%
+ \fi
+ \fi}
+
+% supprime #2 caractères à gauche dans la chaine #1
+\@xs@newmacro\StrGobbleLeft{}{2}{1}{%
+ \edef\@xs@First@StrMid{\numexpr#2+1}%
+ \@xs@StrLen{#1}[\@xs@Last@StrMid]%
+ \@xs@StrMid{#1}[\@xs@result@StrGobbleLeft]%
+ \@xs@ReturnResult{\@xs@result@StrGobbleLeft}{#3}}
+
+% extrait de #1 la chaine à gauche de longueur #2
+\@xs@newmacro\StrLeft{}{2}{1}{%
+ \edef\@xs@First@StrMid{1}%
+ \ifnum#2<0\@xs@BadNumArg\fi% avertissement
+ \edef\@xs@Last@StrMid{#2}%
+ \@xs@StrMid{#1}[\@xs@result@StrLeft]%
+ \@xs@ReturnResult{\@xs@result@StrLeft}{#3}}
+
+% supprime #2 caractères à droite dans la chaine #1
+\@xs@newmacro\StrGobbleRight{}{2}{1}{%
+ \@xs@StrLen{#1}[\@Result@Length]%
+ \ifnum#2>\@Result@Length\@xs@BadNumArg\fi% avertissement
+ \edef\@xs@First@StrMid{1}%
+ \edef\@xs@Last@StrMid{\numexpr\@Result@Length-#2}%
+ \@xs@StrMid{#1}[\@xs@result@StrGobbleRight]%
+ \@xs@ReturnResult{\@xs@result@StrGobbleRight}{#3}}
+
+% renvoie #2 caractères à la droite de la chaine #1
+\@xs@newmacro\StrRight{}{2}{1}{%
+ \ifnum#2<\z@\@xs@BadNumArg\fi% avertissement
+ \@xs@StrLen{#1}[\@xs@Last@StrMid]%
+ \edef\@xs@First@StrMid{\numexpr\@xs@Last@StrMid+1-#2}%
+ \@xs@StrMid{#1}[\@xs@result@StrRight]%
+ \@xs@ReturnResult{\@xs@result@StrRight}{#3}}
+
+\@xs@newmacro\StrChar{}{2}{1}{%
+ \@xs@def\@xs@First@StrMid{\@xs@expand#2}%
+ \@xs@def\@xs@Last@StrMid{\@xs@expand#2}%
+ \@xs@StrMid{#1}[#3]}
+
+% Combien de fois compte t-on #2 dans #1 ?
+\@xs@newmacro\StrCount{}{2}{1}{%
+ \ifx\@empty#2\@empty
+ \@xs@ArgEmpty
+ \edef\@xs@after@StrCount{}%
+ \@xs@ReturnResult{0}{#3}%
+ \else
+ \def\@xs@StrCount@i##1#2##2\@nil##3\@nil{%
+ \ifx\@empty##2\@empty
+ \ifnum\numexpr##3=\z@
+ \edef\@xs@after@StrCount{}%
+ \else
+ \edef\@xs@after@StrCount{\@xs@strip@delimit##1\@nil}%
+ \fi
+ \@xs@ReturnResult{\number\numexpr##3}{#3}%
+ \else
+ \@xs@StrCount@i##2\@nil##3+1\@nil
+ \fi}%
+ \@xs@StrCount@i#1\@delimit#2\@nil0\@nil
+ \fi}
+
+% renvoie la position de l'occurrence #1 de la sous chaine #3 dans la chaine #2
+\@xs@newmacro\StrPosition{1}{2}{1}{%
+ \ifx\@empty#3\@empty%
+ \@xs@ArgEmpty
+ \@xs@ReturnResult{0}{#4}%
+ \else
+ \@xs@IfSubStr[#1]{#2}{#3}%
+ {\expandafter\@xs@StrLen\expandafter{\@xs@before@IfSubStr}[\@xs@lenbefore@StrPosition]%
+ \@xs@ReturnResult{\number\numexpr\@xs@lenbefore@StrPosition+1}{#4}%
+ }%
+ {\@xs@ReturnResult{0}{#4}}%
+ \fi}
+% Restaure le code de @
+\catcode`\@=\CurrentAtCatcode\relax
+% Définit le délimiteur verb et le développement des arguments par défaut
+\setverbdelim{|}
+\fullexpandarg
+\endinput
+%
+% Historique
+%
+% v1.0 4/7/2008 : - Package achevé.
+% 7/7/2008 : - Package publié sur CTAN.
+%
+% v1.1 /8/2008 : - Le package ne nécessite plus LaTeX et est désormais
+% utilisable sous Plain eTeX.
+% - Ajout des macros \IfInteger et \IfDecimal
+% 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 é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ès
+% l'occurrence testée dans les sc
+% \@xs@behind@IfSubStr et \@xs@before@IfSubStr
+% \StrCount
+% a) ajout de ce qui se trouve après la dernière
+% occurrence dans la sc \@xs@after@StrCount
+% b) la macro ne dépend plus d'aucune autre \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf
index c1c836c875a..cdf1f956128 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
index 0e77624f27e..44961af495b 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
@@ -1,5 +1,19 @@
+% This is xtring_doc_en.tex, the manual of xstring
+% Christian Tellechea 2008
+%
+% 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}
-\usepackage{xstring}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[dvips,colorlinks=true,hyperfootnotes=false,citecolor=black,filecolor=black,linkcolor=blue,urlcolor=blue,bookmarks=false,pdfauthor={Christian Tellechea},pdftitle={xstring},pdfsubject={package for strings},pdfkeywords={xstring,latex,string},pdfcreator={LaTeX}]{hyperref}
@@ -12,27 +26,12 @@
\usepackage{xstring}
\usepackage[french,english]{babel}
\makeatletter
-
-\newcommand*\Exemple{\@ifstar{\def\frontiere{|}\@Ex}{\def\frontiere{}\@Ex}}
-% la macro de Ulrich Diez
-\newcommand*\@Ex{%
- \relax%
- \ifmmode\hbox\else\leavevmode\null\fi%
- \bgroup%
- \verb@eol@error%
- \let\do\@makeother\dospecials%
- \verbatim@font\@noligs%
- \@@Ex}
-\newcommand*\@@Ex[1]{%
- \@vobeyspaces\frenchspacing\
- \catcode`#1\active%
- \lccode`\~`#1%
- \gdef\verb@balance@group{\@ehc}%
- \aftergroup\verb@balance@group%
- \lowercase{%
- \let ~\verb@egroup%
- \def\@tempa##1~{\hbox to \Partage\linewidth{\hfil##1~}\quad\scantokens{\frontiere##1\frontiere}\par}}%
- \@tempa}%
+\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
+\def\@xs@afterreadverb#1{%
+ \normalexpandarg
+ \tokenize\cs@resultat{#1}%
+ \fullexpandarg
+ \hbox to\linewidth{\hbox to0.7\linewidth{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil}\par}
\makeatother
\newcommand\guill[1]{"#1"}
\newcommand\argu[1]{$\langle$\textit{#1}$\rangle$}
@@ -53,15 +52,14 @@
\renewcommand\th{${}^\text{th}$}
\begin{document}
-\gdef\Partage{0.7}
-\setlength{\parindent}{0cm}
+\setlength{\parindent}{0pt}
\begin{titlepage}
\null\par\vfill
\begin{center}
\begin{minipage}{0.75\linewidth}
\begin{center}
\Huge\bfseries xstring\par\vspace{5pt}
- \small v1.0\par\vspace{25pt}
+ \small v\xstringversion\par\vspace{25pt}
\normalsize User's manual
\end{center}
\end{minipage}
@@ -70,20 +68,21 @@
\begin{center}
Christian {\sc Tellechea}\par\small
\href{mailto:unbonpetit@gmail.com}{\nolinkurl{unbonpetit@gmail.com}}\par\vspace{5pt}
- July 6\th{} 2008
+ \xstringenglishdate
\end{center}
\vfill\hrulefill
\begin{center}
\begin{minipage}{0.85\linewidth}
\noindent
\hfill\textbf{\textit{Abstract}}\hfill{}\medskip\par
- This package groups together macros manipulating strings, such as:
+ This package which requires $\varepsilon-\TeX{}$ groups together macros manipulating strings, such as:
\setlength{\parindent}{1.5em}
\begin{itemize}
\item[$\triangleright$] tests:
\begin{itemize}
\item does a string contains at least $n$ times an another?
\item does a string starts (or ends) with another? etc.
+ \item is a string an integer? A decimal?
\end{itemize}
\item[$\triangleright$] extractions of substrings:
\begin{itemize}
@@ -99,6 +98,7 @@
\item how many times a string contains a substring?
\end{itemize}
\end{itemize}
+ \setlength{\parindent}{0pt}
\medskip
For programming purposes, other macros allow to use special characters (\verb|&|, \verb|~|, \verb|\|, \verb|{|, \verb|}|, \verb|_|, \verb|#|, \verb|$|, \verb|^| and \verb|%|) with the macros manipulating strings.
\end{minipage}
@@ -112,7 +112,7 @@
This manual is a translation of the french manual. I apologize for my poor english but I did my best, and I hope that the following is comprehensible!
\section{Presentation}
\subsection{Description}
-This extension provides macros and tests operating on strings, 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
+This extension\footnote{This extension does not require \LaTeX{} and can be compiled with Plain $\varepsilon$-\TeX{}.} provides macros and tests operating on strings, 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
Certainly, other packages exit (for example \href{http://www.ctan.org/tex-archive/macros/latex/contrib/substr/}{\nolinkurl{substr}} and \href{http://www.ctan.org/tex-archive/macros/latex/contrib/stringstrings/}{\nolinkurl{stringstrings}}), but as well as differences on features, they do not take into account occurrences so I found them too limited and difficult to use for programming.
@@ -212,13 +212,13 @@ Tests if \argu{string} contains at least \argu{number} times \argu{stringA} and
\item If \argu{string} or \argu{stringA} is empty, runs \argu{false}.
\end{Conditions}
-\Exemple|\IfSubStr{xstring}{tri}{true}{false}|
-\Exemple|\IfSubStr{xstring}{a}{true}{false}|
-\Exemple|\IfSubStr{a bc def }{c d}{true}{false}|
-\Exemple|\IfSubStr{a bc def }{cd}{true}{false}|
-\Exemple|\IfSubStr[2]{1a2a3a}{a}{true}{false}|
-\Exemple|\IfSubStr[3]{1a2a3a}{a}{true}{false}|
-\Exemple|\IfSubStr[4]{1a2a3a}{a}{true}{false}|
+\exemple|\IfSubStr{xstring}{tri}{true}{false}|
+\exemple|\IfSubStr{xstring}{a}{true}{false}|
+\exemple|\IfSubStr{a bc def }{c d}{true}{false}|
+\exemple|\IfSubStr{a bc def }{cd}{true}{false}|
+\exemple|\IfSubStr[2]{1a2a3a}{a}{true}{false}|
+\exemple|\IfSubStr[3]{1a2a3a}{a}{true}{false}|
+\exemple|\IfSubStr[4]{1a2a3a}{a}{true}{false}|
\subsubsection{IfSubStrBefore}
\verb|\IfSubStrBefore|\arguCC{number1}{number2}\ARGU{string}\ARGU{stringA}\ARGU{stringB}\ARGU{true}\ARGU{false}
@@ -234,15 +234,15 @@ In \argu{string}, tests if the \argu{number1}\th{} occurrence of \argu{stringA}
\item If one of the optional arguments is negative or zero, runs \argu{false}.
\end{Conditions}
-\Exemple|\IfSubStrBefore{xstring}{st}{in}{true}{false}|
-\Exemple|\IfSubStrBefore{xstring}{ri}{s}{true}{false}|
-\Exemple|\IfSubStrBefore{LaTeX}{LaT}{TeX}{true}{false}|
-\Exemple|\IfSubStrBefore{a bc def }{ b}{ef}{true}{false}|
-\Exemple|\IfSubStrBefore{a bc def }{ab}{ef}{true}{false}|
-\Exemple|\IfSubStrBefore[2,1]{b1b2b3}{b}{2}{true}{false}|
-\Exemple|\IfSubStrBefore[3,1]{b1b2b3}{b}{2}{true}{false}|
-\Exemple|\IfSubStrBefore[2,2]{baobab}{a}{b}{true}{false}|
-\Exemple|\IfSubStrBefore[2,3]{baobab}{a}{b}{true}{false}|
+\exemple|\IfSubStrBefore{xstring}{st}{in}{true}{false}|
+\exemple|\IfSubStrBefore{xstring}{ri}{s}{true}{false}|
+\exemple|\IfSubStrBefore{LaTeX}{LaT}{TeX}{true}{false}|
+\exemple|\IfSubStrBefore{a bc def }{ b}{ef}{true}{false}|
+\exemple|\IfSubStrBefore{a bc def }{ab}{ef}{true}{false}|
+\exemple|\IfSubStrBefore[2,1]{b1b2b3}{b}{2}{true}{false}|
+\exemple|\IfSubStrBefore[3,1]{b1b2b3}{b}{2}{true}{false}|
+\exemple|\IfSubStrBefore[2,2]{baobab}{a}{b}{true}{false}|
+\exemple|\IfSubStrBefore[2,3]{baobab}{a}{b}{true}{false}|
\subsubsection{IfSubStrBehind}
@@ -259,15 +259,15 @@ In \argu{string}, tests if the \argu{number1}\th{} occurrence of \argu{stringA}
\item If one of the optional arguments is negative or zero, runs \argu{false}.
\end{Conditions}
-\Exemple|\IfSubStrBehind{xstring}{ri}{xs}{true}{false}|
-\Exemple|\IfSubStrBehind{xstring}{s}{i}{true}{false}|
-\Exemple|\IfSubStrBehind{LaTeX}{TeX}{LaT}{true}{false}|
-\Exemple|\IfSubStrBehind{a bc def }{ d}{a}{true}{false}|
-\Exemple|\IfSubStrBehind{a bc def }{cd}{a b}{true}{false}|
-\Exemple|\IfSubStrBehind[2,1]{b1b2b3}{b}{2}{true}{false}|
-\Exemple|\IfSubStrBehind[3,1]{b1b2b3}{b}{2}{true}{false}|
-\Exemple|\IfSubStrBehind[2,2]{baobab}{b}{a}{true}{false}|
-\Exemple|\IfSubStrBehind[2,3]{baobab}{b}{a}{true}{false}|
+\exemple|\IfSubStrBehind{xstring}{ri}{xs}{true}{false}|
+\exemple|\IfSubStrBehind{xstring}{s}{i}{true}{false}|
+\exemple|\IfSubStrBehind{LaTeX}{TeX}{LaT}{true}{false}|
+\exemple|\IfSubStrBehind{a bc def }{ d}{a}{true}{false}|
+\exemple|\IfSubStrBehind{a bc def }{cd}{a b}{true}{false}|
+\exemple|\IfSubStrBehind[2,1]{b1b2b3}{b}{2}{true}{false}|
+\exemple|\IfSubStrBehind[3,1]{b1b2b3}{b}{2}{true}{false}|
+\exemple|\IfSubStrBehind[2,2]{baobab}{b}{a}{true}{false}|
+\exemple|\IfSubStrBehind[2,3]{baobab}{b}{a}{true}{false}|
\subsubsection{IfBeginWith}
@@ -280,10 +280,10 @@ Tests if \argu{string} begins with \argu{stringA}, and runs \argu{true} if so, a
\item If \argu{string} or \argu{stringA} is empty, runs \argu{false}.
\end{Conditions}
-\Exemple|\IfBeginWith{xstring}{xst}{true}{false}|
-\Exemple|\IfBeginWith{LaTeX}{a}{true}{false}|
-\Exemple|\IfBeginWith{a bc def }{a b}{true}{false}|
-\Exemple|\IfBeginWith{a bc def }{ab}{true}{false}|
+\exemple|\IfBeginWith{xstring}{xst}{true}{false}|
+\exemple|\IfBeginWith{LaTeX}{a}{true}{false}|
+\exemple|\IfBeginWith{a bc def }{a b}{true}{false}|
+\exemple|\IfBeginWith{a bc def }{ab}{true}{false}|
\subsubsection{IfEndWith}
@@ -296,10 +296,62 @@ Tests if \argu{string} ends with \argu{stringA}, and runs \argu{true} if so, and
\item If \argu{string} or \argu{stringA} is empty, runs \argu{false}.
\end{Conditions}
-\Exemple|\IfEndWith{xstring}{ring}{true}{false}|
-\Exemple|\IfEndWith{LaTeX}{a}{true}{false}|
-\Exemple|\IfEndWith{a bc def }{ef }{true}{false}|
-\Exemple|\IfEndWith{a bc def }{ef}{true}{false}|
+\exemple|\IfEndWith{xstring}{ring}{true}{false}|
+\exemple|\IfEndWith{LaTeX}{a}{true}{false}|
+\exemple|\IfEndWith{a bc def }{ef }{true}{false}|
+\exemple|\IfEndWith{a bc def }{ef}{true}{false}|
+
+\subsubsection{IfInteger}
+
+\verb|\IfInteger|\ARGU{number}\ARGU{true}\ARGU{false}
+\smallskip
+
+Tests if \argu{nombre} is an integer, and runs \argu{true} if so, and \argu{false} otherwise.\smallskip
+
+If test is false because unexpected characters, the control sequence \verb|\@xs@afterinteger| contains the illegal part of \argu{number}.\medskip
+
+\exemple|\IfInteger{13}{true}{false}|
+\exemple|\IfInteger{-219}{true}{false}|
+\exemple|\IfInteger{+9}{true}{false}|
+\exemple|\IfInteger{3.14}{true}{false}|
+\exemple|\IfInteger{0}{true}{false}|
+\exemple|\IfInteger{49a}{true}{false}|
+\exemple|\IfInteger{+}{true}{false}|
+\exemple|\IfInteger{-}{true}{false}|
+\exemple|\IfInteger{0000}{true}{false}|
+
+\subsubsection{IfDecimal}
+
+
+\verb|\IfInteger|\ARGU{number}\ARGU{true}\ARGU{false}
+\smallskip
+
+Tests if \argu{number} is a decimal, and runs \argu{true} if so, and \argu{false} otherwise.\smallskip
+
+Counters \verb|\integerpart| and \verb|\decimalpart| contain the integer part and decimal part of \argu{number}.
+
+If test is false because unexpected characters, the control sequence \verb|\@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
+
+\begin{Conditions}
+ \item Decimal separator can be a dot or a comma;
+ \item If what is on the right of decimal separator (if it exists) is empty, the test is false;
+ \item If what is on the left of decimal separator (if it exists) is empty, the integer part is assumed to be 0;
+\end{Conditions}
+
+\exemple|\IfDecimal{3.14}{vrai}{faux}|
+\exemple|\IfDecimal{3,14}{vrai}{faux}|
+\exemple|\IfDecimal{-0.5}{vrai}{faux}|
+\exemple|\IfDecimal{.7}{vrai}{faux}|
+\exemple|\IfDecimal{,9}{vrai}{faux}|
+\exemple|\IfDecimal{1..2}{vrai}{faux}|
+\exemple|\IfDecimal{+6}{vrai}{faux}|
+\exemple|\IfDecimal{-15}{vrai}{faux}|
+\exemple|\IfDecimal{1.}{vrai}{faux}|
+\exemple|\IfDecimal{2,}{vrai}{faux}|
+\exemple|\IfDecimal{.}{vrai}{faux}|
+\exemple|\IfDecimal{,}{vrai}{faux}|
+\exemple|\IfDecimal{+}{vrai}{faux}|
+\exemple|\IfDecimal{-}{vrai}{faux}|
\subsection{Extraction of substrings}
\subsubsection{StrBefore}
@@ -317,14 +369,14 @@ In \argu{string}, returns what is leftwards the \argu{number}\th{} occurrence of
\item If the occurrence is not found, an empty string is returned.
\end{Conditions}
-\Exemple*|\StrBefore{xstring}{tri}|
-\Exemple*|\StrBefore{LaTeX}{e}|
-\Exemple*|\StrBefore{LaTeX}{p}|
-\Exemple*|\StrBefore{LaTeX}{L}|
-\Exemple*|\StrBefore{a bc def }{def}|
-\Exemple*|\StrBefore{a bc def }{cd}|
-\Exemple*|\StrBefore[1]{1b2b3}{b}|
-\Exemple*|\StrBefore[2]{1b2b3}{b}|
+\exemple*|\StrBefore{xstring}{tri}|
+\exemple*|\StrBefore{LaTeX}{e}|
+\exemple*|\StrBefore{LaTeX}{p}|
+\exemple*|\StrBefore{LaTeX}{L}|
+\exemple*|\StrBefore{a bc def }{def}|
+\exemple*|\StrBefore{a bc def }{cd}|
+\exemple*|\StrBefore[1]{1b2b3}{b}|
+\exemple*|\StrBefore[2]{1b2b3}{b}|
\subsubsection{StrBehind}
@@ -342,15 +394,15 @@ In \argu{string}, returns what is rightwards the \argu{number}\th{} occurrence o
\end{Conditions}
-\Exemple*|\StrBehind{xstring}{tri}|
-\Exemple*|\StrBehind{LaTeX}{e}|
-\Exemple*|\StrBehind{LaTeX}{p}|
-\Exemple*|\StrBehind{LaTeX}{X}|
-\Exemple*|\StrBehind{a bc def }{bc}|
-\Exemple*|\StrBehind{a bc def }{cd}|
-\Exemple*|\StrBehind[1]{1b2b3}{b}|
-\Exemple*|\StrBehind[2]{1b2b3}{b}|
-\Exemple*|\StrBehind[3]{1b2b3}{b}|
+\exemple*|\StrBehind{xstring}{tri}|
+\exemple*|\StrBehind{LaTeX}{e}|
+\exemple*|\StrBehind{LaTeX}{p}|
+\exemple*|\StrBehind{LaTeX}{X}|
+\exemple*|\StrBehind{a bc def }{bc}|
+\exemple*|\StrBehind{a bc def }{cd}|
+\exemple*|\StrBehind[1]{1b2b3}{b}|
+\exemple*|\StrBehind[2]{1b2b3}{b}|
+\exemple*|\StrBehind[3]{1b2b3}{b}|
\subsubsection{StrBetween}
@@ -367,16 +419,16 @@ In \argu{string}, returns the substring between\footnote{In a strict sense, i.e.
\item If one of the optional arguments \argu{number1} ou \argu{number2} is negative or zero, an empty string is returned.
\end{Conditions}
-\Exemple*|\StrBetween{xstring}{xs}{ng}|
-\Exemple*|\StrBetween{xstring}{i}{n}|
-\Exemple*|\StrBetween{xstring}{a}{tring}|
-\Exemple*|\StrBetween{a bc def }{a}{d}|
-\Exemple*|\StrBetween{a bc def }{a }{f}|
-\Exemple*|\StrBetween{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[2,3]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[1,3]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[3,1]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[3,2]{abracadabra}{a}{bra}|
+\exemple*|\StrBetween{xstring}{xs}{ng}|
+\exemple*|\StrBetween{xstring}{i}{n}|
+\exemple*|\StrBetween{xstring}{a}{tring}|
+\exemple*|\StrBetween{a bc def }{a}{d}|
+\exemple*|\StrBetween{a bc def }{a }{f}|
+\exemple*|\StrBetween{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[2,3]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[1,3]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[3,1]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[3,2]{abracadabra}{a}{bra}|
\subsubsection{StrSubstitute}
@@ -395,16 +447,16 @@ In \argu{string}, substitute the \argu{number} first occurrences of \argu{string
\item If \argu{stringB} is empty, the occurrences of \argu{stringA}, if they exist, are deleted.
\end{Conditions}
-\Exemple|\StrSubstitute{xstring}{i}{a}|
-\Exemple|\StrSubstitute{abracadabra}{a}{o}|
-\Exemple|\StrSubstitute{abracadabra}{br}{TeX}|
-\Exemple|\StrSubstitute{LaTeX}{m}{n}|
-\Exemple|\StrSubstitute{a bc def }{ }{M}|
-\Exemple|\StrSubstitute{a bc def }{ab}{AB}|
-\Exemple|\StrSubstitute[1]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[2]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[3]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[4]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute{xstring}{i}{a}|
+\exemple|\StrSubstitute{abracadabra}{a}{o}|
+\exemple|\StrSubstitute{abracadabra}{br}{TeX}|
+\exemple|\StrSubstitute{LaTeX}{m}{n}|
+\exemple|\StrSubstitute{a bc def }{ }{M}|
+\exemple|\StrSubstitute{a bc def }{ab}{AB}|
+\exemple|\StrSubstitute[1]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[2]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[3]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[4]{a1a2a3}{a}{B}|
\subsubsection{StrDel}
@@ -422,11 +474,11 @@ Delete the \argu{number} first occurrences of \argu{stringA} in \argu{string}, e
\item If \argu{number}${}<0$ the macro behaves as if \argu{number}${}=0$;
\end{Conditions}
-\Exemple|\StrDel{abracadabra}{a}|
-\Exemple|\StrDel[1]{abracadabra}{a}|
-\Exemple|\StrDel[4]{abracadabra}{a}|
-\Exemple|\StrDel[9]{abracadabra}{a}|
-\Exemple|\StrDel{a bc def }{ }|
+\exemple|\StrDel{abracadabra}{a}|
+\exemple|\StrDel[1]{abracadabra}{a}|
+\exemple|\StrDel[4]{abracadabra}{a}|
+\exemple|\StrDel[9]{abracadabra}{a}|
+\exemple|\StrDel{a bc def }{ }|
\subsubsection{StrGobbleLeft}
@@ -441,11 +493,11 @@ In \argu{string}, delete the \argu{number} fisrt characters on the left.\medskip
\item If \argu{number}${}\geqslant{}$\argu{lengthString}, all the characters are deleted.
\end{Conditions}
-\Exemple*|\StrGobbleLeft{xstring}{2}|
-\Exemple*|\StrGobbleLeft{xstring}{9}|
-\Exemple*|\StrGobbleLeft{LaTeX}{4}|
-\Exemple*|\StrGobbleLeft{LaTeX}{-2}|
-\Exemple*|\StrGobbleLeft{a bc def }{4}|
+\exemple*|\StrGobbleLeft{xstring}{2}|
+\exemple*|\StrGobbleLeft{xstring}{9}|
+\exemple*|\StrGobbleLeft{LaTeX}{4}|
+\exemple*|\StrGobbleLeft{LaTeX}{-2}|
+\exemple*|\StrGobbleLeft{a bc def }{4}|
\subsubsection{StrLeft}
@@ -460,11 +512,11 @@ In \argu{string}, returns the \argu{number} fisrt characters on the left.\medski
\item If \argu{number}${}\geqslant{}$\argu{lengthString}, all the characters are returned.
\end{Conditions}
-\Exemple*|\StrLeft{xstring}{2}|
-\Exemple*|\StrLeft{xstring}{9}|
-\Exemple*|\StrLeft{LaTeX}{4}|
-\Exemple*|\StrLeft{LaTeX}{-2}|
-\Exemple*|\StrLeft{a bc def }{5}|
+\exemple*|\StrLeft{xstring}{2}|
+\exemple*|\StrLeft{xstring}{9}|
+\exemple*|\StrLeft{LaTeX}{4}|
+\exemple*|\StrLeft{LaTeX}{-2}|
+\exemple*|\StrLeft{a bc def }{5}|
\subsubsection{StrGobbleRight}
@@ -473,11 +525,11 @@ In \argu{string}, returns the \argu{number} fisrt characters on the left.\medski
In \argu{string}, delete the \argu{number} last characters on the right.\medskip
-\Exemple*|\StrGobbleRight{xstring}{2}|
-\Exemple*|\StrGobbleRight{xstring}{9}|
-\Exemple*|\StrGobbleRight{LaTeX}{4}|
-\Exemple*|\StrGobbleRight{LaTeX}{-2}|
-\Exemple*|\StrGobbleRight{a bc def }{4}|
+\exemple*|\StrGobbleRight{xstring}{2}|
+\exemple*|\StrGobbleRight{xstring}{9}|
+\exemple*|\StrGobbleRight{LaTeX}{4}|
+\exemple*|\StrGobbleRight{LaTeX}{-2}|
+\exemple*|\StrGobbleRight{a bc def }{4}|
\subsubsection{StrRight}
@@ -486,11 +538,11 @@ In \argu{string}, delete the \argu{number} last characters on the right.\medskip
In \argu{string}, returns the \argu{number} last characters on the right.\medskip
-\Exemple*|\StrRight{xstring}{2}|
-\Exemple*|\StrRight{xstring}{9}|
-\Exemple*|\StrRight{LaTeX}{4}|
-\Exemple*|\StrRight{LaTeX}{-2}|
-\Exemple*|\StrRight{a bc def }{5}|
+\exemple*|\StrRight{xstring}{2}|
+\exemple*|\StrRight{xstring}{9}|
+\exemple*|\StrRight{LaTeX}{4}|
+\exemple*|\StrRight{LaTeX}{-2}|
+\exemple*|\StrRight{a bc def }{5}|
\subsubsection{StrChar}
@@ -504,10 +556,10 @@ Returns the character at the position \argu{number} in \argu{string}.\medskip
\item If \argu{number}${}\leqslant0$ or if \argu{number}${}>{}$\argu{lengthString}, no character is returned.
\end{Conditions}
-\Exemple|\StrChar{xstring}{4}|
-\Exemple*|\StrChar{xstring}{9}|
-\Exemple*|\StrChar{xstring}{-5}|
-\Exemple|\StrChar{a bc def }{6}|
+\exemple|\StrChar{xstring}{4}|
+\exemple*|\StrChar{xstring}{9}|
+\exemple*|\StrChar{xstring}{-5}|
+\exemple|\StrChar{a bc def }{6}|
\subsubsection{StrMid}
@@ -525,12 +577,12 @@ In \argu{string}, returns the substring between\footnote{In the broad sense, i.e
\item If \argu{numberB}${}>{}$\argu{lengthString}, the macro behaves as if \argu{numberB}${}={}$\argu{lengthString}.
\end{Conditions}
-\Exemple|\StrMid{xstring}{2}{5}|
-\Exemple|\StrMid{xstring}{-4}{2}|
-\Exemple*|\StrMid{xstring}{5}{1}|
-\Exemple|\StrMid{xstring}{6}{15}|
-\Exemple|\StrMid{xstring}{3}{3}|
-\Exemple*|\StrMid{a bc def }{2}{7}|
+\exemple|\StrMid{xstring}{2}{5}|
+\exemple|\StrMid{xstring}{-4}{2}|
+\exemple*|\StrMid{xstring}{5}{1}|
+\exemple|\StrMid{xstring}{6}{15}|
+\exemple|\StrMid{xstring}{3}{3}|
+\exemple*|\StrMid{a bc def }{2}{7}|
\subsection{Number results}
\subsubsection{StrLen}
@@ -540,9 +592,9 @@ In \argu{string}, returns the substring between\footnote{In the broad sense, i.e
Return the length of \argu{string}.
-\Exemple|\StrLen{xstring}|
-\Exemple|\StrLen{A}|
-\Exemple|\StrLen{a bc def }|
+\exemple|\StrLen{xstring}|
+\exemple|\StrLen{A}|
+\exemple|\StrLen{a bc def }|
\subsubsection{StrCount}
@@ -555,10 +607,10 @@ Counts how many times \argu{stringA} is contained in \argu{string}.\par\medskip
\item If one at least of the arguments \argu{string} or \argu{stringA} is empty, the macro return 0.
\end{Conditions}
-\Exemple|\StrCount{abracadabra}{a}|
-\Exemple|\StrCount{abracadabra}{bra}|
-\Exemple|\StrCount{abracadabra}{tic}|
-\Exemple|\StrCount{aaaaaa}{aa}|
+\exemple|\StrCount{abracadabra}{a}|
+\exemple|\StrCount{abracadabra}{bra}|
+\exemple|\StrCount{abracadabra}{tic}|
+\exemple|\StrCount{aaaaaa}{aa}|
\subsubsection{StrPosition}
@@ -575,13 +627,13 @@ In \argu{string}, returns the position of the \argu{number}\th{} occurrence of \
\end{Conditions}
\medskip
-\Exemple|\StrPosition{xstring}{ring}|
-\Exemple|\StrPosition[4]{abracadabra}{a}|
-\Exemple|\StrPosition[2]{abracadabra}{bra}|
-\Exemple|\StrPosition[9]{abracadabra}{a}|
-\Exemple|\StrPosition{abracadabra}{z}|
-\Exemple|\StrPosition{a bc def }{d}|
-\Exemple|\StrPosition[3]{aaaaaa}{aa}|
+\exemple|\StrPosition{xstring}{ring}|
+\exemple|\StrPosition[4]{abracadabra}{a}|
+\exemple|\StrPosition[2]{abracadabra}{bra}|
+\exemple|\StrPosition[9]{abracadabra}{a}|
+\exemple|\StrPosition{abracadabra}{z}|
+\exemple|\StrPosition{a bc def }{d}|
+\exemple|\StrPosition[3]{aaaaaa}{aa}|
\section{Using the macros for programming purposes}
\label{programmation}
@@ -626,7 +678,7 @@ The reverse process of what has been seen above is to transform a \texte{10,11,1
\hfill\verb|\tokenize|\ARGU{name}\ARGU{control sequence}\hfill{}
\smallskip
-\argu{control sequence} is fully expanded if \verb|\fullexpandarg| has been called (see page~\pageref{devarg}), and expanded 1 time if \verb|\normalexpandarg| has benn called. In both cases, the expansion must be \texte{10,11,12}. Then, this \texte{10,11,12} is converted into tokens and assigned with a \verb|\def| to the control sequence \argu{name}.\medskip
+\argu{control sequence} is fully expanded if \verb|\fullexpandarg| has been called (see page~\pageref{devarg}), and is not expanded if \verb|\normalexpandarg| has benn called. In both cases, the expansion must be \texte{10,11,12}. Then, this \texte{10,11,12} is converted into tokens and assigned with a \verb|\def| to the control sequence \argu{name}.\medskip
Example:\par\medskip
\begin{minipage}[r]{0.6\linewidth}
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf
index 6208955862e..732e4f61da5 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
index 90edd773ff5..589c76dee83 100755
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
@@ -26,26 +26,12 @@
\usepackage[frenchb]{babel}
\makeatletter
-\newcommand*\Exemple{\@ifstar{\def\frontiere{|}\@Ex}{\def\frontiere{}\@Ex}}
-% la macro de Ulrich Diez
-\newcommand*\@Ex{%
- \relax%
- \ifmmode\hbox\else\leavevmode\null\fi%
- \bgroup%
- \verb@eol@error%
- \let\do\@makeother\dospecials%
- \verbatim@font\@noligs%
- \@@Ex}
-\newcommand*\@@Ex[1]{%
- \@vobeyspaces\frenchspacing\
- \catcode`#1\active%
- \lccode`\~`#1%
- \gdef\verb@balance@group{\@ehc}%
- \aftergroup\verb@balance@group%
- \lowercase{%
- \let ~\verb@egroup%
- \def\@tempa##1~{\hbox to \Partage\linewidth{\hfil##1~}\quad\scantokens{\frontiere##1\frontiere}\par}}%
- \@tempa}%
+\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
+\def\@xs@afterreadverb#1{%
+ \normalexpandarg
+ \tokenize\cs@resultat{#1}%
+ \fullexpandarg
+ \hbox to\linewidth{\hbox to0.7\linewidth{\hfil\tt#1}\quad\frontiere\cs@resultat\frontiere\hfil}\par}
\makeatother
\newcommand\guill[1]{\og{}#1\fg{}}
\newcommand\argu[1]{$\langle$\textit{#1}$\rangle$}
@@ -65,14 +51,14 @@
{\end{list}}
\begin{document}
-\gdef\Partage{0.7}
+\setlength{\parindent}{0pt}
\begin{titlepage}
\null\par\vfill
\begin{center}
\begin{minipage}{0.75\linewidth}
\begin{center}
\Huge\bfseries xstring\par\vspace{5pt}
- \small v1.0\par\vspace{25pt}
+ \small v\xstringversion\par\vspace{25pt}
\normalsize Manuel de l'utilisateur
\end{center}
\end{minipage}
@@ -81,20 +67,21 @@
\begin{center}
Christian {\sc Tellechea}\par\small
\href{mailto:unbonpetit@gmail.com}{\nolinkurl{unbonpetit@gmail.com}}\par\vspace{5pt}
- 5 juillet 2008
+ \xstringfrenchdate
\end{center}
\vfill\hrulefill
\begin{center}
\begin{minipage}{0.85\linewidth}
\noindent
\hfill\textbf{\textit{Résumé}}\hfill{}\medskip\par
- Cette extension regroupe un ensemble de macros manipulant des chaînes de caractères :
+ Cette extension qui requiert Plain $\varepsilon$-\TeX{} regroupe un ensemble de macros manipulant des chaînes de caractères :
\setlength{\parindent}{1.5em}
\begin{itemize}
\item[$\triangleright$] des tests :
\begin{itemize}
\item une chaîne en contient elle une autre au moins $n$ fois ?
\item une chaîne commence t-elle ou finit-elle par une autre ? etc.
+ \item une chaîne représente t-elle un entier relatif ? Un nombre décimal ?
\end{itemize}
\item[$\triangleright$] des extractions de chaînes :
\begin{itemize}
@@ -110,6 +97,7 @@
\item comptage du nombre d'occurrences d'une sous-chaîne dans une autre.
\end{itemize}
\end{itemize}
+ \setlength{\parindent}{0pt}
\medskip
D'autres commandes permettent de traiter les caractères spéciaux (\verb|&|, \verb|~|, \verb|\|, \verb|{|, \verb|}|, \verb|_|, \verb|#|, \verb|$|, \verb|^| et \verb|%|) de façon à les utiliser dans les arguments des macros de ce package, ce qui permet d'utiliser ces macros à fins de programmation.
\end{minipage}
@@ -122,7 +110,7 @@
\section{Présentation}
\subsection{Description}
-Cette extension regroupe des macros et des tests opérant sur des chaînes de caractères, un peu comme en disposent des langages dit \guill{évolués}. On y trouve les opérations habituelles sur les chaînes de caractères, comme par exemple : test si une chaîne en contient une autre, commence ou finit par une autre, extractions de sous-chaînes ou de caractères, calculs de position d'une sous-chaîne, calculs du nombre d'occurrences, etc.\medskip
+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 caractères, un peu comme en disposent des langages dit \guill{évolués}. On y trouve les opérations habituelles sur les chaînes de caractères, 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 ou de caractères, calculs de position d'une sous-chaîne, calculs du nombre d'occurrences, etc.\medskip
Certes d'autres packages existent (par exemple \href{http://www.ctan.org/tex-archive/macros/latex/contrib/substr/}{\nolinkurl{substr}} et \href{http://www.ctan.org/tex-archive/macros/latex/contrib/stringstrings/}{\nolinkurl{stringstrings}}), mais outre des différences notables quant aux fonctionnalités, ils ne prennent pas en charge les occurrences des sous-chaînes et me semblent soit trop limités, soit trop difficiles à utiliser pour la programmation.
@@ -222,13 +210,13 @@ Teste si \argu{chaine} contient au moins \argu{nombre} fois \argu{chaineA} et ex
\item Si \argu{chaine} ou \argu{chaineA} est vide, exécute \argu{faux}.
\end{Conditions}
-\Exemple|\IfSubStr{xstring}{tri}{vrai}{faux}|
-\Exemple|\IfSubStr{xstring}{a}{vrai}{faux}|
-\Exemple|\IfSubStr{a bc def }{c d}{vrai}{faux}|
-\Exemple|\IfSubStr{a bc def }{cd}{vrai}{faux}|
-\Exemple|\IfSubStr[2]{1a2a3a}{a}{vrai}{faux}|
-\Exemple|\IfSubStr[3]{1a2a3a}{a}{vrai}{faux}|
-\Exemple|\IfSubStr[4]{1a2a3a}{a}{vrai}{faux}|
+\exemple|\IfSubStr{xstring}{tri}{vrai}{faux}|
+\exemple|\IfSubStr{xstring}{a}{vrai}{faux}|
+\exemple|\IfSubStr{a bc def }{c d}{vrai}{faux}|
+\exemple|\IfSubStr{a bc def }{cd}{vrai}{faux}|
+\exemple|\IfSubStr[2]{1a2a3a}{a}{vrai}{faux}|
+\exemple|\IfSubStr[3]{1a2a3a}{a}{vrai}{faux}|
+\exemple|\IfSubStr[4]{1a2a3a}{a}{vrai}{faux}|
\subsubsection{IfSubStrBefore}
\verb|\IfSubStrBefore|\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
@@ -244,15 +232,15 @@ Dans \argu{chaine}, la macro teste si l'occurrence \no\argu{nombre1} de \argu{ch
\item Si l'un au moins des deux arguments optionnels est négatif ou nul, exécute \argu{faux}.
\end{Conditions}
-\Exemple|\IfSubStrBefore{xstring}{st}{in}{vrai}{faux}|
-\Exemple|\IfSubStrBefore{xstring}{ri}{s}{vrai}{faux}|
-\Exemple|\IfSubStrBefore{LaTeX}{LaT}{TeX}{vrai}{faux}|
-\Exemple|\IfSubStrBefore{a bc def }{ b}{ef}{vrai}{faux}|
-\Exemple|\IfSubStrBefore{a bc def }{ab}{ef}{vrai}{faux}|
-\Exemple|\IfSubStrBefore[2,1]{b1b2b3}{b}{2}{vrai}{faux}|
-\Exemple|\IfSubStrBefore[3,1]{b1b2b3}{b}{2}{vrai}{faux}|
-\Exemple|\IfSubStrBefore[2,2]{baobab}{a}{b}{vrai}{faux}|
-\Exemple|\IfSubStrBefore[2,3]{baobab}{a}{b}{vrai}{faux}|
+\exemple|\IfSubStrBefore{xstring}{st}{in}{vrai}{faux}|
+\exemple|\IfSubStrBefore{xstring}{ri}{s}{vrai}{faux}|
+\exemple|\IfSubStrBefore{LaTeX}{LaT}{TeX}{vrai}{faux}|
+\exemple|\IfSubStrBefore{a bc def }{ b}{ef}{vrai}{faux}|
+\exemple|\IfSubStrBefore{a bc def }{ab}{ef}{vrai}{faux}|
+\exemple|\IfSubStrBefore[2,1]{b1b2b3}{b}{2}{vrai}{faux}|
+\exemple|\IfSubStrBefore[3,1]{b1b2b3}{b}{2}{vrai}{faux}|
+\exemple|\IfSubStrBefore[2,2]{baobab}{a}{b}{vrai}{faux}|
+\exemple|\IfSubStrBefore[2,3]{baobab}{a}{b}{vrai}{faux}|
\subsubsection{IfSubStrBehind}
\verb|\IfSubStrBehind|\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
@@ -268,15 +256,15 @@ Dans \argu{chaine}, la macro teste si l'occurrence \no\argu{nombre1} de \argu{ch
\item Si l'un au moins des deux arguments optionnels est négatif ou nul, exécute \argu{faux}.
\end{Conditions}
-\Exemple|\IfSubStrBehind{xstring}{ri}{xs}{vrai}{faux}|
-\Exemple|\IfSubStrBehind{xstring}{s}{i}{vrai}{faux}|
-\Exemple|\IfSubStrBehind{LaTeX}{TeX}{LaT}{vrai}{faux}|
-\Exemple|\IfSubStrBehind{a bc def }{ d}{a}{vrai}{faux}|
-\Exemple|\IfSubStrBehind{a bc def }{cd}{a b}{vrai}{faux}|
-\Exemple|\IfSubStrBehind[2,1]{b1b2b3}{b}{2}{vrai}{faux}|
-\Exemple|\IfSubStrBehind[3,1]{b1b2b3}{b}{2}{vrai}{faux}|
-\Exemple|\IfSubStrBehind[2,2]{baobab}{b}{a}{vrai}{faux}|
-\Exemple|\IfSubStrBehind[2,3]{baobab}{b}{a}{vrai}{faux}|
+\exemple|\IfSubStrBehind{xstring}{ri}{xs}{vrai}{faux}|
+\exemple|\IfSubStrBehind{xstring}{s}{i}{vrai}{faux}|
+\exemple|\IfSubStrBehind{LaTeX}{TeX}{LaT}{vrai}{faux}|
+\exemple|\IfSubStrBehind{a bc def }{ d}{a}{vrai}{faux}|
+\exemple|\IfSubStrBehind{a bc def }{cd}{a b}{vrai}{faux}|
+\exemple|\IfSubStrBehind[2,1]{b1b2b3}{b}{2}{vrai}{faux}|
+\exemple|\IfSubStrBehind[3,1]{b1b2b3}{b}{2}{vrai}{faux}|
+\exemple|\IfSubStrBehind[2,2]{baobab}{b}{a}{vrai}{faux}|
+\exemple|\IfSubStrBehind[2,3]{baobab}{b}{a}{vrai}{faux}|
\subsubsection{IfBeginWith}
@@ -289,10 +277,10 @@ Teste si \argu{chaine} commence par \argu{chaineA}, et exécute \argu{vrai} dans
\item Si \argu{chaine} ou \argu{chaineA} est vide, exécute \argu{faux}.
\end{Conditions}
-\Exemple|\IfBeginWith{xstring}{xst}{vrai}{faux}|
-\Exemple|\IfBeginWith{LaTeX}{a}{vrai}{faux}|
-\Exemple|\IfBeginWith{a bc def }{a b}{vrai}{faux}|
-\Exemple|\IfBeginWith{a bc def }{ab}{vrai}{faux}|
+\exemple|\IfBeginWith{xstring}{xst}{vrai}{faux}|
+\exemple|\IfBeginWith{LaTeX}{a}{vrai}{faux}|
+\exemple|\IfBeginWith{a bc def }{a b}{vrai}{faux}|
+\exemple|\IfBeginWith{a bc def }{ab}{vrai}{faux}|
\subsubsection{IfEndWith}
@@ -305,10 +293,62 @@ Teste si \argu{chaine} se termine par \argu{chaineA}, et exécute \argu{vrai} da
\item Si \argu{chaine} ou \argu{chaineA} est vide, exécute \argu{faux}.
\end{Conditions}
-\Exemple|\IfEndWith{xstring}{ring}{vrai}{faux}|
-\Exemple|\IfEndWith{LaTeX}{a}{vrai}{faux}|
-\Exemple|\IfEndWith{a bc def }{ef }{vrai}{faux}|
-\Exemple|\IfEndWith{a bc def }{ef}{vrai}{faux}|
+\exemple|\IfEndWith{xstring}{ring}{vrai}{faux}|
+\exemple|\IfEndWith{LaTeX}{a}{vrai}{faux}|
+\exemple|\IfEndWith{a bc def }{ef }{vrai}{faux}|
+\exemple|\IfEndWith{a bc def }{ef}{vrai}{faux}|
+
+\subsubsection{IfInteger}
+
+\verb|\IfInteger|\ARGU{nombre}\ARGU{vrai}\ARGU{faux}
+\smallskip
+
+Teste si \argu{nombre} est un nombre entier relatif, et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\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{number}.\medskip
+
+\exemple|\IfInteger{13}{vrai}{faux}|
+\exemple|\IfInteger{-219}{vrai}{faux}|
+\exemple|\IfInteger{+9}{vrai}{faux}|
+\exemple|\IfInteger{3.14}{vrai}{faux}|
+\exemple|\IfInteger{0}{vrai}{faux}|
+\exemple|\IfInteger{49a}{vrai}{faux}|
+\exemple|\IfInteger{+}{vrai}{faux}|
+\exemple|\IfInteger{-}{vrai}{faux}|
+\exemple|\IfInteger{0000}{vrai}{faux}|
+
+\subsubsection{IfDecimal}
+
+
+\verb|\IfInteger|\ARGU{nombre}\ARGU{vrai}\ARGU{faux}
+\smallskip
+
+Teste si \argu{nombre} est un nombre décimal, et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\smallskip
+
+Les compteurs \verb|\integerpart| et \verb|\decimalpart| contiennent les parties entières et décimales de \argu{number}.
+
+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{number}, 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
+
+\begin{Conditions}
+ \item Le séparateur décimal peut être un point ou une virgule;
+ \item Si ce qui se trouve à droite du séparateur décimal s'il est présent est vide, le test est faux;
+ \item Si ce qui se trouve à gauche du séparateur décimal s'il est présent est vide, la partie entière est considérée comme étant 0.
+\end{Conditions}
+
+\exemple|\IfDecimal{3.14}{vrai}{faux}|
+\exemple|\IfDecimal{3,14}{vrai}{faux}|
+\exemple|\IfDecimal{-0.5}{vrai}{faux}|
+\exemple|\IfDecimal{.7}{vrai}{faux}|
+\exemple|\IfDecimal{,9}{vrai}{faux}|
+\exemple|\IfDecimal{1..2}{vrai}{faux}|
+\exemple|\IfDecimal{+6}{vrai}{faux}|
+\exemple|\IfDecimal{-15}{vrai}{faux}|
+\exemple|\IfDecimal{1.}{vrai}{faux}|
+\exemple|\IfDecimal{2,}{vrai}{faux}|
+\exemple|\IfDecimal{.}{vrai}{faux}|
+\exemple|\IfDecimal{,}{vrai}{faux}|
+\exemple|\IfDecimal{+}{vrai}{faux}|
+\exemple|\IfDecimal{-}{vrai}{faux}|
\subsection{Les macros renvoyant une chaîne}
\subsubsection{StrBefore}
@@ -325,14 +365,14 @@ Dans \argu{chaine}, renvoie ce qui se trouve avant l'occurrence \no\argu{nombre}
\item Si l'occurrence n'est pas trouvée, une chaîne vide est renvoyée.
\end{Conditions}
-\Exemple*|\StrBefore{xstring}{tri}|
-\Exemple*|\StrBefore{LaTeX}{e}|
-\Exemple*|\StrBefore{LaTeX}{p}|
-\Exemple*|\StrBefore{LaTeX}{L}|
-\Exemple*|\StrBefore{a bc def }{def}|
-\Exemple*|\StrBefore{a bc def }{cd}|
-\Exemple*|\StrBefore[1]{1b2b3}{b}|
-\Exemple*|\StrBefore[2]{1b2b3}{b}|
+\exemple*|\StrBefore{xstring}{tri}|
+\exemple*|\StrBefore{LaTeX}{e}|
+\exemple*|\StrBefore{LaTeX}{p}|
+\exemple*|\StrBefore{LaTeX}{L}|
+\exemple*|\StrBefore{a bc def }{def}|
+\exemple*|\StrBefore{a bc def }{cd}|
+\exemple*|\StrBefore[1]{1b2b3}{b}|
+\exemple*|\StrBefore[2]{1b2b3}{b}|
\subsubsection{StrBehind}
\verb|\StrBehind|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
@@ -348,15 +388,15 @@ Dans \argu{chaine}, renvoie ce qui se trouve après l'occurrence \no\argu{nombre
\item Si l'occurrence n'est pas trouvée, une chaîne vide est renvoyée.
\end{Conditions}
-\Exemple*|\StrBehind{xstring}{tri}|
-\Exemple*|\StrBehind{LaTeX}{e}|
-\Exemple*|\StrBehind{LaTeX}{p}|
-\Exemple*|\StrBehind{LaTeX}{X}|
-\Exemple*|\StrBehind{a bc def }{bc}|
-\Exemple*|\StrBehind{a bc def }{cd}|
-\Exemple*|\StrBehind[1]{1b2b3}{b}|
-\Exemple*|\StrBehind[2]{1b2b3}{b}|
-\Exemple*|\StrBehind[3]{1b2b3}{b}|
+\exemple*|\StrBehind{xstring}{tri}|
+\exemple*|\StrBehind{LaTeX}{e}|
+\exemple*|\StrBehind{LaTeX}{p}|
+\exemple*|\StrBehind{LaTeX}{X}|
+\exemple*|\StrBehind{a bc def }{bc}|
+\exemple*|\StrBehind{a bc def }{cd}|
+\exemple*|\StrBehind[1]{1b2b3}{b}|
+\exemple*|\StrBehind[2]{1b2b3}{b}|
+\exemple*|\StrBehind[3]{1b2b3}{b}|
\subsubsection{StrBetween}
\verb|\StrBetween|\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
@@ -373,16 +413,16 @@ Dans \argu{chaine}, renvoie ce qui se trouve entre\footnote{Au sens strict, c'es
\item Si l'un des arguments optionnels \argu{nombre1} ou \argu{nombre2} est négatif ou nul, une chaîne vide est renvoyée.
\end{Conditions}
-\Exemple*|\StrBetween{xstring}{xs}{ng}|
-\Exemple*|\StrBetween{xstring}{i}{n}|
-\Exemple*|\StrBetween{xstring}{a}{tring}|
-\Exemple*|\StrBetween{a bc def }{a}{d}|
-\Exemple*|\StrBetween{a bc def }{a }{f}|
-\Exemple*|\StrBetween{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[2,3]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[1,3]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[3,1]{a1b1a2b2a3b3}{a}{b}|
-\Exemple*|\StrBetween[3,2]{abracadabra}{a}{bra}|
+\exemple*|\StrBetween{xstring}{xs}{ng}|
+\exemple*|\StrBetween{xstring}{i}{n}|
+\exemple*|\StrBetween{xstring}{a}{tring}|
+\exemple*|\StrBetween{a bc def }{a}{d}|
+\exemple*|\StrBetween{a bc def }{a }{f}|
+\exemple*|\StrBetween{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[2,3]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[1,3]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[3,1]{a1b1a2b2a3b3}{a}{b}|
+\exemple*|\StrBetween[3,2]{abracadabra}{a}{bra}|
\subsubsection{StrSubstitute}
\verb|\StrSubstitute|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
@@ -400,16 +440,16 @@ Dans \argu{chaine}, la macro remplace les \argu{nombre} premières occurrences d
\item Si \argu{chaineB} est vide, alors les occurrences de \argu{chaineA}, si elles existent, sont supprimées.
\end{Conditions}
-\Exemple|\StrSubstitute{xstring}{i}{a}|
-\Exemple|\StrSubstitute{abracadabra}{a}{o}|
-\Exemple|\StrSubstitute{abracadabra}{br}{TeX}|
-\Exemple|\StrSubstitute{LaTeX}{m}{n}|
-\Exemple|\StrSubstitute{a bc def }{ }{M}|
-\Exemple|\StrSubstitute{a bc def }{ab}{AB}|
-\Exemple|\StrSubstitute[1]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[2]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[3]{a1a2a3}{a}{B}|
-\Exemple|\StrSubstitute[4]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute{xstring}{i}{a}|
+\exemple|\StrSubstitute{abracadabra}{a}{o}|
+\exemple|\StrSubstitute{abracadabra}{br}{TeX}|
+\exemple|\StrSubstitute{LaTeX}{m}{n}|
+\exemple|\StrSubstitute{a bc def }{ }{M}|
+\exemple|\StrSubstitute{a bc def }{ab}{AB}|
+\exemple|\StrSubstitute[1]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[2]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[3]{a1a2a3}{a}{B}|
+\exemple|\StrSubstitute[4]{a1a2a3}{a}{B}|
\subsubsection{StrDel}
\verb|\StrDel|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
@@ -426,12 +466,12 @@ Supprime les \argu{nombre} premières occurrences de \argu{chaineA} dans \argu{c
\item Si \argu{nombre}${}<0$ alors la macro se comporte comme si \argu{nombre}${}=0$;
\end{Conditions}
-\Exemple|\StrDel{abracadabra}{a}|
-\Exemple|\StrDel[1]{abracadabra}{a}|
-\Exemple|\StrDel[4]{abracadabra}{a}|
-\Exemple|\StrDel[9]{abracadabra}{a}|
-\Exemple|\StrDel{a bc def }{ }|
-\Exemple*|\StrDel{a bc def }{def}|
+\exemple|\StrDel{abracadabra}{a}|
+\exemple|\StrDel[1]{abracadabra}{a}|
+\exemple|\StrDel[4]{abracadabra}{a}|
+\exemple|\StrDel[9]{abracadabra}{a}|
+\exemple|\StrDel{a bc def }{ }|
+\exemple*|\StrDel{a bc def }{def}|
\subsubsection{StrGobbleLeft}
@@ -446,11 +486,11 @@ Dans \argu{chaine}, enlève les \argu{nombre} premiers caractères de gauche.\me
\item Si \argu{nombre}${}\geqslant{}$\argu{longueurChaine}, tous les caractères sont supprimés.
\end{Conditions}
-\Exemple*|\StrGobbleLeft{xstring}{2}|
-\Exemple*|\StrGobbleLeft{xstring}{9}|
-\Exemple*|\StrGobbleLeft{LaTeX}{4}|
-\Exemple*|\StrGobbleLeft{LaTeX}{-2}|
-\Exemple*|\StrGobbleLeft{a bc def }{4}|
+\exemple*|\StrGobbleLeft{xstring}{2}|
+\exemple*|\StrGobbleLeft{xstring}{9}|
+\exemple*|\StrGobbleLeft{LaTeX}{4}|
+\exemple*|\StrGobbleLeft{LaTeX}{-2}|
+\exemple*|\StrGobbleLeft{a bc def }{4}|
\subsubsection{StrLeft}
\verb|\StrLeft|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
@@ -464,11 +504,11 @@ Dans \argu{chaine}, renvoie la sous-chaîne de gauche de longueur \argu{nombre}.
\item Si \argu{nombre}${}\geqslant{}$\argu{longueurChaine}, tous les caractères sont retournés.
\end{Conditions}
-\Exemple*|\StrLeft{xstring}{2}|
-\Exemple*|\StrLeft{xstring}{9}|
-\Exemple*|\StrLeft{LaTeX}{4}|
-\Exemple*|\StrLeft{LaTeX}{-2}|
-\Exemple*|\StrLeft{a bc def }{5}|
+\exemple*|\StrLeft{xstring}{2}|
+\exemple*|\StrLeft{xstring}{9}|
+\exemple*|\StrLeft{LaTeX}{4}|
+\exemple*|\StrLeft{LaTeX}{-2}|
+\exemple*|\StrLeft{a bc def }{5}|
\subsubsection{StrGobbleRight}
\verb|\StrGobbleRight|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
@@ -476,11 +516,11 @@ Dans \argu{chaine}, renvoie la sous-chaîne de gauche de longueur \argu{nombre}.
Agit comme \verb|\StrGobbleLeft|, mais enlève les caractères à droite de \argu{chaine}.
-\Exemple*|\StrGobbleRight{xstring}{2}|
-\Exemple*|\StrGobbleRight{xstring}{9}|
-\Exemple*|\StrGobbleRight{LaTeX}{4}|
-\Exemple*|\StrGobbleRight{LaTeX}{-2}|
-\Exemple*|\StrGobbleRight{a bc def }{4}|
+\exemple*|\StrGobbleRight{xstring}{2}|
+\exemple*|\StrGobbleRight{xstring}{9}|
+\exemple*|\StrGobbleRight{LaTeX}{4}|
+\exemple*|\StrGobbleRight{LaTeX}{-2}|
+\exemple*|\StrGobbleRight{a bc def }{4}|
\subsubsection{StrRight}
\verb|\StrRight|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
@@ -488,11 +528,11 @@ Agit comme \verb|\StrGobbleLeft|, mais enlève les caractères à droite de \arg
Agit comme \verb|\StrLeft|, mais renvoie les caractères à la droite de \argu{chaine}.
-\Exemple*|\StrRight{xstring}{2}|
-\Exemple*|\StrRight{xstring}{9}|
-\Exemple*|\StrRight{LaTeX}{4}|
-\Exemple*|\StrRight{LaTeX}{-2}|
-\Exemple*|\StrRight{a bc def }{5}|
+\exemple*|\StrRight{xstring}{2}|
+\exemple*|\StrRight{xstring}{9}|
+\exemple*|\StrRight{LaTeX}{4}|
+\exemple*|\StrRight{LaTeX}{-2}|
+\exemple*|\StrRight{a bc def }{5}|
\subsubsection{StrChar}
\verb|\StrChar|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
@@ -505,10 +545,10 @@ Renvoie le caractère à la position \argu{nombre} dans la chaîne \argu{chaine}
\item Si \argu{nombre}${}\leqslant0$ ou si \argu{nombre}${}>{}$\argu{longueurChaine}, aucun caractère n'est renvoyé.
\end{Conditions}
-\Exemple|\StrChar{xstring}{4}|
-\Exemple*|\StrChar{xstring}{9}|
-\Exemple*|\StrChar{xstring}{-5}|
-\Exemple|\StrChar{a bc def }{6}|
+\exemple|\StrChar{xstring}{4}|
+\exemple*|\StrChar{xstring}{9}|
+\exemple*|\StrChar{xstring}{-5}|
+\exemple|\StrChar{a bc def }{6}|
\subsubsection{StrMid}
\verb|\StrMid|\ARGU{chaine}\ARGU{nombreA}\ARGU{nombreB}\arguC{nom}
@@ -525,12 +565,12 @@ Dans \argu{chaine}, renvoie la sous chaîne se trouvant entre\footnote{Au sens l
\item Si \argu{nombreB}${}>{}$\argu{longueurChaine}, alors la macro se comporte comme si \argu{nombreB}${}={}$\argu{longueurChaine}.
\end{Conditions}
-\Exemple|\StrMid{xstring}{2}{5}|
-\Exemple|\StrMid{xstring}{-4}{2}|
-\Exemple*|\StrMid{xstring}{5}{1}|
-\Exemple|\StrMid{xstring}{6}{15}|
-\Exemple|\StrMid{xstring}{3}{3}|
-\Exemple*|\StrMid{a bc def }{2}{7}|
+\exemple|\StrMid{xstring}{2}{5}|
+\exemple|\StrMid{xstring}{-4}{2}|
+\exemple*|\StrMid{xstring}{5}{1}|
+\exemple|\StrMid{xstring}{6}{15}|
+\exemple|\StrMid{xstring}{3}{3}|
+\exemple*|\StrMid{a bc def }{2}{7}|
\subsection{Les macros renvoyant des nombres}
@@ -540,9 +580,9 @@ Dans \argu{chaine}, renvoie la sous chaîne se trouvant entre\footnote{Au sens l
Renvoie la longueur de \argu{chaine}.
-\Exemple|\StrLen{xstring}|
-\Exemple|\StrLen{A}|
-\Exemple|\StrLen{a bc def }|
+\exemple|\StrLen{xstring}|
+\exemple|\StrLen{A}|
+\exemple|\StrLen{a bc def }|
\subsubsection{StrCount}
\verb|\StrCount|\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
@@ -554,10 +594,10 @@ Compte combien de fois \argu{chaineA} est contenue dans \argu{chaine}.\par\medsk
\item Si l'un au moins des arguments \argu{chaine} ou \argu{chaineA} est vide, la macro renvoie 0.
\end{Conditions}
-\Exemple|\StrCount{abracadabra}{a}|
-\Exemple|\StrCount{abracadabra}{bra}|
-\Exemple|\StrCount{abracadabra}{tic}|
-\Exemple|\StrCount{aaaaaa}{aa}|
+\exemple|\StrCount{abracadabra}{a}|
+\exemple|\StrCount{abracadabra}{bra}|
+\exemple|\StrCount{abracadabra}{tic}|
+\exemple|\StrCount{aaaaaa}{aa}|
\subsubsection{StrPosition}
\verb|\StrPosition|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
@@ -573,13 +613,13 @@ Dans \argu{chaine}, renvoie la position de l'occurrence \no\argu{nombre} de \arg
\end{Conditions}
\medskip
-\Exemple|\StrPosition{xstring}{ring}|
-\Exemple|\StrPosition[4]{abracadabra}{a}|
-\Exemple|\StrPosition[2]{abracadabra}{bra}|
-\Exemple|\StrPosition[9]{abracadabra}{a}|
-\Exemple|\StrPosition{abracadabra}{z}|
-\Exemple|\StrPosition{a bc def }{d}|
-\Exemple|\StrPosition[3]{aaaaaa}{aa}|
+\exemple|\StrPosition{xstring}{ring}|
+\exemple|\StrPosition[4]{abracadabra}{a}|
+\exemple|\StrPosition[2]{abracadabra}{bra}|
+\exemple|\StrPosition[9]{abracadabra}{a}|
+\exemple|\StrPosition{abracadabra}{z}|
+\exemple|\StrPosition{a bc def }{d}|
+\exemple|\StrPosition[3]{aaaaaa}{aa}|
\section{Utilisation des macros à des fins de programmation}
\label{programmation}
@@ -603,7 +643,7 @@ Concernant ces arguments verb, il faut tenir compte des deux points suivants :
\end{itemize}
\medskip
-Exemple :\par\medskip
+exemple :\par\medskip
\begin{minipage}[r]{0.6\linewidth}
\hfill
\begin{boxedverbatim}
@@ -623,9 +663,9 @@ Le processus inverse de ce qui a été vu au dessus consiste à transformer un \
\hfill\verb|\tokenize|\ARGU{nom}\ARGU{séquence de contrôle}\hfill{}
\smallskip
-\argu{séquence de contrôle} est développée le plus possible si l'on a invoqué \verb|\fullexpandarg| (voir page~\pageref{devarg}); elle subit un 1-développement si l'on invoque \verb|\normalexpandarg|. Dans les deux cas, le développement doit donner du \texte{10,11,12}. Ensuite, ce \texte{10,11,12} est transformé en tokens puis assigné à l 'aide d'un \verb|\def| à la séquence de contrôle \argu{nom}.\medskip
+\argu{séquence de contrôle} est développée le plus possible si l'on a invoqué \verb|\fullexpandarg| (voir page~\pageref{devarg}); elle n'est pas développée si l'on invoque \verb|\normalexpandarg|. Dans les deux cas, le développement doit donner du \texte{10,11,12}. Ensuite, ce \texte{10,11,12} est transformé en tokens puis assigné à l 'aide d'un \verb|\def| à la séquence de contrôle \argu{nom}.\medskip
-Exemple :\par\medskip
+exemple :\par\medskip
\begin{minipage}[r]{0.6\linewidth}
\hfill
\begin{boxedverbatim}
@@ -762,7 +802,7 @@ De plus, et c'est aussi le sens du message d'avertissement généré par la vers
Enfin, lors de l'utilisation de \verb|\scancs|, une espace est insérée après chaque séquence de contrôle. En effet, la primitive \verb|\detokenize| de $\varepsilon$-\TeX{} qui a été utilisée ici, insère une espace apès chaque séquence de contrôle. Il n'y a pas moyen de l'éviter.\medskip
-\subsubsection{Exemples}
+\subsubsection{exemples}
Dans l'exemple suivant, les séquences de contrôle subissent un 2-développement. \verb|\d| donne donc \verb|\b|, et \verb|\b| donne \verb|\textbf{a}\textit{b}|, et on constate bien qu'une espace est insérée après chaque séquence de contrôle. \par\medskip
\begin{minipage}[r]{0.6\linewidth}
\hfill
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_test.pdf b/Master/texmf-dist/doc/latex/xstring/xstring_test.pdf
deleted file mode 100755
index f63a66720ee..00000000000
--- a/Master/texmf-dist/doc/latex/xstring/xstring_test.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_test.tex b/Master/texmf-dist/doc/latex/xstring/xstring_test.tex
deleted file mode 100755
index fd853f16b4a..00000000000
--- a/Master/texmf-dist/doc/latex/xstring/xstring_test.tex
+++ /dev/null
@@ -1,552 +0,0 @@
-\documentclass[a4paper,10pt]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[dvips,margin=1.5cm,noheadfoot]{geometry}
-\pagestyle{empty}
-\usepackage{verbatim}
-\usepackage{listings}
-\usepackage{xstring}
-\usepackage{etex}
-
-\makeatletter
-
-\newcommand*\ExNorm{\@ifstar{\def\frontiere{|}\@Ex}{\def\frontiere{}\@Ex}}
-
-\newcommand*\@Ex{%
- \relax%
- \ifmmode\hbox\else\leavevmode\null\fi%
- \bgroup%
- \verb@eol@error%
- \let\do\@makeother\dospecials%
- \verbatim@font\@noligs%
- \@@Ex%
- }
-\newcommand*\@@Ex[1]{%
- \@vobeyspaces\frenchspacing\
- \catcode`#1\active%
- \lccode`\~`#1%
- \gdef\verb@balance@group{%
- \verb@egroup\@latex@error{\noexpand\verb commande illégale !!}%
- \@ehc%
- }%
- \aftergroup\verb@balance@group%
- \lowercase{%
- \let ~\verb@egroup%
- \everyeof{\noexpand}%
- \endlinechar=\m@ne%
- \def\@tempa##1~{%
- \hbox to \Partage\linewidth{\hfil##1~}\quad\scantokens{\frontiere##1\frontiere}\commentaire\gdef\commentaire{}%
- \par}%
- }%
- \@tempa%
-}%
-\makeatother
-
-\newcommand\chapitre[2]{\medskip{\large\textbf{#1} \texttt{\textbackslash#2}}\smallskip}
-
-\begin{document}
-\setlength{\parindent}{0pt}
-
-\begin{center}\Large{Ceci est le fichier de test de xstring}.\end{center}
-
-\gdef\Partage{0.7}
-\gdef\commentaire{}
-
-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 «|», étant entendu que «||» est une chaîne vide.\bigskip
-
-\chapitre{Le test}{IfSubStr}
-\setverbdelim{|}
-
-\ExNorm|\IfSubStr{abcdef}{cd}{vrai}{faux}|
-\ExNorm|\IfSubStr{a b c d }{b c}{vrai}{faux}|
-\ExNorm|\IfSubStr{a b c d }{bc}{vrai}{faux}|
-\ExNorm|\IfSubStr{abcdef}{}{vrai}{faux}|
-\ExNorm|\IfSubStr{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStr{aaaa}{aa}{vrai}{faux}|
-\ExNorm|\IfSubStr{a}{aa}{vrai}{faux}|
-\ExNorm|\IfSubStr{éàèï}{à}{vrai}{faux}|
-\ExNorm|\IfSubStr{éàèï}{ù}{vrai}{faux}|
-\ExNorm|\IfSubStr{ÉÀÇ}{Ç}{vrai}{faux}|
-\ExNorm|\IfSubStr{a}{}{vrai}{faux}|
-\ExNorm|\IfSubStr{}{a}{vrai}{faux}|
-\ExNorm|\IfSubStr{}{}{vrai}{faux}|
-\ExNorm|\IfSubStr[2]{abaca}{a}{vrai}{faux}|
-\ExNorm|\IfSubStr[3]{abaca}{a}{vrai}{faux}|
-\ExNorm|\IfSubStr[4]{abaca}{a}{vrai}{faux}|
-\ExNorm|\IfSubStr[-2]{abaca}{a}{vrai}{faux}|
-
-\chapitre{Le test}{IfBeginWith}
-
-\ExNorm|\IfBeginWith{abcdef}{adc}{vrai}{faux}|
-\ExNorm|\IfBeginWith{abcdef}{abcd}{vrai}{faux}|
-\ExNorm|\IfBeginWith{ a b c }{ a}{vrai}{faux}|
-\ExNorm|\IfBeginWith{a b c d}{ab}{vrai}{faux}|
-\ExNorm|\IfBeginWith{a}{a}{vrai}{faux}|
-\ExNorm|\IfBeginWith{a}{aa}{vrai}{faux}|
-\ExNorm|\IfBeginWith{éàèï}{è}{vrai}{faux}|
-\ExNorm|\IfBeginWith{éàèï}{éà}{vrai}{faux}|
-\ExNorm|\IfBeginWith{ÉÀÇ}{É}{vrai}{faux}|
-\ExNorm|\IfBeginWith{a}{}{vrai}{faux}|
-\ExNorm|\IfBeginWith{}{a}{vrai}{faux}|
-\ExNorm|\IfBeginWith{}{}{vrai}{faux}|
-
-\chapitre{Le test}{IfEndWith}
-
-\ExNorm|\IfEndWith{abcdef}{ab}{vrai}{faux}|
-\ExNorm|\IfEndWith{abcdef}{f}{vrai}{faux}|
-\ExNorm|\IfEndWith{ a b c }{c}{vrai}{faux}|
-\ExNorm|\IfEndWith{ a b c }{ }{vrai}{faux}|
-\ExNorm|\IfEndWith{a}{a}{vrai}{faux}|
-\ExNorm|\IfEndWith{a}{aa}{vrai}{faux}|
-\ExNorm|\IfEndWith{éàèï}{è}{vrai}{faux}|
-\ExNorm|\IfEndWith{éàèï}{ï}{vrai}{faux}|
-\ExNorm|\IfEndWith{ÉÀÇ}{Ç}{vrai}{faux}|
-\ExNorm|\IfEndWith{a}{}{vrai}{faux}|
-\ExNorm|\IfEndWith{}{a}{vrai}{faux}|
-\ExNorm|\IfEndWith{}{}{vrai}{faux}|
-
-\chapitre{Le test}{IfSubStrBefore}
-
-\ExNorm|\IfSubStrBefore{abcdef}{b}{e}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{abcdef}{e}{c}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{ a b c }{ }{b}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{ a b c }{ b}{c }{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{abcdef}{z}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{abcdef}{y}{z}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{abcdef}{a}{z}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{aaa}{a}{aa}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{abcdef}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{éàèï}{à}{ï}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{éàèï}{é}{à}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{ÉÀÇ}{Ç}{É}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{a}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{}{a}{b}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{a}{}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore{}{}{}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[1,1]{abacada}{d}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[1,2]{abacada}{d}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[1,3]{abacada}{d}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[1,4]{abacada}{d}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[2,1]{maman papa}{a}{p}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[2,2]{maman papa}{a}{p}{vrai}{faux}|
-\ExNorm|\IfSubStrBefore[4,2]{maman papa}{a}{p}{vrai}{faux}|
-
-\chapitre{Le test}{IfStrBehind}
-
-\ExNorm|\IfSubStrBehind{abcdef}{b}{e}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{abcdef}{e}{c}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{ a b c }{ }{b}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{ a b c }{ c}{ a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{abcdef}{z}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{abcdef}{y}{z}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{abcdef}{a}{z}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{aaa}{a}{aa}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{abcdef}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{éàèï}{ï}{à}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{éàèï}{à}{é}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{ÉÀÇ}{À}{Ç}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{a}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{}{a}{b}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{a}{}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{}{a}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind{}{}{}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[1,1]{abacada}{c}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[1,2]{abacada}{c}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[1,3]{abacada}{c}{a}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[2,1]{maman papa}{a}{p}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[3,1]{maman papa}{a}{p}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[3,2]{maman papa}{a}{p}{vrai}{faux}|
-\ExNorm|\IfSubStrBehind[4,2]{maman papa}{a}{p}{vrai}{faux}|
-
-\chapitre{La macro}{StrBefore}
-
-\ExNorm|\StrBefore{abcedef}{e}|
-\ExNorm*|\StrBefore{abcdef}{a}|
-\ExNorm*|\StrBefore{abcdef}{z}|
-\ExNorm*|\StrBefore{a b c d}{c}|
-\ExNorm*|\StrBefore{a b c d}{ }|
-\ExNorm*|\StrBefore[2]{a b c d}{ }|
-\ExNorm*|\StrBefore[3]{a b c d}{ }|
-\ExNorm*|\StrBefore[9]{a b c d}{ }|
-\ExNorm*|\StrBefore[-7]{a b c d}{ }|
-\ExNorm*|\StrBefore{abcdef}{Z}|
-\ExNorm|\StrBefore{éàèï}{è}|
-\ExNorm|\StrBefore[2]{étété}{é}|
-\ExNorm|\StrBefore{ÉÀÇ}{À}|
-\ExNorm*|\StrBefore[1]{aaaaaa}{aa}|
-\ExNorm|\StrBefore[2]{aaaaaa}{aa}|
-\ExNorm|\StrBefore[3]{aaaaaa}{aa}|
-\ExNorm*|\StrBefore[4]{aaaaaa}{aa}|
-\ExNorm*|\StrBefore{a}{}|
-\ExNorm*|\StrBefore{}{a}|
-\ExNorm*|\StrBefore{}{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrBefore{abcedef}{e}[\aa]\aa|
-\ExNorm*|\StrBefore{abcdef}{a}[\aa]\aa|
-\ExNorm*|\StrBefore{abcdef}{z}[\aa]\aa|
-\ExNorm*|\StrBefore{a b c d}{c}[\aa]\aa|
-\ExNorm*|\StrBefore{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBefore[2]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBefore[3]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBefore[9]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBefore[-7]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBefore{abcdef}{Z}[\aa]\aa|
-\ExNorm|\StrBefore{éàèï}{è}[\aa]\aa|
-\ExNorm|\StrBefore[2]{étété}{é}[\aa]\aa|
-\ExNorm|\StrBefore{ÉÀÇ}{À}[\aa]\aa|
-\ExNorm*|\StrBefore[1]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrBefore[2]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrBefore[3]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm*|\StrBefore[4]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm*|\StrBefore{a}{}[\aa]\aa|
-\ExNorm*|\StrBefore{}{a}[\aa]\aa|
-\ExNorm*|\StrBefore{}{}[\aa]\aa|
-
-\chapitre{La macro}{StrBehind}
-
-\ExNorm|\StrBehind{abcedef}{e}|
-\ExNorm*|\StrBehind{abcdef}{a}|
-\ExNorm*|\StrBehind{abcdef}{z}|
-\ExNorm*|\StrBehind{a b c d}{c}|
-\ExNorm*|\StrBehind{a b c d}{ }|
-\ExNorm*|\StrBehind[2]{a b c d}{ }|
-\ExNorm*|\StrBehind[3]{a b c d}{ }|
-\ExNorm*|\StrBehind[9]{a b c d}{ }|
-\ExNorm*|\StrBehind[-7]{a b c d}{ }|
-\ExNorm*|\StrBehind{abcdef}{Z}|
-\ExNorm|\StrBehind{éàèï}{è}|
-\ExNorm|\StrBehind{ÉÀÇ}{À}|
-\ExNorm|\StrBehind[1]{aaaaaa}{aa}|
-\ExNorm|\StrBehind[2]{aaaaaa}{aa}|
-\ExNorm*|\StrBehind[3]{aaaaaa}{aa}|
-\ExNorm*|\StrBehind[4]{aaaaaa}{aa}|
-% \ExNorm*|\StrBehind{a}{}|
-% \ExNorm*|\StrBehind{}{a}|
-% \ExNorm*|\StrBehind{}{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrBehind{abcedef}{e}[\aa]\aa|
-\ExNorm*|\StrBehind{abcdef}{a}[\aa]\aa|
-\ExNorm*|\StrBehind{abcdef}{z}[\aa]\aa|
-\ExNorm*|\StrBehind{a b c d}{c}[\aa]\aa|
-\ExNorm*|\StrBehind{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBehind[2]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBehind[3]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBehind[9]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBehind[-7]{a b c d}{ }[\aa]\aa|
-\ExNorm*|\StrBehind{abcdef}{Z}[\aa]\aa|
-\ExNorm|\StrBehind{éàèï}{è}[\aa]\aa|
-\ExNorm|\StrBehind{ÉÀÇ}{À}[\aa]\aa|
-\ExNorm|\StrBehind[1]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrBehind[2]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm*|\StrBehind[3]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm*|\StrBehind[4]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm*|\StrBehind{a}{}[\aa]\aa|
-\ExNorm*|\StrBehind{}{a}[\aa]\aa|
-\ExNorm*|\StrBehind{}{}[\aa]\aa|
-
-\chapitre{La macro}{StrBetween}
-
-\ExNorm|\StrBetween{abcdef}{b}{e}|
-\ExNorm*|\StrBetween{aZaaaaZa}{Z}{Z}|
-\ExNorm*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}|
-\ExNorm*|\StrBetween{a b c d}{a}{c}|
-\ExNorm*|\StrBetween{a b c d}{a }{ d}|
-\ExNorm*|\StrBetween{abcdef}{a}{Z}|
-\ExNorm*|\StrBetween{abcdef}{Y}{Z}|
-\ExNorm*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}|
-\ExNorm*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}|
-\ExNorm*|\StrBetween[3,4]{a b c d e f}{ }{ }|
-\ExNorm|\StrBetween[1,3]{aaaaaa}{aa}{aa}|
-\ExNorm|\StrBetween{éàèï}{é}{ï}|
-\ExNorm|\StrBetween{ÉÀÇ}{É}{Ç}|
-\ExNorm*|\StrBetween{abcdef}{a}{}|
-\ExNorm*|\StrBetween{abcdef}{}{f}|
-\ExNorm*|\StrBetween{}{a}{b}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrBetween{abcdef}{b}{e}[\aa]\aa|
-\ExNorm*|\StrBetween{aZaaaaZa}{Z}{Z}[\aa]\aa|
-\ExNorm*|\StrBetween[1,2]{aZaaaaZa}{Z}{Z}[\aa]\aa|
-\ExNorm*|\StrBetween{a b c d}{a}{c}[\aa]\aa|
-\ExNorm*|\StrBetween{a b c d}{a }{ d}[\aa]\aa|
-\ExNorm*|\StrBetween{abcdef}{a}{Z}[\aa]\aa|
-\ExNorm*|\StrBetween{abcdef}{Y}{Z}[\aa]\aa|
-\ExNorm*|\StrBetween[2,5]{aAaBaCaDa}{a}{a}[\aa]\aa|
-\ExNorm*|\StrBetween[4,1]{ab1ab2ab3ab4ab}{b}{a}[\aa]\aa|
-\ExNorm*|\StrBetween[3,4]{a b c d e f}{ }{ }[\aa]\aa|
-\ExNorm|\StrBetween[1,3]{aaaaaa}{aa}{aa}[\aa]\aa|
-\ExNorm|\StrBetween{éàèï}{é}{ï}[\aa]\aa|
-\ExNorm|\StrBetween{ÉÀÇ}{É}{Ç}[\aa]\aa|
-\ExNorm*|\StrBetween{abcdef}{a}{}[\aa]\aa|
-\ExNorm*|\StrBetween{abcdef}{}{f}[\aa]\aa|
-\ExNorm*|\StrBetween{}{a}{b}[\aa]\aa|
-
-\chapitre{La macro}{StrSubstitute}
-
-\ExNorm|\StrSubstitute{abcdef}{c}{ZZ}|
-\ExNorm|\StrSubstitute{aaaaaaa}{aa}{w}|
-\ExNorm|\StrSubstitute[0]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute[1]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute[2]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute[3]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute[4]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute[5]{abacada}{a}{.}|
-\ExNorm|\StrSubstitute{a b c d e}{ }{,}|
-\ExNorm|\StrSubstitute{a b c d e}{ }{}|
-\ExNorm|\StrSubstitute{éàèï}{è}{Z}|
-\ExNorm|\StrSubstitute{ÉÀÇ}{Ç}{c}|
-\ExNorm|\StrSubstitute{abcdef}{}{A}|
-\ExNorm|\StrSubstitute{abcdef}{}{}|
-\ExNorm*|\StrSubstitute{}{a}{b}|
-\ExNorm*|\StrSubstitute{}{}{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrSubstitute{abcdef}{c}{ZZ}[\aa]\aa|
-\ExNorm|\StrSubstitute{aaaaaaa}{aa}{w}[\aa]\aa|
-\ExNorm|\StrSubstitute[0]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute[1]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute[2]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute[3]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute[4]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute[5]{abacada}{a}{.}[\aa]\aa|
-\ExNorm|\StrSubstitute{a b c d e}{ }{,}[\aa]\aa|
-\ExNorm|\StrSubstitute{a b c d e}{ }{}[\aa]\aa|
-\ExNorm|\StrSubstitute{éàèï}{è}{Z}[\aa]\aa|
-\ExNorm|\StrSubstitute{ÉÀÇ}{Ç}{c}[\aa]\aa|
-\ExNorm|\StrSubstitute{abcdef}{}{A}[\aa]\aa|
-\ExNorm|\StrSubstitute{abcdef}{}{}[\aa]\aa|
-\ExNorm*|\StrSubstitute{}{a}{b}[\aa]\aa|
-\ExNorm*|\StrSubstitute{}{}{}[\aa]\aa|
-
-\chapitre{La macro}{StrDel}
-
-\ExNorm|\StrDel{a1a2a3a4}{a}|
-\ExNorm|\StrDel[2]{a1a2a3a4}{a}|
-\ExNorm|\StrDel[-2]{a1a2a3a4}{a}|
-\ExNorm|\StrDel[10]{a1a2a3a4}{a}|
-\ExNorm|\StrDel[3]{a b c d e}{a}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrDel{a1a2a3a4}{a}[\aa]\aa|
-\ExNorm|\StrDel[2]{a1a2a3a4}{a}[\aa]\aa|
-\ExNorm|\StrDel[-2]{a1a2a3a4}{a}[\aa]\aa|
-\ExNorm|\StrDel[10]{a1a2a3a4}{a}[\aa]\aa|
-\ExNorm|\StrDel[3]{a b c d e}{a}[\aa]\aa|
-
-\chapitre{La macro}{StrLen}
-
-
-\ExNorm|\StrLen{abcdef}|
-\ExNorm|\StrLen{a b c}|
-\ExNorm|\StrLen{ a b c }|
-\ExNorm|\StrLen{a}|
-\ExNorm|\StrLen{éàèï}|% fonctionne mal en utf8 : donne 8 au lieu de 4
-\ExNorm|\StrLen{ÉÀÇ}|% idem
-\ExNorm|\StrLen{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrLen{abcdef}[\aa]\aa|
-\ExNorm|\StrLen{a b c}[\aa]\aa|
-\ExNorm|\StrLen{ a b c }[\aa]\aa|
-\ExNorm|\StrLen{a}[\aa]\aa|
-\ExNorm|\StrLen{éàèï}[\aa]\aa|% fonctionne mal en utf8 : donne 8 au lieu de 4
-\ExNorm|\StrLen{ÉÀÇ}[\aa]\aa|% idem
-\ExNorm|\StrLen{}[\aa]\aa|
-
-\chapitre{la macro}{StrMid}
-
-\ExNorm|\StrMid{abcdef}{2}{5}|
-\ExNorm*|\StrMid{a b c d}{2}{6}|
-\ExNorm*|\StrMid{abcdef}{4}{2}|
-\ExNorm|\StrMid{abcdef}{-4}{3}|
-\ExNorm*|\StrMid{abcdef}{-4}{-1}|
-\ExNorm|\StrMid{abcdef}{-4}{20}|
-\ExNorm*|\StrMid{abcdef}{8}{10}|
-\ExNorm|\StrMid{abcdef}{2}{2}|
-\ExNorm|\StrMid{éàèï}{2}{3}|
-\ExNorm|\StrMid{ÉÀÇ}{2}{3}|
-\ExNorm|\StrMid{aaaaaa}{3}{6}|
-\ExNorm*|\StrMid{}{4}{5}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrMid{abcdef}{2}{5}[\aa]\aa|
-\ExNorm*|\StrMid{a b c d}{2}{6}[\aa]\aa|
-\ExNorm*|\StrMid{abcdef}{4}{2}[\aa]\aa|
-\ExNorm|\StrMid{abcdef}{-4}{3}[\aa]\aa|
-\ExNorm*|\StrMid{abcdef}{-4}{-1}[\aa]\aa|
-\ExNorm|\StrMid{abcdef}{-4}{20}[\aa]\aa|
-\ExNorm*|\StrMid{abcdef}{8}{10}[\aa]\aa|
-\ExNorm|\StrMid{abcdef}{2}{2}[\aa]\aa|
-\ExNorm|\StrMid{éàèï}{2}{3}[\aa]\aa|
-\ExNorm|\StrMid{ÉÀÇ}{2}{3}[\aa]\aa|
-\ExNorm|\StrMid{aaaaaa}{3}{6}[\aa]\aa|
-\ExNorm*|\StrMid{}{4}{5}[\aa]\aa|
-
-\chapitre{La macro}{StrGobbleLeft}
-
-\ExNorm|\StrGobbleLeft{abcdef}{3}|
-\ExNorm*|\StrGobbleLeft{a b c d}{3}|
-\ExNorm|\StrGobbleLeft{abcdef}{-3}|
-\ExNorm*|\StrGobbleLeft{abcdef}{9}|
-\ExNorm|\StrGobbleLeft{éàèï}{2}|
-\ExNorm|\StrGobbleLeft{ÉÀÇ}{1}|
-\ExNorm|\StrGobbleLeft{aaaaa}{4}|
-\ExNorm*|\StrGobbleLeft{}{2}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrGobbleLeft{abcdef}{3}[\aa]\aa|
-\ExNorm*|\StrGobbleLeft{a b c d}{3}[\aa]\aa|
-\ExNorm|\StrGobbleLeft{abcdef}{-3}[\aa]\aa|
-\ExNorm*|\StrGobbleLeft{abcdef}{9}[\aa]\aa|
-\ExNorm|\StrGobbleLeft{éàèï}{2}[\aa]\aa|
-\ExNorm|\StrGobbleLeft{ÉÀÇ}{1}[\aa]\aa|
-\ExNorm|\StrGobbleLeft{aaaaa}{4}[\aa]\aa|
-\ExNorm*|\StrGobbleLeft{}{2}[\aa]\aa|
-
-\chapitre{La macro}{StrGobbleRight}
-
-\ExNorm|\StrGobbleRight{abcdef}{3}|
-\ExNorm*|\StrGobbleRight{a b c d}{3}|
-\ExNorm|\StrGobbleRight{abcdef}{-3}|
-\ExNorm*|\StrGobbleRight{abcdef}{9}|
-\ExNorm|\StrGobbleRight{éàèï}{2}|
-\ExNorm|\StrGobbleRight{ÉÀÇ}{1}|
-\ExNorm|\StrGobbleRight{aaaaa}{4}|
-\ExNorm*|\StrGobbleRight{}{2}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrGobbleRight{abcdef}{3}[\aa]\aa|
-\ExNorm*|\StrGobbleRight{a b c d}{3}[\aa]\aa|
-\ExNorm|\StrGobbleRight{abcdef}{-3}[\aa]\aa|
-\ExNorm*|\StrGobbleRight{abcdef}{9}[\aa]\aa|
-\ExNorm|\StrGobbleRight{éàèï}{2}[\aa]\aa|
-\ExNorm|\StrGobbleRight{ÉÀÇ}{1}[\aa]\aa|
-\ExNorm|\StrGobbleRight{aaaaa}{4}[\aa]\aa|
-\ExNorm*|\StrGobbleRight{}{2}[\aa]\aa|
-
-\chapitre{La macro}{StrLeft}
-
-\ExNorm|\StrLeft{abcdef}{3}|
-\ExNorm*|\StrLeft{a b c d}{3}|
-\ExNorm*|\StrLeft{abcdef}{-3}|
-\ExNorm*|\StrLeft{abcdef}{9}|
-\ExNorm|\StrLeft{éàèï}{2}|
-\ExNorm|\StrLeft{ÉÀÇ}{1}|
-\ExNorm|\StrLeft{aaaaa}{4}|
-\ExNorm*|\StrLeft{}{2}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrLeft{abcdef}{3}[\aa]\aa|
-\ExNorm*|\StrLeft{a b c d}{3}[\aa]\aa|
-\ExNorm*|\StrLeft{abcdef}{-3}[\aa]\aa|
-\ExNorm*|\StrLeft{abcdef}{9}[\aa]\aa|
-\ExNorm|\StrLeft{éàèï}{2}[\aa]\aa|
-\ExNorm|\StrLeft{ÉÀÇ}{1}[\aa]\aa|
-\ExNorm|\StrLeft{aaaaa}{4}[\aa]\aa|
-\ExNorm*|\StrLeft{}{2}[\aa]\aa|
-
-\chapitre{La macro}{StrRight}
-
-\ExNorm|\StrRight{abcdef}{3}|
-\ExNorm*|\StrRight{a b c d}{3}|
-\ExNorm*|\StrRight{abcdef}{-3}|
-\ExNorm*|\StrRight{abcdef}{9}|
-\ExNorm|\StrRight{éàèï}{2}|
-\ExNorm|\StrRight{ÉÀÇ}{1}|
-\ExNorm|\StrRight{aaaaa}{4}|
-\ExNorm*|\StrRight{}{2}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrRight{abcdef}{3}[\aa]\aa|
-\ExNorm*|\StrRight{a b c d}{3}[\aa]\aa|
-\ExNorm*|\StrRight{abcdef}{-3}[\aa]\aa|
-\ExNorm*|\StrRight{abcdef}{9}[\aa]\aa|
-\ExNorm|\StrRight{éàèï}{2}[\aa]\aa|
-\ExNorm|\StrRight{ÉÀÇ}{1}[\aa]\aa|
-\ExNorm|\StrRight{aaaaa}{4}[\aa]\aa|
-\ExNorm*|\StrRight{}{2}[\aa]\aa|
-
-\chapitre{la macro}{StrChar}
-
-\ExNorm|\StrChar{abcdef}{5}|
-\ExNorm*|\StrChar{a b c d}{4}|
-\ExNorm|\StrChar{a b c d}{7}|
-\ExNorm*|\StrChar{abcdef}{10}|
-\ExNorm*|\StrChar{abcdef}{-5}|
-\ExNorm*|\StrChar{}{3}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrChar{abcdef}{5}[\aa]\aa|
-\ExNorm*|\StrChar{a b c d}{4}[\aa]\aa|
-\ExNorm|\StrChar{a b c d}{7}[\aa]\aa|
-\ExNorm*|\StrChar{abcdef}{10}[\aa]\aa|
-\ExNorm*|\StrChar{abcdef}{-5}[\aa]\aa|
-\ExNorm*|\StrChar{}{3}[\aa]\aa|
-
-\chapitre{La macro}{StrCount}
-
-\ExNorm|\StrCount{abcdef}{d}|
-\ExNorm|\StrCount{a b c d}{ }|
-\ExNorm|\StrCount{aaaaaa}{aa}|
-\ExNorm|\StrCount{étété}{é}|
-\ExNorm|\StrCount{abcdef}{Z}|
-\ExNorm|\StrCount{éàèï}{é}|
-\ExNorm|\StrCount{ÉÀÇ}{Ç}|
-\ExNorm|\StrCount{abcdef}{}|
-\ExNorm|\StrCount{}{a}|
-\ExNorm|\StrCount{}{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrCount{abcdef}{d}[\aa]\aa|
-\ExNorm|\StrCount{a b c d}{ }[\aa]\aa|
-\ExNorm|\StrCount{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrCount{étété}{é}[\aa]\aa|
-\ExNorm|\StrCount{abcdef}{Z}[\aa]\aa|
-\ExNorm|\StrCount{éàèï}{é}[\aa]\aa|
-\ExNorm|\StrCount{ÉÀÇ}{Ç}[\aa]\aa|
-\ExNorm|\StrCount{abcdef}{}[\aa]\aa|
-\ExNorm|\StrCount{}{a}[\aa]\aa|
-\ExNorm|\StrCount{}{}[\aa]\aa|
-
-\chapitre{La macro}{StrPosition}
-
-\ExNorm|\StrPosition{abcdef}{c}|
-\ExNorm|\StrPosition{abcdef}{Z}|
-\ExNorm|\StrPosition{a b c d}{ }|
-\ExNorm|\StrPosition[3]{a b c d}{ }|
-\ExNorm|\StrPosition[8]{a b c d}{ }|
-\ExNorm|\StrPosition{étété}{é}|
-\ExNorm|\StrPosition[3]{étété}{é}|
-\ExNorm|\StrPosition[5]{étété}{é}|
-\ExNorm|\StrPosition{aaaaaa}{aa}|
-\ExNorm|\StrPosition[2]{aaaaaa}{aa}|
-\ExNorm|\StrPosition[3]{aaaaaa}{aa}|
-\ExNorm|\StrPosition{éàèï}{è}|
-\ExNorm|\StrPosition{ÉÀÇ}{À}|
-\ExNorm|\StrPosition{abcdef}{}|
-\ExNorm|\StrPosition{}{a}|
-\ExNorm|\StrPosition{}{}|
-\par\bigskip Mêmes exemples avec l'argument optionnel :
-
-\ExNorm|\StrPosition{abcdef}{c}[\aa]\aa|
-\ExNorm|\StrPosition{abcdef}{Z}[\aa]\aa|
-\ExNorm|\StrPosition{a b c d}{ }[\aa]\aa|
-\ExNorm|\StrPosition[3]{a b c d}{ }[\aa]\aa|
-\ExNorm|\StrPosition[8]{a b c d}{ }[\aa]\aa|
-\ExNorm|\StrPosition{étété}{é}[\aa]\aa|
-\ExNorm|\StrPosition[3]{étété}{é}[\aa]\aa|
-\ExNorm|\StrPosition[5]{étété}{é}[\aa]\aa|
-\ExNorm|\StrPosition{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrPosition[2]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrPosition[3]{aaaaaa}{aa}[\aa]\aa|
-\ExNorm|\StrPosition{éàèï}{è}[\aa]\aa|
-\ExNorm|\StrPosition{ÉÀÇ}{À}[\aa]\aa|
-\ExNorm|\StrPosition{abcdef}{}[\aa]\aa|
-\ExNorm|\StrPosition{}{a}[\aa]\aa|
-\ExNorm|\StrPosition{}{}[\aa]\aa|
-\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/xstring/xstring.sty b/Master/texmf-dist/tex/latex/xstring/xstring.sty
index c9a7c45b588..dc5e8ef5914 100644
--- a/Master/texmf-dist/tex/latex/xstring/xstring.sty
+++ b/Master/texmf-dist/tex/latex/xstring/xstring.sty
@@ -1,704 +1,3 @@
-% __________________________________________________
-% | |
-% | |
-% | xstring v1.0 |
-% | |
-% | July, 4th 2008 |
-% | |
-% |__________________________________________________|
-%
-% This is xtring.sty
-%
-% Christian Tellechea 2008
-% 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
-%
-% This work consists of the files
-% xstring.sty (this file)
-% readme.txt
-% xstring_doc_fr.tex, xstring_doc_fr.pdf (manual in french)
-% xstring_doc_en.tex, xstring_doc_en.pdf (manual in english)
-% xstring_test.tex, xstring_test.pdf (test file)
-%
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{xstring}[2008/07/04 v1.0 Extended macros for strings. C Tellechea]
-
-% Messages pour situations particulières
-\newcommand\@xs@BadNumArg {\PackageInfo{xstring}{numerical argument out of range}}
-\newcommand\@xs@ArgNotFound {\PackageInfo{xstring}{substring not found in string}}
-\newcommand\@xs@ArgEmpty {\PackageInfo{xstring}{empty argument}}
-
-% Ouvre un groupe où les catcodes sont à 12 et à 10 pour les espaces
-% ensuite, appelle \@xs@ReadVerb qui lit un argument entre délimiteurs verb
-\newcommand\@xs@MakeVerb{% lit 1 argument et le transforme en verb
- \begingroup% groupe où les catcodes sont à 12 pour la lecture suivante
- \let\do\@makeother
- \dospecials% on entre dans le mode verb
- \obeyspaces% et on tient compte des espaces
- \@xs@ReadVerb}% et on va lire l'argument
-
-% Définit \@xs@ReadVerb qui lit un argument entre délimiteurs verb
-\newcommand\setverbdelim[1]{% définit quel est le délimiteur de verb
- \@xs@StrLen{#1}[\@len@verbdelim]%
- \ifnum\@len@verbdelim=\@ne
- \else
- \PackageWarning{xstring}{verb delimiter is not a single char}%
- \fi
- \def\@xs@ReadVerb##1#1##2#1{% lit ##2 qui est entre les délimiteurs de verb
- \endgroup% on ferme le groupe
- \@xs@afterreadverb{##2}}}% on appelle l'exécution de fin
-
-% Assigne l'argument entre délimiteur verb dans la sc #1
-\newcommand\verbtocs[1]{%
- \def\@xs@afterreadverb##1{\edef#1{##1}}%
- \@xs@MakeVerb}
-
-% A l'aide d'un pont d'\expandafter, développe d'un niveau toutes
-% les sc de #1 puis et assigne le résultat à \result
-\def\@xs@expandallonelevel#1#2\@nil{%
- \expandafter\expandafter\expandafter\def% plein d'expandafter
- \expandafter\expandafter\expandafter\result% pour développer #1 d'un niveau
- \expandafter\expandafter\expandafter{\expandafter\result#1}% et l'ajouter à \result
- \ifx\@empty#2\@empty\else\@xs@expandallonelevel#2\@nil\fi}% s'il reste des sc, on boucle
-
-% \scancs développe #3 autant de fois que spécifié en #1
-% puis le développement obtenu est verbatimisé.
-% On utilise \@xs@expandalltodepth autant de fois que #1 le spécifie
-% puis on invoque \detokenize à la fin
-\newcount\depth@scancs
-\newcommand\scancs{%
- \@ifstar%
- {\PackageWarning{xstring}{if third argument or its expansion have braces or spaces, they will be removed when scanned! Use starred \string\scancs* macro with care}%
- \def\@testornot{\@notestcs}%
- \@xs@scancs}%
- {\def\@testornot{\@testcs}%
- \@xs@scancs}}
-\newcommand\@xs@scancs[3][1]{%
-% #1 : profondeur à développer avant de verbatimiser
-% #2 : nom de la sc recevant la chaine verb
-% #3 : nom de la sc à développer et à transformer en verb
- \depth@scancs\z@
- \def\@notestcs##1\@nil{\relax}%
- \def\@testcs##1##2\@nil{%
- \ifx\@empty##2\@empty
- \else% si la séquence de contrôle n'est pas seule, on gueule
- \PackageError{xstring}{third argument or its expansion is not a single control sequence! Use \string\scancs* instead of \string\scancs (see manual).}%
- \fi}%
- \def\@xs@expandalltodepth##1\@nil{% développe de #1 niveaux toutes les sc de #3 et l'assigne à \the@result
- \def\result{}%
- \ifnum\depth@scancs<#1% tant que la profondeur de développement n'est pas atteinte
- \@testornot##1\@nil% on teste éventuellement si le développement comporte 1 seule sc
- \expandafter\@xs@expandallonelevel\the@result\@nil% on développe tout d'un niveau
- \expandafter\def\expandafter\the@result\expandafter{\result}%
- \advance\depth@scancs\@ne
- \expandafter\@xs@expandalltodepth\the@result\@nil% et on recommence
- \fi}%
- \def\the@result{#3}%
- \@xs@expandalltodepth#3\@nil
- \expandafter\def\expandafter#2\expandafter{\detokenize\expandafter{\the@result}}}
-
-% Cette macro développe #2 au maximum (ce qui doit donner du texte),
-% puis le transforme en token et l'assigne à #1
-% On ouvre un groupe dans lequel un \@nil est inséré à la fin du fichier virtuel
-% lu avec \scantokens. Ce \@nil sert à l'argument délimité de \@AssignResult
-\newcommand\tokenize[2]{%
- \begingroup
- \expandafter\@xs@def\expandafter\the@text\expandafter{#2}% on développe en accord avec \fullexpandarg ou \noexpandarg
- \def\@AssignResult##1\@nil{\def#1{##1}}% on assigne en tenant compte du \@nil qui vient de la fin du fichier virtuel
- \everyeof{\@nil}% met un \@nil à la fin du fichier virtuel
- \endlinechar\m@ne
- \expandafter\expandafter\expandafter\endgroup% on retarde la fermeture du groupe
- \expandafter\@AssignResult\scantokens\expandafter{\the@text}}% pout faire l'assignation
-
-% Macro très simple qui assigne ou affiche le résultat, selon la présence
-% ou non de #2 qui est l'argument optionnel venant en dernière position des macros
-\newcommand\@xs@ReturnResult[2]{%
- \expandafter\ifx\expandafter\@empty\detokenize{#2}\@empty% pas de nom ?
- #1% on affiche #1
- \else% il y a un nom donc
- \edef#2{#1}% on met #1 dans #3 avec edef
- \fi}
-
-% Pas d'expansion des arguments
-\newcommand\normalexpandarg{%
- \let\@xs@def\def% on définit\@call avec \def
- \let\@xs@expand\@empty}% et on neutralise \@xs@expand
-
-% Expansion des arguments
-\newcommand\fullexpandarg{%
- \let\@xs@def\edef% on définit\@call avec \edef
- \let\@xs@expand\noexpand}% et on utilise \noexpand
-
-% Cette macro interne enlève le 1er caractère de la chaine passée en argument
-\def\@xs@RemoveFirst#1[#2]{%
- \ifx\@empty#1\@empty
- \edef#2{}%
- \else
- \@xs@IfBeginWith{#1}{ }%
- {\@xs@StrBehind[1]{#1}{ }[#2]}%
- {\def\@xs@RemoveFirst@ii##1##2\@nil{\edef#2{##2}}%
- \@xs@RemoveFirst@ii#1\@nil}%
- \fi}
-
-% Cette macro interne renvoie le 1er caractère de la chaine passée en argument
-\def\@xs@ReturnFirst#1[#2]{%
- \ifx\@empty#1\@empty%
- \edef#2{}%
- \else
- \@xs@IfBeginWith{#1}{ }%
- {\edef#2{ }}%
- {\def\@xs@ReturnFirst@ii##1##2\@nil{\edef#2{##1}}%
- \@xs@ReturnFirst@ii#1\@nil}%
- \fi}
-
-% 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.
-\newcommand\@xs@expand@and@detokenize[2]{%
- \@xs@def#1{#2}% on développe #2 selon \fullexpandarg ou \normalexpandarg
- \edef#1{\detokenize\expandafter{#1}}}% puis on détokenize et on assigne à #1
-
-% Cette macro teste si une chaine (#2) en contient au moins n(#1) fois une autre (#3)
-% Pour cela, on teste "ce qu'il reste" après #2. On construit une récursivité sur le
-% compteur d'occurences \Occurrence@IfSubStr. Si "ce qu'il reste" est vide avant d'atteindre
-% l'occurence voulue, le test est négatif, sinon on poursuit par récursivité sur "ce qu'il reste"
-% jusqu'à l'occurrence voulue. Si l'on atteint l'occurrence voulue, le test est positif.
-% On utilise la séquence de contrôle non définie \@delimit pour éviter un effet
-% indésirable qui ferait que \IfSubStr{a}{aa}{V}{F} renverrait V
-\newcommand\IfSubStr{\@ifstar\@xs@IfSubStr@@\@xs@IfSubStr@}%
-\newcommand\@xs@IfSubStr@@[3][1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \edef\@call{\noexpand\@xs@IfSubStr[\@xs@expand#1]{\xsarg@a}{\xsarg@b}}%
- \@call}
-\newcommand\@xs@IfSubStr@[3][1]{%
- \@xs@def\@call{\@xs@expand\@xs@IfSubStr[#1]{#2}{#3}}%
- \@call}
-\newcount\Occurrence@IfSubStr
-\def\@xs@IfSubStr[#1]#2#3{%
-% est ce que la chaine #2 contient au moins #1 fois la sous chaine #3 ?
- \ifnum#1<\@ne% on gère les cas spéciaux
- \def\@xsresult@IfSubStr{\expandafter\@secondoftwo}% #1<1 -> on exécute #5
- \else
- \ifx\@empty#3\@empty%
- \def\@xsresult@IfSubStr{\expandafter\@secondoftwo}% si #3 est vide -> on écécute #5
- \else
- \Occurrence@IfSubStr\z@
- \def\@xs@IfSubStr@i##1#3##2\@nil{%
- \advance\Occurrence@IfSubStr\@ne
- \ifx\@empty##2\@empty%% qu'y a t-il apès la sous chaine ?
- \def\@xsresult@IfSubStr{\expandafter\@secondoftwo}% rien -> on exécute #5
- \else% si ce qu'il est reste n'est pas vide
- \ifnum\Occurrence@IfSubStr<#1% tant que le nombre d'occurrence n'est pas atteint
- \@xs@IfSubStr@i##2\@nil% on recommence
- \else
- \def\@xsresult@IfSubStr{\expandafter\@firstoftwo}% nombre d'occurrences atteint : on renvoie #4
- \fi
- \fi}%
- \@xs@IfSubStr@i#2\@delimit#3\@nil% \@delimit pour éviter le cas de \IfSubStr{a}{aa}{V}{F} qui renverrait V
- \fi
- \fi
- \@xsresult@IfSubStr}
-
-\newcommand\IfBeginWith{\@ifstar\@xs@IfBeginWith@@\@xs@IfBeginWith@}%
-\newcommand\@xs@IfBeginWith@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \@xs@expand@and@detokenize{\xsarg@b}{#2}%
- \edef\@call{\noexpand\@xs@IfBeginWith{\xsarg@a}{\xsarg@b}}
- \@call}
-\newcommand\@xs@IfBeginWith@[2]{%
- \@xs@def\@call{\@xs@expand\@xs@IfBeginWith{#1}{#2}}%
- \@call}
-\newcommand\@xs@IfBeginWith[2]{%
- \@xs@IfSubStr[1]{#1}{#2}%
- {\ifx\@empty#2\@empty%
- \def\@xs@IfBeginWith@i##1\@nil{\expandafter\@firstoftwo}% si #2 est vide, on renvoie vrai
- \else
- \def\@xs@IfBeginWith@i##1#2##2\@nil{% qu'y a t-il avant #2 ?
- \ifx\@empty##1\@empty
- \expandafter\@firstoftwo% rien, donc #2 est au début, on renvoie vrai
- \else
- \expandafter\@secondoftwo
- \fi}%
- \fi}%
- {\def\@xs@IfBeginWith@i##1\@nil{\expandafter\@secondoftwo}}% si #2 n'est pas dans #1, on renvoie faux
- \@xs@IfBeginWith@i#1\@delimit#2\@nil}
-
-\newcommand\IfEndWith{\@ifstar\@xs@IfEndWith@@\@xs@IfEndWith@}%
-\newcommand\@xs@IfEndWith@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \@xs@expand@and@detokenize{\xsarg@b}{#2}%
- \edef\@call{\noexpand\@xs@IfEndWith{\xsarg@a}{\xsarg@b}}
- \@call}
-\newcommand\@xs@IfEndWith@[2]{%
- \@xs@def\@call{\@xs@expand\@xs@IfEndWith{#1}{#2}}%
- \@call}
-\newcommand*\@xs@IfEndWith[2]{%
-% Est ce que la chaine #1 finit par la chaine #2 ?
- \@xs@IfSubStr[1]{#1}{#2}%
- {\ifx\@empty#2\@empty% si #2 est vide -> test vrai
- \def\@xs@remove@begining##1\@nil{\expandafter\@firstoftwo}%
- \else
- \def\@xs@remove@begining##1#2##2\@nil{% on isole ce qui est après #2, la chaine restante ##2
- \@xs@IfSubStr[1]{##2}{#2}% tant que #2 est dans la chaine restante..
- {\@xs@remove@begining##2\@nil}% ...on recommence
- {\ifx\@empty##2\@empty% sinon, on regarde ce qui reste
- \expandafter\@firstoftwo% rien -> test vrai
- \else
- \expandafter\@secondoftwo% quelque chose -> test faux
- \fi
- }%
- }%
- \fi}%
- {\def\@xs@remove@begining##1\@nil{\expandafter\@secondoftwo}}% si #2 n'est pas dans #1 -> test faux
- \@xs@remove@begining#2#1\@nil}
-
-\newcount\Occurrence@StrBefore
-% Renvoie ce qui est à gauche de l'occurence n°#1 de la sous chaine #3 dans la chaine #2
-\newcommand\StrBefore{\@ifstar\@xs@StrBefore@@\@xs@StrBefore@}
-\newcommand\@xs@StrBefore@@[3][1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrBefore[\@xs@expand#1]{\xsarg@a}{\xsarg@b}}{}}%
- \@call}
-\newcommand\@xs@StrBefore@[3][1]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrBefore[#1]{#2}{#3}}{}}%
- \@call}
-\def\@xs@StrBefore[#1]#2#3[#4]{%
- \ifx\@empty#3\@empty%
- \@xs@ArgNotFound% warning
- \edef\@xs@result@StrBefore{}%
- \else
- \edef\@xs@result@StrBefore{}% resultat nul pour l'instant
- \Occurrence@StrBefore\z@
- \def\@xs@StrBefore@i##1#3##2\@nil{%
- \advance\Occurrence@StrBefore\@ne% on incrémente
- \ifx\@empty##2\@empty% pas trouvé ?
- \@xs@ArgNotFound% warning
- \edef\@xs@result@StrBefore{}% renvoie vide
- \else
- \ifnum\Occurrence@StrBefore<#1% tant que c'est pas la bonne occurrence
- \edef\@xs@result@StrBefore{\@xs@result@StrBefore##1#3}% on ajoute le début au résultat final
- \@xs@StrBefore@i##2\@nil% on recommence avec la chaine restante
- \else
- \edef\@xs@result@StrBefore{\@xs@result@StrBefore##1}% on n'ajoute pas la chaine frontière #3 la dernière fois !
- \fi
- \fi}%
- \@xs@StrBefore@i#2\@delimit#3\@nil%
- \fi
- \@xs@ReturnResult{\@xs@result@StrBefore}{#4}}
-
-\newcount\Occurrence@StrBehind
-% Renvoie ce qui est à droite de l'occurence n°#1 de la sous chaine #3 dans la chaine #2
-\newcommand\StrBehind{\@ifstar\@xs@StrBehind@@\@xs@StrBehind@}
-\newcommand\@xs@StrBehind@@[3][1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrBehind[\@xs@expand#1]{\xsarg@a}{\xsarg@b}}{}}%
- \@call}
-\newcommand\@xs@StrBehind@[3][1]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrBehind[#1]{#2}{#3}}{}}%
- \@call}
-\def\@xs@StrBehind[#1]#2#3[#4]{%
- \ifx\@empty#3\@empty%
- \@xs@ArgNotFound% warning
- \edef\@xs@result@StrBehind{}%
- \else
- \Occurrence@StrBehind\z@
- \def\@xs@StrBehind@i##1#3##2\@nil{%
- \advance\Occurrence@StrBehind\@ne% on incrémente
- \ifnum\Occurrence@StrBehind<#1% tant que c'est pas la bonne occurrence
- \@xs@IfSubStr[1]{##2}{#3}% tant que la chaine restante contient #3
- {\@xs@StrBehind@i##2\@nil}% on recommence avec la chaine restante
- {\@xs@ArgNotFound% sinon, info
- \edef\@xs@result@StrBehind{}}% et on renvoie vide
- \else
- \edef\@xs@result@StrBehind{##2}% on renvoie la chaine restante
- \fi}%
- \@xs@IfSubStr[1]{#2}{#3}%
- {\@xs@StrBehind@i#2\@nil}%
- {\@xs@ArgNotFound% warning
- \edef\@xs@result@StrBehind{}}%
- \fi
- \@xs@ReturnResult{\@xs@result@StrBehind}{#4}}
-
-\newcommand\IfSubStrBefore{\@ifstar\@xs@IfSubStrBefore@@\@xs@IfSubStrBefore@}
-% est ce que l'occurrence #1 de la sous chaine #4 se trouve avant
-% l'occurrence n°#2 de la sous chaine #5 dans la chaine #3?
-\newcommand\@xs@IfSubStrBefore@@[4][1,1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \@xs@expand@and@detokenize{\xsarg@c}{#4}%
- \edef\@call{\noexpand\@xs@IfSubStrBefore[\@xs@expand#1]{\xsarg@a}{\xsarg@b}{\xsarg@c}}%
- \@call}
-\newcommand\@xs@IfSubStrBefore@[4][1,1]{%
- \@xs@def\@call{\@xs@expand\@xs@IfSubStrBefore[#1]{#2}{#3}{#4}}%
- \@call}
-\def\@xs@IfSubStrBefore[#1,#2]#3#4#5{%
- \@xs@StrPosition[#2]{#3}{#5}[\@xs@posMax@IfSubStrBefore]% on trouve les positions
- \@xs@StrPosition[#1]{#3}{#4}[\@xs@posPattern@IfSubStrBefore]%
- \ifnum\@xs@posMax@IfSubStrBefore<\@ne%
- \def\@xs@result@IfSubStrBefore{\expandafter\@secondoftwo}% si pas trouvé #5 : 0 renvoie faux
- \else
- \ifnum\@xs@posPattern@IfSubStrBefore<\@ne%
- \def\@xs@result@IfSubStrBefore{\expandafter\@secondoftwo}% si pas trouvé #4 : 0 renvoie faux
- \else
- \ifnum\@xs@posPattern@IfSubStrBefore<\@xs@posMax@IfSubStrBefore%
- \def\@xs@result@IfSubStrBefore{\expandafter\@firstoftwo}%
- \else
- \def\@xs@result@IfSubStrBefore{\expandafter\@secondoftwo}%
- \fi
- \fi
- \fi
- \@xs@result@IfSubStrBefore}
-
-% Est ce que l'occurrence #1 de la sous chaine #4 se trouve avant
-% l'occurrence n°#2 de la sous chaine #5 dans la chaine #3?
-\newcommand\IfSubStrBehind{\@ifstar\@xs@IfSubStrBehind@@\@xs@IfSubStrBehind@}
-\newcommand\@xs@IfSubStrBehind@@[4][1,1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \@xs@expand@and@detokenize{\xsarg@c}{#4}%
- \edef\@call{\noexpand\@xs@IfSubStrBehind[\@xs@expand#1]{\xsarg@a}{\xsarg@b}{\xsarg@c}}%
- \@call}
-\newcommand\@xs@IfSubStrBehind@[4][1,1]{%
- \@xs@def\@call{\@xs@expand\@xs@IfSubStrBehind[#1]{#2}{#3}{#4}}%
- \@call}
-\def\@xs@IfSubStrBehind[#1,#2]#3#4#5{%
- \@xs@StrPosition[#2]{#3}{#5}[\@xs@posMax@IfSubStrBehind]% on trouve les positions
- \@xs@StrPosition[#1]{#3}{#4}[\@xs@posPattern@IfSubStrBehind]%
- \ifnum\@xs@posMax@IfSubStrBehind<1\relax%
- \def\@xs@result@IfSubStrBehind{\expandafter\@secondoftwo}% si pas trouvé : 0 renvoie faux
- \else
- \ifnum\@xs@posPattern@IfSubStrBehind<1%
- \def\@xs@result@IfSubStrBehind{\expandafter\@secondoftwo}% si pas trouvé : 0 renvoie faux
- \else
- \ifnum\@xs@posPattern@IfSubStrBehind>\@xs@posMax@IfSubStrBehind%
- \def\@xs@result@IfSubStrBehind{\expandafter\@firstoftwo}%
- \else
- \def\@xs@result@IfSubStrBehind{\expandafter\@secondoftwo}%
- \fi
- \fi
- \fi
- \@xs@result@IfSubStrBehind}
-
-\newcount\Gobble@StrBetween
-% Renvoie ce qui est strictement compris entre les occurrences n°#1 et n°#2
-% des chaines #4 et #5 dans la chaine #3
-\newcommand\StrBetween{\@ifstar\@xs@StrBetween@@\@xs@StrBetween@}
-\newcommand\@xs@StrBetween@@[4][1,1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \@xs@expand@and@detokenize{\xsarg@c}{#4}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrBetween[\@xs@expand#1]{\xsarg@a}{\xsarg@b}{\xsarg@c}}{}}%
- \@call}
-\newcommand\@xs@StrBetween@[4][1,1]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrBetween[#1]{#2}{#3}{#4}}{}}%
- \@call}
-\def\@xs@StrBetween[#1,#2]#3#4#5[#6]{%
- \ifx\@empty#5\@empty%
- \edef\@xs@StringBefore@StrBetween{}%
- \else
- \@xs@StrBefore[#2]{#3}{#5}[\@xs@StringBefore@StrBetween]% on extrait ce qui est à gauche de l'occurrence de #5
- \@xs@StrPosition[#1]{#3}{#4}[\@xs@Pos@StrBetween]% position de l'occurrence de #3
- \Gobble@StrBetween\@xs@Pos@StrBetween%
- \@xs@StrLen{#4}[\@xs@Pos@StrBetween]%
- \advance\Gobble@StrBetween\@xs@Pos@StrBetween% on lui ajoute la longueur de #3
- \advance\Gobble@StrBetween\m@ne% et on enlève 1
- \expandafter\expandafter\expandafter\@xs@StrGobbleLeft%
- \expandafter\expandafter\expandafter{\expandafter\@xs@StringBefore@StrBetween\expandafter}%
- \expandafter{\Gobble@StrBetween}[\@xs@result@StrBetween]% pour manger ce nombre de caractère au début de \@xs@StringBefore@StrBetween
- \fi
- \@xs@ReturnResult{\@xs@result@StrBetween}{#6}}
-
-\newcount\Occurrence@StrSubstitute
-% Remplace les #1 premières occurences de la chaine #3
-% par la chaine #4 dans la chaine #2
-\newcommand\StrSubstitute{\@ifstar\@xs@StrSubstitute@@\@xs@StrSubstitute@}
-\newcommand\@xs@StrSubstitute@@[4][0]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \@xs@expand@and@detokenize{\xsarg@c}{#4}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrSubstitute[\@xs@expand#1]{\xsarg@a}{\xsarg@b}{\xsarg@c}}{}}%
- \@call}
-\newcommand\@xs@StrSubstitute@[4][0]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrSubstitute[#1]{#2}{#3}{#4}}{}}%
- \@call}
-\def\@xs@StrSubstitute[#1]#2#3#4[#5]{%
- \Occurrence@StrSubstitute\z@
- \ifx\@empty#3\@empty% si #3 est vide, on ne fait rien
- \@xs@ArgEmpty% warning
- \edef\@result@StrSubstitute{#2}%
- \else
- \edef\@result@StrSubstitute{}% on initialise à vide, histoire d'enlever le statut undefined
- \def\@xs@StrSubstitute@i##1#3##2\@nil{%
- \edef\@result@StrSubstitute{\@result@StrSubstitute##1#4}% on recopie jusqu'à la 1ere occurrence, et on remplace #3 par #4
- \ifnum#1>\z@% si on compte les occurrences
- \advance\Occurrence@StrSubstitute\@ne% on incrémente le compteur
- \@xs@IfSubStr[1]{##2}{#3}% tant que la chaine restante contient #3
- {\ifnum\Occurrence@StrSubstitute<#1% tant qu'on n'a pas atteint la bonne occurrence,
- \@xs@StrSubstitute@i##2\@nil% on recommence
- \else
- \edef\@result@StrSubstitute{\@result@StrSubstitute##2}% l'occurrence est atteinte : on rajoute ce qui reste
- \fi}%
- {\edef\@result@StrSubstitute{\@result@StrSubstitute##2}}% si on ne peut plus substituter, on rajoute ce qui reste
- \else% ici , on ne compte pas les occurrences, donc...
- \@xs@IfSubStr[1]{##2}{#3}% ...tant que la chaine restante contient #3
- {\@xs@StrSubstitute@i##2\@nil}% on recommence
- {\edef\@result@StrSubstitute{\@result@StrSubstitute##2}}% si on ne peut plus substituter, on rajoute ce qui reste
- \fi}%
- \@xs@IfSubStr[1]{#2}{#3}%
- {\@xs@StrSubstitute@i#2\@nil}% si #2 contient #3, on exécute la macro
- {\edef\@result@StrSubstitute{#2}}% sinon, on renvoie la chaine #2
- \fi
- \@xs@ReturnResult{\@result@StrSubstitute}{#5}}
-
-% Supprime les #1 premières occurrences de #3 dans #2
-\newcommand\StrDel{\@ifstar\@xs@StrDel@@\@xs@StrDel@}
-\newcommand\@xs@StrDel@@[3][0]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrSubstitute[\@xs@expand#1]{\xsarg@a}{\xsarg@b}{}}{}}%
- \@call}
-\newcommand\@xs@StrDel@[3][0]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrSubstitute[#1]{#2}{#3}{}}{}}%
- \@call}
-
-\newcount\Length@StrLen
-% Compte combien de caractères contient la chaine #1 ?
-\newcommand\StrLen{\@ifstar\@xs@StrLen@@\@xs@StrLen@}
-\newcommand\@xs@StrLen@@[1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrLen{\xsarg@a}}{}}%
- \@call}
-\newcommand\@xs@StrLen@[1]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrLen{#1}}{}}%
- \@call}
-% Macro qui compte le nombre de caractères de son argument #1
-\def\@xs@StrLen@i#1\@nil{%
- \ifx\@empty#1\@empty% tant que #1 n'est pas vide ...
- \else
- \advance\Length@StrLen\@ne% ...on ajoute 1 à la longueur
- \@xs@IfBeginWith{#1}{ }% et on recommence après avoir enlevé le 1er caractère (on distingue le cas où c'est un espace)
- {\@xs@StrBehind[1]{#1}{ }[\@xs@result@StrLen]%
- \expandafter\@xs@StrLen@i\@xs@result@StrLen\@nil}%
- {\expandafter\@xs@StrLen@i\@xs@RemoveFirst@StrLen#1\@nil\@nil}%
- \fi}%
-% Macro qui enlève le 1er caractère de son argument
-\def\@xs@RemoveFirst@StrLen#1#2\@nil{#2}%
-% Macro principale
-\def\@xs@StrLen#1[#2]{%
-% Renvoie la longueur de la chaine #1
- \Length@StrLen\z@
- \@xs@StrLen@i#1\@nil%
- \expandafter\@xs@ReturnResult\expandafter{\the\Length@StrLen}{#2}}
-
-\newcount\Position@StrMid
-\newcommand\StrMid{\@ifstar\@xs@StrMid@@\@xs@StrMid@}
-\newcommand\@xs@StrMid@@[3]{%
- \edef\@StrMid@First{\@xs@expand#2}\edef\@StrMid@Last{\@xs@expand#3}% position début et fin
- \ifnum#2>#3\@xs@BadNumArg\fi
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrMid{\xsarg@a}}{}}%
- \@call}
-\newcommand\@xs@StrMid@[3]{%
- \edef\@StrMid@First{\@xs@expand#2}\edef\@StrMid@Last{\@xs@expand#3}% position début et fin
- \ifnum#2>#3\@xs@BadNumArg\fi
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrMid{#1}}{}}%
- \@call}
-% cette sous macro supprime le nombre de caractère nécessaires
-% à la gauche de son argument, et renvoie le résultat dans \@result@Mid@Gobble
-\def\@xs@Mid@Gobble#1\@nil{% enlève #2 caractères à gauche de ##1
- \advance\Position@StrMid\@ne
- \ifnum\Position@StrMid=\@StrMid@First% si on a atteint la position
- \edef\@result@Mid@Gobble{#1}% on renvoie ce qui reste
- \else% sinon
- \@xs@RemoveFirst{#1}[\@Mid@remain]% on enlève un caractère
- \expandafter\@xs@Mid@Gobble\@Mid@remain\@nil% et on recommence
- \fi}%
-% cette sous macro prend le nombre de caractères nécessaires
-% à la gauche de son argument, et renvoie le résultat dans \@final@Result
-\def\@xs@Mid@Concat#1\@nil{%
- \@xs@ReturnFirst{#1}[\@Char@to@add]% prend le 1er caractère
- \edef\@final@Result{\@final@Result\@Char@to@add}% l'ajoute au résultat final
- \@xs@RemoveFirst{#1}[\@remain@StrMid]% puis l'enlève de la chaine
- \ifnum\Position@StrMid<\@StrMid@Last% si pas encore fini
- \advance\Position@StrMid\@ne% on incrémente et
- \expandafter\@xs@Mid@Concat\@remain@StrMid\@nil% on recommence
- \fi}%
-\def\@xs@StrMid#1[#2]{%
-% renvoie la sous chaine de #1 comprise entre les positions \@StrMid@First et \@StrMid@Last
- \@xs@StrLen{#1}[\@len@StrMid]%
- \ifnum\@StrMid@First>\@StrMid@Last% mauvais ordre ?
- \@xs@ReturnResult{}{#2}% on renvoie rien
- \else
- \ifnum\@StrMid@Last<\@ne% si position fin trop petite
- \@xs@ReturnResult{}{#2}% on renvoie rien
- \else
- \ifnum\@StrMid@First<\@ne% 1ère position trop petite ?
- \edef\@StrMid@First{1}% on limite à 1
- \@xs@BadNumArg% avertissement
- \fi
- \ifnum\@StrMid@Last>\@len@StrMid% dernière position trop grande ?
- \edef\@StrMid@Last{\@len@StrMid}% on limite à la longueur de la chaine
- \@xs@BadNumArg% avertissement
- \fi
- \Position@StrMid\z@
- \@xs@Mid@Gobble#1\@nil% on supprime ce qu'il faut à gauche
- \edef\@final@Result{}% rien dans le résultat final pour l'instant
- \expandafter\@xs@Mid@Concat\@result@Mid@Gobble\@nil% on prend les caractères qu'il faut à gauche
- \expandafter\@xs@ReturnResult\expandafter{\@final@Result}{#2}%
- \fi
- \fi}
-
-\newcommand\StrGobbleLeft{\@ifstar\@xs@StrGobbleLeft@@\@xs@StrGobbleLeft@}
-% supprime #2 caractères à gauche dans la chaine #1
-\newcommand\@xs@StrGobbleLeft@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrGobbleLeft{\xsarg@a}{\@xs@expand#2}}{}}%
- \@call}
-\newcommand\@xs@StrGobbleLeft@[2]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrGobbleLeft{#1}{#2}}{}}%
- \@call}
-\def\@xs@StrGobbleLeft#1#2[#3]{%
- \edef\@StrMid@First{\numexpr#2+1}%
- \@xs@StrLen{#1}[\@StrMid@Last]%
- \@xs@StrMid{#1}[\@xs@result@StrGobbleLeft]%
- \@xs@ReturnResult{\@xs@result@StrGobbleLeft}{#3}}
-
-% extrait de #1 la chaine à gauche de longueur #2
-\newcommand\StrLeft{\@ifstar\@xs@StrLeft@@\@xs@StrLeft@}
-\newcommand\@xs@StrLeft@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrLeft{\xsarg@a}{\@xs@expand#2}}{}}%
- \@call}
-\newcommand\@xs@StrLeft@[2]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrLeft{#1}{#2}}{}}%
- \@call}
-\def\@xs@StrLeft#1#2[#3]{%
- \edef\@StrMid@First{1}%
- \ifnum#2<0\@xs@BadNumArg\fi% avertissement
- \edef\@StrMid@Last{#2}%
- \@xs@StrMid{#1}[\@xs@result@@StrLeft]%
- \@xs@ReturnResult{\@xs@result@@StrLeft}{#3}}
-
-% supprime #2 caractères à droite dans la chaine #1
-\newcommand\StrGobbleRight{\@ifstar\@xs@StrGobbleRight@@\@xs@StrGobbleRight@}
-\newcommand\@xs@StrGobbleRight@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrGobbleRight{\xsarg@a}{\@xs@expand#2}}{}}%
- \@call}
-\newcommand\@xs@StrGobbleRight@[2]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrGobbleRight{#1}{#2}}{}}%
- \@call}
-\def\@xs@StrGobbleRight#1#2[#3]{%
- \@xs@StrLen{#1}[\@Result@Length]%
- \ifnum#2>\@Result@Length\@xs@BadNumArg\fi% avertissement
- \edef\@StrMid@First{1}%
- \edef\@StrMid@Last{\numexpr\@Result@Length-#2}%
- \@xs@StrMid{#1}[\@xs@result@StrGobbleRight]%
- \@xs@ReturnResult{\@xs@result@StrGobbleRight}{#3}}
-
-% renvoie #2 caractères à la droite de la chaine #1
-\newcommand\StrRight{\@ifstar\@xs@StrRight@@\@xs@StrRight@}
-\newcommand\@xs@StrRight@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrRight{\xsarg@a}{#2}}{}}%
- \@call}
-\newcommand\@xs@StrRight@[2]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrRight{#1}{#2}}{}}%
- \@call}
-\def\@xs@StrRight#1#2[#3]{%
- \ifnum#2<0\@xs@BadNumArg\fi% avertissement
- \@xs@StrLen{#1}[\@StrMid@Last]%
- \edef\@StrMid@First{\numexpr\@StrMid@Last+1-#2}%
- \@xs@StrMid{#1}[\@xs@result@StrMid]%
- \@xs@ReturnResult{\@xs@result@StrMid}{#3}}
-
-\newcommand\StrChar{\@ifstar\@xs@StrChar@@\@xs@StrChar@}
-\newcommand\@xs@StrChar@@[2]{%
- \edef\@StrMid@First{\@xs@expand#2}\edef\@StrMid@Last{\@xs@expand#2}%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrMid{\xsarg@a}}{}}%
- \@call}
-\newcommand\@xs@StrChar@[2]{%
- \edef\@StrMid@First{\@xs@expand#2}\edef\@StrMid@Last{\@xs@expand#2}%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrMid{#1}}{}}%
- \@call}%
-
-\newcount\Occurrence@StrCount
-% Combien de fois compte t-on #2 dans #1 ?
-\newcommand\StrCount{\@ifstar\@xs@StrCount@@\@xs@StrCount@}
-\newcommand\@xs@StrCount@@[2]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#1}%
- \@xs@expand@and@detokenize{\xsarg@b}{#2}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrCount{\xsarg@a}{\xsarg@b}}{}}%
- \@call}
-\newcommand\@xs@StrCount@[2]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrCount{#1}{#2}}{}}%
- \@call}
-\def\@xs@StrCount#1#2[#3]{%
- \Occurrence@StrCount\z@% on initialise à 0
- \def\@xs@StrCount@i{%
- \advance\Occurrence@StrCount\@ne% occurrence := occurrence +1
- \@xs@StrPosition[\the\Occurrence@StrCount]{#1}{#2}[\@xs@Pos@StrCount]% position de l'occurrence ?
- \ifnum\@xs@Pos@StrCount=\z@% si l'occurrence n'est pas trouvée
- \advance\Occurrence@StrCount\m@ne% on enlève 1 au compteur
- \@xs@ReturnResult{\the\Occurrence@StrCount}{#3}% et on renvoie ce résultat
- \else
- \@xs@StrCount@i% si l'occurrence est trouvée, on recommence
- \fi}%
- \@xs@StrCount@i}
-
-\newcount\Position@StrPosition
-% renvoie la position de l'occurrence #1 de la sous chaine #3 dans la chaine #2
-\newcommand\StrPosition{\@ifstar\@xs@StrPosition@@\@xs@StrPosition@}
-\newcommand\@xs@StrPosition@@[3][1]{%
- \@xs@expand@and@detokenize{\xsarg@a}{#2}%
- \@xs@expand@and@detokenize{\xsarg@b}{#3}%
- \edef\@call{\noexpand\@testopt{\noexpand\@xs@StrPosition[\@xs@expand#1]{\xsarg@a}{\xsarg@b}}{}}%
- \@call}
-\newcommand\@xs@StrPosition@[3][1]{%
- \@xs@def\@call{\@xs@expand\@testopt{\@xs@expand\@xs@StrPosition[#1]{#2}{#3}}{}}%
- \@call}
-\def\@xs@StrPosition[#1]#2#3[#4]{%
- \Position@StrPosition\z@
- \ifx\@empty#3\@empty%
- \else
- \@xs@StrBefore[#1]{#2}{#3}[\@xs@result@StrPosition]% on extrait la chaine avant l'occurrence de #3
- \expandafter\@xs@StrLen\expandafter{\@xs@result@StrPosition}[\@xs@len@StrPosition]%
- \Position@StrPosition\@xs@len@StrPosition%
- \advance\Position@StrPosition\@ne% \@xs@len@StrPosition+1 est le résultat à priori...
- \ifnum\@xs@len@StrPosition=\z@% ... mais si la position vaut 0, soit #3 est au début de #2, soit #3 n'est pas trouvé. On lève le doute ci dessous
- \Position@StrPosition\z@% on considère que l'occurrence de #3 n'est pas trouvée, mais...
- \ifnum#1=\@ne% si on teste la 1ère occurrence
- \@xs@IfBeginWith{#2}{#3}% et que le #2 commence par #3,
- {\Position@StrPosition\@ne}% c'est le seul cas où on renvoie 1
- {}%
- \fi
- \fi
- \fi
- \expandafter\@xs@ReturnResult\expandafter{\the\Position@StrPosition}{#4}}
-
-% Définit le délimiteur verb et le développement des arguments par défaut
-\AtBeginDocument{\setverbdelim{|}\fullexpandarg}
+\ProvidesPackage{xstring}
+\input xstring.tex
\endinput
-%
-% Historique :
-%
-% 5/7/2008 : premiere sortie de ce package \ No newline at end of file