% -*- coding: utf-8 ; -*-
\documentclass[dvipsnames]{article}% dvipsnames est pour xcolor (chargé par Tikz)
\usepackage{xltxtra}
\usepackage[french]{babel}
\frenchsetup{og = « , fg = »}

\usepackage[xetex]{geometry}
\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}

\usepackage{amsmath}
\usepackage{color}
\usepackage{verbatim}
\usepackage{mathtools}
\usepackage[hyperfootnotes = false]{hyperref}
\usepackage[footnotehyper]{witharrows}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{varwidth}
\usetikzlibrary{calc}
\usepackage[only,llbracket,rrbracket]{stmaryrd}

% We use \MakeShortVerb of shortvrb and not \DefineShortVerb of fancyvrb
% because we don't want the contents of short verbatim colored in gray
\usepackage{shortvrb}
\MakeShortVerb{\|}


\usepackage{fancyvrb}
\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}


\usepackage{titlesec}
\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex}
\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex}


\NewDocumentCommand{\Definition}{m}
  {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily \vphantom{gl}#1}}}

\NewDocumentCommand{\DefinitionCommande}{m}
  {{\setlength{\fboxsep}{1pt}\colorbox{gray!20}{\ttfamily
        \vphantom{gl}\textbackslash #1}}}


\labelformat{equation}{(#1)}

\def\interitem{\vspace{7mm plus 2 mm minus 3mm}}
\def\emphase{\bgroup\color{RoyalPurple}\let\next=}



\usepackage{piton}
\PitonOptions{language = verbatim, detected-commands = {emph,textsl}, splittable = 4}
\SetPitonStyle{ Number = , Comment = }

\ExplSyntaxOn

\dim_new:N \l__pantigny_width_dim 

\keys_define:nn { pantigny }
  { width .dim_set:N = \l__pantigny_width_dim }

\NewPitonEnvironment { Code } { O { } }
  { 
    \medskip
    \char_set_catcode_other:N |
    \cs_set_eq:NN \emph \emphase
    \dim_zero:N \l__pantigny_width_dim 
    \keys_set:nn { pantigny } { #1 }
    \color{gray}
    \dim_compare:nNnT \l__pantigny_width_dim > \c_zero_dim 
      { 
        \PitonOptions { width = \l__pantigny_width_dim } 
        \begin{minipage}[c]{\l__pantigny_width_dim} 
      }
  }
  { 
    \dim_compare:nNnT \l__pantigny_width_dim > \c_zero_dim 
      { \end{minipage} }
    \medskip
  }

\ExplSyntaxOff  




\skip \footins = 2 \bigskipamount

\usepackage[hyperfootnotes = false]{hyperref}

\hypersetup
  {
    pdfinfo = 
      {
        Title = L’extension witharrows ,
        Subject = Une extension pour plain-TeX et LaTeX  ,
        Author = F. Pantigny 
      }
  }

\NewDocumentEnvironment {scope} {} {} {}

\NewDocumentCommand {\pkg} {m} {\textsf{#1}}
\NewDocumentCommand {\cls} {m} {\textsf{#1}}

\setlength{\parindent}{0pt}

\begin{document}


\VerbatimFootnotes

\title{L'extension \pkg{witharrows} pour plain-TeX et LaTeX\thanks{Ce document correspond à la 
version~\myfileversion\space de \pkg{witharrows}, à la date du~\myfiledate.}} 
\author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}  

\maketitle


\begin{abstract}
L'extension \pkg{witharrows} fournit des environments |{WithArrows}| et |{DispWithArrows}|
similaires aux environnements |{aligned}| et |{align}| de l'extension \pkg{amsmath} mais
avec la possibilité de dessiner des flèches sur le côté droit. Ces flèches sont
habituellement utilisées pour donner des explications concernant le calcul mathématique
présenté.
\end{abstract}


\vspace{1cm} L'extension LaTeX \pkg{witharrows} est entièrement contenue dans le fichier
|witharrows.sty|. Ce fichier peut être placé dans le répertoire courant ou dans une
arborescence |texmf|. Le mieux reste néanmoins d'installer \pkg{witharrows} avec une
distribution TeX comme MiKTeX, TeX~Live ou MacTeX.

\medskip
En fait, \pkg{witharrows} est aussi une extension utilisable avec plain-TeX et dans ce
cas, le seul fichier nécessaire est le fichier |witharrows.tex| : voir à ce sujet
p.~\pageref{plain-TeX}. Dans la suite, on décrira l'extension LaTeX.

\medskip
Cette extension peut être utilisée avec |xelatex|, |lualatex|, |pdflatex| mais aussi avec
le cheminement classique |latex|-|dvips|-|ps2pdf| (ou Adobe Distiller). \textsl{Néanmoins,
  le fichier witharrows-french.tex de la présente documentation ne peut être compilé
  qu'avec LuaLaTeX.} L'extension \pkg{witharrows} charge les extensions \pkg{l3keys2e},
\pkg{tikz}, \pkg{varwidth} ainsi que les bibliothèques Tikz \pkg{arrows.meta} et
\pkg{bending}. L'utilisateur final n'a qu'à charger l'extension \pkg{witharrows} avec
l'instruction habituelle : |\usepackage{witharrows}|.

\medskip
Les flèches sont tracées avec Tikz et donc \textbf{plusieurs compilations peuvent être
  nécessaires}.\footnote{Si vous utilisez Overleaf, Overleaf effectue automatiquement un
  nombre de compilations suffisant (en utilisant |latexmk|).}

\bigskip
Cette extension fournit un environnement \Definition{\{WithArrows\}} pour construire des
alignements d'équations avec des flèches pour les explications sur le côté droit.

\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \emph{\Arrow{on développe}} \\
  & = a^2 + 2a + 1  % <------ ne pas mettre de \\ ici
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1  
\end{WithArrows}$



\medskip
La flèche a été tracée avec la commande \DefinitionCommande{Arrow} dans la rangée dont la
flèche part. La commande |\Arrow| doit être utilisée dans la seconde colonne (le mieux est
de la mettre à la fin de la ligne comme dans l'exemple précédent).


\medskip
L'environnement |{WithArrows}| est proche de l'environnement |{aligned}|
de \pkg{amsmath}. L'extension \pkg{witharrows} propose aussi des environnements
|{DispWithArrows}| et |{DispWithArrows*}| qui sont similaires aux environnements |{align}|
et |{align*}| de l'extension \pkg{amsmath}: cf. p.~\pageref{DispWithArrows}.


\section{Options pour la forme des flèches}

La commande |\Arrow| a plusieurs options. Ces options peuvent être placées entre crochets,
avant, ou après, l'argument obligatoire.

\medskip
L'option \Definition{jump} indique le nombre\footnote{Il n'est pas possible de donner une
  valeur négative à |jump|. Voir plus loin (p.~\pageref{Backwards}) la manière de tracer
  une flèche qui remonte.} de rangées que la flèche doit sauter (la valeur initiale est,
bien entendu,~$1$).


\begin{Code}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 \Arrow[\emph{jump=2}]{on développe} \\
  & = (a+b)^2 +  2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 \Arrow[jump=1+1]{on développe} \\
  & = (a+b)^2 + 2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$

\interitem
Il est possible de faire partir plusieurs flèches d'une même rangée.
\begin{Code}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 \emph{\Arrow{}\Arrow{}[jump=2]} \\
  & = (a+b)^2 + 2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 \Arrow{}\Arrow{}[jump=2] \\
  & = (a+b)^2 + 2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$

\interitem L'option \Definition{xoffset} décale la flèche vers la droite (habituellement,
on ne souhaite pas que les flèches soient collées au texte). La valeur initiale de
|xoffset| est de $3$~mm.
\begin{Code}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[\emph{xoffset=1cm}]{avec \texttt{xoffset=1cm}} \\
  & = (a+b)^2 + 2(a+b) +1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[xoffset=1cm]{avec \texttt{xoffset=1cm}} \\
  & = (a+b)^2 + 2(a+b) +1 
\end{WithArrows}$


\interitem 
Les flèches sont tracées avec Tikz. C'est pourquoi la commande |\Arrow| a une option
\Definition{tikz} qui peut être utilisée pour donner à la flèche (en fait, à la commande
|\path| de Tikz) les options proposées par Tikz pour une telle flèche. L'exemple suivant
fournit une flèche en trait épais. 
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[\emph{tikz=thick}]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow[tikz=thick]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\interitem 
Il est également possible de changer les pointes de flèche. Par exemple, nous pouvons
tracer une flèche qui remonte vers le haut avec l'option Tikz~|<-|.\label{Backwards}

\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow\emph{[tikz=<-]}{on factorise} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow[tikz=<-]{on factorise} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\interitem 
Il est aussi possible de supprimer les deux pointes de flèche avec l'option Tikz
«|-|».\par\nobreak
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[\emph{tikz=-}]{très classique} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow[tikz=-]{très classique} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\interitem
Pour avoir des flèches droites et non incurvées, il convient d'utiliser l'option Tikz 
«|bend left = 0|».
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow\emph{[tikz={bend left=0}]}{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow[tikz={bend left=0}]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\smallskip 
En fait, il est possible de modifier de manière plus drastique la forme des flèches avec
l'option |tikz-code| (présentée p.~\pageref{tikz-code}).

\interitem
Il est possible d'utiliser l'option «|text width|» pour contrôler la largeur du texte
associé à la flèche. 
\newcounter{fnnohyphen} \setcounter{fnnohyphen}{\thefootnote}
%
\begin{Code}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[jump=2,\emph{tikz={text width=5.3cm}}]{Nous avons développé...} \\
  & = (a+b)^2 + 2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[jump=2,tikz={text width=5.3cm}]{Nous avons développé en deux étapes 
                                       mais il aurait été plus habile
                                       d'utiliser la formule du multinôme.} \\
& = (a+b)^2 + 2(a+b) +1 \\
& = a^2 + 2ab + b^2 + 2a + 2b +1
\end{WithArrows}$


\bigskip
Dans les environnements |{DispWithArrows}| et |{DispWithArrows*}|, il y a une
option |wrap-lines|. Lorsque cette option est utilisée, les lignes des étiquettes sont
automatiquement coupées sur la marge droite : voir p.~\pageref{DispWithArrows}.

\interitem
Si on veut changer la fonte du texte associé à une flèche, on peut, bien entendu, placer
une commande comme |\bfseries|, |\large| ou |\sffamily| au début du texte. Mais, par
défaut, les étiquettes sont composées avec une combinaison de |\small| et |\itshape|. En
ajoutant |\bfseries| au début du texte, on ne va pas supprimer le |\small| et le
|\itshape| et, par conséquent, on aura un texte en gras, italique et petite taille.
%
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{\emph{\bfseries} on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow{\bfseries on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\interitem 
Il est possible de placer des commandes |\\| dans le texte pour forcer des retours à la ligne\footnote{Par
défaut, ce n'est pas possible dans un nœud Tikz. Néanmoins, dans \pkg{witharrows},
les nœuds sont construits avec l'option |align=left|, et, ainsi, cela devient possible.}. Néanmoins, si on utilise des commandes |\\|, une instruction de fonte placée au début
du texte aura un effet seulement jusqu'à la première occurrence de~|\\| (comme
dans un environnement |{tabular}|). C'est pourquoi Tikz fournit une option
\Definition{font} pour modifier la fonte de tout le texte de l'étiquette. Cette fois-ci, si on
utilise une option |tikz={font={\bfseries}}|, la spécification par défaut constituée par
|\small| et |\itshape| va être écrasée. 
%
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[\emph{tikz={font={\bfseries}}}]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow[tikz={font={\bfseries}}]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\medskip
Si on veut exactement le même résultat que précédemment, on doit donner à l'option |font|
la valeur |\itshape\small\bfseries|.


\interitem 
Presque toutes les options peuvent être données entre crochets à l'environnement
|{WithArrows}|. Il ne doit pas y avoir d'espace entre le |\begin{WithArrows}| et le
crochet ouvrant (|[|) des options de l'environnement. Ces options s'appliquent à toutes
les flèches de l'environnement.\footnote{Elles s'appliquent aussi aux environnements
  imbriqués dans un environnement |{WithArrows}| donné (avec des exceptions attendues pour
  les options |interline|, |code-before| et |code-after|).}
%
\begin{Code}
$\begin{WithArrows}[\emph{tikz=blue}]
A & = \bigl((a+b)+1\bigr)^2 \Arrow{premier développement} \\
  & = (a+b)^2 + 2(a+b) +1 \Arrow{second développement} \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[tikz=blue]
A & = \bigl((a+b)+1\bigr)^2 \Arrow{premier développement} \\
  & = (a+b)^2 + 2(a+b) +1 \Arrow{second développement} \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$


\interitem
L'environnement |{WithArrows}| a une option \Definition{displaystyle}. Avec cette option,
tous les éléments sont composés en |\displaystyle| (comme dans un environnement
|{aligned}| de l'extension \pkg{amsmath}).

\medskip
Sans l'option |displaystyle|:
%
\begin{Verbatim}
$\begin{WithArrows}
\int_0^1 (x+1)^2 dx 
& = \int_0^1 (x^2+2x+1) dx
\Arrow{linéarité de l'intégration}     \\
& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
& = \frac{1}{3} + 2\frac{1}{2} + 1 \\
& = \frac{7}{3}
\end{WithArrows}$
\end{Verbatim}

$\begin{WithArrows}
\int_0^1 (x+1)^2 dx 
& = \int_0^1 (x^2+2x+1) dx
\Arrow{linéarité de l'intégration}     \\
& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
& = \frac{1}{3} + 2\frac{1}{2} + 1 \\
& = \frac{7}{3}
\end{WithArrows}$


\medskip
Le même exemple avec l'option |displaystyle|:\par\nobreak

$\begin{WithArrows}[displaystyle]
\int_0^1 (x+1)^2 dx 
& = \int_0^1 (x^2+2x+1) dx
\Arrow{linéarité de l'intégration}     \\
& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
& = \frac{1}{3} + 2\frac{1}{2} + 1 \\
& = \frac{7}{3}
\end{WithArrows}$



\interitem 
Presque toutes les options peuvent aussi être fixées au niveau du document avec la
commande \DefinitionCommande{WithArrowsOptions}. Dans ce cas, la portée des déclarations
est le groupe TeX courant (de telles déclarations sont parfois qualifiées de
«semi-globales»). Par exemple, si nous voulons que tous les environnements |{WithArrows}|
soient composés en |\displaystyle| avec des flèches bleues, nous pouvons écrire
|\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{Il est aussi possible de configurer
  \pkg{witharrows} en modifiant le style Tikz |WithArrows/arrow| qui est le style utilisé
  par \pkg{witharrows} lors du tracé d'une flèche. Par exemple, pour avoir les étiquettes
  en bleu et en caractères droits, on peut utiliser l'instruction suivante :
  |\tikzset{WithArrows/arrow/.append style = {blue,font = {}}}|.}

\begin{Code}
\emph{\WithArrowsOptions{displaystyle,tikz=blue}}
$\begin{WithArrows}
\sum_{i=1}^n (x_i+1)^2 
& = \sum_{i=1}^n (x_i^2+2x_i+1) \Arrow{par linéarité}\\
& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n
\end{WithArrows}$
\end{Code}

\begin{scope}
\WithArrowsOptions{displaystyle,tikz=blue}
$\begin{WithArrows}
\sum_{i=1}^n (x_i+1)^2 
& = \sum_{i=1}^n (x_i^2+2x_i+1) \Arrow{par linéarité}\\
& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n
\end{WithArrows}$
\end{scope}


\interitem 
La commande |\Arrow| est reconnue seulement dans les environnements de \pkg{witharrows}.
Si on dispose d'une commande |\Arrow| précédemment définie, il est possible de continuer à
l'utiliser à l'extérieur des environnements de \pkg{witharrows}.

Néanmoins, une commande |\Arrow| définie précédemment pourrait encore être utile dans un
environnement |{WithArrows}|. Si vous voulez l'utiliser dans un tel environnement, il est
possible de changer le nom de la commande |\Arrow| de l'extension \pkg{witharrows} grâce à
une option \Definition{command-name} dédiée. Le nouveau nom de la commande doit être
fourni à l'option \emph{sans} la contre-oblique.
%
\begin{Code}
\NewDocumentCommand {\Arrow} {} {\longmapsto}
$\begin{WithArrows}[~emphase#command-name=Explication@]
f & = \bigl(x \Arrow (x+1)^2\bigr)
\emph{\Explication{on travaille directement sur les fonctions}}\\
& = \bigl(x \Arrow x^2+2x+1\bigr)
\end{WithArrows}$
\end{Code}
%
\begin{scope}
\NewDocumentCommand {\Arrow} {} {\longmapsto}
$\begin{WithArrows}[command-name=Explication]
f & = \bigl(x \Arrow (x+1)^2\bigr)
\Explication{on travaille directement sur les fonctions}\\
& = \bigl(x \Arrow x^2+2x+1\bigr)
\end{WithArrows}$
\end{scope}


\interitem 
L'environnement |{WithArrows}| fournit aussi deux options \Definition{code-before} et
\Definition{code-after} pour du code LaTeX qui sera exécuté au début et à la fin de
l'environnement. Ces options ne sont pas conçues pour être utilisées comme des
\emph{hooks} (elles sont disponibles uniquement au niveau de l'environnement et ne
s'appliquent pas aux environnements imbriqués).
%
\begin{Code}
$\begin{WithArrows}[\emph{code-before = \color{blue}}]
A & = (a+b)^2 \Arrow{on développe} \\
  & = a^2 + 2ab + b^2 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[code-before = \color{blue}]
A & = (a+b)^2 \Arrow{on développe} \\
  & = a^2 + 2ab + b^2 
\end{WithArrows}$

\medskip 
Des commandes spéciales sont disponibles dans le |code-after|: une commande
\DefinitionCommande{WithArrowsNbLines} qui indique le nombre de lignes (=rangées) de
l'environnement courant (pour TeX, il s'agit d'une commande et non d'un compteur), une
forme spéciale de la commande |\Arrow| et la commande |\MultiArrow| : ces deux dernières
commandes sont décrites à partir de la page~\pageref{NestedEnv}.

\section{Nombre et formats des colonnes}

Jusqu'à présent, nous n'avons utilisé l'environnement |{WithArrows}| qu'avec deux
colonnes. Néanmoins, il est possible de l'utiliser avec un nombre arbitraire de colonnes
grâce à l'option \Definition{format}. La valeur donnée à cette option est similaire au
préambule d'un environnement |{array}|: il s'agit d'une séquence de lettres |r|, |c| et
|l| mais aussi |R|, |C| et |L|.

\smallskip
Les lettres |R|, |C| et |L| placent des groupes vides |{}| qui permettent un espacement
correct lorsque ces colonnes contiennent des symboles de type |\mathrel| (comme $=$,
$\le$, etc.) ou |\mathbin| (comme $+$, $×$, etc.). Ce système est inspiré par
l'environnement |{IEEEeqnarray}| de \pkg{IEEEtrantools}.

\smallskip
La valeur initiale du paramètre |format| est, en fait, |rL|.

\bigskip
Par exemple, si on veut seulement une colonne alignée à gauche, on peut utiliser l'option
|format=l|.
\begin{Code}
$\begin{WithArrows}[\emph{format = l}]
f(x) \ge g(x) \Arrow{on élève les deux membres au carré} \\
f(x)^2 \ge g(x)^2 \Arrow{on fait tout passer à gauche} \\
f(x)^2 - g(x)^2 \ge 0 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[format = l]
f(x) \ge g(x) \Arrow{on élève les deux membres au carré} \\
f(x)^2 \ge g(x)^2 \Arrow{on fait tout passer à gauche} \\
f(x)^2 - g(x)^2 \ge 0 
\end{WithArrows}$

\interitem
Dans l'exemple suivant, on utilise cinq colonnes toutes centrées (l'environnement
|{DispWithArrows*}| utilisé est présenté p.~\pageref{DispWithArrows}).

\begin{Code}
\begin{DispWithArrows*}[\emph{format = cCcCc},
                        wrap-lines,
                        interline=1mm]
k & \;\le\; & t & \;\le\; & k+1 \\
\frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} 
\Arrow{nous pouvons intégrer les inégalités puisque $k \leq k+1$ } \\
\int\limits_k^{k+1} \frac{dt}{k+1} 
& \le & \int\limits_k^{k+1} \frac{dt}{t} 
& \le & \int\limits_k^{k+1} \frac{dt}{k} \\
\frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} 
\end{DispWithArrows*}
\end{Code}
\begin{DispWithArrows*}[format = cCcCc,
                        wrap-lines,
                        interline=1mm]
k & \;\le\; & t & \;\le\; & k+1 \\
\frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} 
\Arrow{nous pouvons intégrer les inégalités puisque $k \leq k+1$} \\
\int\limits_k^{k+1} \frac{dt}{k+1} 
& \le & \int\limits_k^{k+1} \frac{dt}{t} 
& \le & \int\limits_k^{k+1} \frac{dt}{k} \\
\frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} 
\end{DispWithArrows*}


\section{Positionnement précis des flèches}

L'environnement |{WithArrows}| construit, lors de la composition du tableau, deux séries
de nœuds représentés en rouge dans l'exemple suivant.\footnote{L'option
  \Definition{show-nodes} peut être utilisée pour visualiser ces nœuds. Les nœuds sont en
  fait des nœuds Tikz de forme rectangulaire et de largeur nulle. Une flèche entre deux
  nœuds part de l'ancre sud (\emph{south anchor}) du premier nœud et arrive à l'ancre nord
  (\emph{north anchor}) du deuxième nœud.}


\smallskip
$\begin{WithArrows}[displaystyle,show-nodes]
I
& = \int_{\frac{\pi}{4}}^0 \ln\Bigl(1+\tan\left(\tfrac{\pi}{4}-u\right)\Bigr)(-d u) \\
& = \int_0^{\frac{\pi}{4}} \ln\Bigl(1+\tan\left(\tfrac{\pi}{4}-u\right)\Bigr)d u \\
& = \int_0^{\frac{\pi}{4}}\ln\left(1+\frac{1-\tan u}{1+\tan u}\right)\, d u \\
& =\int_0^{\frac{\pi}{4}}\ln\left(\frac{1+\tan u+1-\tan u}{1+\tan u}\right) d u \\
& =\int_0^{\frac{\pi}{4}} \ln\left(\frac{2}{1+\tan u}\right)\, d u\\
& =\int_0^{\frac{\pi}{4}}\bigl(\ln2-\ln(1+\tan u)\bigr)\, d u \\
& =\frac{\pi}{4}\ln2-\int_0^{\frac{\pi}{4}}\ln(1+\tan u)\, d u  \\
& =\frac{\pi}{4}\ln2-I 
\end{WithArrows}$

\bigskip
Les nœuds sur la gauche sont à la fin de chaque ligne de texte. Ces nœuds seront appelés
\emph{nœuds de gauche}. Les nœuds du côté droit sont alignés verticalement sur le bord
droit de l'alignement d'équations. Ces nœuds seront appelés \emph{nœuds de droite}.


Par défaut, les flèches utilisent les nœuds de droite. Nous dirons que ces flèches sont
dans le mode \Definition{rr} (\emph{r} for \emph{right} en anglais). Ces flèches sont
verticales (nous dirons qu'une flèche est \emph{verticale} lorsque ses deux extrémités
sont à la même abscisse).



\smallskip
Néanmoins, il est possible d'utiliser les nœuds de gauche, ou une combinaison de nœuds de
gauche et de droite avec l'une des options \Definition{lr}, \Definition{rl} et
\Definition{ll} (\emph{l} for \emph{left} en anglais). Ces flèches sont, la plupart du
temps, non verticales. 


Ainsi\enskip
$\begin{WithArrows}[displaystyle]
I
& = \int_{\frac{\pi}{4}}^0 \ln\Bigl(1+\tan\left(\tfrac{\pi}{4}-u\right)\Bigr)(-d u) 
\Arrow[lr]{Cette flèche utilise une option \texttt{lr}.}\\
& = \int_0^{\frac{\pi}{4}} \ln\Bigl(1+\tan\left(\tfrac{\pi}{4}-u\right)\Bigr)d u \\
& = \int_0^{\frac{\pi}{4}}\ln\left(1+\frac{1-\tan u}{1+\tan u}\right)\, d u \\
& =\int_0^{\frac{\pi}{4}}\ln\left(\frac{1+\tan u+1-\tan u}{1+\tan u}\right) d u 
\Arrow[ll,jump=2,tikz={text width = 5cm}]{Cette flèche utilise une option \texttt{ll} 
et une option \texttt{jump} fixée à $2$}\\ 
& =\int_0^{\frac{\pi}{4}} \ln\left(\frac{2}{1+\tan u}\right)\, d u\\
& =\int_0^{\frac{\pi}{4}}\bigl(\ln2-\ln(1+\tan u)\bigr)\, d u \\
& =\frac{\pi}{4}\ln2-\int_0^{\frac{\pi}{4}}\ln(1+\tan u)\, d u  \\
& =\frac{\pi}{4}\ln2-I 
\end{WithArrows}$


\interitem 
Il y a aussi une option nommée \Definition{i} (\emph{i} pour \emph{intermédiaire}). Avec cette option, la flèche est
verticale et calée à gauche.

\begin{Code}
$\begin{WithArrows}
(a+b)(a+ib)(a-b)(a-ib) 
& = (a+b)(a-b)\cdot(a+ib)(a-ib) \\
& = (a^2-b^2)(a^2+b^2) \Arrow\emph{[i]}{parce que $(x-y)(x+y)=x^2-y^2$}\\
& = a^4-b^4 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
(a+b)(a+ib)(a-b)(a-ib) 
& = (a+b)(a-b)\cdot(a+ib)(a-ib) \\
& = (a^2-b^2)(a^2+b^2) \Arrow[i]{parce que \((x-y)(x+y)=x^2-y²\)}\\
& = a^4-b^4 
\end{WithArrows}$


\interitem 
L'environnement |{WithArrows}| propose aussi une option \Definition{group}. Avec cette option,
\emph{toutes} les flèches de l'environnement sont regroupées sur une même verticale calée à gauche.
\label{group}
%
\begin{Code}
$\begin{WithArrows}[\emph{displaystyle,group}]
2xy'-3y=\sqrt{x}
& \Longleftrightarrow 2x(K'y_0+Ky_0')-3Ky_0 = \sqrt{x} \\
& \Longleftrightarrow 2xK'y_0 + K(2xy_0'-3y_0) = \sqrt{x} \\
& \Longleftrightarrow 2x K'y_0 = \sqrt{x} \Arrow{...}\\
...
\end{WithArrows}$
\end{Code}


$\begin{WithArrows}[displaystyle,group]
2xy'-3y=\sqrt{x}
& \Longleftrightarrow 2x(K'y_0+Ky_0')-3Ky_0 = \sqrt{x} \\
& \Longleftrightarrow 2xK'y_0 + K(2xy_0'-3y_0) = \sqrt{x} \\
& \Longleftrightarrow 2x K'y_0 = \sqrt{x} \Arrow{on remplace $y_0$ par sa valeur}\\
& \Longleftrightarrow 2xK'x^{\frac{3}{2}} = x^{\frac{1}{2}} \Arrow{simplification par $x$}\\
& \Longleftrightarrow K' = \tfrac{1}{2x^2} \Arrow{on primitive}\\
& \Longleftrightarrow K = -\tfrac{1}{2x} 
\end{WithArrows}$


\bigskip
L'environnement |{WithArrows}| fournit encore une autre option, nommée \Definition{groups}
(avec un \emph{s} dans le nom). Avec cette option, les flèches sont divisées en plusieurs
«groupes». Chaque groupe est un ensemble de flèches connectées entre elles\footnote{Plus
  précisément : pour chaque flèche $a$, notons $i(a)$ le numéro de sa rangée de départ et
  $f(a)$ le numéro de sa rangée d'arrivée ; pour deux flèches $a$ et $b$, nous noterons
  $a \sim b$ lorsque
  $\llbracket i(a),f(a)\rrbracket \cap \llbracket i(b),f(b)\rrbracket \neq \varnothing$ ;
  les groupes sont les classes d'équivalence de la clôture transitive de la relation
  $\sim$.}. Toutes les flèches d'un même groupe sont placées sur une même verticale qui
est calée à gauche.


\bigskip
$\begin{WithArrows}[groups]
A & = B \Arrow{un} \\
  & = C+D \Arrow{deux} \\
  & = D' \\
  & = E+F+G+H+I \\
  & = K + L + M \Arrow{trois}\\
  & = N \Arrow{quatre}\\
  & = O
\end{WithArrows}$

\bigskip 
Dans un environnement qui utilise l'option |group| ou l'option |groups|, il est encore
possible de donner une option de position (|ll|, |lr|, |rl|, |rr| ou |i|) à une flèche
individuelle\footnote{Une telle flèche est qualifiée d'\emph{indépendante}
  (\emph{independent} en anglais) dans la documentation technique.}. Une telle flèche sera
tracée indépendamment des groupes. Il est aussi possible de commencer un nouveau groupe
avec l'option \Definition{new-group} pour une certaine flèche.


\bigskip
Si on le souhaite, on peut passer l'option |group| ou |groups| à la commande
|WithArrowsOptions| de telle sorte qu'elle deviendra la valeur par défaut (jusqu'à la fin
du groupe TeX courant). Dans ce cas, il est encore possible de revenir au comportement par
défaut pour un environnement |{WithArrows}| donné avec l'option |rr|:
|\begin{WithArrows}[rr]|.


\vspace{1cm} 
Dans l'exemple suivant, nous avons utilisé l'option |groups| pour l'environnement et
l'option |new-group| pour la dernière flèche (c'est pourquoi cette dernière flèche n'est
pas alignée avec les premières).

\bigskip
$\begin{WithArrows}[interline=1mm,groups]
\sum\limits_{k=0}^n\frac{\cos kx}{\cos^k x}
& = \sum\limits_{k=0}^n \frac{\Re (e^{ikx})}{(\cos x)^k} 
\Arrow{\((\cos x)^k\) est réel} \\
& = \sum\limits_{k=0}^n \Re\left(\frac{e^{ikx}}{(\cos x)^k}\right)
\Arrow{\(\Re(z+z')=\Re(z)+\Re(z')\)}\\
& = \Re \left(\sum\limits_{k=0}^n \left(\frac{e^{ix}}{\cos x}\right)^k\right)
\Arrow{somme de termes d'une suite géométrique} \\
& = \Re \left(\frac{1-\left(\frac{e^{ix}}{\cos x}\right)^{n+1}}{1-\frac{e^{ix}}{\cos x}} \right)
\Arrow{calcul algébrique} \\
& = \Re \left(\frac{1-\frac{e^{i(n+1)x}}{\cos^{n+1}x}}{1-\frac{e^{ix}}{\cos x}}\right)
\Arrow{réduction au même dénominateur} \\
& = \Re \left(\frac{\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos^{n+1}x}}{\frac{\cos x-e^{ix}}{\cos x}}\right)
\Arrow{\(\Re(kz) = k\cdot\Re(z)\) lorsque \(k\) est réel} \\
& = \frac{1}{\cos^n x}\Re \left(\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos x-e^{ix}}\right)
\Arrow[new-group]{forme algébrique des nombres complexes} \\
& =\frac{1}{\cos^n x}
    \Re\left(\frac{\cos^{n+1}x-(\cos(n+1)x+i\sin(n+1)x)}{\cos x-(\cos x+i\sin x)}\right) \\
& =\frac{1}{\cos^n x}
    \Re\left(\frac{(\cos^{n+1}x-\cos(n+1)x)-i\sin(n+1)x}{-i\sin x}\right) \\
& = \frac{1}{\cos^nx}\cdot\frac{\sin(n+1)x}{\sin x}
\end{WithArrows}$


\interitem
\section{L'option « o » pour des flèches individuelles}

\label{option-o}

Considérons, dans un environnement donné, deux flèches notées formellement $a$ et $b$. 

On notera $i_a$ et $i_b$ les numéros des lignes de départ de $a$ et $b$ et $f_a$ et $f_b$
les numéros de leurs lignes d'arrivée. On a bien entendu $i_a \le f_a$ et $i_b \le f_b$

\smallskip
On dira que la flèche~$a$ \emph{recouvre} la flèche~$b$ lorsque $i_a \le i_b \le f_b \le f_a$


\medskip
\parbox{8cm}{Dans l'exemple ci-contre, la flèche rouge recouvre la flèche bleue.}\hspace{3cm}
$\begin{WithArrows}[c]
A & = B \Arrow[tikz=red,jump=3]{}\\
  & = C \Arrow[tikz=blue]{}\\
  & = D \\
  & = E
\end{WithArrows}$

\bigskip
Au niveau local, il existe une option \Definition{o}. Cette option n'est disponible que
lorsque l'on est en mode |group| ou bien en mode |groups| (cf. p.~\pageref{group}).

Une flèche de type |o| est tracée avec un décalage horizontal (comme celui fixé par
|xoffset|) calculé automatiquement en fonction des flèches qu'elle
recrouvre.\footnote{Parmi les flèches recouvertes, les flèches indépendantes (c'est-à-dire
  celles qui ont une option explicite |rr|, |ll|, |rl|, |lr|, |i|, |up| ou |down|) ne sont
  pas prises en compte pour le calcul du |xoffset|.}


\bigskip
\begin{Code}[width=10cm]
$\begin{WithArrows}[groups]
A & = B     \Arrow{un}\Arrow[\emph{o},jump=3]{direct} \\
  & = C + C \Arrow{deux} \\
  & = D + D + D \Arrow{trois} \\
  & = E + E \\
  & = F + F 
\end{WithArrows}$
\end{Code}
$\begin{WithArrows}[c,groups]
A & = B     \Arrow{un}\Arrow[o,jump=3]{direct} \\
  & = C + C \Arrow{deux} \\
  & = D + D + D \Arrow{trois} \\
  & = E + E \\
  & = F + F 
\end{WithArrows}$



\interitem
Les flèches de type |o| peuvent elles-mêmes être recouvertes par d'autres flèches de
type~|o|:\par\nobreak

\bigskip
\begin{Code}
$\begin{WithArrows}[groups]
A & = B \Arrow{un}\Arrow[\emph{o},jump=2]{deux}\Arrow[\emph{o},jump=3]{trois}\\
  & = C \\
  & = D \\
  & = E + E + E + E + E + E + E 
\end{WithArrows}$
\end{Code}


\bigskip
$\begin{WithArrows}[c,groups]
A & = B \Arrow{un}\Arrow[o,jump=2]{deux}\Arrow[o,jump=3]{trois}\\
  & = C \\
  & = D \\
  & = E + E + E + E + E + E + E 
\end{WithArrows}$

\bigskip
L'espace (horizontal) entre une flèche de type |o| et les flèches immédiatement
recouvertes est fixé par le paramètre \Definition{xoffset-for-o-arrows} que l'on peut
régler avec |\WithArrowsOptions| (valeur initiale : 2~mm).

\bigskip
\emph{Remarque} : La lettre |o| a été choisie car c'est la première lettre du mot anglais
\emph{over}. Une flèche de type~|o| est \emph{au-dessus} des flèches qu'elle recouvre.

\interitem

\section{Les options « up » et « down » pour des flèches individuelles} 

\label{up-and-down}
Au niveau local, il y a deux options pour les flèches individuelles, nommées
\Definition{up} et \Definition{down}. L'exemple suivant illustre ces types de flèches:


\begin{Code}
\(\begin{WithArrows}
A & = B 
\Arrow\emph{[up]}{une flèche de type \texttt{up}} \\
  & = C + C + C + C + C + C + C + C  \\
  & = C + C + C + C + C + C + C + C  
\Arrow\emph{[down]}{une flèche de type \texttt{down}} \\
  & = E + E 
\end{WithArrows}\)
\end{Code}

\bigskip
$\begin{WithArrows}
A & = B 
\Arrow[up]{une flèche de type \texttt{up}} \\
  & = C + C + C + C + C + C + C + C  \\
  & = C + C + C + C + C + C + C + C  
\Arrow[down]{une flèche de type \texttt{down}} \\
  & = E + E 
\end{WithArrows}$


\vspace{1cm} 
Les options |up| et |down| nécessitent la bibliothèque Tikz \pkg{calc}. Si elle n'a pas
été chargée au préalable par l'utilisateur, une erreur sera levée.

\vspace{1cm}
Les options |up| et |down| peuvent en fait prendre comme valeur une liste de couples
clé-valeur.  
\begin{itemize}
\item La clé \Definition{radius} est le rayon de l'angle arrondi de la flèche\footnote{La
  valeur initiale de ce paramètre est égale à $4$~pt, qui est la valeur par défaut du
  ``|rounded corners|'' de Tikz.}.
\item La clé \Definition{width} contrôle la largeur (de la partie horizontale) de la flèche :
\begin{itemize}
\item avec la valeur \Definition{max}, la largeur de la flèche est ajustée par rapport à
la position des nœuds (c'est le comportement par défaut des flèches |up| et |down| comme
illustré dans l'exemple précédent) ;
\item avec une valeur numérique, la largeur de la flèche est directement fixée par cette
valeur numérique ;
\item avec la valeur \Definition{min}, la largeur de la flèche est ajustée au contenu de
son étiquette. 
\end{itemize}
\end{itemize}

\vspace{1cm}
\begin{Code}
$\begin{WithArrows}
A & = B 
\Arrow[\emph{up={width=2cm,radius=0pt}}]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$
\end{Code}

\medskip
$\begin{WithArrows}
A & = B 
\Arrow[up={width=2cm,radius=0pt}]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$


\vspace{1cm}
\begin{Code}
$\begin{WithArrows}
A & = B 
\Arrow[\emph{up={width=min}}]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$
\end{Code}

\medskip
$\begin{WithArrows}
A & = B 
\Arrow[up={width=min}]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$

\vspace{1cm}
Les options relatives aux flèches |up| et |down| peuvent être fixées au niveau global ou
environnemental avec la clé \Definition{up-and-down}. Cette clé peut aussi être utilisée
comme préfixe comme illustré maintenant.
%
\begin{Verbatim}
\WithArrowsOptions{up-and-down/width=min}
\end{Verbatim}

\interitem

\section{Comparaison avec l'environnement \{aligned\}}

L'environnement |{WithArrows}| présente des similitudes avec l'environnement |{aligned}|
de l'extension \pkg{amsmath}. Ce sont seulement des similitudes car |{WithArrows}| n'a pas
été écrit en s'appuyant sur |{aligned}|.\footnote{En fait, il est possible d'utiliser
  l'extension \pkg{witharrows} sans l'extension \pkg{amsmath}.}

\interitem 

Comme dans les environnements de l'extension \pkg{amsmath}, il est possible de changer
l'espacement entre deux rangées avec l'option de la commande |\\| de fin de ligne (il est
aussi possible d'utiliser |\\*| mais cela a exactement le même effet que |\\| puisqu'un
environnement |{WithArrows}| est toujours insécable). Cette option est conçue pour être
utilisée avec des valeurs positives uniquement.
%
\begin{Code}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \emph{\\[2ex]}
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \\*[2ex]
\noalign{\vspace{3mm}}
  & = a^2 + 2a + 1 
\end{WithArrows}$


\interitem 
Dans les environnements de l'extension \pkg{amsmath} (ou de \pkg{mathtools}), l'espace
entre deux rangées est fixé par un paramètre appelé |\jot| (il s'agit d'une dimension et
non d'un ressort). C'est aussi le cas pour l'environnement |{WithArrows}|. Une option
\Definition{jot} a été ajoutée à l'environnement |{WithArrows}| dans le but de changer ce
paramètre |\jot| pour un environnement donné.\footnote{Il est aussi possible de changer
  |\jot| avec l'environnement |{spreadlines}| de \pkg{mathtools}.}
%
\begin{Code}
$\begin{WithArrows}[displaystyle,\emph{jot=2ex}]
F & = \frac{1}{2}G     \Arrow{on développe}\\
  & = H + \frac{1}{2}K \Arrow{on continue}\\
  & = K 
\end{WithArrows}$
\end{Code}


$\begin{WithArrows}[displaystyle,jot=2ex]
F & = \frac{1}{2}G     \Arrow{on développe}\\
  & = H + \frac{1}{2}K \Arrow{on continue}\\
  & = K 
\end{WithArrows}$


\bigskip
Néanmoins, cette nouvelle valeur de |\jot| sera aussi utilisée dans les nouveaux
alignements inclus dans l'environnement~|{WithArrows}|:
%
\begin{Code}
$\begin{WithArrows}[\emph{jot=2ex}]
\varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
\Arrow{$x$ et $y$ sont réels}\\
& \Leftrightarrow \left\{
\begin{aligned}
x+y & = 0 \\
x+2y & = 0 
\end{aligned}
\right.
\end{WithArrows}$
\end{Code}


$\begin{WithArrows}[jot=2ex]
\varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
\Arrow{\(x\) et \(y\) sont réels}\\
& \Leftrightarrow \left\{
\begin{aligned}
x+y & = 0 \\
x+2y & = 0 
\end{aligned}
\right.
\end{WithArrows}$

\bigskip
Peut-être que cela ne correspond pas au résultat souhaité. C'est pourquoi une option
\Definition{interline} est fournie. Il est possible d'utiliser un ressort (\emph{skip})
pour cette option.
%
\begin{Code}
$\begin{WithArrows}[\emph{interline=2ex}]
\varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
\Arrow{$x$ et $y$ sont réels}\\
& \Leftrightarrow \left\{
\begin{aligned}
x+y & = 0 \\
x+2y & = 0 \\
\end{aligned}
\right.
\end{WithArrows}$
\end{Code}


$\begin{WithArrows}[interline=2ex]
\varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
\Arrow{\(x\) et \(y\) sont réels}\\
& \Leftrightarrow \left\{
\begin{aligned}
x+y & = 0 \\
x+2y & = 0 \\
\end{aligned}
\right.
\end{WithArrows}$


\interitem 
De même que l'environnement |{aligned}|, |{WithArrows}| a une option de placement qui peut
prendre les valeurs \Definition{t}, \Definition{c} ou \Definition{b}. Néanmoins, la valeur
initiale n'est pas |c| mais |t|. Si on le souhaite, il est possible d'avoir la valeur |c|
comme valeur par défaut en utilisant l'instruction |\WithArrowsOptions{c}| au début du document.
%
\begin{Verbatim}
Ainsi\enskip
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

Ainsi\enskip 
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$

\bigskip
La valeur |c| peut être utile, par exemple, si on souhaite mettre une accolade :

\smallskip
% Dans le code suivant, on ne peut utiliser {Code} avec \emph{} à cause du \{...
\begin{Verbatim}
On pose\enskip $~emphase#{\left\{@
\begin{WithArrows}[~emphase#c@]
f(x) & = 3x^3+2x^2-x+4 
\Arrow[tikz=-]{les deux sont des polynômes}\\
g(x) & = 5x^2-5x+6
\end{WithArrows}
~emphase#\right.@
\end{Verbatim}


On pose\enskip $\left\{
\begin{WithArrows}[c]
f(x) & = 3x^3+2x^2-x+4 
\Arrow[tikz=-]{les deux sont des polynômes}\\
g(x) & = 5x^2-5x+6
\end{WithArrows}
\right.$


\interitem
Contrairement à |{aligned}|, l'environnement |{WithArrows}| utilise |\textstyle| par défaut.

Là aussi, il est possible de changer ce comportement avec |\WithArrowsOptions|:

\smallskip
|\WithArrowsOptions{displaystyle}|.


\smallskip
L'exemple suivant est composé avec |{aligned}|:\par\nobreak

\smallskip
$\left\{
\begin{aligned}
\sum_{i=1}^n (x_i+1)^2  
& = \sum_{i=1}^n (x_i^2 + 2x_i+1) \\
& = \sum_{i=1}^n x_i^2 + 2 \sum_{i=1}^n x_i + n 
\end{aligned}
\right.$


\medskip 
L'exemple suivant est composé avec |{WithArrows}[c,displaystyle]|. Les résultats 
sont parfaitement identiques.\par\nobreak

\smallskip
$\left\{
\begin{WithArrows}[c,displaystyle]
\sum_{i=1}^n (x_i+1)^2 
& = \sum_{i=1}^n (x_i^2 + 2x_i+1) \\
& = \sum_{i=1}^n x_i^2 + 2 \sum_{i=1}^n x_i + n 
\end{WithArrows}
\right.$


\section{Les flèches dans les environnements imbriqués}

\label{NestedEnv}

Les environnements |{WithArrows}| peuvent être imbriqués. Dans ce cas, les options fournies
à l'environnement englobant s'appliquent aussi aux environnements imbriqués (avec des
exceptions tout à fait attendues pour |interline|, |code-before| et |code-after|). La commande
|\Arrow| peut être utilisée dans chaque environnement |{WithArrows}|.

\begin{Code}
$\emph{\begin{WithArrows}}
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{les nombres sont réels}\\
  & \Leftrightarrow
  \left\{\emph{\begin{WithArrows}}[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  \emph{\end{WithArrows}}\right. \\
  & \Leftrightarrow
  \left\{\emph{\begin{WithArrows}}[c]
  x+2y & = 0 \Arrow[tikz=-]{la même équation}\\
  x+2y & = 0 
  \emph{\end{WithArrows}}\right. \\
  & \Leftrightarrow x+2y=0 
\emph{\end{WithArrows}}$
\end{Code}

$\begin{WithArrows}
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{les nombres sont réels}\\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \Arrow[tikz=-]{la même équation}\\
  x+2y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow x+2y=0 
\end{WithArrows}$

\bigskip
Néanmoins, on peut souhaiter tracer une flèche entre des rangées qui ne sont pas dans le
même environnement. Par exemple, on pourrait souhaiter tracer la flèche suivante :

\bigskip
$\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division par $2$} ]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  x+2y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow x+2y=0 
\end{WithArrows}$


\bigskip
Une telle construction est possible en utilisant |\Arrow| dans le |code-after| :
dans le |code-after|, une version spéciale de la commande |\Arrow| est disponible 
(nous l'appellerons  «|\Arrow| dans le |code-after|»).

\smallskip
Une commande |\Arrow| dans le |code-after| prend trois arguments :
\begin{itemize}
\item une spécification pour la rangée de départ de la flèche ;
\item une spécification pour la rangée d'arrivée ;
\item une étiquette pour la flèche.
\end{itemize}
Comme d'habitude, il est possible de donner des options entre crochets avant ou après les
trois arguments obligatoires. Néanmoins, ces options sont limitées (voir plus bas).

\interitem La spécification de rangée est construite avec la position de l'environnement
conidéré dans l'arbre des imbrications, suivie, après un trait d'union, par le numéro de
la rangée.

\bigskip
Dans l'exemple précédent, il y a deux environnements |{WithArrows}| imbriqués dans
l'environnement |{WithArrows}| principal.

\medskip
$\begin{WithArrows}[tikz-code = {\path (#1) to node {#3} (#2) ; }]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
  & \Leftrightarrow \color{blue}
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \Arrow{environnement \no 1}\\
  2x+4y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow \color{red}
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \Arrow{environnement \no 2}\\
  x+2y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow x+2y=0 
\end{WithArrows}$

\bigskip
La flèche que nous voulons tracer part de la rangée~$2$ du sous-environnement \no $1$ (et,
par conséquent, la spécification est |1-2|) et arrive à la rangée~$2$ du
sous-environnement \no $2$ (et, par conséquent, la spécification est |2-2|). Nous pouvons
tracer la flèche avec une commande |\Arrow| dans le |code-after| de la manière suivante :

\begin{Code}
$\begin{WithArrows}[\emph{code-after = \Arrow{1-2}{2-2}{division par $2$}}]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
.........
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[code-after = \Arrow{1-2}{2-2}{division par $2$} ]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  x+2y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow x+2y=0 
\end{WithArrows}$

\bigskip
Les options autorisées pour une commande |\Arrow| dans le |code-after| sont : |ll|, |lr|,
|rl|, |rr|, |v|, |xoffset|, |tikz| et |tikz-code|. Exceptée |v|, qui est spécifique à
|\Arrow| dans le |code-after|, toutes ces options ont leur signification habituelle.


Avec l'option |v|, la flèche tracée est verticale à une abscisse calculée avec la rangée
de départ et la rangée d'arrivée uniquement : les lignes intermédiaires ne sont pas prises
en compte contrairement à ce qui se passe avec l'option |i|. Pour le moment, l'option |i|
n'est pas disponible pour la commande~|\Arrow| dans le |code-after|. Néanmoins, il est
toujours possible de déplacer une flèche avec |xoffset| (ou |xshift| de Tikz).
\begin{Code}
$\begin{WithArrows}[code-after=\Arrow\emph{[v]}{1-2}{2-2}{division by $2$}]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
.........
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division par $2$} ]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow
  \left\{\begin{WithArrows}[c]
  x+2y & = 0 \\
  x+2y & = 0 
  \end{WithArrows}\right. \\
  & \Leftrightarrow x+2y=0 
\end{WithArrows}$

 
\interitem 
L'extension \pkg{witharrows} fournit une autre commande disponible dans le |code-after| :
la commande \DefinitionCommande{MultiArrow}. Cette commande dessine un «rateau». La liste
des rangées concernées par ce rateau est donnée dans le premier argument de la commande
|\MultiArrow|. La syntaxe utilisée pour décrire cette liste est celle de la commande
|\foreach| de \pkg{pgffor}.

\begin{Code}
$\begin{WithArrows}[tikz = rounded corners,
                    code-after = {\emph{\MultiArrow{1,...,4}{text}}} ]
A & = B \\
  & = C \\
  & = D \\
  & = E \\
  & = F
\end{WithArrows}$
\end{Code}


$\begin{WithArrows}[tikz = rounded corners,
                    code-after = {\MultiArrow{1,...,4}{text}}]
A & = B \\
  & = C \\
  & = D \\
  & = E \\
  & = F
\end{WithArrows}$

\medskip
Pour le moment, aucune option n'est disponible pour cette commande |\MultiArrow|.


\medskip
\section{Dessiner des flèches depuis l'extérieur des  environnements \{WithArrows\}}

Si on désire dessiner des flèches depuis l'extérieur des environnements |{WithArrows}|, il
est possible de le faire en utilisant les nœuds Tikz créés par ces environnements.

Le nom d'un nœud Tikz créé par \pkg{witharrows} est préfixé par |wa-|. Ensuite, on trouve
une liste de nombres qui indique quelle est la position de l'environnement dans l'arbre
d'imbrication des environnements. À la fin, on a le suffixe |l| pour un nœud de gauche et
le suffixe |r| pour un nœud de droite.

\smallskip
À titre d'illustration, nous donnons un exemple d'environnements |{WithArrows}| imbriqués
et, pour chaque nœud de droite, le nom de ce nœud.\footnote{Il existe une option
  \Definition{show-node-names} pour faire afficher les noms de ces nœuds.}


\medskip
\[\begin{WithArrows}[show-nodes,show-node-names]
A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\
& \vartriangleleft \left\{
\begin{WithArrows}[c]
C & \vartriangleleft D \\
E & \vartriangleleft F 
\end{WithArrows}
\right. \\
 & \vartriangleleft 
\left\{
\begin{WithArrows}[c]
G & \vartriangleleft H+H+H+H+H+H+H \\
I & \vartriangleleft 
\left\{
\begin{WithArrows}
J &\vartriangleleft K \\
L &\vartriangleleft M 
\end{WithArrows}
\right.
\end{WithArrows}
\right. \\
 & \vartriangleleft 
\left\{
\begin{WithArrows}[c]
N & \vartriangleleft O \\
P & \vartriangleleft Q 
\end{WithArrows}
\right.
\end{WithArrows}\]

\medskip
L'extension \pkg{witharrows} fournit quelques outils pour faciliter l'utilisation de ces nœuds :
\begin{itemize}
\item la commande \DefinitionCommande{WithArrowsLastEnv} donne le numéro du dernier
environnement de niveau~$0$ (c'est-à-dire non imbriqué dans un autre environnement de
\pkg{witharrows}) ; 

\item un nom peut être donné à un environnement avec l'option \Definition{name} et, dans
ce cas, les nœuds créés dans l'environnement auront des alias construits en utilisant ce
nom ;

\item le style Tikz \Definition{WithArrows/arrow} est le style utilisé par
\pkg{witharrows} pour dessiner une flèche\footnote{Plus précisément, ce style est passé à Tikz via l'option «|every path|» avant le dessin de la
  flèche (qui se fait avec l'instruction Tikz stockée dans |tikz-code|). Ce style est modifié par l'option
  |tikz| de \pkg{witharrows} (avec une portée correspondant au groupe TeX courant).} ;

\item le style Tikz \Definition{WithArrows/arrow/tips} est le style utilisé pour la pointe
de flèche (ce style est lui-même chargé par le style |WithArrows/arrow|).
\end{itemize}

Par exemple, nous pouvons tracer une flèche allant de  \texttt{wa-\WithArrowsLastEnv-2-1-2-r.south}
à \texttt{wa-\WithArrowsLastEnv-3-2-r.north} avec l'instruction Tikz suivante :

\begin{Verbatim}
\begin{tikzpicture}[remember picture,overlay]
\draw [WithArrows/arrow] 
      ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south)
   to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ;
\end{tikzpicture}
\end{Verbatim}

\[\begin{WithArrows}
A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\
& \vartriangleleft \left\{
\begin{WithArrows}[c]
C & \vartriangleleft D \\
E & \vartriangleleft F 
\end{WithArrows}
\right. \\
 & \vartriangleleft 
\left\{
\begin{WithArrows}[c]
G & \vartriangleleft H+H+H+H+H+H+H \\
I & \vartriangleleft 
\left\{
\begin{WithArrows}
J &\vartriangleleft K \\
L &\vartriangleleft M 
\end{WithArrows}
\right.
\end{WithArrows}
\right. \\
 & \vartriangleleft 
\left\{
\begin{WithArrows}[c]
N & \vartriangleleft O \\
P & \vartriangleleft Q 
\end{WithArrows}
\right.
\end{WithArrows}
%
\begin{tikzpicture}[remember picture,overlay]
\draw [WithArrows/arrow] 
      ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south)
   to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ;
\end{tikzpicture}
\]

\medskip
Dans le cas présent, il aurait été plus facile d'utiliser une commande |\Arrow| dans le
|code-after| mais c'était seulement un exemple pour illustrer comment les nœuds Tikz créés
par \pkg{witharrows} peuvent être utilisés.

\bigskip
Dans l'exemple suivant, on crée des environnements |{WithArrows}| nommés «|premier|» et
«|second|» et on dessine une flèche entre un nœud du premier et un nœud du second.

\begin{Code}
$\begin{WithArrows}[\emph{name=premier}]
A & = B \\
  & = C 
\end{WithArrows}$

\bigskip
$\begin{WithArrows}[\emph{name=second}]
A' & = B' \\
   & = C'
\end{WithArrows}$

\begin{tikzpicture}[remember picture,overlay]
\draw [WithArrows/arrow] 
      ([xshift=3mm]\emph{premier}-1-r.south)
   to ([xshift=3mm]\emph{second}-1-r.north) ;
\end{tikzpicture}
\end{Code}


\begin{center}
$\begin{WithArrows}[name=premier]
A & = B \\
  & = C 
\end{WithArrows}$

\bigskip
$\begin{WithArrows}[name=second]
A' & = B' \\
   & = C' 
\end{WithArrows}$
\end{center}

\begin{tikzpicture}[remember picture,overlay]
\draw [WithArrows/arrow] 
      ([xshift=3mm]premier-1-r.south)
   to ([xshift=3mm]second-1-r.north) ;
\end{tikzpicture}

\section{L'environnement \{DispWithArrows\}}
\label{DispWithArrows}

Comme dit précédemment, l'environnement |{WithArrows}| présente des similitudes avec
l'environnement |{aligned}| de l'extension \pkg{amsmath} (et de |mathtools|). L'extension
\pkg{witharrows} fournit aussi un environnement \Definition{\{DispWithArrows\}} qui est
similaire aux environnements |{align}| et |{flalign}| de l'extension \pkg{amsmath}.

\medskip
L'environnement |{DispWithArrows}| doit être utilisé \emph{hors} du mode mathématique.
Comme |{align}|, il doit être utilisé en mode horizontal.
\begin{Code}
\begin{\emph{DispWithArrows}}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{\emph{DispWithArrows}}
\end{Code}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows}

\medskip
Il est possible d'utiliser la commande \DefinitionCommande{notag} (ou
\DefinitionCommande{nonumber}) pour supprimer un numéro d'équation.

Il est possible d'utiliser la commande \DefinitionCommande{tag} pour placer une étiquette 
spéciale (par ex. $\star$).

Il est aussi possible de placer un label pour une ligne de l'environnement avec la
commande \DefinitionCommande{label}.

Ces commandes doivent être utilisées dans la dernière colonne de l'environnement.
\begin{Code}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \emph{\notag} \\
  & = a^2 + 2a + 1 \emph{\tag{$\star$} \label{mon-équation}}
\end{DispWithArrows}
\end{Code}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \notag \\
  & = a^2 + 2a + 1 \tag{$\star$} \label{mon-équation}
\end{DispWithArrows}
Un lien vers l'équation \ref{mon-équation}.\footnote{Dans ce document, les 
références ont été personnalisées avec |\labelformat{equation}{(#1)}|}


\medskip
Si \pkg{amsmath} (ou \pkg{mathtools}) est chargée, il est possible d'utiliser |\tag*| qui
compose le label sans les parenthèses. Par exemple, il est possible de l'utiliser pour
mettre le symbole |\square| de \pkg{amssymb}. Ce symbole est souvent utilisé pour marquer
la fin d'une démonstration.\footnote{Signalons que l'environnement |{DispWithArrows}| est
  compatible avec la commande |\qedhere| de \pkg{amsthm}.}
\begin{Code}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \notag \\
  & = a^2 + 2a + 1 \emph{\tag*{$\square$}}
\end{DispWithArrows}
\end{Code}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \notag \\
  & = a^2 + 2a + 1 \tag*{$\square$} 
\end{DispWithArrows}

\medskip
Il est également possible de supprimer tous les numéros d'équations avec l'option
booléenne \Definition{notag} (ou \Definition{nonumber}), au niveau global ou bien au niveau d'un
environnement. 

Enfin, il existe aussi un environnement \Definition{\{DispWithArrows*\}} qui supprime tous
les numéros.\footnote{Même dans ce cas, il est possible de mettre une étiquette
  manuellement avec la commande |\tag|.}
\begin{Code}
\begin{\emph{DispWithArrows*}}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{\emph{DispWithArrows*}}
\end{Code}
\begin{DispWithArrows*}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows*}

\medskip
En fait, il y a une autre option, nommée \Definition{tagged-lines}, qui peut être utilisée
pour contrôler quelles lignes seront numérotées. La valeur de cette option est la liste
des numéros de lignes (dans l'environnement) qui seront numérotées (par le système de
numérotage des équations). Par exemple, avec l'option |tagged-lines = {first,3,last}|,
seulement la première, la troisième et la dernière lignes seront numérotées. Il y a aussi
une valeur spéciale |all| qui signifie que toutes les lignes doivent être numérotées.
\begin{Code}
\begin{DispWithArrows}[\emph{tagged-lines = last}]
A & = A_1 \Arrow{première étape} \\
  & = A_2 \Arrow{deuxième étape} \\
  & = A_3 
\end{DispWithArrows}
\end{Code}
\begin{DispWithArrows}[tagged-lines = last]
A & = A_1 \Arrow{première étape} \\
  & = A_2 \Arrow{deuxième étape} \\
  & = A_3 
\end{DispWithArrows}

\bigskip
Avec l'option \Definition{fleqn}, l'environnement est composé calé à gauche (d'une manière
similaire à l'option |fleqn| des classes standard de LaTeX). Dans ce cas, la marge gauche
peut être réglée avec l'option \Definition{mathindent} (qui a un nom inspiré du paramètre
|\mathindent| de LaTeX). La valeur initiale pour cette option est de 25~pt. On peut y
mettre comme valeur un ressort (= \emph{skip} = \emph{glue}).

\begin{Code}
\begin{DispWithArrows}[\emph{fleqn,mathindent = 1cm}]
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows}
\end{Code}
\begin{DispWithArrows}[fleqn,mathindent = 1cm]
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows}

\medskip
\emph{Remarque} : Par conception, l'option |fleqn| de \pkg{witharrows} est indépendante de
l'option de classe |fleqn| de LaTeX. En effet, puisque les environnement de
\pkg{witharrows} sont conçus pour être utilisés avec des flèches sur le côté droit,
l'utilisateur peut souhaiter utiliser \pkg{witharrows} avec l'option |fleqn| (de manière à
avoir plus de place sur la droite des équations pour les flèches) tout en continuant à
centrer les équations classiques.

\medskip
Si l'option |leqno| est utilisée comme option de classe, les labels seront composés à
gauche également pour les environnements |{DispWithArrows}|.\footnote{L'extension
  \pkg{amsmath} a une option |leqno| mais \pkg{witharrows}, bien entendu, ne tient pas
  compte de cette option : \pkg{witharrows} vérifie seulement l'option |leqno| de la
  classe du document.}


\medskip
Si l'extension \pkg{amsmath} est chargée, il est possible d'utiliser la commande
|\intertext| dans les environnements |{DispWithArrows}|. Il est également possible
d'utiliser l'environnement |{subequations}|. Néanmoins, il existe pour les environnements
|{DispWithArrows}| une option \Definition{subequations} qui demande d'encapsuler
l'environnement dans un environnement |{subequations}|.


\medskip
Dans l'exemple suivant, l'option |subequations| est fixée via la commande
|\WithArrowsOptions|. Chacun des environnements suivants sera alors sous-numéroté (dans la
portée de la commande |WithArrowsOptions|).

\begin{Code}
\emph{\WithArrowsOptions{subequations}}
Premier environnement.
\begin{DispWithArrows}
A & = B \\
  & = C 
\end{DispWithArrows}
Deuxième environnement.
\begin{DispWithArrows}
D & = E \\
  & = F 
\end{DispWithArrows}
\end{Code}
%
\begin{scope}
\WithArrowsOptions{subequations}
Premier environnement.
\begin{DispWithArrows}
A & = B \\
  & = C 
\end{DispWithArrows}
Deuxième environnement.
\begin{DispWithArrows}
D & = E \\
  & = F 
\end{DispWithArrows}
\end{scope}

\bigskip
S'il n'y a pas suffisamment de place pour faire appraraître le numéro d'équation à la fin
de la ligne, il n'y a pas de positionnement automatique de ce numéro sur la ligne suivante
(comme dans les environnements de l'extension \pkg{amsmath}) : il y aura surimpression de texte.
Néanmoins, dans |{DispWithArrows}|, l'utilisateur peut utiliser la commande
\DefinitionCommande{tagnextline} pour demander manuellement la composition du numéro sur
la ligne suivante. 
\begin{Code}
\begin{DispWithArrows}[displaystyle]
S_{2(p+1)}
& =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\
& \smash[b]{=\sum_{k=1}^{2p}(-1)^kk²
   +(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2} \emph{\tagnextline} \\
&= S_{2p}-(2p+1)^2+(2p+2)^2\\
&=p(2p+1)-(2p+1)^2+(2p+2)^2\\
&= 2p^2+5p+3 
\end{DispWithArrows}
\end{Code}
\begin{center}
\color{gray}\vrule%
\begin{minipage}{275pt}\color{black}
\begin{DispWithArrows}[displaystyle]
S_{2(p+1)}
& =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\
& \smash[b]{=\sum_{k=1}^{2p}(-1)^kk^2+(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2}
\tagnextline \\ 
&= S_{2p}-(2p+1)^2+(2p+2)^2\\
&= 2p^2+p-4p^2-4p-1+4p^2+8p+4\\
&= 2p^2+5p+3 
\end{DispWithArrows}
\end{minipage}%
\color{gray}\vrule
\end{center}



\bigskip
Les environnements |{DispWithArrows}| et |{DispWithArrows*}| fournissent également une
option \Definition{wrap-lines}. Avec cette option, les lignes de l'étiquette sont
automatiquement coupées à droite.

\begin{Code}
\begin{DispWithArrows*}[displaystyle,\emph{wrap-lines}]
S_n
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{somme des termes d'une suite géométrique de raison $e^{i\frac{2\pi}{n}}$}\\
& = \frac{1}{n} \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}
                            {1-e^{i\frac{\pi}{2n}}}\right)
\Arrow{cette ligne de texte a été coupée automatiquement} \\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows*}
\end{Code}
\begin{DispWithArrows*}[displaystyle,wrap-lines]
S_n
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{somme des termes d'une suite géométrique de raison $e^{i\frac{2\pi}{n}}$}\\
& = \frac{1}{n} \Re \left(
\frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) 
\Arrow{cette ligne de texte a été coupée automatiquement} \\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows*}

\bigskip
L'option |wrap-lines| ne s'applique pas aux environnements |{WithArrows}|
imbriqués dans un environnement |{DispWithArrows}| ou |{DispWithArrows*}|. Néanmoins,
elle s'applique aux instructions |\Arrow| et |\MultiArrow| du |code-after|
de l'environnement englobant.

\vspace{1cm}
Nous avons dit que les environnements |{DispWithArrows}| et |{DispWithArrows*}| devaient
être utilisés en mode horizontal et non en mode vertical. Il y a néanmoins une exception.
Ces environnements peuvent être utilisés directement après un |\item| d'une liste LaTeX.
Dans ce cas, aucun espace vertical n'est ajouté avant l'environnement.\footnote{Il est
  possible de désactiver cette fonctionnalité avec l'option
  |standard-behaviour-with-items|.}

\medskip
Voici un exemple où, avec |{DispWithArrows}|, on peut insérer l'équation dans un
environnement |{enumerate}| tout en utilisant l'option |wrap-lines|.

\smallskip
\begingroup
\small
\begin{Code}
\emph{\begin{enumerate}
\item }
\begin{DispWithArrows}%
  [displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt]
S_n
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{on utilise la formule pour la somme de termes d'une suite géométrique de raison
$e^{i\frac{2\pi}n}$} \\ 
& = \frac{1}{n} \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}
                            {1-e^{i\frac{\pi}{2n}}}\right)
\Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}{2}}=i$} \\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows}
\emph{\end{enumerate}}
\end{Code}
\endgroup
\begin{enumerate}
\item 
\begin{DispWithArrows}%
   [displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt]
S_n
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{on utilise la formule pour la somme de termes d'une suite géométrique de raison 
$e^{i\frac{2\pi}n}$}\\ 
& = \frac{1}{n} \Re \left(
\frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) 
\Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}{2}}=i$} \\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows}
\end{enumerate}

\vspace{1cm} 
L'environnement |{DispWithArrows}| est similaire à l'environnement |{align}| de
l'extension \pkg{amsmath}. Néanmoins, |{DispWithArrows}| n'est pas construit en utilisant
|{align}| (en fait, il est possible d'utiliser \pkg{witharrows} sans \pkg{amsmath}).

Il y a quelques différences entre |{DispWithArrows}| et |{align}|. 
\begin{itemize}
\item L'environnement |{DispWithArrows}| ne peut pas être inséré dans un environment
|{gather}| de l'extension \pkg{amsmath}.
\item Un environment |{DispWithArrows}| est toujours insécable (même avec
|\allowdisplaybreaks| de l'extension \pkg{amsmath}).
\item Les commandes |\label|, |\tag|, |\notag| et |\nonumber| ne sont autorisées
que dans la dernière colonne.
\item Après un |\item| d'une liste LaTeX, aucun espace vertical n'est ajouté (cela peut être 
modifié avec l'option |standard-behaviour-with-items|).
\item 
\begin{bfseries}
Enfin, par défaut, les éléments d'un environnement |\{DispWithArrows\}|
sont composés en |textstyle| et non en |displaystyle| (il est possible de modifier
ce point avec l'option |displaystyle|). 
\end{bfseries}
\end{itemize}

\bigskip 
En ce qui concerne les références, l'extension \pkg{witharrows} est compatible avec les
extensions \pkg{autonum}, \pkg{cleveref}, \pkg{fancyref}, 
\pkg{hyperref}, \pkg{listlbls}, \pkg{prettyref}, \pkg{refcheck},
\pkg{refstyle}, \pkg{showlabels}, \pkg{smartref}, \pkg{typedref} et
\pkg{varioref} et avec les options |showonlyrefs| et |showmanualtags| de
\pkg{mathtools}.\footnote{Rappelons que \pkg{varioref}, \pkg{hyperref},
\pkg{cleveref} et \pkg{autonum} doivent être chargés dans cet ordre. L'extension
\pkg{witharrows} peut être chargée n'importe où.}

Elle n'est pas compatible avec \pkg{showkeys} (certains labels ne sont pas affichés).




\subsection*{L'option <...> de DispWithArrows}

L'environnement |{DispWithArrows}| propose une option \Definition{left-brace}. Si cette
option est présente, son contenu est composé à gauche, suivi d'une accolade (d'où le nom)
puis du corps de l'environnement.\footnote{L'option |left-brace| peut aussi être utilisée
  sans valeur: dans ce cas, seule l'accolade est tracée.}

Pour la lisibilité, cette option |left-brace| est aussi disponible avec une syntaxe
spéciale : on peut la rentrer en la mettant entre chevrons (|<| et |>|) juste après le
|{DispWithArrows}| (et donc avant les éventuels arguments optionnels entre crochets).

\bigskip
On peut alors faire des constructions avec distinctions de cas, comme dans l'exemple
suivant.\footnote{L'environnement |{cases}| de l'extension \pkg{amsmath} permet de réaliser de
  telles distinctions de cas mais on ne peut pas utiliser la numérotation automatique des
  équations. L'environnement |{numcases}| de l'extension \pkg{cases} (de Donald Arseneau)
  permet d'utiliser ces numéros d'équations, mais, bien entendu, il n'y a pas de
  composition de flèches.}



\medskip

\begin{Code}
\begin{DispWithArrows}\emph{< \binom{n}{p} = >}[format = ll,fleqn,displaystyle]
0 & \quad \text{si } p > n  
\Arrow{ce cas peut en fait rentrer\\ dans le suivant} \\
\frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{si } 0 \leq p \leq n  \\
0 & \quad \text{si } p < 0 
\end{DispWithArrows}
\end{Code}
%
\begin{DispWithArrows}< \binom{n}{p} = >[format = ll,fleqn,displaystyle]
0 & \quad \text{si } p > n  
\Arrow{ce cas peut en fait rentrer\\ dans le suivant} \\
\frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{si } 0 \leq p \leq n  \\
0 & \quad \text{si } p < 0 
\end{DispWithArrows}

\interitem
Dans l'exemple suivant, on sous-numérote les équations d'un système avec l'option
|subequations| (disponible quand l'|amsmath| est chargé).

\begin{Code}
\begin{DispWithArrows}\emph{< \label{système} \ref*{système} \Leftrightarrow >}%
    [format = l, subequations]
x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\
xy+xz+yz=-2 \\
xyz = -15 \label{dernière-équation}
\end{DispWithArrows}
\end{Code}
%
\begin{DispWithArrows}< \label{système} \ref*{système} \Leftrightarrow >%
    [format = l, subequations]
x+y+z = -3 \Arrow[tikz=-,jump=2]{3 équations} \\
xy+xz+yz=-2 \\
xyz = -15 \label{dernière-équation} 
\end{DispWithArrows}

\bigskip
Le système complet est l'équation \ref{système} (cette référence a été obtenue avec
|\ref{système}|) et la dernière équation est l'équation \ref{dernière-équation} (référence
obtenue avec |\ref{dernière-équation}|). Notons que |\ref*|, utilisé dans le code
ci-dessus, est une variante de |ref| qui compose une référence sans créer de lien
hypertexte (même quand \pkg{hyperref} est chargé).

\bigskip
On peut souhaiter remplacer l'accolade gauche par un autre délimiteur extensible (gauche).
On peut le faire avec l'option \Definition{replace-left-brace-by}. Par exemple,
«|replace-left-brace-by = [\enskip|» va composer avec un crochet et ajouter aussi un
espace de 0.5~em après le crochet.

\bigskip
\section{Fonctionnalités avancées}

\subsection{Utilisation avec Beamer}

\colorbox{yellow!50}{\textbf{Nouveau 2.9}}\par\nobreak

\smallskip
Si l'extension \pkg{witharrows} est utilisée avec Beamer, la commande |\Arrow| accepte un
argument entre chevrons (après l'argument optionnel entre crochets) pour indiquer les
«\emph{overlays}» concernés (en interne, \pkg{witharrows} utilise simplement la commande
|\only| de Beamer).

\begin{Code}
\Arrow[jump=2]\emph{<3->}{Exemple}
\end{Code}

\subsection{Utilisation avec plain-TeX}
\label{plain-TeX}

L'extension \pkg{witharrows} peut être utilisée avec plain-TeX. Pour cela, on doit charger
l'extension avec |\input|:
%
\begin{Verbatim}
\input{witharrows.tex}
\end{Verbatim}

\medskip
En plain-TeX, il n'y a pas d'environnements comme dans LaTeX.

Au lieu de |\begin{WithArrows}| et |\end{WithArrows}| comme en LaTeX, on doit utiliser un
pseudo-environnement délimité par |\Witharrows| et |\endWithArrows| (de même pour
|{DispWithArrows}|). 
%
\begin{Verbatim}
$\WithArrows
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\endWithArrows$
\end{Verbatim}

\medskip
La version pour plain-TeX de \pkg{witharrows} ne propose pas toutes les fonctionnalités
proposées pour la version LaTeX. En particulier, les fonctionnalités concernant les
numéros d'équations ne sont pas disponibles (puisqu'elles reposent sur le système de
numérotation de LaTeX).

\subsection{L'option tikz-code : comment changer la forme des flèches}

\label{tikz-code}

L'option \Definition{tikz-code} permet à l'utilisateur de changer la forme des
flèches.\footnote{Si l'option |wrap-lines| est utilisée dans un environnement
  |{DispWithArrows}| ou |{DispWithArrows*}|, l'option |tikz-code| n'aura pas d'effet sur
  les flèches de cet environnement mais uniquement sur les flèches des environnements
  |{WithArrows}| imbriqués.}

\smallskip
Par exemple, les options «|up|» et «|down|» décrites précédemment (cf.
p.~\pageref{up-and-down}) sont programmées en interne avec |tikz-code|.

\smallskip
La valeur de cette option doit être une instruction de tracé Tikz valide (avec le
point-virgule final) où les trois marqueurs |#1|, |#2| et |#3| représentent le point de
départ, le point d'arrivée et l'étiquette de la flèche.


\bigskip
La valeur initiale de |tikz-code| est la suivante :

\smallskip
\qquad |\draw (#1) to node {#3} (#2) ;|


\bigskip
Dans l'exemple suivant, nous remplaçons le chemin par défaut par un chemin avec trois
segments (et un nœud recouvrant le deuxième segment).
\begin{Code}
\begin{WithArrows}[format=c,ygap=5pt,interline=4mm,
      \emph{tikz-code = {\draw[rounded corners]
                        (#1) -- ([xshift=5mm]#1)
                        -- node[circle,
                                draw,
                                auto = false,
                                fill = gray!50,
                                inner sep = 1pt] {\tiny #3} 
                        ([xshift=5mm]#2)
                        -- (#2) ; }}]
3 (2x+4) = 6   \Arrow{$\div 3$} \\
2x+4 = 2       \Arrow{$-4$}     \\
2x = -2        \Arrow{$\div 2$} \\
 x = -1
\end{WithArrows}
\end{Code}


\[\begin{WithArrows}[format=c,
      ygap=5pt,
      interline=4mm,
      tikz-code = {\draw[rounded corners]
                        (#1) 
                        --
                        ([xshift=5mm]#1)
                        -- node[circle,
                                draw,
                                auto=false,
                                fill=gray!50,
                                inner sep = 1pt] {\tiny #3} 
                        ([xshift=5mm]#2)
                        --
                        (#2) ; }]
3 (2x+4) = 6   \Arrow{$\div 3$} \\
2x+4 = 2       \Arrow{$-4$}     \\
2x = -2        \Arrow{$\div 2$} \\
 x = -1
\end{WithArrows}\]

\bigskip
L'environnement |{DispWithArrows}| et sa version étoilée |{DispWithArrows*}| fournissent
une commande \DefinitionCommande{WithArrowsRightX} qui peut être utilisée dans l'option
|tikz-code|. Cette commande fournit l'abscisse de la marge droite de la boîte de
composition courante (en prenant en compte les éventuels numéros des équations). Pour un
exemple d'utilisation, voir p.~\pageref{example-WithArrowsRightX}.


\bigskip
\subsection{La commande \textbackslash WithArrowsNewStyle}

L'extension \pkg{witharrows} fournit une commande \DefinitionCommande{WithArrowsNewStyle}
pour définir des styles d'une manière similaire aux «styles» de Tikz.

\smallskip
La commande |\WithArrowsNewStyle| prend deux arguments obligatoires. Le premier est le nom
du style et le second est une liste de couples clé-valeur. La portée de la definition
ainsi faite par |\WithArrowsNewStyle| est le groupe TeX courant.\footnote{On rappelle que,
  en particulier, tout environnement LaTeX est un groupe TeX.}

\smallskip
Le style peut être utilisé comme une clé au niveau du document (avec
|\WithArrowsOptions|), au niveau d'un environnement (via les arguments optionnels) ou bien
encore dans une autre commande |\WithArrowsNewStyle|.

\smallskip
Pour un exemple d'utilisation, voir p.~\pageref{example-WithArrowsRightX}.


\bigskip
Il n'existe pas de style pour les flèches individuelles. Néanmoins, il reste possible de
définir de nouvelles commandes s'appuyant sur la commande |\Arrow|. Par exemple :

\begin{Verbatim}
\newcommand{\ThickArrow}{\Arrow[tikz=thick]}
\end{Verbatim}

Cette nouvelle commande |\ThickArrow| garde la possibilité\footnote{Dans la version de
  \pkg{witharrows} pour LaTeX mais pas dans la version pour plain-TeX.} d'accepter des
clés entre crochets. On peut écrire |\ThickArrow[jump=2]| car en fait,
|\Arrow[tikz=thick][jump=2]| est une syntaxe autorisée pour la commande |\Arrow| (on peut
mettre un nombre arbitraire d'arguments optionnels entre crochets après la commande
|\Arrow|).

\bigskip
\subsection{La clé right-overlap}

La clé \Definition{right-overlap} est une clé booléenne dont la valeur initiale est
|true|. Elle concerne uniquement les environnements |{WithArrows}|.

Quand la clé |right-overlap| est active, les flèches (et leurs étiquettes) sont tracées en
débordement et n'entrent donc pas dans le calcul de la boîte TeX contenant l'environnement
|{WithArrows}|.

Quand la clé |right-overlap| est mise à |false| (dans |\WithArrowsOptions| ou bien dans un
environnement |{WithArrows}| individuel) le débord vers la droite est pris en compte dans
le calcul des dimensions de la boîte englobante.

\begin{Code}
$\left\{\begin{WithArrows}[c,format = rCrCl,\emph{right-overlap=false}]
2x & + & 3y & = & 5 \Arrow{on ajoute $L_1$ à $L_2$}\\
-2x & - & 5y & = & 2 
\end{WithArrows}\right.$\quad
$\left\{\begin{WithArrows}[c,format = rCrCl]
2x & + & 3y & = & 5 \\
   & - & 2y & = & 7 
\end{WithArrows}\right.$
\end{Code}

\medskip
$\left\{\begin{WithArrows}[c,format = rCrCl,right-overlap=false]
2x & + & 3y & = & 5 \Arrow{on ajoute $L_1$ à $L_2$}\\
-2x & - & 5y & = & 2 
\end{WithArrows}\right.$\quad
$\left\{\begin{WithArrows}[c,format = rCrCl]
2x & + & 3y & = & 5 \\
   & - & 2y & = & 7 
\end{WithArrows}\right.$

\bigskip
Le réglage |right-overlap = false| peut aussi être utile en conjonction avec la classe
|standalone|.

\bigskip
\subsection{Positionnement vertical des flèches}

Il y a quatre paramètres pour ajuster finement la position verticale des flèches :
\Definition{ygap}, \Definition{ystart}, \Definition{start-adjust} et
\Definition{end-adjust}. 

\medskip
Nous expliquons d'abord le comportement quand les paramètres |start-adjust| et
|end-adjust| sont égaux à zéro:
\begin{itemize}
\item l'option |ystart| représente la distance verticale entre la ligne de base du
texte et le début de la flèche (valeur initiale : $0.4$~ex);
\item l'option |ygap| représente la distance verticale entre deux flèches consécutives
(valeur initiale : $0.4$~ex).
\end{itemize}


\bigskip
$\begin{WithArrows}[interline=1mm, adjust = 0pt]
 (\cos x + \sin x)^2 & = \cos^2 x +2 \cos x \sin x + \sin^2 x\Arrow{}\tikz[remember picture] \coordinate (A) ; \\
   & = \cos^2x + \sin^2x + 2\sin x\cos x \Arrow{} \\
   & = 1 + \sin(2x) 
\end{WithArrows}$

\begin{tikzpicture}[remember picture,overlay,blue]
\draw (wa-\WithArrowsLastEnv-1-r.south) to ++(1,0) coordinate (B) to ++(0.1,0) ;
\draw (A) to ++(1,0) coordinate (C) to ++(0.1,0) ;
\draw (B) -- (C) ;
\draw[<-] (B) to ++(0,0.2) ;
\draw[<-] (C) to ++(0,-0.2) ;
\path (C) node[right=1mm] {\texttt{ystart}} ;
\draw (wa-\WithArrowsLastEnv-2-r.north) to ++(3,0) coordinate (E) to ++(0.1,0);
\draw (wa-\WithArrowsLastEnv-2-r.south) to ++(3,0) coordinate (F) to ++(0.1,0);
\draw (E) -- (F) ;
\draw[<-] (E) to ++(0,0.2) ;
\draw[<-] (F) to ++(0,-0.2) ;
\path (F) node[right=1mm] {\texttt{ygap}} ;
\end{tikzpicture}

\interitem 
Néanmoins, pour des raisons esthétiques, quand il est possible, \pkg{witharrows} commence
la flèche un peu plus haut (d'une quantité |start-adjust|) et termine la flèche un peu plus
bas (par une quantité |end-adjust|). Par défaut, ces deux paramètres |start-adjust|
est |end-adjust| sont égaux à $0.4$~ex.

\bigskip
Voici par exemple le comportement sans le mécanisme de |start-adjust| et
|end-adjust| :
\begin{Code}
$\begin{WithArrows}\emph{[start-adjust=0pt, end-adjust=0pt]}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1  
\end{WithArrows}$
\end{Code}

$\begin{WithArrows}[start-adjust=0pt, end-adjust=0pt]
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1  
\end{WithArrows}$


\bigskip
Voici le comportement par défaut (les paramètres |start-adjust| et |end-ajust| sont
utilisés avec la valeur initiale $0.4$~ex). La flèche est plus longue et le résultat est
plus esthétique.

\medskip
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1  
\end{WithArrows}$


\bigskip
Il est possible d'utiliser l'option \Definition{adjust} qui fixe à la fois |start-adjust|
et |end-ajust|.

\bigskip
Une flèche de |jump| égal à~$1$ a une longueur\footnote{On appelle \emph{longueur} de la
  flèche la différence entre l'ordonnée du point de départ et l'ordonnée du point
  d'arrivée.} maximale égale au paramètre \Definition{max-length-of-arrow}. La valeur
initiale de ce paramètre est égale à~$2$~cm.

Dans l'exemple suivant, la valeur de |max-length-of-arrow| a été fixée à $1.5$~cm.
\begin{Code}
\[\begin{WithArrows}[\emph{max-length-of-arrow = 1.5cm}]
A 
& = 
\begin{vmatrix}
1 & a & a^2 & a^3 & a^4 \\
1 & b & b^2 & b^3 & b^4 \\
1 & c & c^2 & c^3 & c^4 \\
1 & d & d^2 & d^3 & d^4 \\
1 & e & e^2 & e^3 & e^4 
\end{vmatrix}
\Arrow{
$L_2 \gets L_2-L_1$ \\ 
$L_3 \gets L_3-L_1$ \\ 
$L_4 \gets L_4-L_1$ \\
$L_5 \gets L_5-L_1$ % ne pas mettre de \\ ici
} \\
& = 
\begin{vmatrix}
1 & a & a^2 & a^3 & a^4 \\
0 & b-a & b^2-a^2 & b^3-a^3 & b^4-a^4 \\
0 & c-a & c^2-a^2 & c^3-a^3 & c^4-a^4 \\
0 & d-a & d^2-a^2 & d^3-a^3 & d^4-a^4 \\
0 & e-a & e^2-a^2 & e^3-a^3 & e^4-a^4 
\end{vmatrix}
\end{WithArrows}\]
\end{Code}


\bigskip
\[\begin{WithArrows}[max-length-of-arrow = 1.5cm]
A 
& = 
\begin{vmatrix}
1 & a & a^2 & a^3 & a^4 \\
1 & b & b^2 & b^3 & b^4 \\
1 & c & c^2 & c^3 & c^4 \\
1 & d & d^2 & d^3 & d^4 \\
1 & e & e^2 & e^3 & e^4 
\end{vmatrix}
\Arrow{
$L_2 \gets L_2-L_1$ \\ 
$L_3 \gets L_3-L_1$ \\ 
$L_4 \gets L_4-L_1$ \\
$L_5 \gets L_5-L_1$ 
} \\
& = 
\begin{vmatrix}
1 & a & a^2 & a^3 & a^4 \\
0 & b-a & b^2-a^2 & b^3-a^3 & b^4-a^4 \\
0 & c-a & c^2-a^2 & c^3-a^3 & c^4-a^4 \\
0 & d-a & d^2-a^2 & d^3-a^3 & d^4-a^4 \\
0 & e-a & e^2-a^2 & e^3-a^3 & e^4-a^4 
\end{vmatrix}
\end{WithArrows}\]


\bigskip
\subsection{Notes de pied de page dans les environnements de witharrows}

Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{witharrows},
vous pouvez utiliser une paire |\footnotemark|--|\footnotetext|.

\smallskip
Il est aussi possible d'extraire les notes de pieds de page avec l'extension
\pkg{footnote} ou bien l'extension \pkg{footnotehyper}.

\smallskip
Si \pkg{witharrows} est chargée avec l'option \Definition{footnote} (avec
|\usepackage[footnote]{witharrows}| ou avec |\PassOptionsToPackage|), l'extension
\pkg{footnote} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour extraire
les notes de pied de page.

\smallskip
Si \pkg{witharrows} est chargée avec l'option \Definition{footnotehyper}, l'extension
\pkg{footnotehyper} est chargée (si elle ne l'est pas déjà) et elle est utilisée pour
extraire les notes de pied de page.

\smallskip
Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles.
L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote} et devrait
être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ; en
particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas
parfaitement compatible avec \pkg{hyperref}.

\medskip
Dans ce document, l'extension \pkg{witharrows} a été chargée avec l'option |footnotehyper|
et nous donnons un exemple avec une note de pied de page dans l'étiquette d'une flèche :


\smallskip
$\begin{WithArrows}
A & = (a+b)^2 
\Arrow{on développe\,\footnote{Une note de pied de page.}} \\
   & = a^2+b^2+2ab
\end{WithArrows}$

\bigskip
\subsection{L'option no-arrows}

L'option \Definition{no-arrows} est une facilité donnée à l'utilisateur. Avec cette
option, les flèches ne sont pas tracées. Néanmoins, une analyse des flèches est effectuée
et certaines erreurs sont détectées (par exemple, si une flèche arrive après la dernière
ligne de l'environnement).


\bigskip
\subsection{Note pour les utilisateurs de AUCTeX}

Dans un éditeur de texte paramétré pour éditer du LaTeX, les environnements
|{DispWithArrows}| et |{DispWithArrows*}| devraient être formatés comme l'environnement
|{equation}| de LaTeX c'est-à-dire avec un formatage adapté au mode mathématique.

Dans l'éditeur Emacs avec AUCTeX, cela se fait en ajoutant les chaînes |"DispWithArrows"|
et |"DispWithArrows*"| à la variable |font-latex-math-environments|. On peut le faire en
utilisant l'interface de personnalisation de Emacs :

|M-x customize| > |[Text]| > |[TeX]| > |[Font LaTeX]|

\bigskip
\subsection{Note pour les développeurs}

Si vous définissez un environnement s'appuyant sur un environnement de 
\pkg{witharrows}, nous recommandons de faire appel à l'environnement de \pkg{witharrows} avec 
|\WithArrows|--|\endWithArrows| ou |\DispWithArrows|--|\endDispWithArrows| (et
non |\begin{WithArrows}|--|\end{WithArrows}|, etc.).

\smallskip
En faisant ainsi, les messages d'erreur affichés par \pkg{witharrows} mentionneront (le
cas échéant) le nom de votre environnement et seront plus faciles à comprendre pour
l'utilisateur final.

\smallskip
Par exemple, vous pouvez définir un environnement |{DWA}| qui va être un alias de
|{DispWithArrows}|:
\begin{BVerbatim}
\NewDocumentEnvironment {DWA} {} {\DispWithArrows}{\endDispWithArrows}
\end{BVerbatim}

\smallskip
Si vous utilisez cet environnement |{DWA}| en mode mathématique, vous aurez le message
d'erreur suivant :

\begin{BVerbatim}
The environment {DWA} should be used only outside math mode.
\end{BVerbatim}

\interitem
Une autre exemple est donné en interne par la définition de l'environnement |{DispWithArrows*}|
dans l'extension \pkg{witharrows} avec le code suivant:
\begin{Verbatim}
\NewDocumentEnvironment {DispWithArrows*} {}
    {\WithArrowsOptions{notag}%
     \DispWithArrows}
    {\endDispWithArrows}
\end{Verbatim}



\section{Exemples}

\subsection{\textbackslash MoveEqLeft}

Il est possible d'utiliser |\MoveEqLeft| de \pkg{mathtools}. Dans ce cas, on doit se
souvenir que la commande |\MoveEqLeft| a aussi la valeur d'une esperluette (|&|). Il faut
en tenir compte pour le positionnement d'une éventuelle commande |\Arrow|.

\begingroup
\small
\begin{Code}
$\begin{WithArrows}[interline=0.5ex]
\emph{\MoveEqLeft} \arccos(x) = \arcsin \frac{4}{5} + \arcsin \frac{5}{13} 
\Arrow{parce que les deux sont dans $[-\frac{\pi}{2},\frac{\pi}{2}]$} \\
& \Leftrightarrow x = \sin\left(\arcsin\frac{4}{5} + \arcsin\frac{5}{13}\right) \\
& \Leftrightarrow x = \frac{4}{5}\cos\arcsin\frac{5}{13}+\frac{5}{13}\cos\arcsin\frac{4}{5} 
\Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
& \Leftrightarrow x = \frac{4}{5}\sqrt{1-\bigl(\frac{5}{13}\bigr)^2}
+ \frac{5}{13}\sqrt{1-\bigl(\frac{4}{5}\bigr)^2} 
\end{WithArrows}$
\end{Code}
\endgroup

\medskip
$\begin{WithArrows}[interline=0.5ex]
\MoveEqLeft \arccos(x) = \arcsin \frac{4}{5} + \arcsin \frac{5}{13} 
\Arrow{parce que les deux sont dans \([-\frac{\pi}{2},\frac{\pi}{2}]\)} \\
& \Leftrightarrow x = \sin\left(\arcsin\frac{4}{5} + \arcsin\frac{5}{13}\right) \\
& \Leftrightarrow x = \frac{4}{5}\cos\arcsin\frac{5}{13} + \frac{5}{13} \cos\arcsin\frac{4}{5} 
\Arrow{\(\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}\)} \\
& \Leftrightarrow x = \frac{4}{5}\sqrt{1-\bigl(\frac{5}{13}\bigr)^2}
+ \frac{5}{13}\sqrt{1-\bigl(\frac{4}{5}\bigr)^2} 
\end{WithArrows}$


\bigskip
\subsection{Une commande \textbackslash DoubleArrow}

En utilisant l'option |o| (cf. p. \pageref{option-o}) disponible au niveau local, on peut
facilement écrire une commande |\DoubleArrow| pour deux flèches allant en sens inverse
l'une de l'autre.

\bigskip
\begin{Code}
\NewDocumentCommand \DoubleArrow { O {} m m }
  {
    \Arrow[tikz=->,#1]{#2}%
    \Arrow[o,tikz=<-,#1]{#3}
  }
\end{Code}


\NewDocumentCommand \DoubleArrow { O {} m m }
  {
    \Arrow[tikz=->,#1]{#2}%
    \Arrow[o,tikz=<-,#1]{#3}
  }


\bigskip
Exemple d'utilisation :

\begin{Code}
$\begin{WithArrows}[groups]
A & = (a+b)^2 \DoubleArrow[tikz={font=\bfseries}]{développement}{factorisation} \\
  & = a^2 + 2ab+b^2 
\end{WithArrows}$
\end{Code} 

\bigskip
$\begin{WithArrows}[groups]
A & = (a+b)^2 \DoubleArrow[tikz={font=\bfseries}]{développement}{factorisation} \\
  & = a^2 + 2ab+b^2 
\end{WithArrows}$




\bigskip
\subsection{Modifier la forme des nœuds}

Il est possible de changer la forme des étiquettes, qui sont des nœuds Tikz, en
modifiant la clé «|every node|» de Tikz.

\begin{Code}
\begin{WithArrows}%
     [format = c,    
      interline = 4mm,
      tikz = {\emph{every node/.style = {circle,
                                   draw,
                                   auto = false,
                                   fill = gray!50,
                                   inner sep = 1pt,
                                   font = \tiny}}}]
 3 (2x+4) = 6 \Arrow{$\div 3$} \\
 2x+4 = 2     \Arrow{$-4$} \\
 2x = -2      \Arrow{$\div 2$} \\
 2x = -1
\end{WithArrows}
\end{Code}

\[\begin{WithArrows}[%
      format = c,
      interline = 4mm,
      tikz = {every node/.style = {circle,
                                   draw,
                                   auto = false,
                                   fill = gray!50,
                                   inner sep = 1pt,
                                   font = \tiny}}]
 3 (2x+4) = 6 \Arrow{$\div 3$} \\
 2x+4 = 2     \Arrow{$-4$}     \\
 2x = -2      \Arrow{$\div 2$} \\
 2x = -1
\end{WithArrows}\]


\bigskip
\subsection{Exemples avec l'option tikz-code}

Rappelons que l'option |tikz-code| est le code Tikz utilisé par \pkg{witharrows}
pour tracer les flèches.\footnote{Si un environnement |{DispWithArrows}| ou
|{DispWithArrows*}| est utilisé avec l'option |wrap-lines|, la valeur de l'option
|tikz-code| n'est pas utilisée pour cet environnement (mais est utilisée pour les 
environnements imbriqués à l'intérieur).}

\smallskip
La valeur initiale de |tikz-code| est |\draw (#1) to node {#3} (#2) ;| où les trois
marqueurs |#1|, |#2| et |#3| représentent le point de départ, le point d'arrivée et
l'étiquette de la flèche.


\bigskip
\subsubsection{Exemple 1}
Dans l'exemple suivant, nous définissons la valeur de |tikz-code| avec deux
instructions |\path| : la première instruction trace la flèche elle-même et la seconde
place l'étiquette dans un nœud Tikz dans le rectangle délimité par la flèche.

\begin{Code}
\begin{DispWithArrows*}%
      [displaystyle,
       ygap = 2mm,
       ystart = 0mm,
       \emph{tikz-code = {\draw (#1) -- ++(4.5cm,0) |- (#2) ;
                    \path (#1) -- (#2) 
                           node[text width = 4.2cm, right, midway] {#3} ;}}]
S_n
& = \frac{1}{n} \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}{2}\cdot\tfrac{k}{n}\bigr)
...........
\end{Code}


\bigskip
\begin{DispWithArrows*}[
       displaystyle,
       ygap = 2mm,
       ystart = 0mm,
       tikz-code = {\draw (#1) -- ++(4.5cm,0) |- (#2) ;
                    \path (#1) -- (#2) 
                           node[text width = 4.2cm, right, midway] {#3} ;}]
S_n
& = \frac{1}{n} \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}{2}\cdot\tfrac kn\bigr)
\Arrow{$\cos x = \Re(e^{ix})$}\\
& = \frac{1}{n} \sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\
& = \frac{1}{n} \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{somme de termes d'une suite géométrique de raison $e^{i\frac{2\pi}n}$}\\
& = \frac{1}{n} \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows*}

\bigskip
\subsubsection{Exemple 2}

\label{example-WithArrowsRightX}
Il est possible de modifier l'exemple précédent pour avoir «|text width|» calculé
automatiquement en fonction de la marge droite (d'une manière similaire à l'option
|wrap-lines|) dans les environnements |{DispWithArrows}| et |{DispWithArrows*}|. Dans la
définition de |tikz-code|, nous utilisons la commande  |\WithArrowsRightX| qui donne
l'abscisse de la marge droite de la boîte de composition (pour TeX, il s'agit d'une
commande et non d'une dimension). Pour la lisibilité, nous avons utilisé un style de
\pkg{witharrows}. Cet exemple nécessite l'extension Tikz \pkg{calc}. 

\begin{Code}
\WithArrowsNewStyle{MonStyle}       
  {displaystyle,
   ygap = 2mm, 
   xoffset = 0pt,
   ystart = 0mm,
   tikz-code = {\path let \p1 = (#1)
                      in (#1)
                          -- node [anchor = west, 
                                   text width = {\emph{\WithArrowsRightX} - \x1 - 0.5 em}] 
                                  {#3} 
                         (#2) ;
                \draw let \p1 = (#1) 
                      in (#1) -- ++(\emph{\WithArrowsRightX} - \x1,0) |- (#2) ; }}
\end{Code}

\begin{Verbatim}
\begin{DispWithArrows}[MonStyle]
  S_n
  & = \frac{1}{n} \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}{2}\cdot\tfrac{k}{n}\bigr)
  \Arrow{$\cos x = \Re(e^{ix})$}\\
...........
\end{Verbatim}

\WithArrowsNewStyle{MonStyle}       
{displaystyle,
 ygap = 2mm,
 xoffset = 0pt,
 ystart = 0mm,
 tikz-code = {\path let \p1 = (#1)
                    in (#1)
                        -- node [anchor = west, 
                                 text width = {\WithArrowsRightX - \x1 - 0.5 em}] {#3} 
                       (#2) ;
              \draw let \p1 = (#1) 
                    in (#1) -- ++(\WithArrowsRightX - \x1,0) |- (#2) ; }}

\begin{DispWithArrows}[MonStyle]
S_n
& = \frac{1}{n} \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}{2}\cdot\tfrac{k}{n}\bigr)
\Arrow{$\cos x = \Re(e^{ix})$}\\
& = \frac{1}{n} \sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\
& = \frac{1}{n} \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\
& = \frac{1}{n} \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
\Arrow{somme de termes d'une suite géométrique $e^{i\frac{2\pi}n}$}\\
& = \frac{1}{n} \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\
& = \frac{1}{n} \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows}



\bigskip
\subsubsection{Exemple 3}

Dans l'exemple suivant, nous changeons la forme de la flèche selon que la rangée de départ
est plus longue ou plus courte que la rangée d'arrivée. Cet exemple nécessite l'extension
\pkg{calc} de Tikz. 


\begin{Code}
\begin{WithArrows}[ll,interline=5mm,xoffset=5mm,
      \emph{tikz-code  = {\draw[rounded corners,
                          every node/.style = {circle,
                                               draw,
                                               auto = false,
                                               inner sep = 1pt,
                                               fill = gray!50,
                                               font = \tiny }] 
                          let \p1 = (#1),
                              \p2 = (#2)
                          and \ifdim \x1 > \x2
                               (\p1) -- node {#3} (\x1,\y2) -- (\p2)
                             \else
                               (\p1) -- (\x2,\y1) -- node {#3} (\p2)
                             \fi ;}}]
E & \Longleftrightarrow \frac{(x+4)}{3} + \frac{5x+3}{5} = 7 
\Arrow{$\times 15$}\\
  & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\
  & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\
  & \Longleftrightarrow 20x+29 = 105 
\Arrow{$-29$}\\
  & \Longleftrightarrow 20x = 76 
\Arrow{$\div 20$}\\
  & \Longleftrightarrow x = \frac{38}{10} 
\end{WithArrows}
\end{Code}


\[\begin{WithArrows}[ll,interline=5mm,xoffset=5mm,
      tikz-code  = {\draw[rounded corners,
                          every node/.style = {circle,
                                               draw,
                                               auto = false,
                                               inner sep = 1pt,
                                               fill = gray!50,
                                               font = \tiny}] 
                          let \p1 = (#1),
                              \p2 = (#2)
                          in \ifdim \x1 > \x2
                               (\p1) -- node {#3} (\x1,\y2) -- (\p2)
                             \else
                               (\p1) -- (\x2,\y1) -- node {#3} (\p2)
                             \fi ;}]
E & \Longleftrightarrow \frac{(x+4)}{3} + \frac{5x+3}{5} = 7 
\Arrow{$\times 15$}\\
  & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\
  & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\
  & \Longleftrightarrow 20x+29 = 105 
\Arrow{$-29$}\\
  & \Longleftrightarrow 20x = 76 
\Arrow{$\div 20$}\\
  & \Longleftrightarrow x = \frac{38}{10} 
\end{WithArrows}\]



\subsection{Boucle numérotée automatique}

Supposons que nous voulions tracer une boucle avec des flèches numérotées. Dans ce but, il
est possible d'écrire une commande dédiée |\NumberedLoop| qui fera le travail quand elle
sera utilisée dans le |code-after|. Dans l'exemple suivant, nous avons écrit cette
commande avec |\foreach| de \pkg{pgffor} (cette extension est chargée quand \pkg{witharrows} est chargé.).

\begin{Verbatim}
\NewDocumentCommand \NomberedLoop {}
        {\foreach \j in {2,...,\WithArrowsNbLines} 
              { \pgfmathtruncatemacro{\i}{\j-1}
                \Arrow[rr]{\i}{\j}{\i} }
         \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}}
\end{Verbatim}

La commande |\WithArrowsNbLines| est une commande disponible dans le |code-after| qui donne
le nombre total de lignes (=rangées) dans l'environnement courant (pour TeX, il s'agit
d'une commande et non d'un compteur).


\medskip
\begin{Code}
$\begin{WithArrows}[\emph{code-after = \NumberedLoop}]
a.\;& f \text{ est continue sur } E \\
b.\;& f \text{ est continue en } 0 \\
c.\;& f \text{ est bornée sur la sphère unité} \\
d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
e.\;& f \text{ est lipschitzienne} 
\end{WithArrows}$
\end{Code}

\bigskip
\begin{scope}
\NewDocumentCommand \NumberedLoop {}
        {\foreach \j in {2,...,\WithArrowsNbLines} 
              { \pgfmathtruncatemacro{\i}{\j-1}
                \Arrow[rr]{\i}{\j}{\i} }
         \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}}


$\begin{WithArrows}[code-after = \NumberedLoop]
a.\;& f \text{ est continue sur } E \\
b.\;& f \text{ est continue en } 0 \\
c.\;& f \text{ est bornée sur la sphère unité} \\
d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
e.\;& f \text{ est lipschitzienne} 
\end{WithArrows}$


\bigskip
Comme d'habitude, il est possible changer les caractéristiques des flèches et des nœuds 
avec l'option |tikz|. Néanmoins, si nous voulons changer le style pour avoir, par
exemple, les numéros entre parenthèses, le moyen le plus rapide est de changer la valeur de
|tikz-code|:

\begin{Code}
tikz-code = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}
\end{Code}

\WithArrowsOptions{tikz-code = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}}

$\begin{WithArrows}[code-after = \NumberedLoop]
a.\;& f \text{ est continue on } E \\
b.\;& f \text{ est continue dans } 0 \\
c.\;& f \text{ est bornée sur la sphère unité} \\
d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
e.\;& f \text{ est lipschitzienne}  
\end{WithArrows}$

\end{scope}


\section*{Autre documentation}

Le document |witharrows.pdf| (fourni avec l'extension \pkg{witharrows}) contient une
traduction anglaise de la documentation ici présente, ainsi que le code source commenté et
un historique des versions.  

\tableofcontents

\end{document}
