diff options
author | Karl Berry <karl@freefriends.org> | 2023-12-24 21:27:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-12-24 21:27:15 +0000 |
commit | d2ab9e4a72f22d93170a6a98feb66414d8447461 (patch) | |
tree | 75def7b9e9779014a7ea1133a19c901edae26009 /Master | |
parent | 6212f57f9840af3d6b6ba678f0a3db3be9a9abd5 (diff) |
tablvar (24dec23)
git-svn-id: svn://tug.org/texlive/trunk@69212 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/latex/tablvar/README.md | 8 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/tablvar/tablvar.pdf | bin | 217215 -> 271901 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/tablvar/tablvar.dtx | 2942 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/tablvar/tablvar.ins | 6 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/tablvar/tablvar.sty | 494 |
5 files changed, 2285 insertions, 1165 deletions
diff --git a/Master/texmf-dist/doc/latex/tablvar/README.md b/Master/texmf-dist/doc/latex/tablvar/README.md index 5a92c8ecd93..565ed9c0499 100644 --- a/Master/texmf-dist/doc/latex/tablvar/README.md +++ b/Master/texmf-dist/doc/latex/tablvar/README.md @@ -5,9 +5,9 @@ - A complete and easy to use package for typesetting pretty tables of signs and variations according to French usage. - The syntax is similar to that of the array environment and uses intuitive position commands. -- Arrows are automatically drawn (with PSTricks by default or TikZ in option). -- Macros are provided for drawing double bars, single bars crossing the zeros, areas where the function is not defined or placing special values. -- Several features of variation tables can be customized. +- Arrows are automatically drawn (with PSTricks or TikZ). +- Macros are provided for drawing double bars, single bars crossing the zeros, intervals where a function is not defined or for placing special values. +- Several features of variations tables can be customized. ## Documentation @@ -18,7 +18,7 @@ The documentation is in French. ## Installation - run LaTeX on tablvar.ins, you obtain the file tablvar.sty, -- if then you run LaTeX + dvips + ps2pdf on tablvar.dtx you get the file tablvar.pdf which is also in the archive, +- if then you run XeLaTeX or LaTeX + dvips + ps2pdf on tablvar.dtx you get the file tablvar.pdf which is also in the archive, - put the files tablvar.sty and tablvar.pdf in your TeX Directory Structure. diff --git a/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf b/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf Binary files differindex 32697460b4f..7f5962d8fc7 100644 --- a/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf +++ b/Master/texmf-dist/doc/latex/tablvar/tablvar.pdf diff --git a/Master/texmf-dist/source/latex/tablvar/tablvar.dtx b/Master/texmf-dist/source/latex/tablvar/tablvar.dtx index 28e8f1ead0f..afc47fc9539 100644 --- a/Master/texmf-dist/source/latex/tablvar/tablvar.dtx +++ b/Master/texmf-dist/source/latex/tablvar/tablvar.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier@ac-toulouse.fr> +% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr> % % This file may be distributed and/or modified under the conditions of % the LaTeX Project Public License, either version 1.3 of this license @@ -22,7 +22,7 @@ %<*package> \NeedsTeXFormat{LaTeX2e}[2005/12/01] \ProvidesPackage{tablvar} - [2019/07/01 v1.2 .dtx tablvar file] + [2023/12/23 v2.0 .dtx tablvar file] %</package> %<*driver> \documentclass{ltxdoc} @@ -30,22 +30,44 @@ \usepackage[T1]{fontenc} \usepackage[french]{babel} \usepackage{lmodern} -\usepackage{tablvar} -\usepackage[Symbol]{upgreek} -\renewcommand\pi{\uppi} -\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}} -\DisableCrossrefs -%\CodelineIndex -%\RecordChanges +\usepackage{geometry} % pour éviter certains changements avec XeLaTeX + +\usepackage{tabvar} +\let\barreFlipo\barre \let\barre\relax \let\discont\relax +\usepackage{variations} +\def\bbObrecht{\vrule\kern1pt\vrule} \let\bb\relax +\let\variations\relax +\usepackage{tkz-tab} + +\usepackage[pstricks]{tablvar} +\usepackage[style=french,font=fcm]{lgrmath} % pour un joli pi droit \usepackage{hyperref} +\usepackage{sectsty} +\usepackage{makecell} +\usepackage{spacingtricks} +\usepackage{metalogo} % pour \LuaLaTeX et \XeLaTeX +\usepackage{mflogo} % pour metapost +\usepackage{colortbl} + +\frenchsetup{StandardListSpacing=true} +\geometry{textwidth=355pt,vmarginratio=1:1,hmarginratio=3:2} % voisin de ltxdoc +\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}} +\newcommand\e{\mathrm{e}} +\newcommand\TikZ{\textnormal{Ti}\emph{k}\textnormal{Z}} +\newcommand\chline{\arrayrulecolor{cyan}\hline\arrayrulecolor{black}} +\definecolor{darkbrown}{rgb}{0.5,0.1,0.1} +\allsectionsfont{\color{darkbrown}} \hypersetup{% colorlinks, linkcolor=blue, + citecolor=red, pdftitle={tablvar}, pdfsubject={LaTeX package}, pdfauthor={Antoine Missier} } -\newcommand\tikz{{\fontfamily{cmr}Ti{\em k}Z}} +\DisableCrossrefs +%\CodelineIndex +%\RecordChanges \begin{document} \DocInput{tablvar.dtx} %\PrintChanges @@ -54,7 +76,7 @@ %</driver> % \fi % -% \CheckSum{2825} +% \CheckSum{752} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -76,64 +98,102 @@ % \changes{v0.2}{11/11/2014}{Ajout de l'option tikz} % \changes{v0.3}{07/12/2014}{Ajout de l'environnement tablvar*} % \changes{v1.0}{11/11/2018}{Première version publiée, création de fichiers dtx et ins} -% \changes{v1.0}{11/11/2018}{nouvelle marcro bblim, -% changements dans les macros barre et Zih} +% \changes{v1.0}{11/11/2018}{Nouvelle marcro bblim, changements dans les macros barre et ZIh} % \changes{v1.1}{12/04/2019}{Reprise README.md, tvloop -> varloop} % \changes{v1.2}{05/05/2019}{Modifications mineures dans la documentation} % \changes{v1.2}{02/06/2019}{Augmentation du facteur arraystretch par défaut de 1.2 à 1.4} +% \changes{v2.0}{03/09/2023}{ +% - Options gérées par xkeyval, +% - tablvarstretch passé de 1.4 à 1.6} +% \changes{v2.0}{30/10/2023}{Calcul de la colonne pour la gestion des ZI} +% \changes{v2.0}{05/11/2023}{ +% - Nouvelles macros limg, limd, posvr, +% - nouveaux types de colonnes pour les valeurs} +% \changes{v2.0}{20/11/2023}{Comparatif avec les autres extensions} +% \changes{v2.0}{25/11/2023}{Calcul de hauteur de la 1ère colonne pour l'ajustement des ZI} +% \changes{v2.0}{02/12/2023}{ +% - Nouveaux paramètres firstcolsep, extleft, extright, +% - mise à 0 du paramètre innercolsep} +% \changes{v2.0}{14/12/2023}{Reprise de la doc} +% \changes{v2.0}{15/12/2023}{Option tikz ou pstricks en fonction du compilateur} +% \changes{v2.0}{16/12/2023}{Nouveau paramètre limsep} +% \changes{v2.0}{20/12/2023}{Macro bas et mil valables pour un nb quelconque de lignes} +% \changes{v2.0}{22/12/2023}{Macros @pos -> tv@pos, @@pos -> tv@@pos} % % \GetFileInfo{tablvar.sty} +% +% \DoNotIndex{\@@ZI,\tv@@pos,\tv@pos,\@ZI,\@arstrutbox,\@ifstar,\\} +% \DoNotIndex{\addtocounter,\advance,\arraybackslash} +% \DoNotIndex{\begin,\boolean,\centering,\color,\DeclareOption,\def} +% \DoNotIndex{\define@boolkey,\defin@key,\dp,\draw,\else,\empty,\end} +% \DoNotIndex{\fi,\fill,\global,\hspace,\ht} +% \DoNotIndex{\I,\if,\ifdim,\ifnum,\ifthenelse,\Ix,\Iy,\kern} +% \DoNotIndex{\makebox,\MessageBreak,\multido,\ncline,\newboolean,} +% \DoNotIndex{\newcommand,\newcounter,\newenvironment,\newlength,\newsavebox} +% \DoNotIndex{\node,\PackageWarningNoLine,\ProcessOptions,\psframe} +% \DoNotIndex{\raisebox,\relax,\renewcommand,\RequirePackage,\rnode} +% \DoNotIndex{\sbox,\setboolean,\setcounter,\setlength,\stepcounter} +% \DoNotIndex{\TikZ,\tvanchor,\usetikzlibrary,\value,\wd} +% \DoNotIndex{\ZIheight,\ZIheighti,\ZIheightii,\ZIheightiii,\ZIheightiv,\ZIdepth,\ZIwidth} % % \title{L'extension \textsf{tablvar}\thanks{Ce document -% correspond à \textsf{tablvar}~\fileversion, dernière modification le 01/07/2019.}} +% correspond à \textsf{tablvar}~\fileversion, dernière modification le 23/12/2023.}} % \author{Antoine Missier \\ \texttt{antoine.missier@ac-toulouse.fr}} -% \date{1\ier\ juillet 2019} +% \date{23 décembre 2023} % \maketitle % \tableofcontents % % \section{Introduction} % -% Cette extension permet de construire des tableaux de variation (et de signes) +% Cette extension permet de construire des tableaux de variations et de signes % de manière simple et intuitive. % Bien que plusieurs autres extensions soient déjà dédiées à cette tâche -% \footnote{Mentionnons \textsf{tabvar} de Daniel Flipo et -% \textsf{variations} de Christian Obrecht ou, plus complexes, -% \textsf{tablor} de Guillaume Connan et \textsf{tkz-tab} de Alain Matthes.}, -% nous avons voulu produire des tableaux de manière automatisée, -% y compris pour des tableaux complexes, -% mais avec de nombreuses possibilités de réglages et d'ajustements personnels -% et une haute qualité graphique, en particulier pour le dessin des flèches, +% \footnote{Mentionnons \textsf{tabvar}~\cite{TABV} de Daniel Flipo et +% \textsf{variations}~\cite{VARI} de Christian Obrecht ou, plus élaborés, +% \textsf{tablor}~\cite{TABLOR} de Guillaume Connan et \textsf{tkz-tab}~\cite{TKZ} +% de Alain Matthes. +% Nous présentons un comparatif à la section \ref{comparatif}}, +% nous pensons que \textsf{tablvar} possède quelques avantages : +% une syntaxe simple, une haute qualité graphique, une variété de positionnements +% et de réglages, une documentation soignée. +% Les dessins, pour les flèches ou les zones interdites, sont obtenus % en exploitant les fonctionnalités des extensions graphiques PSTricks -% (plus exactement \textsf{pst-node}) ou \tikz\ pour -% définir un \emph{graphe} de \emph{nœuds} reliés par des flèches, +% (plus exactement \textsf{pst-node}) ou \TikZ. +% Les flèches sont réalisées à partir d'un \emph{graphe} de \emph{nœuds} % venant se \og superposer \fg{} au tableau lui-même. % -% Le parti pris ici est d'utiliser la même syntaxe que les environnements +% Le parti pris est d'utiliser la même syntaxe que les environnements % |array| (ou |tabular|) en laissant à \LaTeX\ le soin de faire % la composition du tableau et à l'extension graphique -% (PSTricks ou \tikz) celui +% (PSTricks ou \TikZ) celui % de réaliser le dessin des flèches, automatisé et sans intervention de l'utilisateur. -% On a simplement besoin de préciser, à l'intérieur d'une commande |\variations|, +% On a simplement besoin de préciser, dans une commande |\variations|, % ce qui est en haut et ce qui est en bas. % -% L'extension possède deux options utilisées pour le tracé automatique des flèches : -% |pstricks| (par défaut) ou |tikz| (|\usepackage[tikz]{tablvar}|). -% Pour l'option |pstricks|, il faut compiler avec \texttt{LaTeX + dvips + ps2pdf} ; -% pour l'option |tikz|, il faut compiler DEUX fois avec \texttt{pdfLaTeX} -% (la première fois les flèches ne sont pas correctement dessinées). -% Si on veut compiler avec l'option |pstricks| après avoir compilé avec |tikz|, -% il faut supprimer le fichier |.aux|, sinon la compilation plante. +% \medskip +% L'extension possède deux options, utilisées pour le tracé automatique des flèches : +% |pstricks| ou |tikz|, que l'on invoque dans le préambule à l'appel de l'extension : +% |\usepackage[tikz]{tablvar}|. +% Lorsque l'option n'est pas précisée, l'extension choisira \texttt{tikz} +% pour un compilateur PDF (comme pdf\LaTeX\ ou \LuaLaTeX), \texttt{pstricks} sinon +% (typiquement \LaTeX\ + dvips + ps2pdf ou \XeLaTeX). +% Pour l'option |tikz|, il faut compiler \emph{deux fois}, +% la première fois les flèches ne sont pas correctement dessinées +% (un message de compilation le rappelle). % -% Cette documentation donne une galerie d'exemples et décrit les commandes -% fournies. +% \medskip +% Cette documentation donne une galerie d'exemples, décrit les commandes +% fournies ainsi que différentes possibilités de réglages et d'ajustements personnels. % % \section{Utilisation} % % \subsection{Tableaux de variations simples} % -% Un tableau de variation (ou de signes) se définit par un environnement |tablvar| +% % \DescribeEnv{tablvar} +% Un tableau de variations (ou de signes) se définit par un environnement |tablvar| % qui \emph{doit être en mode mathématiques} (comme |array|). % +% \medskip % Voici un premier tableau tout simple avec les commandes % \DescribeMacro{\haut} \DescribeMacro{\bas} \DescribeMacro{\mil} % de positionnement naïves |\haut|, |\bas| et |\mil| (milieu). @@ -151,8 +211,7 @@ %\end{tablvar} %\] % \begin{verbatim} -%\[ -%\begin{tablvar}{4} +%\[\begin{tablvar}{4} % \hline % x & -5 && -1 && 2 && 3 && 5 \\ % \hline @@ -161,191 +220,178 @@ % \variations{ \mil{f(x)} & \bas{0} && \haut{2} && \bas{1} && % \haut{4} && \bas{-3} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] % \end{verbatim} % -% \vspace{-3ex} -% \DescribeEnv{tablvar} % L'argument obligatoire de l'environnement |tablvar| correspond au nombre % d'intervalles du tableau c'est-à-dire aussi au nombre de flèches (ici 4). % Les délimiteurs |&| correspondent aux changements de colonnes % comme pour l'environnement |array|. -% Outre la 1ère colonne de légendes, il y a deux types de colonnes : -% des colonnes de \emph{valeurs}, de largeur variable en fonction de leur contenu et centrées, -% et des colonnes \emph{intervalles} de largeur fixe (|2.5em| par défaut). -% -% \DescribeEnv{tablvar\oarg{largeur}} -% L'environnement |tablvar| possède un paramètre optionnel pour modifier la -% largeur des colonnes intervalles. -% Voici un exemple avec un seul intervalle utilisant l'argument optionnel |4em| -% pour allonger la largeur de l'intervalle qui sinon apparaîtrait très étroit. -% -% \noindent -% \begin{minipage}[t]{8cm} -% \begin{verbatim} -%\[ -%\begin{tablvar}[4em]{1} -% \hline -% x & -5 && +\infty \\ -% \hline -% \variations{\mil{f(x)} & \haut{2} && -% \bas{-1} } -% \hline -%\end{tablvar} -%\] -% \end{verbatim} -% \end{minipage} -% \begin{minipage}[t]{4.7cm} -%\[ -%\begin{tablvar}[4em]{1} -% \hline -% x & -5 && +\infty \\ -% \hline -% \variations{\mil{f(x)} & \haut{2} && \bas{-1}} -% \hline -%\end{tablvar} -%\] -% \end{minipage} +% Outre la première colonne de \emph{légendes}, il y a deux types de colonnes : +% des colonnes de \emph{valeurs}, de largeur fixe (\texttt{2em} par défaut) et centrées, +% et des colonnes \emph{intervalles} de largeur fixe (\texttt{3em} par défaut) +% \footnote{Une dimension peut être exprimée cm, pt, etc. +% Le \texttt{em} correspond à la largeur du \og m \fg dans la fonte utilisée. +% Cette unité à l'avantage de s'ajuster lorsqu'on change de fonte +% sans avoir besoin de modifier le code. L'unité de même type utilisée pour les hauteurs +% est le \texttt{ex}, hauteur du \og x \fg.}. +% Les flèches ne sont pas contraintes à rester à l'intérieur des colonnes intervalles +% mais s'ajustent par rapport à la taille effective des valeurs qu'elles relient. +% Lorsqu'une valeur est trop large, elle déborde automatiquement +% dans les colonnes intervalles sans altérer +% les largeurs de colonne. % +% \medskip % \DescribeMacro{\pos} -% Les commandes |\haut| et |\bas| ne sont en fait que des alias d'une commande +% Les commandes |\haut| et |\bas| reposent sur une macro % plus générale qui est \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur}. Celle-ci place % la \meta{valeur} sur la \meta{ligne} indiquée en créant un nœud pour les flèches. % La ligne des $x$ et les lignes contenant dérivée -% ou tableau de signe ont pour indice 0. -% La partie variations contient par défaut 3 lignes numérotées 1, 2, 3 -% \emph{du haut vers le bas} (dans le sens de l'écriture -% et de la construction du tableau). -% Le paramètre optionnel \meta{opt} -% \footnote{Ce paramètre optionnel n'est pas implémenté et est sans effet pour l'option |tikz|.} +% et tableau de signes ont pour indice 0. +% Les lignes de la partie variations sont numérotées 1, 2, 3, +% \emph{du haut vers le bas}, dans le sens de l'écriture +% et de la construction du tableau. +% Le paramètre optionnel \meta{opt} +% \footnote{Ce paramètre optionnel n'est pas implémenté +% et est sans effet pour l'option \texttt{tikz}.} % permet d'ajuster le positionnement des flèches : % |c| (centered, par défaut), |b| (bottom) ou |t| (top). -% Comparer le positionnement des flèches dans les deux exemples suivants. -% -% \DescribeMacro{\variations} -% C'est la commande |\variations| qui, une fois les nœuds définis, -% construit ensuite automatiquement les flèches. % -% La commande |\mil|, utilisée pour la première colonne contenant $f(x)$, +% \medskip % \DescribeMacro{\pos*} -% est un alias reposant sur la commande plus générale \cmd{\pos*}\marg{ligne}\marg{valeur} -% qui se comporte comme |\pos| mais ne crée pas de nœud pour les flèches.\\ -% \enlargethispage{1ex} -% \begin{minipage}[t]{7.4cm} -% \begin{verbatim} +% La commande |\mil|, utilisée pour le $f(x)$ dans la première colonne, +% repose, elle, sur la commande plus générale \cmd{\pos*}\marg{ligne}\marg{valeur} +% qui se comporte comme |\pos| mais ne crée pas de nœud pour les flèches. +% +% Le second tableau de l'exemple ci-dessous est obtenu avec le code suivant +% qui utilise les commandes |\pos| +% à la place de |\haut| et |\bas| (avec l'option |t| pour le max) +% et |\pos*| à la place de |\mil|. Comparer le positionnement des flèches. +%\[ %\begin{tablvar}{2} % \hline -% x & 0 & & \frac12 & & 1 \\ +% x & 0 & & \frac{1}{2} & & +\infty \\ % \hline % f'(x) & & + & 0 & - & \\ % \hline -% \variations{\mil{f(x)} & \bas{2} && -% \haut{f(\frac12)} && \bas{0} -% } +% \variations{\mil{f(x)} & \bas{2} && +% \haut{f(\frac{1}{2})} && \bas{0}} % \hline %\end{tablvar} -% \end{verbatim} -% \end{minipage} -% \begin{minipage}[t]{5.2cm} -%\[ +% \hspace{3.8em} %\begin{tablvar}{2} % \hline -% x & 0 & & \frac12 & & 1 \\ +% x & 0 & & \frac{1}{2} & & +\infty \\ % \hline % f'(x) & & + & 0 & - & \\ % \hline -% \variations{\mil{f(x)} & \bas{2} && -% \haut{f(\frac12)} && \bas{0} -% } +% \variations{\pos*{2}{f(x)} & \pos{3}{2} && +% \pos[t]{1}{f(\frac{1}{2})} && \pos{3}{0}} % \hline %\end{tablvar} %\] -% \end{minipage} -% \\ -% Le même tableau avec les commandes |\pos| -% et |\pos*| et l'option |t| pour le max.\\[-1ex] -% \begin{minipage}[t]{7.4cm} % \begin{verbatim} -%\begin{tablvar}{2} +%\[\begin{tablvar}{2} % \hline -% x & 0 & & \frac12 & & 1 \\ +% x & 0 & & \frac{1}{2} & & +\infty \\ % \hline -% f'(x) & & + & 0 & - & \\ +% f'(x) & & + & 0 & - & \\ % \hline -% \variations{\pos*{2}{f(x)} & \pos{3}{2} & -% &\pos[t]{1}{f(\frac12)} && \pos{3}{0} -% } +% \variations{ \pos*{2}{f(x)} & \pos{3}{2} && +% \pos[t]{1}{f(\frac{1}{2}} && \pos{3}{0} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} -% \end{minipage} -% \begin{minipage}[t]{5.2cm} -%\[ -%\begin{tablvar}{2} +% \hypertarget{intervalwidth}{} +% +% \medskip +% \DescribeEnv{tablvar\oarg{largeur}}\DescribeMacro{intervalwidth} +% L'environnement |tablvar| accepte un argument optionnel qui règle +% la largeur des colonnes intervalles. +% L'on peut aussi passer diverses options avec la syntaxe \emph{clé=valeur}, +% par exemple la largeur des colonnes intervalles peut également se régler avec +% \texttt{intervalwidth=}\meta{largeur} +% (voir section \ref{options} pour la liste détaillée des options). +% +% \DescribeMacro{\variations\oarg{nblignes}} +% C'est la commande |\variations| qui, se charge de la construction des flèches +% en fonction du positionnement des valeurs. +% Un paramètre optionnel permet de définir +% un nombre arbitraire de lignes pour les variations (3 par défaut). +% +% Voici un exemple avec un seul intervalle, utilisant l'argument optionnel \texttt{4em} +% de \texttt{tablvar}, afin d'allonger un peu la largeur de l'intervalle, +% et une partie variations construite uniquement sur 2 lignes. +% La commande |\mil| positionne automatiquement son contenu +% avec un décalage vertical adéquat. +% +% \noindent +% \begin{minipage}[t]{8cm} +% \begin{verbatim} +%\[\begin{tablvar}[4em]{1} % \hline -% x & 0 & & \frac12 & & 1 \\ +% x & -5 && +\infty \\ % \hline -% f'(x) & & + & 0 & - & \\ +% \variations[2]{ \mil{f(x)} & \haut{2} && +% \bas{-1} } % \hline -% \variations{\pos*{2}{f(x)} & \pos{3}{2} & -% &\pos[t]{1}{f(\frac12)} && \pos{3}{0} -% } +%\end{tablvar} \] +% \end{verbatim} +% \end{minipage} +% \begin{minipage}[t]{4.2cm} +%\[\begin{tablvar}[4em]{1} % \hline -%\end{tablvar} -%\] +% x & -5 && +\infty \\ +% \hline +% \variations[2]{\mil{f(x)} & \haut{2} && \bas{-1}} +% \hline +%\end{tablvar}\] % \end{minipage} +% \hypertarget{colvalwidth}{} % -% \DescribeMacro{\fleche} -% On peut modifier l'aspect des flèches en redéfinissant la macro |\fleche| -% grâce aux nombreuses options offertes par PSTricks ou \tikz. -% Cette redéfinition sera locale si on la place dans l'environnement math du tableau. -% Ci-dessous des flèches plus fines, plus proches des nœuds et dont la pointe est -% plus effilée (codé ici pour pstricks uniquement). -%\[ -%\ifthenelse{\boolean{tikz}}{}{ -% \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3, -% arrowinset=0.5,nodesep=1.5pt]{->}} -% } -%\begin{tablvar}{4} +% \DescribeMacro{colvalwidth} +% La largeur des colonnes de valeurs est fixée par défaut à \texttt{2em}, +% ce qui est légèrement plus large qu'un infini avec un signe. +% Lorsque toutes les valeurs sont étroites, on peut éventuellement +% diminuer la largeur des colonnes intervalles pour éviter des espaces larges sur les +% bords du tableau. +% Il est cependant rarement utile de modifier cette valeur. +%\[\begin{tablvar}[colvalwidth=1em,intervalwidth=3.5em]{4} % \hline -% x & -5 && 0 && 2 && 3 && 5 \\ +% x & 0 && 1 && 2 && 3 && 5 \\ % \hline -% \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} +% \variations{ \pos*{2}{f(x)} & \pos{3}{0} && \pos{2}{1} && \pos{2}{1} % && \pos{1}{4} && \pos{3}{0} % } % \hline -%\end{tablvar} -%\] -% Pour placer des nœuds de flèche au milieu, on doit utiliser |\pos{2}| et non |\mil|. +%\end{tablvar}\] +% Pour placer des nœuds de flèches au milieu (sur la ligne 2), +% on doit utiliser |\pos{2}| et non |\mil|. +% Lorsqu'il y a une autre option dans l'environnement \texttt{tablvar}, +% il faut utiliser la syntaxe complète +% \texttt{intervalwidth=...} pour modifier la largeur des colonnes intervalles. % \begin{verbatim} -%\[ -% \renewcommand{\fleche}{\ncline[linewidth=0.3pt,arrowsize=2pt 3, -% arrowinset=0.5,nodesep=1.5pt]{->}} -%\begin{tablvar}{4} +%\[\begin{tablvar}[colvalwidth=1em,intervalwidth=3.5em]{4} % \hline % x & -5 && 0 && 2 && 3 && 5 \\ % \hline % \variations{ \pos*{2}{f(x)} & \pos{3}{-4} && \pos{2}{1} && \pos{2}{1} -% && \pos{1}{4} && \pos{3}{0} -% } +% && \pos{1}{4} && \pos{3}{0} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] % \end{verbatim} % % \subsection{Tableaux de signes avec barres de séparation} % % \DescribeMacro{\barre} % La macro |\barre|, présentée dans l'exemple ci-dessous, sert de séparateur -% de colonne dans les tableaux de signe. Elle est bien sûr -% facultative de même que la partie variations. -% Ici $f(x)=-4x^3+3x^2+18x-3$ et $f'(x)=6(x+1)(-2x+3)$. -%\[ -%\begin{tablvar}{3} +% de colonne dans les tableaux de signes. Elle est bien sûr +% facultative et possède un paramètre optionnel pour placer un 0 sur la barre. +% Voici un exemple avec +% \[ f(x)=-4x^3+3x^2+18x-3 \quad\mbox{et}\quad f'(x)=6(x+1)(-2x+3).\] +%\[\begin{tablvar}[3.5em]{3} % \hline -% x & -\infty && \makebox[2.5em]{$-1$} && -% \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\ +% x & -\infty && -1 && \frac{3}{2} && +\infty \\ % \hline % x+1 & & - & \barre[0] & + & \barre & + & \\ % \hline @@ -353,21 +399,17 @@ % \hline % \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\ % \hline -% \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} && -% \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} -% } +% \variations{ \mil{\makecell{\mbox{Variations} \\ \mbox{de }f}} & +% \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} } % \hline -%\end{tablvar} -%\] -% Les bornes des intervalles ont été placées -% dans des |\makebox|\oarg{largeur}|{$ $}|, -% sur la ligne des $x$, pour que les colonnes -% soient plus équilibrées (ceci est affaire de goût). +%\end{tablvar}\] +% +% La légende \og Variations de $f$ \fg est composée avec une coupure de ligne grâce à +% la commande |\makecell| de l'extension \textsf{makecell}~\cite{MKCELL} d'Olga Lapko. % \begin{verbatim} -%\begin{tablvar}{3} +%\[\begin{tablvar}{3} % \hline -% x & -\infty && \makebox[2.5em]{$-1$} && -% \makebox[2.5em]{$\frac{3}{2}$} && +\infty \\ +% x & -\infty && -1 && \frac{3}{2} && +\infty \\ % \hline % x+1 & & - & \barre[0] & + & \barre & + & \\ % \hline @@ -375,146 +417,144 @@ % \hline % \mbox{Signe de }f'(x) & & - & \barre[0] & + & \barre[0] & - & \\ % \hline -% \variations{ \mil{\mbox{Variations de }f} & \haut{+\infty} && -% \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} -% } +% \variations{ \mil{\makecell{\mbox{Variations} \\ \mbox{de }f}} & +% \haut{+\infty} && \bas{-14} && \haut{\frac{69}{4}} && \bas{-\infty} } % \hline -%\end{tablvar} -%\end{verbatim} +%\end{tablvar}\] +% \end{verbatim} % -% \subsection{Doubles barres et discontinuités} +% \subsection{Doubles barres, discontinuités et limites} % -% Une double barre s'obtient avec la commande |\bb|. \DescribeMacro{\bb} -% Pour ne pas tracer de flèche entre deux nœuds (en particulier pour éviter -% de traverser une double barre), on place la -% commande |\discont| entre les deux. \DescribeMacro{\discont} -%\[ -%\begin{tablvar}{2} -% \hline -% x & -\infty && 0 && +\infty \\ +% \DescribeMacro{\bb} +% Une double barre s'obtient avec la commande |\bb|. +% +% \DescribeMacro{\discont} +% La commande |\discont| empêche le dessin d'une flèche entre deux nœuds, +% en particulier pour éviter de traverser une double barre. +% On peut en placer jusqu'à 4. +% +% \medskip +% Une première solution est d'interrompre la double barre pour placer +% les limites qui resteront alors centrées au milieu de la colonne (mais il faut aimer). +%\[\begin{tablvar}{2} % \hline -% -\frac{1}{x} & & + & \bb & - & \\ +% x & -\infty && 0 && +\infty \\ % \hline -% \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb -% \discont \haut{+\infty} && \bas{0} -% } +% \variations{\mil{\e^{\frac{1}{x}}} & \haut{1} && +% \bas{0} \pos*{2}{\bb} \discont \haut{+\infty} && \bas{1} } % \hline -%\end{tablvar} -%\] -% La commande |\dfrac| provient de l'extension \textsf{amsmath} ou peut être redéfinie -% par |\newcommand*\dfrac[2]{{\displaystyle\frac{#1}{#2}}}|. -% -% \smallskip +%\end{tablvar}\] +% La macro |\e| compose le nombre d'Euler $\e$ en romain (forme droite), +% comme c'est la règle pour les constantes mathématiques +% (cf. \textsf{mismath}~\cite{MIS} ou \textsf{frenchmath}~\cite{FR}). % \begin{verbatim} -%\begin{tablvar}{2} +%\[\begin{tablvar}{2} % \hline -% x & -\infty && 0 && +\infty \\ +% x & -\infty && 0 && +\infty \\ % \hline -% -\frac{1}{x} & & + & \bb & - & \\ +% \variations{\mil{\e^{\frac{1}{x}}} & \haut{1} && +% \bas{0} \pos*{2}{\bb} \discont \haut{+\infty} && \bas{1} } % \hline -% \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \haut{+\infty} \bb -% \discont \haut{+\infty} && \bas{0} -% } -% \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} % -% \vspace{-1ex} -% La syntaxe ci-dessus pose problème lorsque les limites à gauche et à droite -% d'une valeur interdite se trouvent sur des lignes différentes, -% ou que leur contenu n'a pas la même largeur, -% car alors la double barre ne serait plus au centre de sa colonne -% et se trouverait décalée d'une ligne à l'autre. -% -% Une première solution est d'interrompre la double barre pour placer -% les limites qui resteront alors centrées au milieu de la colonne (mais il faut aimer). -%\[ -%\begin{tablvar}[3em]{4} +% \hypertarget{firstcolsep}{} +% \DescribeMacro{\limg} \DescribeMacro{\limd} +% Les macros |\limg|\oarg{pos}\marg{ligne}\marg{valeur} +% et |\limd|\oarg{pos}\marg{ligne}\marg{valeur} +% offrent une solution plus élégante pour placer des limites à gauche ou à droite. +% L'option de positionnement \meta{pos} correspond à celle de la macro |\pos| +% (\texttt{c}, \texttt{t} ou \texttt{b}). +%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2} % \hline -% x & -\infty && -1 && 0 && 1 && +\infty \\ +% x & -\infty && 0 && +\infty \\ % \hline -% \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} && -% \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} && -% \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0} -% } +% -\frac{1}{x} & & + & \bb & - & \\ % \hline -%\end{tablvar} -%\] +% \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \limg{1}{+\infty} \bb +% \discont \limd{1}{+\infty} && \bas{0} } +% \hline +%\end{tablvar}\] +% +% \DescribeMacro{firstcolsep} +% Ci-dessus la colonne de légende a été élargie en ajoutant de l'espace à ses extrémités +% avec l'option \texttt{firstcolsep} (dont la valeur par défaut est \texttt{5pt}). % \begin{verbatim} -%\begin{tablvar}[3em]{4} +%\[\begin{tablvar}[firstcolsep=10pt,intervalwidth=4em]{2} % \hline -% x & -\infty && -1 && 0 && 1 && +\infty \\ +% x & -\infty && 0 && +\infty \\ % \hline -% \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} && -% \bas{-\infty}\mil{\bb}\discont\haut{+\infty} && \bas{1} && -% \haut{+\infty}\mil{\bb}\discont\bas{-\infty} && \haut{0} -% } +% -\frac{1}{x} & & + & \bb & - & \\ % \hline -%\end{tablvar} +% \variations{ \mil{\dfrac{1}{x^2}} & \bas{0} && \limg{1}{+\infty} \bb +% \discont \limd{1}{+\infty} && \bas{0} } +% \hline +%\end{tablvar}\] % \end{verbatim} % -% \DescribeMacro{\bblim} -% La commande |\bblim| résout le problème en gardant, sur chaque ligne, la double barre -% centrée dans sa colonne, avec des limites à gauche et à droite quelconques -% et quelles que soient les lignes où celles-ci sont positionnées. -% Elle prend 4 paramètres qui sont respectivement \meta{ligne} et \meta{limite} +% \DescribeMacro{\bblim} +% Sauf sur les bords du tableau ou lorsqu'il y a une zone interdite, +% les doubles barres sont en général accompagnées à la fois d'une limite à gauche +% et d'une limite à droite. La commande |\bblim| permet alors d'alléger la syntaxe. +% Elle prend 4 arguments qui sont dans l'ordre \meta{ligne} et \meta{limite} % à gauche puis à droite de la double barre. -% Elle trace la double barre, place les limites et gère la discontinuité. -%\[ -%\begin{tablvar}[2em]{4} +% Cette macro trace la double barre, place les limites et crée une discontinuité. +% C'est un alias de +% |\limg|\marg{ligne}\marg{valeur}|\bb\discont\limd|\marg{ligne}\marg{valeur}. +% La seule différence est que |\bblim| ne possède pas d'option de positionnement +% des nœuds comme |\limg| et |\limd|. +%\[\begin{tablvar}{4} % \hline % x & -\infty && -1 && 0 && 1 && +\infty \\ % \hline % \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} && % \bblim{3}{-\infty}{1}{+\infty} && \bas{1} && -% \bblim{1}{+\infty}{3}{-\infty} && \haut{0} -% } +% \bblim{1}{+\infty}{3}{-\infty} && \haut{0} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] % \begin{verbatim} -%\begin{tablvar}[2em]{4} +%\[\begin{tablvar}{4} % \hline % x & -\infty && -1 && 0 && 1 && +\infty \\ % \hline % \variations{\mil{\dfrac{1}{1-x^2}} & \haut{0} && % \bblim{3}{-\infty}{1}{+\infty} && \bas{1} && -% \bblim{1}{+\infty}{3}{-\infty} && \haut{0} -% } +% \bblim{1}{+\infty}{3}{-\infty} && \haut{0} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} +% \hypertarget{bordercolsep}{}\hypertarget{limsep}{} % -% Un autre exemple avec des limites de largeur assez différentes (placées ici sur la même ligne). -%\[ -%\begin{tablvar}{3} +% \DescribeMacro{bordercolsep}\DescribeMacro{limsep} +% Le paramètre \texttt{bordercolsep} gère l'espace à gauche de la première colonne +% de valeurs et à droite de la dernière (\texttt{2pt} par défaut), +% \texttt{limsep} permet d'ajouter de l'espace entre une double barre et une limite +% (\texttt{1pt} par défaut). Il est rarement utile de les modifier, +% sauf si on préfère plus de blanc. +% On peut y compris leur donner des valeurs négatives si l'on veut s'approcher +% davantage des filets verticaux, par exemple \texttt{limsep=-1.5pt} +% amène au contact de la double barre). +%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3} % \hline -% x & 0 & & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\ +% x & -\infty && 0 && 1 && +\infty \\ % \hline -% f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\ +% f'(x) & & + & \bb & - & 0 & + & \\ % \hline -% \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})} -% && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)} -% } +% \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && +% \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} } % \hline -%\end{tablvar} -%\] -% La colonne de valeurs du $\frac{\pi}{2}$ étant très large, -% la position des signes \og $-$ \fg{} -% a été légèrement décalée avec la commande \LaTeX\ |\hspace| qui produit -% un espacement horizontal positif ou négatif. +%\end{tablvar}\] % \begin{verbatim} -%\begin{tablvar}{3} +%\[\begin{tablvar}[bordercolsep=4pt,limsep=3pt]{3} % \hline -% x & 0 & & \frac{\pi}{6} & & \frac{\pi}{2} & & \pi \\ +% x & -\infty && 0 && 1 && +\infty \\ % \hline -% f'(x) & & + & 0 & \hspace{1em} - & \bb & \hspace{-1em} - & \\ +% f'(x) & & + & \bb & - & 0 & + & \\ % \hline -% \variations{\mil{f(x)} & \pos{3}{f(0)} && \pos[t]{1}{f(\frac{\pi}{6})} -% && \bblim{3}{-\infty}{3}{0} & & \pos[t]{1}{f(\pi)} -% } +% \variations{ \mil{x\e^{\frac{1}{x}}} & \bas{-\infty} && +% \bblim{1}{0}{1}{+\infty} && \bas{\e} & & \haut{+\infty} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} % % L'environnement |tablvar*| \DescribeEnv{tablvar*} @@ -522,790 +562,1277 @@ % des doubles barres lorsqu'elles se trouvent aux extrémités. % La différence avec |tablvar| est que les colonnes % de valeurs des extrémités ne sont plus centrées mais alignées à gauche pour -% le 1ère et à droite pour la dernière. +% la première et à droite pour la dernière. % -%\[ -%\begin{tablvar*}{2} +%\[\begin{tablvar*}{2} % \hline % x & 0 && 1 && +\infty \\ % \hline -% \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && -% \pos{3}{-\infty} } +% \variations{ \mil{\ln x -x} & \bb\limd{3}{-\infty} && \haut{-1} && +% \bas{-\infty} } % \hline %\end{tablvar*} -%\qquad +%\quad %\begin{tablvar*}{2} % \hline % x & 0 && 1 && +\infty \\ % \hline % \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb} -% \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} } +% \bas{-\infty} && \haut{-1} && \bas{-\infty} } % \hline -%\end{tablvar*} -%\] +%\end{tablvar*}\] +% % On observera l'utilisation de |\pos*| dans le second tableau, % pour tracer une double barre, sauf sur la ligne 3 où on place $-\infty$. % \begin{verbatim} -%\begin{tablvar*}{2} +%\[\begin{tablvar*}{2} % \hline % x & 0 && 1 && +\infty \\ % \hline -% \variations{ \mil{\ln x -x} & \bb \pos{3}{-\infty} && \pos{1}{-1} && -% \pos{3}{-\infty} } +% \variations{ \mil{\ln x -x} & \bb\limd{3}{-\infty} && \haut{-1} && +% \bas{-\infty} } % \hline %\end{tablvar*} -% +%\quad %\begin{tablvar*}{2} % \hline % x & 0 && 1 && +\infty \\ % \hline % \variations{ \mil{\ln x -x} & \pos*{1}{\bb} \pos*{2}{\bb} -% \pos{3}{-\infty} && \pos{1}{-1} && \pos{3}{-\infty} } +% \bas{-\infty} && \haut{-1} && \bas{-\infty} } % \hline -%\end{tablvar*} +%\end{tablvar*}\] % \end{verbatim} -% -% Si par contre, à l'autre extrémité du tableau, les valeurs ont des largeurs -% assez différentes, leur alignement non centré peut être corrigé en utilisant -% |\hspace|. Ci-dessous, de l'espace a été ajouté à droite du 1.\\ -% \begin{minipage}[t]{7.7cm} +% \hypertarget{ext}{} +% +% \DescribeMacro{extleft}\DescribeMacro{extright} +% Dans \texttt{tablvar*}, si, à une extrémité sans double barre, +% les valeurs ont des largeurs vraiment différentes +% leur alignement vers le bord peut être inélégant. +% L'environnement \texttt{tablvar} possède des options qui permettent +% de choisir un alignement à gauche ou à droite de manière séparée pour +% chaque extrémité. +% Il s'agit des options \texttt{extleft} pour aligner la première colonne à gauche +% et \texttt{extright} +% pour aligner la dernière colonne à droite +% (alors que \texttt{tablvar*} impose les deux). +% Ci-dessous, on n'a utilisé que l'option \texttt{extleft} +% \footnote{En fait \texttt{extleft} et \texttt{extright} sont des clés booléennes, +% la valeur \texttt{=true} étant facultative.} +% pour éviter que le 1 ne soit collé au bord droit +% et qu'il garde un bon centrage par rapport à $+\infty$. +% +% \noindent\begin{minipage}[t]{7.7cm} % \begin{verbatim} -%\begin{tablvar*}[3em]{1} +%\[\begin{tablvar}[extleft,intervalwidth=4em]{1} % \hline % x & 0 && +\infty \\ % \hline % \variations{ \mil{1-\dfrac{1}{x}} & \bb -% \bas{-\infty} && \haut{1\hspace{0.5em}} -% } +% \limd{3}{-\infty} && \haut{1} } % \hline -%\end{tablvar*} +%\end{tablvar}\] % \end{verbatim} % \end{minipage} % \begin{minipage}[t]{5cm} -%\[ -%\begin{tablvar*}[3em]{1} +%\[\begin{tablvar}[extleft,intervalwidth=4em]{1} % \hline % x & 0 && +\infty \\ % \hline % \variations{ \mil{1-\dfrac{1}{x}} & \bb -% \bas{-\infty} && \haut{1\hspace{0.5em}} -% } +% \limd{3}{-\infty} && \haut{1} } % \hline -%\end{tablvar*} -%\] +%\end{tablvar}\] % \end{minipage} % -% \DescribeMacro{\tablvarinit} -% Enfin, pour personnaliser totalement la définition des colonnes, -% on peut revenir à l'environnement |array| plutôt que d'utiliser |tablvar| -% (il faut dans ce cas appeler |\tablvarinit| juste avant |\begin{array}|). -% Ce qui est essentiel dans cette extension est la macro |\variations| -% avec les commandes de positionnement -% et non l'environnement |tablvar| qui n'est qu'un |array| dans lequel -% on a fixé les définitions de colonnes (et initialisé des variables). -% % \subsection{Valeurs remarquables} % -% Nous appellerons \emph{valeur remarquable}, un valeur supplémentaire -% que l'on place dans un tableau de variation et qui ne correspond -% pas à un extremum. +% Nous appellerons \emph{valeur remarquable}, un valeur particulière +% que l'on place dans un tableau de variations et qui sera reliée par des pointillés +% à son antécédent. % \medskip % % \DescribeMacro{\vr} -% Une première approche est de laisser les flèches de variations passer à travers -% ces valeurs remarquables. -% Pour chaque valeur remarquable, on place une commande |\vr| sur la ligne -% des $x$ et une commande |\vr| dans la partie variations. Les valeurs remarquables -% seront automatiquement reliées par des pointillés -% (tracés réalisés dans la commande |\variations|). -% -% Voici un exemple avec le logarithme népérien où la valeur remarquable +% Une première approche est placer ces valeurs remarquables par dessus +% les flèches de variations. +% Pour relier ces valeurs remarquables à leurs antécédents par des pointillés +% (tracés réalisés dans la commande |\variations|), on place une commande |\vr| +% sur la ligne des $x$ et une commande |\vr| dans la partie variations. +% +% Voici un exemple où la valeur remarquable % est placée dans la colonne intervalle.\\ % \begin{minipage}[t]{7.7cm} % \begin{verbatim} -%\begin{tablvar*}[5em]{1} +%\[\begin{tablvar*}[6em]{1} % \hline % x & 0 & \vr{1} & +\infty \\ % \hline % \variations{ \mil{\ln x} & -% \bb \pos{3}{-\infty} & -% \vr{0} & \pos{1}{+\infty} } +% \bb \limd{3}{-\infty} & \vr{0} & +% \pos[t]{1}{+\infty} } % \hline -%\end{tablvar*} +%\end{tablvar*}\] % \end{verbatim} % \end{minipage} % \begin{minipage}[t]{5cm} -%\[ -%\begin{tablvar*}[5em]{1} +%\[\begin{tablvar*}[6em]{1} % \hline % x & 0 & \vr{1} & +\infty \\ % \hline % \variations{ \mil{\ln x} & -% \bb \pos{3}{-\infty} & -% \vr{0} & \pos{1}{+\infty} } +% \bb \limd{3}{-\infty} & \vr{0} & +% \pos[t]{1}{+\infty} } % \hline -%\end{tablvar*} -%\] +%\end{tablvar*}\] % \end{minipage} % % Un autre exemple avec deux valeurs remarquables, placées cette fois -% dans des colonnes valeurs. -%\[ -%\renewcommand{\tablvarstretch}{1.2} -%\begin{tablvar}[1.5em]{3} +% dans des colonnes valeurs. Il y a alors 3 colonnes intervalles et +% la partie variations est composée sur 4 lignes. +%\[\begin{tablvar}[stretch=1.2,intervalwidth=1em]{3} % \hline % x & -\infty && \vr{0} && \vr{1} && +\infty \\ % \hline -% \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && -% \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty} -% } +% \variations[4]{ \mil{\exp x} & \bas{0} && +% \vr[3]{1} && \vr{\e} && \haut{+\infty} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] % \begin{verbatim} -%\renewcommand{\tablvarstretch}{1.2} -%\begin{tablvar}[1.5em]{3} +%\[\begin{tablvar}[stretch=1.2,intervalwidth=1em]{3} % \hline % x & -\infty && \vr{0} && \vr{1} && +\infty \\ % \hline -% \variations[4]{ \pos*{2}{\vdecal{-1.5ex}{\exp x}} & \pos{4}{0} && -% \vr[3]{1} && \vr{\mathrm{e}} && \pos{1}{+\infty} -% } +% \variations[4]{ \mil{\exp x} & \haut{0} && +% \vr[3]{1} && \vr{\e} && \bas{+\infty} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} -% \vspace{-2ex} -% \DescribeMacro{\variations\oarg{nblignes}} -% Ci-dessus, la partie variations a été composée sur 4 lignes grâce au paramètre -% optionnel de la commande |\variations|. Les lignes sont alors numérotées -% de 1 (haut) à 4 (bas).\\ +% +% \hypertarget{stretch}{} +% \vspace{-\baselineskip} +% Comme la partie |\variations| est composée sur 4 lignes, +% les lignes sont numérotées de 1 (haut) à 4 (bas). +% La commande |\mil| opère automatiquement un décalage vertical approprié. +% % \DescribeMacro{\vr\oarg{ligne}} % La commande |\vr| possède elle aussi un argument optionnel % qui est la ligne sur laquelle placer la valeur remarquable, -% lorsqu'il s'agit de la partie variations (2 par défaut).\\ -% \DescribeMacro{\tablvarstretch} -% À cause des 4 lignes de variations, la hauteur de lignes du tableau -% a été réduite en modifiant le facteur -% |\tablvarstretch| (fixé à 1.4 par défaut), modification locale -% car placée à l'intérieur de l'environnement math -% \footnote{On peut utiliser ce paramètre pour agrandir la hauteur des lignes -% mais l'effet sera global pour tout le tableau. Si l'on souhaite agrandir -% spécifiquement une ligne on peut utiliser la commande \texttt{\bslash vstrut} -% de l'extension \textsf{spacingtricks}. Malheureusement un ajustement automatique -% comme proposé dans l'extension \textsf{arraycols} ne fonctionne pas, -% à cause des doubles barres.}.\\ -% \DescribeMacro{\vdecal} -% Enfin la légende $\exp x$ a été placée en ligne 2 mais -% décalée vers le bas, pour qu'elle se trouve centrée verticalement -% sachant qu'il y a 4 lignes de variations. -% Ceci s'obtient grâce à la commande |\vdecal| dont la syntaxe est -% \cmd{\vdecal}\marg{decal}\marg{contenu} où la valeur du décalage -% peut être positive (vers le haut) ou négative (vers le bas). +% lorsqu'il s'agit de la partie variations (ligne 2 par défaut). +% +% \DescribeMacro{stretch} +% À cause des 4 lignes de variations, nous avons utilisé l'option +% \texttt{stretch} \label{stretch} +% qui est un facteur d'élasticité verticale, afin de diminuer la hauteur des lignes +% du tableau +% \footnote{On peut aussi utiliser ce paramètre pour agrandir la hauteur des lignes +% mais l'effet sera global pour tout le tableau. +% Malheureusement un ajustement automatique des hauteurs, +% comme proposé dans l'extension \textsf{cellspace}~\cite{CELLSP} +% de Josselin Noirel, ne fonctionne pas pour les barres et doubles barres, +% mais, si l'on souhaite agrandir spécifiquement une ligne, +% on peut utiliser les commandes \texttt{\bslash cstrut} ou \texttt{\bslash vstrut} +% de l'extension \textsf{spacingtricks} (voir exemples page \pageref{vstrut}).}. +% Sa valeur par défaut est de \texttt{1.6}, nous l'avons ramenée dans cet exemple +% à \texttt{1.2}, la valeur standard des environnements \texttt{array} étant de \texttt{1}. % % \medskip -% On peut préférer que les flèches de variations s'interrompent sur -% les valeurs remarquables qui sont alors des nœuds. -% Voici un tableau qui présente simultanément les deux manières de traiter -% les valeurs remarquables. +% On peut préférer que les flèches de variations ne passent pas à travers +% les valeurs remarquables (qui doivent alors être aussi des nœuds pour les flèches). +% L'exemple suivant présente un tableau utilisant simultanément +% les deux manières de traiter les valeurs remarquables. % La taille des flèches s'ajuste automatiquement. -% Bien entendu, on peut aussi ne pas tracer les pointillés mais placer -% quand même une valeur remarquable sur la flèche avec |\mil{0}|. -%\[ -%\begin{tablvar*}{4} +% Le second zéro correspond à la fois à un nœud pour les flèches +% et à une valeur remarquable (nœud pour les pointillés). +% +% \DescribeMacro{\posvr} +% La commande |\vr| est inopérante +% lorsqu'elle est imbriquée avec une commande |\pos| (qui produit les nœuds). +% Nous fournissons pour cet usage la commande |\posvr|\oarg{opt}\marg{ligne}\marg{valeur}, +% où les 3 paramètres sont exactement les mêmes que ceux de |\pos| +% (le premier étant le paramètre optionnel \texttt{c}, \texttt{t} +% ou \texttt{b} pour le positionnement des flèches). +% +%\[\begin{tablvar}[extright,intervalwidth=2em]{4} % \hline -% x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\ +% x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \vr{\alpha_2} && \frac{\pi}{2} \\ % \hline % f'(x) && + && + & 0 & - && - & \bb \\ % \hline % \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} && -% \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb -% } +% \pos[t]{1}{f(\frac{\pi}{6})} && \posvr{2}{0} && +% \pos[b]{3}{-\infty}\bb } % \hline -%\end{tablvar*} -%\] -% Si on choisit l'option |[t]| pour le max en ligne 1, -% il est alors nécessaire de choisir l'option |[b]| en ligne 3 pour conserver +%\end{tablvar}\] +% +% L'option |[t]| pour le max en ligne 1 +% est ici combinée avec l'option |[b]| en ligne 3 et permet de conserver % un positionnement correct du 0 sur la flèche. % \begin{verbatim} -%\begin{tablvar*}{4} +%\[\begin{tablvar}[extright,intervalwidth=2em]{4} % \hline -% x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && \frac{\pi}{2}\\ +% x & 0 && \vr{\alpha_1} && \frac{\pi}{6} && \alpha_2 && +% \frac{\pi}{2} \\ % \hline % f'(x) && + && + & 0 & - && - & \bb \\ % \hline % \variations{\mil{f(x)} & \pos[b]{3}{f(0)} && \vr{0} && -% \pos[t]{1}{f(\frac{\pi}{6})} && \pos{2}{0} &&\pos[b]{3}{-\infty}\bb -% } +% \pos[t]{1}{f(\frac{\pi}{6})} && \posvr{2}{0} && +% \pos[b]{3}{-\infty}\bb } % \hline -%\end{tablvar*} +%\end{tablvar}\] % \end{verbatim} % +% \vspace{-\baselineskip} +% \DescribeMacro{\vrconnect} +% C'est la macro graphique |\vrconnect| qui gère le tracé de ces traits pointillés. +% Elle peut être redéfinie pour changer leur aspect +% (voir le code section \ref{graph}). +% +% On peut aussi placer les zéros sur les flèches, sans pointillés, +% auquel cas, on n'a pas besoin de |\vr| ou |\posvr|, il suffit +% d'utiliser |\pos*{2}{0}| (ou |\mil{0}|) pour le premier zéro de l'exemple précédent +% et |\pos{2}{0}| pour le second. +% +% \medskip % La commande |\vr| peut également servir à représenter des discontinuités -% particulières, voir l'exemple ci-dessous avec la fonction définie par -%\[ -%f(x)=\left\{ +% particulières, comme dans l'exemple suivant avec la fonction définie par +%\[f(x)=\left\{ %\begin{array}{@{}cl} % \frac{\sin x}{x} &\mbox{si } x \neq 0 \\[1ex] % 0 &\mbox{si } x= 0 %\end{array} -%\right. . -%\] -% \begin{minipage}[t]{7.5cm} +%\right. .\] +% \begin{minipage}[t]{6.5cm} % \begin{verbatim} -%\begin{tablvar}{2} +%\[\begin{tablvar}{2} % \hline % x & -\pi && \vr{0} && \pi \\ % \hline % \variations{\mil{f(x)} & \bas{0} && -% \haut{ 1 \hspace{0.2em} } \discont -% \vr[3]{0} \haut{ \hspace{0.2em} 1 } -% && \bas{0} -% } +% \limg{1}{1}\hspace{2pt}\discont +% \vr[3]{0}\hspace{2pt}\limd{1}{1} +% && \bas{0} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} % \end{minipage} -% \begin{minipage}[t]{5cm} -%\[ -%\begin{tablvar}{2} +% \hfill +% \begin{minipage}[t]{5.5cm} +%\[\begin{tablvar}{2} % \hline % x & -\pi && \vr{0} && \pi \\ % \hline % \variations{\mil{f(x)} & \bas{0} && -% \haut{ 1 \hspace{0.2em} } \discont -% \vr[3]{0} \haut{ \hspace{0.2em} 1 } -% && \bas{0} -% } +% \limg{1}{1}\hspace{2pt}\discont +% \vr[3]{0}\hspace{2pt}\limd{1}{1} +% && \bas{0} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] % \end{minipage} % % \medskip -% Voici un dernier exemple, traité de deux manières différentes, -% avec des valeurs remarquables dans deux tableaux conjoints. -% Avec des nœuds c'est assez simple. -%\[ -%\begin{tablvar}{4} -% \hline -% x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\ -% \hline -% \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} && -% \pos{2}{0} && \haut{1} } -% \hline -% \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} && -% \bas{-1} && \haut{0} } -% \hline -%\end{tablvar} -%\] -% \begin{verbatim} -%\begin{tablvar}{4} -% \hline -% x & 0 && \frac{\pi}{2} && \pi && \frac{3\pi}{2} && 2\pi \\ -% \hline -% \variations{ \mil{\cos x} & \haut{1} && \pos{2}{0} && \bas{-1} && -% \pos{2}{0} && \haut{1} } -% \hline -% \variations{ \mil{\sin x} & \bas{0} && \haut{1} && \pos{2}{0} && -% \bas{-1} && \haut{0} } -% \hline -% \end{verbatim} -% -% \vspace{-2ex} -% \DescribeMacro{\noeud} \DescribeMacro{\vrconnect} -% Par contre, pour traiter ici les valeurs remarquables avec des pointillés, -% la commande |\vr| ne permet pas connecter les valeurs sur $x$ avec celles du sinus dans -% le 2\ieme\ tableau, mais on peut le faire \og à la main\fg{} -% en appelant les macros |\noeud| et |\vrconnect|. +% Voici un dernier exemple, avec deux tableaux conjoints. % -%\[ -%\begin{tablvar}{4} +%\[\begin{tablvar}{4} % \hline -% x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} && -% \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\ +% x & 0 && \vr{\frac{\pi}{2}} && \vr{\pi} && +% \vr{\frac{3\pi}{2}} && 2\pi \\ % \hline % \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && % \mil{0} && \haut{1} } % \hline -% \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && -% \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} } +% \variations{ \mil{\sin x} & \bas{0} && \posvr{1}{1} && +% \vr{0} && \posvr{3}{-1} && \haut{0} } % \hline -%\end{tablvar} -%\vrconnect{X1}{Y1} -%\vrconnect{X2}{Y2} -%\vrconnect{X3}{Y3} -%\] +%\end{tablvar}\] % \begin{verbatim} -%\begin{tablvar}{4} +%\[\begin{tablvar}{4} % \hline -% x & 0 && \noeud{X1}{\frac{\pi}{2}} && \noeud{X2}{\pi} && -% \noeud{X3}{\frac{3\pi}{2}} && 2\pi \\ +% x & 0 && \vr{\frac{\pi}{2}} && \vr{\pi} && +% \vr{\frac{3\pi}{2}} && 2\pi \\ % \hline % \variations{ \mil{\cos x} & \haut{1} && \mil{0} && \bas{-1} && % \mil{0} && \haut{1} } % \hline -% \variations{ \mil{\sin x} & \bas{0} && \haut{\noeud{Y1}{1}} && -% \mil{\noeud{Y2}{0}} && \bas{\noeud{Y3}{-1}} && \haut{0} } +% \variations{ \mil{\sin x} & \bas{0} && \posvr{1}{1} && +% \vr{0} && \posvr{3}{-1} && \haut{0} } % \hline -%\end{tablvar} -%\vrconnect{X1}{Y1} -%\vrconnect{X2}{Y2} -%\vrconnect{X3}{Y3} +%\end{tablvar}\] % \end{verbatim} % % \subsection{Zones interdites} % -% Nous abordons pour finir le tracé de zones interdites où la fonction -% n'est pas définie. On peut dessiner ces zones interdites en couleur ou en hachures. +% Nous abordons pour finir le tracé de zones interdites, c'est-à-dire +% d'intervalles où la fonction n'est pas définie. +% On peut dessiner ces zones interdites en hachures ou en couleur. % % \medskip -% Pour une zone interdite en couleur, on place la commande |\ZIc| -% \DescribeMacro{\ZIc} -% dans les intervalles que l'on veut colorer (signes ou variations). -% Un exemple avec la fonction $f$ définie par $f(x)=\frac{1}{\sqrt{x^2-1}}$. -% La zone grisée arrive toujours au contact des doubles barres. -%\[ -%\begin{tablvar}[4em]{3} -% \hline -% x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\ -% \hline -% -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc & -% \bb & \hspace{1.5em} - & \\ -% \hline -% \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && -% \zbox[r]{\haut{+\infty}} \bb & \ZIc & -% \bb \zbox[l]{\haut{+\infty}} && \bas{0} -% } +% \DescribeMacro{\ZI} +% Lorsque l'on veut définir une zone interdite, on place la commande |\ZI| +% dans les cellules correspondantes. La discontinuité des flèches est automatique. +% +%\[\begin{tablvar}{3} % \hline -%\end{tablvar} -%\] -% \DescribeMacro{\zbox} -% Plusieurs \og interventions\fg{} manuelles sont nécessaires. -% D'abord sur la ligne des $x$, il faut permettre aux bornes -% de déborder sur la colonne de la zone interdite. -% Pour cela on les place dans une |\zbox|. -% La commande \cmd{\zbox}\oarg{pos}\marg{contenu} -% affiche son contenu mais considère la largeur comme nulle. -% Le 1\ier\ paramètre (optionnel) est le positionnement dans la boite : -% |c| (par défaut), |l| (left) ou |r| (right). -% Ici |zbox| est aussi nécessaire pour annuler la largeur des -% boites contenant les $+\infty$ sinon la double barre ne serait -% plus au centre de sa colonne, en ligne 1, ce qui produirait -% un décalage avec les autres lignes.\\ -% La deuxième ligne avec la racine cubique a été agrandie grâce à la commande \LaTeX\ |\strut|. -% Enfin, les signes ont été décalés avec |\hspace|, pour améliorer -% leur centrage par rapport aux flèches. -% \begin{verbatim} -%\begin{tablvar}[4em]{3} +% x & -\infty & & -1 & & 1 & & +\infty \\ +% \hline +% f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\ % \hline -% x & -\infty && \zbox{-1} && \zbox{1} && +\infty \\ +% \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}} +% & \bas{1} && \limg{1}{+\infty} \bb & \ZI +% & \bas{0} \barre && \haut{1} } % \hline -% -\frac{x}{\strut\sqrt{x^2-1}^3} && \hspace{-1.5em} + & \bb & \ZIc & -% \bb & \hspace{1.5em} - & \\ +%\end{tablvar}\] +% +% \begin{verbatim} +%\[\begin{tablvar}{3} % \hline -% \variations{\mil{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && -% \zbox[r]{\haut{+\infty}} \bb & \ZIc & -% \bb \zbox[l]{\haut{+\infty}} && \bas{0} -% } +% x & -\infty & & -1 & & 1 & & +\infty \\ +% \hline +% f'(x) && \hspace{-0.5em} + & \bb & \ZI & \bb & - & \\ % \hline -%\end{tablvar} +% \variations{ \pos*{2}{\sqrt{\dfrac{x-1}{x+1}}} +% & \bas{1} && \limg{1}{+\infty} \bb & \ZI +% & \bas{0} \barre && \haut{1} } +% \hline +%\end{tablvar}\] % \end{verbatim} % -% Un autre exemple avec $f(x)=\sqrt{2x^2-1}$ où -% les doubles barres n'apparaissent que sur la dérivée. -%\[ -%\begin{tablvar}[3em]{3} +% \vspace{-\baselineskip} +% Le |\hspace{-0.5em}| devant \texttt{+} a pour effet de décaler le $+$ affiché +% vers la gauche afin de le recentrer. +% En effet, les macros |\limg| et |limd| placent les valeurs dans des boîtes de largeur +% nulle (grâce à la commande |\zbox|, voir section \ref{cmd-pos}). +% De ce fait, le contenu d'une colonne valeur (qui a une largeur fixe) +% peut déborder en largeur +% et empiéter sur la colonne intervalle contiguë. +% C'est le cas ici avec le $+\infty$. +% +% Pour la légende de la fonction, nous aurions pu utiliser |\mil| à la place de |\pos*{2}|. +% La différence est que |\mil| affiche son contenu dans une boîte de hauteur nulle +% et n'agrandit donc pas la ligne correspondante du tableau. Avec |\pos*{2}|, +% la seconde ligne des variations est légèrement plus haute. +% \hypertarget{ZItype}{} +% +% \medskip +% \DescribeMacro{ZItype} +% Le type de rendu est défini par l'option \texttt{ZItype} qui peut prendre +% deux valeurs : \texttt{c}, pour une zone interdite colorée, ou \texttt{h} (par défaut), +% pour une zone interdite hachurée. +% +%\[\begin{tablvar}[ZItype=c,intervalwidth=3.5em]{3} % \hline -% x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} && -% \zbox{\frac{\sqrt{2}}{2}} && +\infty \\ +% x & -\infty && -1 && 1 && +\infty \\ % \hline -% \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\ +% -\frac{x}{\strut\sqrt{x^2-1}^3} && + & \bb & \ZI & \bb & - & \\ % \hline -% \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}} -% & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty} -% } +% \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && +% \limg{1}{+\infty} \bb & \ZI & +% \bb \limd{1}{+\infty} && \bas{0} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] +% +% Dans la légende de la deuxième ligne, le dénominateur a été légèrement +% agrandi en hauteur, grâce à la commande \LaTeX\ |\strut|, afin d'éviter que +% l'exposant 3 de la racine carrée n'arrive au contact de la +% barre de fraction (mais ceci n'a rien à voir en fait avec les tableaux de variations). % \begin{verbatim} -%\begin{tablvar}[3em]{3} +%\[\begin{tablvar}[ZItype=c,intervalwidth=3.5em]{3} % \hline -% x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} && -% \zbox{\frac{\sqrt{2}}{2}} && +\infty \\ +% x & -\infty && -1 && 1 && +\infty \\ % \hline -% \frac{2x}{\sqrt{2x^2-1}} && - & \bb & \ZIc & \bb & + & \\ +% -\frac{x}{\strut\sqrt{x^2-1}^3} && + & \bb & \ZI & \bb & - & \\ % \hline -% \variations{\mil{\sqrt{2x^2-1}} & \haut{+\infty} && \zbox[r]{\bas{0}} -% & \ZIc & \zbox[l]{\bas{0}} && \haut{+\infty} -% } +% \variations{\pos*{2}{\dfrac{1}{\sqrt{x^2-1}}} & \bas{0} && +% \limg{1}{+\infty} \bb & \ZI & +% \bb \limd{1}{+\infty} && \bas{0} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} +% \hypertarget{ZIcolor}{} +% +% \vspace{-\baselineskip} +% \DescribeMacro{ZIcolor} +% Pour une zone interdite colorée, la couleur peut être modifiée avec l'option +% \texttt{ZIcolor}. On peut utiliser les noms de couleur prédéfinis +% ou créer son propre nom de couleur, +% par exemple |\definecolor{redblue}{rgb}{0.1,0.3,0.7}| +% \footnote{Le rectangle coloré est affiché en transparence +% afin de laisser voir les traits sous-jacents. +% Il arrive que la compilation \LaTeX\ + dvips + ps2pdf +% n'affiche pas cette transparence, +% ce qui semble être dû à un bug dans certaines versions de Ghostscript. +% Dans ce cas la solution est de compiler avec \XeLaTeX. +% La compilation pdf\LaTeX\ avec l'option \texttt{tikz} ne pose pas ce problème.} % -% \DescribeMacro{\ZIh}% -% Voyons à présent la réalisation de tableaux avec zones interdites hachurées. -% On place la commande |\ZIh| dans les intervalles que l'on veut hachurer. -%\[ -%\begin{tablvar}{3} +%\[\begin{tablvar}[ZItype=c,ZIcolor=green,ZIaddwidth=1pt]{3} % \hline -% x & -\infty & & \zbox{-\frac{\sqrt{2}}{2}}& & -% \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\ +% x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\ % \hline -% f'(x) & & - & \bb & \ZIh & \bb & + & \\ +% \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb & + & \\ % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} & -% \ZIh & \bas{0} && \haut{+\infty} -% } +% \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre +% & \ZI & \bas{0} \barre && \haut{+\infty} } % \hline -%\end{tablvar} -%\] -% Pour les mêmes raisons que précédemment, les |\zbox| sont toujours -% nécessaires sur la ligne des $x$, mais plus pour les 0. +%\end{tablvar}\] +% +% Ici nous avons agrandi spécifiquement la seconde ligne, contenant la fraction +% avec radical, grâce à la commande |\cstrut| +% de l'extension \textsf{spacingtricks}~\cite{SPA}. +% Cette commande permet de garantir une \emph{profondeur} et une \emph{hauteur} données, +% symétriques de part et d'autre de la ligne de centrage mathématique. +% \label{vstrut}\hypertarget{ZIaddwidth}{} +% +% \DescribeMacro{ZIaddwidth} +% L'option \texttt{ZIaddwidth} permet d'ajuster finement la largeur +% des zones interdites. On a ajouté \texttt{1pt} ce qui donne un rendu un peu meilleur +% lorsque la zone interdite est encadrée de barres simples et non de double barres. % \begin{verbatim} -%\begin{tablvar}{3} +%\[\begin{tablvar}[ZItype=c,ZIcolor=green,ZIaddwidth=1pt]{3} % \hline -% x & -\infty && \zbox{-\frac{\sqrt{2}}{2}} && -% \zbox{\frac{\sqrt{2}}{2}} & & +\infty \\ +% x & -\infty && -\frac{\sqrt{2}}{2} && \frac{\sqrt{2}}{2} && +\infty \\ % \hline -% f'(x) && - & \bb & \ZIh & \bb & + & \\ +% \frac{2x}{\sqrt{2x^2-1}} \cstrut{2.5ex} && - & \bb & \ZI & \bb +% & + & \\ % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} & -% \ZIh & \bas{0} && \haut{+\infty} } +% \variations{ \mil{\sqrt{2x^2-1}} & \haut{+\infty} && \bas{0} \barre +% & \ZI & \bas{0} \barre && \haut{+\infty} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} % -% \DescribeMacro{\ZIh\oarg{hauteur}} -% Les hachures s'ajustent automatiquement lorsque toutes les lignes -% ont une hauteur standard. -% Si par contre des lignes sont plus hautes à cause de leur contenu, -% on doit ajouter de la hauteur avec \cmd{\ZIh}\oarg{hauteur} (réglage manuel). -%\[ -%\begin{tablvar}[3.5em]{3} +% Si des extrema de grande taille sont placés dans la partie variations, +% il est nécessaire de modifier la hauteur des lignes, +% pour éviter de toucher le filet horizontal (au-dessus ou en-dessous) +% \footnote{L'extension \textsf{tabularray}~\cite{TABUL} de Jianrui Lyu permettra +% éventuellement une gestion automatisée des hauteurs de ligne dans une version future.}. +% Cette modification peut se faire +% avec \texttt{stretch} ou avec |\vstrut|\oarg{depth}\marg{height} +% \emph{qu'il faut placer dans la toute 1\iere colonne} pour +% que |\ZI| prenne en compte sa hauteur. +% Dans l'exemple suivant, \texttt{stretch=2.2} aurait donné le même résultat pour +% les variations mais une ligne des $x$ plus haute. +% +%\[\begin{tablvar}[4em]{4} % \hline -% x & -\infty & &\zbox{-1} &&\zbox{1} & & +\infty \\ -% \hline -% f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\ +% x & -\infty && -1 && 0 && 1 && +\infty \\ % \hline -% \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}} -% & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex] -% & \zbox{\bas{0}} \barre && \haut{1} -% } +% \variations{ \mil{f(x)} \vstrut[2ex]{4.5ex} & \haut{+\infty} && +% \limg{3}{-\infty} \bb & \ZI & \bb \limd{3}{-\infty} && +% \haut{\dfrac{\e^{-1}}{2}} && \bas{0} } % \hline -%\end{tablvar} -%\] -% On remarquera ici l'utilisation de |\barre| dans la partie variations qui -% oblige à placer le 0 dans une |\zbox| sans quoi la barre serait décalée après le 0. +%\end{tablvar}\] % \begin{verbatim} -%\begin{tablvar}[3.5em]{3} +%\[\begin{tablvar}[4em]{4} % \hline -% x & -\infty & &\zbox{-1} && \zbox{1} && +\infty \\ -% \hline -% f'(x) && \hspace{-1em} + & \bb & \ZIh & \bb & \hspace{1em} - & \\ +% x & -\infty && -1 && 0 && 1 && +\infty \\ % \hline -% \variations{ \mil{\sqrt{\dfrac{x-1}{x+1}}} -% & \bas{1} && \zbox[r]{\haut{+\infty}} \bb & \ZIh[2ex] -% & \zbox{\bas{0}} \barre && \haut{1} -% } +% \variations{ \mil{f(x)} \vstrut[2ex]{4.5ex} & \haut{+\infty} && +% \limg{3}{-\infty} \bb & \ZI & \bb \limd{3}{-\infty} && +% \haut{\dfrac{\e^{-1}}{2}} && \bas{0} } % \hline -%\end{tablvar} +%\end{tablvar}\] % \end{verbatim} % -% Voici un exemple avec deux zones interdites. On considère la fonction $f$ telle que -% $f(x)= \sqrt{(x^2-1)(x^2-4)}$. -%{ \footnotesize -%\[ -%\begin{tablvar}{6} +% On peut créer jusqu'à 4 zones interdites sur des colonnes différentes, +% comme pour les discontinuités. +% Voici un tableau contenant deux zones interdites, avec +% \[ f(x)= \sqrt{(x^2-1)(x^2-4)} +% \quad\mbox{et}\quad +% f'(x) = \frac{x(2x^2-5)}{f(x)}.\] +%{ \small +%\[\begin{tablvar}[2.5em]{6} % \hline -% x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} -% && +\infty \\ +% x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\ % \hline -% 2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\ +% x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & \barre &+& \\ % \hline -% 2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre && +% 2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI & % \barre &+& \\ % \hline -% f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\ +% f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\ % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre -% & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}} -% \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty} -% } +% \variations{ \mil{f(x)} & \haut{+\infty} && \bas{0} \barre +% & \ZI & \bas{0} \barre && \haut{2} && \bas{0} +% \barre & \ZI & \bas{0} \barre && \haut{+\infty} } % \hline -%\end{tablvar} -%\] +%\end{tablvar}\] %} -% La commande |\ZIh| \emph{ne doit pas être placée deux fois dans une même ligne de signe} -% car, sauf sur la dernière ligne des variations où elle trace les hachures, -% son effet est simplement de cumuler la hauteur de la ligne. -% Et comme toutes les lignes de signes ont le même numéro 0, la commande |\ZIh|, -% dans la partie signes, ne sait pas sur quelle ligne elle se trouve -% et cumule la hauteur de ligne à chaque appel. % \begin{verbatim} -%\begin{tablvar}{6} +%{ \small \[\begin{tablvar}[2em]{6} % \hline -% x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} -% && +\infty \\ +% x & -\infty && -2 && -1 && 0 && 1 && 2 && +\infty \\ % \hline -% 2x & &-& \barre & \ZIh &\barre &-& \barre[0] &+& \barre && \barre &+&\\ +% x & &-& \barre & \ZI & \barre &-& \barre[0] &+& \barre & \ZI & +% \barre &+& \\ % \hline -% 2x^2-5 & &+& \barre & \ZIh & \barre &-& \barre &-& \barre && +% 2x^2-5 & &+& \barre & \ZI & \barre &-& \barre &-& \barre & \ZI & % \barre &+& \\ % \hline -% f'(x) & &-& \bb & \ZIh & \bb &+& \barre[0] &-& \bb && \bb &+& \\ +% f'(x) & &-& \bb & \ZI & \bb &+& \barre[0] &-& \bb & \ZI & \bb &+& \\ % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \zbox{\bas{0}} \barre -% & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{2} && \zbox{\bas{0}} -% \barre & \ZIh[0.4ex] & \zbox{\bas{0}} \barre && \haut{+\infty} -% } +% \variations{ \mil{f(x)} & \haut{+\infty} && \bas{0} \barre +% & \ZI & \bas{0} \barre && \haut{2} && \bas{0} +% \barre & \ZI & \bas{0} \barre && \haut{+\infty} } % \hline -%\end{tablvar} +%\end{tablvar}\] } % \end{verbatim} % -% \DescribeMacro{\ZIh*} -% Lorsqu'on ne fait qu'un tableau de signes (sans variations), -% il faut utiliser la commande |\ZIh*| pour déclencher le tracé des hachures. -% Celle-ci doit être placée sur la dernière ligne de chaque bloc de hachures. -% Sur les lignes précédentes, le |\ZIh| peut être placé n'importe où -% (une seule fois par ligne). +% \DescribeMacro{\hachure} +% Lorsque l'on dessine des zones interdites hachurées +% sur plusieurs colonnes contiguës, +% les hachures seront en général discontinues. +% Pour pallier cela, on peut +% utiliser la primitive graphique |\hachure| +% qui permet de définir manuellement le rectangle à hachurer. +% L'exemple suivant montre les deux solutions. % %{ \footnotesize -%\[ -%\begin{tablvar}{6} +%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8} % \hline -% x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} -% && +\infty \\ +% x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1 +% && 0 && 1 && \sqrt{\frac{5}{2}} && 2 && +\infty \\ % \hline -% 2x & &-& \barre && \barre &-& \barre[0] &+& \barre && -% \barre{} &+& \ZIh \\ +% 2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+& +% \barre &+& \barre &+& \barre &+& \\ % \hline -% 2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre && -% \barre{} &+& \ZIh \\ +% 2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-& +% \barre &-& \barre[0] &+& \barre &+& \\ % \hline -% f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\ +% f'(x) & &-& \bb & \ZI & \barre & \ZI & \bb &+& +% \barre[0] &-& \bb & & & & \bb & + & \\ % \hline -%\end{tablvar} -%\] -%} +% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0}\barre & \ZI & +% \barre & \ZI & \bas{0}\barre && \haut{2} && \bas{0}\barre \discont +% && \pos*{3}{\hachure{-4.3em,16.4ex}{4.3em,-1.4ex}} && +% \bas{0}\barre && \haut{+\infty} } +% \hline +%\end{tablvar} \] } +% +% Pour hachurer une zone donnée, la commande |\hachure| peut être placée où l'on veut +% dans le tableau, il suffit de donner les coordonnées du rectangle visé à +% partir de la position courante (réglage manuel). +% Dans la partie variations, il faut mettre la commande |\hachure| dans un |\pos*|, +% sinon elle sera répétée pour chaque ligne des variations. +% Ce problème de discontinuité des lignes ne se pose pas avec des zones interdites colorées. % \begin{verbatim} -%\begin{tablvar}{6} +%{ \footnotesize +%\[ \begin{tablvar}[intervalwidth=1.8em,ZIaddwidth=1pt]{8} % \hline -% x & -\infty && \zbox{-2} && \zbox{-1} && 0 && \zbox{1} && \zbox{2} -% && +\infty \\ +% x & -\infty && -2 && -\sqrt{\frac{5}{2}} && -1 +% && 0 && 1 && \sqrt{\frac{5}{2}} && 2 && +\infty \\ % \hline -% 2x & &-& \barre & & \barre &-& \barre[0] &+& \barre && -% \barre{} &+& \ZIh \\ +% 2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+& +% \barre &+& \barre &+& \barre &+& \\ % \hline -% 2x^2-5 & &+& \barre & & \barre &-& \barre &-& \barre && -% \barre{} &+& \ZIh \\ +% 2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-& +% \barre &-& \barre[0] &+& \barre &+& \\ % \hline -% f'(x) & &-& \bb & \ZIh* & \bb &+& \barre[0] &-& \bb & \ZIh* & \bb &+&\\ +% f'(x) & &-& \bb & \ZI & \barre & \ZI & \bb &+& +% \barre[0] &-& \bb & & & & \bb & + & \\ % \hline -%\end{tablvar} +% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0}\barre & \ZI & +% \barre & \ZI & \bas{0}\barre && \haut{2} && \bas{0}\barre \discont +% && \pos*{3}{\hachure{-4.3em,16.4ex}{4.3em,-1.4ex}} && +% \bas{0}\barre && \haut{+\infty} } +% \hline +%\end{tablvar} \] } % \end{verbatim} % -% Si on veut tracer des rectangles de hachures sur des lignes non contiguës, -% il faut un appel à |\ZIh*| pour chaque rectangle. -%\[ -%\begin{tablvar}{4} +% \medskip +% \DescribeMacro{\ZI*} +% Dans un tableau de signes sans partie variations, +% il faut utiliser la commande |\ZI*| pour déclencher le tracé des hachures +% (ou de la zone colorée) +% \footnote{La commande \texttt{\bslash ZI} ne déclenche le tracé que sur +% la dernière ligne des variations et pas dans les lignes de signes ; +% les occurrences de \texttt{\bslash ZI} qui précèdent ne font que cumuler la hauteur.}. +% Celle-ci doit être placée sur la dernière ligne de chaque bloc de hachures +% \footnote{Un appel à \texttt{\bslash ZI*} dans chaque cellule ne permettrait pas +% de garantir la continuité des hachures.}. +% +%\[\begin{tablvar}{4} % \hline -% x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && -% +\infty \\ -% \hline -% \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\ +% x & -\infty && -1 && 1 && 2 && +\infty \\ % \hline % x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\ % \hline -% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & +% \sqrt{x^2-1} && + & \barre[0] & \ZI & \barre[0] & + & \barre & + & \\ +% \hline +% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & % \barre[0] & + & \\ % \hline -%\end{tablvar} -%\] -% \smallskip +%\end{tablvar}\] % \begin{verbatim} -%\begin{tablvar}{4} +%\[\begin{tablvar}{4} +% \hline +% x & -\infty && -1 && 1 && 2 && +\infty \\ +% \hline +% x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\ % \hline -% x & -\infty && \zbox{-1}\phantom{0} && \zbox[l]{1}\phantom{0} && 2 && -% +\infty \\ +% \sqrt{x^2-1} && + & \barre[0] & \ZI & \barre[0] & + & \barre & + & \\ % \hline -% \sqrt{x^2-1} && + & \barre[0] & \ZIh* & \barre[0] & + & \barre & + &\\ +% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & +% \barre[0] & + & \\ +% \hline +%\end{tablvar}\] +% \end{verbatim} +% +% Pour tracer des rectangles de hachures ou des zones colorées +% sur des lignes non contiguës, dans un tableau de signes, +% il faut un appel à |\ZI*| pour déclencher le tracé de chaque rectangle. +% +%\[\begin{tablvar}{4} +% \hline +% x & -\infty && -1 && 1 && +% 2 && +\infty \\ +% \hline +% \sqrt{x^2-1} && + & \barre[0] & \ZI* & \barre[0] & + & \barre & + & \\ % \hline % x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\ % \hline -% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZIinit\ZIh* & \barre[0] & - & +% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & % \barre[0] & + & \\ % \hline -%\end{tablvar} +%\end{tablvar}\] +% +% \begin{verbatim} +%\[\begin{tablvar}{4} +% \hline +% x & -\infty && -1 && 1 && 2 && +\infty \\ +% \hline +% \sqrt{x^2-1} && + & \barre[0] & \ZI* & \barre[0] & + & \barre & + & \\ +% \hline +% x-2 && - & \barre & - & \barre & - & \barre[0] & + & \\ +% \hline +% (x-2)\sqrt{x^2-1} && - & \barre[0] & \ZI* & \barre[0] & - & +% \barre[0] & + & \\ +% \hline +%\end{tablvar}\] % \end{verbatim} -% \vspace{-3ex} -% Ci-dessus, la commande \LaTeX\ |\phantom{0}| sur la ligne des $x$ permet de créer une -% boite fantôme de la largeur du 0, pour éviter que la largeur de la colonne -% valeur ne soit complètement nulle produisant un chevauchement inélégant -% des 0 sur les hachures.\\ -% \DescribeMacro{\ZIinit} -% L'appel à |\ZIinit| sur la dernière ligne permet de ne pas -% conserver la hauteur cumulée lors du précédent appel à |\ZIh*| -% (en fait inutile ici car la 1ère zone hachurée ne fait qu'une seule ligne de haut). +% +% \subsection{Options et réglages}\label{options} +% +% Comme indiqué dans l'introduction, l'extension \textsf{tablvar} possède deux options, +% \texttt{pstricks} ou \texttt{tikz}, pour choisir la méthode graphique +% utilisée. Ce sont les seules options reconnues à l'appel |\usepackage|. % % \medskip -% \DescribeMacro{\hachure} -% On ne peut pas dessiner des zones interdites hachurées -% sur plusieurs colonnes contiguës avec |\ZIh|, -% mais on peut alors utiliser la primitive graphique |\hachure| -% pour définir manuellement le rectangle à hachurer. +% \DescribeMacro{\tablvarset\marg{keyval}} +% Mais les environnements \texttt{tablvar} et \texttt{tablvar*} possèdent également +% un jeu de paramètres qui peuvent être définis de manière globale +% (ou locale dans un environnement ou un groupe |{...}|), +% avec des variables spécifiques +% ou (depuis la version 2.0) avec la commande |\tablvarset|\marg{keyval}, +% utilisant le mécanisme \emph{clé=valeur}. +% +% \DescribeEnv{tablvar\oarg{keyval}}\DescribeEnv{tablvar*\oarg{keyval}} +% Ces paramètres peuvent aussi être réglés localement, +% indépendamment des valeurs globales, +% en tant qu'options d'un environnement +% \texttt{tablvar}\oarg{keyval}\marg{num} +% (ou \texttt{tablvar*}), avec la même syntaxe \emph{clé=valeur}. % -%{ \footnotesize -%\[ -%\begin{tablvar}{8} +% \medskip +% Le tableau suivant résume les options disponibles, précise leur valeur par défaut +% et les variables de réglage spécifiques (longueurs, booléens, etc.) +% auxquelles elles sont associées et qui peuvent aussi être modifiées directement. +% Les liens hypertextes (en bleu) renvoient vers un exemple dans la documentation. +% +% \begin{center}\ttfamily +% \setlength{\extrarowheight}{1pt} +% \begin{tabular}{lcl} +% \hline +% \textsf{Option} & \textsf{Valeur par défaut} & +% \textsf{Variable associée} \\ +% \hline +% \hyperlink{intervalwidth}{intervalwidth} & 3em & |\intervalwidth| \\ +% \hyperlink{colvalwidth}{colvalwidth} & 2em & |\colvalwidth| \\ +% \hyperlink{firstcolsep}{firstcolsep} & 5pt & |\firstcolsep| \\ +% \hyperlink{bordercolsep}{bordercolsep} & 2pt & |\bordercolsep| \\ +% \hyperlink{limsep}{limsep} & 1pt & |\limsep| \\ +% \chline +% \hyperlink{stretch}{stretch} & 1.6 & |\tablvarstretch| \\ +% \chline +% \hyperlink{ext}{extleft} & false & extleft \\ +% \hyperlink{ext}{extright} & false & extright \\ +% \chline +% \hyperlink{ZItype}{ZItype} & h & |\ZItype| \\ +% \hyperlink{ZIcolor}{ZIcolor} & gray & ZIcolor \\ +% \hyperlink{ZIaddwidth}{ZIaddwidth} & 0pt & |\ZIaddwidth| \\ +% \hline +% \end{tabular} +% \end{center} +% Le premier groupe de paramètres ci-dessus gère les largeurs de colonnes +% et les espacements horizontaux : +% \begin{description} +% \item[\texttt{intervalwidth}] règle la largeur des colonnes \og intervalles\fg. +% \item[\texttt{colvalwidth}] définit la largeur des colonnes de valeurs ; +% il est rarement utile de modifier ce paramètre car lorsqu'une valeur est trop +% large, elle peut déborder dans les colonnes intervalles adjacentes ; +% la valeur par défaut est légèrement plus grande qu'un infini avec un signe. +% \item[firstcolsep] définit l'espace de séparation par rapport aux filets verticaux +% autour de la première colonne (légendes). +% \item[bordercolsep] définit l'espace de séparation à gauche de la première +% et à droite de la dernière colonne de valeurs, par rapport aux filets verticaux. +% \item[limsep] règle l'espace de séparation à gauche ou à droite d'une limite. +% \end{description} +% La hauteur des lignes se règle avec : +% \begin{description} +% \item[stretch] qui est un facteur d'élasticité verticale agissant sur toutes +% les lignes du tableau +% \footnote{Pour ajuster la hauteur d'une ligne particulière, on dispose de la +% macro \texttt{\textbackslash vstrut}\oarg{depth}\marg{height} +% (du package \textsf{spacingtricks}~\cite{SPA}), +% où \meta{depth} désigne la \emph{profondeur} et \meta{height} la \emph{hauteur} +% minimales à atteindre par rapport à la ligne de \emph{base}, +% ou encore de \texttt{\bslash cstrut}\marg{height} qui garantit une hauteur minimale +% en-dessous et au-dessus de la ligne de centrage mathématique.} ; +% une valeur de 1 correspond à la valeur standard +% d'un environnement \texttt{array}. +% \end{description} +% Les deux paramètres suivants règlent l'alignement des valeurs dans les colonnes +% aux extrémités du tableau : +% \begin{description} +% \item[extleft] aligne les valeurs à gauche dans la première colonne ; +% l'effet est adéquat lorsqu'il y a une double barre à l'extrémité gauche. +% \item[extright] aligne les valeurs à droite dans la dernière colonne, +% adéquat pour une double barre à l'extrémité droite ; +% l'environnement \texttt{tablvar*} fixe \texttt{extleft} +% et \texttt{extright} à \texttt{true}. +% \end{description} +% Enfin le dernier groupe de paramètres gère l'aspect des zones interdites : +% \begin{description} +% \item[ZYtype] peut prendre deux valeurs : \texttt{h} pour une zone interdite hachurée +% ou \texttt{c} pour une zone interdite colorée. +% \item[ZIcolor] définit la couleur des zones interdites colorées qui doit être +% un nom de couleur déjà définie ; ce paramètre +% est sans effet si \texttt{ZItype=h}. +% \item[ZIaddwidth] permet de jouer sur un réglage fin de la largeur des zones interdites ; +% la manière dont les zones interdites arrivent au contact des barres ou double barres +% peut s'ajuster en faisant varier cette valeur (de $\pm$\texttt{1pt}). +% \end{description} +% +% \medskip +% \DescribeEnv{\texttt{tablvar}\oarg{largeur}} +% L'argument optionnel des +% environnements \texttt{tablvar} et \texttt{tablvar*} peut également être +% une simple dimension (à condition qu'il n'y ait aucune autre option), +% qui sera alors interprétée +% comme la largeur donnée à \texttt{intervalwidth}. +% +% \medskip +% Le rendu des commandes graphiques peut également être modifié, +% en redéfinissant ces commandes, en particulier |\fleche|, |vrconnect| et |\hachure| +% grâce aux nombreuses options offertes par PSTricks ou \TikZ. +% C'est le cas aussi de l'aspect des filets et barres du tableau qui sont définis +% par les commandes |\tvrulewidth| (\texttt{0.4pt} par défaut), +% |\tvbarrewidth| (\texttt{0.5pt} par défaut), +% \texttt{tvbarrecolor} (|{gray}{0.7}| par défaut) +% et |\bbrulewidth| (\texttt{0.4pt} par défaut). +% Cette redéfinition sera locale si on la place dans l'environnement math du tableau. +% +% Ci-dessous des flèches plus grasses, plus proches des nœuds et dont la pointe est +% plus effilée, codé ici pour PSTricks +% (voir le code section \ref{graph} pour les commandes \TikZ). +% L'épaisseur des filets du tableau et des barres a été doublée, la +% couleur de la barre traversant 0 a été modifiée +% et les infinis ont été \og collés\fg aux bords avec \texttt{bordercolsep=-1pt}. +% \[ \renewcommand{\fleche}{\ncline[linewidth=0.8pt,arrowsize=2pt 3, +% arrowinset=0.5,nodesep=2pt]{->}} +% \setlength{\tvrulewidth}{0.8pt} +% \setlength{\bbrulewidth}{0.8pt} +% \setlength{\tvbarrewidth}{1pt} +% \definecolor{tvbarrecolor}{named}{cyan} +%\begin{tablvar}[intervalwidth=4em,bordercolsep=-1pt]{3} % \hline -% x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} -% && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\ +% x & -\infty && -2 && 0 && +\infty \\ % \hline -% 2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+& -% \barre &+& \barre &+& \barre &+& \\ +% -\frac{x+2}{x^4} && - & \barre[0] & + & \bb & - & \\ % \hline -% 2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-& -% \barre &-& \barre[0] &+& \barre &+& \\ +% \variations{\mil{\e^{\frac{x+1}{x^2}}} & \haut{1} && \bas{\e^{-\frac{1}{4}}} +% && \bblim{1}{+\infty}{1}{+\infty} && \bas{1} } % \hline -% f'(x) & &-& \bb & & \hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+& -% \barre[0] &-& \bb & & & & \bb & + & \\ +%\end{tablvar} \] +% \begin{verbatim} +%\[ \renewcommand{\fleche}{\ncline[linewidth=0.8pt,arrowsize=2pt 3, +% arrowinset=0.5,nodesep=1.5pt]{->}} +%\setlength{\tvrulewidth}{0.8pt} +%\setlength{\bbrulewidth}{0.8pt} +%\setlength{\tvbarrewidth}{1pt} +%\definecolor{tvbarrecolor}{named}{cyan} +%\begin{tablvar}[intervalwidth=4em,bordercolsep=-1pt]{3} % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont && && -% \bas{0} && \haut{2} && \bas{0} \discont && -% \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && -% \haut{+\infty} -% } +% x & -\infty && -2 && 0 && +\infty \\ % \hline -%\end{tablvar} -%\] -%} -% Si l'on ne dispose pas de ligne de signe pour placer la commande |\hachure|, -% on peut la placer sur la ligne des $x$ ou dans la partie variations mais -% il faut alors mettre celle-ci dans un |\pos*| sinon elle sera répétée pour chaque -% ligne des variations. +% -\frac{x+2}{x^4} && - & \barre[0] & + & \bb & - & \\ +% \hline +% \variations{\mil{\e^{\frac{x+1}{x^2}}} & \haut{1} && +% \bas{\e^{-\frac{1}{4}}} && \bblim{1}{+\infty}{1}{+\infty} && +% \bas{1} } +% \hline +%\end{tablvar} \] +% \end{verbatim} +% +% \subsection{Nouveautés de la version 2.0} +% +% Cette version présente de nombreuses nouveautés : +% \begin{itemize} +% \item \emph{Il n'y a plus d'option par défaut} à l'appel de l'extension. +% C'était \texttt{pstricks} dans les versions précédentes. +% Dorénavant, si aucune option n'est précisée, l'extension choisira elle-même +% en fonction du compilateur utilisé, donc \texttt{tikz} pour le moteur pdf\LaTeX\ +% qui ne supporte pas le code PSTricks. +% +% \item \emph{Les colonnes de valeurs ont des largeurs fixes (\texttt{2em} par défaut)} +% et non plus variables en fonction du contenu, comme c'était le cas jusqu'à la version +% 1.2. L'avantage est d'améliorer le centrage pour les signes, +% lorsque les colonnes de valeurs ont des largeurs très différentes, +% et surtout d'éviter le recours à des |\zbox| pour les colonnes de valeurs +% bordant les zones interdites. +% +% \item Le paramètre |\innercolsep| qui gère l'espacement entre les colonnes valeurs +% et les colonnes intervalles, valait \texttt{4pt} +% et a été fixé à \texttt{0pt} car, en l'absence de filets verticaux, +% il ne sert plus à rien avec les colonnes à largeur fixe. +% Mais, en contrepartie, \emph{la valeur par défaut de} |\intervalwidth| +% \emph{a été augmentée de \texttt{2.5em} à \texttt{3em}}. +% +% \item Les réglages peuvent désormais être effectués, +% avec la syntaxe \emph{clé = valeur} et la commande |\tablvarset|, +% ou comme options des environnements \texttt{tablvar} et \texttt{tablvar*}. +% +% \item Un nouveau paramètre |\firstcolsep| (ou l'option \texttt{firstcolsep}) +% permet d'élargir la colonne des légendes. +% +% \item Deux options permettent d'aligner de manière différenciée +% la première colonne de valeurs à gauche (\texttt{extleft}) +% \emph{ou} la dernière à droite (\texttt{extright}) contrairement +% à l'environnement \texttt{tablvar*} qui fait obligatoirement les deux. +% +% \item Le paramètre |\tablvarstetch| (géré par l'option \texttt{stretch}) +% a été augmenté de \texttt{1.4} à \texttt{1.6}. +% +% \item Une nouvelle macro |\posvr| permet de définir conjointement +% un nœud pour les flèches \emph{et} pour les valeurs remarquables. +% +% \item Deux nouvelles macros |\limg| et |\limd| gèrent désormais le bon positionnement +% des limites à gauche et à droite, en particulier au bord des doubles barres +% (en plus de |\bblim|) et surtout au bord des zones interdites. +% Le recours explicite à |\zbox| n'est plus nécessaire. +% +% \item Un nouveau paramètre |\limsep| permet d'ajuster la proximité des +% limites avec les doubles barres. +% +% \item Les zones interdites sont, à présent, définies par une unique commande |\ZI|, +% avec une option \texttt{ZItype}. Les anciennes commandes |\ZIh|, pour les zones +% interdites hachurées, ou |\ZIc|, pour les zones interdites colorées, ne sont plus utiles, +% mais elles ont été conservées et permettraient, par exemple, de dessiner +% dans un même tableau une zone interdite hachurée et une autre colorée, +% même si cela ne viendrait à l'esprit de personne. +% +% \item Il n'y a, en principe, plus besoin d'ajustement de hauteur des zones interdites +% avec un paramètre optionnel |\ZI|\oarg{height}, lorsque des contenus de grande hauteur +% sont placés dans la colonne des légendes. +% Néanmoins ce paramètre a (pour l'instant) été conservé, +% pour faire éventuellement de micro-ajustements. +% +% \item On peut désormais régler l'épaisseur des filets verticaux et double barres +% avec |\tvrulewidth| et |\bbrulewidth|. +% +% \item Le type de colonne \texttt{i}, utilisé pour les colonnes intervalles, +% est maintenant interne à l'environnement \texttt{tablvar} +% et il n'y a donc plus de risque d'incompatibilité avec une autre extension +% qui utiliserait ce même identifiant comme type de colonne. +% De nouveaux types de colonnes ont été définis pour les valeurs et légendes, +% mais sont également internes à l'environnement \texttt{tablvar}. +% +% \item Les macros |\haut|, |\bas| et |\mil| peuvent à présent être utilisées +% même lorsque le nombre de lignes de variations est différent de 3. +% Dans ce cas, commande |\mil| calcule automatiquement le décalage vertical ; +% l'utilisateur n'a plus besoin d'un appel explicite à |\vdecal|. +% \end{itemize} +% +% \medskip +% Des problèmes de composition peuvent apparaître avec des tableaux +% réalisés antérieurement à la version 2.0, en particulier +% pour les limites au bord des doubles barres, +% lorsque l'on n'utilise ni |\bblim|, ni \texttt{tablvar*}. +% S'il apparaît une limite positionnée par dessus une double barre, +% il suffit de remplacer les |\zbox| utilisées antérieurement par |\limg| ou |\limd|. +% D'autre part, les ajouts de hauteur qui peuvent avoir été utilisés comme argument +% optionnel de |\ZIh| ou |\ZIh*| sont à éliminer. +% +% \subsection{Comparatif avec les autres extensions}\label{comparatif} +% +% Le dépôt d'archives CTAN (Comprehensive \TeX\ Archive Network) contient +% quelques autres extensions dédiées à la réalisation de tableaux de variations, +% dans la rubrique \og Maths tabvar \fg. +% Nous les décrivons ici brièvement. +% \begin{description} +% \item[tableaux] de Nicolas Kisselhoff~\cite{TABL}. +% Propose un pseudo-code PSTricks, +% certainement plus commode que d'écrire toutes les commandes PSTricks. + +% \item[tabvar] de Daniel Flipo~\cite{TABV}, +% l'auteur, entre-autres de \textsf{babel-french}, +% extension bien connue de tous les utilisateurs francophones de \LaTeX. +% Permet de réaliser des tableaux plutôt symboliques. +% Voici un tableau simple et son code \textsf{tabvar}. \\ +% \begin{minipage}[t]{7cm} % \begin{verbatim} -%\begin{tablvar}{8} +%\[\begin{tabvar}{|C|CCCCR|} % \hline -% x & -\infty && \zbox{-2} && \zbox{-\sqrt{\frac{5}{2}}} && \zbox{-1} -% && 0 && 1 && \zbox{\sqrt{\frac{5}{2}}} && 2 && +\infty \\ +% x & 0 & & \frac{1}{2} & & 1 \\ % \hline -% 2x & &-& \barre &-& \barre &-& \barre &-& \barre[0] &+& -% \barre &+& \barre &+& \barre &+& \\ +% f’(x) && + & \barre{0} & - & \\ % \hline -% 2x^2-5 & &+& \barre &+& \barre[0] &-& \barre &-& \barre &-& -% \barre &-& \barre[0] &+& \barre &+& \\ +% \niveau{1}{2}\TVcenter{f(x)} & 0 & \croit +% & \frac{1}{4} & \decroit & 0 \\ % \hline -% f'(x) & &-& \bb & &\hachure{-4em,-12.8ex}{4em,2.6ex} & & \bb &+& -% \barre[0] &-& \bb & & & & \bb & + & \\ +%\end{tabvar}\] +% \end{verbatim} +% \end{minipage} +% \begin{minipage}[t]{5cm} +%\[\begin{tabvar}{|C|CCCCR|} % \hline -% \variations{\mil{f(x)} & \haut{+\infty} && \bas{0} \discont && && -% \bas{0} && \haut{2} && \bas{0} \discont && -% \pos*{3}{\hachure{-4em,14.3ex}{4em,-1.2ex}} && \bas{0} && -% \haut{+\infty} -% } +% x & 0 & & \frac{1}{2} & & 1 \\ % \hline -%\end{tablvar} +% f'(x) && + & \barreFlipo{0} & - & \\ +% \hline +% \niveau{1}{2}\TVcenter{f(x)} & 0 & \croit +% & \frac{1}{4} & \decroit & 0 \\ +% \hline +%\end{tabvar}\] +% \end{minipage} +% +% \item[variations] de Christian Obrecht~\cite{VARI}. Extension vraiment simple d'usage, +% qui a l'avantage d'avoir une documentation très courte. +% Voici un exemple repris de la doc de \textsf{variations} +% (|\mI| et |\pI| désignent $-\infty$ et $+\infty$). +%\[\bvariations +% x & \mI &&& 0 &&& \pI \\ +% \filet +% -\frac{1}{x^2} && - && \bbObrecht && - & \\ +% \filet +% \m{\dfrac{1}{x}} & \h0 & \d & \mI & \bbObrecht & \h\pI & \d & 0 \\ +%\evariations\] +% \begin{verbatim} +%\[\begin{variations} +% x & \mI &&& 0 &&& \pI \\ +% \filet +% -\frac{1}{x^2} && - && \bb && - & \\ +% \m{\dfrac{1}{x}} & \h{0} & \d & \mI & \bb & \h{\pI} & \d & 0 \\ +%\end{variations}\] +% \end{verbatim} +% \item[tablor] de Guillaume Connan~\cite{TABLOR}. +% Permet d'automatiser de manière poussée la composition \emph{et la conception} du tableau +% grâce à la librairie de calcul formel \textsf{Giac/Xcas} (qui doit être installée). +% Il suffit de renseigner l'expression de la fonction, l'intervalle souhaité, +% les éventuelles valeurs interdites. Voici par exemple le code +% pour le tableau de la fonction $g: t \mapsto \frac{t^2}{t^2-1}$ sur $[-10, +\infty[$, +% avec variations et signe de la dérivée, très synthétique ! +% \begin{verbatim} +%\begin{TV} +%TV([-10,+infinity],[-1,1],"g","t",x^2/(x^2-1),1,n,\tv) +%\end{TV} +% \end{verbatim} +% \vspace{-\baselineskip} +% On peut aussi définir un tableau avec simplement deux listes, les antécédents +% et les images, et \textsf{tablor} prend en charge les zones interdites +% (mais pas la continuité des hachures de cellules contiguës). +% On pourra consulter la documentation pour de jolis exemples. +% +% Pour fonctionner, \textsf{tablor} utilise \textsf{tableauVariations.mp} +% de Frédéric Mazoit~\cite{VARMP} qui compose le tableau en \textlogo{METAPOST}. +% \textsf{Xcas} oblige à compiler en mode \texttt{shell-escape} +% pour autoriser les sorties de la compilation \TeX. +% +% \item[tkz-tab] d'Alain Matthes~\cite{TKZ}. +% Une très belle extension qui fait a peu près tout ce que fait \textsf{tablvar} +% et même un peu plus : par exemple tangentes horizontales sur les extrema, +% cellules en couleur. +% Un de ses principaux avantages par rapport à \textsf{tablvar} est de ne pas nécessiter +% de double compilation +% \footnote{La double compilation avec \textsf{tablvar} n'est cependant nécessaire +% qu'avec l'option \texttt{tikz}.}. +% Signalons quelques différences avec \textsf{tablvar} : +% \begin{itemize} +% \item un tableau n'est pas globalement en mode mathématique, il faut donc mettre les +% \$ du mode math autour de chaque valeur, +% \item les hauteurs de ligne doivent être précisées de manière explicite et +% ne peuvent être données qu'en cm (unité fixe qui ne s'ajuste pas à la fonte), +% \item \textsf{tablvar} offre la possibilité de mettre des 0 par dessus les flèches, +% \item les double barres aux extrémités du tableau sont assez éloignées des filets, +% ce qui peut donc laisser un certain blanc sur les bords. +% \end{itemize} +% Voici un exemple illustrant ce dernier point, avec son code. +% Pour comparer, le tableau obtenu avec \textsf{tablvar} +% a été placé dessous avec son code en suivant. +% \begin{verbatim} +%\begin{center}\begin{tikzpicture} +% \tkzTabInit[lgt=1.5,espcl=1.8,deltacl=0.4]% +% {$x$/0.75, $\ln x - x$/2.2}{0, 1, $+\infty$} +% \tkzTabVar{D-/$-\infty$ , +/$-1$ , -/$-\infty$} +%\end{tikzpicture}\end{center} % \end{verbatim} % -% \pagebreak +%\begin{center}\begin{tikzpicture} +% \tkzTabInit[lgt=1.5,espcl=1.8,deltacl=0.4]% +% {$x$/0.75, $\ln x - x$/2.2}{0, 1, $+\infty$} +% \tkzTabVar{D-/$-\infty$ , +/$-1$ , -/$-\infty$} +%\end{tikzpicture}\end{center} +%\[\begin{tablvar*}{2} +% \hline +% x & 0 & & 1 & & +\infty \\ +% \hline +% \variations{ \mil{\ln x -x} & \bb\bas{-\infty} && \haut{-1} && \bas{-\infty} } +% \hline +%\end{tablvar*}\] +% \begin{verbatim} +%\[\begin{tablvar*}{2} +% \hline +% x & 0 & & 1 & & +\infty \\ +% \hline +% \variations{ \mil{\ln x -x} & \bb\bas{-\infty} && \haut{-1} && +% \bas{-\infty} } +% \hline +%\end{tablvar*}\] +% \end{verbatim} +% +% \vspace{-\baselineskip} +% On remarquera que les réglages \textsf{tablvar} sont automatiques et ne nécessitent +% aucune option (si ce n'est l'appel à la version étoilée \texttt{tablvar*}). +% \end{description} +% +% \StopEventually{} +% % \section{Le code} % -% \subsection{Extensions requises et options} +% \subsection{Extensions requises et options du package} % % \begin{macrocode} \RequirePackage{array} \RequirePackage{ifthen} \RequirePackage{multido} -\RequirePackage{colortbl} % pour \ZIc +\RequirePackage{xkeyval} +\RequirePackage{ifpdf} -\newboolean{tikz} -\DeclareOption{tikz}{\setboolean{tikz}{true}} -\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut +\newif\iftv@tikz % false par défaut +\DeclareOption{tikz}{\tv@tikztrue} +\newif\iftv@pstricks +\DeclareOption{pstricks}{\tv@pstrickstrue} \ProcessOptions \relax -\ifthenelse{\boolean{tikz}}{ +\iftv@pstricks + \ifpdf + \PackageError{tablvar}{Don't use the pstricks option with PDF engines}{} + \else + \PackageInfo{tablvar}{PSTricks option is used} + \fi +\else\iftv@tikz + \PackageInfo{tablvar}{tikz option is used. + \MessageBreak + Run twice to draw the arrows correctly} +\else\ifpdf + \PackageWarningNoLine{tablvar}{PDF engine is used, + I'm using the tikz option. + \MessageBreak + Run twice to draw the arrows correctly} + \tv@tikztrue +\else + \PackageWarningNoLine{tablvar}{PDF engines not used, + I'm using the pstricks option} + \tv@pstrickstrue +\fi\fi\fi + +\iftv@tikz \RequirePackage{tikz} \usetikzlibrary{patterns} - \newlength{\tikznode@below} - }{ + \usetikzlibrary{patterns.meta}% pour le paramétrage des hachures +\else % pstricks=true \RequirePackage{pst-node} -} +\fi % \end{macrocode} -% \subsection{Les paramètres généraux} +% \subsection{Les paramètres généraux}\label{param} % % Dans cette section sont présentés tous les paramètres -% que l'on peut redéfinir pour modifier l'aspect des tableaux, -% mais qui n'ont en principe pas besoin d'être touchés. +% que l'on peut redéfinir pour modifier l'aspect des tableaux. % % \begin{macro}{\intervalwidth} % Définit la largeur par défaut des colonnes \og intervalles \fg, -% valeur prédéfinie à 2.5~em. +% valeur prédéfinie à \texttt{3em}. % \begin{macrocode} \newlength{\intervalwidth} -\setlength{\intervalwidth}{2.5em} % largeur des "intervalles" +\setlength{\intervalwidth}{3em} % largeur des "intervalles" % \end{macrocode} % \end{macro} -% \begin{macro}{\bordercolsep} -% Définit la largeur de l'espace extérieur des première et dernière colonnes de valeurs. -% Sa valeur par défaut a été réduite par rapport à la longueur \LaTeX\ standard -%|\arraycolsep| afin que les valeurs des extrémités (souvent des $\infty$) -% soient plus proches des lignes verticales de début et de fin. +% \begin{macro}{\colvalwidth} +% Définit la largeur des colonnes de valeurs, +% valeur prédéfinie à \texttt{2em}. % \begin{macrocode} -\newlength{\bordercolsep} % largeur de l'espace inter-colonne -\setlength{\bordercolsep}{2pt} +\newlength{\colvalwidth} +\setlength{\colvalwidth}{2em} % largeur des colonnes de valeurs % \end{macrocode} % \end{macro} -% \begin{macro}{\innercolsep} -% Définit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau. -% Cette largeur a été ajustée pour que les zones interdites grisées avec |\cellcolor| -% arrivent au contact de la double barre. +% \begin{macro}{\firstcolsep} +% Définit l'espace de séparation autour de la première colonne (légendes), +% valeur prédéfinie à \texttt{5pt}, qui est la valeur par défaut dans les tableaux \LaTeX. % \begin{macrocode} -\newlength{\innercolsep} -\setlength{\innercolsep}{4pt} +\newlength{\firstcolsep} +\setlength{\firstcolsep}{5pt} % valeur LaTeX par défaut % \end{macrocode} % \end{macro} -%\begin{macro}{maxdiscount} -% La gestion de discontinuités permettant de ne pas relier les flèches l'une à l'autre -% se fait grâce à la commande |\discont|. -% Le compteur |maxdiscont| est fixé à 3 par défaut ; il faut l'augmenter si l'on veut -% produire un tableau de variation avec plus de 3 discontinuités. +% \begin{macro}{\bordercolsep} +% Définit l'espace de séparation aux extrémités du tableau, pour les première +% et dernière colonnes de valeurs, prédéfinie à \texttt{2pt}. +% Sa valeur par défaut a été réduite par rapport à la longueur \LaTeX\ standard +%|\arraycolsep|, afin que les valeurs des extrémités (souvent des $\infty$) +% soient plus proches des filets verticaux bordant le tableau. % \begin{macrocode} -\newcounter{maxdiscont} -\setcounter{maxdiscont}{3} % nb max de discontinuités +\newlength{\bordercolsep} +\setlength{\bordercolsep}{2pt} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\limsep} +% Règle l'espace avant une limite à droite et après une limite à gauche, +% utilisé dans les macros |\limg|, |\limd| et |\bblim|. +% La macro |\bb| composant la double barre comprend +% déjà \texttt{1.5pt} d'espace autour des traits verticaux. +% La macro |\limsep| ajoute \texttt{1pt} par défaut. +% Si on règle ce paramètre à \texttt{-1.5pt}, on élimine l'espace +% créé par |\bb| et on arrive au contact du filet de la double barre. +% \begin{macrocode} +\newlength{\limsep} +\setlength{\limsep}{1pt} % \end{macrocode} % \end{macro} % \begin{macro}{\tablvarstretch} % Permet de régler la valeur relative de l'espacement vertical -% des lignes du tableau. La valeur par défaut est 1.4 (1 correspondant +% des lignes du tableau. La valeur par défaut est \texttt{1.6} (1 correspondant % à la valeur standard d'un environnement |array|). -% Placée dans un environnement math, elle sera locale à cet environnement. % \begin{macrocode} -\newcommand{\tablvarstretch}{1.4} +\newcommand{\tablvarstretch}{1.6} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZItype} +% Définit le type de zone interdite, \texttt{h} pour \og hachurée \fg ou +% \texttt{c} pour \og colorée \fg (\texttt{h} par défaut). +% \begin{macrocode} +\newcommand{\ZItype}{h} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{ZIcolor} +% Définit la couleur des zones interdites, \og colorées \fg (gris par défaut). +% \begin{macrocode} +\definecolor{ZIcolor}{named}{gray} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZIaddwidth} +% Définit une largeur supplémentaire (positive ou négative) +% à ajouter à la largeur des zones interdites, par exemple \texttt{1pt} +% pour arriver au contact du trait de |\barre|. +% \begin{macrocode} +\newlength{\ZIaddwidth} +\setlength{\ZIaddwidth}{0pt} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\tablvarset} +% Les paramètres précédents peuvent être modifiés avec |\setlength|, |\setboolean|, +% |\renewcommand| ou |\definecolor|, mais ils peuvent également être gérées +% avec le mécanisme \emph{clé=valeur}, +% grâce à l'extension \textsf{xkeyval}~\cite{XKEY} de Hendri Adriaens. +% Nous avons fait le choix de ne pas en faire +% des options de l'extension \textsf{tablvar} elle-même, mais de fournir +% une commande spéciale, |\tablvarset|, pour régler ces options. +% La couleur définie par l'option \texttt{ZIcolor} doit être une couleur \og nommée \fg. +% \begin{macrocode} +\define@key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}} +\define@key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}} +\define@key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}} +\define@key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}} +\define@key{tablvar}{limsep}{\setlength{\limsep}{#1}} +\define@key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}} +\define@boolkey{tablvar}[]{extleft}[true]{} % false si non appelé +\define@boolkey{tablvar}[]{extright}[true]{} +\define@choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}} +\define@key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}} +\define@key{tablvar}{ZIaddwidth}{\setlength{\ZIaddwidth}{#1}} + +\newcommand\tablvarset[1]{\setkeys{tablvar}{#1}} +% \end{macrocode} +% D'autres paramètres, présentés ci-dessous, qui n'ont, en principe, +% pas vocation à être modifiés, ne sont pas gérés par |\tablvarset|. +% \end{macro} + +% \begin{macro}{\tvrulewidth} +% Définit l'épaisseur des filets du tableau (\texttt{0.4pt} par défaut). +% \begin{macrocode} +\newlength{\tvrulewidth} +\setlength{\tvrulewidth}{0.4pt} % \end{macrocode} % \end{macro} % \begin{macro}{\tvbarrewidth} % Définit l'épaisseur des barres de séparation verticales coupant les 0 -% d'un tableau de signe : 0.5~pt par défaut. +% d'un tableau de signe : \texttt{0.5pt} par défaut. % \begin{macrocode} \newlength{\tvbarrewidth} \setlength{\tvbarrewidth}{0.5pt} % \end{macrocode} % \end{macro} - % \begin{macro}{tvbarrecolor} % Définit la couleur des mêmes barres de séparation verticales. +% La valeur par défaut |{gray}{0.7}| correspond à un niveau de gris. +% On peut redéfinir la couleur par une couleur nommée +% |\definecolor{named}|\marg{couleur} +% ou selon un modèle comme rgb, cmyk ou gray : |\definecolor{tvbarrecolor}{rgb}|\marg{x, x, x}. % \begin{macrocode} \definecolor{tvbarrecolor}{gray}{0.7} % \end{macrocode} % \end{macro} -% \subsection{Les commandes graphiques PSTricks/\tikz} +% \begin{macro}{\bbrulewidth} +% Définit l'épaisseur des traits verticaux d'une double barre. +% \begin{macrocode} +\newlength{\bbrulewidth} +\setlength{\bbrulewidth}{0.4pt} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\innercolsep} +% Définit la largeur entre les colonnes valeurs et les colonnes intervalles du tableau. +% Cette largeur a été fixée à \texttt{0pt}, +% car l'augmenter est équivalent à augmenter |\intervalwidth| +% de la même longueur, vu qu'il n'y a pas de filet de séparation entre les colonnes +% de valeurs et les colonnes intervalles. +% \begin{macrocode} +\newlength{\innercolsep} +\setlength{\innercolsep}{0pt} +% \end{macrocode} +% \end{macro} + +%\begin{macro}{maxdiscount} +% La gestion de discontinuités permettant de ne pas relier certains nœuds consécutifs +% se fait grâce à la commande |\discont|. +% Le compteur |maxdiscont| est fixé à 4 par défaut ; on peut l'augmenter (dans le préambule) +% si l'on veut produire un tableau de variations avec plus de 4 discontinuités. +% \begin{macrocode} +\newcounter{maxdiscont} +\setcounter{maxdiscont}{4} % nb max de discontinuités +% \end{macrocode} +% \end{macro} + +% \subsection{Les commandes graphiques PSTricks/\TikZ} \label{graph} % % Nous présentons ici les commandes graphiques permettant le dessin % des flèches, @@ -1314,59 +1841,61 @@ % (plus précisément liées à l'extension \textsf{pst-node}). % % \begin{macro}{\fleche} -% La commande \cmd{\fleche}\marg{noeud1}\marg{noeud2} possède deux paramètres +% La commande \cmd{\fleche}\marg{nœud1}\marg{nœud2} possède deux paramètres % qui sont les noms des nœuds à relier. % La création des nœuds est obtenue avec la commande |\noeud| appelée par |\pos| -% et le tracé des flèches réalisé automatiquement par la commande |\variations|. -% Pour modifier l'aspect des flèches on peut redéfinir la commande. +% et le tracé des flèches est réalisé automatiquement par la commande |\variations|. +% Pour modifier l'aspect des flèches on peut redéfinir la commande |\fleche|. % \begin{macrocode} \newcommand*{\fleche}[2]{ - \ifthenelse{\boolean{tikz}}{ + \iftv@tikz \tikz[remember picture,overlay]{\draw[->,>=stealth, line width=0.6pt] (#1) -- (#2);} - }{ + \else \ncline[arrowsize=2pt 2,arrowinset=0.4,nodesep=3pt, linewidth=0.6pt]{->}{#1}{#2} - } + \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\vrconnect} -% La commande \cmd{\vrconnect}\marg{noeud1}\marg{noeud2} +% La commande \cmd{\vrconnect}\marg{nœud1}\marg{nœud2} % relie les nœuds définis par |\vr| (valeurs remarquables) % et le tracé est réalisé automatiquement par la commande |\variations|. -% Par défaut : lignes en pointillés d'épaisseur 1\,pt. +% Par défaut, les lignes sont en pointillés d'épaisseur \texttt{1pt}. % \begin{macrocode} \newcommand*{\vrconnect}[2]{ - \ifthenelse{\boolean{tikz}}{ - \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] + \iftv@tikz + \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] (#1) -- (#2);} - }{ + \else \ncline[nodesep=5pt,linestyle=dotted,linewidth=1pt]{-}{#1}{#2} - } + \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\noeud} -% \cmd{\noeud}\oarg{pos}\marg{noeud}\marg{valeur} +% \cmd{\noeud}\oarg{pos}\marg{nœud}\marg{valeur} % définit les nœuds des flèches et valeurs remarquables ; -% le 1\ier\ paramètre optionnel correspond à l'option |t| (top), +% le 1\ier\ paramètre, optionnel, correspond à l'option |t| (top), % |b| (bottom) ou |c| (centered, par défaut) permettant d'ajuster -% la manière dont la flèche arrive sur le nœud (sans effet pour |tikz|) ; +% la manière dont la flèche arrive sur le nœud +% (pas implémenté avec l'option |tikz|) ; % le 2\ieme\ paramètre est le nom du nœud (qui est donné automatiquement % par les commandes de positionnement) ; % le 3\ieme\ paramètre est la valeur affichée dans le tableau. % \begin{macrocode} \newcommand*{\noeud}[3][c]{ - \ifthenelse{\boolean{tikz}}{ - \tikz[remember picture,baseline]{ - \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$}; - } % l'option de placement (#1) n'est pas implémentée pour tikz - }{ + \iftv@tikz + % fonctionne mal avec autre chose que 'anchor=base' + \tikz[remember picture,baseline]{% surtout pas de overlay ici + \node[anchor=base,inner sep=0pt,outer sep=4pt] at (0,0) (#2) + {$#3$};} + \else \rnode[#1]{#2}{#3} - } + \fi } % \end{macrocode} % \end{macro} @@ -1376,16 +1905,36 @@ % La macro prend deux arguments qui sont des paires de longueurs, % par exemple |\hachure{-3em,12ex}{3em,-1ex}|, % représentant les extrémités du rectangle à hachurer -% par rapport à la position courante où la macro est appelée. +% par rapport à la position courante où la macro est appelée. +% Pour l'option \texttt{tikz}, on aurait pu simplifier la macro +% en utilisant |\fill[pattern=north east lines]| mais, en utilisant +% la bibliothèque \texttt{patterns.meta}, on peut obtenir des hachures +% plus élégantes, correspondant à celles de l'option \texttt{pstricks}. % \begin{macrocode} \newcommand*{\hachure}[2]{ - \ifthenelse{\boolean{tikz}}{ - \tikz[remember picture,overlay]{\fill[pattern=north east lines] + \iftv@tikz + \tikz[remember picture,overlay]{% + \fill[pattern={Lines[distance=3pt,angle=135,line width=0.2pt]}] (#1) rectangle (#2);} - }{ + \else \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt, hatchsep=3pt](#1)(#2) - } + \fi +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZIcouleur} +% Trace une zone interdite en couleur, mêmes arguments que |\hachure|. +% \begin{macrocode} +\newcommand*{\ZIcouleur}[2]{ + \iftv@tikz + \tikz[remember picture,overlay]{\fill[color=ZIcolor,opacity=0.3] + (#1) rectangle (#2);} + \else + \psframe[linestyle=none,fillstyle=solid,opacity=0.3, + fillcolor=ZIcolor](#1)(#2) + \fi } % \end{macrocode} % \end{macro} @@ -1393,15 +1942,16 @@ % \subsection{Longueurs et compteurs internes} % % \begin{macrocode} -\newcounter{ligne} % numéro de ligne -\newcounter{noeud} % numéro du nœud +\newcounter{var@ligne} % numéro de ligne des variations +\newcounter{var@noeud} % numéro du nœud des variations \newcounter{numvr} % numéro de la valeur remarquable +\newcounter{nb@intervals} % nombre de colonnes "intervalles" \newcounter{numdiscont} % numéro de la discontinuité % \end{macrocode} % % Un compteur est créé pour chaque discontinuité : |discont1|, |discont2|, etc. % Le compteur |discont|\meta{i} contient le numéro du nœud précédant -% la i-ème discontinuité. +% la $i$-ème discontinuité. % La flèche partant de ce nœud ne sera pas tracée. % Il faut un compteur de plus que le nombre de discontinuités. % \begin{macrocode} @@ -1412,122 +1962,243 @@ } % \end{macrocode} -% Longueurs et compteurs pour la commande |\ZIh|. +% La commande |\mil| positionne son contenu sur la colonne 2, +% mais réalise un décalage vertical si le nombre de lignes de variations diffère de 3. +% Pour cela nous avons besoin d'une variable de dimension et d'un compteur. % \begin{macrocode} +\newlength\mil@heightshift +\newcounter{mil@rowshift} +% \end{macrocode} + +% Pour gérer correctement les zones interdites, avec la commande |\ZI|, +% de nombreuses variables, longueurs et compteurs, sont nécessaires. +% On peut créé des zones interdites sur 4 colonnes différentes maximum +% (on ne peut pas augmenter cette valeur sans revoir le code). +% Pour chacune, la hauteur des lignes est cumulée dans les variables +% |\ZIheighti|, \ldots, |\Ziheightiv|, +% et le numéro de colonne \og intervalle \fg correspondant est enregistré +% dans un compteur |ZI1|, \ldots, |ZI4|. La variable |\ZIheight| permet de renvoyer +% la hauteur de la ZI courante pour le calcul final avant tracé des hachures. +% Les paramètres qui suivent sont également dédiés à la gestion des dimensions +% et au tracé des zones interdites, +% à l'exception de |\tv@cellbox| qui sert aussi à la gestion des colonnes de valeurs. +% \begin{macrocode} +\newcounter{maxZI} % nb max de ZI +\setcounter{maxZI}{4} \newlength{\ZIheight} +\newlength{\ZIheighti} +\newlength{\ZIheightii} +\newlength{\ZIheightiii} +\newlength{\ZIheightiv} \newlength{\ZIdepth} \newlength{\ZIwidth} -\newcounter{ZI} % numéro de la ZI -\newcounter{ZIstar} % numéro de ZI pour la commande \ZI* -\newcounter{ZIvarlignes} % dernière ligne des variations +\newcounter{nbZI} % nombre de ZI utilisées +\newcounter{numZI} % numéro de ZI courant +\newcounter{nbvarlignes} % nombre de lignes des variations +\multido{\I=1+1}{\themaxZI}{\newcounter{ZI\I}} +\newcounter{tv@icol} % numéro de colonne "intervalle" +\newcounter{tv@row} % numéro de ligne du tableau +\newsavebox{\tv@cellbox} +\newlength{\tv@cellheight} +\newlength{\tv@celldepth} % \end{macrocode} % \bigskip % \subsection{Les environnements \texttt{tablvar} et \texttt{tablvar*}} % -% Grâce à l'extension \textsf{array} nous pouvons définir un nouveau type de colonnes -% pour les intervalles : |i|. -% \begin{macrocode} -\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}} - % nouveau type de colonne i pour les intervalles -% \end{macrocode} - % \begin{macro}{\tablvarinit} % \changes{v1.1}{13/04/2019}{ajouté \bslash extrarowheight} % Cette commande d'initialisation des compteurs est appelée -% au début de chaque environnement |tablvar| ou |tablvar*|. +% au début de chaque environnement |tablvar|. +% On retire 1 à |nb@intervals| à cause de la manière dont on appelle les colonnes +% dans \texttt{tablvar} (voir plus bas). % Les redéfinitions de |\extrarowheight| et |\arraystretch| seront locales -% dans l'environnement |tablvar|. +% à l'environnement |tablvar|. +% L'instruction |\setcounter{var@ligne}{0}| est nécessaire ici et pas seulement +% dans la partie variations car le compteur est utilisé par |\ZI| dans les lignes de signes. % \begin{macrocode} -\newcommand{\tablvarinit}{ +\newcommand*{\tablvarinit}[1]{ \setlength{\extrarowheight}{0pt} % paramètre de l'extension array - \renewcommand{\arraystretch}{\tablvarstretch} - \setcounter{ligne}{0} + \renewcommand{\arraystretch}{\tablvarstretch} + \setlength{\arrayrulewidth}{\tvrulewidth} + \setcounter{var@ligne}{0} \setcounter{numvr}{0} + \setcounter{tv@row}{0} + \setcounter{nb@intervals}{#1} + \addtocounter{nb@intervals}{-1} } % \end{macrocode} % \end{macro} % \begin{macro}{\ZIinit} -% Initialisation des longueurs et compteurs pour la commande |\ZIh|. -% Prend un argument (optionnel) qui est la largeur des colonnes intervalles -% (car il faut la sauvegarder dans |\ZIwidth|) -% et qui est passé automatiquement par |tablvar|. +% Initialisation des longueurs et compteurs qui peuvent être utilisés par |\ZI|. +% Le compteur \texttt{nbvarlignes} doit être non nul pour un tableau de signe seul. % \begin{macrocode} -\newcommand*{\ZIinit}[1][\intervalwidth]{ - \setlength{\ZIheight}{0pt} - \setlength{\ZIdepth}{0pt} - \setlength{\ZIwidth}{#1} - \setcounter{ZI}{0} - \setcounter{ZIstar}{0} - \setcounter{ZIvarlignes}{3} - % doit être non nul pour \ZIh si tableau de signe seul +\newcommand{\ZIinit}{ + \global\ZIheighti=0pt + \global\ZIheightii=0pt + \global\ZIheightiii=0pt + \global\ZIheightiv=0pt + \setcounter{nbZI}{0} + \multido{\I=1+1}{\themaxZI}{\setcounter{ZI\I}{0}} + \setcounter{nbvarlignes}{3} } % \end{macrocode} % \end{macro} -% \begin{environment}{tablvar} -% L'environnement |tablvar| : |\begin{tablvar}|\oarg{width}\marg{nbintervals}. -% Le 1\ier\ paramètre (optionnel) permet de régler la largeur des colonnes -% intervalles (définie par |\intervalwidth| -% par défaut), le 2\ieme\ paramètre (obligatoire) est le nombre d'intervalles. -% Cet environnement n'est rien d'autre qu'un |array| dans lequel on a réglé -% les options de colonages. -% Les colonnes de valeurs sont de type |c| et les colonnes d'intervalles de type |i| +% \begin{macro}{\tv@saveheight} +% Cette macro sert à calculer la hauteur et la profondeur d'une cellule, +% qui seront enregistrées dans des variables globales afin que la commande |\ZI| +% puisse les récupérer. +% Elle est appelée à chaque \og sortie \fg de cellule de la colonne de légendes +% grâce à la définition d'un nouveau type de colonne \texttt{A} (voir macro |\tvcoltypes|). +% La hauteur de la boîte de cellule |\@arstrutbox| ne donne pas +% la hauteur réelle de la ligne, car celle-ci peut être calibrée +% par d'autres cellules de la même ligne % \footnote{L'utilisation d'un type de colonne permettant un ajustement automatique -% de la hauteur tel que fourni par l'extension \textsf{cellspace} de Josselin Noirel -% ne fonctionne pas ici : les double-barres ne sont pas correctement dessinées.}. +% de la hauteur tel que fourni par l'extension +% \textsf{cellspace}~\cite{CELLSP} de Josselin Noirel +% ne fonctionne pas ici : les barres et double barres ne sont pas correctement dessinées ; +% mais l'on pourra peut-être envisager une évolution grâce à l'extension +% \textsf{tabularray}~\cite{TABUL} de Jianrui Lyu.}. +% +% L'idée ici est de comparer la hauteur de |\@arstrutbox| +% avec la hauteur dans la 1\iere colonne de légendes, sur la même ligne, +% car c'est en général elle qui contient des éléments de grande hauteur. +% Évidemment si l'on place un contenu de grande hauteur ailleurs, dans une colonne de valeurs +% et non dans la colonne de légendes, le calcul ne fonctionnera pas. +% Mais dans ce cas, l'extension \textsf{array} gère de toute façon mal les hauteurs de ligne +% et le contenu de la cellule agrandie va toucher le filet horizontal. +% La solution est alors de placer un |\vstrut| ou |\cstrut| dans la colonne +% de légendes pour augmenter sa hauteur qui, de ce fait, sera bien enregistrée +% par |\tv@saveheight|. % \begin{macrocode} -\newenvironment{tablvar}[2][\intervalwidth]{ - \tablvarinit - \ZIinit[#1] - \begin{array}{% - |c|@{\hspace{\bordercolsep}}% - *{#2}{c@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% - }% - c@{\hspace{\bordercolsep}}|% - } -}{\end{array}} +\newcommand\tv@saveheight{% + \tv@cellheight=0pt + \tv@celldepth=0pt + \ifdim \ht\tv@cellbox > \ht\@arstrutbox + \global\advance\tv@cellheight by \ht\tv@cellbox + \else + \global\advance\tv@cellheight by \ht\@arstrutbox + \fi + \ifdim \dp\tv@cellbox > \dp\@arstrutbox + \global\advance\tv@celldepth by \dp\tv@cellbox + \else + \global\advance\tv@celldepth by \dp\@arstrutbox + \fi +} % \end{macrocode} -% \end{environment} +% \end{macro} -% \begin{environment}{tablvar*} -% L'environnement |tablvar*| est une variante de |tablvar| (même syntaxe) -% où la première et la dernière colonnes de valeurs sont alignées respectivement -% à gauche (|l|) et à droite (|r|). -% Ceci est utile lorsqu'il y a une double barre à l'une des extrémités. +% \begin{macro}{\tvcoltypes} +% % Grâce à l'extension \textsf{array}, nous pouvons définir 3 nouveaux types de colonnes : +% \texttt{A} pour la colonne des légendes +% (1\iere colonne), \texttt{i} pour les colonnes intervalles et |v|\marg{pos} +% pour les colonnes de valeurs. L'argument \meta{pos} peut prendre les valeurs +% \texttt{c} (centré), \texttt{l} (aligné au fer à gauche) ou \texttt{r} +% (aligné au fer à droite). En faire un paramètre optionnel ne fonctionne pas ici. +% Les colonnes d'intervalles sont en fait du type \texttt{p}, +% paragraphe centré, avec une largeur |\intervalwidth| +% et incrémentent le compteur interne \texttt{tv@icol}. +% La première colonne de légende, +% remet à zéro le compteur \texttt{tv@col} et incrémente le compteur de ligne +% \texttt{tv@row}. +% +% La commande |\tvcoltypes| est appelée au début de chaque environnement +% \texttt{tablvar} et, de ce fait, ces types de colonnes ne sont reconnus +% qu'à l'intérieur d'un \texttt{tablvar} et ne créent pas d'incompatibilités +% avec d'autres extensions qui utiliseraient les mêmes lettres comme type de colonne. % \begin{macrocode} -\newcounter{nb@intervals} -\newenvironment{tablvar*}[2][\intervalwidth]{ - % environnement tablvar* , type l et r pour les extrémités - \tablvarinit - \ZIinit[#1] - \setcounter{nb@intervals}{#2} - \addtocounter{nb@intervals}{-1} +\newcommand{\tvcoltypes}{ + % type de colonne A pour les légendes à gauche du tableau + \newcolumntype{A}{% + >{\setcounter{tv@icol}{0}\stepcounter{tv@row}\begin{lrbox}% + \tv@cellbox $}% + c% + <{$\end{lrbox}\usebox{\tv@cellbox}\tv@saveheight}} + % type de colonne i pour les intervalles + \newcolumntype{i}{>{\stepcounter{tv@icol} + \centering\arraybackslash$}p{\intervalwidth}<{$}} + % type de colonne v pour les valeurs + \newcolumntype{v}[1]{% un argument optionnel ne fonctionne pas ici + >{\ifthenelse{\value{tv@row}=1}{\begin{lrbox}\tv@cellbox $}{}}% + ##1% + <{\ifthenelse{\value{tv@row}=1}{$\end{lrbox}% + \makebox[\colvalwidth][##1]{\usebox\tv@cellbox}}{}}} +} +% \end{macrocode} +% \end{macro} + +% \begin{environment}{tablvar} +% La syntaxe de |tablvar| est : |\begin{tablvar}|\oarg{options}\marg{nbintervals}. +% Le 1\ier\ paramètre optionnel permet de régler les options sous la forme \emph{clé=valeur} +% ou bien on peut y placer un unique argument dimensionnel qui représente alors +% la largeur des colonnes intervalles. +% Le 2\ieme\ paramètre (obligatoire) est le nombre d'intervalles. +% Fondamentalement, cet environnement n'est rien d'autre qu'un |array| +% dans lequel, après avoir effectué les initialisations, +% on a choisi les bons types de colonnes. +% +% On commence par prendre en compte les options grâce à |\setkeys*| fourni par l'extension +% \textsf{xkeyval}. La version étoilée de |\setkeys| +% a l'avantage de ne pas produire d'erreur lorsqu'une clé n'est pas reconnue +% (celle-ci est passée à |XKV@rm|). On l'interprète +% \footnote{Un message d'erreur de dimension erronée +% peut donc signifier que l'on s'est trompé dans l'orthographe d'une clé.} +% alors comme une dimension pour le paramètre |\intervalwidth|. +% +% Les colonnes de valeurs sont de type |c| (centré) par défaut mais +% les booléens \texttt{extleft} et \texttt{extright} permettent de différencier +% l'alignement dans la première colonne de valeur (type \texttt{B} comme begin) +% ou la dernière (type \texttt{E} comme end). +% \begin{macrocode} +\newenvironment{tablvar}[2][]{% + \setkeys*{tablvar}{#1} % fourni par xkeyval + \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi + \tvcoltypes + \ifextleft \newcolumntype{B}{v{l}} \else \newcolumntype{B}{v{c}} \fi + \ifextright \newcolumntype{E}{v{r}} \else \newcolumntype{E}{v{c}} \fi + \tablvarinit{#2} + \ZIinit \begin{array}{% - |c|@{\hspace{\bordercolsep}}% - l@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% + |@{\hspace{\firstcolsep}}% + A@{\hspace{\firstcolsep}}% + |@{\hspace{\bordercolsep}}% + B@{\hspace{\innercolsep}}% + i@{\hspace{\innercolsep}}% *{\value{nb@intervals}}{ - c@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% + v{c}@{\hspace{\innercolsep}}% + i@{\hspace{\innercolsep}}% }% - r@{\hspace{\bordercolsep}}|% + E@{\hspace{\bordercolsep}}|% } }{\end{array}} % \end{macrocode} % \end{environment} - +% +% \begin{environment}{tablvar*} +% L'environnement |tablvar*| est une variante de |tablvar| (même syntaxe) +% où les première et dernière colonnes de valeurs sont alignées respectivement +% au fer à gauche (|l|) et à droite (|r|). +% L'appel à |\setkeys*| enregistre les paramètres optionnels +% dans les variables correspondantes qui seront donc utilisés par \texttt{tablvar}, +% mais \texttt{extleft} et \texttt{extright} seront fixés. +% \begin{macrocode} +\newenvironment{tablvar*}[2][]{% + \setkeys*{tablvar}{#1} % fourni par xkeyval + \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi + \begin{tablvar}[extleft,extright]{#2} +}{\end{tablvar}} +% \end{macrocode} +% \end{environment} +% % \subsection{La commande \texttt{\textbackslash variations}} % -% C'est ici qu'est la magie ! -% % \begin{macro}{\varloop} % \changes{v1.1}{12/04/2019}{tvloop -> varloop} % La commande \cmd{\varloop}\marg{iter}\marg{code} répète \meta{code} (\meta{iter}$- 1$) fois -% (car la dernière ligne de variations doit subir un traitement particulier). -% Nous avons créé une variante de |\multido| (du package \textsf{multido}) car +% (car la dernière ligne des variations doit subir un traitement particulier). +% Nous avons créé notre propre commande de boucle car les usuelles % |\multido|, |\Multido| ou |\whiledo| plantent sur |\\| ou |\@arraycr| % et la commande |\variations| a besoin d'utiliser une boucle dans un tableau. % |\varloop| n'est autre qu'un |\ifthenelse| récursif. @@ -1544,48 +2215,50 @@ % \end{macro} % \begin{macro}{\variations} -% \cmd{\variations}\oarg{nblignes}\marg{code} où \meta{nblignes} est le nombre -% de lignes pour les variations (3 par défaut) ; -% \meta{code} contient les séparateurs de colonnes et la composition des variations -% grâce aux commandes de positionnement.\\ -% Le principe est que l'on parcourt 3 fois (par défaut) le contenu de |\variations| ; -% à chaque itération, le compteur |ligne| est incrémenté, -% le compteur |noeud| est remis à 0 puis incrémenté à chaque commande |\pos|, +% La syntaxe est \cmd{\variations}\oarg{nblignes}\marg{code} où \meta{nblignes} +% est le nombre de lignes pour les variations (3 par défaut) ; +% \meta{code} contient les commandes de positionnement +% et les séparateurs de colonnes |&|. \\ +% Le principe est que l'on parcourt \meta{nblignes} fois +% le contenu de |\variations| ; +% à chaque itération, le compteur |var@ligne| est incrémenté, +% le compteur |var@noeud| est remis à 0 puis incrémenté à chaque commande |\pos|, % mais le contenu de |\pos| n'est affiché et le nœud n'est effectivement créé -% que si la valeur du compteur |ligne| correspond à l'argument de ligne de |\pos|.\\ +% que si la valeur du compteur |var@ligne| correspond à l'argument de ligne de |\pos|.\\ % Les flèches et pointillés sont dessinés à la fin, quand tous les nœuds sont créés, -% mais il faut les tracer avant le |\\| final, sinon la compilation plante !? +% mais il faut les tracer avant le |\\| final, sinon la compilation plante ! +% Le compteur |var@ligne| doit être remis à 0 au cas où il y a plusieurs parties variations. % \begin{macrocode} \newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut) % (ré)initialisation des compteurs - \setcounter{ligne}{0} % nécessaire pour 2 parties variations + \setcounter{nbvarlignes}{#1} + \setcounter{var@ligne}{0} \setcounter{numdiscont}{0} \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}} - \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh % boucle : on exécute le code #2 un nb de fois égal à (#1)-1 \varloop{#1}{% - \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0} - % à chaque boucle on réinitialise certains compteurs - \stepcounter{ligne} % le numéro de ligne est incrémenté + \setcounter{var@noeud}{0}\setcounter{numvr}{0} + % à chaque tour de boucle on réinitialise les compteurs de nœuds + \stepcounter{var@ligne} % le numéro de ligne est incrémenté #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr) \\ % retour ligne } % dernière itération -> flèches tracées AVANT \\ sinon bug !? - \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0} - \stepcounter{ligne} #2 - % tracé des flèches - \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds + \setcounter{var@noeud}{0}\setcounter{numvr}{0} + \stepcounter{var@ligne} #2 + % tracé des flèches + \addtocounter{var@noeud}{-1} % 1 flèche de moins que le nb de nœuds \setcounter{numdiscont}{1} - \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{ + \multido{\Ix=1+1,\Iy=2+1}{\thevar@noeud}{ \ifthenelse{\value{discont\thenumdiscont}=\Ix}{ % on saute les discontinuités \stepcounter{numdiscont}}{ % sinon on trace la flèche N1->N2 puis N2->N3, etc. - \fleche{N\Ix}{N\Iy} + \fleche{N\Ix}{N\Iy} } } % tracé des pointillés pour les valeurs remarquables - \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}} + \multido{\Ix=1+1}{\thenumvr}{\vrconnect{X\Ix}{Y\Ix}} \\ % dernier retour ligne du tableau } % \end{macrocode} @@ -1593,105 +2266,173 @@ % \subsection{Les commandes de positionnement} % -% \begin{macro}{\pos} -% \cmd{\pos}\oarg{opt}\marg{ligne}\marg{valeur} -% sert à positionner les valeurs dans la partie variations. -% \meta{ligne} désigne la ligne où il faut placer \meta{valeur} et produire le nœud -% (numéroté avec le compteur |noeud| et défini en appelant la commande |\noeud|). +% \label{cmd-pos} +% \begin{macro}{\valpos} +% \cmd{\valpos}\oarg{opt}\marg{ligne}\marg{valeur} +% sert à positionner les valeurs dans la partie variations ; +% \meta{ligne} désigne la ligne où il faut placer \meta{valeur} et produire le nœud, +% numéroté avec le compteur |var@noeud| et défini en appelant la commande |\noeud|. % Les lignes de variations sont numérotées \emph{du haut vers le bas} % (et les lignes de signes portent toutes le numéro 0). % Le 1\ier\ argument optionnel, |c| (centered, par défaut), |t| (top) ou |b| (bottom), -% est utilisé pour le positionnement des flèches.\\ -% \DescribeMacro{\pos*} -% Dans la version étoilée, \cmd{\pos*}\marg{ligne}\marg{valeur}, la différence -% est qu'aucun nœud n'est créé. Ceci est utile en particulier pour la colonne de base, -% contenant les légendes. +% est utilisé pour le positionnement des flèches. +% La macro |\valpos| sert de macro sous-jacente à la macro |\pos|. % \begin{macrocode} -\newcommand*{\@pos}[3][c]{ - \stepcounter{noeud} - \ifthenelse{\theligne=#2}{ - \noeud[#1]{N\thenoeud}{#3} +\newcommand*{\valpos}[3][c]{ + \stepcounter{var@noeud} + \ifthenelse{\thevar@ligne=#2}{ + \noeud[#1]{N\thevar@noeud}{#3} }{} % si ligne != #2, on ne fait rien } -\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}} -\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}} % \end{macrocode} % \end{macro} -% Voici quelques alias utiles qui peuvent être utilisés -% à la place des commandes |\pos| et |\pos*|. -% \begin{macro}{\haut} -% \cmd{\haut}\marg{valeur} = \cmd{\pos}|{1}|\marg{valeur}. +% \begin{macro}{\zbox} +% Place son contenu dans une boite de largeur nulle : affiche le contenu +% mais considère que l'espace occupé est nul pour ne pas altérer le calcul de la +% largeur de colonne. +% Sa syntaxe est : +% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right). % \begin{macrocode} -\newcommand*{\haut}{\pos{1}} +\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}} % \end{macrocode} % \end{macro} -% \begin{macro}{\bas} -% \cmd{\bas}\marg{valeur} = \cmd{\pos}|{3}|\marg{valeur}. +% \DescribeMacro{\pos} +% Dans |\pos|, si l'option \texttt{extleft} est activée, la première colonne +% de valeurs, celle où le compteur des colonnes intervalles, |\tv@icol|, est encore à 0, +% est alignée au fer à gauche : l'option de positionnement \texttt{l} (left) +% est enregistrée dans |\val@@pos|. +% Si c'est \texttt{extright} qui est activée, la dernière colonne de valeurs +% est alignée au fer à droite (option de positionnement |\val@@pos=r|). +% On se trouve dans cette dernière colonne, lorsque le compteur des colonnes intervalles +% a dépassé \texttt{nb@intervals} qui contient le nombres d'intervalles $-1$. +% +% \DescribeMacro{\pos*} +% Dans la version étoilée, \cmd{\pos*}\marg{ligne}\marg{valeur}, la différence +% est qu'aucun nœud n'est créé. Ceci est utile en particulier pour la toute première colonne +% contenant la légende ou pour positionner une valeur par dessus une flèche. +% Il n'y a pas lieu de se préoccuper de l'alignement, sauf si on voulait positionner +% une valeur aux extrémités sans la relier par des flèches, auquel cas on pourrait +% utiliser |\zbox|\oarg{pos} dans |\pos*|. +% Les anciennes commandes internes |\@pos| et |@@pos| ont été remplacées par |\tv@pos| +% et |\tv@@pos|, pour éviter un conflit avec la macro |\@pos| déjà utilisée +% par Daniel Flipo dans \textsf{tabvar}. % \begin{macrocode} -\newcommand*{\bas}{\pos{3}} +\newcommand*{\tv@pos}[3][c]{ + \def\val@@pos{c} + \ifextleft + \ifthenelse{\thetv@icol=0}{\def\val@@pos{l}}{} + \fi + \ifextright + \ifthenelse{\thetv@icol>\thenb@intervals}{\def\val@@pos{r}}{} + \fi + \zbox[\val@@pos]{\valpos[#1]{#2}{#3}} +} +\newcommand*{\tv@@pos}[2]{\ifthenelse{\thevar@ligne=#1}{#2}{}} +\newcommand*{\pos}{\@ifstar{\tv@@pos}{\tv@pos}} % \end{macrocode} -% \end{macro} -% \begin{macro}{\mil} -% \cmd{\mil}\marg{valeur} = \cmd{\pos*}|{2}|\marg{valeur}. +% Voici les commandes de positionnement plus abstraites qui peuvent être utilisés +% à la place des commandes |\pos| et |\pos*|. +% +% \begin{macro}{\haut} +% \cmd{\haut}\marg{valeur} place \meta{valeur} sur la première ligne des variations. +% L'option de |\pos| n'est pas prise en charge. % \begin{macrocode} -\newcommand*{\mil}{\pos*{2}} +\newcommand*{\haut}{\pos{1}} % \end{macrocode} % \end{macro} -% Voici enfin deux macros qui permettent si besoin d'ajuster le positionnement -% (en plus des commandes \LaTeX\ |\hspace| ou |\makebox|). -% \begin{macro}{\zbox} -% Place son contenu dans une boite de largeur nulle : affiche le contenu -% mais considère que l'espace occupé est nul pour le calcul des largeurs de colonne. -% Sa syntaxe est : -% |\zbox|\oarg{pos}\marg{contenu} où \meta{opt} = |c| (par défaut), |l| (left) ou |r| (right). +% \begin{macro}{\bas} +% \cmd{\bas}\marg{valeur} place \meta{valeur} sur la dernière ligne des variations. +% L'option de |\pos| n'est pas prise en charge. % \begin{macrocode} -\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}} +\newcommand*{\bas}{\pos{\value{nbvarlignes}}} % \end{macrocode} % \end{macro} % \begin{macro}{\vdecal} -% Décalage vertical : \cmd{\vdecal}\marg{decal}\marg{contenu}, +% La macro \cmd{\vdecal}\marg{decal}\marg{contenu} permet de réaliser un décalage +% vertical : % le 1\ier\ paramètre est le décalage % (positif = vers le haut ou négatif = vers le bas), le second est le contenu à placer. +% Elle est utilisée en particulier par |\mil|. % \begin{macrocode} \newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}} % \end{macrocode} % |\smash| a pour effet d'annuler la hauteur de la boite afin de ne pas agrandir -% la ligne courante. +% la ligne courante ainsi quelque soit le décalage, le tableau ne bouge pas +% (on pourrait même faire sortir le contenu à afficher du tableau). % \end{macro} -% \subsection{Barres, discontinuités et valeurs remarquables} -% -% \begin{macro}{\bb} -% La macro |\bb|, qui produit une double barre, -% provient de l'extension \textsf{variations} de Christian Obrecht -% |\def\bb{\vrule\kern1pt\vrule}|. -% Nous avons ajouté 1\,pt d'espace avant et après, afin d'éviter le contact -% entre la double barre et les limites à gauche ou à droite. +% \begin{macro}{\mil} +% La commande |\mil|\marg{valeur} positionne \meta{valeur} sur la ligne 2 +% de la partie variations. Lorsqu'il y a 3 lignes de variations cela correspond bien +% au milieu, mais sinon on réalise un décalage vertical grâce à |\vdecal|. +% La formule de ce décalage est +% $(3- \mbox{nblignes}) \times (\mbox{hauteur de ligne})/2$. +% Le résultat de ce calcul est stocké dans la variable de dimension |\mil@heightshift|. +% Au cas où |\mil| ne donnerait pas un résultat parfait, on pourrait alors régler +% le décalage manuellement avec +%|\pos*|\marg{ligne}|{\vdecal|\marg{decal}\marg{contenu}|}|. % \begin{macrocode} -\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt} +\newcommand*{\mil}[1]{% + \mil@heightshift = \ht\@arstrutbox + \advance\mil@heightshift by \dp\@arstrutbox + \divide\mil@heightshift by 2 + \setcounter{mil@rowshift}{3} + \addtocounter{mil@rowshift}{-\value{nbvarlignes}} + \multiply\mil@heightshift by \value{mil@rowshift} + \pos*{2}{\vdecal{\mil@heightshift}{#1}} +} % \end{macrocode} % \end{macro} +% \subsection{Barres, discontinuités, limites et valeurs remarquables} +% % \begin{macro}{\barre} % La macro |\barre| permet de tracer une barre verticale % pour marquer les séparations de colonne dans un tableau de signe, en passant % à travers les 0. % Son aspect est contrôlé par les paramètres |\tvbarrewidth| et |\tvbarrecolor|. % Sa syntaxe est : -% |\barre|\oarg{valeur} où, en général, on met 0 comme argument optionnel. +% |\barre|\oarg{valeur} où, en principe, on met 0 comme argument optionnel ou rien. +% Le |\hspace{-0.5\tvbarrewidth}| sert à obtenir un centrage parfait du |\vrule| +% en particulier si on souhaite un trait épais. % \begin{macrocode} -\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$} - \color{tvbarrecolor} - \vrule width \tvbarrewidth -} +\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}% + \color{tvbarrecolor}% + \hspace{-0.5\tvbarrewidth}\vrule width \tvbarrewidth} % \end{macrocode} % \end{macro} +% \begin{macro}{\bb} +% La macro |\bb|, qui produit une double barre, +% reprend celle de l'extension \textsf{variations} de Christian Obrecht +% |\def\bb{\vrule\kern1pt\vrule}|. +% Nous avons ajouté \texttt{1.5pt} d'espace avant et après, afin d'aligner au mieux +% la double barre avec un 0 sur la ligne des $x$, lorsque la double barre +% se trouve à une extrémité. +% L'épaisseur de la double barre a été paramétrée par |\bbrulewidth|. +% \begin{macrocode} +\newcommand*{\bb}{% + \kern1.5pt\vrule width \bbrulewidth\kern1pt + \vrule width \bbrulewidth\kern1.5pt} +% \end{macrocode} +% \end{macro} + +% \DescribeMacro{\limg}\DescribeMacro{\limd} +% Les macros |\limg| et |limd| servent à positionner des limites à gauche \emph{ou} à droite, +% en particulier aux bords des double barres. +% Le premier paramètre, optionnel, précise l'option de positionnement (\texttt{c}, +% \texttt{l} ou \texttt{r}) et le second \emph{obligatoire} et le numéro de ligne, +% enfin le troisième est la valeur à placer. +% \begin{macrocode} +\newcommand*{\limg}[3][c]{\zbox[r]{\valpos[#1]{#2}{#3\hspace{\limsep}}}} +\newcommand*{\limd}[3][c]{\zbox[l]{\valpos[#1]{#2}{\hspace{\limsep}#3}}} +% \end{macrocode} + % \begin{macro}{\discont} % Associe un numéro de nœud à un compteur de discontinuité % (chaque discontinuité a son propre compteur). @@ -1699,46 +2440,39 @@ % et le nœud suivant ne sera pas tracée. % \begin{macrocode} \newcommand*{\discont}{ - \ifthenelse{\theligne=1}{ + \ifthenelse{\thevar@ligne=1}{ % on ne compte les discontinuités qu'une seule fois, sur ligne 1 - \stepcounter{numdiscont} - \setcounter{discont\thenumdiscont}{\thenoeud} - }{} - } + \ifthenelse{\thenumdiscont=0}{ + \ifthenelse{\thevar@noeud > 0}{% pas avant le 1er nœud + \stepcounter{numdiscont} + \setcounter{discont\thenumdiscont}{\thevar@noeud} + }{} + }{% on ne compte pas 2 fois la même discontinuité + \ifthenelse{\thevar@noeud > \value{discont\thenumdiscont}}{ + \stepcounter{numdiscont} + \setcounter{discont\thenumdiscont}{\thevar@noeud} + }{} + } + }{} +} % \end{macrocode} % \end{macro} % \begin{macro}{\bblim} -% Sert à positionner correctement des limites à gauche et à droite -% d'une double barre en conservant le centrage de la double barre. +% Sert à positionner des limites à gauche \emph{et} à droite +% d'une double barre. % Cette macro trace la double barre, place les limites et appelle |\discont|. -% Le principe est que lorsqu'on place la plus large des deux valeurs -% d'un côté de la double barre, on place une boite fantôme de même largeur -% de l'autre côté ; quant à la plus étroite des deux valeurs, -% elle est placée dans une |\zbox| qui annule sa largeur. -% Sa syntaxe est : \\ -% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite} +% Sa syntaxe est : +% |\bblim|\marg{ligne gauche}\marg{limite gauche}\marg{ligne droite}\marg{limite droite}. % \begin{macrocode} -\newsavebox{\@tvlbox} -\newsavebox{\@tvrbox} -\newcommand*{\bblim}[4]{ - \sbox{\@tvlbox}{$#2$} - \sbox{\@tvrbox}{$#4$} - \ifdim \wd\@tvlbox > \wd\@tvrbox - \pos{#1}{#2} \bb\discont - \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}} - \else - \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}} - \bb\discont \pos{#3}{#4} - \fi -} +\newcommand*{\bblim}[4]{\limg{#1}{#2}\bb\discont\limd{#3}{#4}} % \end{macrocode} % \end{macro} % \begin{macro}{\vr} % La commande |\vr| fabrique un nœud pour chaque valeur remarquable. -% Les nœuds sont désignés par X1, X2, \ldots\ sur la ligne des $x$ -% et Y1, Y2, \ldots\ sur les lignes de variations. +% Les nœuds sont désignés par X1, X2\ldots\ sur la ligne des $x$ +% et Y1, Y2\ldots\ sur les lignes de variations. % Sa syntaxe est : \cmd{\vr}\oarg{ligne}\marg{valeur}. % Le paramètre optionnel \meta{ligne} vaut 2 par défaut pour Y, % et n'est pas pris en compte pour X (ligne 0), @@ -1746,83 +2480,267 @@ % Les nœuds seront ensuite reliés par la commande |\vrconnect| % (appelée par |\variations|) en fonction de leur numéro. % \begin{macrocode} -\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0 +\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf si tv@row=1 \stepcounter{numvr} - \ifthenelse{\theligne=0}{ - \noeud{X\thenumvr}{#2} - }{ - \ifthenelse{\theligne=#1}{ - \noeud{Y\thenumvr}{#2} - }{} + \ifthenelse{\thetv@row=1}{\noeud{X\thenumvr}{#2}}{ + \ifthenelse{\thevar@ligne=#1}{\noeud{Y\thenumvr}{#2}}{} } } % \end{macrocode} % \end{macro} +% \begin{macro}{\posvr} +% Malheureusement, on ne peut pas imbriquer une commande |\vr| et une commande |\pos| +% l'une dans l'autre. Mais on peut en fait imbriquer une commande |\noeud| dans une autre. +% Ici ce ne sont pas les |\ifthenelse| contenues dans les commandes |\vr| ou |\pos| +% qui posent problème, mais les |\stepcounter| qui ne sont pas supportés à l'intérieur +% d'une commande |\noeud|. Nous avons donc créé la commande |\posvr| pour placer une +% valeur dans la partie variations qui soit à la fois un nœud pour les flèches +% et pour les pointillés de valeur remarquable. +% Sa syntaxe est la même que celle de la commande |\pos|. +% \begin{macrocode} +\newcommand*{\posvr}[3][c]{% + \stepcounter{numvr} + \tv@pos[#1]{#2}{\noeud{Y\thenumvr}{#3}}} +% \end{macrocode} +% \end{macro} + % \subsection{Zones interdites} % -% \begin{macro}{\ZIc} -% Commande sans argument qui produit une zone interdite colorée. -% À placer dans les intervalles voulus. La densité de gris ou la couleur -% peuvent être modifiées en redéfinissant la macro. +% La gestion des zones interdites nécessite quelques sophistications algorithmiques car +% il faut ne dessiner un rectangle de hachures qu'une seule fois +% pour un ensemble de cellules superposées, sinon les hachures ne seront pas jointives. +% Pour les zones interdites colorées, on utilisera les mêmes macros qui donnent +% un ajustement idéal. +% +% Une zone interdite possède un numéro et chaque appel de |\ZI| va cumuler la hauteur +% de cellule jusqu'au tracé, déclenché par |\ZI*|. +% On doit vérifier si une zone interdite non tracée existe déjà dans la même colonne, +% sinon on en crée une nouvelle. +% +% \begin{macro}{\ZIfind} +% On cherche s'il existe déjà une zone interdite (non tracée) pour la même +% colonne, auquel cas on renvoie son numéro (dans \texttt{numZI}), sinon on renvoie 0. +% Les ZI sont indicées par un compteur |ZI1|, |ZI2|, |ZI3| ou |ZI4| +% qui contient le numéro de la colonne intervalle à laquelle cette ZI appartient. +% Le compteur \texttt{nbZI} contient le nombre de ZI actives déjà créées. +% On repère l'indice de ZI +% en comparant la valeur du compteur |ZI\I| avec le numéro +% de la colonne intervalle courante. +% \begin{macrocode} +\newcommand\ZIfind{% calcule numZI + \setcounter{numZI}{0} + \multido{\I=1+1}{\thenbZI}{% il existe déjà des ZI à la même colonne + \ifthenelse{\value{ZI\I}=\value{tv@icol}}{ + \setcounter{numZI}{\I} + }{} + } +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZInew} +% Créé une nouvelle zone interdite en lui affectant un numéro (indice) +% et mémorise le numéro de +% la colonne intervalle où cette ZI est créée. +% Si le numéro de colonne (intervalle) courante ne correspond +% à aucune ZI enregistrée dans les compteurs |ZI\I| +% alors on incrémente le compteur \texttt{nbZI} et on enregistre ce numéro +% de colonne dans le compteur de |ZI\thenbZI| correspondant. +% Si jamais on dépasse 4, le nombre max de ZI possibles, +% |\ZInew| va générer une erreur en appelant |ZI\thenumZI| qui n'existe pas. +% Par contre, si une ZI de la même colonne a déjà été tracée précédemment +% (cela ne peut arriver que dans les tableaux de signes), +% le numéro de ZI de cette colonne sera remis à 0 +% par |\ZIreset| (voir macro suivante) auquel cas on récupère son indice +% pour créer cette nouvelle ZI. +% \begin{macrocode} +\newcommand\ZInew{ + \multido{\I=1+1}{\thenbZI}{% on cherche s'il y a des ZI\I=0 + \ifthenelse{\value{ZI\I}=0}{\setcounter{numZI}{\I}}{} + } + \ifthenelse{\value{numZI}>0}{}{ + % si pas de ZI disponible il faut augmenter nbZI + \stepcounter{nbZI} + \setcounter{numZI}{\value{nbZI}} + } + \setcounter{ZI\thenumZI}{\value{tv@icol}} +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZIreset} +% |\ZIreset| est appelée lors du tracé d'une zone interdite dans la partie signe, +% afin de libérer l'indice de ZI correspondant qui pourra être réaffecté plus bas +% dans la même colonne. Son argument obligatoire est l'indice de ZI à remettre à 0. +% Son rôle est aussi de remettre à 0, la hauteur de cette ZI nouvellement créée. % \begin{macrocode} -\newcommand{\ZIc}{\discont \cellcolor[gray]{0.7}} +\newcommand*\ZIreset[1]{ + \ifnum #1 > 0 \setcounter{ZI#1}{0} \fi + \ifnum #1 = 1 + \global\ZIheighti=0pt + \else \ifnum #1 = 2 + \global\ZIheightii=0pt + \else \ifnum #1 = 3 + \global\ZIheightiii=0pt + \else \ifnum #1 = 4 + \global\ZIheightiv=0pt + \fi\fi\fi\fi +} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\ZIaddheight} +% La macro |\ZI@addheight| sert à cumuler la hauteur et la profondeur de la ligne +% courante dans une des 4 variables de dimension |\ZIheighti|, \ldots, |\ZIheightiv| +% correspondant à la zone interdite appelante. +% On récupère hauteur et profondeur qui ont été enregistrés dans +% les variables globales |\tv@cellheight| et |\tv@cellheight|, +% par la colonne de légendes de la même ligne. +% Le numéro de la ZI (son indice) est passé en argument. +% \begin{macrocode} +\newcommand*\ZIaddheight[1]{ + \ZIheight=0pt + \advance\ZIheight by \tv@cellheight + \advance\ZIheight by \tv@celldepth + \advance\ZIheight by 0.5\arrayrulewidth + \ifnum #1 = 1 + \global\advance\ZIheighti by \ZIheight + \else \ifnum #1 = 2 + \global\advance\ZIheightii by \ZIheight + \else \ifnum #1 = 3 + \global\advance\ZIheightiii by \ZIheight + \else \ifnum #1 = 4 + \global\advance\ZIheightiv by \ZIheight + \fi\fi\fi\fi +} % \end{macrocode} % \end{macro} -% La macro |\ZIh| \DescribeMacro{\ZIh} sert à produire une zone interdite hachurée. -% Le tracé des hachures n'est déclenché -% que sur la dernière ligne des variations, les appels à |\ZIh| sur les lignes -% précédentes ne font que cumuler hauteur (|\ht|) et profondeur (|\dp|) de la ligne. -% Dans une ligne de signe, il ne faut qu'\emph{un seul appel} à |\ZIh|, -% qui peut être placé n'importe où. -% En effet, pour les lignes d'indice 0, la macro ne sait pas -% s'il y a eu un changement de ligne, donc elle cumule systématiquement la hauteur -% à chaque appel. -% Par contre, dans la partie variations, les |\ZIh| doivent être placés -% autant de fois que nécessaire, dans les intervalles voulus.\\ -% La macro possède un paramètre optionnel |\ZIh|\oarg{hauteur} -% qui est un supplément de hauteur global, -% permettant de faire un ajustement fin si des lignes ont été agrandies -% à cause de leur contenu (grandes fractions par exemple).\\ -% Limitation : fonctionne moins bien avec \tikz\ (sensible à la taille de police). -% -% La macro |ZIh*| \DescribeMacro{\ZIh*} -% (appelée par |\ZIh| sur la dernière ligne des variations) -% déclenche le tracé d'un rectangle de hachures en appelant la commande |\hachure|. -% Elle utilise les dimensions précédemment enregistrées dans les variables de dimension -% (par |\ZIh|). Dans un tableau de signes sans partie variations -% elle doit être placée sur la dernière ligne à la place de |\ZIh| -% (pour les lignes précédentes). Elle possède le même argument optionnel \oarg{hauteur}. +% \begin{macro}{\ZIgetheight} +% On récupère, avant le tracé, la hauteur globale de la ZI +% (dont le numéro est donné en argument) dans la variable |\ZIheight|. +% \begin{macrocode} +\newcommand*\ZIgetheight[1]{% + \ifnum #1=1 + \global\ZIheight=\ZIheighti + \else \ifnum #1 = 2 + \global\ZIheight=\ZIheightii + \else \ifnum #1 = 3 + \global\ZIheight=\ZIheightiii + \else \ifnum #1 = 4 + \global\ZIheight=\ZIheightiv + \fi\fi\fi\fi +} +% \end{macrocode} +% \end{macro} +% \DescribeMacro{\ZI} +% La macro |\ZI| est à placer dans les cellules où l'on souhaite produire une zone interdite. +% Elle ne déclenche le tracé des hachures que sur la dernière ligne des variations +% (par un appel à |\ZI*|). +% +% On crée une discontinuité puis on récupère l'indice de ZI (\texttt{numZI}) +% grâce à |\ZIfind|. Si |\ZIfind| renvoie 0, aucune ZI active n'existe +% pour la colonne intervalle courante, auquel cas on crée un nouvelle ZI avec |\ZInew|. +% Et enfin on cumule la hauteur de la ligne de cette ZI grâce à |\ZIaddheight|. +% +% La macro possède un paramètre optionnel |\ZI|\oarg{hauteur} +% qui est un supplément de hauteur global. +% Celui-ci n'est, en principe, plus nécessaire, mais nous l'avons conservé pour +% des raisons de compatibilité avec les versions antérieures à \textsf{tablvar} 2.0. +% Ce paramètre permettrait éventuellement de faire un ajustement fin de la hauteur. +% +% \medskip +% \DescribeMacro{\ZI*} +% C'est en fait la macro |ZI*| qui déclenche le tracé de la zone interdite +% en appelant la commande |\hachure| ou la commande |\ZIcouleur| +% en fonction de l'option \texttt{ZItype}. +% Elle utilise la hauteur cumulée, précédemment enregistrée dans la variable de dimension +% correspondant à la ZI (par les commandes |\ZI| placés dans la même colonne). +% Dans la macro |\variations|, |\ZI*| est en fait appelée par |ZI| +% sur la dernière ligne des variations, sans que l'utilisateur n'ait à intervenir. +% +% Par contre, dans un tableau de signes sans partie variations +% il faut placer explicitement des |\ZI*| à la place des |\ZI|, au moment +% où l'on souhaite déclencher le tracé des hachures, sur la dernière ligne +% d'un bloc de hachures. +% La commande |\ZI*| possède le même argument optionnel |ZI*|\oarg{hauteur}. % \begin{macrocode} \newcommand*{\@ZI}[1][0pt]{% \discont - \ifthenelse{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{% - \ifthenelse{\theligne=0 \or \theZI=0}{% - % on ne doit cumuler la hauteur qu'une fois par ligne - % => une seule occurrence de la macro sur une ligne 0 - \global\advance\ZIheight by \ht\@arstrutbox - \global\advance\ZIheight by \dp\@arstrutbox - }{} + \ifthenelse{\thevar@ligne=\value{nbvarlignes}}{\@@ZI[#1]}{% + \ZIfind + \ifnum \thenumZI = 0 \ZInew \fi + \ZIaddheight{\thenumZI} } - \stepcounter{ZI} % RAZ par \variations à chaque ligne } -\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici - \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois - \global\advance\ZIheight by \ht\@arstrutbox - \global\advance\ZIheight by #1 - \global\advance\ZIdepth by \dp\@arstrutbox - \global\advance\ZIwidth by \innercolsep - \global\advance\ZIwidth by \innercolsep - \global\advance\ZIwidth by 2pt % espace autour doubles barres - }{} - \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} - \stepcounter{ZIstar} +\newcommand*{\@@ZI}[1][0pt]{ + \discont + \ZIfind + \ifnum \thenumZI > 0 \ZIgetheight{\thenumZI} \else \ZIheight=0pt \fi + \advance\ZIheight by \tv@cellheight + \advance\ZIheight by 0.5\arrayrulewidth + \advance\ZIheight by #1 + \ZIdepth = \tv@celldepth + \ZIwidth = \intervalwidth + \advance\ZIwidth by 2\innercolsep + \advance\ZIwidth by \colvalwidth + \advance\ZIwidth by -1pt % au bord des double barres + \advance\ZIwidth by \ZIaddwidth + \ifthenelse{\equal{\ZItype}{h}}{ + \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} + }{ + \ZIcouleur{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} + } + \ZIreset{\thenumZI} } -\newcommand*{\ZIh}{\@ifstar{\@@ZI}{\@ZI}} +\newcommand*{\ZI}{\@ifstar{\@@ZI}{\@ZI}} % \end{macrocode} +% \DescribeMacro{\ZIh}\DescribeMacro{\ZIc} +% Nous avons conservé les noms des anciennes macros |\ZIh| et |ZIc| +% pour les zones interdites hachurées ou colorées pour des raisons de compatibilité, +% mais elles sont désormais basées sur |\ZI| ou |\ZI*| (en fait sur |\@ZI| ou |\@@ZI|). +% La macro |\ZIh| possède toujours une version étoilée |\ZIh*| pour le tracé des hachures +% dans les lignes de signe, |\ZIc| n'en possédait pas. +% \begin{macrocode} +\newcommand*{\ZIc}[1][0pt]{\renewcommand{\ZItype}{c}\@@ZI[#1]} +\newcommand{\ZIh}{\renewcommand{\ZItype}{h}\ZI} +% \end{macrocode} +% +% \bigskip +% \begin{thebibliography}{14} +% \begin{raggedright} +% \bibitem{TABL} \emph{Tableaux}. Nicolas Kisselhoff, CTAN. +% \bibitem{TABV} \emph{Tableaux de variations : \textsf{‘tabvar’}}. Daniel Flipo, +% CTAN, v1.8 16/07/2022. +% \bibitem{VARI} \emph{L'extension \textsf{variations}}. Christian Obrecht, +% CTAN, v0.3 13/09/2006. +% \bibitem{TABLOR} \emph{\textsf{tablor.sty} La machine à créer des tableaux +% de signes et de variations}. Guillaume Connan, CTAN, v4.07 09/05/2010. +% \bibitem{VARMP} \emph{\textsf{tableauVariations} -- Variation tables in +% \textlogo{METAPOST}}. Frédéric Mazoit, CTAN, 2005. +% \bibitem{TKZ} \emph{\textsf{Tkz-Tab}}. Alain Matthes, CTAN, +% v2.12c 29/04/2020. +% \bibitem{ARRAY} \emph{A new implementation of LATEX’s \textsf{tabular} and \textsf{array} +% environment}, Frank Mittelbach, David Carlisle, CTAN, v2.5g revised 16/10/2023. +% \bibitem{MKCELL} \emph{The \textsf{makecell} package}, Olga Lapko, CTAN, v0.1e 03/08/2009. +% \bibitem{CELLSP} \emph{The \textsf{cellspace} package}, Josselin Noirel, CTAN, +% v1.9.0 04/01/2022. +% \bibitem{TABUL} \emph{\textsf{Tabularray} Typeset Tabulars and Arrays with \LaTeX3}, +% Jianrui Lyu, CTAN, v2023A, 01/03/2023. +% v1.9.0 04/01/2022. +% \bibitem{SPA} \emph{The \textsf{spacingtricks} package}, Antoine Missier, +% CTAN, v1.7 28/07/2023. +% \bibitem{XKEY} \emph{The \textsf{xkeyval} package}. Hendri Adriaens, +% CTAN, v2.9, 16/06/2022. +% \bibitem{MIS} \emph{\textsf{mismath} -- Miscellaneous mathematical macros}, +% Antoine Missier, CTAN, v2.9 19/12/2023. +% \bibitem{FR} \emph{L'extension \textsf{frenchmath}}. Antoine Missier, +% CTAN, v2.7, 23/12/2023. +% \end{raggedright} +% \end{thebibliography} % \Finale \endinput diff --git a/Master/texmf-dist/source/latex/tablvar/tablvar.ins b/Master/texmf-dist/source/latex/tablvar/tablvar.ins index 94f28ed03aa..0280b617734 100644 --- a/Master/texmf-dist/source/latex/tablvar/tablvar.ins +++ b/Master/texmf-dist/source/latex/tablvar/tablvar.ins @@ -1,5 +1,5 @@ %% -%% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier@ac-toulouse.fr> +%% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr> %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3 of this license @@ -21,7 +21,7 @@ This is a generated file. -Copyright (C) 2018-2019 by Antoine Missier <antoine.missier@ac-toulouse.fr> +Copyright (C) 2018-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr> This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3 of this license @@ -46,7 +46,7 @@ and version 1.3 or later is part of all distributions of LaTeX version \Msg{* tablvar.sty *} \Msg{* *} \Msg{* To produce the documentation run the file tablvar.dtx *} -\Msg{* through LaTeX + dvips + ps2pdf. *} +\Msg{* through XeLaTeX or LaTeX + dvips + ps2pdf. *} \Msg{* *} \Msg{* Happy TeXing! *} \Msg{* *} diff --git a/Master/texmf-dist/tex/latex/tablvar/tablvar.sty b/Master/texmf-dist/tex/latex/tablvar/tablvar.sty index 8b2ee17c695..07b48703858 100644 --- a/Master/texmf-dist/tex/latex/tablvar/tablvar.sty +++ b/Master/texmf-dist/tex/latex/tablvar/tablvar.sty @@ -8,7 +8,7 @@ %% %% This is a generated file. %% -%% Copyright (C) 2018-2019 by Antoine Missier <antoine.missier@ac-toulouse.fr> +%% Copyright (C) 2018-2023 by Antoine Missier <antoine.missier@ac-toulouse.fr> %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3 of this license @@ -22,86 +22,159 @@ %% \NeedsTeXFormat{LaTeX2e}[2005/12/01] \ProvidesPackage{tablvar} - [2019/07/01 v1.2 .dtx tablvar file] + [2023/12/23 v2.0 .dtx tablvar file] + \RequirePackage{array} \RequirePackage{ifthen} \RequirePackage{multido} -\RequirePackage{colortbl} % pour \ZIc +\RequirePackage{xkeyval} +\RequirePackage{ifpdf} -\newboolean{tikz} -\DeclareOption{tikz}{\setboolean{tikz}{true}} -\DeclareOption{pstricks}{\setboolean{tikz}{false}} % valeur par défaut +\newif\iftv@tikz % false par défaut +\DeclareOption{tikz}{\tv@tikztrue} +\newif\iftv@pstricks +\DeclareOption{pstricks}{\tv@pstrickstrue} \ProcessOptions \relax -\ifthenelse{\boolean{tikz}}{ +\iftv@pstricks + \ifpdf + \PackageError{tablvar}{Don't use the pstricks option with PDF engines}{} + \else + \PackageInfo{tablvar}{PSTricks option is used} + \fi +\else\iftv@tikz + \PackageInfo{tablvar}{tikz option is used. + \MessageBreak + Run twice to draw the arrows correctly} +\else\ifpdf + \PackageWarningNoLine{tablvar}{PDF engine is used, + I'm using the tikz option. + \MessageBreak + Run twice to draw the arrows correctly} + \tv@tikztrue +\else + \PackageWarningNoLine{tablvar}{PDF engines not used, + I'm using the pstricks option} + \tv@pstrickstrue +\fi\fi\fi + +\iftv@tikz \RequirePackage{tikz} \usetikzlibrary{patterns} - \newlength{\tikznode@below} - }{ + \usetikzlibrary{patterns.meta}% pour le paramétrage des hachures +\else % pstricks=true \RequirePackage{pst-node} -} +\fi \newlength{\intervalwidth} -\setlength{\intervalwidth}{2.5em} % largeur des "intervalles" +\setlength{\intervalwidth}{3em} % largeur des "intervalles" + +\newlength{\colvalwidth} +\setlength{\colvalwidth}{2em} % largeur des colonnes de valeurs -\newlength{\bordercolsep} % largeur de l'espace inter-colonne +\newlength{\firstcolsep} +\setlength{\firstcolsep}{5pt} % valeur LaTeX par défaut + +\newlength{\bordercolsep} \setlength{\bordercolsep}{2pt} -\newlength{\innercolsep} -\setlength{\innercolsep}{4pt} +\newlength{\limsep} +\setlength{\limsep}{1pt} -\newcounter{maxdiscont} -\setcounter{maxdiscont}{3} % nb max de discontinuités +\newcommand{\tablvarstretch}{1.6} + +\newcommand{\ZItype}{h} + +\definecolor{ZIcolor}{named}{gray} + +\newlength{\ZIaddwidth} +\setlength{\ZIaddwidth}{0pt} -\newcommand{\tablvarstretch}{1.4} +\define@key{tablvar}{intervalwidth}{\setlength{\intervalwidth}{#1}} +\define@key{tablvar}{colvalwidth}{\setlength{\colvalwidth}{#1}} +\define@key{tablvar}{firstcolsep}{\setlength{\firstcolsep}{#1}} +\define@key{tablvar}{bordercolsep}{\setlength{\bordercolsep}{#1}} +\define@key{tablvar}{limsep}{\setlength{\limsep}{#1}} +\define@key{tablvar}{stretch}{\renewcommand{\tablvarstretch}{#1}} +\define@boolkey{tablvar}[]{extleft}[true]{} % false si non appelé +\define@boolkey{tablvar}[]{extright}[true]{} +\define@choicekey{tablvar}{ZItype}{h,c}{\renewcommand{\ZItype}{#1}} +\define@key{tablvar}{ZIcolor}{\definecolor{ZIcolor}{named}{#1}} +\define@key{tablvar}{ZIaddwidth}{\setlength{\ZIaddwidth}{#1}} + +\newcommand\tablvarset[1]{\setkeys{tablvar}{#1}} + +\newlength{\tvrulewidth} +\setlength{\tvrulewidth}{0.4pt} \newlength{\tvbarrewidth} \setlength{\tvbarrewidth}{0.5pt} - \definecolor{tvbarrecolor}{gray}{0.7} +\newlength{\bbrulewidth} +\setlength{\bbrulewidth}{0.4pt} + +\newlength{\innercolsep} +\setlength{\innercolsep}{0pt} + +\newcounter{maxdiscont} +\setcounter{maxdiscont}{4} % nb max de discontinuités + \newcommand*{\fleche}[2]{ - \ifthenelse{\boolean{tikz}}{ + \iftv@tikz \tikz[remember picture,overlay]{\draw[->,>=stealth, line width=0.6pt] (#1) -- (#2);} - }{ + \else \ncline[arrowsize=2pt 2,arrowinset=0.4,nodesep=3pt, linewidth=0.6pt]{->}{#1}{#2} - } + \fi } \newcommand*{\vrconnect}[2]{ - \ifthenelse{\boolean{tikz}}{ + \iftv@tikz \tikz[remember picture,overlay]{\draw[dotted,line width=1pt] (#1) -- (#2);} - }{ + \else \ncline[nodesep=5pt,linestyle=dotted,linewidth=1pt]{-}{#1}{#2} - } + \fi } \newcommand*{\noeud}[3][c]{ - \ifthenelse{\boolean{tikz}}{ - \tikz[remember picture,baseline]{ - \node[anchor=base,inner sep=0,outer sep=4] (#2) {$#3$}; - } % l'option de placement (#1) n'est pas implémentée pour tikz - }{ + \iftv@tikz + % fonctionne mal avec autre chose que 'anchor=base' + \tikz[remember picture,baseline]{% surtout pas de overlay ici + \node[anchor=base,inner sep=0pt,outer sep=4pt] at (0,0) (#2) + {$#3$};} + \else \rnode[#1]{#2}{#3} - } + \fi } \newcommand*{\hachure}[2]{ - \ifthenelse{\boolean{tikz}}{ - \tikz[remember picture,overlay]{\fill[pattern=north east lines] + \iftv@tikz + \tikz[remember picture,overlay]{% + \fill[pattern={Lines[distance=3pt,angle=135,line width=0.2pt]}] (#1) rectangle (#2);} - }{ + \else \psframe[linestyle=none,fillstyle=vlines,hatchwidth=0.2pt, hatchsep=3pt](#1)(#2) - } + \fi } -\newcounter{ligne} % numéro de ligne -\newcounter{noeud} % numéro du nœud +\newcommand*{\ZIcouleur}[2]{ + \iftv@tikz + \tikz[remember picture,overlay]{\fill[color=ZIcolor,opacity=0.3] + (#1) rectangle (#2);} + \else + \psframe[linestyle=none,fillstyle=solid,opacity=0.3, + fillcolor=ZIcolor](#1)(#2) + \fi +} + +\newcounter{var@ligne} % numéro de ligne des variations +\newcounter{var@noeud} % numéro du nœud des variations \newcounter{numvr} % numéro de la valeur remarquable +\newcounter{nb@intervals} % nombre de colonnes "intervalles" \newcounter{numdiscont} % numéro de la discontinuité \AtBeginDocument{% car maxdiscont a pu être modifié dans le préambule \stepcounter{maxdiscont} @@ -109,64 +182,108 @@ \multido{\I=1+1}{\themaxdiscont}{\newcounter{discont\I}} } +\newlength\mil@heightshift +\newcounter{mil@rowshift} + +\newcounter{maxZI} % nb max de ZI +\setcounter{maxZI}{4} \newlength{\ZIheight} +\newlength{\ZIheighti} +\newlength{\ZIheightii} +\newlength{\ZIheightiii} +\newlength{\ZIheightiv} \newlength{\ZIdepth} \newlength{\ZIwidth} -\newcounter{ZI} % numéro de la ZI -\newcounter{ZIstar} % numéro de ZI pour la commande \ZI* -\newcounter{ZIvarlignes} % dernière ligne des variations - -\newcolumntype{i}[1]{>{\centering\arraybackslash $}p{#1}<{$}} - % nouveau type de colonne i pour les intervalles - -\newcommand{\tablvarinit}{ +\newcounter{nbZI} % nombre de ZI utilisées +\newcounter{numZI} % numéro de ZI courant +\newcounter{nbvarlignes} % nombre de lignes des variations +\multido{\I=1+1}{\themaxZI}{\newcounter{ZI\I}} +\newcounter{tv@icol} % numéro de colonne "intervalle" +\newcounter{tv@row} % numéro de ligne du tableau +\newsavebox{\tv@cellbox} +\newlength{\tv@cellheight} +\newlength{\tv@celldepth} + +\newcommand*{\tablvarinit}[1]{ \setlength{\extrarowheight}{0pt} % paramètre de l'extension array \renewcommand{\arraystretch}{\tablvarstretch} - \setcounter{ligne}{0} + \setlength{\arrayrulewidth}{\tvrulewidth} + \setcounter{var@ligne}{0} \setcounter{numvr}{0} + \setcounter{tv@row}{0} + \setcounter{nb@intervals}{#1} + \addtocounter{nb@intervals}{-1} } -\newcommand*{\ZIinit}[1][\intervalwidth]{ - \setlength{\ZIheight}{0pt} - \setlength{\ZIdepth}{0pt} - \setlength{\ZIwidth}{#1} - \setcounter{ZI}{0} - \setcounter{ZIstar}{0} - \setcounter{ZIvarlignes}{3} - % doit être non nul pour \ZIh si tableau de signe seul +\newcommand{\ZIinit}{ + \global\ZIheighti=0pt + \global\ZIheightii=0pt + \global\ZIheightiii=0pt + \global\ZIheightiv=0pt + \setcounter{nbZI}{0} + \multido{\I=1+1}{\themaxZI}{\setcounter{ZI\I}{0}} + \setcounter{nbvarlignes}{3} } -\newenvironment{tablvar}[2][\intervalwidth]{ - \tablvarinit - \ZIinit[#1] - \begin{array}{% - |c|@{\hspace{\bordercolsep}}% - *{#2}{c@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% - }% - c@{\hspace{\bordercolsep}}|% - } -}{\end{array}} +\newcommand\tv@saveheight{% + \tv@cellheight=0pt + \tv@celldepth=0pt + \ifdim \ht\tv@cellbox > \ht\@arstrutbox + \global\advance\tv@cellheight by \ht\tv@cellbox + \else + \global\advance\tv@cellheight by \ht\@arstrutbox + \fi + \ifdim \dp\tv@cellbox > \dp\@arstrutbox + \global\advance\tv@celldepth by \dp\tv@cellbox + \else + \global\advance\tv@celldepth by \dp\@arstrutbox + \fi +} -\newcounter{nb@intervals} -\newenvironment{tablvar*}[2][\intervalwidth]{ - % environnement tablvar* , type l et r pour les extrémités - \tablvarinit - \ZIinit[#1] - \setcounter{nb@intervals}{#2} - \addtocounter{nb@intervals}{-1} +\newcommand{\tvcoltypes}{ + % type de colonne A pour les légendes à gauche du tableau + \newcolumntype{A}{% + >{\setcounter{tv@icol}{0}\stepcounter{tv@row}\begin{lrbox}% + \tv@cellbox $}% + c% + <{$\end{lrbox}\usebox{\tv@cellbox}\tv@saveheight}} + % type de colonne i pour les intervalles + \newcolumntype{i}{>{\stepcounter{tv@icol} + \centering\arraybackslash$}p{\intervalwidth}<{$}} + % type de colonne v pour les valeurs + \newcolumntype{v}[1]{% un argument optionnel ne fonctionne pas ici + >{\ifthenelse{\value{tv@row}=1}{\begin{lrbox}\tv@cellbox $}{}}% + ##1% + <{\ifthenelse{\value{tv@row}=1}{$\end{lrbox}% + \makebox[\colvalwidth][##1]{\usebox\tv@cellbox}}{}}} +} + +\newenvironment{tablvar}[2][]{% + \setkeys*{tablvar}{#1} % fourni par xkeyval + \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi + \tvcoltypes + \ifextleft \newcolumntype{B}{v{l}} \else \newcolumntype{B}{v{c}} \fi + \ifextright \newcolumntype{E}{v{r}} \else \newcolumntype{E}{v{c}} \fi + \tablvarinit{#2} + \ZIinit \begin{array}{% - |c|@{\hspace{\bordercolsep}}% - l@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% + |@{\hspace{\firstcolsep}}% + A@{\hspace{\firstcolsep}}% + |@{\hspace{\bordercolsep}}% + B@{\hspace{\innercolsep}}% + i@{\hspace{\innercolsep}}% *{\value{nb@intervals}}{ - c@{\hspace{\innercolsep}}% - i{#1}@{\hspace{\innercolsep}}% + v{c}@{\hspace{\innercolsep}}% + i@{\hspace{\innercolsep}}% }% - r@{\hspace{\bordercolsep}}|% + E@{\hspace{\bordercolsep}}|% } }{\end{array}} - +\newenvironment{tablvar*}[2][]{% + \setkeys*{tablvar}{#1} % fourni par xkeyval + \if\XKV@rm\empty \else \setlength{\intervalwidth}{#1} \fi + \begin{tablvar}[extleft,extright]{#2} +}{\end{tablvar}} \newcounter{loop@counter} \newcommand{\varloop}[2]{% \setcounter{loop@counter}{#1} @@ -178,25 +295,25 @@ \newcommand*{\variations}[2][3]{% #1=nblignes (3 par défaut) % (ré)initialisation des compteurs - \setcounter{ligne}{0} % nécessaire pour 2 parties variations + \setcounter{nbvarlignes}{#1} + \setcounter{var@ligne}{0} \setcounter{numdiscont}{0} \multido{\I=1+1}{\themaxdiscont}{\setcounter{discont\I}{0}} - \setcounter{ZIvarlignes}{#1} % nécessaire pour \ZIh % boucle : on exécute le code #2 un nb de fois égal à (#1)-1 \varloop{#1}{% - \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0} - % à chaque boucle on réinitialise certains compteurs - \stepcounter{ligne} % le numéro de ligne est incrémenté + \setcounter{var@noeud}{0}\setcounter{numvr}{0} + % à chaque tour de boucle on réinitialise les compteurs de nœuds + \stepcounter{var@ligne} % le numéro de ligne est incrémenté #2 % les nœuds sont fabriqués par le code #2 (avec \pos et \vr) \\ % retour ligne } % dernière itération -> flèches tracées AVANT \\ sinon bug !? - \setcounter{noeud}{0}\setcounter{numvr}{0}\setcounter{ZI}{0} - \stepcounter{ligne} #2 + \setcounter{var@noeud}{0}\setcounter{numvr}{0} + \stepcounter{var@ligne} #2 % tracé des flèches - \addtocounter{noeud}{-1} % 1 flèche de moins que le nb de nœuds + \addtocounter{var@noeud}{-1} % 1 flèche de moins que le nb de nœuds \setcounter{numdiscont}{1} - \multido{\Ix=1+1,\Iy=2+1}{\thenoeud}{ + \multido{\Ix=1+1,\Iy=2+1}{\thevar@noeud}{ \ifthenelse{\value{discont\thenumdiscont}=\Ix}{ % on saute les discontinuités \stepcounter{numdiscont}}{ @@ -209,95 +326,180 @@ \\ % dernier retour ligne du tableau } -\newcommand*{\@pos}[3][c]{ - \stepcounter{noeud} - \ifthenelse{\theligne=#2}{ - \noeud[#1]{N\thenoeud}{#3} +\newcommand*{\valpos}[3][c]{ + \stepcounter{var@noeud} + \ifthenelse{\thevar@ligne=#2}{ + \noeud[#1]{N\thevar@noeud}{#3} }{} % si ligne != #2, on ne fait rien } -\newcommand*{\@@pos}[2]{\ifthenelse{\theligne=#1}{#2}{}} -\newcommand*{\pos}{\@ifstar{\@@pos}{\@pos}} -\newcommand*{\haut}{\pos{1}} +\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}} -\newcommand*{\bas}{\pos{3}} +\newcommand*{\tv@pos}[3][c]{ + \def\val@@pos{c} + \ifextleft + \ifthenelse{\thetv@icol=0}{\def\val@@pos{l}}{} + \fi + \ifextright + \ifthenelse{\thetv@icol>\thenb@intervals}{\def\val@@pos{r}}{} + \fi + \zbox[\val@@pos]{\valpos[#1]{#2}{#3}} +} +\newcommand*{\tv@@pos}[2]{\ifthenelse{\thevar@ligne=#1}{#2}{}} +\newcommand*{\pos}{\@ifstar{\tv@@pos}{\tv@pos}} -\newcommand*{\mil}{\pos*{2}} +\newcommand*{\haut}{\pos{1}} -\newcommand*{\zbox}[2][c]{\makebox[0pt][#1]{$#2$}} +\newcommand*{\bas}{\pos{\value{nbvarlignes}}} \newcommand*{\vdecal}[2]{\smash{\raisebox{#1}{$#2$}}} -\newcommand*{\bb}{\kern1pt\vrule\kern1pt\vrule\kern1pt} - -\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$} - \color{tvbarrecolor} - \vrule width \tvbarrewidth +\newcommand*{\mil}[1]{% + \mil@heightshift = \ht\@arstrutbox + \advance\mil@heightshift by \dp\@arstrutbox + \divide\mil@heightshift by 2 + \setcounter{mil@rowshift}{3} + \addtocounter{mil@rowshift}{-\value{nbvarlignes}} + \multiply\mil@heightshift by \value{mil@rowshift} + \pos*{2}{\vdecal{\mil@heightshift}{#1}} } +\newcommand*{\barre}[1][]{\makebox[0pt]{$#1$}% + \color{tvbarrecolor}% + \hspace{-0.5\tvbarrewidth}\vrule width \tvbarrewidth} + +\newcommand*{\bb}{% + \kern1.5pt\vrule width \bbrulewidth\kern1pt + \vrule width \bbrulewidth\kern1.5pt} + +\newcommand*{\limg}[3][c]{\zbox[r]{\valpos[#1]{#2}{#3\hspace{\limsep}}}} +\newcommand*{\limd}[3][c]{\zbox[l]{\valpos[#1]{#2}{\hspace{\limsep}#3}}} + \newcommand*{\discont}{ - \ifthenelse{\theligne=1}{ + \ifthenelse{\thevar@ligne=1}{ % on ne compte les discontinuités qu'une seule fois, sur ligne 1 - \stepcounter{numdiscont} - \setcounter{discont\thenumdiscont}{\thenoeud} - }{} - } + \ifthenelse{\thenumdiscont=0}{ + \ifthenelse{\thevar@noeud > 0}{% pas avant le 1er nœud + \stepcounter{numdiscont} + \setcounter{discont\thenumdiscont}{\thevar@noeud} + }{} + }{% on ne compte pas 2 fois la même discontinuité + \ifthenelse{\thevar@noeud > \value{discont\thenumdiscont}}{ + \stepcounter{numdiscont} + \setcounter{discont\thenumdiscont}{\thevar@noeud} + }{} + } + }{} +} -\newsavebox{\@tvlbox} -\newsavebox{\@tvrbox} -\newcommand*{\bblim}[4]{ - \sbox{\@tvlbox}{$#2$} - \sbox{\@tvrbox}{$#4$} - \ifdim \wd\@tvlbox > \wd\@tvrbox - \pos{#1}{#2} \bb\discont - \zbox[l]{\pos{#3}{#4}} \pos*{#1}{\phantom{#2}} - \else - \pos*{#3}{\phantom{#4}} \zbox[r]{\pos{#1}{#2}} - \bb\discont \pos{#3}{#4} - \fi +\newcommand*{\bblim}[4]{\limg{#1}{#2}\bb\discont\limd{#3}{#4}} + +\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf si tv@row=1 + \stepcounter{numvr} + \ifthenelse{\thetv@row=1}{\noeud{X\thenumvr}{#2}}{ + \ifthenelse{\thevar@ligne=#1}{\noeud{Y\thenumvr}{#2}}{} + } } -\newcommand*{\vr}[2][2]{% ligne 2 par défaut sauf sur ligne 0 +\newcommand*{\posvr}[3][c]{% \stepcounter{numvr} - \ifthenelse{\theligne=0}{ - \noeud{X\thenumvr}{#2} - }{ - \ifthenelse{\theligne=#1}{ - \noeud{Y\thenumvr}{#2} + \tv@pos[#1]{#2}{\noeud{Y\thenumvr}{#3}}} + +\newcommand\ZIfind{% calcule numZI + \setcounter{numZI}{0} + \multido{\I=1+1}{\thenbZI}{% il existe déjà des ZI à la même colonne + \ifthenelse{\value{ZI\I}=\value{tv@icol}}{ + \setcounter{numZI}{\I} }{} } } -\newcommand{\ZIc}{\discont \cellcolor[gray]{0.7}} +\newcommand\ZInew{ + \multido{\I=1+1}{\thenbZI}{% on cherche s'il y a des ZI\I=0 + \ifthenelse{\value{ZI\I}=0}{\setcounter{numZI}{\I}}{} + } + \ifthenelse{\value{numZI}>0}{}{ + % si pas de ZI disponible il faut augmenter nbZI + \stepcounter{nbZI} + \setcounter{numZI}{\value{nbZI}} + } + \setcounter{ZI\thenumZI}{\value{tv@icol}} +} + +\newcommand*\ZIreset[1]{ + \ifnum #1 > 0 \setcounter{ZI#1}{0} \fi + \ifnum #1 = 1 + \global\ZIheighti=0pt + \else \ifnum #1 = 2 + \global\ZIheightii=0pt + \else \ifnum #1 = 3 + \global\ZIheightiii=0pt + \else \ifnum #1 = 4 + \global\ZIheightiv=0pt + \fi\fi\fi\fi +} +\newcommand*\ZIaddheight[1]{ + \ZIheight=0pt + \advance\ZIheight by \tv@cellheight + \advance\ZIheight by \tv@celldepth + \advance\ZIheight by 0.5\arrayrulewidth + \ifnum #1 = 1 + \global\advance\ZIheighti by \ZIheight + \else \ifnum #1 = 2 + \global\advance\ZIheightii by \ZIheight + \else \ifnum #1 = 3 + \global\advance\ZIheightiii by \ZIheight + \else \ifnum #1 = 4 + \global\advance\ZIheightiv by \ZIheight + \fi\fi\fi\fi +} + +\newcommand*\ZIgetheight[1]{% + \ifnum #1=1 + \global\ZIheight=\ZIheighti + \else \ifnum #1 = 2 + \global\ZIheight=\ZIheightii + \else \ifnum #1 = 3 + \global\ZIheight=\ZIheightiii + \else \ifnum #1 = 4 + \global\ZIheight=\ZIheightiv + \fi\fi\fi\fi +} \newcommand*{\@ZI}[1][0pt]{% \discont - \ifthenelse{\theligne=\value{ZIvarlignes}}{\@@ZI[#1]}{% - \ifthenelse{\theligne=0 \or \theZI=0}{% - % on ne doit cumuler la hauteur qu'une fois par ligne - % => une seule occurrence de la macro sur une ligne 0 - \global\advance\ZIheight by \ht\@arstrutbox - \global\advance\ZIheight by \dp\@arstrutbox - }{} + \ifthenelse{\thevar@ligne=\value{nbvarlignes}}{\@@ZI[#1]}{% + \ZIfind + \ifnum \thenumZI = 0 \ZInew \fi + \ZIaddheight{\thenumZI} } - \stepcounter{ZI} % RAZ par \variations à chaque ligne } -\newcommand*{\@@ZI}[1][0pt]{% \discont inutile ici - \ifthenelse{\theZIstar=0}{% cumul des longueurs 1 seule fois - \global\advance\ZIheight by \ht\@arstrutbox - \global\advance\ZIheight by #1 - \global\advance\ZIdepth by \dp\@arstrutbox - \global\advance\ZIwidth by \innercolsep - \global\advance\ZIwidth by \innercolsep - \global\advance\ZIwidth by 2pt % espace autour doubles barres - }{} - \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} - \stepcounter{ZIstar} +\newcommand*{\@@ZI}[1][0pt]{ + \discont + \ZIfind + \ifnum \thenumZI > 0 \ZIgetheight{\thenumZI} \else \ZIheight=0pt \fi + \advance\ZIheight by \tv@cellheight + \advance\ZIheight by 0.5\arrayrulewidth + \advance\ZIheight by #1 + \ZIdepth = \tv@celldepth + \ZIwidth = \intervalwidth + \advance\ZIwidth by 2\innercolsep + \advance\ZIwidth by \colvalwidth + \advance\ZIwidth by -1pt % au bord des double barres + \advance\ZIwidth by \ZIaddwidth + \ifthenelse{\equal{\ZItype}{h}}{ + \hachure{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} + }{ + \ZIcouleur{-0.5\ZIwidth,-\ZIdepth}{0.5\ZIwidth,\ZIheight} + } + \ZIreset{\thenumZI} } -\newcommand*{\ZIh}{\@ifstar{\@@ZI}{\@ZI}} +\newcommand*{\ZI}{\@ifstar{\@@ZI}{\@ZI}} +\newcommand*{\ZIc}[1][0pt]{\renewcommand{\ZItype}{c}\@@ZI[#1]} +\newcommand{\ZIh}{\renewcommand{\ZItype}{h}\ZI} \endinput %% %% End of file `tablvar.sty'. |