summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-09-05 18:48:41 +0000
committerKarl Berry <karl@freefriends.org>2008-09-05 18:48:41 +0000
commitae41bbd3003da49008e930d3f24b1908d316e810 (patch)
tree576868ca4d837ad8775ab99d83b9c39784635fec /Master/texmf-dist
parent53b978a99a82b83e1643db2362d70d9eba83e19d (diff)
xstring update + xstring.tex in runtime
git-svn-id: svn://tug.org/texlive/trunk@10434 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/latex/xstring/README84
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_etex.pdfbin27969 -> 28377 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_etex.tex46
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_latex.pdfbin47805 -> 49036 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/test_latex.tex41
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdfbin173436 -> 179203 bytes
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex106
-rw-r--r--Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdfbin184363 -> 188499 bytes
-rwxr-xr-xMaster/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex56
-rw-r--r--Master/texmf-dist/tex/latex/xstring/xstring.sty2
-rw-r--r--Master/texmf-dist/tex/latex/xstring/xstring.tex (renamed from Master/texmf-dist/doc/latex/xstring/xstring.tex)258
11 files changed, 402 insertions, 191 deletions
diff --git a/Master/texmf-dist/doc/latex/xstring/README b/Master/texmf-dist/doc/latex/xstring/README
index 4193278a183..c843faa5408 100644
--- a/Master/texmf-dist/doc/latex/xstring/README
+++ b/Master/texmf-dist/doc/latex/xstring/README
@@ -1,20 +1,21 @@
- _________________
+ _________________
- xstring package
- v1.1
- 2008/08/15
- _________________
+ xstring package
+ v1.2
+ 2008/08/23
+ _________________
---------------
-Warning
+----------------------------------------------------------------------------
+ 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?
+ - are 2 strings equal?
* extractions of substrings:
- what is on the left (or the right) of the nth occurrence of a
substring;
@@ -30,36 +31,55 @@ This package provides macros manipulating strings, such as:
For programming purposes, other macros allow to use special characters
(& ~ \ { } _ # $ ^ %) with the macros manipulating strings.
+This bundle contains :
+ * xstring.sty (the sty file for LaTeX)
+ * xstring.tex (the package itself)
+ * xstring_doc_en.tex and xstring_doc_en.pdf (manual in english)
+ * xstring_doc_fr.tex and xstring_doc_fr.pdf (manual in french)
+ * test_etex.tex and test_etex.pdf (test file to compile with etex)
+ * test_latex.tex and test_latex.pdf (test file to compile with LaTeX)
+ * README (this file)
+
+#######################################################################
#######################################################################
---------------
-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 :
+----------------------------------------------------------------------------
+ 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 ?
+ - 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 ?
+ - deux chaînes sont-elles égales ?
* des extractions de chaines :
- - renvoi de ce qui se trouve avant (ou après) la nieme occurrence
- d'une sous-chaîne;
- - renvoi de ce qui se trouve entre les occurrences de 2 sous-chaînes;
- - sous-chaîne comprise entre 2 positions, etc.
- * le remplacement de toutes ou des n premières occurrences d'une
- sous-chaîne par une autre sous-chaîne;
+ - renvoi de ce qui se trouve avant (ou après) la nieme occurrence
+ d'une sous-chaîne;
+ - renvoi de ce qui se trouve entre les occurrences de 2 sous-chaînes;
+ - sous-chaîne comprise entre 2 positions, etc.
+ * le remplacement de toutes ou des n premières occurrences d'une
+ sous-chaîne par une autre sous-chaîne;
* des calculs de nombres :
- - longueur d'une chaîne;
- - position de la la nieme occurrence d'une sous-chaîne;
- - comptage du nombre d'occurrences d'une sous-chaîne dans une autre.
+ - longueur d'une chaîne;
+ - position de la la nieme occurrence d'une sous-chaîne;
+ - comptage du nombre d'occurrences d'une sous-chaîne dans une autre.
-D'autres commandes permettent de traiter les caractères spéciaux
-(& ~ \ { } _ # $ ^ %) de façon à les utiliser dans les arguments des macros
-de ce package, ce qui permet d'utiliser ces macros à fins de programmation.
+D'autres commandes permettent de traiter les caractères spéciaux
+(& ~ \ { } _ # $ ^ %) de façon à les utiliser dans les arguments des macros
+de ce package, ce qui permet d'utiliser ces macros à fins de programmation.
+Ce paquet contient :
+ * xstring.sty (le fichier sty pour LaTeX)
+ * xstring.tex (le package lui même)
+ * xstring_doc_en.tex and xstring_doc_en.pdf (manuel en anglais)
+ * xstring_doc_fr.tex and xstring_doc_fr.pdf (manuel en français)
+ * test_etex.tex and test_etex.pdf (fichier test à compiler avec etex)
+ * test_latex.tex and test_latex.pdf (fichier test à compiler avec LaTeX)
+ * README (ce fichier)
- C Tellechea
+ Christian Tellechea
<unbonpetit@gmail.com> \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/xstring/test_etex.pdf b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf
index d184fdd4db4..d788c108116 100644
--- a/Master/texmf-dist/doc/latex/xstring/test_etex.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/test_etex.tex b/Master/texmf-dist/doc/latex/xstring/test_etex.tex
index 4468c4bfdab..390084bd4f4 100644
--- a/Master/texmf-dist/doc/latex/xstring/test_etex.tex
+++ b/Master/texmf-dist/doc/latex/xstring/test_etex.tex
@@ -1,7 +1,9 @@
%%%%%%%% ATTENTION %%%%%%%%
-% Ceci est un fichier TeX. Il doit être compilé avec eteX en tapant <etex test_etex>
+% Ceci n'est pas un fichier LaTeX, c'est un fichier TeX.
+% Il doit être compilé avec eteX en tapant <etex test_etex>
%%%%%%%% WARNING %%%%%%%%
-% This is a TeX file. It must be compiled with eTeX typing <etex test_etex>
+% This is not a LaTeX file, it is a TeX file.
+% It must be compiled with eTeX typing <etex test_etex>
\input xstring
\def\delimiteur{-{}}
\font\hugerm=cmr10 scaled 1750
@@ -130,7 +132,7 @@ Lorsque le r\'esultat contient des espaces ou peut conduire \`a des doutes, il s
\exemple|\IfInteger{+}{vrai}{faux}|
\exemple|\IfInteger{-}{vrai}{faux}|
\exemple|\IfInteger{.}{vrai}{faux}|
-\exemple|\IfInteger{,}{vrai}{faux}|
+\exemple|\IfInteger{}{vrai}{faux}|
\chapitre{Le test}{IfDecimal}
@@ -152,7 +154,43 @@ Lorsque le r\'esultat contient des espaces ou peut conduire \`a des doutes, il s
\exemple|\IfDecimal{+}{vrai}{faux}|
\exemple|\IfDecimal{-}{vrai}{faux}|
\exemple|\IfDecimal{.}{vrai}{faux}|
-\exemple|\IfDecimal{,}{vrai}{faux}|
+\exemple|\IfDecimal{}{vrai}{faux}|
+
+\chapitre{Le test}{IfStrEq}
+
+\exemple|\IfStrEq{abcdef}{abcdef}{vrai}{faux}|
+\exemple|\IfStrEq{a b c}{a b c}{vrai}{faux}|
+\exemple|\IfStrEq{abcd}{abc}{vrai}{faux}|
+\exemple|\IfStrEq{aab}{ab}{vrai}{faux}|
+\exemple|\IfStrEq{aab}{aa}{vrai}{faux}|
+\exemple|\IfStrEq{1.2}{1.20}{vrai}{faux}|
+\exemple|\IfStrEq{3,4}{3.4}{vrai}{faux}|
+\exemple|\IfStrEq{ }{ }{vrai}{faux}|
+\exemple|\IfStrEq{}{a}{vrai}{faux}|
+\exemple|\IfStrEq{a}{}{vrai}{faux}|
+\exemple|\IfStrEq{}{}{vrai}{faux}|
+
+\chapitre{Le test}{IfEq}
+
+\exemple|\IfEq{abcdef}{abcdef}{vrai}{faux}|
+\exemple|\IfEq{a b c}{a b c}{vrai}{faux}|
+\exemple|\IfEq{abcd}{abc}{vrai}{faux}|
+\exemple|\IfEq{aab}{ab}{vrai}{faux}|
+\exemple|\IfEq{aab}{aa}{vrai}{faux}|
+\exemple|\IfEq{1.2}{1.20}{vrai}{faux}|
+\exemple|\IfEq{+1.0000}{1}{vrai}{faux}|
+\exemple|\IfEq{-10}{10}{vrai}{faux}|
+\exemple|\IfEq{1,2}{1.2}{vrai}{faux}|
+\exemple|\IfEq{.5}{0.5}{vrai}{faux}|
+\exemple|\IfEq{,5}{0,5}{vrai}{faux}|
+\exemple|\IfEq{10}{dix}{vrai}{faux}|
+\exemple|\IfEq{123}{1a3}{vrai}{faux}|
+\exemple|\IfEq{0}{}{vrai}{faux}|
+\exemple|\IfEq{++10}{+10}{vrai}{faux}|
+\exemple|\IfEq{--10}{+10}{vrai}{faux}|
+\exemple|\IfEq{a}{}{vrai}{faux}|
+\exemple|\IfEq{}{a}{vrai}{faux}|
+\exemple|\IfEq{}{}{vrai}{faux}|
\chapitre{La macro}{StrBefore}
diff --git a/Master/texmf-dist/doc/latex/xstring/test_latex.pdf b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf
index 511f3e4b04d..dfdd60f4f70 100644
--- a/Master/texmf-dist/doc/latex/xstring/test_latex.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/test_latex.tex b/Master/texmf-dist/doc/latex/xstring/test_latex.tex
index 0aee06e3721..b2dada5d956 100644
--- a/Master/texmf-dist/doc/latex/xstring/test_latex.tex
+++ b/Master/texmf-dist/doc/latex/xstring/test_latex.tex
@@ -146,7 +146,7 @@ Lorsque le résultat contient des espaces ou peut conduire à des doutes, il ser
\exemple|\IfInteger{+}{vrai}{faux}|
\exemple|\IfInteger{-}{vrai}{faux}|
\exemple|\IfInteger{.}{vrai}{faux}|
-\exemple|\IfInteger{,}{vrai}{faux}|
+\exemple|\IfInteger{}{vrai}{faux}|
\chapitre{Le test}{IfDecimal}
@@ -168,8 +168,43 @@ Lorsque le résultat contient des espaces ou peut conduire à des doutes, il ser
\exemple|\IfDecimal{+}{vrai}{faux}|
\exemple|\IfDecimal{-}{vrai}{faux}|
\exemple|\IfDecimal{.}{vrai}{faux}|
-\exemple|\IfDecimal{,}{vrai}{faux}|
-
+\exemple|\IfDecimal{}{vrai}{faux}|
+
+\chapitre{Le test}{IfStrEq}
+
+\exemple|\IfStrEq{abcdef}{abcdef}{vrai}{faux}|
+\exemple|\IfStrEq{a b c}{a b c}{vrai}{faux}|
+\exemple|\IfStrEq{abcd}{abc}{vrai}{faux}|
+\exemple|\IfStrEq{aab}{ab}{vrai}{faux}|
+\exemple|\IfStrEq{aab}{aa}{vrai}{faux}|
+\exemple|\IfStrEq{1.2}{1.20}{vrai}{faux}|
+\exemple|\IfStrEq{3,4}{3.4}{vrai}{faux}|
+\exemple|\IfStrEq{ }{ }{vrai}{faux}|
+\exemple|\IfStrEq{}{a}{vrai}{faux}|
+\exemple|\IfStrEq{a}{}{vrai}{faux}|
+\exemple|\IfStrEq{}{}{vrai}{faux}|
+
+\chapitre{Le test}{IfEq}
+
+\exemple|\IfEq{abcdef}{abcdef}{vrai}{faux}|
+\exemple|\IfEq{a b c}{a b c}{vrai}{faux}|
+\exemple|\IfEq{abcd}{abc}{vrai}{faux}|
+\exemple|\IfEq{aab}{ab}{vrai}{faux}|
+\exemple|\IfEq{aab}{aa}{vrai}{faux}|
+\exemple|\IfEq{1.2}{1.20}{vrai}{faux}|
+\exemple|\IfEq{+1.0000}{1}{vrai}{faux}|
+\exemple|\IfEq{-10}{10}{vrai}{faux}|
+\exemple|\IfEq{1,2}{1.2}{vrai}{faux}|
+\exemple|\IfEq{.5}{0.5}{vrai}{faux}|
+\exemple|\IfEq{,5}{0,5}{vrai}{faux}|
+\exemple|\IfEq{10}{dix}{vrai}{faux}|
+\exemple|\IfEq{123}{1a3}{vrai}{faux}|
+\exemple|\IfEq{0}{}{vrai}{faux}|
+\exemple|\IfEq{++10}{+10}{vrai}{faux}|
+\exemple|\IfEq{--10}{+10}{vrai}{faux}|
+\exemple|\IfEq{a}{}{vrai}{faux}|
+\exemple|\IfEq{}{a}{vrai}{faux}|
+\exemple|\IfEq{}{}{vrai}{faux}|
\chapitre{La macro}{StrBefore}
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 cdf1f956128..4882127b0a6 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
index 44961af495b..3985badad65 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex
@@ -18,8 +18,7 @@
\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}
\usepackage[a4paper,dvips,margin=2cm]{geometry}
-\usepackage{amsmath,amssymb,amsfonts,textcomp}
-\usepackage{amssymb}
+\usepackage{amsmath,amssymb}
\usepackage{moreverb}
\usepackage{lmodern}
\usepackage{eurosym}
@@ -27,7 +26,7 @@
\usepackage[french,english]{babel}
\makeatletter
\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
-\def\@xs@afterreadverb#1{%
+\long\def\@xs@afterreadverb#1{%
\normalexpandarg
\tokenize\cs@resultat{#1}%
\fullexpandarg
@@ -83,6 +82,7 @@
\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?
+ \item are 2 strings equal?
\end{itemize}
\item[$\triangleright$] extractions of substrings:
\begin{itemize}
@@ -114,7 +114,7 @@ This manual is a translation of the french manual. I apologize for my poor engli
\subsection{Description}
This extension\footnote{This extension does not require \LaTeX{} and can be compiled with Plain $\varepsilon$-\TeX{}.} provides macros and tests operating on strings, 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.
+Certainly, other packages exist (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.
\subsection{Motivation}
I decided to write this package of macros because I have never really found tools in \LaTeX{} suiting my needs for strings. So, over the last few months,I wrote a few macros that I occasionally or regularly used. Their numbers have increased and become a little too dispersed in directories in my computer, so I have grouped them together in this package.
@@ -172,19 +172,19 @@ The macros of this package are not purely expandable, i.e. they cannot be put in
\qquad or this nested structure\par
\hspace{0.2\linewidth}\verb|\commandA{\commandB{\commandC{argument}}}|\smallskip
-For this reason, all the macros returning a result (i.e. all excepted the tests) have an optionnal argument in last position. The syntax is \arguC{nom}, where \argu{nom} is the name of the control sequence that will receive the result of the macro: the assignment is made with an \verb|\edef| which make the result of the macro |\argu{nom} purely expandable. Of course, if an optionnal argument is present, the macro does not display anything.\medskip
+For this reason, all the macros returning a result (i.e. all excepted the tests) have an optionnal argument in last position. The syntax is \arguC{name}, where \argu{name} is the name of the control sequence that will receive the result of the macro: the assignment is made with an \verb|\edef| which make the result of the macro \argu{name} purely expandable. Of course, if an optionnal argument is present, the macro does not display anything.\medskip
Thus, this structure not allowed, already seen above:\par
-\hspace{0.2\linewidth}\verb|\edef\Resultat{\commande{arguments}}|\par
+\hspace{0.2\linewidth}\verb|\edef\Result{\command{arguments}}|\par
\qquad is equivalent to:\par
-\hspace{0.2\linewidth}\verb|\commande{argument}[\Resultat]|\medskip
+\hspace{0.2\linewidth}\verb|\command{argument}[\Result]|\medskip
And this nested one:\par
-\hspace{0.2\linewidth}\verb|\commandeA{\commandeB{\commandeC{arguments}}}|\par
+\hspace{0.2\linewidth}\verb|\commandA{\commandB{\commandC{arguments}}}|\par
\qquad can be replaced by:\par
-\hspace{0.2\linewidth}\verb|\commandeC{arguments}[\MaChaine]|\par
-\hspace{0.2\linewidth}\verb|\commandeB{\MaChaine}[\MaChaine]|\par
-\hspace{0.2\linewidth}\verb|\commandeA{\MaChaine}|
+\hspace{0.2\linewidth}\verb|\commandC{arguments}[\MyString]|\par
+\hspace{0.2\linewidth}\verb|\commandB{\MyString}[\MyString]|\par
+\hspace{0.2\linewidth}\verb|\commandA{\MyString}|
\section{The macros}
\label{listemacros}
@@ -251,7 +251,7 @@ In \argu{string}, tests if the \argu{number1}\th{} occurrence of \argu{stringA}
The values of the optional arguments \argu{number1} and \argu{number2} are 1 by default.\par\smallskip
-In \argu{string}, tests if the \argu{number1}\th{} occurrence of \argu{stringA} is on the right of the \argu{number2}\th{} occurrence of \argu{stringB}. Runs \argu{true} if so, ands \argu{false} otherwise.\medskip
+In \argu{string}, tests if the \argu{number1}\th{} occurrence of \argu{stringA} is on the right of the \argu{number2}\th{} occurrence of \argu{stringB}. Runs \argu{true} if so, and \argu{false} otherwise.\medskip
\begin{Conditions}
\item If one of the occurrences is not found, it runs \argu{false};
@@ -306,7 +306,7 @@ Tests if \argu{string} ends with \argu{stringA}, and runs \argu{true} if so, and
\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
+Tests if \argu{number} 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
@@ -320,8 +320,7 @@ If test is false because unexpected characters, the control sequence \verb|\@xs@
\exemple|\IfInteger{-}{true}{false}|
\exemple|\IfInteger{0000}{true}{false}|
-\subsubsection{IfDecimal}
-
+\subsubsection{IfDecimal}\label{ifdecimal}
\verb|\IfInteger|\ARGU{number}\ARGU{true}\ARGU{false}
\smallskip
@@ -338,20 +337,64 @@ If test is false because unexpected characters, the control sequence \verb|\@xs@
\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}|
+\exemple|\IfDecimal{3.14}{true}{false}|
+\exemple|\IfDecimal{3,14}{true}{false}|
+\exemple|\IfDecimal{-0.5}{true}{false}|
+\exemple|\IfDecimal{.7}{true}{false}|
+\exemple|\IfDecimal{,9}{true}{false}|
+\exemple|\IfDecimal{1..2}{true}{false}|
+\exemple|\IfDecimal{+6}{true}{false}|
+\exemple|\IfDecimal{-15}{true}{false}|
+\exemple|\IfDecimal{1.}{true}{false}|
+\exemple|\IfDecimal{2,}{true}{false}|
+\exemple|\IfDecimal{.}{true}{false}|
+\exemple|\IfDecimal{,}{true}{false}|
+\exemple|\IfDecimal{+}{true}{false}|
+\exemple|\IfDecimal{-}{true}{false}|
+
+\subsubsection{IfStrEq}
+
+\verb|\IfStrEq|\ARGU{stringA}\ARGU{stringB}\ARGU{true}\ARGU{false}
+\smallskip
+
+Tests if the strings \argu{stringA} and \argu{stringB} are equal, i.e. if they contain successively the same characters in the same order. Runs \argu{true} if so, and \argu{false} otherwise.\smallskip
+
+\exemple|\IfStrEq{a1b2c3}{a1b2c3}{true}{false}|
+\exemple|\IfStrEq{abcdef}{abcd}{true}{false}|
+\exemple|\IfStrEq{abc}{abcdef}{true}{false}|
+\exemple|\IfStrEq{3,14}{3,14}{true}{false}|
+\exemple|\IfStrEq{12.34}{12.340}{true}{false}|
+\exemple|\IfStrEq{abc}{}{true}{false}|
+\exemple|\IfStrEq{}{abc}{true}{false}|
+\exemple|\IfStrEq{}{}{true}{false}|
+
+\subsubsection{IfEq}
+
+\verb|\IfStrEq|\ARGU{stringA}\ARGU{stringB}\ARGU{true}\ARGU{false}
+\smallskip
+
+Tests if the strings \argu{stringA} and \argu{stringB} are equal, \emph{except} if both \argu{stringA} and \argu{stringB} contain numbers in which case the macro tests if these numbers are equal. Runs \argu{true} if so, and \argu{false} otherwise.\smallskip
+
+\begin{Conditions}
+ \item The definition of \emph{number} is given with the macro \verb|IfDecimal| (see page~\pageref{ifdecimal}), and thus :
+ \item \guill{+} signs are optionnal;
+ \item Decimal separator can be a dot or a comma;
+ \item It is possible to evaluate an algebric expression with the $\varepsilon$-\TeX{} primitive \verb|\numexpr|, keeping in mind that it operate on integers only, and that results of divisions are \emph{rounded} and not truncated! It is wiser to avoid with no integer calculation.
+\end{Conditions}
+
+\exemple|\IfEq{a1b2c3}{a1b2c3}{true}{false}|
+\exemple|\IfEq{abcdef}{ab}{true}{false}|
+\exemple|\IfEq{ab}{abcdef}{true}{false}|
+\exemple|\IfEq{12.34}{12,34}{true}{false}|
+\exemple|\IfEq{+12.34}{12.340}{true}{false}|
+\exemple|\IfEq{10}{+10}{true}{false}|
+\exemple|\IfEq{-10}{10}{true}{false}|
+\exemple|\IfEq{+0,5}{,5}{true}{false}|
+\exemple|\IfEq{1.001}{1.01}{true}{false}|
+\exemple|\IfEq{3*4+2}{14}{true}{false}|
+\exemple|\IfEq{\number\numexpr3*4+2}{14}{true}{false}|
+\exemple|\IfEq{0}{-0.0}{true}{false}|
+\exemple|\IfEq{}{}{true}{false}|
\subsection{Extraction of substrings}
\subsubsection{StrBefore}
@@ -1230,11 +1273,10 @@ A control sequence \verb|\myCS| defined with an \verb|\edef| contains control se
\end{minipage}
\medskip
-Notice that 2 counters, 2 tests and a double recursion are necessary to find the group: one of each to find what "\verb|}|" delimits the end of the current group, and the others to know the number of the group being read.\bigskip\bigskip
+Notice that 2 counters, 2 tests and a double recursion are necessary to find the group: one of each to find whiwh "\verb|}|" delimits the end of the current group, and the others to calculate the number of the group being read.\bigskip\bigskip
\begin{center}
-$\star$
-
+$\star$\par
$\star$\quad$\star$
\end{center}
\bigskip\bigskip
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 732e4f61da5..3b5f53d75c1 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
index 589c76dee83..dff8c59a2aa 100755
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
@@ -27,7 +27,7 @@
\makeatletter
\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
-\def\@xs@afterreadverb#1{%
+\long\def\@xs@afterreadverb#1{%
\normalexpandarg
\tokenize\cs@resultat{#1}%
\fullexpandarg
@@ -82,6 +82,7 @@
\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 ?
+ \item deux chaînes sont-elles égales ?
\end{itemize}
\item[$\triangleright$] des extractions de chaînes :
\begin{itemize}
@@ -305,7 +306,7 @@ Teste si \argu{chaine} se termine par \argu{chaineA}, et exécute \argu{vrai} da
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
+Si le test est faux pour cause de caractères non autorisés, la séquence de contrôle \verb|\@xs@afterinteger| contient la partie illégale de \argu{nombre}.\medskip
\exemple|\IfInteger{13}{vrai}{faux}|
\exemple|\IfInteger{-219}{vrai}{faux}|
@@ -317,17 +318,16 @@ Si le test est faux pour cause de caractères non autorisés, la séquence de co
\exemple|\IfInteger{-}{vrai}{faux}|
\exemple|\IfInteger{0000}{vrai}{faux}|
-\subsubsection{IfDecimal}
-
+\subsubsection{IfDecimal}\label{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}.
+Les compteurs \verb|\integerpart| et \verb|\decimalpart| contiennent les parties entières et décimales de \argu{nombre}.
-Si le test est faux pour cause de caractères non autorisés, la séquence de contrôle \verb|\@xs@afterdecimal| contient la partie illégale de \argu{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
+Si le test est faux pour cause de caractères non autorisés, la séquence de contrôle \verb|\@xs@afterdecimal| contient la partie illégale de \argu{nombre}, alors que si le test est faux parce que la partie décimale après le séparateur décimal est vide, elle contient \guill{X}.\medskip
\begin{Conditions}
\item Le séparateur décimal peut être un point ou une virgule;
@@ -350,6 +350,50 @@ Si le test est faux pour cause de caractères non autorisés, la séquence de co
\exemple|\IfDecimal{+}{vrai}{faux}|
\exemple|\IfDecimal{-}{vrai}{faux}|
+\subsubsection{IfStrEq}
+
+\verb|\IfStrEq|\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
+\smallskip
+
+Teste si les chaînes \argu{chaineA} et \argu{chaineB} sont égales, c'est-à-dire si elles contiennent successivement les mêmes caractères dans le même ordre. Exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\smallskip
+
+\exemple|\IfStrEq{a1b2c3}{a1b2c3}{vrai}{faux}|
+\exemple|\IfStrEq{abcdef}{abcd}{vrai}{faux}|
+\exemple|\IfStrEq{abc}{abcdef}{vrai}{faux}|
+\exemple|\IfStrEq{3,14}{3,14}{vrai}{faux}|
+\exemple|\IfStrEq{12.34}{12.340}{vrai}{faux}|
+\exemple|\IfStrEq{abc}{}{vrai}{faux}|
+\exemple|\IfStrEq{}{abc}{vrai}{faux}|
+\exemple|\IfStrEq{}{}{vrai}{faux}|
+
+\subsubsection{IfEq}
+
+\verb|\IfStrEq|\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
+\smallskip
+
+Teste si les chaînes \argu{chaineA} et \argu{chaineB} sont égales, \emph{sauf} si \argu{chaineA} et \argu{chaineB} contiennent des nombres, auquel cas la macro teste si les nombres sont égaux. Exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\smallskip
+
+\begin{Conditions}
+ \item La définition de \emph{nombre} est celle évoquée dans la macro \verb|IfDecimal| (voir page~\pageref{ifdecimal}), et donc :
+ \item Les signes \guill{+} sont facultatifs;
+ \item Le séparateur décimal peut être indifféremment la virgule ou le point;
+ \item Il est possible d'évaluer des expressions algébriques en utilisant la primitive \verb|\numexpr| de $\varepsilon$-\TeX{}, en gardant à l'esprit qu'elle n'opère que sur des entiers et qu'elle arrondit les résultats non entiers à l'entier le plus proche; il vaut donc mieux l'éviter lorsque les résultats ne sont pas entiers.
+\end{Conditions}
+
+\exemple|\IfEq{a1b2c3}{a1b2c3}{vrai}{faux}|
+\exemple|\IfEq{abcdef}{ab}{vrai}{faux}|
+\exemple|\IfEq{ab}{abcdef}{vrai}{faux}|
+\exemple|\IfEq{12.34}{12,34}{vrai}{faux}|
+\exemple|\IfEq{+12.34}{12.340}{vrai}{faux}|
+\exemple|\IfEq{10}{+10}{vrai}{faux}|
+\exemple|\IfEq{-10}{10}{vrai}{faux}|
+\exemple|\IfEq{+0,5}{,5}{vrai}{faux}|
+\exemple|\IfEq{1.001}{1.01}{vrai}{faux}|
+\exemple|\IfEq{3*4+2}{14}{vrai}{faux}|
+\exemple|\IfEq{\number\numexpr3*4+2}{14}{vrai}{faux}|
+\exemple|\IfEq{0}{-0.0}{vrai}{faux}|
+\exemple|\IfEq{}{}{vrai}{faux}|
+
\subsection{Les macros renvoyant une chaîne}
\subsubsection{StrBefore}
\verb|\StrBefore|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
diff --git a/Master/texmf-dist/tex/latex/xstring/xstring.sty b/Master/texmf-dist/tex/latex/xstring/xstring.sty
index dc5e8ef5914..62acadb45df 100644
--- a/Master/texmf-dist/tex/latex/xstring/xstring.sty
+++ b/Master/texmf-dist/tex/latex/xstring/xstring.sty
@@ -1,3 +1,3 @@
\ProvidesPackage{xstring}
\input xstring.tex
-\endinput
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/xstring/xstring.tex b/Master/texmf-dist/tex/latex/xstring/xstring.tex
index 71623a89b58..cfad44ca2fc 100644
--- a/Master/texmf-dist/doc/latex/xstring/xstring.tex
+++ b/Master/texmf-dist/tex/latex/xstring/xstring.tex
@@ -1,13 +1,13 @@
% __________________________________________________
% | |
% | |
-% | xstring v1.1 |
+% | xstring v1.2 |
% | |
-% | August 15 2008 |
+% | August 23 2008 |
% | |
% |__________________________________________________|
%
-% This is xtring.sty
+% This is xtring.tex
%
% Christian Tellechea 2008
% email : unbonpetit@gmail.com
@@ -35,13 +35,13 @@
% 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}
+\def\xstringversion {1.2}
+\def\xstringdate {2008/08/23}
+\def\xstringfrenchdate {23 ao\^ut 2008}
+\def\xstringenglishdate{August $23^{\mathrm{th}}$ 2008}
\edef\CurrentAtCatcode{\the\catcode`\@}
\catcode`\@=11
-\newwrite\@xs@unused% pour lesmessages
+\newwrite\@xs@unused% pour les messages
\newcount\integerpart% pour les tests sur les nombres
\newcount\decimalpart
@@ -303,7 +303,7 @@
% 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@result@IfSubStr{\expandafter\@secondoftwo}% on exécute #5
\def\@xs@behind@IfSubStr{}%
\def\@xs@before@IfSubStr{}}
\@xs@newmacro\IfSubStr{1}{2}{0}{%
@@ -325,7 +325,7 @@
\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
+ \def\@xs@result@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
@@ -333,7 +333,7 @@
\@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@result@IfSubStr}
\@xs@newmacro\IfBeginWith{}{2}{0}{%
\@xs@IfSubStr[\@ne]{#1}{#2}%
@@ -358,18 +358,6 @@
\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}%
@@ -384,22 +372,25 @@
\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@putXifempty#1{#1\ifx\@empty#1\@empty X\fi}
\def\@xs@formatnumber#1{%
- \expandafter\ifx\@xs@returnfirstchar#1\@nil+%
- +0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
+ \ifx\@empty#1\@empty
+ 0X%
\else
- \expandafter\ifx\@xs@returnfirstchar#1\@nil-%
- -0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
+ \expandafter\ifx\@xs@returnfirstchar#1\@nil+%
+ +0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
\else
- 0#1%
+ \expandafter\ifx\@xs@returnfirstchar#1\@nil-%
+ -0\expandafter\@xs@putXifempty\expandafter{\@xs@gobblefirstchar#1\@nil}%
+ \else
+ 0#1%
+ \fi
\fi
\fi}
-\def\@xs@formatdecimalpart#1{}
\@xs@newmacro\IfInteger{}{1}{0}{%
\@xs@def\@xs@formattednumber{\@xs@formatnumber{#1}}%
- \decimalpart=0
+ \decimalpart\z@
\afterassignment\@xs@defafterinteger\integerpart=\@xs@formattednumber\relax\@nil
\if\relax\@xs@afterinteger
\def\@xs@result@IfInteger{\expandafter\@firstoftwo}%
@@ -410,7 +401,7 @@
\@xs@newmacro\IfDecimal{}{1}{0}{%
\@xs@def\@xs@formattednumber{\@xs@formatnumber{#1}}%
- \decimalpart=0\relax
+ \decimalpart\z@
\afterassignment\@xs@defafterinteger\integerpart=\@xs@formattednumber\relax\@nil
\expandafter\@xs@testdot\@xs@afterinteger\@nil
\if\relax\@xs@afterdecimal
@@ -419,6 +410,7 @@
\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}}
@@ -428,6 +420,47 @@
\expandafter\@xs@endnumber\@xs@afterinteger\@nil}
\def\@xs@endnumber#1\@nil{\def\@xs@afterdecimal{#1}}
+% test d'égalité sur des chaines (et des chaines contenant des nombres)
+\def\@xs@IfStrEqFalse@#1#2{\def\@xs@result@IfStrEq{\expandafter\@secondoftwo}}
+\def\@xs@IfStrEqFalse@@#1#2{% renvoie vrai si les 2 arg sont décimaux et s'ils sont égaux, faux sinon
+ \@xs@IfDecimal{#1}%
+ {\@xs@IfDecimal{#2}%
+ {\ifdim#1pt=#2pt\def\@xs@result@IfStrEq{\expandafter\@firstoftwo}\else\def\@xs@result@IfStrEq{\expandafter\@secondoftwo}\fi}% les 2 sont décimaux
+ {\def\@xs@result@IfStrEq{\expandafter\@secondoftwo}}}% un seul est décimal
+ {\def\@xs@result@IfStrEq{\expandafter\@secondoftwo}}}% #1 n'est pas décimal
+\def\@xs@TestEqu@l#1#2{% teste si les 2 arguments sont égaux
+ \expandafter\ifx\expandafter\@empty\detokenize{#1#2}\@empty
+ \def\@xs@result@IfStrEq{\expandafter\@firstoftwo}% les 2 sont vides, on renvoie vrai
+ \else
+ \@xs@IfSubStr[\@ne]{#1}{#2}%
+ {\expandafter\ifx\expandafter\@empty\detokenize\expandafter\expandafter\expandafter{\expandafter\@xs@before@IfSubStr\@xs@behind@IfSubStr}\@empty
+ \def\@xs@result@IfStrEq{\expandafter\@firstoftwo}% égalité parfaite des 2 chaines
+ \else
+ \@xs@IfStrEqFalse{#1}{#2}%
+ \fi}%
+ {\@xs@IfStrEqFalse{#1}{#2}}%
+ \fi
+ \@xs@result@IfStrEq}
+
+\@xs@newmacro\IfStrEq{}{2}{0}{% teste si les deux chaines sont égales
+ \let\@xs@IfStrEqFalse\@xs@IfStrEqFalse@
+ \@xs@TestEqu@l{#1}{#2}}
+\@xs@newmacro\IfEq{}{2}{0}{% teste si les 2 arguments (chaine ou nombre) sont égaux
+ \let\@xs@IfStrEqFalse\@xs@IfStrEqFalse@@
+ \@xs@TestEqu@l{#1}{#2}}
+
+% 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}}}
+
% 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]}
@@ -486,6 +519,19 @@
\expandafter\@xs@StrLen@i\@xs@remain@StrLen\@nil#2+1\@nil#3\@nil
\fi}
+% Cette macro coupe la chaine #1 après le caractère n°#2
+% Le début est assigné dans #3 et la fin dans #4
+\def\@xs@Split#1#2[#3,#4]{%
+ \def#3{}\def#4{#1}%
+ \@xs@Split@#1\@nil0\@nil#2[#3,#4]}
+\def\@xs@Split@#1\@nil#2\@nil#3[#4,#5]{%
+ \ifnum\numexpr#2<\numexpr#3\relax% tant que c'est pas fini
+ \@xs@ReturnFirst{#1}[#5]% prend le 1er caractère
+ \edef#4{#4#5}% l'ajoute au résultat final
+ \@xs@RemoveFirst{#1}[#5]% puis l'enlève de la chaine
+ \ifx\@empty#5\@empty\else\expandafter\@xs@Split@#5\@nil#2+1\@nil#3[#4,#5]\fi% on recommence sauf s'il ne reste plus rien
+ \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}%
@@ -494,84 +540,56 @@
\@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}%
+ \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@Split{#1}{\@xs@First@StrMid-1}[\@xs@before@StrMid,\@xs@behind@StrMid]%
+ \expandafter\@xs@Split\expandafter{\@xs@behind@StrMid}{\@xs@Last@StrMid-\@xs@First@StrMid+1}[\@xs@result@StrMid,\@xs@before@StrMid]%
+ \@xs@ReturnResult{\@xs@result@StrMid}{#2}%
\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@Split{#1}{#2}[\@xs@call,\@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@Split{#1}{#2}[\@xs@result@StrLeft,\@xs@call]%
\@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@StrLen{#1}[\@xs@Len@StrGobbleRight]%
+ \@xs@Split{#1}{\@xs@Len@StrGobbleRight-#2}[\@xs@result@StrGobbleRight,\@xs@call]%
\@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@StrLen{#1}[\@xs@Len@StrRight]%
+ \@xs@Split{#1}{\@xs@Len@StrRight-#2}[\@xs@call,\@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]}
+ \ifnum#2<\@ne
+ \@xs@ReturnResult{}{#3}%
+ \else
+ \@xs@Split{#1}{#2-1}[\@xs@call,\@xs@result@StrChar]%
+ \expandafter\@xs@ReturnFirst\expandafter{\@xs@result@StrChar}[\@xs@result@StrChar@]%
+ \@xs@ReturnResult{\@xs@result@StrChar@}{#3}%
+ \fi}
% Combien de fois compte t-on #2 dans #1 ?
\@xs@newmacro\StrCount{}{2}{1}{%
@@ -614,32 +632,46 @@
\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
+%------------------------------------------------------------
+%% v1.0 4/7/2008 : - Package achevé.
+% 7/7/2008 : - Package publié sur CTAN.
+%------------------------------------------------------------
+% v1.1 15/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
+%------------------------------------------------------------
+% v1.2 23/8/2008
+% - Amélioration du code de \StrMid \StrGobbleLeft,
+% \StrLeft, \StrGobbleRight et \StrRight à l'aide
+% de la nouvelle macro \@xs@Split
+% - Nouveau test \IfStrEq qui compare 2 chaines
+% - Nouveau test \IfEq qui compare 2 chaines (ou
+% 2 nombres si les 2 chaines contiennent un nombre)
+% - Correction d'un bug dans \@xs@formatnumber. La macro
+% n'envisageait pas le cas où son argument était vide
+% ce qui faiasait planter \IfDecimal{}{V}{F} et
+% \IfInteger{}{V}{F}
+%------------------------------------------------------------ \ No newline at end of file