diff options
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/README | 84 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/test_etex.pdf | bin | 27969 -> 28377 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/test_etex.tex | 46 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/test_latex.pdf | bin | 47805 -> 49036 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/test_latex.tex | 41 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/xstring_doc_en.pdf | bin | 173436 -> 179203 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/xstring_doc_en.tex | 106 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.pdf | bin | 184363 -> 188499 bytes | |||
-rwxr-xr-x | Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex | 56 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/xstring/xstring.sty | 2 | ||||
-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 Binary files differindex d184fdd4db4..d788c108116 100644 --- a/Master/texmf-dist/doc/latex/xstring/test_etex.pdf +++ b/Master/texmf-dist/doc/latex/xstring/test_etex.pdf 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 Binary files differindex 511f3e4b04d..dfdd60f4f70 100644 --- a/Master/texmf-dist/doc/latex/xstring/test_latex.pdf +++ b/Master/texmf-dist/doc/latex/xstring/test_latex.pdf 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 Binary files differindex 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 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 Binary files differindex 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 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 |