From 596484dfdaa714a68b70527f186721a49cd47577 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 15 Aug 2008 22:50:14 +0000 Subject: xstring 1.1 (15aug08) git-svn-id: svn://tug.org/texlive/trunk@10365 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/xstring/README | 16 +- Master/texmf-dist/doc/latex/xstring/test_etex.pdf | Bin 0 -> 27969 bytes Master/texmf-dist/doc/latex/xstring/test_etex.tex | 488 ++++++++++++++ Master/texmf-dist/doc/latex/xstring/test_latex.pdf | Bin 0 -> 47805 bytes Master/texmf-dist/doc/latex/xstring/test_latex.tex | 562 ++++++++++++++++ Master/texmf-dist/doc/latex/xstring/xstring.tex | 645 +++++++++++++++++++ .../doc/latex/xstring/xstring_doc_en.pdf | Bin 169550 -> 173436 bytes .../doc/latex/xstring/xstring_doc_en.tex | 348 +++++----- .../doc/latex/xstring/xstring_doc_fr.pdf | Bin 180189 -> 184363 bytes .../doc/latex/xstring/xstring_doc_fr.tex | 338 +++++----- .../texmf-dist/doc/latex/xstring/xstring_test.pdf | Bin 45911 -> 0 bytes .../texmf-dist/doc/latex/xstring/xstring_test.tex | 552 ---------------- Master/texmf-dist/tex/latex/xstring/xstring.sty | 705 +-------------------- 13 files changed, 2101 insertions(+), 1553 deletions(-) create mode 100644 Master/texmf-dist/doc/latex/xstring/test_etex.pdf create mode 100644 Master/texmf-dist/doc/latex/xstring/test_etex.tex create mode 100644 Master/texmf-dist/doc/latex/xstring/test_latex.pdf create mode 100644 Master/texmf-dist/doc/latex/xstring/test_latex.tex create mode 100644 Master/texmf-dist/doc/latex/xstring/xstring.tex delete mode 100755 Master/texmf-dist/doc/latex/xstring/xstring_test.pdf delete mode 100755 Master/texmf-dist/doc/latex/xstring/xstring_test.tex 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 Binary files /dev/null and b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf 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 +%%%%%%%% WARNING %%%%%%%% +% This is a TeX file. It must be compiled with eTeX typing +\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 Binary files /dev/null and b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf 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 \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 Binary files a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf and b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf 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 Binary files a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf and b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf 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 Binary files a/Master/texmf-dist/doc/latex/xstring/xstring_test.pdf and /dev/null 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 -- cgit v1.2.3