summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2008-09-22 17:54:46 +0000
committerKarl Berry <karl@freefriends.org>2008-09-22 17:54:46 +0000
commit9da98529e177e6454863e2131dfdb16dc2c37e85 (patch)
tree6479c5cb3add13504bec3fb1a3ab0827addad819 /Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
parent570886302e347e0b86dc0f5e8190aad8761c1595 (diff)
xstring 1.3 (21sep08)
git-svn-id: svn://tug.org/texlive/trunk@10688 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex')
-rwxr-xr-xMaster/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex247
1 files changed, 178 insertions, 69 deletions
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 dff8c59a2aa..5d7226b1862 100755
--- a/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
+++ b/Master/texmf-dist/doc/latex/xstring/xstring_doc_fr.tex
@@ -2,7 +2,7 @@
% 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.
@@ -12,7 +12,7 @@
%
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
-%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
@@ -24,8 +24,8 @@
\usepackage{eurosym}
\usepackage{xstring}
\usepackage[frenchb]{babel}
-\makeatletter
+\makeatletter
\newcommand*\exemple{\@ifstar{\def\frontiere{|}\@xs@MakeVerb}{\def\frontiere{}\@xs@MakeVerb}}
\long\def\@xs@afterreadverb#1{%
\normalexpandarg
@@ -39,6 +39,7 @@
\newcommand\arguC[1]{\texttt{[}\argu{#1}\texttt{]}}
\newcommand\arguCC[2]{\texttt{[}\argu{#1}{,}\argu{#2}\texttt{]}}
\newcommand\texte[1]{\texttt{texte}${}_{#1}$}
+\newcommand\etoile{$\langle$\texttt{[*]}$\rangle$}
\newcommand\voirdeftexte{~(voir \ref{deftexte})}
\newenvironment{Conditions}[1][1cm]%
{\begin{list}%
@@ -95,7 +96,8 @@
\begin{itemize}
\item longueur d'une chaîne;
\item position de la la $n$\ieme{} occurrence d'une sous-chaîne;
- \item comptage du nombre d'occurrences d'une sous-chaîne dans une autre.
+ \item comptage du nombre d'occurrences d'une sous-chaîne dans une autre;
+ \item position du 1\ier{} caractère différent entre 2 chaînes.
\end{itemize}
\end{itemize}
\setlength{\parindent}{0pt}
@@ -113,7 +115,9 @@
\subsection{Description}
Cette extension\footnote{L'extension ne nécessite pas \LaTeX et peut être compilée sous Plain $\varepsilon$-\TeX{}.} regroupe des macros et des tests opérant sur des chaînes de 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.
+Certes d'autres packages manipulant les chaînes de caractères 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.\medskip
+
+Chaque macro de ce package manipulant des caractères peut fonctionner selon 2 modes correspondants aux macros \emph{naturelles} ou \emph{étoilées}. La différence entre les deux vient du fait que les macros non étoilées tiennent compte des \guill{catcodes\footnote{Codes de catégories, en français.}} des caractères composant les chaînes, alors que les versions étoilées sont \emph{moins strictes} et n'en tiennent pas compte. Pour la plupart des utilisateurs, la question ne devrait pas se poser, et dans la majorité des cas les deux versions se comportent de la même façon (pour de plus amples informations pour les utilisateurs avancés, voir en particulier le chapitre sur les catcodes des arguments page~\pageref{catcodesarguments} et celui sur les macros étoilées, page~\pageref{macrosetoilees}).
\subsection{Motivation}
J'ai été conduit à écrire ce type de macros car je n'ai jamais vraiment trouvé de d'outils sous \LaTeX{} adaptés à mes besoins concernant le traitement de chaînes de caractères. Alors, au fil des derniers mois, et avec l'aide de contributeurs\footnote{Je remercie chaleureusement Manuel alias \guill{\nolinkurl{mpg}} pour son aide précieuse, sa compétence et sa disponibilité.} de \nolinkurl{fr.comp.text.tex}, j'ai écrit quelques macros qui me servaient ponctuellement ou régulièrement. Leur nombre s'étant accru, et celles-ci devenant un peu trop dispersées dans les répertoires de mon ordinateur, je les ai regroupées dans ce package.
@@ -127,7 +131,7 @@ Ensuite, et ça a été ma principale motivation puisque j'ai découvert \LaTeX{
Dans la suite, on écrira \guill{\texte{10,11,12}} une suite de caractères dont les catcodes sont 10, 11 ou 12.
\subsubsection{Développement des arguments}
\label{devarg}
-Tous les arguments des macros\footnote{À l'exeption des 2 derniers arguments des macros tests qui contiennent des séquences de contrôle à exécuter selon le résultat du test, ainsi qu'à l'exception de l'argument optionnel venant en dernière position.} manipulant des chaînes de caractères sont susceptibles de donner, à une certaine profondeur de développement du \texte{10,11,12}. Ainsi, \emph{par défaut}, pour éviter des chaines d'\verb|\expandafter| et faciliter l'usage des macros de ce package, tous les arguments sont développés au maximum avant d'être pris en compte par la macro appelée : pour cela, la commande \verb|\fullexpandarg| est appelée par défaut.\bigskip
+Tous les arguments des macros\footnote{À l'exeption des 2 derniers arguments des macros tests qui contiennent des séquences de contrôle à exécuter selon le résultat du test, ainsi qu'à l'exception de l'argument optionnel venant en dernière position.} manipulant des chaînes de caractères sont susceptibles de donner, à une certaine profondeur de développement du \texte{10,11,12}. Ainsi, \emph{par défaut}, pour éviter des chaines d'\verb|\expandafter| et faciliter l'usage des macros de ce package, tous les arguments sont développés le plus possible avant d'être pris en compte par la macro appelée : pour cela, la commande \verb|\fullexpandarg| est appelée par défaut.\bigskip
Par exemple, si \verb|\macro| est une macro de ce package nécessitant un argument texte et un argument nombre obligatoires, les constructions suivantes sont équivalentes :\medskip
@@ -156,7 +160,7 @@ Les macros de packages manipulant des chaînes de caractères, elles nécessiten
Il convient de respecter les règles suivantes pour le développement des arguments textuels :
\begin{itemize}
- \item ils peuvent contenir des lettres (majuscules ou minuscules, accentuées\footnote{Pour pouvoir utiliser des lettres accentuées de façon fiable, il est nécessaire de charger le packages \texttt{\textbackslash fontenc} avec l'option \texttt{[T1]}, ainsi que \texttt{\textbackslash inputenc} avec l'option correspondant au codage du fichier tex} ou non), des chiffres et des espaces, ainsi que tout caractère de catcode 10, 11 ou 12 (signes de ponctuation, signes opératoires mathématiques, parenthèses, crochets, etc). Le signe \officialeuro, par contre, génèrera des erreurs.
+ \item ils peuvent contenir des lettres (majuscules ou minuscules, accentuées\footnote{Pour pouvoir utiliser des lettres accentuées de façon fiable, il est nécessaire de charger le packages \texttt{\textbackslash fontenc} avec l'option \texttt{[T1]}, ainsi que \texttt{\textbackslash inputenc} avec l'option correspondant au codage du fichier tex.} ou non), des chiffres et des espaces, ainsi que tout caractère de catcode 10, 11 ou 12 (signes de ponctuation, signes opératoires mathématiques, parenthèses, crochets, etc). Le signe \officialeuro, par contre, génèrera des erreurs;
\item les espaces sont gérés et comptabilisés comme des caractères à part entière, à la condition qu'il ne se suivent pas, auquel cas, la règle \LaTeX{}ienne prévaut et plusieurs espaces consécutifs n'en font qu'un seul;
\item aucun caractère spécial n'est accepté, c'est-à-dire que les 10 caractères suivants sont strictement interdits : \verb|&|, \verb|~|, \verb|\|, \verb|{|, \verb|}|, \verb|_|, \verb|#|, \verb|$|, \verb|^| et \verb|%|.
\end{itemize}\medskip
@@ -170,7 +174,7 @@ Les macros de ce package ne sont pas purement développables et ne peuvent donc
\qquad pas plus que\par
\hspace{0.2\linewidth}\verb|\commandeA{\commandeB{\commandeC{argument}}}|\smallskip
-C'est pour cela que les macros renvoyant un résultat, c'est-à-dire toutes sauf les tests, sont dotées d'un argument optionnel venant en dernière position. Cet argument prend la forme de \arguC{nom}, où \argu{nom} est le nom d'une séquence de contrôle qui recevra (l'assignation se fait avec un \verb|\edef|) le résultat de la macro, ce qui fait que \verb|\|\argu{nom} est purement développable et peut donc se trouver dans l'argument d'un \verb|\edef|. Dans le cas de la présence d'un argument optionnel en dernière position, aucun affichage n'aura lieu. Cet argument optionnel, évidemment, n'est pas développé contrairement aux autres arguments. Il permet ainsi contourner les limitations évoquées dans les exemples ci dessus.\medskip
+C'est pour cela que les macros renvoyant un résultat, c'est-à-dire toutes sauf les tests et \verb|\StrSplit|, sont dotées d'un argument optionnel venant en dernière position. Cet argument prend la forme de \arguC{nom}, où \argu{nom} est le nom d'une séquence de contrôle qui recevra (l'assignation se fait avec un \verb|\edef|) le résultat de la macro, ce qui fait que \verb|\|\argu{nom} est purement développable et peut donc se trouver dans l'argument d'un \verb|\edef|. Dans le cas de la présence d'un argument optionnel en dernière position, aucun affichage n'aura lieu. Cet argument optionnel, évidemment, n'est pas développé contrairement aux autres arguments. Il permet ainsi contourner les limitations évoquées dans les exemples ci dessus.\medskip
Ainsi cette construction non permise :\par
\hspace{0.2\linewidth}\verb|\edef\Resultat{\commande{arguments}}|\par
@@ -184,6 +188,15 @@ Et cet autre construction non permise :\par
\hspace{0.2\linewidth}\verb|\commandeB{\MaChaine}[\MaChaine]|\par
\hspace{0.2\linewidth}\verb|\commandeA{\MaChaine}|\par
+\subsubsection{Catcodes des arguments}\label{catcodesarguments}
+Les macros présentées ici tiennent compte des catcodes des caractères constituant les chaînes de caractères. Il faut donc garder à l'esprit particulièrement lors des tests, que les caractères \emph{et leurs catcodes} sont examinés.\medskip
+
+Par exemple, ces 2 arguments textuels :\par\smallskip
+\hfil\verb|{\string a\string b}|\qquad et\qquad\verb|{ab}|\hfil{}\par\smallskip
+ne se développent pas en 2 arguments égaux au yeux de xstring. Dans le premier cas, à cause de l'emploi de la primitive \verb|\string|, les caractères \og\verb|ab|\fg{} ont un catcode de 12 alors que dans l'autre cas, ils ont leurs catcodes naturels de 11. Il convient donc d'être conscient de ces subtilités lorsque l'on emploie des primitives dont les résultats sont des chaînes de caractères ayant des catcodes de 12 et 10 comme \verb|\string|, \verb|\detokenize|, \verb|\meaning|, \verb|\jobname|, \verb|\fontname|, \verb|\romannumeral|, etc.\medskip
+
+Pour demander aux macros de ne pas tenir compte des catcodes, on peut utiliser les macros étoilées. Celles-ci convertissent tous leurs aguments textuels en chaines de caractères dont les catcodes sont 12 (et 10 pour l'espace) avant que la macro non étoilée travaille sur ces arguments ainsi modifiés. De plus amples explications ainsi que des exemples peuvent être consultés au chapitre sur les macros étoilées, page~\pageref{macrosetoilees}.
+
\section{Les macros}
\label{listemacros}
\subsection{Présentation des macros}
@@ -198,7 +211,7 @@ Dans ce chapitre, la totalité des macros est présentée selon ce plan :\smalls
\subsection{Les tests}
\subsubsection{IfSubStr}
-\verb|\IfSubStr|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
+\verb|\IfSubStr|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
\smallskip
L'argument optionnel \argu{nombre} vaut 1 par défaut.\par
@@ -220,7 +233,7 @@ Teste si \argu{chaine} contient au moins \argu{nombre} fois \argu{chaineA} et ex
\exemple|\IfSubStr[4]{1a2a3a}{a}{vrai}{faux}|
\subsubsection{IfSubStrBefore}
-\verb|\IfSubStrBefore|\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
+\verb|\IfSubStrBefore|\etoile\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
\smallskip
Les arguments optionnels \argu{nombre1} et \argu{nombre2} valent 1 par défaut.\par\smallskip
@@ -244,7 +257,7 @@ Dans \argu{chaine}, la macro teste si l'occurrence \no\argu{nombre1} de \argu{ch
\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}
+\verb|\IfSubStrBehind|\etoile\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
\smallskip
Les arguments optionnels \argu{nombre1} et \argu{nombre2} valent 1 par défaut.\par\smallskip
@@ -269,7 +282,7 @@ Dans \argu{chaine}, la macro teste si l'occurrence \no\argu{nombre1} de \argu{ch
\subsubsection{IfBeginWith}
-\verb|\IfBeginWith|\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
+\verb|\IfBeginWith|\etoile\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
\smallskip
Teste si \argu{chaine} commence par \argu{chaineA}, et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\medskip
@@ -285,7 +298,7 @@ Teste si \argu{chaine} commence par \argu{chaineA}, et exécute \argu{vrai} dans
\subsubsection{IfEndWith}
-\verb|\IfEndWith|\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
+\verb|\IfEndWith|\etoile\ARGU{chaine}\ARGU{chaineA}\ARGU{vrai}\ARGU{faux}
\smallskip
Teste si \argu{chaine} se termine par \argu{chaineA}, et exécute \argu{vrai} dans l'affirmative, et \argu{faux} dans le cas contraire.\medskip
@@ -301,7 +314,7 @@ Teste si \argu{chaine} se termine par \argu{chaineA}, et exécute \argu{vrai} da
\subsubsection{IfInteger}
-\verb|\IfInteger|\ARGU{nombre}\ARGU{vrai}\ARGU{faux}
+\verb|\IfInteger|\etoile\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
@@ -320,7 +333,7 @@ Si le test est faux pour cause de caractères non autorisés, la séquence de co
\subsubsection{IfDecimal}\label{ifdecimal}
-\verb|\IfInteger|\ARGU{nombre}\ARGU{vrai}\ARGU{faux}
+\verb|\IfDecimal|\etoile\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
@@ -352,7 +365,7 @@ Si le test est faux pour cause de caractères non autorisés, la séquence de co
\subsubsection{IfStrEq}
-\verb|\IfStrEq|\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
+\verb|\IfStrEq|\etoile\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
@@ -368,7 +381,7 @@ Teste si les chaînes \argu{chaineA} et \argu{chaineB} sont égales, c'est-à-di
\subsubsection{IfEq}
-\verb|\IfStrEq|\ARGU{chaineA}\ARGU{chaineB}\ARGU{vrai}\ARGU{faux}
+\verb|\IfEq|\etoile\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
@@ -377,7 +390,7 @@ Teste si les chaînes \argu{chaineA} et \argu{chaineB} sont égales, \emph{sauf}
\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.
+ \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 ne donne que des résultats entiers et qu'elle arrondit les résultats non entiers à l'entier le plus proche.
\end{Conditions}
\exemple|\IfEq{a1b2c3}{a1b2c3}{vrai}{faux}|
@@ -394,9 +407,50 @@ Teste si les chaînes \argu{chaineA} et \argu{chaineB} sont égales, \emph{sauf}
\exemple|\IfEq{0}{-0.0}{vrai}{faux}|
\exemple|\IfEq{}{}{vrai}{faux}|
+\subsubsection{IfStrEqCase}
+
+\begin{minipage}{\textwidth}
+ \verb|\IfStrEqCase|\etoile\ARGU{chaine}\verb|{%|\par
+ \qquad\qquad\ARGU{chaine1}\ARGU{code1}\verb|%|\par
+ \qquad\qquad\ARGU{chaine2}\ARGU{code2}\verb|%|\par
+ \qquad\qquad\verb|etc...|\par
+ \qquad\qquad\ARGU{chaineN}\ARGU{codeN}\verb|}|\arguC{code alternatif}
+\end{minipage}
+\smallskip
+
+Teste successivement si \argu{chaine} est égale à \argu{chaine1}, \argu{chaine2}, etc. La comparaison se fait au sens de \verb|\IfStrEq| (voir paragraphes précédents). Si un test est positif, le code correspondant est exécuté et la macro se termine. Si tous les tests sont négatifs, le code optionnel \argu{code alternatif} est exécuté s'il est présent.\smallskip
+
+\exemple|\IfStrEqCase{b}{{a}{AA}{b}{BB}{c}{CC}}|
+\exemple*|\IfStrEqCase{abc}{{a}{AA}{b}{BB}{c}{CC}}|
+\exemple|\IfStrEqCase{c}{{a}{AA}{b}{BB}{c}{CC}}[autre]|
+\exemple|\IfStrEqCase{d}{{a}{AA}{b}{BB}{c}{CC}}[autre]|
+\exemple|\IfStrEqCase{+3}{{1}{un}{2}{deux}{3}{trois}}[autre]|
+\exemple|\IfStrEqCase{0.5}{{0}{zero}{.5}{moitié}{1}{un}}[autre]|
+
+\subsubsection{IfEqCase}
+
+\begin{minipage}{\textwidth}
+ \verb|\IfEqCase|\etoile\ARGU{chaine}\verb|{%|\par
+ \qquad\qquad\ARGU{chaine1}\ARGU{code1}\verb|%|\par
+ \qquad\qquad\ARGU{chaine2}\ARGU{code2}\verb|%|\par
+ \qquad\qquad\verb|etc...|\par
+ \qquad\qquad\ARGU{chaineN}\ARGU{codeN}\verb|}|\arguC{code alternatif}
+\end{minipage}
+\smallskip
+
+Teste successivement si \argu{chaine} est égale à \argu{chaine1}, \argu{chaine2}, etc. La comparaison se fait au sens de \verb|\IfEq| (voir paragraphes précédents). Si un test est positif, le code correspondant est exécuté et la macro se termine. Si tous les tests sont négatifs, le code optionnel \argu{code alternatif} est exécuté s'il est présent.\smallskip
+
+\exemple|\IfEqCase{b}{{a}{AA}{b}{BB}{c}{CC}}|
+\exemple*|\IfEqCase{abc}{{a}{AA}{b}{BB}{c}{CC}}|
+\exemple|\IfEqCase{c}{{a}{AA}{b}{BB}{c}{CC}}[autre]|
+\exemple|\IfEqCase{d}{{a}{AA}{b}{BB}{c}{CC}}[autre]|
+\exemple|\IfEqCase{+3}{{1}{un}{2}{deux}{3}{trois}}[autre]|
+\exemple|\IfEqCase{0.5}{{0}{zero}{.5}{moitié}{1}{un}}[autre]|
+
\subsection{Les macros renvoyant une chaîne}
+
\subsubsection{StrBefore}
-\verb|\StrBefore|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
+\verb|\StrBefore|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
\smallskip
L'argument optionnel \argu{nombre} vaut 1 par défaut.\par\smallskip
@@ -419,7 +473,7 @@ Dans \argu{chaine}, renvoie ce qui se trouve avant l'occurrence \no\argu{nombre}
\exemple*|\StrBefore[2]{1b2b3}{b}|
\subsubsection{StrBehind}
-\verb|\StrBehind|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
+\verb|\StrBehind|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
\smallskip
L'argument optionnel \argu{nombre} vaut 1 par défaut.\par\smallskip
@@ -443,7 +497,7 @@ Dans \argu{chaine}, renvoie ce qui se trouve après l'occurrence \no\argu{nombre
\exemple*|\StrBehind[3]{1b2b3}{b}|
\subsubsection{StrBetween}
-\verb|\StrBetween|\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
+\verb|\StrBetween|\etoile\arguCC{nombre1}{nombre2}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
\smallskip
Les arguments optionnels \argu{nombre1} et \argu{nombre2} valent 1 par défaut.\par\smallskip
@@ -469,7 +523,7 @@ Dans \argu{chaine}, renvoie ce qui se trouve entre\footnote{Au sens strict, c'es
\exemple*|\StrBetween[3,2]{abracadabra}{a}{bra}|
\subsubsection{StrSubstitute}
-\verb|\StrSubstitute|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
+\verb|\StrSubstitute|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
\smallskip
L'argument optionnel \argu{nombre} vaut 0 par défaut.\par\smallskip
@@ -496,7 +550,7 @@ Dans \argu{chaine}, la macro remplace les \argu{nombre} premières occurrences d
\exemple|\StrSubstitute[4]{a1a2a3}{a}{B}|
\subsubsection{StrDel}
-\verb|\StrDel|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
+\verb|\StrDel|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
\smallskip
L'argument optionnel \argu{nombre} vaut 0 par défaut.\par\smallskip
@@ -517,9 +571,30 @@ Supprime les \argu{nombre} premières occurrences de \argu{chaineA} dans \argu{c
\exemple|\StrDel{a bc def }{ }|
\exemple*|\StrDel{a bc def }{def}|
+\subsubsection{StrSplit}
+\verb|\StrSplit|\etoile\ARGU{chaine}\ARGU{nombre}\ARGU{chaineA}\ARGU{chaineB}
+\smallskip
+
+La \argu{chaine}, est coupée en deux chaînes après le caractère se situant à la position \argu{nombre}. La partie gauche est assigné à la séquence de contrôle \argu{csA} et la partie droite à \argu{csB}.\par
+Cette macro renvoie \emph{deux chaînes} et donc \textbf{n'affiche rien}. Par conséquent, elle ne dispose pas de l'argument optionnel en dernière position.\medskip
+
+\begin{Conditions}
+ \item Si \argu{nombre}${}\leqslant0$, \argu{csA} sera vide et \argu{csB} contiendra la totalité de \argu{chaine};
+ \item Si \argu{nombre}${}\geqslant$\argu{longueurChaine}, \argu{csA} contiendra la totalité de \argu{chaine} et \argu{csB} sera vide;
+ \item Si \argu{chaine} est vide \argu{csA} et \argu{csB} seront vides, quelque soit l'entier \argu{nombre}.
+\end{Conditions}
+
+\setverbdelim{=}
+\exemple=\StrSplit{abcdef}{4}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\exemple=\StrSplit{a b c }{2}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\exemple=\StrSplit{abcdef}{1}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\exemple=\StrSplit{abcdef}{5}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\exemple=\StrSplit{abcdef}{9}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\exemple=\StrSplit{abcdef}{-3}{\aa}{\bb}résultats : |\aa| et |\bb|=
+\setverbdelim{|}
\subsubsection{StrGobbleLeft}
-\verb|\StrGobbleLeft|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
+\verb|\StrGobbleLeft|\etoile\ARGU{chaine}\ARGU{nombre}\arguC{nom}
\smallskip
Dans \argu{chaine}, enlève les \argu{nombre} premiers caractères de gauche.\medskip
@@ -537,7 +612,7 @@ Dans \argu{chaine}, enlève les \argu{nombre} premiers caractères de gauche.\me
\exemple*|\StrGobbleLeft{a bc def }{4}|
\subsubsection{StrLeft}
-\verb|\StrLeft|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
+\verb|\StrLeft|\etoile\ARGU{chaine}\ARGU{nombre}\arguC{nom}
\smallskip
Dans \argu{chaine}, renvoie la sous-chaîne de gauche de longueur \argu{nombre}.\medskip
@@ -555,7 +630,7 @@ Dans \argu{chaine}, renvoie la sous-chaîne de gauche de longueur \argu{nombre}.
\exemple*|\StrLeft{a bc def }{5}|
\subsubsection{StrGobbleRight}
-\verb|\StrGobbleRight|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
+\verb|\StrGobbleRight|\etoile\ARGU{chaine}\ARGU{nombre}\arguC{nom}
\smallskip
Agit comme \verb|\StrGobbleLeft|, mais enlève les caractères à droite de \argu{chaine}.
@@ -567,7 +642,7 @@ Agit comme \verb|\StrGobbleLeft|, mais enlève les caractères à droite de \arg
\exemple*|\StrGobbleRight{a bc def }{4}|
\subsubsection{StrRight}
-\verb|\StrRight|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
+\verb|\StrRight|\etoile\ARGU{chaine}\ARGU{nombre}\arguC{nom}
\smallskip
Agit comme \verb|\StrLeft|, mais renvoie les caractères à la droite de \argu{chaine}.
@@ -579,7 +654,7 @@ Agit comme \verb|\StrLeft|, mais renvoie les caractères à la droite de \argu{c
\exemple*|\StrRight{a bc def }{5}|
\subsubsection{StrChar}
-\verb|\StrChar|\ARGU{chaine}\ARGU{nombre}\arguC{nom}
+\verb|\StrChar|\etoile\ARGU{chaine}\ARGU{nombre}\arguC{nom}
\smallskip
Renvoie le caractère à la position \argu{nombre} dans la chaîne \argu{chaine}.\medskip
@@ -595,7 +670,7 @@ Renvoie le caractère à la position \argu{nombre} dans la chaîne \argu{chaine}
\exemple|\StrChar{a bc def }{6}|
\subsubsection{StrMid}
-\verb|\StrMid|\ARGU{chaine}\ARGU{nombreA}\ARGU{nombreB}\arguC{nom}
+\verb|\StrMid|\etoile\ARGU{chaine}\ARGU{nombreA}\ARGU{nombreB}\arguC{nom}
\smallskip
Dans \argu{chaine}, renvoie la sous chaîne se trouvant entre\footnote{Au sens large, c'est-à-dire que les chaînes \guill{frontière} sont renvoyés.} les positions \argu{nombreA} et \argu{nombreB}.\medskip
@@ -619,7 +694,7 @@ Dans \argu{chaine}, renvoie la sous chaîne se trouvant entre\footnote{Au sens l
\subsection{Les macros renvoyant des nombres}
\subsubsection{StrLen}
-\verb|\StrLen|\ARGU{chaine}\arguC{nom}
+\verb|\StrLen|\etoile\ARGU{chaine}\arguC{nom}
\smallskip
Renvoie la longueur de \argu{chaine}.
@@ -629,7 +704,7 @@ Renvoie la longueur de \argu{chaine}.
\exemple|\StrLen{a bc def }|
\subsubsection{StrCount}
-\verb|\StrCount|\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
+\verb|\StrCount|\etoile\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
\smallskip
Compte combien de fois \argu{chaineA} est contenue dans \argu{chaine}.\par\medskip
@@ -644,7 +719,7 @@ Compte combien de fois \argu{chaineA} est contenue dans \argu{chaine}.\par\medsk
\exemple|\StrCount{aaaaaa}{aa}|
\subsubsection{StrPosition}
-\verb|\StrPosition|\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
+\verb|\StrPosition|\etoile\arguC{nombre}\ARGU{chaine}\ARGU{chaineA}\arguC{nom}
\smallskip
L'argument optionnel \argu{nombre} vaut 1 par défaut.\par\smallskip
@@ -665,6 +740,46 @@ Dans \argu{chaine}, renvoie la position de l'occurrence \no\argu{nombre} de \arg
\exemple|\StrPosition{a bc def }{d}|
\exemple|\StrPosition[3]{aaaaaa}{aa}|
+\subsubsection{StrCompare}
+\verb|\StrCompare|\etoile\ARGU{chaineA}\ARGU{chaineB}\arguC{nom}
+\smallskip
+
+Cette macro peut fonctionner avec 2 tolérances : la tolérance \guill{normale} sélectionnée par défaut, et la tolérance \guill{stricte}.\medskip
+
+\begin{itemize}
+ \item La tolérance normale, activée par la commande \verb|\comparenormal|.\par
+ La macro compare successivement les caractères de gauche à droite des chaînes \argu{chaineA} et \argu{chaineB} jusqu'à ce qu'une différence apparaîsse ou que la fin de la plus courte chaîne soit atteinte. Si aucune différence n'est trouvée, la macro renvoie 0. Sinon, la position de la 1\iere{} différence est renvoyée.
+ \item La tolérance stricte, activée par la commande \verb|\comparestrict|.\par
+ La macro compare les 2 chaînes. Si elles sont égales, elle renvoie 0 sinon la position de la 1\iere{} différence est renvoyée.
+\end{itemize}
+\smallskip
+
+L'ordre des 2 chaînes n'a aucune influence sur le comportement de la macro.\medskip
+
+Exemples en tolérance normale :\par\comparenormal
+\exemple|\StrCompare{abcd}{abcd}|
+\exemple|\StrCompare{abcd}{abc}|
+\exemple|\StrCompare{abc}{abcd}|
+\exemple|\StrCompare{éùçà}{éùçà}|
+\exemple|\StrCompare{a b c}{abc}|
+\exemple|\StrCompare{aaa}{baaa}|
+\exemple|\StrCompare{abc}{xyz}|
+\exemple|\StrCompare{123456}{123457}|
+\exemple|\StrCompare{abc}{}|
+\medskip
+
+Exemples en tolérance stricte :\par\comparestrict
+\exemple|\StrCompare{abcd}{abcd}|
+\exemple|\StrCompare{abcd}{abc}|
+\exemple|\StrCompare{abc}{abcd}|
+\exemple|\StrCompare{éùçà}{éùçà}|
+\exemple|\StrCompare{a b c}{abc}|
+\exemple|\StrCompare{aaa}{baaa}|
+\exemple|\StrCompare{abc}{xyz}|
+\exemple|\StrCompare{123456}{123457}|
+\exemple|\StrCompare{abc}{}|
+\comparenormal
+
\section{Utilisation des macros à des fins de programmation}
\label{programmation}
\subsection{Verbatimiser vers une séquence de contrôle}
@@ -846,7 +961,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
@@ -996,51 +1111,44 @@ Dans l'exemple artificiel\footnote{On peut agir beaucoup plus simplement en util
\bracearg{\a}
\end{minipage}
-\subsection{Macros étoilées}
-Comme \verb|\scancs| donne du \texte{10,12}\voirdeftexte, cela pose des problèmes pour les macros listées au chapitre~\ref{listemacros}, car elles tiennent compte du catcode des caractères de leurs arguments textuels.\medskip
+\subsection{Macros étoilées}\label{macrosetoilees}
+Les macros manipulant les chaînes de caractères prennent en compte les catcodes des caractères. Pour s'affranchir d'éventuelles différences entre les catcodes des arguments et éviter des résultats inattendus, toutes ces macros disposent de version étoilées. Les versions étoilées convertissent tous les arguments textuels en chaîne de caractètres dont les catcodes sont 12, et 10 pour l'espace. Ces arguments ainsi modifiés sont transmis aux macros non étoilées.\medskip
-Voici un exemple :\par\medskip
+Voici un exemple :\par\smallskip
\begin{minipage}[r]{0.6\linewidth}
\hfill
\begin{boxedverbatim}
- \verbtocs{\mytext}|a b c|
- \IfSubStr{\mytext}{b}{vrai}{faux}
- \par
- \edef\onecs{x y z}
- \scancs[1]\mycs\onecs
- \IfSubStr{\mycs}{y}{vrai}{faux}
+ \IfStrEq{\string a\string b}{ab}{vrai}{faux}\par
+ \IfStrEq*{\string a\string b}{ab}{vrai}{faux}
\end{boxedverbatim}
\hspace{0.3cm}
\end{minipage}%
\begin{minipage}[r]{0.3\linewidth}
- \verbtocs{\mytext}|a b c|
- \IfSubStr{\mytext}{b}{vrai}{faux}
- \par
- \edef\onecs{x y z}
- \scancs[1]\mycs\onecs
- \IfSubStr{\mycs}{y}{vrai}{faux}
-\end{minipage}
-\medskip
+ \IfStrEq{\string a\string b}{ab}{vrai}{faux}\par
+ \IfStrEq*{\string a\string b}{ab}{vrai}{faux}
+\end{minipage}\smallskip
-Le premier test renvoie vrai puisque la macro \verb|\verbtocs| ne modifie pas les catcodes des caractères non spéciaux : ainsi, \verb|\mytext| se développe en \og{}\verb|a|${}_{11}$\ \verb*| |${}_{10}$\ \verb|b|${}_{11}$\ \verb*| |${}_{10}$\ \verb|c|${}_{11}$\fg{} qui contient bien le deuxième argument qui est \og{}\verb|b|${}_{11}$\fg{}.\medskip
+Dans l'exemple ci-dessus, le premier argument contient \verb|{ab}| où, à cause de \verb|\string|, les 2 caractères ont un catcode de 12. Le deuxième argument est \verb|{ab}| où les caractères ont leurs catcodes naturels de 11. Les chaînes n'étant pas égales à cause des catcodes, le test est donc \emph{négatif} dans la version non étoilée.\medskip
-Pour le second test, puisque \verb|\scancs| donne du \texte{10,12}, il renvoit faux puisque \verb|\mycs| se développe en\newline\og{}\verb|x|${}_{12}$\ \verb*| |${}_{10}$\ \verb|y|${}_{12}$\ \verb*| |${}_{10}$\ \verb|z|${}_{12}$\fg{} qui ne contient pas le deuxième argument qui est \og{}\verb|y|${}_{11}$\fg{}.\bigskip
-
-Pour éviter ce désagrément dû à cette différence de catcodes, et les rendre \guill{compatibles} avec \verb|\scancs|, les macros présentées au chapitre \ref{listemacros} ont toutes une version étoilée qui converti le contenu des arguments textuels en caractères dont les catcodes sont 12 uniquement, ou 10 pour les espaces :\par\medskip
+Voici un autre exemple :\par\smallskip
\begin{minipage}[r]{0.6\linewidth}
\hfill
\begin{boxedverbatim}
- \edef\onecs{x y z}
- \scancs[1]\mycs\onecs
- \IfSubStr*{\mycs}{y}{vrai}{faux}
+ \scancs[0]\montexte{abc}
+ \StrPosition{\montexte}{b}\par
+ \StrPosition*{\montexte}{b}\par
\end{boxedverbatim}
\hspace{0.3cm}
\end{minipage}%
\begin{minipage}[r]{0.3\linewidth}
- \edef\onecs{x y z}
- \scancs[1]\mycs\onecs
- \IfSubStr*{\mycs}{y}{vrai}{faux}
-\end{minipage}
+ \scancs[0]\montexte{abc}
+ \StrPosition{\montexte}{b}\par
+ \StrPosition*{\montexte}{b}\par
+\end{minipage}\medskip
+
+La séquence de contrôle \verb|\montexte| contient \verb|{abc}| dont les catcodes valent 12 puisque \verb|\scancs| renvoie des chaînes de caractères de catcodes 12 et 10. La version non étoilée renvoie 0 ce qui signifie qu'elle considère que le caractère \og{}\verb|b|${}_{11}$\fg{} n'est pas contenu dans \og{}\verb|a|${}_{12}$\verb|b|${}_{12}$\verb|c|${}_{12}$\fg{}.\bigskip
+
+Pour les macros renvoyant une chaîne, si on emploie les versions étoilées, le résultat sera une chaîne de caractères dont les catcodes sont 12, et 10 pour l'espace. Ainsi après un \og\verb|\StrBefore*{a b c d}{c}[\montexte]|\fg{}, la séquence de contrôle \verb|\montexte| se développera en \og{}\verb|a|${}_{12}$\verb*| |${}_{10}$\verb|b|${}_{12}$\verb*| |${}_{10}$\fg{}.
\subsection{Exemples d'utilisation en programmation}
\label{exemples}
@@ -1206,11 +1314,12 @@ Soit une séquence de contrôle \verb|\myCS| définie par un \verb|\def| contena
\ifnum\nbgroup<#1% si c'est pas le bon groupe
\StrBehind{\chaine}{\group}[\chaine]%
\occurr=0% on initialise \chaine et \occur
- \findthegroup% et on recommence
+ \expandafter\expandafter\expandafter
+ \findthegroup\expandafter% et on recommence
\fi
\else% accolades non équilibrées ?
% cherche accolade fermante suivante
- \findthegroup
+ \expandafter\findthegroup
\fi}
\findthegroup
\group}
@@ -1242,11 +1351,12 @@ Soit une séquence de contrôle \verb|\myCS| définie par un \verb|\def| contena
\ifnum\nbgroup<#1% si c'est pas le bon groupe
\StrBehind{\chaine}{\group}[\chaine]%
\occurr=0% on initialise \chaine et \occur
- \findthegroup% et on recommence
+ \expandafter\expandafter\expandafter
+ \findthegroup\expandafter% et on recommence
\fi
\else% accolades non équilibrées ?
% cherche accolade fermante suivante
- \findthegroup
+ \expandafter\findthegroup
\fi}
\findthegroup
\group}
@@ -1260,14 +1370,13 @@ Soit une séquence de contrôle \verb|\myCS| définie par un \verb|\def| contena
\end{minipage}
\medskip
-On peut observer qu'il faut deux compteurs, deux tests et une double récursivité pour trouver le bon groupe : un de chaque pour compter quelle accolade fermante va délimiter le groupe en cours, et l'autre pour compter quel groupe est examiné.\bigskip\bigskip
+On peut observer qu'il faut deux compteurs, deux tests et une double récursivité pour trouver le bon groupe : un de chaque pour compter quelle accolade fermante va délimiter le groupe en cours, et l'autre pour compter quel groupe est examiné.\vspace{10pt}
\begin{center}
-$\star$
-
+$\star$\par
$\star$\quad$\star$
\end{center}
-\bigskip\bigskip
+\vspace{10pt}
C'est tout, j'espère que ce package vous sera utile !\par
Merci de me signaler par email tout bug ou toute proposition d'amélioration\ldots\medskip