From 88363fa054edfe4dafa9a338ec24f3e062c1f26a Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 29 Apr 2020 21:21:14 +0000 Subject: xlop (29apr20) git-svn-id: svn://tug.org/texlive/trunk@54936 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/generic/xlop/LISEZMOI | 61 +- Master/texmf-dist/doc/generic/xlop/README | 5 +- Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.pdf | Bin 346691 -> 394072 bytes Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.tex | 1953 +++++++++++--------- Master/texmf-dist/doc/generic/xlop/xlop-doc.pdf | Bin 328002 -> 373942 bytes Master/texmf-dist/doc/generic/xlop/xlop-doc.tex | 261 ++- Master/texmf-dist/source/generic/xlop/manual.sty | 48 - Master/texmf-dist/tex/generic/xlop/xlop.sty | 2 +- Master/texmf-dist/tex/generic/xlop/xlop.tex | 236 ++- 9 files changed, 1459 insertions(+), 1107 deletions(-) delete mode 100644 Master/texmf-dist/source/generic/xlop/manual.sty (limited to 'Master') diff --git a/Master/texmf-dist/doc/generic/xlop/LISEZMOI b/Master/texmf-dist/doc/generic/xlop/LISEZMOI index dac91214966..db50d05a196 100644 --- a/Master/texmf-dist/doc/generic/xlop/LISEZMOI +++ b/Master/texmf-dist/doc/generic/xlop/LISEZMOI @@ -1,15 +1,15 @@ -PRÉSENTATION RAPIDE +PRÉSENTATION RAPIDE ------------------- -L'extension xlop s'articule autour de deux fonctionnalités -générales. La première consiste à afficher les opérations de façon -automatique (posées ou en ligne), c'est-à-dire en ne fournissant que -les opérandes de l'opération. La seconde consiste à permettre de -manipuler des nombres de taille quelconque, la seule limitation étant -la mémoire de TeX. Ces manipulations incluent toutes les opérations -usuelles, les entrées-sorties, la notion de variable numérique, les -tests et quelques opérations de haut niveau (sans permettre les -opérations nécessitant un traitement infini telles l'exponentielle, -les fonctions trigonométriques, etc.). +L'extension xlop s'articule autour de deux fonctionnalités +générales. La première consiste à afficher les opérations de façon +automatique (posées ou en ligne), c'est-à-dire en ne fournissant que +les opérandes de l'opération. La seconde consiste à permettre de +manipuler des nombres de taille quelconque, la seule limitation étant +la mémoire de TeX. Ces manipulations incluent toutes les opérations +usuelles, les entrées-sorties, la notion de variable numérique, les +tests et quelques opérations de haut niveau (sans permettre les +opérations nécessitant un traitement infini telles l'exponentielle, +les fonctions trigonométriques, etc.). DISTRIBUTION ------------ @@ -20,16 +20,14 @@ Tous les fichiers sources sont sous licence lppl Contenu ------- La distribution comporte les fichiers suivants : - - LISEZ.MOI (celui que vous êtes en train de lire) ; - - README (le même en anglais) ; + - LISEZ.MOI (celui que vous êtes en train de lire) ; + - README (le même en anglais) ; - history.txt qui retrace l'historique rapide du projet ; - - manual.sty qui est le fichier de style nécessaire à la compilation - des fichiers de documentation ; - - xlop-doc-fr.tex qui est le source du manuel français de l'utilisateur + - xlop-doc-fr.tex qui est le source du manuel français de l'utilisateur de xlop ; - xlop-doc.tex qui est le source du manuel anglais de l'utilisateur de xlop ; - - xlop-doc-fr.pdf qui est le pdf du manuel français de l'utilisateur + - xlop-doc-fr.pdf qui est le pdf du manuel français de l'utilisateur de xlop ; - xlop-doc.pdf qui est le pdf du manuel anglais de l'utilisateur de xlop ; @@ -38,32 +36,31 @@ La distribution comporte les fichiers suivants : Installation ------------ -L'extension étant prévue pour pouvoir fonctionner aussi bien sous TeX +L'extension étant prévue pour pouvoir fonctionner aussi bien sous TeX que sous LaTeX, les recommandations de la TDS indiquent que l'endroit le plus correct pour placer le fichier xlop.tex est [texmf]/tex/generic/xlop/ et celui pour placer le fichier xlop.sty est [texmf]/tex/latex/xlop/ -Il reste les fichiers de documentation (LISEZ.MOI, README, -history.txt, manual.sty et fr-user.*). Leur place normale devrait -être [texmf]/doc/xlop/. +Il reste les fichiers de documentation (LISEZ.MOI, README, history.txt +et fr-user.*). Leur place normale devrait être [texmf]/doc/xlop/. -Il reste à rafraichir la base en lançant la commande texhash (ou -mktexlsr, ou ...) et tout devrait être opérationnel. +Il reste à rafraichir la base en lançant la commande texhash (ou +mktexlsr, ou ...) et tout devrait être opérationnel. -BOGUES ET AUTRES DÉSAGREMENTS +BOGUES ET AUTRES DÉSAGREMENTS ----------------------------- -Si vous détectez un bogue, quel que soit sa gravité (cela peut -simplement être des espaces parasites par exemple) essayez de réaliser +Si vous détectez un bogue, quel que soit sa gravité (cela peut +simplement être des espaces parasites par exemple) essayez de réaliser un exemple le plus court possible reproduisant le bogue. En -particulier, ne mettez aucune autre extension non nécessaire. Envoyez -le source ainsi qu'une explication, éventuellement très courte, du -problème rencontré à l'adresse suivante : +particulier, ne mettez aucune autre extension non nécessaire. Envoyez +le source ainsi qu'une explication, éventuellement très courte, du +problème rencontré à l'adresse suivante : Jean-Come.Charpentier@wanadoo.fr -Si vous souhaitez une certaine fonctionnalité pour une version -ultérieure de l'extension, n'hésitez pas à en faire part à -l'auteur. Pour aider mon logiciel antispam, écrivez 'xlop' dans le +Si vous souhaitez une certaine fonctionnalité pour une version +ultérieure de l'extension, n'hésitez pas à en faire part à +l'auteur. Pour aider mon logiciel antispam, écrivez 'xlop' dans le sujet du message. diff --git a/Master/texmf-dist/doc/generic/xlop/README b/Master/texmf-dist/doc/generic/xlop/README index ca05f549833..549ecf233ea 100644 --- a/Master/texmf-dist/doc/generic/xlop/README +++ b/Master/texmf-dist/doc/generic/xlop/README @@ -20,7 +20,6 @@ Distribution consists of files: * README (the file you are reading) * LISEZ.MOI (same in french) * history.txt relates project history - * manual.sty package file to compile documentation * xlop-doc-fr.tex and xlop-doc-fr.pdf source and pdf of french user's manual of xlop * xlop-doc.tex and xlop-doc.pdf source and pdf of english user's @@ -36,8 +35,8 @@ that the best place to put the file xlop.tex is and that the best place to put xlop xlop.sty is [texmf]/tex/latex/xlop/ -For documentation files (README, history.txt, manual.sty, and -fr-user.*), best place should be [texmf]/doc/generic/xlop/. +For documentation files (README, history.txt, and fr-user.*), best +place should be [texmf]/doc/generic/xlop/. You have just to run texhash command (or mktexlsr, or ...) to refresh your texmf base and all should work fine. diff --git a/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.pdf b/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.pdf index 04743ca0a2f..0766e914774 100644 Binary files a/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.pdf and b/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.pdf differ diff --git a/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.tex b/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.tex index 060cde198b5..de4a1b7785c 100644 --- a/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.tex +++ b/Master/texmf-dist/doc/generic/xlop/xlop-doc-fr.tex @@ -1,8 +1,57 @@ \documentclass[12pt]{report} -\usepackage{manual} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{fourier} +\usepackage[scaled]{helvet} +\usepackage[scaled]{luximono} +\usepackage{makeidx} +\usepackage{longtable} +\usepackage{multicol} +\usepackage{pst-node} +\usepackage{fancyvrb-ex} +\usepackage{geometry} +\usepackage{xlop} \usepackage[frenchb]{babel} \usepackage[autolanguage]{numprint} -\fvset{label=source}% français +\usepackage{dcolumn} +\usepackage{hyperref} +\usepackage{microtype} + +\fvset{label=source}% français + +\fvset{xrightmargin=5cm,frame=single,fontsize=\small} +\geometry{a4paper,left=4cm,right=4cm,top=3cm,bottom=3cm,nohead} + +\let\SBSori\SideBySideExample +\def\SideBySideExample{% + \par\bigbreak\SBSori +} +\let\endSBSori\endSideBySideExample +\def\endSideBySideExample{% + \endSBSori + \par\bigskip\noindent} + +\newenvironment{syntaxBNF}{% + \catcode`\_=12 + \def\*##1*{$\langle$##1$\rangle$}% + \def\alt{\unskip~$|$~\ignorespaces}% + \def\sameline{\multicolumn{1}{c}{} & \null\quad}% + \ttfamily + \begin{center}\begin{tabular}{r@{\quad:=\quad}l}} +{\end{tabular}\end{center}} + +\setlongtables +\newcommand\package[1]{\textsf{#1}} +\newcommand\file[1]{\texttt{#1}} + +\newcommand\macro[1]{\texttt{$\backslash$#1}\index{#1@\texttt{\boi {#1}}}} +\newcommand\parameter[1]{\texttt{#1}\index{#1@\texttt{#1}}% + \index{parametre@paramètre!\texttt{#1}}} + +\newcommand\bull{\vrule width3pt height4pt depth-1pt} + +\newcounter{stuff} +\makeindex \begin{document} \begin{titlepage} @@ -25,7 +74,7 @@ \end{center} \vfill \begin{center} - Jean-Côme Charpentier\\ + Jean-Côme Charpentier\\ \today \end{center} \vfill\null\par @@ -36,59 +85,59 @@ \newpage \pagenumbering{arabic} -\chapter{Présentation} -\label{chap:Présentation} -L'extension \package{xlop} a été développée pour permettre de réaliser -automatiquement des calculs arithmétiques sur des nombres de taille -quelconque et d'afficher les résultats sous forme posée ou en -ligne. Voici un premier exemple permettant de donner un aperçu de la +\chapter{Présentation} +\label{chap:Présentation} +L'extension \package{xlop} a été développée pour permettre de réaliser +automatiquement des calculs arithmétiques sur des nombres de taille +quelconque et d'afficher les résultats sous forme posée ou en +ligne. Voici un premier exemple permettant de donner un aperçu de la syntaxe de base : \begin{SideBySideExample} \opadd{45,05}{78,4} \end{SideBySideExample} Ce premier exemple appelle quelques commentaires qui permettront de -donner une idée sur la façon de manipuler l'extension. +donner une idée sur la façon de manipuler l'extension. -L'addition est posée \og comme à l'école \fg{} : il s'agit de la -présentation par défaut. On a un alignement sur la virgule des -opérandes et du résultat, le symbole opératoire placé à gauche est -centrée verticalement entre les deux opérandes et le séparateur -décimal est un point malgré le fait d'avoir indiquer les opérandes +L'addition est posée \og comme à l'école \fg{} : il s'agit de la +présentation par défaut. On a un alignement sur la virgule des +opérandes et du résultat, le symbole opératoire placé à gauche est +centrée verticalement entre les deux opérandes et le séparateur +décimal est un point malgré le fait d'avoir indiquer les opérandes avec une virgule dans l'appel de la macro. Enfin, on notera la -présence d'une retenue au dessus de la première opérande. - -Mis à part l'alignement sur la virgule qui est obligatoire pour -l'addition posée, toutes les autres caractéristiques décrites -ci-dessus sont paramétrables. Certaines macros de l'extension et, en -tout cas, toutes les macros affichant les opérations arithmétiques -admettent un argument optionnel qui permettra de contrôler la -présentation. Pour cela, on utilisera une syntaxe \og à la keyval -\fg{} : on spécifie une suite de modifications de paramètres par une -liste d'affectations séparées par des virgules. Une affectation a +présence d'une retenue au dessus de la première opérande. + +Mis à part l'alignement sur la virgule qui est obligatoire pour +l'addition posée, toutes les autres caractéristiques décrites +ci-dessus sont paramétrables. Certaines macros de l'extension et, en +tout cas, toutes les macros affichant les opérations arithmétiques +admettent un argument optionnel qui permettra de contrôler la +présentation. Pour cela, on utilisera une syntaxe \og à la keyval +\fg{} : on spécifie une suite de modifications de paramètres par une +liste d'affectations séparées par des virgules. Une affectation a une des deux syntaxes possibles ci-dessous : \begin{verbatim} - = - + = + \end{verbatim} -la seconde possibilité étant en fait un raccourci pour : +la seconde possibilité étant en fait un raccourci pour : \begin{verbatim} - =true + =true \end{verbatim} Dans cette liste d'affectation, on peut faire suivre les virgules par un ou plusieurs espaces mais il ne faut pas mettre d'espace de part et -d'autre du signe égal ou avant la virgule : un paramètre ou une valeur -pouvant (potentiellement) comporter le caractère espace. +d'autre du signe égal ou avant la virgule : un paramètre ou une valeur +pouvant (potentiellement) comporter le caractère espace. -Ainsi, si l'on veut un séparateur décimal qui soit une virgule, un -symbole opératoire placé en face de la seconde opérande et en -supprimant la présence des retenues, il suffit d'indiquer : +Ainsi, si l'on veut un séparateur décimal qui soit une virgule, un +symbole opératoire placé en face de la seconde opérande et en +supprimant la présence des retenues, il suffit d'indiquer : \begin{SideBySideExample} \opadd[decimalsepsymbol={,}, voperator=bottom, carryadd=false]{45.05}{78.4} \end{SideBySideExample} -On notera la petite astuce consistant à mettre la virgule entre -accolades dans la définition du symbole du séparateur décimal. En +On notera la petite astuce consistant à mettre la virgule entre +accolades dans la définition du symbole du séparateur décimal. En effet, la syntaxe : \begin{Verbatim}[xrightmargin=0pt] \opadd[decimalsepsymbol=,,voperator=bottom, @@ -98,12 +147,12 @@ est fautive : \package{xlop} ne comprenant plus trop bien ce qu'est cette \og liste \fg{} ! Un autre point important quoique moins visible, est que les chiffres -sont disposés à des emplacements très précis. Chaque chiffre est placé -dans une boîte de largeur et de hauteur fixes (paramétrables), le -séparateur décimal est, par défaut, placé dans une boîte de largeur -nulle et toutes les lignes sont régulièrement espacées qu'il y ait ou +sont disposés à des emplacements très précis. Chaque chiffre est placé +dans une boîte de largeur et de hauteur fixes (paramétrables), le +séparateur décimal est, par défaut, placé dans une boîte de largeur +nulle et toutes les lignes sont régulièrement espacées qu'il y ait ou non un trait horizontal. Cela permet d'obtenir des alignements -rigoureux et permet également de placer ce que l'on veut à +rigoureux et permet également de placer ce que l'on veut à l'emplacement que l'on veut. \begin{SideBySideExample} \psset{xunit=\opcolumnwidth, @@ -112,28 +161,28 @@ l'emplacement que l'on veut. \oplput(1.5,3){retenue} \psline{->}(1,3.15)(-3.25,3.15) \end{SideBySideExample} -Cet exemple a été réalisé en utilisant l'extension +Cet exemple a été réalisé en utilisant l'extension \package{pstricks}\index{pstricks@\package{pstricks}} -Nous avons dit précédemment que \package{xlop} était capable de +Nous avons dit précédemment que \package{xlop} était capable de manipuler des nombres de taille quelconque. Nous reviendrons plus en -détail sur cette possibilité et nous nous contenterons ici de ne donner +détail sur cette possibilité et nous nous contenterons ici de ne donner qu'un exemple de ce que cela peut offrir. Ne regardez pas trop le -code, les explications seront données plus loin dans ce manuel, pour -l'instant, admirez seulement le résultat ! +code, les explications seront données plus loin dans ce manuel, pour +l'instant, admirez seulement le résultat ! \begin{CenterExample}[xrightmargin=0pt] \opdiv[style=text,period]{1}{49} \end{CenterExample} -L'extension \package{xlop} offre quelques autres fonctionnalités. Il -est ainsi possible de manipuler les nombres par l'intermédiaire de -variables, ces variables pouvant être créées par une assignation -simple ou bien comme résultat d'un calcul. On peut également manipuler -les chiffres de façon individuelle : +L'extension \package{xlop} offre quelques autres fonctionnalités. Il +est ainsi possible de manipuler les nombres par l'intermédiaire de +variables, ces variables pouvant être créées par une assignation +simple ou bien comme résultat d'un calcul. On peut également manipuler +les chiffres de façon individuelle : \begin{SideBySideExample} \opadd*{45.05}{78.4}{r}% - Le premier chiffre après la virgule de - $45.05+78.4$ est un + Le premier chiffre apr\`es la + virgule de $45.05+78.4$ est un \opgetdecimaldigit{r}{1}{d}% $\opprint{d}$. \end{SideBySideExample} @@ -142,18 +191,18 @@ effectuer des tests : \opadd*{45.05}{78.4}{r}% La somme $45.05+78.4$ est \opcmp{r}{100}% - \ifopgt strictement supérieure - \else\ifoplt strictement inférieure - \else égale + \ifopgt strictement sup\'erieure + \else\ifoplt strictement inf\'erieure + \else \'egale \fi\fi - à $100$. + \`a $100$. \end{SideBySideExample} -avoir accès à quelques opérations ou fonctions : +avoir accès à quelques opérations ou fonctions : \begin{SideBySideExample} Le pgcd de $182$ et $442$ est \opgcd{182}{442}{d}$\opprint{d}$ \end{SideBySideExample} -pouvoir réaliser des calculs complexes sous forme infixe : +pouvoir réaliser des calculs complexes sous forme infixe : \begin{SideBySideExample} \opexpr{(2+3^2)/(gcd(22,33))}{r}% $$\frac{2+3^2}{\gcd(22,33)} = @@ -161,31 +210,31 @@ pouvoir r \end{SideBySideExample} \chapter{Instruction \package{xlop}} -\`A quelques exceptions près qui seront étudiées en temps voulu, les -macros de \package{xlop} peuvent éventuellement avoir un argument +\`A quelques exceptions près qui seront étudiées en temps voulu, les +macros de \package{xlop} peuvent éventuellement avoir un argument optionnel entre crochets pour modifier localement la valeur des -paramètres de fonctionnement, les autres arguments (qui sont -obligatoires) étant presque toujours des nombres. Les deux sections de -ce chapitre décrivent en détail ce qu'est un nombre pour -\package{xlop} et comment se servir des paramètres. +paramètres de fonctionnement, les autres arguments (qui sont +obligatoires) étant presque toujours des nombres. Les deux sections de +ce chapitre décrivent en détail ce qu'est un nombre pour +\package{xlop} et comment se servir des paramètres. -\section{Au début était le nombre} -\label{sec:Au début etait le nombre} +\section{Au début était le nombre} +\label{sec:Au début etait le nombre} \subsection{Taille} \label{subsec:Taille} -Avant de voir la syntaxe générale d'un nombre, nous allons nous -pencher sur la particularité de \package{xlop} qui est de pouvoir +Avant de voir la syntaxe générale d'un nombre, nous allons nous +pencher sur la particularité de \package{xlop} qui est de pouvoir manipuler des nombres de taille quelconque. -\index{nombre!taille}Pour être tout à fait précis, la taille théorique +\index{nombre!taille}Pour être tout à fait précis, la taille théorique maximum d'un nombre est de $2^{31}-1$ chiffres\index{nombre!limite}. -En pratique, cette limite ne pourra pas être atteinte pour deux -raisons essentielles. La première est qu'une multiplication avec deux -opérandes ayant $2^{25}$ chiffres demanderait plus de $7\,000$ années +En pratique, cette limite ne pourra pas être atteinte pour deux +raisons essentielles. La première est qu'une multiplication avec deux +opérandes ayant $2^{25}$ chiffres demanderait plus de $7\,000$ années de calcul sur l'ordinateur de l'auteur ! La seconde est beaucoup plus -restrictive car elle est liée aux limites de taille des piles de +restrictive car elle est liée aux limites de taille des piles de \TeX{}. Voici un tableau indiquant une compilation sous \TeX{} avec -une multiplication de deux opérandes de même taille sur une machine +une multiplication de deux opérandes de même taille sur une machine Linux, pentium~II~600 et 256~Mo de RAM : \begin{center} \begin{tabular}{|l|*{6}{c|}} @@ -194,24 +243,24 @@ Linux, pentium~II~600 et 256~Mo de RAM : temps de compilation (s) & 2 & 8 & 18 & 32 & 36 & crash \\\hline \end{tabular} \end{center} -Le \og crash \fg{} indiqué dans le tableau est dû au débordement de la +Le \og crash \fg{} indiqué dans le tableau est dû au débordement de la table de hachage (hash table). \index{hash table}% -\index{depassement de capacite@dépassement de capacité}% -Sous \LaTeX{}, la limite avant crash sera plus réduite. D'autre part, -ces tests ont été effectués sur un fichier minimum : avec un document +\index{depassement de capacite@dépassement de capacité}% +Sous \LaTeX{}, la limite avant crash sera plus réduite. D'autre part, +ces tests ont été effectués sur un fichier minimum : avec un document source classique, cette limite sera un peu plus basse. Une autre -limite qui risque d'être atteinte relativement rapidement est la +limite qui risque d'être atteinte relativement rapidement est la taille du spouleur (spool size). \index{spool size}% Pour composer ce document qui contient un grand nombre d'appel aux -macros de \package{xlop}, l'auteur a augmenté la taille du spouleur -de~$125\,000$ à~$250\,000$ en éditant la ligne \verb+pool_size+ du -fichier \file{texmf.cnf}. De même, la table de hachage a dû être -augmentée en stipulant la valeur \texttt{1000} au niveau de la ligne +macros de \package{xlop}, l'auteur a augmenté la taille du spouleur +de~$125\,000$ à~$250\,000$ en éditant la ligne \verb+pool_size+ du +fichier \file{texmf.cnf}. De même, la table de hachage a dû être +augmentée en stipulant la valeur \texttt{1000} au niveau de la ligne \verb+hash_extra+ du fichier \file{texmf.cnf}. \subsection{Syntaxe} \label{subsec:Syntaxe} -Nous allons présenter cette syntaxe avec la grammaire BNF mais des +Nous allons présenter cette syntaxe avec la grammaire BNF mais des explications plus humaines suivront : \begin{syntaxBNF} \*nombre* & \{\*signe*\}\*nombre_positif* \alt \*nom* \\ @@ -220,21 +269,21 @@ explications plus humaines suivront : \sameline \*entier*\*sep* \alt \*entier*\*sep*\*entier* \\ \*sep* & . \alt , \\ \*entier* & \*chiffre*\{\*chiffre*\} \\ - \*nom* & \*début*\{caractère\} \\ - \*début* & caractère \textnormal{autre que } \*signe*\textnormal{,} + \*nom* & \*début*\{caractère\} \\ + \*début* & caractère \textnormal{autre que } \*signe*\textnormal{,} \*sep* \\ \sameline \textnormal{et} \*chiffre* \end{syntaxBNF} \index{syntaxe BNF}\index{BNF}\index{grammaire BNF} -Le symbole \texttt{caractère} désigne presque n'importe quel caractère -accepté par \TeX{}. Les seules exceptions sont les caractères \verb+%+, -et \verb+#+ qui sont totalement interdits. En fait, les caractères -actifs risquent de poser des problèmes. Par exemple, la définition de -\verb+~+ sous \LaTeX{} empêche ce caractère de pouvoir faire partie -d'un nom. D'autre part, le caractère \verb+\ +conserve sont rôle de -caractère d'échappement, c'est-à-dire que le nom sera celui obtenu -après développement de la macro introduite. Il n'y a aucune autre +Le symbole \texttt{caractère} désigne presque n'importe quel caractère +accepté par \TeX{}. Les seules exceptions sont les caractères \verb+%+, +et \verb+#+ qui sont totalement interdits. En fait, les caractères +actifs risquent de poser des problèmes. Par exemple, la définition de +\verb+~+ sous \LaTeX{} empêche ce caractère de pouvoir faire partie +d'un nom. D'autre part, le caractère \verb+\ +conserve sont rôle de +caractère d'échappement, c'est-à-dire que le nom sera celui obtenu +après développement de la macro introduite. Il n'y a aucune autre contrainte comme le montre le code suivant : \begin{SideBySideExample} \newcommand\prefix{a/b} @@ -243,83 +292,83 @@ contrainte comme le montre le code suivant : \end{SideBySideExample} \index{nom de nombre}% On notera que \verb+a/b_{^c}!&$+ et \verb+\prefix_{^c}!&$+ -représentent très exactement le même nom, si \verb+\prefix+ a la -définition adéquate évidemment. Cette possibilité d'obtenir un nom en +représentent très exactement le même nom, si \verb+\prefix+ a la +définition adéquate évidemment. Cette possibilité d'obtenir un nom en utilisant des macros peut sembler inutile mais il n'en est rien. On -peut ainsi réaliser des boucles\index{boucle} avec des noms tels que +peut ainsi réaliser des boucles\index{boucle} avec des noms tels que \verb+r1+, \verb+r2+, \ldots, \verb+r+ en utilisant le code -\verb+r\the\cpt+ comme nom où \verb+cpt+ est un compteur au sens -\TeX{}. Le mécanisme des compteurs avec \LaTeX{} donne un code un peu -plus long avec \verb+r\number\value{cpt}+ où \verb+cpt+ est maintenant +\verb+r\the\cpt+ comme nom où \verb+cpt+ est un compteur au sens +\TeX{}. Le mécanisme des compteurs avec \LaTeX{} donne un code un peu +plus long avec \verb+r\number\value{cpt}+ où \verb+cpt+ est maintenant un compteur au sens \LaTeX. Nous verrons un exemple d'utilisation de -cette forme à la section~\ref{sec:Creation d'operations complexes} +cette forme à la section~\ref{sec:Creation d'operations complexes} page~\pageref{sec:Creation d'operations complexes}. -\index{nombre!valide}En pratique, que signifient toutes ces règles ? -Elles indiquent d'abord qu'un nombre écrit sous forme décimale peut -être précédé par n'importe quelle séquence de signes plus et moins. -Évidemment, le nombre sera négatif lorsqu'il y aura un nombre impair +\index{nombre!valide}En pratique, que signifient toutes ces règles ? +Elles indiquent d'abord qu'un nombre écrit sous forme décimale peut +être précédé par n'importe quelle séquence de signes plus et moins. +Évidemment, le nombre sera négatif lorsqu'il y aura un nombre impair de signes moins. Ensuite, un nombre ne peut comporter qu'un seul -séparateur décimal qui peut être le point ou la virgule, celui-ci -pouvant être placé n'importe où dans le nombre. Enfin, l'écriture d'un -nombre s'effectue obligatoirement en base~10. Attention : ces règles -signifient également que \verb+-a+ n'est pas valide. +séparateur décimal qui peut être le point ou la virgule, celui-ci +pouvant être placé n'importe où dans le nombre. Enfin, l'écriture d'un +nombre s'effectue obligatoirement en base~10. Attention : ces règles +signifient également que \verb+-a+ n'est pas valide. -L'extension utilise quelques noms de façon interne et il est plus -prudent de ne pas commencer un nom de variable par le caractère +L'extension utilise quelques noms de façon interne et il est plus +prudent de ne pas commencer un nom de variable par le caractère \texttt{@}. -\section{Paramètres de \package{xlop}} +\section{Paramètres de \package{xlop}} \label{sec:Parametres de xlop} -\index{parametre@paramètre!syntaxe|(} -Les affectations de paramètres restent locales à la macro lorsqu'elles -sont indiquées au niveau de son argument optionnel. Pour rendre de +\index{parametre@paramètre!syntaxe|(} +Les affectations de paramètres restent locales à la macro lorsqu'elles +sont indiquées au niveau de son argument optionnel. Pour rendre de telles affectations globales, il faut utiliser la macro \macro{opset}. Par exemple \begin{Verbatim}[xrightmargin=0pt] \opset{decimalsepsymbol={,}} \end{Verbatim} -fera que le symbole du séparateur décimal sera la virgule pour tout le -reste du document, ou, du moins, jusqu'à une prochaine redéfinition -par la macro \verb+\opset+. Dans ce manuel, ce sera le cas à partir de +fera que le symbole du séparateur décimal sera la virgule pour tout le +reste du document, ou, du moins, jusqu'à une prochaine redéfinition +par la macro \verb+\opset+. Dans ce manuel, ce sera le cas à partir de maintenant.\opset{decimalsepsymbol={,}} \subsection{Symboles} \label{subsecSymboles} -Le paramètre \parameter{afterperiodsymbol} indique le symbole qui suit -l'écriture d'un quotient en ligne lors d'une division avec recherche -de période\index{division!période}. Sa valeur par défaut est +Le paramètre \parameter{afterperiodsymbol} indique le symbole qui suit +l'écriture d'un quotient en ligne lors d'une division avec recherche +de période\index{division!période}. Sa valeur par défaut est \verb+$\ldots$+ -Le paramètre \parameter{equalsymbol} indique le symbole utilisé pour -l'égalité. Sa valeur par défaut est \verb+$=$+. En réalité, le -paramètre est défini avec : +Le paramètre \parameter{equalsymbol} indique le symbole utilisé pour +l'égalité. Sa valeur par défaut est \verb+$=$+. En réalité, le +paramètre est défini avec : \begin{Verbatim}[xrightmargin=0pt] \opset{equalsymbol={$=$}} \end{Verbatim} -c'est-à-dire avec des accolades pour protéger le signe égal. Sans les -accolades, il y aurait une erreur à la compilation. On doit procéder -de cette façon lorsque la valeur comporte le signe égal ou une -virgule\index{parametre@paramètre!avec \og = \fg{} ou \og ,\fg} +c'est-à-dire avec des accolades pour protéger le signe égal. Sans les +accolades, il y aurait une erreur à la compilation. On doit procéder +de cette façon lorsque la valeur comporte le signe égal ou une +virgule\index{parametre@paramètre!avec \og = \fg{} ou \og ,\fg} -Le paramètre \parameter{approxsymbol} indique le symbole utilisé pour -les approximations. Sa valeur par défaut est \verb+$\approx$+. +Le paramètre \parameter{approxsymbol} indique le symbole utilisé pour +les approximations. Sa valeur par défaut est \verb+$\approx$+. -Le paramètre \parameter{decimalsepsymbol} indique le symbole utilisé -pour le séparateur décimal. Sa valeur par défaut est le point. +Le paramètre \parameter{decimalsepsymbol} indique le symbole utilisé +pour le séparateur décimal. Sa valeur par défaut est le point. -Les paramètres \parameter{addsymbol}, \parameter{subsymbol}, +Les paramètres \parameter{addsymbol}, \parameter{subsymbol}, \parameter{mulsymbol} et \parameter{divsymbol} indiquent les symboles -utilisés pour les quatre opérations arithmétiques. Les valeurs par -défaut sont respectivement \verb!$+$!, \verb!$-$!, \verb!$\times$! et +utilisés pour les quatre opérations arithmétiques. Les valeurs par +défaut sont respectivement \verb!$+$!, \verb!$-$!, \verb!$\times$! et \verb!$\div$!. -\subsection{Présentation générale} +\subsection{Présentation générale} \label{subsec:Presentation generale} -Le paramètre \parameter{voperation} indique la façon dont une -opération posée sera placée par rapport à la ligne de base. Les +Le paramètre \parameter{voperation} indique la façon dont une +opération posée sera placée par rapport à la ligne de base. Les valeurs possibles sont \verb+top+, \verb+center+ et \verb+bottom+ -(valeur par défaut). +(valeur par défaut). \begin{SideBySideExample} top\quad \opadd[voperation=top]{45}{172}\par @@ -329,9 +378,9 @@ valeurs possibles sont \verb+top+, \verb+center+ et \verb+bottom+ \opadd[voperation=bottom]{45}{172} \end{SideBySideExample} -Le paramètre \parameter{voperator} indique comment sera placé le -symbole opératoire par rapport aux opérandes. Les valeurs possibles -sont \verb+top+, \verb+center+ (valeur par défaut) et \verb+bottom+. +Le paramètre \parameter{voperator} indique comment sera placé le +symbole opératoire par rapport aux opérandes. Les valeurs possibles +sont \verb+top+, \verb+center+ (valeur par défaut) et \verb+bottom+. \begin{SideBySideExample} top\quad \opadd[voperator=top]{45}{172}\par @@ -341,43 +390,43 @@ sont \verb+top+, \verb+center+ (valeur par d \opadd[voperator=bottom]{45}{172} \end{SideBySideExample} -Le paramètre \parameter{deletezero} indique si certains nombres d'une -opération doivent être affichés avec ou sans les zéros non -significatifs. Le rôle exact de ce paramètre varie en fonction de -l'opération et nous y reviendrons lors de la présentation des -différentes opérations. +Le paramètre \parameter{deletezero} indique si certains nombres d'une +opération doivent être affichés avec ou sans les zéros non +significatifs. Le rôle exact de ce paramètre varie en fonction de +l'opération et nous y reviendrons lors de la présentation des +différentes opérations. -Le paramètre \parameter{style} indique si l'opération doit être posée -(avec la valeur \verb+display+ qui est la valeur par défaut) ou bien -être affichée en ligne (valeur \verb+text+). On reviendra sur ce -paramètre lors de la présentation de la division car les possibilités +Le paramètre \parameter{style} indique si l'opération doit être posée +(avec la valeur \verb+display+ qui est la valeur par défaut) ou bien +être affichée en ligne (valeur \verb+text+). On reviendra sur ce +paramètre lors de la présentation de la division car les possibilités sont alors un peu plus nombreuses. \begin{SideBySideExample} \opadd[style=text]{45}{172} \end{SideBySideExample} -Dans les opérations en ligne, \package{xlop} fait attention à ne pas -composer la formule en mode mathématique de façon directe. Cela permet -de spécifier ce que l'on veut comme dans l'exemple qui suit et c'est -également pour cela qu'il faut indiquer les valeurs classiques des -symboles entre délimiteurs mathématiques. +Dans les opérations en ligne, \package{xlop} fait attention à ne pas +composer la formule en mode mathématique de façon directe. Cela permet +de spécifier ce que l'on veut comme dans l'exemple qui suit et c'est +également pour cela qu'il faut indiquer les valeurs classiques des +symboles entre délimiteurs mathématiques. \begin{SideBySideExample} \opadd[addsymbol=plus, equalsymbol=\'egal, style=text]{42}{172} \end{SideBySideExample} -Cependant, \package{xlop} introduit exactement les mêmes pénalités de -coupures et exactement les mêmes espacements que pour une formule -mathématique. +Cependant, \package{xlop} introduit exactement les mêmes pénalités de +coupures et exactement les mêmes espacements que pour une formule +mathématique. -Le paramètre \parameter{parenthesisnegative} indique comment composer -les nombres négatifs dans les opérations en ligne. Les valeurs +Le paramètre \parameter{parenthesisnegative} indique comment composer +les nombres négatifs dans les opérations en ligne. Les valeurs possibles sont : \begin{itemize} -\item \texttt{none} qui compose les nombres négatifs sans parenthèse ; -\item \texttt{all} qui compose les nombres négatifs en les plaçant - entre parenthèses ; -\item \texttt{last} qui compose les nombres négatifs en les plaçant - entre parenthèses s'il ne s'agit pas de la première opérande. +\item \texttt{none} qui compose les nombres négatifs sans parenthèse ; +\item \texttt{all} qui compose les nombres négatifs en les plaçant + entre parenthèses ; +\item \texttt{last} qui compose les nombres négatifs en les plaçant + entre parenthèses s'il ne s'agit pas de la première opérande. \end{itemize} \begin{SideBySideExample} \opadd[style=text, @@ -393,76 +442,76 @@ possibles sont : \subsection{Dimensions} \label{subsec:Dimensions} -Dans les opérations posées, les chiffres sont placés dans des boîtes -de dimensions fixées. La largeur est donnée par le paramètre -\parameter{columnwidth} et la hauteur par le paramètre -\parameter{lineheight}. La valeur par défaut du paramètre +Dans les opérations posées, les chiffres sont placés dans des boîtes +de dimensions fixées. La largeur est donnée par le paramètre +\parameter{columnwidth} et la hauteur par le paramètre +\parameter{lineheight}. La valeur par défaut du paramètre \texttt{lineheight} est \verb+\baselineskip+ ce qui fait que les -lignes des opérations seront espacées, par défaut, comme les lignes -d'un paragraphe. La valeur par défaut de \texttt{columnwidth} est de +lignes des opérations seront espacées, par défaut, comme les lignes +d'un paragraphe. La valeur par défaut de \texttt{columnwidth} est de \texttt{2ex} car la largeur \og normale \fg{} des chiffres aurait -donné des résultats peu lisibles. +donné des résultats peu lisibles. \begin{SideBySideExample} \opadd[columnwidth=0.5em] {45.89}{127.5} \end{SideBySideExample} -Ce piètre résultat est dû en partie au fait que la virgule est placé -dans une boîte dont la largeur est contrôlée par le paramètre -\parameter{decimalsepwidth} dont la valeur par défaut est nulle. Un -essai d'amélioration peut être effectué en donnant à ce paramètre la +Ce piètre résultat est dû en partie au fait que la virgule est placé +dans une boîte dont la largeur est contrôlée par le paramètre +\parameter{decimalsepwidth} dont la valeur par défaut est nulle. Un +essai d'amélioration peut être effectué en donnant à ce paramètre la largeur \og{} normale \fg d'une virgule. \begin{SideBySideExample} \opadd[columnwidth=0.5em, decimalsepwidth=0.27778em] {45.89}{127.5} \end{SideBySideExample} -C'est meilleur mais le fait de donner une largeur non nulle à la boîte -contenant le séparateur décimal risque de poser des difficultés si -l'on veut placer des éléments externes : cela va à l'encontre de -l'idée de placer les chiffres dans une grille fixe. Ceci est donc à -éviter en temps normal. +C'est meilleur mais le fait de donner une largeur non nulle à la boîte +contenant le séparateur décimal risque de poser des difficultés si +l'on veut placer des éléments externes : cela va à l'encontre de +l'idée de placer les chiffres dans une grille fixe. Ceci est donc à +éviter en temps normal. -Les deux paramètres \parameter{columnwidth} et \parameter{lineheight} +Les deux paramètres \parameter{columnwidth} et \parameter{lineheight} correspondent aux deux seules dimensions que l'extension rend -publiques, à savoir respectivement +publiques, à savoir respectivement \verb+\opcolumnwidth+\index{opcolumnwidth@\texttt{$\backslash$opcolumnwidth}} et \verb+\oplineheight+\index{oplineheight@\texttt{$\backslash$oplineheight}}. -Il est cependant dangereux de vouloir modifier ces dimensions de façon +Il est cependant dangereux de vouloir modifier ces dimensions de façon directe puisque une modification par voie normale n'a pas pour seule -conséquence d'obtenir une nouvelle valeur pour ces +conséquence d'obtenir une nouvelle valeur pour ces dimensions. L'extension \package{xlop} a rendu ces dimensions publiques uniquement pour pouvoir les lire, pas pour les modifier. -Les deux paramètres suivants permettent de spécifier les largeurs des -traits horizontaux et verticaux tracés par \package{xlop}. Il s'agit -des deux paramètres \parameter{hrulewidth} et \parameter{vrulewidth} -dont la valeur par défaut est \texttt{0.4pt}. +Les deux paramètres suivants permettent de spécifier les largeurs des +traits horizontaux et verticaux tracés par \package{xlop}. Il s'agit +des deux paramètres \parameter{hrulewidth} et \parameter{vrulewidth} +dont la valeur par défaut est \texttt{0.4pt}. -Ces traits sont composés sans perturber la grille, c'est-à-dire sans +Ces traits sont composés sans perturber la grille, c'est-à-dire sans ajouter d'espace vertical. Ainsi, avec des valeurs importantes pour -l'épaisseur, les traits risquent de déborder au niveau des opérandes. +l'épaisseur, les traits risquent de déborder au niveau des opérandes. \begin{SideBySideExample} \opadd[hrulewidth=8pt]{42}{172} \end{SideBySideExample} -Il existe également un paramètre permettant de contrôler le décalage -horizontal du séparateur décimal. Il s'agit de -\parameter{decimalsepoffset} dont la valeur par défaut est égale -à~\texttt{-0.35}. Cette valeur par défaut indique une longueur en -prenant \verb+\opcolumnwidth+ comme unité. Un exemple d'utilisation de -ce paramètre sera donné à la section~\ref{sec:Division} +Il existe également un paramètre permettant de contrôler le décalage +horizontal du séparateur décimal. Il s'agit de +\parameter{decimalsepoffset} dont la valeur par défaut est égale +à~\texttt{-0.35}. Cette valeur par défaut indique une longueur en +prenant \verb+\opcolumnwidth+ comme unité. Un exemple d'utilisation de +ce paramètre sera donné à la section~\ref{sec:Division} page~\pageref{sec:Division}. \subsection{Styles des chiffres} \label{subsec:Styles des chiffres} L'extension \package{xlop} distingue cinq types de nombres et y -associe cinq paramètres de style : +associe cinq paramètres de style : \begin{itemize} -\item les opérandes avec \parameter{operandstyle} ; -\item le résultat avec \parameter{resultstyle} ; +\item les opérandes avec \parameter{operandstyle} ; +\item le résultat avec \parameter{resultstyle} ; \item les restes avec \parameter{remainderstyle} ; -\item les résultats intermédiaires avec \parameter{intermediarystyle} +\item les résultats intermédiaires avec \parameter{intermediarystyle} ; \item les retenues avec \parameter{carrystyle}. \end{itemize} @@ -475,12 +524,12 @@ associe cinq param Rappelons que dans ce manuel, nous utilisons l'extension \package{pstricks}\index{pstricks}. -\index{parametre@paramètre!indexé|(}% -En réalité, la gestion de ces styles est encore plus puissante car on -peut distinguer les différents nombres d'une même classe. Dans une -même opération, on a plusieurs opérandes et, éventuellement plusieurs -restes et plusieurs nombres intermédiaires. On accède alors au style -de ces nombres individuels en indexant le paramètre de style +\index{parametre@paramètre!indexé|(}% +En réalité, la gestion de ces styles est encore plus puissante car on +peut distinguer les différents nombres d'une même classe. Dans une +même opération, on a plusieurs opérandes et, éventuellement plusieurs +restes et plusieurs nombres intermédiaires. On accède alors au style +de ces nombres individuels en indexant le paramètre de style correspondant. \begin{SideBySideExample} \opadd[operandstyle=\blue, @@ -489,20 +538,20 @@ correspondant. carrystyle=\scriptsize\green] {45.89}{127.5} \end{SideBySideExample} -Sur cet exemple, on a indiqué que la première opérande devait être -composée avec le style \verb+\lightgray+ et comme rien n'était indiqué -pour la seconde opérande, celle-ci a repris le style de base de sa -classe (donc a été composée avec le style \verb+\blue+). +Sur cet exemple, on a indiqué que la première opérande devait être +composée avec le style \verb+\lightgray+ et comme rien n'était indiqué +pour la seconde opérande, celle-ci a repris le style de base de sa +classe (donc a été composée avec le style \verb+\blue+). -Ce mécanisme va encore plus loin car on peut indicer à deux niveaux -les styles des classes opérande, reste et nombre intermédiaire et à un -niveau les styles des classes résultat et retenue pour accéder au +Ce mécanisme va encore plus loin car on peut indicer à deux niveaux +les styles des classes opérande, reste et nombre intermédiaire et à un +niveau les styles des classes résultat et retenue pour accéder au style de chacun des chiffres de ces nombres. Afin de rendre les -indexations plus facile à gérer, un index positif indiquera le rang -d'un chiffre de la partie entière (numérotée de droite à gauche, -l'index~1 correspondant au chiffre des unités) et un index négatif -indiquera le rang d'un chiffre de la partie décimale (numérotée de -gauche à droite, l'index $-1$ correspondant au chiffre des dixièmes). +indexations plus facile à gérer, un index positif indiquera le rang +d'un chiffre de la partie entière (numérotée de droite à gauche, +l'index~1 correspondant au chiffre des unités) et un index négatif +indiquera le rang d'un chiffre de la partie décimale (numérotée de +gauche à droite, l'index $-1$ correspondant au chiffre des dixièmes). \begin{SideBySideExample} \opadd[operandstyle.1.1=\white, operandstyle.1.-2=\white, @@ -511,7 +560,7 @@ gauche deletezero=false] {045.89}{127.50} \end{SideBySideExample} -On peut également utiliser une macro à un paramètre comme style. +On peut également utiliser une macro à un paramètre comme style. \begin{SideBySideExample} \newcommand\hole[1]{$\bullet$} \opadd[operandstyle.1.1=\hole, @@ -520,9 +569,9 @@ On peut resultstyle.2=\hole] {45.89}{127.5} \end{SideBySideExample} -\index{operation@opération!à trou}% +\index{operation@opération!à trou}% Lorsque le style est une macro, le chiffre constitue le dernier -argument de cette macro. Voici un exemple plus compliqué et utilisant +argument de cette macro. Voici un exemple plus compliqué et utilisant l'extension \package{pst-node} de la suite \package{pstricks} : \begin{SideBySideExample} \newcommand\OPoval[3]{% @@ -541,59 +590,59 @@ l'extension \package{pst-node} de la suite \package{pstricks} : \end{minipage} \end{SideBySideExample} -Comme les chiffres, le séparateur décimal tient compte du style d'un -nombre. Pour accéder au style du séparateur décimal de façon +Comme les chiffres, le séparateur décimal tient compte du style d'un +nombre. Pour accéder au style du séparateur décimal de façon individuelle, il faut employer l'indice \texttt{d} au lieu des indices -numériques des chiffres. +numériques des chiffres. \begin{SideBySideExample} \newcommand\hole[1]{\texttt{\_}} \opmul[intermediarystyle=\hole, resultstyle=\hole, resultstyle.d=\white]{2.46}{35.7} \end{SideBySideExample} -\index{parametre@paramètre!indexé|)}% -\index{parametre@paramètre!syntaxe|)} +\index{parametre@paramètre!indexé|)}% +\index{parametre@paramètre!syntaxe|)} -\chapter{Opérations arithmétiques} -\label{chap:Opérations arithmétiques} +\chapter{Opérations arithmétiques} +\label{chap:Opérations arithmétiques} \section{Addition} \label{sec:Addition} -L'addition est gérée par la macro \macro{opadd}. L'addition, -lorsqu'elle est posée, n'affiche que des nombres positifs. Cela va -avoir comme conséquence d'afficher une soustraction lorsqu'une des -opérandes est négative.% -\index{nombre!négatifs dans une opération posée} +L'addition est gérée par la macro \macro{opadd}. L'addition, +lorsqu'elle est posée, n'affiche que des nombres positifs. Cela va +avoir comme conséquence d'afficher une soustraction lorsqu'une des +opérandes est négative.% +\index{nombre!négatifs dans une opération posée} \begin{SideBySideExample} \opadd{-245}{72} \end{SideBySideExample} -De façon générale, le principe est de poser l'opération qui permet de -retrouver le résultat comme on le ferait à la main. En revanche, +De façon générale, le principe est de poser l'opération qui permet de +retrouver le résultat comme on le ferait à la main. En revanche, l'affichage en ligne donnera toujours une addition puisqu'on peut -maintenant écrire des nombres négatifs. +maintenant écrire des nombres négatifs. \begin{SideBySideExample} \opadd[style=text]{-245}{72} \end{SideBySideExample} - Outre les paramètres généraux décrits à la + Outre les paramètres généraux décrits à la section~\ref{sec:Parametres de xlop}, la macro \verb+\opadd+ est - sensible aux paramètres \texttt{carryadd}, \texttt{lastcarry} et + sensible aux paramètres \texttt{carryadd}, \texttt{lastcarry} et \texttt{deletezero}. -Le paramètre \parameter{carryadd} est un paramètre -booléen\index{parametre@paramètre!booléen} c'est-à-dire n'acceptant +Le paramètre \parameter{carryadd} est un paramètre +booléen\index{parametre@paramètre!booléen} c'est-à-dire n'acceptant que les valeurs \texttt{true} et \texttt{false}. Comme il d'usage, -l'omission du signe égal et de la partie droite de l'affectation -équivaut à \texttt{=true}. Ce paramètre indique si les retenues -doivent être ou non affichées. Sa valeur par défaut est +l'omission du signe égal et de la partie droite de l'affectation +équivaut à \texttt{=true}. Ce paramètre indique si les retenues +doivent être ou non affichées. Sa valeur par défaut est \texttt{true}. -Le paramètre \parameter{lastcarry} est également un paramètre -booléen. Il indique si une retenue sans chiffre correspondant au -niveau des deux opérandes doit être ou non affichée. Sa valeur par -défaut est \texttt{false}. On fera attention au rôle exact de ce -paramètre. Ainsi, si la seconde opérande dans l'exemple qui suit avait -été~15307, la dernière retenue aurait été affichée quelle que soit la -valeur du paramètre \texttt{lastcarry} puisqu'il y aurait eu un -chiffre correspondant au niveau de la seconde opérande. +Le paramètre \parameter{lastcarry} est également un paramètre +booléen. Il indique si une retenue sans chiffre correspondant au +niveau des deux opérandes doit être ou non affichée. Sa valeur par +défaut est \texttt{false}. On fera attention au rôle exact de ce +paramètre. Ainsi, si la seconde opérande dans l'exemple qui suit avait +été~15307, la dernière retenue aurait été affichée quelle que soit la +valeur du paramètre \texttt{lastcarry} puisqu'il y aurait eu un +chiffre correspondant au niveau de la seconde opérande. \begin{SideBySideExample} \opadd{4825}{5307} \end{SideBySideExample} @@ -604,83 +653,150 @@ chiffre correspondant au niveau de la seconde op \opadd[lastcarry]{4825}{5307} \end{SideBySideExample} -Le paramètre \parameter{deletezero} est également un paramètre booléen -et son rôle et d'indiquer si les zéros non significatifs doivent être -supprimés ou non. Sa valeur par défaut est \texttt{true}. Si ce -paramètre vaut \texttt{false}, les opérandes et le résultats auront le -même nombre de chiffres, \package{xlop} ajoutant des zéros non -significatifs pour y parvenir. Les zéros non significatifs des -opérandes ne sont pas supprimés également. +Le paramètre \parameter{deletezero} est également un paramètre booléen +et son rôle et d'indiquer si les zéros non significatifs doivent être +supprimés ou non. Sa valeur par défaut est \texttt{true}. Si ce +paramètre vaut \texttt{false}, les opérandes et le résultats auront le +même nombre de chiffres, \package{xlop} ajoutant des zéros non +significatifs pour y parvenir. Les zéros non significatifs des +opérandes ne sont pas supprimés également. \begin{SideBySideExample} \opadd{012.3427}{5.2773}\par \opadd[deletezero=false] {012.3427}{5.2773} \end{SideBySideExample} -Ce paramètre a exactement le même rôle dans l'affichage en ligne que -dans l'affichage posé. +Ce paramètre a exactement le même rôle dans l'affichage en ligne que +dans l'affichage posé. \begin{SideBySideExample} \opadd[style=text]{02.8}{1.2}\par \opadd[style=text, - deletezero=false]{02.8}{1.2}\par + deletezero=false]{02.8}{1.2} +\end{SideBySideExample} + +La version 0.27 de xlop a introduit la macro \macro{opmanyyadd} qui +permet de poser des additions avec plus de deux opérandes. Cette macro +a quelques limitations: +\begin{itemize} +\item toutes les opérandes doivent être positives ; +\item certains paramètres ne sont plus utilisés, par + exemple \parameter{style} ; +\item les retenues ne sont pas affichées. +\end{itemize} +En revanche, le paramètre \parameter{vmanyoperator} permet de +contrôler finement le placement des signes d'opération. + +Voici un premier exemple pour montrer la syntaxe de base. Les +opérandes doivent être placées entre accolades et leur nombre n'est +pas limité. +\begin{SideBySideExample} + \opmanyadd{123.4}{3.1416} + {2.71828}{0.001} +\end{SideBySideExample} +La macro \macro{opmanyadd} accepte les paramètres de style pour les +opérandes et le résultat. En ce qui concerne le style pour les +opérandes, le premier index indique la place de l'opérande (du haut +vers le bas) et la deuxième le chiffre de l'opérande. Par exemple : +\begin{SideBySideExample} + \newcommand\R{\color{red}} + \opmanyadd[operandstyle.2.3=\R, + operandstyle.3.3=\R, + resultstyle.3=\R, + resultstyle.4=\R] + {12.6}{853.3}{158.1} \end{SideBySideExample} +Cet exemple montre que les zéros non significatifs ne sont pas +affichés. Ils peuvent l'être en utilisant le +paramètre \parameter{deletezero} avec se valeur false : +\begin{SideBySideExample} + \opmanyadd[deletezero=false] + {12.6}{853.3}{158.1} +\end{SideBySideExample} + +La macro \macro{opmanyadd} utilise également le +paramètre \parameter{voperation} comme le fait \macro{opadd}. + +Il existe un paramètre spécifique à la macro \macro{opmanyadd} : le +paramètre \parameter{vmanyoperator}. Ce paramètre permet d'afficher +l'opérateur plus de six façons différentes. +\begin{CenterExample} + \opmanyadd{1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=center] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=top] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=bottom] + {1}{12}{123}{1234} +\end{CenterExample} +On peut voir que la valeur par défaut est center. Les valeurs avec une +première lettre minuscule affichent autant d'opérateurs qu'il y a +d'opérandes moins une. Les mêmes valeurs avec la premiyère lettre en +capitale affichent un unique signe opératoire: +\begin{CenterExample} + \opmanyadd[vmanyoperator=Center] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=Top] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=Bottom] + {1}{12}{123}{1234} +\end{CenterExample} \section{Soustraction} \label{sec:soustraction} -La soustraction est gérée par la macro \macro{opsub}. La soustraction, -lorsqu'elle est posée, n'affiche que des nombres positifs. Par -conséquence cette macro va afficher une addition lorsqu'une des -opérandes est négative. +La soustraction est gérée par la macro \macro{opsub}. La soustraction, +lorsqu'elle est posée, n'affiche que des nombres positifs. Par +conséquence cette macro va afficher une addition lorsqu'une des +opérandes est négative. \begin{SideBySideExample} \opsub{-245}{72} \end{SideBySideExample} -De façon générale, le principe est de poser l'opération qui permet de -retrouver le résultat comme on le ferait à la main. En revanche, +De façon générale, le principe est de poser l'opération qui permet de +retrouver le résultat comme on le ferait à la main. En revanche, l'affichage en ligne donnera toujours une soustraction puisqu'on peut -maintenant écrire des nombres négatifs. +maintenant écrire des nombres négatifs. \begin{SideBySideExample} \opsub[style=text]{-245}{72} \end{SideBySideExample} -Ce principe s'applique également lorsque la première opérande est -inférieure à la seconde (cas positif) où on aura une inversion des -opérandes. +Ce principe s'applique également lorsque la première opérande est +inférieure à la seconde (cas positif) où on aura une inversion des +opérandes. \begin{SideBySideExample} \opsub{1.2}{2.45} \end{SideBySideExample} -Bien entendu, l'opération en ligne donnera le résultat exact. +Bien entendu, l'opération en ligne donnera le résultat exact. \begin{SideBySideExample} \opsub[style=text]{1.2}{2.45} \end{SideBySideExample} -Outre les paramètres généraux vus à la section~\ref{sec:Parametres de - xlop}, \verb+\opsub+ est sensible à \texttt{carrysub}, +Outre les paramètres généraux vus à la section~\ref{sec:Parametres de + xlop}, \verb+\opsub+ est sensible à \texttt{carrysub}, \texttt{lastcarry}, \texttt{offsetcarry}, \texttt{deletezero} et \texttt{behaviorsub}. -Le paramètre \parameter{carrysub} est un paramètre booléen -qui indique si les retenues doivent être ou non présentes. Sa valeur -par défaut est \texttt{false} (rappelons que le paramètre -\texttt{carryadd} avait une valeur par défaut égale à \texttt{true}). +Le paramètre \parameter{carrysub} est un paramètre booléen +qui indique si les retenues doivent être ou non présentes. Sa valeur +par défaut est \texttt{false} (rappelons que le paramètre +\texttt{carryadd} avait une valeur par défaut égale à \texttt{true}). \begin{SideBySideExample} \opsub[carrysub]{1234}{567} \end{SideBySideExample} -Dans l'exemple précédent, nous pouvons voir qu'il manque en fait une -retenue au niveau du dernier chiffre de 1234, cette façon de faire -étant assez courante. Néanmoins, on peut contrôler l'affichage de -cette dernière retenue avec le paramètre \parameter{lastcarry}. Ce -paramètre n'a pas tout à fait le même rôle que pour l'addition puisque -la dernière retenue ne sera pas affichée dans le cas où la seconde -opérande n'a pas de chiffre correspondant (alors que pour l'addition, -il fallait que les deux opérandes n'aient pas de chiffres +Dans l'exemple précédent, nous pouvons voir qu'il manque en fait une +retenue au niveau du dernier chiffre de 1234, cette façon de faire +étant assez courante. Néanmoins, on peut contrôler l'affichage de +cette dernière retenue avec le paramètre \parameter{lastcarry}. Ce +paramètre n'a pas tout à fait le même rôle que pour l'addition puisque +la dernière retenue ne sera pas affichée dans le cas où la seconde +opérande n'a pas de chiffre correspondant (alors que pour l'addition, +il fallait que les deux opérandes n'aient pas de chiffres correspondant). \begin{SideBySideExample} \opsub[carrysub,lastcarry]{1234}{567} \end{SideBySideExample} -On peut noter dans ce dernier cas qu'il est sans doute préférable de -mettre le paramètre \parameter{deletezero} à \texttt{false} pour -obtenir une présentation plus correcte. +On peut noter dans ce dernier cas qu'il est sans doute préférable de +mettre le paramètre \parameter{deletezero} à \texttt{false} pour +obtenir une présentation plus correcte. \begin{SideBySideExample} \opsub[carrysub, lastcarry, @@ -688,10 +804,10 @@ obtenir une pr \end{SideBySideExample} L'affichage des retenues au niveau des soustractions peut sembler un -peu trop compact. On peut élargir la boîte des chiffres avec le -paramètre \parameter{opcolumnwidth} mais également indiquer le -décalage des retenues avec le paramètre \parameter{offsetcarry}. La -valeur par défaut de ce paramètre est \texttt{-0.35}. +peu trop compact. On peut élargir la boîte des chiffres avec le +paramètre \parameter{opcolumnwidth} mais également indiquer le +décalage des retenues avec le paramètre \parameter{offsetcarry}. La +valeur par défaut de ce paramètre est \texttt{-0.35}. \begin{SideBySideExample} \opsub[carrysub, lastcarry, @@ -707,12 +823,12 @@ valeur par d \end{SideBySideExample} Il peut arriver qu'une soustraction de deux nombres positifs, le -premier étant inférieur au second, soit le signe d'une erreur de -l'utilisateur. Dans ce cas, et uniquement dans ce cas, le paramètre -\parameter{behaviorsub} permet d'obtenir un rappel à l'ordre. Les -trois valeurs possibles de ce paramètre sont \texttt{silent} qui est -la valeur par défaut et qui donne le résultat, \texttt{warning} qui -donne également le résultat mais affiche le message d'avertissement : +premier étant inférieur au second, soit le signe d'une erreur de +l'utilisateur. Dans ce cas, et uniquement dans ce cas, le paramètre +\parameter{behaviorsub} permet d'obtenir un rappel à l'ordre. Les +trois valeurs possibles de ce paramètre sont \texttt{silent} qui est +la valeur par défaut et qui donne le résultat, \texttt{warning} qui +donne également le résultat mais affiche le message d'avertissement : \begin{Verbatim}[xrightmargin=0pt,frame=none] xlop warning. Substraction with first operand less than second one See documentation for further information. @@ -723,75 +839,75 @@ et enfin \texttt{error} qui affichera le message d'erreur : Type H for immediate help. ! Substraction with first operand less than second one. \end{Verbatim} -et l'opération ne sera pas effectuée. +et l'opération ne sera pas effectuée. \section{Multiplication} \label{sec:Multiplication} -La multiplication est gérée par la macro \macro{opmul}. -Nous présenterons les paramètres \texttt{hfactor}, +La multiplication est gérée par la macro \macro{opmul}. +Nous présenterons les paramètres \texttt{hfactor}, \texttt{displayintermediary}, \texttt{shiftintermediarysymbol}, \texttt{displayshiftintermediary} et finalement \texttt{deletezero}, -les autres paramètres ayant été vus à la section~\ref{sec:Parametres +les autres paramètres ayant été vus à la section~\ref{sec:Parametres de xlop}. -Le paramètre \parameter{shiftintermediarysymbol} indique quel symbole -sera utilisé (sa valeur par défaut est \verb+$\cdot$+) pour visualiser -les décalages des nombres intermédiaires. Le paramètre +Le paramètre \parameter{shiftintermediarysymbol} indique quel symbole +sera utilisé (sa valeur par défaut est \verb+$\cdot$+) pour visualiser +les décalages des nombres intermédiaires. Le paramètre \parameter{displayshiftintermediary} peut prendre les valeurs -\texttt{shift} (valeur par défaut) qui ne montre ce symbole que -lorsque le décalage est supérieur à un rang, \texttt{all} qui indique -que ce symbole de décalage sera systématiquement affiché et -\texttt{none} qui indique que ce symbole ne sera jamais affiché. +\texttt{shift} (valeur par défaut) qui ne montre ce symbole que +lorsque le décalage est supérieur à un rang, \texttt{all} qui indique +que ce symbole de décalage sera systématiquement affiché et +\texttt{none} qui indique que ce symbole ne sera jamais affiché. \begin{CenterExample}[xrightmargin=0pt] \opmul[displayshiftintermediary=shift]{453}{1001205}\qquad \opmul[displayshiftintermediary=all]{453}{1001205}\qquad \opmul[displayshiftintermediary=none]{453}{1001205} \end{CenterExample} -En réalité, le non affichage des nombres intermédiaires nuls est dû à -la valeur par défaut \texttt{none} du paramètre +En réalité, le non affichage des nombres intermédiaires nuls est dû à +la valeur par défaut \texttt{none} du paramètre \parameter{displayintermediary}. La valeur \texttt{all} va afficher -tous les nombres intermédiaires. +tous les nombres intermédiaires. \begin{SideBySideExample} \opmul[displayintermediary=all] {453}{1001205} \end{SideBySideExample} -On notera que les nombres intermédiaires nuls sont affichés avec +On notera que les nombres intermédiaires nuls sont affichés avec autant de chiffres que le premier facteur. -Le paramètre \parameter{displayintermediary} admet la valeur -\texttt{nonzero} qui a le même rôle que la valeur \texttt{none} sauf -dans le cas où le second facteur ne comporte qu'un seul chiffre. +Le paramètre \parameter{displayintermediary} admet la valeur +\texttt{nonzero} qui a le même rôle que la valeur \texttt{none} sauf +dans le cas où le second facteur ne comporte qu'un seul chiffre. \begin{CenterExample}[xrightmargin=0pt] \opmul{3.14159}{4}\qquad \opmul[displayintermediary=nonzero]{3.14159}{4} \end{CenterExample} -Enfin, le paramètre \parameter{displayintermediary} admet la valeur -\texttt{None} qui n'affichera aucun résultat intermédiaire dans tous +Enfin, le paramètre \parameter{displayintermediary} admet la valeur +\texttt{None} qui n'affichera aucun résultat intermédiaire dans tous les cas. \begin{CenterExample}[xrightmargin=0pt] \opmul[displayintermediary=None]{453}{1001205} \end{CenterExample} -Le paramètre \parameter{hfactor} permet d'indiquer comment doit se -faire l'alignement des opérandes. La valeur par défaut \texttt{right} -donne une composition au fer à droite tandis que la valeur +Le paramètre \parameter{hfactor} permet d'indiquer comment doit se +faire l'alignement des opérandes. La valeur par défaut \texttt{right} +donne une composition au fer à droite tandis que la valeur \texttt{decimal} donne un alignement au niveau de la virgule. \begin{CenterExample}[xrightmargin=0pt] \opmul{3.1416}{12.8}\qquad\opmul[hfactor=decimal]{3.1416}{12.8} \end{CenterExample} -Pour la multiplication posée, le paramètre \parameter{deletezero} ne -concerne que les opérandes, le résultat gardant ses éventuels zéros -non significatifs puisque ceux-ci sont nécessaires pour effectuer -correctement le décalage de la virgule lorsqu'on travaille \og à la +Pour la multiplication posée, le paramètre \parameter{deletezero} ne +concerne que les opérandes, le résultat gardant ses éventuels zéros +non significatifs puisque ceux-ci sont nécessaires pour effectuer +correctement le décalage de la virgule lorsqu'on travaille \og à la main \fg{}. \begin{CenterExample}[xrightmargin=0pt] \opmul[deletezero=false]{01.44}{25}\qquad \opmul{01.44}{25} \end{CenterExample} -En revanche, dans la multiplication en ligne, ce paramètre retrouve +En revanche, dans la multiplication en ligne, ce paramètre retrouve son comportement normal. \begin{CenterExample}[xrightmargin=0pt] \opmul[deletezero=false,style=text]{01.44}{25}\qquad @@ -800,41 +916,41 @@ son comportement normal. \section{Division} \label{sec:Division} -L'extension gère la division \og classique \fg{} avec la macro +L'extension gère la division \og classique \fg{} avec la macro \macro{opdiv} et la division euclidienne avec la macro -\macro{opidiv}. En raison de sa complexité, la division est l'opération -qui prend en compte le plus de paramètres. +\macro{opidiv}. En raison de sa complexité, la division est l'opération +qui prend en compte le plus de paramètres. -\subsection{Contrôle de l'arrêt} +\subsection{Contrôle de l'arrêt} \label{subsec:Controle de l'arret} -Dans ce qui suivra, le terme d'\emph{étape} indique l'ensemble des +Dans ce qui suivra, le terme d'\emph{étape} indique l'ensemble des calculs permettant d'obtenir un chiffre au niveau du quotient. Ce -nombre d'étapes est contrôlé en partie par les paramètres +nombre d'étapes est contrôlé en partie par les paramètres \parameter{maxdivstep}, \parameter{safedivstep} et \parameter{period}. -En partie seulement car une division classique s'arrêtera +En partie seulement car une division classique s'arrêtera automatiquement lors de l'obtention d'un reste nul, quelles que que -soient les valeurs de ces trois paramètres et une division euclidienne -s'arrêtera sur un quotient entier, sans tenir compte de ces trois -paramètres. +soient les valeurs de ces trois paramètres et une division euclidienne +s'arrêtera sur un quotient entier, sans tenir compte de ces trois +paramètres. \begin{SideBySideExample} \opdiv{25}{7} \end{SideBySideExample} \begin{SideBySideExample} \opidiv{25}{7} \end{SideBySideExample} -Le premier exemple s'arrête en raison de la valeur de -\parameter{maxdivstep} qui est égale, par défaut, à~10. On prendra -garde à ce que le nombre maximum d'étapes peut entraîner des résultats +Le premier exemple s'arrête en raison de la valeur de +\parameter{maxdivstep} qui est égale, par défaut, à~10. On prendra +garde à ce que le nombre maximum d'étapes peut entraîner des résultats aberrants lorsqu'il est trop faible. \begin{SideBySideExample} \opdiv[maxdivstep=2]{1248}{3} \end{SideBySideExample} -Le résultat précédent est clairement faux mais \package{xlop} a fait -ce qu'on lui a demandé, en l'occurrence avoir deux chiffres (maximum) +Le résultat précédent est clairement faux mais \package{xlop} a fait +ce qu'on lui a demandé, en l'occurrence avoir deux chiffres (maximum) au quotient. -L'affichage en ligne va également différer selon que la division s'est -arrêtée avec un reste final nul ou non ou selon qu'il s'agit d'une +L'affichage en ligne va également différer selon que la division s'est +arrêtée avec un reste final nul ou non ou selon qu'il s'agit d'une division classique ou euclidienne. \begin{SideBySideExample} \opdiv[style=text]{3.14}{2}\par @@ -845,46 +961,46 @@ division classique ou euclidienne. On notera l'emploi de \parameter{equalsymbol} ou \parameter{approxsymbol} selon le cas ainsi que l'affichage avec une troncature et non un arrondi. Nous verrons comment obtenir un arrondi -à la section~\ref{sec:Operations evoluees} +à la section~\ref{sec:Operations evoluees} L'affichage en ligne de \verb+\opdiv+ tient compte de \parameter{maxdivstep}. Cela signifie que l'on peut obtenir des -résultats vraiment faux avec des valeurs trop faible de ce paramètre -et, contrairement à l'affichage posé, l'affichage en ligne ne -permettra pas de comprendre ce qu'il s'est passé. +résultats vraiment faux avec des valeurs trop faible de ce paramètre +et, contrairement à l'affichage posé, l'affichage en ligne ne +permettra pas de comprendre ce qu'il s'est passé. \begin{SideBySideExample} \opdiv[maxdivstep=2,style=text] {1248}{3} \end{SideBySideExample} -Si en plus, le dernier reste calculé est nul, on atteint un summum : +Si en plus, le dernier reste calculé est nul, on atteint un summum : \begin{SideBySideExample} \opdiv[maxdivstep=1,style=text] {1208}{3} \end{SideBySideExample} -puisqu'il n'y a même plus d'approximation ! +puisqu'il n'y a même plus d'approximation ! -Une division non euclidienne peut également s'arrêter sur la détection -de la survenue d'une période. Pour cela, il suffit de donner la valeur -\texttt{true} au paramètre \parameter{period}\index{division!période}. +Une division non euclidienne peut également s'arrêter sur la détection +de la survenue d'une période. Pour cela, il suffit de donner la valeur +\texttt{true} au paramètre \parameter{period}\index{division!période}. \begin{SideBySideExample} \opdiv[period]{100}{3} \end{SideBySideExample} -Pour ne pas avoir à effectuer des comparaisons de chaque reste avec -tous les restes précédents, \package{xlop} calcule dès le départ la -longueur de la période ce qui permet de n'effectuer qu'une seule -comparaison à chaque étape et donc d'accélérer notablement les -calculs\footnote{Je remercie à cette occasion Olivier Viennet pour ses - précisions mathématiques qui ont permis d'implanter correctement ces +Pour ne pas avoir à effectuer des comparaisons de chaque reste avec +tous les restes précédents, \package{xlop} calcule dès le départ la +longueur de la période ce qui permet de n'effectuer qu'une seule +comparaison à chaque étape et donc d'accélérer notablement les +calculs\footnote{Je remercie à cette occasion Olivier Viennet pour ses + précisions mathématiques qui ont permis d'implanter correctement ces calculs.}. Malheureusement, ces calculs se font avec des nombres -directement accessibles à \TeX{} ce qui a pour conséquence de ne pas -pouvoir utiliser d'opérandes dont la valeur absolue excède +directement accessibles à \TeX{} ce qui a pour conséquence de ne pas +pouvoir utiliser d'opérandes dont la valeur absolue excède $\left\lfloor\frac{2^{31}-1}{10}\right\rfloor = 214748364$. -Pour ne pas entraîner des calculs trop long, \package{xlop} ne -dépassera pas la valeur du paramètre \parameter{safedivstep} dans les -divisions avec détection de période. Sa valeur par défaut est égale -à~50. Cependant, \package{xlop} signalera le problème. Par exemple si +Pour ne pas entraîner des calculs trop long, \package{xlop} ne +dépassera pas la valeur du paramètre \parameter{safedivstep} dans les +divisions avec détection de période. Sa valeur par défaut est égale +à~50. Cependant, \package{xlop} signalera le problème. Par exemple si on demande un tel calcul avec le code : \begin{Verbatim}[xrightmargin=0pt,frame=none] \opdiv[period]{1}{289} @@ -895,25 +1011,25 @@ on obtiendra le message d'avertissement : Division will stop before reach it. See documentation for further information. \end{Verbatim} -qui indique que la période de cette division est de~272 et qu'elle ne -sera donc pas atteinte à cause de la valeur de \texttt{safedivstep}. +qui indique que la période de cette division est de~272 et qu'elle ne +sera donc pas atteinte à cause de la valeur de \texttt{safedivstep}. -L'affichage en ligne d'une telle division présente quelque -particularités. +L'affichage en ligne d'une telle division présente quelque +particularités. \begin{SideBySideExample} \opdiv[period,style=text]{150}{7} \end{SideBySideExample} -On obtient donc une égalité au lieu d'une approximation, la présence -d'un trait sous la période et des points de suspension à la suite de -la période. Tous ces éléments peuvent être configurés. Le symbole -d'égalité est donné par le paramètre \parameter{equalsymbol} (valeur -par défaut \verb+{$=$}+), la largeur du trait par le paramètre -\parameter{hrulewidth} (valeur par défaut \texttt{0.4pt}), sa position -verticale par le paramètre \parameter{vruleperiod} (valeur par défaut -\texttt{-0.2}) qui indique un décalage vertical en prenant -\verb+\oplineheight+ comme unité et les points de suspension sont -donnés par le paramètre \parameter{afterperiodsymbol} (valeur par -défaut \verb+$\ldots$+). +On obtient donc une égalité au lieu d'une approximation, la présence +d'un trait sous la période et des points de suspension à la suite de +la période. Tous ces éléments peuvent être configurés. Le symbole +d'égalité est donné par le paramètre \parameter{equalsymbol} (valeur +par défaut \verb+{$=$}+), la largeur du trait par le paramètre +\parameter{hrulewidth} (valeur par défaut \texttt{0.4pt}), sa position +verticale par le paramètre \parameter{vruleperiod} (valeur par défaut +\texttt{-0.2}) qui indique un décalage vertical en prenant +\verb+\oplineheight+ comme unité et les points de suspension sont +donnés par le paramètre \parameter{afterperiodsymbol} (valeur par +défaut \verb+$\ldots$+). \begin{SideBySideExample} \opdiv[period,style=text, equalsymbol=$\approx$, @@ -923,14 +1039,14 @@ d {150}{7} \end{SideBySideExample} -\subsection{Éléments supplémentaires} +\subsection{Éléments supplémentaires} \label{subsec:Elements supplementaires} -Les divisions posées peuvent comporter les soustractions successives +Les divisions posées peuvent comporter les soustractions successives permettant le calcul des restes. Pour \package{xlop}, les nombres qui -sont soustraits sont des nombres intermédiaires donc les différentes -façons de représenter les soustractions utiliserons le paramètre -\parameter{displayintermediary} déjà vu pour la multiplication. La -valeur \texttt{none} (défaut) n'affichera aucune soustraction ainsi +sont soustraits sont des nombres intermédiaires donc les différentes +façons de représenter les soustractions utiliserons le paramètre +\parameter{displayintermediary} déjà vu pour la multiplication. La +valeur \texttt{none} (défaut) n'affichera aucune soustraction ainsi que la valeur \texttt{None}, la valeur \texttt{all} affichera toutes les soustractions et la valeur \texttt{nonzero} affichera les soustractions avec un nombre non nul. @@ -945,31 +1061,31 @@ soustractions avec un nombre non nul. Lorsqu'on pose une division, on peut dessiner un \og pont \fg{} au-dessus de la partie du dividende qui sera prise en compte pour la -première étape du calcul. L'extension \package{xlop} permet d'afficher -ce symbole grâce au paramètre booléen \parameter{dividendbridge} -(valeur par défaut \texttt{false}). +première étape du calcul. L'extension \package{xlop} permet d'afficher +ce symbole grâce au paramètre booléen \parameter{dividendbridge} +(valeur par défaut \texttt{false}). \begin{SideBySideExample} \opdiv[dividendbridge]{1254}{30} \end{SideBySideExample} -\subsection{Nombres non entiers et négatifs} +\subsection{Nombres non entiers et négatifs} \label{subsec:Nombres non entiers et negatifs} -La présentation d'opérandes non entières est gérée par le paramètre -\parameter{shiftdecimalsep}. Sa valeur par défaut est \texttt{both} et -indique que le séparateur décimal sera décalé pour obtenir un diviseur +La présentation d'opérandes non entières est gérée par le paramètre +\parameter{shiftdecimalsep}. Sa valeur par défaut est \texttt{both} et +indique que le séparateur décimal sera décalé pour obtenir un diviseur et un dividende entiers. La valeur \texttt{divisor} indique qu'il y -aura le décalage nécessaire pour obtenir un diviseur entier et la -valeur \texttt{none} indique qu'il n'y aura aucun décalage. +aura le décalage nécessaire pour obtenir un diviseur entier et la +valeur \texttt{none} indique qu'il n'y aura aucun décalage. \begin{CenterExample}[xrightmargin=0pt] \opdiv[shiftdecimalsep=both]{3.456}{25.6}\quad \opdiv[shiftdecimalsep=divisor]{3.456}{25.6}\quad \opdiv[shiftdecimalsep=none]{3.456}{25.6} \end{CenterExample} -Un symbole indiqué par le paramètre \parameter{strikedecimalsepsymbol} -est réservé pour montrer l'ancien emplacement de la virgule lorsqu'on -effectue un décalage. La valeur par défaut de ce paramètre est vide ce -qui fait que l'on ne voyait rien sur les exemples précédents. +Un symbole indiqué par le paramètre \parameter{strikedecimalsepsymbol} +est réservé pour montrer l'ancien emplacement de la virgule lorsqu'on +effectue un décalage. La valeur par défaut de ce paramètre est vide ce +qui fait que l'on ne voyait rien sur les exemples précédents. \begin{CenterExample}[xrightmargin=0pt] \opset{strikedecimalsepsymbol={\rlap{,}\rule[-1pt]{3pt}{0.4pt}}} \opdiv[shiftdecimalsep=both]{3.456}{25.6}\quad @@ -977,8 +1093,8 @@ qui fait que l'on ne voyait rien sur les exemples pr \opdiv[shiftdecimalsep=none]{3.456}{25.6} \end{CenterExample} -La présence d'un symbole non vide pour le séparateur décimal barré -peut laisser les zéros non significatifs au niveau des opérandes. +La présence d'un symbole non vide pour le séparateur décimal barré +peut laisser les zéros non significatifs au niveau des opérandes. \begin{SideBySideExample} \opdiv[shiftdecimalsep=divisor, strikedecimalsepsymbol=% @@ -986,23 +1102,23 @@ peut laisser les z {0.03456}{2.56} \end{SideBySideExample} -Comme nous l'avons déjà vu, la macro \macro{opidiv} donne un quotient -entier, cela même si les opérandes sont non entières. Il est un peu -bizarre de vouloir réaliser une division euclidienne sur des nombres +Comme nous l'avons déjà vu, la macro \macro{opidiv} donne un quotient +entier, cela même si les opérandes sont non entières. Il est un peu +bizarre de vouloir réaliser une division euclidienne sur des nombres non entiers et la macro \macro{opidiv} sera assez stricte sur sa -présentation. Les paramètres \parameter{maxdivstep}, +présentation. Les paramètres \parameter{maxdivstep}, \parameter{safedivstep} et \parameter{period} seront sans effet ainsi -que le paramètre \parameter{shiftdecimalsep}, les deux opérandes étant -rendues entières. +que le paramètre \parameter{shiftdecimalsep}, les deux opérandes étant +rendues entières. \begin{SideBySideExample} \opidiv[strikedecimalsepsymbol=% \hspace{-3pt}\tiny$\times$] {34.57}{7} \end{SideBySideExample} -Lorsque les opérandes sont négatives, l'affichage en ligne de -\macro{opidiv} différera des données obtenues avec l'affichage -posée. Le reste sera nécessairement un nombre compris entre zéro +Lorsque les opérandes sont négatives, l'affichage en ligne de +\macro{opidiv} différera des données obtenues avec l'affichage +posée. Le reste sera nécessairement un nombre compris entre zéro (inclus) et la valeur absolue du diviseur (exclu). \begin{SideBySideExample} \opdiv[style=text]{124}{7}\par @@ -1012,7 +1128,7 @@ pos \opidiv[style=text]{-124}{-7} \end{SideBySideExample} -Cette condition sur le reste reste valable même avec un diviseur non +Cette condition sur le reste reste valable même avec un diviseur non entier. \begin{SideBySideExample} \opidiv[style=text]{1.24}{0.7}\par @@ -1023,16 +1139,16 @@ entier. \chapter{Autres commandes} \label{chap:Autres commandes} -\section{Macros étoilées} +\section{Macros étoilées} \label{sec:Macros etoilees} -Les cinq macros vues au chapitre précédent ont une version -étoilée. Ces macros étoilées réalisent le calcul mais ne procèdent à -aucun affichage, le résultat étant stocké dans une variable donnée en +Les cinq macros vues au chapitre précédent ont une version +étoilée. Ces macros étoilées réalisent le calcul mais ne procèdent à +aucun affichage, le résultat étant stocké dans une variable donnée en dernier argument. -Comme ces commandes n'affichent rien, les paramètres ne seront pas -acceptés pour les macros \macro{opadd*}, \macro{opsub*}, -\macro{opmul*} et \macro{opidiv*}. En revanche, les paramètres +Comme ces commandes n'affichent rien, les paramètres ne seront pas +acceptés pour les macros \macro{opadd*}, \macro{opsub*}, +\macro{opmul*} et \macro{opidiv*}. En revanche, les paramètres \parameter{maxdivestep}, \parameter{safedivstep} et \parameter{period} influencent les calculs et la macro \macro{opdiv*} acceptera donc un argument optionnel pour pouvoir en tenir compte. @@ -1042,7 +1158,7 @@ argument optionnel pour pouvoir en tenir compte. \opadd[style=text]{a}{1} \end{SideBySideExample} Pour les macros \macro{opdiv} et \macro{opidiv}, il y aura deux -arguments supplémentaires pour pouvoir recevoir le quotient et le +arguments supplémentaires pour pouvoir recevoir le quotient et le reste final. \begin{SideBySideExample} \opdiv*[maxdivstep=1]{-88}{16}{q}{r}% @@ -1051,28 +1167,28 @@ reste final. \opadd[style=text]{bq}{r} \end{SideBySideExample} -\section{Entrées-sorties} +\section{Entrées-sorties} \label{sec:Entree-sorties} -La macro \macro{opcopy} recopie son premier argument dans son deuxième -argument. Le premier argument est donc un nombre écrit sous forme -décimale ou via une variable alors que le second sera considérée comme +La macro \macro{opcopy} recopie son premier argument dans son deuxième +argument. Le premier argument est donc un nombre écrit sous forme +décimale ou via une variable alors que le second sera considérée comme un nom de variable. La macro \macro{opprint} affiche son argument. L'exemple qui suit utilise le compteur \macro{time} qui indique le nombre de minutes -écoulés depuis minuit. +écoulés depuis minuit. \begin{SideBySideExample} \opidiv*{\the\time}{60}{h}{m}% Il est \opprint{h}~heures et \opprint{m}~minutes \end{SideBySideExample} -On verra à la section~\ref{sec:Comparaisons} comment améliorer cet +On verra à la section~\ref{sec:Comparaisons} comment améliorer cet affichage avec des tests. -La macro \macro{opdisplay} affiche également un nombre mais en -écrivant chaque chiffre dans une boîte de largeur donnée par -\parameter{columnwidth} et de hauteur donnée par -\parameter{lineheight}. Le style est spécifié par le premier argument +La macro \macro{opdisplay} affiche également un nombre mais en +écrivant chaque chiffre dans une boîte de largeur donnée par +\parameter{columnwidth} et de hauteur donnée par +\parameter{lineheight}. Le style est spécifié par le premier argument et cette macro accepte un argument optionnel pour permettre de donner un style particulier aux chiffres individuels. \begin{SideBySideExample} @@ -1082,12 +1198,12 @@ un style particulier aux chiffres individuels. \end{SideBySideExample} Les macros \macro{oplput} et \macro{oprput} permettent de placer un -objet à un emplacement déterminé. La syntaxe de ces commandes ne +objet à un emplacement déterminé. La syntaxe de ces commandes ne suit pas celle des autres macros de \package{xlop} puisque -l'emplacement est indiqué sous forme de coordonnées entre -parenthèses. Les coordonnées utilisent \macro{opcolumnwidth} et -\macro{oplineheight} comme unités ce qui permet à l'utilisateur de -construire lui-même ses propres \og opérations \fg. +l'emplacement est indiqué sous forme de coordonnées entre +parenthèses. Les coordonnées utilisent \macro{opcolumnwidth} et +\macro{oplineheight} comme unités ce qui permet à l'utilisateur de +construire lui-même ses propres \og opérations \fg. \begin{SideBySideExample} \psset{xunit=\opcolumnwidth, yunit=\oplineheight}% @@ -1098,18 +1214,18 @@ construire lui-m $\bullet$ \end{SideBySideExample} Sur l'exemple ci-dessus, on peut voir que ces deux macros ne modifient -pas le point de référence. Elles prennent même la précaution d'inhiber -l'espace automatique qui les suit pour qu'il ne soit pas nécessaire de +pas le point de référence. Elles prennent même la précaution d'inhiber +l'espace automatique qui les suit pour qu'il ne soit pas nécessaire de mettre un \verb+%+ en fin de ligne. -Les macros \macro{ophline} et \macro{opvline} complète les deux -précédentes pour donner à l'utilisateur les outils lui permettant de -construire ses propres opérations. La macro \macro{ophline} permet de -placer un trait horizontal dont la longueur est donné par le paramètre -qui suit les coordonnées. La macro \macro{opvline} fait de même avec -les traits verticaux. On rappelle que les paramètres +Les macros \macro{ophline} et \macro{opvline} complète les deux +précédentes pour donner à l'utilisateur les outils lui permettant de +construire ses propres opérations. La macro \macro{ophline} permet de +placer un trait horizontal dont la longueur est donné par le paramètre +qui suit les coordonnées. La macro \macro{opvline} fait de même avec +les traits verticaux. On rappelle que les paramètres \parameter{hrulewidth} et \parameter{vrulewidth} indiquent les -épaisseurs respectives de ces types de traits. +épaisseurs respectives de ces types de traits. \begin{CenterExample}[xrightmargin=0pt] \par\vspace{2\oplineheight} \oplput(1,2){O}\oplput(2,2){N}\oplput(3,2){E} @@ -1121,14 +1237,14 @@ les traits verticaux. On rappelle que les param La macro \macro{opexport}\refstepcounter{stuff}\label{macro-opexport} permet d'exporter un nombre dans une macro. Il s'agit d'un ajout de la -version 0.23 qui est très utile pour faire dialoguer \package{xlop} -avec le monde extérieur. Le premier argument est un nombre au sens -\package{xlop}, c'est-à-dire soit un nombre écrit directement avec des -chiffres, soit un nom de variable. Le nombre sera écrit sous une forme -directement compréhensible par \TeX{} dans le deuxième argument qui -doit donc être un nom de macro. On notera cependant que le séparateur -décimal sera celui désigné par \parameter{decimalsepsymbol} débarrassé -de ses éventuelles accolades. +version 0.23 qui est très utile pour faire dialoguer \package{xlop} +avec le monde extérieur. Le premier argument est un nombre au sens +\package{xlop}, c'est-à-dire soit un nombre écrit directement avec des +chiffres, soit un nom de variable. Le nombre sera écrit sous une forme +directement compréhensible par \TeX{} dans le deuxième argument qui +doit donc être un nom de macro. On notera cependant que le séparateur +décimal sera celui désigné par \parameter{decimalsepsymbol} débarrassé +de ses éventuelles accolades. \begin{SideBySideExample} \opmul*{5}{3.141592654}{C} \opexport{C}{\fivepi} @@ -1136,18 +1252,18 @@ de ses \end{SideBySideExample} On peut se servir de cette macro, par exemple, pour afficher des -nombres calculés par \package{xlop} dans un tableau avec un alignement -décimal ou encore pour initialiser un compteur ou une longueur (ne pas -oublier l'unité dans ce dernier cas). +nombres calculés par \package{xlop} dans un tableau avec un alignement +décimal ou encore pour initialiser un compteur ou une longueur (ne pas +oublier l'unité dans ce dernier cas). \section{Chiffres d'un nombre} \label{sec:Chiffres d'un nombre} Les macros \macro{opwidth}, \macro{opintegerwidth} et \macro{opdecimalwidth} indiquent respectivement le nombre de chiffres -du nombre dans sa totalité, de sa partie entière et de sa partie -décimale. Le premier argument est le nombre sur lequel s'effectue le -comptage et le second argument indique la variable où sera stocké le -résultat. +du nombre dans sa totalité, de sa partie entière et de sa partie +décimale. Le premier argument est le nombre sur lequel s'effectue le +comptage et le second argument indique la variable où sera stocké le +résultat. \begin{SideBySideExample} \opcopy{123456.1234}{a}% \opwidth{a}{na}% @@ -1159,9 +1275,9 @@ r d\'ecimale). \end{SideBySideExample} -La macro \macro{opunzero} permet de supprimer les zéros non -significatifs\index{zeros non significatifs@zéros non significatifs} -du nombre passé en argument. +La macro \macro{opunzero} permet de supprimer les zéros non +significatifs\index{zeros non significatifs@zéros non significatifs} +du nombre passé en argument. \begin{SideBySideExample} \opcopy{00150.00250}{a}% Avant : \opprint{a}\par @@ -1170,11 +1286,11 @@ du nombre pass \end{SideBySideExample} Les macros \macro{integer} et \macro{opdecimal} donnent respectivement -la partie entière et la partie décimale d'un nombre. -\index{nombre!partie entière}\index{partie entière}% -\index{nombre!partie décimale}\index{partie décimale}% -Le premier argument est le nombre à traiter et le second est la -variable qui contiendra le résultat. +la partie entière et la partie décimale d'un nombre. +\index{nombre!partie entière}\index{partie entière}% +\index{nombre!partie décimale}\index{partie décimale}% +Le premier argument est le nombre à traiter et le second est la +variable qui contiendra le résultat. \begin{SideBySideExample} \opcopy{-37.69911}{a}% \opinteger{a}{ia}% @@ -1183,14 +1299,14 @@ variable qui contiendra le r Partie d\'ecimale : \opprint{da} \end{SideBySideExample} -Six macros servent à écrire ou lire un chiffre d'un nombre. On peut -lire ou écrire un chiffre selon son rang dans le nombre, dans sa -partie entière ou dans sa partie décimale. Les chiffres pour le nombre -dans sa totalité ou pour sa partie entière sont numérotés de droite à -gauche et, pour sa partie décimale de gauche à droite. Ainsi, avec le -nombre 1234,56789, le deuxième chiffre est 8, le deuxième chiffre de -sa partie entière est 3 et le deuxième chiffre de sa partie décimale -est 6. Il est alors facile de deviner le rôle respectif des six macros +Six macros servent à écrire ou lire un chiffre d'un nombre. On peut +lire ou écrire un chiffre selon son rang dans le nombre, dans sa +partie entière ou dans sa partie décimale. Les chiffres pour le nombre +dans sa totalité ou pour sa partie entière sont numérotés de droite à +gauche et, pour sa partie décimale de gauche à droite. Ainsi, avec le +nombre 1234,56789, le deuxième chiffre est 8, le deuxième chiffre de +sa partie entière est 3 et le deuxième chiffre de sa partie décimale +est 6. Il est alors facile de deviner le rôle respectif des six macros : \begin{itemize} \item \parameter{opgetdigit} ; @@ -1200,39 +1316,39 @@ est 6. Il est alors facile de deviner le r \item \parameter{opgetdecimaldigit} ; \item \parameter{opsetdecimaldigit} ; \end{itemize} -La syntaxe est la même pour ces six macros. Le premier argument est le -nombre sur lequel doit porter la lecture ou l'écriture, le deuxième -argument est l'index donnant la position du chiffre et le troisième +La syntaxe est la même pour ces six macros. Le premier argument est le +nombre sur lequel doit porter la lecture ou l'écriture, le deuxième +argument est l'index donnant la position du chiffre et le troisième argument est le nom de la variable qui contiendra le chiffre lu ou -bien ce qui devra être écrit. Si l'index est en dehors du nombre, les -macros de lecture donneront \texttt{0} comme résultat et les macros -d'écriture étendront le nombre pour pouvoir atteindre cet index en -créant des zéros dans les nouvelles positions. +bien le chiffre qui devra être écrit. Si l'index est en dehors du +nombre, les macros de lecture donneront \texttt{0} comme résultat et +les macros d'écriture étendront le nombre pour pouvoir atteindre cet +index en créant des zéros dans les nouvelles positions. \section{Comparaisons} \label{sec:Comparaisons} -Lorsqu'on désire concevoir des macros évoluées, il est très souvent -utile de pouvoir réaliser des tests. Pour cela, \package{xlop} met à +Lorsqu'on désire concevoir des macros évoluées, il est très souvent +utile de pouvoir réaliser des tests. Pour cela, \package{xlop} met à disposition la macro \macro{opcmp} dont les deux arguments sont des -nombres et qui mettra à jour les tests \macro{ifopgt}, \macro{ifopge}, +nombres et qui mettra à jour les tests \macro{ifopgt}, \macro{ifopge}, \macro{ifople}, \macro{ifoplt}, \macro{ifopeq} et \macro{ifopneq} pour -respectivement indiquer que la première opérande est strictement -supérieure, supérieure, inférieure, strictement inférieure, égale ou -différente de la seconde opérande. - -Pour des raisons techniques, \package{xlop} donne des définitions -globales aux six tests précédents. Ceux-ci ne seront donc pas protégés -par les groupes. Comme ces tests sont utilisés par un grand nombre de -macros de \package{xlop}, une conséquence pratique est qu'il faut -\emph{toujours} réaliser les tests \verb+\ifop...+ immédiatement -après le \macro{opcmp}, ou, du moins, avant toute autre utilisation de -macros de \package{xlop} sous peine de bogues éventuels difficiles à +respectivement indiquer que la première opérande est strictement +supérieure, supérieure, inférieure, strictement inférieure, égale ou +différente de la seconde opérande. + +Pour des raisons techniques, \package{xlop} donne des définitions +globales aux six tests précédents. Ceux-ci ne seront donc pas protégés +par les groupes. Comme ces tests sont utilisés par un grand nombre de +macros de \package{xlop}, une conséquence pratique est qu'il faut +\emph{toujours} réaliser les tests \verb+\ifop...+ immédiatement +après le \macro{opcmp}, ou, du moins, avant toute autre utilisation de +macros de \package{xlop} sous peine de bogues éventuels difficiles à comprendre ! -On va reprendre la macro d'affichage de l'heure donnée à la -section~\ref{sec:Entree-sorties} mais en vérifiant si l'argument est -compris entre~0 (inclus) et~1440 (exclu) puis en réalisant les tests -nécessaires pour voir si \og heure \fg{} doit être ou non au pluriel +On va reprendre la macro d'affichage de l'heure donnée à la +section~\ref{sec:Entree-sorties} mais en vérifiant si l'argument est +compris entre~0 (inclus) et~1440 (exclu) puis en réalisant les tests +nécessaires pour voir si \og heure \fg{} doit être ou non au pluriel ainsi que \og minute \fg{}. \begin{CenterExample}[xrightmargin=0pt] @@ -1255,30 +1371,30 @@ ainsi que \og minute \fg{}. \heure{60} -- \heure{1080} -- \heure{1081} -- \heure{1082} \end{CenterExample} -\section{Opérations évoluées} +\section{Opérations évoluées} \label{sec:Operations evoluees} -Les macros qui nous restent à voir proviennent soit de commandes -utilisées de façon interne et qu'il aurait été dommage de ne pas +Les macros qui nous restent à voir proviennent soit de commandes +utilisées de façon interne et qu'il aurait été dommage de ne pas rendre publiques, soit de demandes d'utilisateurs. -Les macros utilisées de façon interne sont \macro{opgcd}\index{pgcd} +Les macros utilisées de façon interne sont \macro{opgcd}\index{pgcd} qui donne le pgcd de deux nombres et -\macro{opdivperiod}\index{division!période} qui donne la longueur de -la période d'un quotient de deux nombres. Pour des raisons -d'efficacité, ces macros n'utilisent pas les nombres de \package{xlop} -mais des nombres directement accessibles à \TeX{}. Cela a pour -conséquence que les nombres passés en paramètres dans les deux -premiers arguments ne devront pas dépasser la valeur +\macro{opdivperiod}\index{division!période} qui donne la longueur de +la période d'un quotient de deux nombres. Pour des raisons +d'efficacité, ces macros n'utilisent pas les nombres de \package{xlop} +mais des nombres directement accessibles à \TeX{}. Cela a pour +conséquence que les nombres passés en paramètres dans les deux +premiers arguments ne devront pas dépasser la valeur \texttt{2147483647} pour \macro{opgcd} et \texttt{214748364} pour -\macro{opdivperiod}. Un message d'avertissement rappellera à l'ordre -en cas de dépassement. Le résultat sera stocké dans la variable -indiqué en troisième paramètre. +\macro{opdivperiod}. Un message d'avertissement rappellera à l'ordre +en cas de dépassement. Le résultat sera stocké dans la variable +indiqué en troisième paramètre. -Il y aura également quelques vérifications sur les deux premiers -paramètres. Un pgcd ne peut pas avoir d'argument nul et le calcul de -la longueur d'une période ne pourra pas se faire avec un quotient -nul. D'autre part, si un nombre non entier est passé en paramètre, -seule la partie entière sera prise en compte. +Il y aura également quelques vérifications sur les deux premiers +paramètres. Un pgcd ne peut pas avoir d'argument nul et le calcul de +la longueur d'une période ne pourra pas se faire avec un quotient +nul. D'autre part, si un nombre non entier est passé en paramètre, +seule la partie entière sera prise en compte. \begin{SideBySideExample} \opcopy{5376}{a}% \opcopy{2304}{b}% @@ -1288,8 +1404,8 @@ seule la partie enti $\pgcd(\opprint{a},\opprint{b}) = \opprint{gcd(ab)}$ \end{SideBySideExample} -Si vous voulez vous amuser à trouver de grandes périodes de divisions, -sans entrer dans les détails mathématiques, les carrés de nombres +Si vous voulez vous amuser à trouver de grandes périodes de divisions, +sans entrer dans les détails mathématiques, les carrés de nombres premiers sont de bons candidats. Par exemple, avec $257^2=66049$ on trouve : \begin{SideBySideExample} @@ -1301,13 +1417,13 @@ trouve : Les macros \macro{opcastingoutnines}\index{preuve!par neuf} et \macro{opcastingoutelevens}\index{preuve!par onze} vont permettre de composer des preuves par neuf et par onze. L'extension \package{xlop} -ne propose pas directement ces compositions puisqu'elles nécessitent -des traits en diagonal et donc le recours à d'autres extensions. En -réalité, la macro \macro{opcastingoutnines} va faire la somme modulo~9 -des chiffres du premier argument et stockera le résultat dans le +ne propose pas directement ces compositions puisqu'elles nécessitent +des traits en diagonal et donc le recours à d'autres extensions. En +réalité, la macro \macro{opcastingoutnines} va faire la somme modulo~9 +des chiffres du premier argument et stockera le résultat dans le second argument tandis que la macro \macro{opcastingoutelevens} fera la somme des chiffres de rangs impairs, la somme des chiffres de rangs -pairs puis la différence modulo~11 de ces deux sommes. +pairs puis la différence modulo~11 de ces deux sommes. \begin{SideBySideExample} \newcommand\castingoutnines[3]{% \opcastingoutnines{#1}{cna}% @@ -1328,28 +1444,28 @@ pairs puis la diff \castingoutnines{157}{317}{49669} \end{SideBySideExample} Incidemment, cet exemple montre que $157\times317\neq49669$ ! La -réponse correcte est \opmul[style=text]{157}{317}. - -Les deux macros suivantes sont très simples. Il s'agit de -\macro{opneg} qui calcul l'opposé de son premier argument et le -sauvegarde dans la variable indiquée par le second argument et de -\macro{opabs} qui réalise la même chose mais avec la valeur absolue. - -La macro \macro{oppower} calcule des puissances entières. Cette macro -demande trois paramètres, le troisième paramètre étant la variable -recevant le résultat du premier paramètre à la puissance le deuxième -paramètre. Le deuxième paramètre doit être un nombre entier. Lorsque -le premier argument est nul, si le deuxième paramètre est nul, le -résultat sera~1, s'il est strictement positif, le résultat sera nul et -s'il est strictement négatif il y aura une erreur et aucun résultat ne -sera fourni. Il n'y a aucune limitation sur le premier paramètre ce -qui peut entraîner quelques problèmes. Par exemple : +réponse correcte est \opmul[style=text]{157}{317}. + +Les deux macros suivantes sont très simples. Il s'agit de +\macro{opneg} qui calcul l'opposé de son premier argument et le +sauvegarde dans la variable indiquée par le second argument et de +\macro{opabs} qui réalise la même chose mais avec la valeur absolue. + +La macro \macro{oppower} calcule des puissances entières. Cette macro +demande trois paramètres, le troisième paramètre étant la variable +recevant le résultat du premier paramètre à la puissance le deuxième +paramètre. Le deuxième paramètre doit être un nombre entier. Lorsque +le premier argument est nul, si le deuxième paramètre est nul, le +résultat sera~1, s'il est strictement positif, le résultat sera nul et +s'il est strictement négatif il y aura une erreur et aucun résultat ne +sera fourni. Il n'y a aucune limitation sur le premier paramètre ce +qui peut entraîner quelques problèmes. Par exemple : \begin{CenterExample}[xrightmargin=0pt] \opcopy{0.8}{a}\opcopy{-17}{n}% \oppower{a}{n}{r}% $\opprint{a}^{\opprint{n}} = \opprint{r}$ \end{CenterExample} -Avec $0{,}7$ au lieu de $0{,}8$, le problème aurait été encore pire : +Avec $0{,}7$ au lieu de $0{,}8$, le problème aurait été encore pire : \begin{CenterExample}[xrightmargin=0pt] \opcopy{0.7}{a}\opcopy{-8}{n}% \oppower{a}{n}{r}% @@ -1357,30 +1473,30 @@ Avec $0{,}7$ au lieu de $0{,}8$, le probl $\opprint{a}^{\opprint{n}}$ a \opprint{dr} chiffres apr\`es la virgule. \end{CenterExample} -Cela est dû au fait que lorsque l'exposant est négatif, +Cela est dû au fait que lorsque l'exposant est négatif, \package{xlop} calcule \emph{d'abord} l'inverse du nombre pour -\emph{ensuite} calculer la puissance avec l'opposé de l'exposant. Si -on avait laissé $-17$ au lieu de $-8$ dans l'exemple précédent, les -capacités de \TeX{} auraient été dépassées. - -Les trois macros qui suivent permettent de contrôler la précision des -nombres manipulés. Elles permettent de construire un nombre en donnant -une valeur approchée par défaut, par excès ou un arrondi d'un nombre -donné en précisant le rang où devra se faire l'arrondi. Ces macros +\emph{ensuite} calculer la puissance avec l'opposé de l'exposant. Si +on avait laissé $-17$ au lieu de $-8$ dans l'exemple précédent, les +capacités de \TeX{} auraient été dépassées. + +Les trois macros qui suivent permettent de contrôler la précision des +nombres manipulés. Elles permettent de construire un nombre en donnant +une valeur approchée par défaut, par excès ou un arrondi d'un nombre +donné en précisant le rang où devra se faire l'arrondi. Ces macros sont respectivement \macro{opfloor}, \macro{opceil} et -\macro{opround}. Elles demandent trois paramètres qui seront dans -l'ordre le nombre de départ, le rang de l'arrondi et le nom de la -variable qui contiendra le résultat. - -Le rang est indiqué par une valeur entière donnant le nombre de -chiffres après la virgule qui doivent être présents. Si le rang est -négatif, l'arrondi se fera avant la virgule. Si le rang positif -indique plus de chiffres que la partie décimale n'en a, des zéros -seront ajoutés. Si le rang négatif indique plus de chiffres que la -partie entière n'en a, l'arrondi restera bloqué pour donner au moins +\macro{opround}. Elles demandent trois paramètres qui seront dans +l'ordre le nombre de départ, le rang de l'arrondi et le nom de la +variable qui contiendra le résultat. + +Le rang est indiqué par une valeur entière donnant le nombre de +chiffres après la virgule qui doivent être présents. Si le rang est +négatif, l'arrondi se fera avant la virgule. Si le rang positif +indique plus de chiffres que la partie décimale n'en a, des zéros +seront ajoutés. Si le rang négatif indique plus de chiffres que la +partie entière n'en a, l'arrondi restera bloqué pour donner au moins le premier chiffre du nombre. -Voici un tableau récapitulatif pour mieux comprendre le fonctionnement +Voici un tableau récapitulatif pour mieux comprendre le fonctionnement de ces trois macros. \begin{center} \opcopy{3838.3838}{a} @@ -1461,67 +1577,67 @@ de ces trois macros. \end{tabular} \end{center} -\index{racine carrée} -Avec la version~0.26, \package{xlop} propose l'opération de racine -carrée \macro{opsqrt}. Cette macro n'a pas la même syntaxe que les -autres macros arithmétiques puisqu'il n'y a pas de forme étoilée. En -réalité, il y a bien une façon d'afficher l'opération d'extraction de -racine carrée mais elle n'est pas franchement courante. Je suis -relativement âgé et mon grand-père me racontait qu'il l'avait vue -lorsqu'il était à l'école. Ainsi, il y a une macro \macro{opgfsqrt} où -le \og gf \fg{} est pour \og grandfather \fg{} (grand-père). +\index{racine carrée} +Avec la version~0.26, \package{xlop} propose l'opération de racine +carrée \macro{opsqrt}. Cette macro n'a pas la même syntaxe que les +autres macros arithmétiques puisqu'il n'y a pas de forme étoilée. En +réalité, il y a bien une façon d'afficher l'opération d'extraction de +racine carrée mais elle n'est pas franchement courante. Je suis +relativement âgé et mon grand-père me racontait qu'il l'avait vue +lorsqu'il était à l'école. Ainsi, il y a une macro \macro{opgfsqrt} où +le \og gf \fg{} est pour \og grandfather \fg{} (grand-père). -Voyons la première macro : celle qui calcule la racine carrée et qui -stocke le résultat dans une variable \package{xlop}: +Voyons la première macro : celle qui calcule la racine carrée et qui +stocke le résultat dans une variable \package{xlop}: \begin{SideBySideExample} \opsqrt{2}{sqrt2} $\sqrt{2}\approx\opprint{sqrt2}$ \end{SideBySideExample} -Cette macro partage le paramètre \parameter{maxdivstep} avec les +Cette macro partage le paramètre \parameter{maxdivstep} avec les macros de division. Par exemple: \begin{SideBySideExample} \opsqrt[maxdivstep=15]{2}{sqrt2} $\sqrt{2}\approx\opprint{sqrt2}$ \end{SideBySideExample} -Pour la présentation à la \og grand-père \fg{}, je n'ai vraiment pas -le courage d'expliquer tout le processus. Il se base sur l'eidentioté -remarquable $(a+b)^2=a^2+2ab+b^2$. Merci à Jean-Michel Sarlat d'avoir -pris le temps de m'expliquer cette méthode afin que je puisse la coder +Pour la présentation à la \og grand-père \fg{}, je n'ai vraiment pas +le courage d'expliquer tout le processus. Il se base sur l'eidentioté +remarquable $(a+b)^2=a^2+2ab+b^2$. Merci à Jean-Michel Sarlat d'avoir +pris le temps de m'expliquer cette méthode afin que je puisse la coder dans \package{xlop}. -Voici un exemple avec le calcul de la racine carrée de 15 : +Voici un exemple avec le calcul de la racine carrée de 15 : \begin{CenterExample} \opgfsqrt[maxdivstep=5]{15} \end{CenterExample} -Cette méthode est horrible, autant pour un humain que pour -l'ordinateur. Par exemple, l'opération réellement effectuée par -\package{xlop} se fonde sur la méthode de Héron. +Cette méthode est horrible, autant pour un humain que pour +l'ordinateur. Par exemple, l'opération réellement effectuée par +\package{xlop} se fonde sur la méthode de Héron. \index{expression complexe|(} -La dernière macro qui nous reste à voir est \macro{opexpr} qui permet -de réaliser le calcul d'une expression complexe. Cette macro demande -deux paramètres : le premier est l'expression à calculer donnée sous +La dernière macro qui nous reste à voir est \macro{opexpr} qui permet +de réaliser le calcul d'une expression complexe. Cette macro demande +deux paramètres : le premier est l'expression à calculer donnée sous forme infixe (la forme habituelle pour un humain) et le second est le -nom de la variable qui contiendra le résultat. +nom de la variable qui contiendra le résultat. -Initialement, la formule devait être donnée sous forme polonaise +Initialement, la formule devait être donnée sous forme polonaise inverse (la notation des calculatrices HP ou du langage PostScript par exemple) mais un travail commun avec Christophe Jorssen a finalement -abouti à la possibilité de donner l'expression sous une forme plus -agréable pour l'utilisateur. +abouti à la possibilité de donner l'expression sous une forme plus +agréable pour l'utilisateur. -Les formules acceptent les opérateurs arithmétiques habituels -\texttt{+}, \texttt{-}, \texttt{*} et \texttt{/} ainsi que l'opérateur +Les formules acceptent les opérateurs arithmétiques habituels +\texttt{+}, \texttt{-}, \texttt{*} et \texttt{/} ainsi que l'opérateur \texttt{:} pour la division euclidienne et \verb+^+ pour -l'exponentiation. L'opérateur \texttt{-} a les deux rôles d'opérateur -binaire de la soustraction et d'opérateur unaire pour l'opposé. -L'opérateur \texttt{+} a également les deux rôles d'opérateur binaire -de l'addition et d'opérateur unaire ne faisant \ldots{} rien ! Les -opérandes sont écrites sous forme décimale ou par l'intermédiaire de +l'exponentiation. L'opérateur \texttt{-} a les deux rôles d'opérateur +binaire de la soustraction et d'opérateur unaire pour l'opposé. +L'opérateur \texttt{+} a également les deux rôles d'opérateur binaire +de l'addition et d'opérateur unaire ne faisant \ldots{} rien ! Les +opérandes sont écrites sous forme décimale ou par l'intermédiaire de nom de variable cependant, la macro \macro{opexpr} va introduire une petite restriction sur les noms de variables puisque ceux-ci devront -être différents des noms de fonctions reconnus par cette macro. Les +être différents des noms de fonctions reconnus par cette macro. Les fonctions accessibles sont : \begin{itemize} \item \texttt{abs(a)} ; @@ -1530,23 +1646,23 @@ fonctions accessibles sont : \item \texttt{floor(a,i)} ; \item \texttt{gcd(a,b)} ; \item \texttt{integer(a)} ; -\item \texttt{mod(a,b)} qui donne le résultat de \texttt{a} modulo +\item \texttt{mod(a,b)} qui donne le résultat de \texttt{a} modulo \texttt{b} ; \item \texttt{rest(a,b)} qui donne le reste de la division de - \texttt{a} par \texttt{b} (la différence entre reste et modulo est - la différence qui existe entre division non euclidienne et division + \texttt{a} par \texttt{b} (la différence entre reste et modulo est + la différence qui existe entre division non euclidienne et division euclidienne) ; \item \texttt{round(a,i)}. \end{itemize} -où les fonctions non décrites ci-dessus font appel aux macros -correspondantes (la fonction \texttt{xxx} faisant appel à la macro +où les fonctions non décrites ci-dessus font appel aux macros +correspondantes (la fonction \texttt{xxx} faisant appel à la macro \verb+\opxxx+). Pour les fonctions \texttt{ceil}, \texttt{floor} et \texttt{round}, le nombre \texttt{i} indique le rang sur lequel doit se faire l'arrondi. La macro \macro{opexpr} accepte un argument optionnel car elle peut -réaliser des divisions et que ces divisions doivent pouvoir être -contrôlées \emph{via} les paramètres \parameter{maxdivstep}, +réaliser des divisions et que ces divisions doivent pouvoir être +contrôlées \emph{via} les paramètres \parameter{maxdivstep}, \parameter{safedivstep} et \parameter{period}. Notre premier exemple est assez basique : \begin{CenterExample}[xrightmargin=0pt] @@ -1554,7 +1670,7 @@ Notre premier exemple est assez basique : $3--\gcd(15\times17,25\times27)\times2 = \opprint{r}$ \end{CenterExample} -Voici un autre exemple montrant que des données peuvent provenir d'une +Voici un autre exemple montrant que des données peuvent provenir d'une macro : \begin{CenterExample}[xrightmargin=0pt] \newcommand\try{2}% @@ -1569,41 +1685,41 @@ macro : \index{expression complexe|)} \appendix -\chapter{Aide-mémoire} -\label{chap:Aide-mémoire} +\chapter{Aide-mémoire} +\label{chap:Aide-mémoire} \section{Temps de compilation} \label{sec:Temps de compilation} -Les temps de compilation ont été mesurés sur une machine à processeur +Les temps de compilation ont été mesurés sur une machine à processeur Pentium~II~600\,MHz ayant 256\,Mo de RAM et tournant sous Linux -(Debian woody)\footnote{En réalité, ces mesures ont été effectuées en - 2004 lors de la sortie de la version 0.2. L'auteur étant fainéant, - il n'a pas repris ces tests avec son matériel actuel (bien plus - performant) !}. Le principe a été de faire un fichier TeX{} minimum -dont le schéma général est donné par : +(Debian woody)\footnote{En réalité, ces mesures ont été effectuées en + 2004 lors de la sortie de la version 0.2. L'auteur étant fainéant, + il n'a pas repris ces tests avec son matériel actuel (bien plus + performant) !}. Le principe a été de faire un fichier TeX{} minimum +dont le schéma général est donné par : \begin{verbatim} \input xlop \count255=0 \loop \ifnum\count255<1000 - + \advance\count255 by1 \repeat \bye \end{verbatim} -Le temps de compilation avec \verb++ vide a été -soustrait des autres tests et seul le temps utilisateur a été pris en -compte. Les résultats sont donnés en millisecondes et sont évidemment -à prendre avec beaucoup de précautions. +Le temps de compilation avec \verb++ vide a été +soustrait des autres tests et seul le temps utilisateur a été pris en +compte. Les résultats sont donnés en millisecondes et sont évidemment +à prendre avec beaucoup de précautions. \index{compilation (temps de)|(}\index{temps de calcul|(}% -Le tableau suivant donne le temps de compilation des opérations en -millisecondes. Les opérandes utilisées l'ont été avec une écriture -sous forme de chiffres mais des essais avec des opérandes sous forme -de noms de variable ont montré que les différences étaient vraiment +Le tableau suivant donne le temps de compilation des opérations en +millisecondes. Les opérandes utilisées l'ont été avec une écriture +sous forme de chiffres mais des essais avec des opérandes sous forme +de noms de variable ont montré que les différences étaient vraiment minimes. -La première ligne indique le nombre de chiffres des deux -opérandes. Ces nombres ont été construits de la façons suivantes : +La première ligne indique le nombre de chiffres des deux +opérandes. Ces nombres ont été construits de la façons suivantes : \begin{itemize} \item $\mathrm{A} = 1$ et $\mathrm{B} = 9$ pour un chiffre ; \item $\mathrm{A} = 12$ et $\mathrm{B} = 98$ pour deux chiffres ; @@ -1614,7 +1730,7 @@ op \item $\mathrm{A} = 12345678901234567890$ et $\mathrm{B} = 98765432109876543210$ pour vingt chiffres ; \end{itemize} -Voici les résultats, quelques commentaires suivront : +Voici les résultats, quelques commentaires suivront : \bigskip\noindent\hbox to\linewidth{\hss \begin{tabular}{|r|*{6}{l|}} @@ -1656,38 +1772,38 @@ Voici les r \hss } \par\bigskip -Il est normal que l'inversion des opérandes n'ait aucune influence +Il est normal que l'inversion des opérandes n'ait aucune influence pour l'addition. Il peut alors sembler anormal qu'elle en ait une pour -la soustraction mais en fait, avoir une seconde opérande supérieure à -la première va entraîner quelques instructions supplémentaires (double -inversion, gestion plus longue du signe du résultat). +la soustraction mais en fait, avoir une seconde opérande supérieure à +la première va entraîner quelques instructions supplémentaires (double +inversion, gestion plus longue du signe du résultat). -Il est normal que le temps de la division soit supérieur à celui de la +Il est normal que le temps de la division soit supérieur à celui de la multiplication. Il peut alors sembler anormal que la division ait l'air de \og rattraper \fg{} son retard. En fait, une multiplication -voit sa complexité fortement augmenter avec la taille des opérandes -mais la division normale est bloquée par le paramètre -\parameter{maxdivstep}. On le voit bien sur l'exemple où on limite ce -maximum à 5~étapes. - -Quelques résultats semblent bizarres. Ainsi, -\verb+\opdiv*{9}{1}{q}{r}+ est anormalement rapide : cela est dû -au fait d'avoir un quotient à un seul chiffre. Plus bizarre encore, -\verb+\opdiv*{123}{987}{q}{r}+ est plutôt rapide. Ici, -l'explication est plus subtile : cela est dû à la présence de nombreux -zéros au quotient. - -Avec des opérandes de taille comparable, la division euclidienne est -très rapide par rapport à la division non euclidienne. Cela est dû au +voit sa complexité fortement augmenter avec la taille des opérandes +mais la division normale est bloquée par le paramètre +\parameter{maxdivstep}. On le voit bien sur l'exemple où on limite ce +maximum à 5~étapes. + +Quelques résultats semblent bizarres. Ainsi, +\verb+\opdiv*{9}{1}{q}{r}+ est anormalement rapide : cela est dû +au fait d'avoir un quotient à un seul chiffre. Plus bizarre encore, +\verb+\opdiv*{123}{987}{q}{r}+ est plutôt rapide. Ici, +l'explication est plus subtile : cela est dû à la présence de nombreux +zéros au quotient. + +Avec des opérandes de taille comparable, la division euclidienne est +très rapide par rapport à la division non euclidienne. Cela est dû au fait que le quotient n'aura que peu de chiffres (un seul avec tous les -nombres \texttt{A} et \texttt{B}). La dernière ligne du tableau est -plus représentative des temps de compilation que l'on peut obtenir -avec cette opération. - -Toutes ces remarques sont faites pour bien insister sur la difficulté -à évaluer un temps de compilation a priori : il dépend de trop de -paramètres. Cela dit, le tableau permet d'avoir quand même une idée de -ce à quoi il faut s'attendre. +nombres \texttt{A} et \texttt{B}). La dernière ligne du tableau est +plus représentative des temps de compilation que l'on peut obtenir +avec cette opération. + +Toutes ces remarques sont faites pour bien insister sur la difficulté +à évaluer un temps de compilation a priori : il dépend de trop de +paramètres. Cela dit, le tableau permet d'avoir quand même une idée de +ce à quoi il faut s'attendre. \index{compilation (temps de)|)}\index{temps de calcul|)} \clearpage @@ -1704,390 +1820,407 @@ ce \multicolumn{1}{c|}{\textbf{Description}} \\\hline\hline \endhead \hline - \multicolumn{2}{|c|}{$\ldots$ à suivre $\ldots$}\\ + \multicolumn{2}{|c|}{$\ldots$ à suivre $\ldots$}\\ \hline \endfoot \hline \endlastfoot \verb+\opabs{n}{N}+ & - \verb+N+ reçoit la valeur absolue de \verb+n+. \\\hline + \verb+N+ reçoit la valeur absolue de \verb+n+. \\\hline \verb+\opadd[P]{n1}{n2}+ & - Affiche le résultat de l'opération \verb-n1+n2-. \\\hline + Affiche le résultat de l'opération \verb-n1+n2-. \\\hline \verb+\opadd*{n1}{n2}{N}+ & - Calcule \verb-n1+n2- et place le résultat dans + Calcule \verb-n1+n2- et place le résultat dans \verb+N+. \\\hline \verb+\opcastingoutelevens{n}{N}+ & - Calcule la différence (modulo 11) de la somme des chiffres de rang + Calcule la différence (modulo 11) de la somme des chiffres de rang impair et de la somme des chiffres de rang pair de \verb+n+ et - place le résultat dans \verb+N+. \\\hline + place le résultat dans \verb+N+. \\\hline \verb+\opcastingoutnines{n}{N}+. & Calcule la somme modulo 9 des chiffres de \verb+n+ et place le - résultat dans \verb+N+. \\\hline + résultat dans \verb+N+. \\\hline \verb+\opceil{n}{T}{N}+ & - Place dans \verb+N+ la valeur approchée par excès de + Place dans \verb+N+ la valeur approchée par excès de \verb+n+ au rang \verb+T+. \\\hline \verb+\opcmp{n1}{n2}+ & - Compare les nombres \verb+n1+ et \verb+n2+ et réalise la - mise à jour correspondante des tests \verb+\ifopeq+, + Compare les nombres \verb+n1+ et \verb+n2+ et réalise la + mise à jour correspondante des tests \verb+\ifopeq+, \verb+\ifopneq+, \verb+\ifopgt+, \verb+\ifopge+, \verb+\ifople+ et \verb+\ifoplt+. \\\hline \verb+\opcopy{n}{N}+ & Copie le nombre \verb+n+ dans \verb+N+. \\\hline \verb+\opdecimal{n}{N}+ & - Copie la partie décimale (nombre entier positif) de \verb+n+ + Copie la partie décimale (nombre entier positif) de \verb+n+ dans \verb+N+. \\\hline \verb+\opdecimalwidth{n}{N}+ & - Le nombre \verb+N+ reçoit la largeur de la partie décimale du + Le nombre \verb+N+ reçoit la largeur de la partie décimale du nombre \verb+n+. \\\hline \verb+\opdisplay[P]{S}{n}+ & Affiche le nombre \verb+n+ avec le style \verb+S+ en - plaçant chaque chiffre dans une boîte de largeur + plaçant chaque chiffre dans une boîte de largeur \verb+\opcolumnwidth+ et de hauteur \verb+\oplineheight+. \\\hline \verb+\opdiv[P]{n1}{n2}+ & - Affiche le résultat de l'opération n1/n2. \\\hline + Affiche le résultat de l'opération n1/n2. \\\hline \verb+\opdiv*[P]{n1}{n2}{N1}{N2}+ & Calcule \verb+n1/n2+, place le quotient dans \verb+N1+ et le reste dans \verb+N2+. \\\hline \verb+\opdivperiod{T1}{T2}{N}+ & - Calcule la longueur de la période de la division de \verb+T1+ - par \verb+T2+ et place le résultat dans \verb+N+. \\\hline + Calcule la longueur de la période de la division de \verb+T1+ + par \verb+T2+ et place le résultat dans \verb+N+. \\\hline \verb+\opexport[P]{n}\cmd+ & Copie le nombre \verb+n+ dans la macro \verb+\cmd+. \\\hline \verb+\opexpr[P]{F}{N}+ & - \'Évalue la formule \texttt{F} est place le résultat final dans le + Évalue la formule \texttt{F} est place le résultat final dans le nombre \texttt{N}. \\\hline \verb+\opfloor{n}{T}{N}+ & - Place dans \verb+N+ la valeur approchée par défaut de + Place dans \verb+N+ la valeur approchée par défaut de \verb+n+ au rang \verb+T+. \\\hline \verb+\opgcd{T1}{T2}{N}+ & Calcule le pgcd de \verb+T1+ et \verb+T2+ et place le - résultat dans \verb+N+. \\\hline + résultat dans \verb+N+. \\\hline \verb+\opgetdecimaldigit{n}{T}{N}+ & - Construit le nombre \verb+N+ avec le seul chiffre situé en - \verb+T+ième position de la partie décimale du nombre + Construit le nombre \verb+N+ avec le seul chiffre situé en + \verb+T+ième position de la partie décimale du nombre \verb+n+. \\\hline \verb+\opgetdigit{n}{T}{N}+ & - Construit le nombre \verb+N+ avec le seul chiffre situé en - \verb+T+ième position du nombre \verb+n+. \\\hline + Construit le nombre \verb+N+ avec le seul chiffre situé en + \verb+T+ième position du nombre \verb+n+. \\\hline \verb+\opgetintegerdigit{n}{T}{N}+ & - Construit le nombre \verb+N+ avec le seul chiffre situé en - \verb+T+ième position de la partie entière du nombre + Construit le nombre \verb+N+ avec le seul chiffre situé en + \verb+T+ième position de la partie entière du nombre \verb+n+. \\\hline \verb+\opgfsqrt{n}+ & - Affiche la façon ancienne d'afficher le calcul de la racine - carrée de \verb+n+. \\\hline + Affiche la façon ancienne d'afficher le calcul de la racine + carrée de \verb+n+. \\\hline \verb+\ophline(T1,T2){T3}+ & - Trace un trait horizontal de longueur \verb+T3+, d'épaisseur - \verb+hrulewidth+ et débutant en \verb+(T1,T2)+ par - rapport au point de référence. \\\hline + Trace un trait horizontal de longueur \verb+T3+, d'épaisseur + \verb+hrulewidth+ et débutant en \verb+(T1,T2)+ par + rapport au point de référence. \\\hline \verb+\opidiv[P]{n1}{n2}+ & - Affiche le résultat de l'opération \verb+n1/n2+ (division - euclidienne, c'est-à-dire avec un quotient entier). \\\hline + Affiche le résultat de l'opération \verb+n1/n2+ (division + euclidienne, c'est-à-dire avec un quotient entier). \\\hline \verb+\opidiv*{n1}{n2}{N1}{N2}+ & Calcule \verb+n1/n2+ (division euclidienne), place le quotient (entier) dans \verb+N1+ et le reste (compris entre 0 inclus et \verb+|n2|+ exclu) dans \verb+N2+. \\\hline \verb+\opinteger{n}{N}+ & - Copie la partie entière (nombre entier positif) de \verb+n+ + Copie la partie entière (nombre entier positif) de \verb+n+ dans \verb+N+. \\\hline \verb+\opintegerwidth{n}{N}+ & - Le nombre \verb+N+ reçoit la longueur de la partie entière du + Le nombre \verb+N+ reçoit la longueur de la partie entière du nombre \verb+n+. \\\hline \verb+\oplput(T1,T2){}+ & - Place \verb++ à droite du point situé en - \verb+(T1,T2)+ par rapport au point de référence. \\\hline + Place \verb++ à droite du point situé en + \verb+(T1,T2)+ par rapport au point de référence. \\\hline + \verb+\opmanyadd[P]{n1}...{np}+ & + Affiche le résultat de l'opération + $\mathrm{n1}+\cdots+\mathrm{np}$. \\\hline \verb+\opmul[P]{n1}{n2}+ & - Affiche le résultat de l'opération \verb+n1*n2+. \\\hline + Affiche le résultat de l'opération \verb+n1*n2+. \\\hline \verb+\opmul*{n1}{n2}{N}+ & - Calcule \verb+n1*n2+ et place le résultat dans + Calcule \verb+n1*n2+ et place le résultat dans \verb+N+. \\\hline \verb+\opneg{n}{N}+ & - Le nombre \verb+N+ reçoit l'opposé de \verb+n+. \\\hline + Le nombre \verb+N+ reçoit l'opposé de \verb+n+. \\\hline \verb+\oppower{n}{T}{N}+ & - Calcule \verb+n+ à la puissance \verb+T+ et place le - résultat dans \verb+N+. \\\hline + Calcule \verb+n+ à la puissance \verb+T+ et place le + résultat dans \verb+N+. \\\hline \verb+\opprint{n}+ & - Affiche le nombre \verb+n+ de façon directe. \\\hline + Affiche le nombre \verb+n+ de façon directe. \\\hline \verb+\opround{n}{T}{N}+ & Place dans \verb+N+ la valeur arrondie de \verb+n+ au rang \verb+T+. \\\hline \verb+\oprput(T1,T2){}+ & - Place \verb++ à gauche du point situé en - \verb+(T1,T2)+ par rapport au point de référence. \\\hline + Place \verb++ à gauche du point situé en + \verb+(T1,T2)+ par rapport au point de référence. \\\hline \verb+\opset{L}+ & - Effectue une affectation globale des paramètres de \package{xlop} - désignés dans la liste \verb+L+. \\\hline + Effectue une affectation globale des paramètres de \package{xlop} + désignés dans la liste \verb+L+. \\\hline \verb+\opsetdecimaldigit{n}{T}{N}+ & - Modifie le \verb+T+ième chiffre de la partie décimale de - \verb+N+ pour qu'il soit égal à \verb+n+. \\\hline + Modifie le \verb+T+ième chiffre de la partie décimale de + \verb+N+ pour qu'il soit égal à \verb+n+. \\\hline \verb+\opsetdigit{n}{T}{N}+ & - Modifie le \verb+T+ième chiffre de \verb+N+ pour qu'il - soit égal à \verb+n+. \\\hline + Modifie le \verb+T+ième chiffre de \verb+N+ pour qu'il + soit égal à \verb+n+. \\\hline \verb+\opsetintegerdigit{n}{T}{N}+ & - Modifie le \verb+T+ième chiffre de la partie entière de - \verb+N+ pour qu'il soit égal à \verb+n+. \\\hline + Modifie le \verb+T+ième chiffre de la partie entière de + \verb+N+ pour qu'il soit égal à \verb+n+. \\\hline \verb+\opsqrt{n}{N}+ & - Mémorise la racine carrée de \verb+n+ dans \verb+N+. \\\hline + Mémorise la racine carrée de \verb+n+ dans \verb+N+. \\\hline \verb+\opsub[P]{n1}{n2}+ & - Affiche le résultat de l'opération n1-n2. \\\hline + Affiche le résultat de l'opération n1-n2. \\\hline \verb+\opsub*{n1}{n2}{N}+ & - Calcule n1-n2 et place le résultat dans N. \\\hline + Calcule n1-n2 et place le résultat dans N. \\\hline \verb+\opunzero{N}+ & - Supprime les zéros non significatifs du nombre \verb+N+. \\\hline + Supprime les zéros non significatifs du nombre \verb+N+. \\\hline \verb+\opvline(T1,T2){T3}+ & - Trace un trait vertical de longueur \verb+T3+, d'épaisseur - \verb+hrulewidth+ et débutant en \verb+(T1,T2)+ par - rapport au point de référence. \\\hline + Trace un trait vertical de longueur \verb+T3+, d'épaisseur + \verb+hrulewidth+ et débutant en \verb+(T1,T2)+ par + rapport au point de référence. \\\hline \verb+\opwidth{n}{N}+ & - Le nombre \verb+N+ reçoit le nombre de chiffres du nombre + Le nombre \verb+N+ reçoit le nombre de chiffres du nombre \verb+n+. \\\hline \end{longtable}\index{macros!table des|)} -Dans ce tableau, les paramètres : +Dans ce tableau, les paramètres : \begin{itemize} -\item \texttt{n} et \texttt{ni} (où \texttt{i} représente un indice) - indiquent que le paramètre doit être un nombre donné sous forme - décimale ou sous forme d'un nom de variable ; -\item \texttt{N} et \texttt{Ni} (où \texttt{i} représente un indice) - indiquent que le paramètre doit être un nombre donné sous forme d'un +\item \texttt{n} et \texttt{ni} (où \texttt{i} représente un indice) + indiquent que le paramètre doit être un nombre donné sous forme + décimale ou sous forme d'un nom de variable ; +\item \texttt{N} et \texttt{Ni} (où \texttt{i} représente un indice) + indiquent que le paramètre doit être un nombre donné sous forme d'un nom de variable ; -\item \texttt{[P]} indique que la macro accepte un paramètre optionnel - permettant de modifier les paramètres de \package{xlop} ; -\item \texttt{T} et \texttt{Ti} (où \texttt{i} représente un indice) - indiquent que le paramètre doit être un nombre donné sous forme - décimale ou sous forme d'un nom de variable mais ne devant pas - excéder la taille des nombres directement acceptables par \TeX{} +\item \texttt{[P]} indique que la macro accepte un paramètre optionnel + permettant de modifier les paramètres de \package{xlop} ; +\item \texttt{T} et \texttt{Ti} (où \texttt{i} représente un indice) + indiquent que le paramètre doit être un nombre donné sous forme + décimale ou sous forme d'un nom de variable mais ne devant pas + excéder la taille des nombres directement acceptables par \TeX{} ($-2147483648 \le \mathtt{T} \le 2147483647$ en l'occurrence). \end{itemize} \newpage -\section{Liste des paramètres} +\section{Liste des paramètres} \label{sec:Liste des parametres} -\index{parametres@paramètres!table des|(}% +\index{parametres@paramètres!table des|(}% \begingroup \advance\hoffset by-1.75cm \advance\linewidth by1.75cm \begin{longtable}{|l|l|p{7cm}|} \hline - \multicolumn{1}{|c|}{\textbf{Paramètre}} & - \multicolumn{1}{c|}{\textbf{Défaut}} & + \multicolumn{1}{|c|}{\textbf{Paramètre}} & + \multicolumn{1}{c|}{\textbf{Défaut}} & \multicolumn{1}{c|}{\textbf{Signification}} \\\hline\hline \endfirsthead \hline - \multicolumn{1}{|c|}{\textbf{Paramètre}} & - \multicolumn{1}{c|}{\textbf{Défaut}} & + \multicolumn{1}{|c|}{\textbf{Paramètre}} & + \multicolumn{1}{c|}{\textbf{Défaut}} & \multicolumn{1}{c|}{\textbf{Signification}} \\\hline\hline \endhead \hline - \multicolumn{3}{|c|}{$\ldots$ à suivre $\ldots$}\\ + \multicolumn{3}{|c|}{$\ldots$ à suivre $\ldots$}\\ \hline \endfoot \hline \endlastfoot \verb+afterperiodsymbol+ & \verb+$\ldots$+ & - Symbole utilisé à la suite de la période d'une division. \\\hline + Symbole utilisé à la suite de la période d'une division. \\\hline \verb+approxsymbol+ & \verb+$\approx$+ & - Symbole utilisé comme relation d'égalité approximative dans les - opérations en ligne. \\\hline + Symbole utilisé comme relation d'égalité approximative dans les + opérations en ligne. \\\hline \verb+equalsymbol+ & \verb+{$=$}+ & - Symbole utilisé comme relation d'égalité dans les opérations en + Symbole utilisé comme relation d'égalité dans les opérations en ligne. \\\hline \verb+addsymbol+ & \verb-$+$- & - Symbole utilisé comme opérateur d'addition. \\\hline + Symbole utilisé comme opérateur d'addition. \\\hline \verb+subsymbol+ & \verb+$-$+ & - Symbole utilisé comme opérateur de soustraction. \\\hline + Symbole utilisé comme opérateur de soustraction. \\\hline \verb+mulsymbol+ & \verb+$\times$+ & - Symbole utilisé comme opérateur de multiplication. \\\hline + Symbole utilisé comme opérateur de multiplication. \\\hline \verb+divsymbol+ & \verb+$\div$+ & - Symbole utilisé comme opérateur de division pour les opérations en + Symbole utilisé comme opérateur de division pour les opérations en ligne. \\\hline \verb+decimalsepsymbol+ & \verb+.+ & - Symbole utilisé comme séparateur décimal. \\\hline + Symbole utilisé comme séparateur décimal. \\\hline \verb+strikedecimalsepsymbol+ & & - Symbole utilisé pour un séparateur décimal déplacé au niveau du - dividende et du diviseur dans les divisions posées. \\\hline + Symbole utilisé pour un séparateur décimal déplacé au niveau du + dividende et du diviseur dans les divisions posées. \\\hline \verb+shiftintermediarysymbol+ & \verb+$\cdot$+ & - Symbole utilisé pour montrer les décalages des nombres - intermédiaires dans les multiplications posées. \\\hline + Symbole utilisé pour montrer les décalages des nombres + intermédiaires dans les multiplications posées. \\\hline \verb+displayshiftintermediary+ & \verb+shift+ & - Indique que le caractère de décalage dans les multiplications sera - affiché uniquement pour le décalage supplémentaire (valeur - \verb+shift+), pour tous les décalages (valeur \verb+all+) + Indique que le caractère de décalage dans les multiplications sera + affiché uniquement pour le décalage supplémentaire (valeur + \verb+shift+), pour tous les décalages (valeur \verb+all+) ou jamais (valeur \verb+none+). \\\hline + \verb+vmanyoperator+ & + \verb+center+ & + Positionnement vertical des opérateurs. La valeur \verb+top+ place + les opérateurs en face des opérandes, de la première opérande + jusqu'à l'avant-dernière. La valeur \verb+center+ place les + opérateurs entre les opérandes. La valeur \verb+bottom+ place les + opérateurs en face des opérandes, de la deuxième opérande jusqu'à la + dernière. La valeur \verb+Top+ place un unique opérateur au niveau + de la première opérande. La valeur \verb+\center+ place un unique + opérateur au milieu vertical des opérandes. La valeur + \verb+Bottom+ place un unique opérateur au niveau de la dernière + opérande. \\\hline \verb+voperation+ & \verb+bottom+ & - Type d'alignement vertical d'une opération posée. La - valeur \verb+bottom+ indique que le bas de l'opération sera + Type d'alignement vertical d'une opération posée. La + valeur \verb+bottom+ indique que le bas de l'opération sera au niveau de la ligne de base. La valeur \verb+top+ indique - que la première ligne de l'opération sera sur la ligne de base. La - valeur \verb+center+ indique que l'opération sera centrée + que la première ligne de l'opération sera sur la ligne de base. La + valeur \verb+center+ indique que l'opération sera centrée verticalement sur la ligne de base. \\\hline \verb+voperator+ & \verb+center+ & - Positionnement vertical de l'opérateur dans les - opérations posées. La valeur \verb+top+ place l'opérateur au - niveau de la première opérande. La valeur \verb+bottom+ place - l'opérateur au niveau de la seconde opérande. La valeur - \verb+center+ place l'opérateur entre les deux - opérandes. \\\hline + Positionnement vertical de l'opérateur dans les + opérations posées. La valeur \verb+top+ place l'opérateur au + niveau de la première opérande. La valeur \verb+bottom+ place + l'opérateur au niveau de la seconde opérande. La valeur + \verb+center+ place l'opérateur entre les deux + opérandes. \\\hline \verb+hfactor+ & \verb+decimal+ & - Type d'alignement des opérandes dans les - multiplications posées. La valeur \verb+decimal+ indique un + Type d'alignement des opérandes dans les + multiplications posées. La valeur \verb+decimal+ indique un alignement sur la virgule. La valeur \verb+right+ indique une - composition au fer à droite. \\\hline + composition au fer à droite. \\\hline \verb+vruleperiod+ & \verb+-0.2+ & - Position verticale du trait indiquant la période du quotient + Position verticale du trait indiquant la période du quotient dans les divisions en ligne. \\\hline \verb+dividendbridge+ & \verb+false+ & - Indique si le \og pont \fg{} au-dessus du dividende est présent ou + Indique si le \og pont \fg{} au-dessus du dividende est présent ou non. \\\hline \verb+shiftdecimalsep+ & \verb+both+ & - Indique la façon dont se fait le décalage de virgule au niveau des - opérandes d'une division posée. La valeur \verb+both+ indique - que le décalage doit rendre le diviseur et le dividende - entiers. La valeur \verb+divisor+ indique que le décalage + Indique la façon dont se fait le décalage de virgule au niveau des + opérandes d'une division posée. La valeur \verb+both+ indique + que le décalage doit rendre le diviseur et le dividende + entiers. La valeur \verb+divisor+ indique que le décalage doit rendre le diviseur entier. La valeur \verb+none+ indique - qu'il n'y aura aucun décalage. \\\hline + qu'il n'y aura aucun décalage. \\\hline \verb+maxdivstep+ & \verb+10+ & - Nombre d'étapes maximum d'une division. \\\hline + Nombre d'étapes maximum d'une division. \\\hline \verb+safedivstep+ & \verb+50+ & - Nombre d'étapes maximum d'une division lors d'un arrêt sur - période. \\\hline + Nombre d'étapes maximum d'une division lors d'un arrêt sur + période. \\\hline \verb+period+ & \verb+false+ & - Indique si la division doit s'arrêter sur une détection de période + Indique si la division doit s'arrêter sur une détection de période ou non. \\\hline \verb+deletezero+ & \verb+true+ & Indique si on affiche (\verb+false+) ou on supprime - (\verb+true+) les zéros non significatifs. \\\hline + (\verb+true+) les zéros non significatifs. \\\hline \verb+carryadd+ & \verb+true+ & - Indique si les retenues doivent être affichées pour les additions - posées. \\\hline + Indique si les retenues doivent être affichées pour les additions + posées. \\\hline \verb+carrysub+ & \verb+false+ & - Indique si les retenues doivent être affichées pour les - soustractions posées. \\\hline + Indique si les retenues doivent être affichées pour les + soustractions posées. \\\hline \verb+offsetcarry+ & \verb+-0.35+ & - Décalage horizontal pour les retenues dans les - soustractions posées. \\\hline + Décalage horizontal pour les retenues dans les + soustractions posées. \\\hline \verb+style+ & \verb+display+ & - Indique si l'opération doit être en ligne (\verb+text+) ou - posée (\verb+display+). \\\hline + Indique si l'opération doit être en ligne (\verb+text+) ou + posée (\verb+display+). \\\hline \verb+displayintermediary+ & \verb+nonzero+ & - Indique si les résultats intermédiaires doivent être affichés + Indique si les résultats intermédiaires doivent être affichés (\verb+all+) ou seulement les non nuls (\verb+nonzero+) ou aucun (valeur \verb+none+) dans les multiplications et les divisions. \\\hline \verb+lastcarry+ & \verb+false+ & Indique si la retenue au niveau d'une absence de chiffre devra - être affichée ou non. \\\hline + être affichée ou non. \\\hline \verb+parenthesisnegative+ & \verb+none+ & - Comportement à adopter pour l'affichage des nombres - négatifs dans les opérations en lignes. La valeur \verb+none+ - les affiche sans parenthèse, \verb+all+ les mettra - systématiquement les nombres négatifs entre parenthèses et - \verb+last+ les mettra entre parenthèses - sauf pour la première valeur d'une expression. \\\hline + Comportement à adopter pour l'affichage des nombres + négatifs dans les opérations en lignes. La valeur \verb+none+ + les affiche sans parenthèse, \verb+all+ les mettra + systématiquement les nombres négatifs entre parenthèses et + \verb+last+ les mettra entre parenthèses + sauf pour la première valeur d'une expression. \\\hline \verb+columnwidth+ & \verb+2ex+ & - Largeur des boîtes contenant un chiffre. \\\hline + Largeur des boîtes contenant un chiffre. \\\hline \verb+lineheight+ & \verb+\baselineskip+ & - Hauteur des boîtes contenant un chiffre. \\\hline + Hauteur des boîtes contenant un chiffre. \\\hline \verb+decimalsepwidth+ & \verb+0pt+ & - Largeur de la boîte contenant le séparateur décimal. \\\hline + Largeur de la boîte contenant le séparateur décimal. \\\hline \verb+decimalsepoffset+ & \verb+0pt+ & - Décalage horizontal du séparateur décimal. \\\hline + Décalage horizontal du séparateur décimal. \\\hline \verb+hrulewidth+ & \verb+0.4pt+ & - \'Épaisseur des lignes horizontales. \\\hline + Épaisseur des lignes horizontales. \\\hline \verb+vrulewidth+ & \verb+0.4pt+ & - \'Épaisseur des lignes verticales. \\\hline + Épaisseur des lignes verticales. \\\hline \verb+behaviorsub+ & \verb+silent+ & - Comportement de \package{xlop} face à une - soustraction \og impossible \fg{}, c'est-à-dire une soustraction - ayant ses deux opérandes positives avec une seconde opérande - strictement supérieure à la première. La valeur \verb+silent+ - effectuera l'opération en permutant les opérandes de façon - silencieuse. La valeur \verb+warning+ fera de même mais en - émettant un message d'avertissement. Enfin, la valeur - \verb+error+ affichera un message d'erreur et l'opération ne - sera pas effectuée. \\\hline + Comportement de \package{xlop} face à une + soustraction \og impossible \fg{}, c'est-à-dire une soustraction + ayant ses deux opérandes positives avec une seconde opérande + strictement supérieure à la première. La valeur \verb+silent+ + effectuera l'opération en permutant les opérandes de façon + silencieuse. La valeur \verb+warning+ fera de même mais en + émettant un message d'avertissement. Enfin, la valeur + \verb+error+ affichera un message d'erreur et l'opération ne + sera pas effectuée. \\\hline \verb+country+ & \verb+french+ & - Indique le comportement des opérations posées en fonction du - pays. L'extension prévoit pour l'instant \verb+french+, - \verb+american+ et \verb+russian+ mais les différentes - façons de présenter les opérations ne sont pas implantées dans la + Indique le comportement des opérations posées en fonction du + pays. L'extension prévoit pour l'instant \verb+french+, + \verb+american+ et \verb+russian+ mais les différentes + façons de présenter les opérations ne sont pas implantées dans la version 0.2. \\\hline \verb+operandstyle+ & & - Style utilisé pour les opérandes. \\\hline + Style utilisé pour les opérandes. \\\hline \verb+resultstyle+ & & - Style utilisé pour les résultats. \\\hline + Style utilisé pour les résultats. \\\hline \verb+remainderstyle+ & & - Style utilisé pour les restes. \\\hline + Style utilisé pour les restes. \\\hline \verb+intermediarystyle+ & & - Style utilisé pour les résultats intermédiaires (nombres - intermédiaires dans une multiplication et nombres à soustraire - dans une division où apparaissent les soustractions + Style utilisé pour les résultats intermédiaires (nombres + intermédiaires dans une multiplication et nombres à soustraire + dans une division où apparaissent les soustractions successives). \\\hline \verb+carrystyle+ & \verb+\scriptsize+ & - Style utilisé pour les retenues. La valeur par défaut lorsqu'on ne + Style utilisé pour les retenues. La valeur par défaut lorsqu'on ne compile pas sous \LaTeX{} est \verb+\sevenrm+. \\\hline -\end{longtable}\index{parametres@paramètres!table des|)} +\end{longtable}\index{parametres@paramètres!table des|)} \newpage\endgroup \chapter{Trucs et astuces} \label{chap:Trucs et astuces} -\section{Comparaison avec \package{calc} et \package{fp}} +\section{Comparaison avec \package{calc} et \package{xfp}} On pourrait croire que \package{xlop} puisse remplacer avantageusement des extensions telles que \package{calc}\index{extension!calc}\index{calc} et -\package{fp}\index{extension!fp}\index{fp}. En réalité, c'est un peu -plus compliqué que cela. Bien sûr, \package{xlop} permet des calculs -complexes et sur des nombres comportant un nombre arbitraire de -chiffres mais, contrairement à \package{calc}, il ne permet pas de -gérer directement les unités. La comparaison avec \package{fp} est un -peu plus réaliste mais il ne faut pas perdre de vue que \package{xlop} -peut devenir gourmand en mémoire et en temps de calcul. - -Si vous voulez vraiment réaliser des calculs sur des +\package{xfp}\index{extension!xfp}\index{xfp}. En réalité, c'est un +peu plus compliqué que cela. Bien sûr, \package{xlop} permet des +calculs complexes et sur des nombres comportant un nombre arbitraire +de chiffres mais, contrairement à \package{calc}, il ne permet pas de +gérer directement les unités. La comparaison avec \package{xfp} est un +peu plus réaliste mais il ne faut pas perdre de vue que \package{xlop} +peut devenir gourmand en mémoire et en temps de calcul. En réalité, +\package{xfp} est bien plus efficace que \package{xlop} en ce qui +concerne les calculs purs. + +Si vous voulez vraiment réaliser des calculs sur des longueurs\index{longueur}, vous pouvez toujours utiliser le fait -qu'une affectation d'un registre de longueur à un compteur donnera un -nombre correspondant à cette longueur avec l'unité \texttt{sp}. +qu'une affectation d'un registre de longueur à un compteur donnera un +nombre correspondant à cette longueur avec l'unité \texttt{sp}. \begin{CenterExample}[xrightmargin=0pt] \newcommand\getsize[2]{% \dimen0=#1\relax @@ -2104,9 +2237,9 @@ nombre correspondant \getsize{1sp}{r}$1\,\mathrm{sp}=\opprint{r}\,\mathrm{sp}$\quad \end{CenterExample} N'oubliez cependant pas que le but principal de \package{xlop} est -d'\emph{afficher} automatiquement les opérations. +d'\emph{afficher} automatiquement les opérations. -Muni de la macro \macro{getsize}, il est possible de réaliser des +Muni de la macro \macro{getsize}, il est possible de réaliser des calculs sur des longueurs. \newcommand\getsize[2]{% \dimen0=#1\relax @@ -2133,14 +2266,14 @@ calculs sur des longueurs. \opprint{S}\,$\mathrm{cm}^2$ \end{Verbatim} -\section{Création d'opérations complexes} +\section{Création d'opérations complexes} \label{sec:Creation d'operations complexes} -L'utilisation des macros de \package{xlop} associées au mécanisme de -boucle de \TeX{} permet de créer des opérations à volonté. Nous ne -donnerons que deux exemples. Le premier est la décomposition d'un -nombre en facteurs premiers, le second est un calcul général de +L'utilisation des macros de \package{xlop} associées au mécanisme de +boucle de \TeX{} permet de créer des opérations à volonté. Nous ne +donnerons que deux exemples. Le premier est la décomposition d'un +nombre en facteurs premiers, le second est un calcul général de fraction continue.\index{nombre!premier}\index{boucle|(}% -\index{decomposition@décomposition en nombres premiers} +\index{decomposition@décomposition en nombres premiers} \begin{Verbatim}[xrightmargin=0pt] \newcount\primeindex \newcount\tryindex @@ -2230,7 +2363,7 @@ fraction continue.\index{nombre!premier}\index{boucle|(}% \endgroup } -Avec ce code, on dispose d'un moyen de créer une liste de nombres +Avec ce code, on dispose d'un moyen de créer une liste de nombres premiers (en l'occurrence les 20~premiers). \begin{SideBySideExample} \getprime{20}% @@ -2238,18 +2371,18 @@ premiers (en l'occurrence les 20~premiers). \opprint{P9}, \ldots \opprint{P19}. \end{SideBySideExample} -On notera toutefois que ce code est très mauvais, il est excessivement -lent et n'apporte rien par rapport à une approche directe avec des -nombres manipulés par les opérations natives de \TeX{}. Ce n'est -qu'un exemple pédagogique. On notera également l'astuce permettant -d'emboîter deux boucles avec la macro \verb+\testprimality+ -entièrement mise dans un groupe : s'il est nécessaire de rendre les +On notera toutefois que ce code est très mauvais, il est excessivement +lent et n'apporte rien par rapport à une approche directe avec des +nombres manipulés par les opérations natives de \TeX{}. Ce n'est +qu'un exemple pédagogique. On notera également l'astuce permettant +d'emboîter deux boucles avec la macro \verb+\testprimality+ +entièrement mise dans un groupe : s'il est nécessaire de rendre les affectations \verb+\primetrue+ et \verb+\primefalse+ globales, les -opérations de \package{xlop} rendent leurs résultats globaux +opérations de \package{xlop} rendent leurs résultats globaux directement.\index{affectation globale}% Une fois que vous avez votre \og table \fg{} de nombres premiers, vous -pouvez vous en servir pour décomposer un nombre en facteurs +pouvez vous en servir pour décomposer un nombre en facteurs premiers. \begin{CenterExample}[xrightmargin=0pt] \newcommand\primedecomp[2][nil]{% @@ -2308,28 +2441,28 @@ premiers. intermediarystyle.2=\red]{252} \end{CenterExample} Dans ce code, on notera l'emploi d'un groupe entourant l'ensemble de -la macro pour protéger les modifications de paramètres de -\package{xlop}.\index{parametre@paramètre!modifications locales} -\`A ce propos, on notera également qu'un paramètre vide n'est pas -accepté. C'est tout à fait volontaire, l'auteur de l'extension pensant -qu'un utilisateur tapant des crochets sans rien mettre à l'intérieur -est sans doute en train de commettre une erreur. Pour pallier à cette -impossibilité de transmettre un paramètre vide -\index{parametre@paramètre!vide}% -il existe le paramètre particulier \parameter{nil} qui a exactement ce -rôle. +la macro pour protéger les modifications de paramètres de +\package{xlop}.\index{parametre@paramètre!modifications locales} +\`A ce propos, on notera également qu'un paramètre vide n'est pas +accepté. C'est tout à fait volontaire, l'auteur de l'extension pensant +qu'un utilisateur tapant des crochets sans rien mettre à l'intérieur +est sans doute en train de commettre une erreur. Pour pallier à cette +impossibilité de transmettre un paramètre vide +\index{parametre@paramètre!vide}% +il existe le paramètre particulier \parameter{nil} qui a exactement ce +rôle. \index{boucle|)} On notera enfin l'astuce \verb+{\setbox2=\box2}+ qui permet -d'obtenir un registre de boîte vide et les manipulations finales -permettant de représenter la barre verticale de façon lisible. +d'obtenir un registre de boîte vide et les manipulations finales +permettant de représenter la barre verticale de façon lisible. Le second exemple permet de calculer une fraction continue du type : \def\dfrac#1#2{\frac{\displaystyle #1}{\displaystyle #2}} \[a_0+\dfrac{1}{a_1+\dfrac{1}{a_2+\dfrac{1}{a_3+\cdots}}}\] -en donnant la suite $a_0,a_1,a_2,a_3,\ldots$ à la macro. L'exemple +en donnant la suite $a_0,a_1,a_2,a_3,\ldots$ à la macro. L'exemple donne les fractions correspondant au nombre d'or et aux racines -carrées de~2 et~3. +carrées de~2 et~3. \makeatletter \begin{CenterExample}[xrightmargin=0pt] \begingroup @@ -2361,33 +2494,33 @@ carr \continuedfraction{1,1,2,1,2,1,2,1,2,1,2,1}{r}\opprint{r} \end{CenterExample} \makeatother -Une fois n'est pas coutume, nous avons fait appel à des commandes -\LaTeX{} pour effectuer une boucle. Ce manuel étant composé en -français, le caractère \og \texttt{\string:} \fg{} est actif ce qui -empêche la macro \verb+\@for+ de fonctionner correctement d'où le -groupe où ce caractère reçoit un code de catégorie adéquat. +Une fois n'est pas coutume, nous avons fait appel à des commandes +\LaTeX{} pour effectuer une boucle. Ce manuel étant composé en +français, le caractère \og \texttt{\string:} \fg{} est actif ce qui +empêche la macro \verb+\@for+ de fonctionner correctement d'où le +groupe où ce caractère reçoit un code de catégorie adéquat. -\section{Accès direct aux nombres} +\section{Accès direct aux nombres} \label{sec:Acces direct aux nombres} -Lorsqu'on récupère un nombre dans une variable, on peut le traiter de -multiples façons à l'aide des macros de \package{xlop}. Toutefois, +Lorsqu'on récupère un nombre dans une variable, on peut le traiter de +multiples façons à l'aide des macros de \package{xlop}. Toutefois, dans certaines situations, on peut souhaiter construire ses propres macros ou utiliser des macros externes en passant un tel nombre en -paramètre. +paramètre. -Passer directement \verb+\opprint{var}+ est inopérant car cette macro +Passer directement \verb+\opprint{var}+ est inopérant car cette macro est suffisamment complexe pour induire des effets de bord dans ce -genre de situations. Il devient alors nécessaire d'accéder directement -à ce nombre. Lorsqu'un nombre est mémorisé dans une variable -\verb+var+, \package{xlop} crée une macro +genre de situations. Il devient alors nécessaire d'accéder directement +à ce nombre. Lorsqu'un nombre est mémorisé dans une variable +\verb+var+, \package{xlop} crée une macro \texttt{$\backslash$Op@var}\index{Opvar@\texttt{\boi {Op\at var}}} qui contient ce nombre. On notera le \og O \fg{} majuscule et le \og p \fg{} -minuscule. L'arrobas est là pour rendre cette définition privée -c'est-à-dire qu'il faut faire un effort pour y accéder avec +minuscule. L'arrobas est là pour rendre cette définition privée +c'est-à-dire qu'il faut faire un effort pour y accéder avec l'utilisation des macros \macro{makeatletter} et \macro{makeatother} -de \LaTeX{} ou bien en indiquant un code de catégorie égal à~11 -(lettre) pour ce caractère lorsqu'on travaille sous \TeX{}. +de \LaTeX{} ou bien en indiquant un code de catégorie égal à~11 +(lettre) pour ce caractère lorsqu'on travaille sous \TeX{}. \begin{SideBySideExample} \opcopy{1234}{a}\opcopy{56}{b}% \opmul*{a}{b}{r}% @@ -2397,66 +2530,64 @@ de \LaTeX{} ou bien en indiquant un code de cat \makeatother \end{SideBySideExample} -On notera que cette façon de faire ne fonctionne plus forcément -lorsque le séparateur décimal est entre accolade car la macro +On notera que cette façon de faire ne fonctionne plus forcément +lorsque le séparateur décimal est entre accolade car la macro \verb+\opprint{var}+ contiendra ces accolades. Dans ce cas, le plus -simple est de passer par la macro \macro{opexport} décrite à la +simple est de passer par la macro \macro{opexport} décrite à la page~\pageref{macro-opexport}. \chapter{Versions futures} \label{chap:Versions futures} -L'extension \package{xlop} en est à sa version~\fileversion{} qui -n'est qu'une version déboguée de la version~0.2 qui est elle même -essentiellement une version corrigée de la version~0.1 (première +L'extension \package{xlop} en est à sa version~\fileversion{} qui +n'est qu'une version déboguée de la version~0.2 qui est elle même +essentiellement une version corrigée de la version~0.1 (première version publique). La prochaine version sera la~0.3 dont la version \og stable \fg{} sera alors la version~0.4. -L'ensemble des spécificités de la version 0.3 n'est pas totalement -arrêté mais il y a déjà plusieurs points prévus : +L'ensemble des spécificités de la version 0.3 n'est pas totalement +arrêté mais il y a déjà plusieurs points prévus : \begin{itemize} -\item gestion internationale des opérations posées ; -\item opérations en base 2 à 36 ; +\item gestion internationale des opérations posées ; +\item opérations en base 2 à 36 ; \item ajout de fonctions de haut niveau avec les racines (\macro{oproot} pour les racines quelconques et \macro{opsqrt} pour - la racine carrée), exponentielle, logarithme, fonctions - trigonométriques (directes, inverses, hyperboliques) en passant par - l'extension \package{xfp} qui est une version déboguée (par + la racine carrée), exponentielle, logarithme, fonctions + trigonométriques (directes, inverses, hyperboliques) en passant par + l'extension \package{xfp} qui est une version déboguée (par l'auteur) de l'extension \package{fp} ; -\item ajout d'une macro permettant de réaliser une écriture formatée, - c'est-à-dire une écriture d'un nombre où les longueurs des parties - entière et décimale seront indiquées (si ces longueurs ne sont pas - celles du nombre, il y aura un débordement ou un remplissage) ; +\item ajout d'une macro permettant de réaliser une écriture formatée, + c'est-à-dire une écriture d'un nombre où les longueurs des parties + entière et décimale seront indiquées (si ces longueurs ne sont pas + celles du nombre, il y aura un débordement ou un remplissage) ; cette macro existait dans la version~0.1 et permettait essentiellement d'afficher des nombres avec un alignement sur la - virgule, au fer à droite ou au fer à gauche ; -\item ajout d'une macro permettant les additions à plus de deux - opérandes ; -\item ajout d'un paramètre permettant l'écriture scientifique ou - ingénieur ; -\item possibilité d'écrire un nombre sur plusieurs lignes et/ou en - utilisant un séparateur des milliers ; + virgule, au fer à droite ou au fer à gauche ; +\item ajout d'un paramètre permettant l'écriture scientifique ou + ingénieur ; +\item possibilité d'écrire un nombre sur plusieurs lignes et/ou en + utilisant un séparateur des milliers ; \item retenues dans les multiplications ; \item rendre publics les restes successives d'une division ; -\item les valeurs négatives de \parameter{maxdivstep} et - \parameter{safedivstep} réaliseront un comptage sur les chiffres - décimaux du quotient ; +\item les valeurs négatives de \parameter{maxdivstep} et + \parameter{safedivstep} réaliseront un comptage sur les chiffres + décimaux du quotient ; \item manuel en anglais. \end{itemize} Pour toute demande ou rapport de bogue, l'auteur vous sera -éternellement reconnaissant de le contacter à l'adresse : +éternellement reconnaissant de le contacter à l'adresse : \begin{verbatim} Jean-Come.Charpentier@wanadoo.fr \end{verbatim} -en plaçant le mot \og \texttt{xlop} \fg{} dans le sujet du message. +en plaçant le mot \og \texttt{xlop} \fg{} dans le sujet du message. Il serait souhaitable d'avoir un manuel du hacker qui expliquerait en -détail le code source. Cet outil pourrait être tout à fait bénéfique -pour que chacun puisse apporter plus facilement des améliorations au +détail le code source. Cet outil pourrait être tout à fait bénéfique +pour que chacun puisse apporter plus facilement des améliorations au code. Malheureusement, le code actuel fait plus de~\nombre{4000} -lignes et le travail nécessaire risque d'être trop important. -Éventuellement, il pourra y avoir un manuel du hacker expliquant les -spécifications générales du code sans entrer dans trop de détails +lignes et le travail nécessaire risque d'être trop important. +Éventuellement, il pourra y avoir un manuel du hacker expliquant les +spécifications générales du code sans entrer dans trop de détails techniques. %\printindex diff --git a/Master/texmf-dist/doc/generic/xlop/xlop-doc.pdf b/Master/texmf-dist/doc/generic/xlop/xlop-doc.pdf index 1910db999ae..e0b0a4b6990 100644 Binary files a/Master/texmf-dist/doc/generic/xlop/xlop-doc.pdf and b/Master/texmf-dist/doc/generic/xlop/xlop-doc.pdf differ diff --git a/Master/texmf-dist/doc/generic/xlop/xlop-doc.tex b/Master/texmf-dist/doc/generic/xlop/xlop-doc.tex index fb623b21d04..26581f844c8 100644 --- a/Master/texmf-dist/doc/generic/xlop/xlop-doc.tex +++ b/Master/texmf-dist/doc/generic/xlop/xlop-doc.tex @@ -1,16 +1,62 @@ \documentclass[12pt]{report} -\usepackage{manual} +\usepackage[T1]{fontenc} +\usepackage[utf8]{inputenc} +\usepackage{fourier} +\usepackage[scaled]{helvet} +\usepackage[scaled]{luximono} +\usepackage{makeidx} +\usepackage{longtable} +\usepackage{multicol} +\usepackage{pst-node} +\usepackage{fancyvrb-ex} +\usepackage{geometry} +\usepackage{xlop} \usepackage[english]{babel} \usepackage[autolanguage]{numprint} \usepackage{dcolumn} +\usepackage{hyperref} +\usepackage{microtype} + +\fvset{label=source}% english \newcommand*\boi{\textbackslash} \newcommand*\at{@} -\fvset{label=source}% english -\renewcommand\parameter[1]{\texttt{#1}\index{#1@\texttt{#1}}% +\fvset{xrightmargin=5cm,frame=single,fontsize=\small} +\geometry{a4paper,left=4cm,right=4cm,top=3cm,bottom=3cm,nohead} + +\let\SBSori\SideBySideExample +\def\SideBySideExample{% + \par\bigbreak\SBSori +} +\let\endSBSori\endSideBySideExample +\def\endSideBySideExample{% + \endSBSori + \par\bigskip\noindent +} + +\newenvironment{syntaxBNF}{% + \catcode`\_=12 + \def\*##1*{$\langle$##1$\rangle$}% + \def\alt{\unskip~$|$~\ignorespaces}% + \def\sameline{\multicolumn{1}{c}{} & \null\quad}% + \ttfamily + \begin{center}\begin{tabular}{r@{\quad:=\quad}l}} +{\end{tabular}\end{center}} + +\setlongtables +\newcommand\package[1]{\textsf{#1}} +\newcommand\file[1]{\texttt{#1}} + +\newcommand\macro[1]{\texttt{$\backslash$#1}\index{#1@\texttt{\boi {#1}}}} +\newcommand\parameter[1]{\texttt{#1}\index{#1@\texttt{#1}}% \index{parameter!\texttt{#1}}} +\newcommand\bull{\vrule width3pt height4pt depth-1pt} + +\newcounter{stuff} +\makeindex + \begin{document} \begin{titlepage} \null\par\vfill @@ -32,7 +78,7 @@ \end{center} \vfill \begin{center} - Jean-Côme Charpentier\\ + Jean-Côme Charpentier\\ \today \end{center} \vfill\null\par @@ -44,9 +90,9 @@ \pagenumbering{arabic} \chapter{Overview} -\label{chap:Présentation} +\label{chap:Présentation} The \package{xlop} package is intended to make automatic arithmetic -operation on arbitrary sized numbers and to display result either on +operations on arbitrary sized numbers and to display result either on display mode or inline mode. Here is a first exemple for an overview of the syntax: \begin{SideBySideExample} @@ -156,13 +202,13 @@ you can compute complex expression in infix form: \chapter{\package{xlop} Instructions} Except some macros which will be examined later, the \package{xlop}'s -macros can have an optional argument between squared braces in order -to localy modify parameter's values. The other arguments (mandatory) +macros can have an optional argument between brackets in order +to localy modify parameter's values. The other (mandatory) arguments are (nearly) always numbers. The two sections of this chapter describe in details what is a number for \package{xlop} and how use parameters. \section{In the Beginning Was the Number} -\label{sec:Au début etait le nombre} +\label{sec:Au début etait le nombre} \subsection{Size} \label{subsec:Taille} Before we see the general syntax of number, we examin the very @@ -179,7 +225,7 @@ Here is a table showing a \TeX{} compilation for a multiplication with two operands of same size, on a linux computer, pentium~II~600 and 256~Mb RAM:\footnote{In fact it was the author computer in 2004. The actual author computer is \emph{more} powerfull but the author is - lazy, and he has not remake the tests!} + lazy, and he has not remade the tests!} \begin{center} \begin{tabular}{|l|*{6}{c|}} \hline @@ -217,7 +263,7 @@ explanations later: \*sep* \\ \sameline \textnormal{, and } \*digit* \end{syntaxBNF} -\index{syntax!BNF}\index{BNF grammar} +\index{syntax (BNF)}\index{BNF syntax} The \texttt{character} symbol means nearly any character accepted by \TeX{}. The exceptions are characters \verb+%+ and \verb+#+ which are @@ -239,14 +285,14 @@ the right definition! This possibility to have a name using macro could seem useless but it is not true. For instance, you can realize loops\index{loop} with names as \verb+r1+, \verb+r2+, \ldots, \verb+r+ using the code \verb+r\the\cpt+ as variable name, where -\verb+cpt+ is a counter in the \TeX{} meaning. With \LaTeX{}, the code +\verb+cpt+ is a counter in \TeX{} meaning. With \LaTeX{}, the code is more verbose with \verb+r\number\value{cpt}+ where \verb+cpt+ is now a \LaTeX{} counter. We will see an example using this syntax in the section~\ref{sec:Creation d'operations complexes} page~\pageref{sec:Creation d'operations complexes}. \index{number!valid}In practice, what does it mean all these rules? -First, they means that a number writes in a decimal form can be +First, they mean that a number written in a decimal form can be preceded by any sequence of plus or minus signs. Obviously, if there is an odd number of minus signs, the number will be negative. Next, a decimal number admits only one decimal separator symbol which can @@ -266,14 +312,15 @@ have to use the \macro{opset} macro. For instance: \begin{Verbatim}[xrightmargin=0pt] \opset{decimalsepsymbol={,}} \end{Verbatim} -give the comma as decimal separator symbol for the whole document, at +gives the comma as decimal separator symbol for the whole document, at least, until another redefinition with \verb+\opset+. \subsection{Symbols} \label{subsecSymboles} The \parameter{afterperiodsymbol} parameter indicates the symbol that follows a quotient in line in a division with period -search\index{division!period}. Its default value is \verb+$\ldots$+ +search\index{division!period}. We will see this parameter with the +division. Its default value is \verb+$\ldots$+ The \parameter{equalsymbol} parameter indicates the symbol used for equality. Its default value is \verb+$=$+. In fact, this parameter is @@ -305,9 +352,11 @@ operation is put with respect to the baseline. The possible values are default value. \begin{SideBySideExample} top\quad - \opadd[voperation=top]{45}{172}\par + \opadd[voperation=top]{45}{172} + center\quad - \opadd[voperation=center]{45}{172}\par + \opadd[voperation=center]{45}{172} + bottom\quad \opadd[voperation=bottom]{45}{172} \end{SideBySideExample} @@ -317,16 +366,18 @@ is put with repect to operands. The possible values are \verb+top+, \verb+center+ (default value), and \verb+bottom+. \begin{SideBySideExample} top\quad - \opadd[voperator=top]{45}{172}\par + \opadd[voperator=top]{45}{172} + center\quad - \opadd[voperator=center]{45}{172}\par + \opadd[voperator=center]{45}{172} + bottom\quad \opadd[voperator=bottom]{45}{172} \end{SideBySideExample} -The \parameter{deletezero} parameter indicates if some numbers in +The \parameter{deletezero} parameter indicates if numbers in operation should be displayed with or whithout non-significant -zeros. Exact rôle of this parameter depends of the actual +zeros. Exact rôle of this parameter depends of the actual operation. We will see that when we will study the different operations. @@ -374,10 +425,10 @@ negative numbers in inline operations. The possible values are: \subsection{Dimensions} \label{subsec:Dimensions} In displayed operations, figures are put in fixed size boxes. The -width is given by the \parameter{lineheight} parameter and the height -is given by the \parameter{lineheight} parameter. The default value of -\texttt{lineheight} is \verb+\baselineskip+ that is, interline space -in operation is the same (by default) as in the normal text. The +width and height are given by the \parameter{lineheight} +and \parameter{lineheight} parameters. The default value of +\texttt{lineheight} is \verb+\baselineskip+, that is, the interline +space in operation is the same (by default) as in the normal text. The default value for \texttt{columnwidth} is \texttt{2ex} because the ``normal'' width of figures would give bad results. \begin{SideBySideExample} @@ -393,14 +444,14 @@ improve this presentation giving a ``normal'' width to the dot. decimalsepwidth=0.27778em] {45.89}{127.5} \end{SideBySideExample} -It is better but give a positive width to the box that contain the -decimal separator is risked. It will be more difficult to place -extern object and it is counter against the idea to have a fixed +It is better but it is dangerous to give a positive width to the box +which contains the decimal separator. It will be more difficult to +place extern object and it is counter against the idea to have a fixed grid. You should avoid this in normal time. The \parameter{columnwidth} and \parameter{lineheight} parameters correspond to the only dimensions that \package{xlop} provides as -public one, that is, +public ones, that is, \verb+\opcolumnwidth+\index{opcolumnwidth@\texttt{$\backslash$opcolumnwidth}} and \verb+\oplineheight+\index{oplineheight@\texttt{$\backslash$oplineheight}} @@ -421,8 +472,8 @@ run over numbers. \opadd[hrulewidth=8pt]{42}{172} \end{SideBySideExample} -There is also a paramater which allows to control the horizontal shift -of decimal separator. It is the \parameter{decimalsepoffset} paramater +There is also a parameter which allows to control the horizontal shift +of decimal separator. It is the \parameter{decimalsepoffset} parameter with a default value of~\texttt{-0.35}. This value indicates a length with the unit \verb+\opcolumnwidth+. We will see an example at section~\ref{sec:Division} page~\pageref{sec:Division}. @@ -430,7 +481,7 @@ section~\ref{sec:Division} page~\pageref{sec:Division}. \subsection{Figure's Styles} \label{subsec:Styles des chiffres} The \package{xlop} package provides five types of numbers and -associates five style paramaters: +associates five style parameters: \begin{itemize} \item operands with \parameter{operandstyle}; \item result with \parameter{resultstyle}; @@ -445,7 +496,7 @@ associates five style paramaters: {45.89}{127.5} \end{SideBySideExample} Keep in mind that, in this manual, we use -\package{pstricks}\index{pstricks} package. +\package{pstricks}\index{pstricks@\package{pstricks}} package. \index{parameter!index|(}% In fact, the management of these styles is even more powerfull since @@ -465,7 +516,7 @@ with the \verb+\lightgray+ style. We don't indicate anything for the second operand, so it takes the basic style for its class. (Then with \verb+\blue+ style.) -This mechanism is even more powerfull since you can write two level +This mechanism is even more powerfull since you can write two levels index for operands, carries, and intermediary numbers (one level for result and carry) in order to access to each style figure of these numbers. To simplify index, a positive index indicates the rank of a @@ -522,7 +573,7 @@ access individually to the decimal separator style, you have to use \index{parameter!syntax|)} \chapter{Arithmetic Operations} -\label{chap:Opérations arithmétiques} +\label{chap:Opérations arithmétiques} \section{Addition} \label{sec:Addition} Addition is deal by the \macro{opadd} macro. When it is in display @@ -554,7 +605,7 @@ or not. Its default value is \texttt{true}. The \parameter{lastcarry} parameter is also a boolean parameter. It indicates if a carry without matching digit for the two operands must be showed or not. Its default value is \texttt{false}. Take care to -the exact rôle of this parameter. For instance, if the second operand +the exact rôle of this parameter. For instance, if the second operand in the following example is~15307, the last carry would be showed for any value of the \texttt{lastcarry} parameter since there is a matching digit in the second operand. @@ -575,19 +626,85 @@ operands and the result has the same number of digits. For that, \package{xlop} package adds non-significant zeros. Also, the non-significant zeros of operands are not removed. \begin{SideBySideExample} - \opadd{012.3427}{5.2773}\par + \opadd{012.3427}{5.2773} + \opadd[deletezero=false] {012.3427}{5.2773} \end{SideBySideExample} -This parameter has exactly the same rôle for inline mode than for +This parameter has exactly the same rôle for inline mode than for displayed mode. \begin{SideBySideExample} - \opadd[style=text]{02.8}{1.2}\par + \opadd[style=text]{02.8}{1.2} + \opadd[style=text, - deletezero=false]{02.8}{1.2}\par + deletezero=false]{02.8}{1.2} +\end{SideBySideExample} + +Version 0.27 adds a \macro{opmanyadd} macro in order to add more than +two operands. There are some limitations: +\begin{itemize} +\item all the operands must be non negative; +\item some parameters are useless, for instance \parameter{style}; +\item carries aren't displayed. +\end{itemize} +In the other hand, the \parameter{vmanyoperator} allows to control the +operator signs. + +Here is the first example with the basic syntax. The operands must be +enclosed inside braces. The number of arguments is not limited. +\begin{SideBySideExample} + \opmanyadd{123.4}{3.1416} + {2.71828}{0.001} +\end{SideBySideExample} + +The \macro{opmanyadd} macro accepts the style parameters for operands +and result. About the operand style, the first index is the operand's +place (top to bottom ones) and the second index is the digit of +operand. For instance: +\begin{SideBySideExample} + \newcommand\R{\color{red}} + \opmanyadd[operandstyle.2.3=\R, + operandstyle.3.3=\R, + resultstyle.3=\R, + resultstyle.4=\R] + {12.6}{853.3}{158.1} +\end{SideBySideExample} +This example shows that non significant zeros are discarded. They can +be display with the \parameter{deletezero} parameter at false value: +\begin{SideBySideExample} + \opmanyadd[deletezero=false] + {12.6}{853.3}{158.1} \end{SideBySideExample} +The \macro{opmanyadd} macro uses also the \parameter{voperation} +parameter as for \macro{opadd} macro. + +There is a parameter which is specific to \macro{opmanyadd}: +the \parameter{vmanyoperator} one. These parameter allows to +display plus operator in six different ways. +\begin{CenterExample} + \opmanyadd{1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=center] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=top] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=bottom] + {1}{12}{123}{1234} +\end{CenterExample} +We can see that the default value is center. The values with lowercase +first letter display as many operators than operands minus one. The +same values with upercase first letter display one single plus +operator: +\begin{CenterExample} + \opmanyadd[vmanyoperator=Center] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=Top] + {1}{12}{123}{1234}\quad + \opmanyadd[vmanyoperator=Bottom] + {1}{12}{123}{1234} +\end{CenterExample} + \section{Substraction} \label{sec:soustraction} Substraction is made by \macro{opsub} macro. In displayed mode, the @@ -990,7 +1107,7 @@ anything. Result is record in a variable given as argument. Since these commands don't display anything, parameters don't make sens and aren't allowed for \macro{opadd*}, \macro{opsub*}, \macro{opmul*}, and \macro{opidiv*}. In the other hand, -parameters \parameter{maxdivestep}, \parameter{safedivstep}, +parameters \parameter{maxdivstep}, \parameter{safedivstep}, and \parameter{period} influence calculations, then \macro{opdiv*} macro accepts an optional argument to take account of them. \begin{SideBySideExample} @@ -1135,7 +1252,7 @@ decimal part are numbered from right to left, figures for integer part are numbered from left to right. For instance, with the number 1234.56789, the second figure is 8, the second figure of the integer part is 3, and the second figure of the decimal part is 6. It is now -easy to guess the rôle of the six next macros: +easy to guess the rôle of the six next macros: \begin{itemize} \item \parameter{opgetdigit} ; \item \parameter{opsetdigit} ; @@ -1146,11 +1263,11 @@ easy to guess the r \end{itemize} Syntax is the same for these macros. The first argument is the processed number (reading or writting), the second one is the index of -te figure, and the third one is the variable name which hold the -result (figure read or changed number). If index is out of the range, -the reading macros give \texttt{0} as result and writing macros -extend the number in order to reach this index (for that, zero will be -created in new slots). +the figure, and the third one is the variable name which hold the +result (figure read) or the new figure (changed number). If index is +out of the range, the reading macros give \texttt{0} as result and +writing macros extend the number in order to reach this index (for +that, zero will be created in new slots). \section{Comparisons} \label{sec:Comparaisons} @@ -1438,8 +1555,8 @@ expression in \package{xlop}, more pleasant for users. Formulas accept usual arithmetic operators \texttt{+}, \texttt{-}, \texttt{*}, and \texttt{/}. They accept also \texttt{:} operator for euclidian division, and \verb+^+ for power. The \texttt{-} operator -has both rôle of substraction and unary operator for opposite. The -\texttt{+} has also these rôles, here the unary operator do\dots{} +has both rôle of substraction and unary operator for opposite. The +\texttt{+} has also these rôles, here the unary operator do\dots{} nothing! Operands are written in decimal form or \emph{via} variable name. However, \macro{opexpr} introduces a restriction about variable name since variable names must be different to function names @@ -1487,7 +1604,7 @@ Here is another example that shows that datas can come from a macro: \appendix \chapter{Short Summary} -\label{chap:Aide-mémoire} +\label{chap:Aide-mémoire} \section{Compilation times} \label{sec:Temps de compilation} Compilation times was measured on a computer with @@ -1700,6 +1817,8 @@ expected. \verb+\oplput(T1,T2){}+ & Put \verb++ to the right of the point with coordinates \verb+(T1,T2)+ in relation to reference point. \\\hline + \verb+opmanyadd[P]{n1}...{np}+ & + Display result of $\mathrm{n1}+\cdots+\mathrm{np}$ \\\hline \verb+\opmul[P]{n1}{n2}+ & Display result of \verb+n1*n2+. \\\hline \verb+\opmul*{n1}{n2}{N}+ & @@ -1763,7 +1882,7 @@ In this table, parameters: \section{Parameter list} \label{sec:Liste des parametres} -\index{parameter@parameter!table of|(}% +\index{parameter!table of|(}% \begingroup \advance\hoffset by-1.75cm \advance\linewidth by1.75cm \begin{longtable}{|l|l|p{7cm}|} @@ -1822,24 +1941,36 @@ In this table, parameters: displayed only for additional shifting (value \verb+shift+), for all the shifting (value \verb+all+), or never (value \verb+none+). \\\hline + \verb+vmanyoperator+ & + \verb+center+ & + Vertical alignment for add symbol in displayed many operand + addition. The value \verb+top+ put operators from the level of first + operand to the level of second to last operand. The value + \verb+center+ put operators between operands. The value + \verb+bottom+ put operators from the level of second operand to the + level of last operand. The value \verb+Top+ put one single operator + at the level of first operand. The value \verb+\center+ put one + single operator at the vertical middle of operands. The value + \verb+Bottom+ put one single operator at the level of last + operand. \\\hline \verb+voperation+ & \verb+bottom+ & - Vertical alignement for displayed operation. The value \verb+bottom+ + Vertical alignment for displayed operation. The value \verb+bottom+ indicates that the bottom of operation will be aligned with baseline. The value \verb+top+ indicates that the top of operation will be aligned with baseline. The value \verb+center+ indicates that operation will be verticaly centred with baseline. \\\hline \verb+voperator+ & \verb+center+ & - Vertical alignement for operators in displayed operations. The value + Vertical alignment for operators in displayed operations. The value \verb+top+ put operator at the level of first operand. The value \verb+bottom+ put operator at the level of second operand. The value \verb+center+ put operator between operands. \\\hline \verb+hfactor+ & \verb+decimal+ & - Sort of operands alignement for displayed operation. The value - \verb+decimal+ indicates an alignement on decimal separator. The - value \verb+right+ indicates a flushright alignement. \\\hline + Sort of operands alignment for displayed operation. The value + \verb+decimal+ indicates an alignment on decimal separator. The + value \verb+right+ indicates a flushright alignment. \\\hline \verb+vruleperiod+ & \verb+-0.2+ & Vertical position of rule which indicates period of quotient for @@ -1954,20 +2085,21 @@ In this table, parameters: \verb+\scriptsize+ & Style for carries. The default value when compilation are made without \LaTeX{} is \verb+\sevenrm+. \\\hline -\end{longtable}\index{parameter@parameter!table of|)} +\end{longtable}\index{parameter!table of|)} \endgroup \chapter{Tricks} \label{chap:Trucs et astuces} -\section{\package{xlop} vs. \package{calc} and \package{fp}} +\section{\package{xlop} vs. \package{calc} and \package{xfp}} You could believe that \package{xlop} can replace package such \package{calc}\index{package!calc}\index{calc} and -\package{fp}\index{package!fp}\index{fp}. In fact, that is not so +\package{xfp}\index{package!xfp}\index{xfp}. In fact, that is not so simple. Obviously \package{xlop} can do complex calculations, on arbitrary long numbers but, unlike \package{calc}, it don't allow to process -directly dimensions. Comparison with \package{fp} is somewhere more +directly dimensions. Comparison with \package{xfp} is somewhere more realistic but remember that \package{xlop} can make memory usage too -high. +high. In fact \package{xfp} is far more powerfull than \package{xlop} +about pure calmculation! If you want to process calculations on length\index{length}, you can use that a dimen register allocation to a counter gives a number which @@ -2182,7 +2314,7 @@ aren't allowed. It's not a bug, it's a feature. Author thinks that a user who write brackets without anything between these brackets is going to make a mistake. To obviate this prohibition\index{parameter!void}, there is the particular -parameter \parameter{nil} which has exactly this rôle. +parameter \parameter{nil} which has exactly this rôle. \index{loop|)} Finally, note the trick \verb+{\setbox2=\box2}+ to obtain a void box @@ -2272,8 +2404,8 @@ version~0.3 and its ``stable'' version will be version~0.4. The features of version~0.3 aren't definitively fixed but there are some points planned: \begin{itemize} -\item international version for posées; -\item opérations from 2 to 36~basis; +\item international version for posées; +\item opérations from 2 to 36~basis; \item additional high level functions with roots (\macro{oproot} for any roots and \macro{opsqrt} for square root), exponential function, logarithm, trigonometric functions (direct, inverse, hyperbolic); @@ -2282,7 +2414,6 @@ some points planned: are not the ones of the number, there will be overflow or filling); this macro was present in version~0.1 and allow to display numbers decimal aligned, right aligned, or left aligned; -\item macro for addition with more than two operands; \item parameter for scientific or engineer notation; \item macro to allow to write a multi-line number and/or with thousand separator; diff --git a/Master/texmf-dist/source/generic/xlop/manual.sty b/Master/texmf-dist/source/generic/xlop/manual.sty deleted file mode 100644 index e5f4f549d32..00000000000 --- a/Master/texmf-dist/source/generic/xlop/manual.sty +++ /dev/null @@ -1,48 +0,0 @@ -\usepackage[T1]{fontenc} -\usepackage[latin1]{inputenc} -\usepackage{fourier} -\usepackage[scaled]{helvet} -\usepackage[scaled]{luximono} -\usepackage{makeidx} -\usepackage{longtable} -\usepackage{multicol} -\usepackage{pst-node} -\usepackage{fvrb-ex} -\usepackage{geometry} -\usepackage{hyperref} -\usepackage{microtype} -\usepackage{xlop} - -\fvset{xrightmargin=5cm,frame=single,fontsize=\small} -\geometry{a4paper,left=4cm,right=4cm,top=3cm,bottom=3cm,nohead} - -\let\SBSori\SideBySideExample -\def\SideBySideExample{% - \par\bigbreak\SBSori -} -\let\endSBSori\endSideBySideExample -\def\endSideBySideExample{% - \endSBSori - \par\bigskip\noindent} - -\newenvironment{syntaxBNF}{% - \catcode`\_=12 - \def\*##1*{$\langle$##1$\rangle$}% - \def\alt{\unskip~$|$~\ignorespaces}% - \def\sameline{\multicolumn{1}{c}{} & \null\quad}% - \ttfamily - \begin{center}\begin{tabular}{r@{\quad:=\quad}l}} -{\end{tabular}\end{center}} - -\setlongtables -\newcommand\package[1]{\textsf{#1}} -\newcommand\file[1]{\texttt{#1}} - -\newcommand\macro[1]{\texttt{$\backslash$#1}\index{#1@\texttt{\boi {#1}}}} -\newcommand\parameter[1]{\texttt{#1}\index{#1@\texttt{#1}}% - \index{parametre@paramètre!\texttt{#1}}} - -\newcommand\bull{\vrule width3pt height4pt depth-1pt} - -\newcounter{stuff} -\makeindex diff --git a/Master/texmf-dist/tex/generic/xlop/xlop.sty b/Master/texmf-dist/tex/generic/xlop/xlop.sty index 65de248f1f0..88288d144ec 100644 --- a/Master/texmf-dist/tex/generic/xlop/xlop.sty +++ b/Master/texmf-dist/tex/generic/xlop/xlop.sty @@ -1,3 +1,3 @@ -\ProvidesPackage{xlop}[2009/12/02 package wrapper for xlop.tex] +\ProvidesPackage{xlop}[2020/04/26 package wrapper for xlop.tex] \input xlop.tex \endinput diff --git a/Master/texmf-dist/tex/generic/xlop/xlop.tex b/Master/texmf-dist/tex/generic/xlop/xlop.tex index ef3360dd438..e6f922a5807 100644 --- a/Master/texmf-dist/tex/generic/xlop/xlop.tex +++ b/Master/texmf-dist/tex/generic/xlop/xlop.tex @@ -1,12 +1,12 @@ -\def\fileversion{0.26} -\def\filedate{2017/01/07} +\def\fileversion{0.27} +\def\filedate{2020/04/28} %% %% xlop.tex: %% eXtra Large OPeration macros for Generic TeX. -%% See `user.pdf' for documentation; -%% `hacker.pdf' for explanation. +%% See `xlop-doc.pdf' for documentation; +%% `xlop-doc-fr.pdf' for french documentation. %% -%% Copyright 2005,2017, by Jean-C\^ome Charpentier +%% Copyright 2005-2020, by Jean-C\^ome Charpentier %% Jean-Come.Charpentier@wanadoo.fr %% %% This program may be distributed and/or modified under the @@ -28,6 +28,9 @@ \newcount\op@count@iv \newcount\op@count@v \newcount\op@count@vi +% add 0.27 +\newcount\op@nbop +% end add 0.27 \newtoks\op@currentstyle \expandafter\ifx\csname @latexerr\endcsname\relax \long\def\@ifundefined#1#2#3{% @@ -143,7 +146,13 @@ \def\op@string@american{american} \def\op@string@both{both} \def\op@string@bottom{bottom} +% add 0.27 +\def\op@string@Bottom{Bottom} +% end add 0.27 \def\op@string@center{center} +% add 0.27 +\def\op@string@Center{Center} +% end add 0.27 \def\op@string@decimal{decimal} \def\op@string@delete{delete} \def\op@string@display{display} @@ -165,6 +174,9 @@ \def\op@string@strike{strike} \def\op@string@text{text} \def\op@string@top{top} +% add 0.27 +\def\op@string@Top{Top} +% end add 0.27 \def\op@string@true{true} \def\op@string@warning{warning} @@ -217,6 +229,29 @@ {Value must be `top', `center', or `bottom'}% \fi\fi\fi } +% add 0.27 +\def\pOP@vmanyoperator#1{\edef\@tempa{#1}% + \ifx\@tempa\op@string@top + \let\op@vmanyoperator\op@string@top + \else\ifx\@tempa\op@string@bottom + \let\op@vmanyoperator\op@string@bottom + \else\ifx\@tempa\op@string@center + \let\op@vmanyoperator\op@string@center + \else\ifx\@tempa\op@string@Top + \let\op@vmanyoperator\op@string@Top + \else\ifx\@tempa\op@string@Bottom + \let\op@vmanyoperator\op@string@Bottom + \else\ifx\@tempa\op@string@Center + \let\op@vmanyoperator\op@string@Center + \else + \op@error{Parameter vmanyoperator accept only `top', `center', + `bottom', ^^J \space + `Top', `Center', and `Bottom'. Here, the value is `#1'}% + {Value must be `top', `center', `bottom', `Top', `Center', + or `Bottom'}% + \fi\fi\fi\fi\fi\fi +} +% end add 0.27 \def\pOP@hfactor#1{\edef\@tempa{#1}% \ifx\@tempa\op@string@right \let\op@hfactor\op@string@right @@ -473,7 +508,11 @@ hrulewidth=0.4pt,vrulewidth=0.4pt, behaviorsub=silent,country=french, operandstyle=,resultstyle=,remainderstyle=, - intermediarystyle=} + intermediarystyle=, + % add 0.27 + vmanyoperator=center% + % end add 0.27 +} \expandafter\ifx\csname @latexerr\endcsname\relax \opset{carrystyle=\sevenrm} \else @@ -1575,6 +1614,107 @@ \fi \endgroup } +% add 0.27 +\def\opmanyadd{\@ifnextchar[{\op@manyadd}{\op@manyadd[nil]}} +\def\op@manyadd[#1]{% + \begingroup + \opset{#1}% + \op@nbop \z@ + \opcopy{0}{OMA@result}% + \op@@manyadd +} +\def\op@@manyadd#1{% + \advance \op@nbop \@ne + \op@split{#1}{OMA@op\the\op@nbop}% + \ifop@deletezero + \op@unzero{OMA@op\the\op@nbop}% + \fi + \opadd*{OMA@result}{#1}{OMA@result}% + \op@split{OMA@result}{OMA@result}% + \@ifnextchar\bgroup{\op@@manyadd}{\op@manyaddend}% +} +\def\op@manyaddend{% + \op@count@i = \csname OP@OMA@op1@i\endcsname + \count@ \@ne + \loop + \ifnum\count@ < \op@nbop + \advance\count@ \@ne + \op@count@i = \op@max{\the\op@count@i} + {\csname OP@OMA@op\the\count@ @i\endcsname}% + \repeat + \op@count@i = \op@max{\the\op@count@i}{\OP@OMA@result@i}% + \advance\op@count@i \@ne + \op@count@ii = \csname OP@OMA@op1@d\endcsname + \count@ \@ne + \loop + \ifnum\count@ < \op@nbop + \advance\count@ \@ne + \op@count@ii = \op@max{\the\op@count@ii} + {\csname OP@OMA@op\the\count@ @d\endcsname}% + \repeat + \op@count@ii = \op@max{\the\op@count@ii}{\OP@OMA@result@d}% + \op@count@z = \op@count@i + \advance\op@count@z \op@count@ii + \setbox1=\hbox to\op@count@z\opcolumnwidth{% + \ophline(0,0.75){\the\op@count@z}% + \ifx\op@vmanyoperator\op@string@Top + \oplput(0,\the\op@nbop){\op@addsymbol}% + \else\ifx\op@vmanyoperator\op@string@Bottom + \oplput(0,1){\op@addsymbol}% + \else\ifx\op@vmanyoperator\op@string@Center + \count@ \op@nbop + \divide \count@ \tw@ + \ifodd\op@nbop + \advance\count@ \@ne + \oplput(0,\the\count@){\op@addsymbol}% + \else + \oplput(0,\the\count@.5){\op@addsymbol}% + \fi + \fi\fi\fi + \count@ \tw@ + \op@count@iii \@ne + \loop + \ifx\op@vmanyoperator\op@string@top + \oplput(0,\the\count@){\op@addsymbol}% + \else\ifx\op@vmanyoperator\op@string@bottom + \oplput(0,\the\op@count@iii){\op@addsymbol}% + \else\ifx\op@vmanyoperator\op@string@center + \oplput(0,\the\op@count@iii.5){\op@addsymbol}% + \fi\fi\fi + \ifnum \count@ < \op@nbop + \advance \count@ \@ne + \advance \op@count@iii \@ne + \repeat + \vbox{% + \count@ \@ne + \loop + \op@makebox{\the\op@count@i} + {\the\op@count@ii} + {operandstyle.\the\count@} + {OMA@op\the\count@}% + \hbox{\box0}% + \ifnum \count@ < \op@nbop + \advance \count@ \@ne + \repeat + \op@makebox{\the\op@count@i} + {\the\op@count@ii} + {resultstyle} + {OMA@result}% + \hbox{\box0}% + }% + }% + \leavevmode + \dimen0=\op@nbop\oplineheight + \ifx\op@voperation\op@string@center + \lower0.5\dimen0\box1 + \else\ifx\op@voperation\op@string@top + \lower\dimen0\box1 + \else + \box1 + \fi\fi + \endgroup +} +% end add 0.27 \def\opmul{\@ifnextchar*{\op@mulstar}{\op@mulnostar}} \def\op@mulstar*#1#2#3{% \begingroup @@ -1881,16 +2021,14 @@ \opset{#1} \op@split{#2}{a}% \op@split{#3}{b}% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Ajout du 20/11/2006 %%% -%%% Sur indication de Christophe Poulain %%% + % add 20/11/2006 + % Thanks to Christophe Poulain \op@cmp{b}{zero}% \ifopeq \op@error{divisor must be nonzero}% {You have to learn some math}% \fi -%%% Fin ajout %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % end add \ifop@error \op@errorwrite \else @@ -1934,16 +2072,14 @@ \opset{#1}% \op@split{#2}{a}% \op@split{#3}{b}% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Ajout du 20/11/2006 %%% -%%% Sur indication de Cristophe Poulain %%% + % add 20/11/2006 + % thanks to Christophe Poulain \op@cmp{b}{zero}% \ifopeq \op@error{divisor must be nonzero}% {You have to learn some math}% \fi -%%% Fin ajout %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % end add \ifop@error \op@errorwrite \else @@ -2118,16 +2254,14 @@ \begingroup \op@split{#1}{a}% \op@split{#2}{b}% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Ajout du 20/11/2006 %%% -%%% Sur indication de Cristophe Poulain %%% + % add 20/11/2006 + % thanks to Christophe Poulain \op@cmp{b}{zero}% \ifopeq \op@error{divisor must be nonzero}% {You have to learn some math}% \fi -%%% Fin ajout %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % end add \ifop@error \op@errorwrite \else @@ -2170,16 +2304,14 @@ \let\op@shiftdecimalsep\op@string@both \op@split{#2}{a}% \op@split{#3}{b}% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Ajout du 20/11/2006 %%% -%%% Sur indication de Cristophe Poulain %%% + % add 20/11/2006 + % thanks to Christophe Poulain \op@cmp{b}{zero}% \ifopeq \op@error{divisor must be nonzero}% {You have to learn some math}% \fi -%%% Fin ajout %%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % end add \ifop@error \op@errorwrite \else @@ -3031,11 +3163,13 @@ \ifop@error \op@errorwrite \else - \ifnum\@nameuse{OP@a@w}>#2\relax - \@namexdef{Op@#3}{\@nameuse{OP@a@#2}}% - \else + % modif 0.27 + \ifnum\OP@a@w<#2\relax \@namexdef{Op@#3}{0}% + \else + \@namexdef{Op@#3}{\@nameuse{OP@a@#2}}% \fi + % end modif 0.27 \fi } \def\opsetdigit#1#2#3{% @@ -3072,11 +3206,13 @@ \else \op@count@z=\OP@a@d \advance\op@count@z by#2\relax - \ifnum\OP@a@w>\op@count@z\relax - \@namexdef{Op@#3}{\@nameuse{OP@a@\the\op@count@z}}% - \else + % modif 0.27 + \ifnum\OP@a@w<\op@count@z\relax \@namexdef{Op@#3}{0}% + \else + \@namexdef{Op@#3}{\@nameuse{OP@a@\the\op@count@z}}% \fi + % end modif 0.27 \fi \endgroup } @@ -3127,7 +3263,9 @@ \def\opsetdecimaldigit#1#2#3{% \begingroup \op@split{#1}{a}% - \op@split{#3}{b}% + % modif 0.27 + \op@split{#2}{b}% + % end modif 0.27 \ifop@error \op@errorwrite \else @@ -3135,9 +3273,9 @@ \ifnum\OP@a@d<\Op@@b\relax \op@count@z=\Op@@b \advance\op@count@z by-\OP@a@d -%%% [2006/10/06] Bug find by Dave Jarvis. -% \advance\op@count@z by1\relax -%%% end bug fixing + % [2006/10/06] Bug find by Dave Jarvis. + % \advance\op@count@z by1\relax + % end bug fixing \op@count@i=\OP@a@w \advance\op@count@i by\op@count@z\relax \op@count@z=\OP@a@w @@ -3154,21 +3292,25 @@ \@namexdef{OP@a@\the\op@count@i}{0}% \advance\op@count@i by-1 \repeat -%%% [2006/10/06] Bug find by Dave Jarvis. -% \@namexdef{OP@a@1}{\Op@@b}% - \@namexdef{OP@a@1}{#2}% -%%% end bug fixing + % [2006/10/06] Bug find by Dave Jarvis. + % \@namexdef{OP@a@1}{\Op@@b}% + % modif 0.27 + \@namexdef{OP@a@1}{#3}% + % end modif 0.27 + % end bug fixing \else \op@count@z=\OP@a@d -%%% [2006/10/06] Bug find by Dave Jarvis. -% \advance\op@count@z by-#2\relax + % [2006/10/06] Bug find by Dave Jarvis. + % \advance\op@count@z by-#2\relax \advance\op@count@z by-\Op@@b\relax -%%% end bug fixing + % end bug fixing \advance\op@count@z by1 -%%% [2006/10/06] Bug find by Dave Jarvis. -% \@namexdef{OP@a@\the\op@count@z}{\Op@@b}% - \@namexdef{OP@a@\the\op@count@z}{#2}% -%%% end bug fixing + % [2006/10/06] Bug find by Dave Jarvis. + % \@namexdef{OP@a@\the\op@count@z}{\Op@@b}% + % modif 0.27 + \@namexdef{OP@a@\the\op@count@z}{#3}% + % end modif 0.27 + % end bug fixing \fi \op@unsplit{a}{#1}% \fi -- cgit v1.2.3