% -*- 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}


\labelformat{equation}{(#1)}

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

\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'\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} 
Dans la suite, on décrira l'extension LaTeX \pkg{witharrows} (néanmoins \pkg{witharrows} peut aussi être utilisé en
plain-TeX : voir à ce sujet p.~\pageref{plain-TeX}). Cette extension peut être utilisée avec |xelatex|, |lualatex|,
|pdflatex| mais aussi avec le cheminement classique |latex|-|dvips|-|ps2pdf| (ou Adobe Distiller). L'extension
\pkg{witharrows} charge les extensions \pkg{l3keys2e}, \pkg{xparse}, \pkg{tikz}, \pkg{varwidth} ainsi que les
bibliothèques Tikz \pkg{arrows.meta} et \pkg{bending}. Les flèches sont tracées avec Tikz et donc plusieurs
compilations peuvent être nécessaires.

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

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

$\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 |\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
Comme on le voit, l'environnement |{WithArrows}| est proche de l'environnement |{aligned}| de l'\pkg{amsmath}.
L'extension \pkg{witharrows} propose aussi un environnement |{DispWithArrows}| qui est similaire à l'environnement
|{align}| de l'\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.

L'option |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{Verbatim}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 \Arrow[~emphase#jump=2@]{on développe} \\
  & = (a+b)^2 +  2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 ~emphase#\Arrow{}\Arrow{}[jump=2]@ \\
  & = (a+b)^2 + 2(a+b) +1 \\
  & = a^2 + 2ab + b^2 + 2a + 2b +1 
\end{WithArrows}$
\end{Verbatim}

$\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 |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{Verbatim}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[~emphase#xoffset=1cm@]{avec \texttt{xoffset=1cm}} \\
  & = (a+b)^2 + 2(a+b) +1 
\end{WithArrows}$
\end{Verbatim}

$\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 
|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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[~emphase#tikz=thick@]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow~emphase#[tikz=<-]@{on factorise} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[~emphase#tikz=-@]{très classique} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow~emphase#[tikz={bend left=0}]@{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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.\footnote{Il est possible d'éviter les coupures de mots dans ces étiquettes:
utiliser l'option Tikz «|align = flush left|» en LaTeX et «|align = {flushleft,nothyphenated}|» en
ConTeXt.}
\newcounter{fnnohyphen}
\setcounter{fnnohyphen}{\thefootnote}
%
\begin{Verbatim}
$\begin{WithArrows}
A & = \bigl((a+b)+1\bigr)^2 
\Arrow[jump=2,~emphase#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{Verbatim}

$\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{wrap-lines}.

\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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{~emphase#\bfseries@ on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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
|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{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow[~emphase#tikz={font={\bfseries}}@]{on développe} \\
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}[~emphase#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{Verbatim}

$\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 |displaystyle|. Avec cette option, tous les éléments sont composés en
|\displaystyle| (comme dans un environnement |{aligned}| de l'\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 \\
& = \frac13 + 2\frac12 + 1 \\
& = \frac73
\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 \\
& = \frac13 + 2\frac12 + 1 \\
& = \frac73
\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 \\
& = \frac13 + 2\frac12 + 1 \\
& = \frac73
\end{WithArrows}$



\interitem 
Presque toutes les options peuvent aussi être fixées au niveau du document avec la commande |\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{Verbatim}
~emphase#\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{Verbatim}

\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 |command-name| dédiée. Le nouveau nom de la
commande doit être fourni à l'option \emph{sans} la contre-oblique.
%
\begin{Verbatim}
\NewDocumentCommand {\Arrow} {} {\longmapsto}
$\begin{WithArrows}[~emphase#command-name=Explication@]
f & = \bigl(x \Arrow (x+1)^2\bigr)
~emphase#\Explication{on travaille directement sur les fonctions}@\\
& = \bigl(x \Arrow x^2+2x+1\bigr)
\end{WithArrows}$
\end{Verbatim}
%
\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 |code-before| et |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{Verbatim}
$\begin{WithArrows}[~emphase#code-before = \color{blue}@]
A & = (a+b)^2 \Arrow{on développe} \\
  & = a^2 + 2ab + b^2 
\end{WithArrows}$
\end{Verbatim}

$\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 |\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 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 |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
\colorbox{yellow!50}{\textbf{Nouveau 2.6}}\enskip
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{Verbatim}
$\begin{WithArrows}[~emphase#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{Verbatim}

$\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{Verbatim}
\begin{DispWithArrows*}[~emphase#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{Verbatim}
\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 |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(\frac2{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 |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 |lr|, |rl| et |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(\frac2{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 |i| (\emph{i} pour \emph{intermédiaire}). Avec cette option, la flèche est
verticale et calée à gauche.

\begin{Verbatim}
$\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~emphase#[i]@{parce que $(x-y)(x+y)=x^2-y^2$}\\
& = a^4-b^4 
\end{WithArrows}$
\end{Verbatim}

$\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 |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{Verbatim}[formatcom=\small\color{gray}]
$\begin{WithArrows}[~emphase#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{Verbatim}


$\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^{\frac32} = x^{\frac12} \Arrow{simplification par $x$}\\
& \Longleftrightarrow K' = \tfrac1{2x^2} \Arrow{on primitive}\\
& \Longleftrightarrow K = -\tfrac1{2x} 
\end{WithArrows}$


\bigskip
L'environnement |{WithArrows}| fournit encore une autre option, nommée |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
|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).

$\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} \\
& = \frac1{\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} \\
& =\frac1{\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) \\
& =\frac1{\cos^n x}\Re\left(\frac{(\cos^{n+1}x-\cos(n+1)x)-i\sin(n+1)x}{-i\sin x}\right) \\
& = \frac1{\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 |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{BVerbatim}[boxwidth=10cm,baseline=c]
$\begin{WithArrows}[groups]
A & = B     \Arrow{un}\Arrow[~emphase#o@,jump=3]{direct} \\
  & = C + C \Arrow{deux} \\
  & = D + D + D \Arrow{trois} \\
  & = E + E \\
  & = F + F 
\end{WithArrows}$
\end{BVerbatim}
$\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{BVerbatim}
$\begin{WithArrows}[groups]
A & = B \Arrow{un}\Arrow[~emphase#o@,jump=2]{deux}\Arrow[~emphase#o@,jump=3]{trois}\\
  & = C \\
  & = D \\
  & = E + E + E + E + E + E + E 
\end{WithArrows}$
\end{BVerbatim}


\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 |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 «|up|» et «|down|». L'exemple
suivant illustre ces types de flèches: 


\begin{Verbatim}
\(\begin{WithArrows}
A & = B 
\Arrow~emphase#[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~emphase#[down]@{une flèche de type \texttt{down}} \\
  & = E + E 
\end{WithArrows}\)
\end{Verbatim}

\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é |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é |width| contrôle la largeur (de la partie horizontale) de la flèche :
\begin{itemize}
\item avec la valeur |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 |min|, la largeur de la flèche est ajustée au contenu de son étiquette.
\end{itemize}
\end{itemize}

\vspace{1cm}
\begin{Verbatim}
$\begin{WithArrows}
A & = B 
\Arrow[~emphase#up={width=2cm,radius=0pt}@]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$
\end{Verbatim}

\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{Verbatim}
$\begin{WithArrows}
A & = B 
\Arrow[~emphase#up={width=min}@]{essai} \\
  & = C + C + C + C + C + C + C + C 
\end{WithArrows}$
\end{Verbatim}

\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é |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'\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çu pour être utilisée avec des valeurs positives uniquement.
%
\begin{Verbatim}
$\begin{WithArrows}
A & = (a+1)^2 \Arrow{on développe} ~emphase#\\[2ex]@
  & = a^2 + 2a + 1 
\end{WithArrows}$
\end{Verbatim}

$\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'\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 |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{Verbatim}
$\begin{WithArrows}[displaystyle,~emphase#jot=2ex@]
F & = \frac12G     \Arrow{on développe}\\
  & = H + \frac12K \Arrow{on continue}\\
  & = K 
\end{WithArrows}$
\end{Verbatim}


$\begin{WithArrows}[displaystyle,jot=2ex]
F & = \frac12G     \Arrow{on développe}\\
  & = H + \frac12K \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{Verbatim}
$\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}$
\end{Verbatim}


$\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 |interline| est fournie. Il
est possible d'utiliser un ressort (\emph{skip}) pour cette option.
%
\begin{Verbatim}
$\begin{WithArrows}[~emphase#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{Verbatim}


$\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 |t|,
|c| ou |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
\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|:

\quad |\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}^nx_i + n 
\end{aligned}
\right.$


\medskip 
L'exemple suivant est composé avec |{WithArrows}[c,displaystyle]|. Les résultats 
sont parfaitement identiques.\footnote{Dans les versions de l'\pkg{amsmath} antérieures au
5~novembre~2016, un espace fin était ajouté sur la gauche de l'environnement |{aligned}|.
Les versions plus récentes n'ajoutent pas d'espace et |{WithArrows}| non plus.}\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}^nx_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{Verbatim}[formatcom=\small\color{gray}]
$~emphase#\begin{WithArrows}@
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{les nombres sont réels}\\
  & \Leftrightarrow
  \left\{~emphase#\begin{WithArrows}@[c]
  x+2y & = 0 \\
  2x+4y & = 0 
  ~emphase#\end{WithArrows}@\right. \\
  & \Leftrightarrow
  \left\{~emphase#\begin{WithArrows}@[c]
  x+2y & = 0 \Arrow[tikz=-]{la même équation}\\
  x+2y & = 0 
  ~emphase#\end{WithArrows}@\right. \\
  & \Leftrightarrow x+2y=0 
~emphase#\end{WithArrows}@$
\end{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}[~emphase#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{Verbatim}

$\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{Verbatim}
$\begin{WithArrows}[code-after=\Arrow~emphase#[v]@{1-2}{2-2}{division by $2$}]
\varphi(x,y)=0
  & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
.........
\end{WithArrows}$
\end{Verbatim}

$\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
|\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{Verbatim}
$\begin{WithArrows}[tikz = rounded corners,
                    code-after = {~emphase#\MultiArrow{1,...,4}{text}@} ]
A & = B \\
  & = C \\
  & = D \\
  & = E \\
  & = F
\end{WithArrows}$
\end{Verbatim}


$\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 |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
The package \pkg{witharrows} fournit quelques outils pour faciliter l'utilisation de ces nœuds :
\begin{itemize}
\item la commande |\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 |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 |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 |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{Verbatim}
$\begin{WithArrows}[~emphase#name=premier@]
A & = B \\
  & = C 
\end{WithArrows}$

\bigskip
$\begin{WithArrows}[~emphase#name=second@]
A' & = B' \\
   & = C'
\end{WithArrows}$

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


\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'\pkg{amsmath} (et de |mathtools|). L'extension \pkg{witharrows} fournit aussi un environnement |{DispWithArrows}|
qui est similaire aux environnements |{align}| et |{flalign}| de l'\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{Verbatim}
\begin{~emphase#DispWithArrows@}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{~emphase#DispWithArrows@}
\end{Verbatim}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows}

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

Il est possible d'utiliser la commande |\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 
|\label|.

Ces commandes doivent être utilisées dans la dernière colonne de l'environnement.
\begin{Verbatim}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} ~emphase#\notag@ \\
  & = a^2 + 2a + 1 ~emphase#\tag{$\star$} \label{mon-équation}@
\end{DispWithArrows}
\end{Verbatim}
\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{Verbatim}
\begin{DispWithArrows}
A & = (a+1)^2 \Arrow{on développe} \notag \\
  & = a^2 + 2a + 1 ~emphase#\tag*{$\square$}@
\end{DispWithArrows}
\end{Verbatim}
\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 |notag| (ou
|nonumber|), au niveau global ou bien au niveau d'un environnement.

Enfin, il existe aussi 
un environnement |{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{Verbatim}
\begin{~emphase#DispWithArrows*@}
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{~emphase#DispWithArrows*@}
\end{Verbatim}
\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 |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{Verbatim}
\begin{DispWithArrows}[~emphase#tagged-lines = last@]
A & = A_1 \Arrow{première étape} \\
  & = A_2 \Arrow{deuxième étape} \\
  & = A_3 
\end{DispWithArrows}
\end{Verbatim}
\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 |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 |mathindent| (qui a un nom inspiré du paramètre |\mathindent| de LaTeX\footnote{En LaTeX, |mathindent| est
une dimension (|dim|) mais devrait devenir un ressort (|skip|) dans une prochaine version de LaTeX. Pour le moment, le
paramètre |mathindent| de \pkg{witharrows} est une dimension.}). La valeur initiale
pour cette option est de 25~pt.

\begin{Verbatim}
\begin{DispWithArrows}[~emphase#fleqn,mathindent = 1cm@]
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1 
\end{DispWithArrows}
\end{Verbatim}
\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 |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{Verbatim}
~emphase#\WithArrowsOptions{subequations}@
Premier environnement.
\begin{DispWithArrows}
A & = B \\
  & = C 
\end{DispWithArrows}
Deuxième environnement.
\begin{DispWithArrows}
D & = E \\
  & = F 
\end{DispWithArrows}
\end{Verbatim}
%
\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'\pkg{amsmath}) : il y aura surimpression de texte. Néanmoins, dans |{DispWithArrows}|, l'utilisateur peut
utiliser la commande |\tagnextline| pour demander manuellement la composition du numéro sur la ligne suivante.
\begin{Verbatim}
\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} ~emphase#\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{Verbatim}
\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
|wrap-lines|. Avec cette option, les lignes de l'étiquette sont automatiquement coupées à droite.\footnotemark[\thefnnohyphen]\label{wrap-lines}

\begin{Verbatim}
\begin{DispWithArrows*}[displaystyle,~emphase#wrap-lines@]
S_n
& = \frac1n \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}$}\\
& = \frac1n \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} \\
& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows*}
\end{Verbatim}
\begin{DispWithArrows*}[displaystyle,wrap-lines]
S_n
& = \frac1n \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}$}\\
& = \frac1n \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} \\
& = \frac1n \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|.

\begin{Verbatim}
~emphase#\begin{enumerate}@
~emphase#\item @
\begin{DispWithArrows}%
  [displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt]
S_n
& = \frac1n \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}$} \\ 
& = \frac1n \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$} \\
& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
\end{DispWithArrows}
~emphase#\end{enumerate}@
\end{Verbatim}
\begin{enumerate}
\item 
\begin{DispWithArrows}[displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt]
S_n
& = \frac1n \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}$}\\ 
& = \frac1n \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$} \\
& = \frac1n \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'\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'\pkg{amsmath}.
\item Un environment |{DispWithArrows}| est toujours insécable (même avec
|\allowdisplaybreaks| de l'\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 |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'\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{BVerbatim}
\begin{DispWithArrows}~emphase#< \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{BVerbatim}
%
\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{Verbatim}
\begin{DispWithArrows}~emphase#< \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{Verbatim}
%
\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| proposée par \pkg{hyperref} pour composer une référence sans créer de lien.

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

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

\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 |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
Par défaut, la valeur 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{Verbatim}
\begin{WithArrows}[format=c,ygap=5pt,interline=4mm,
      ~emphase#tikz-code = {\draw[rounded corners]@
      ~emphase#                  (~#1) -- ([xshift=5mm]~#1)@
      ~emphase#                  -- node[circle,@
      ~emphase#                          draw,@
      ~emphase#                          auto = false,@
      ~emphase#                          fill = gray!50,@
      ~emphase#                          inner sep = 1pt] {\tiny ~#3}@ 
      ~emphase#                  ([xshift=5mm]~#2)@
      ~emphase#                  -- (~#2) ; }@]
3 (2x+4) = 6   \Arrow{$\div 3$} \\
2x+4 = 2       \Arrow{$-4$}     \\
2x = -2        \Arrow{$\div 2$} \\
 x = -1
\end{WithArrows}
\end{Verbatim}


\[\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
|\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 |\WithArrowsNewStyle| pour définir
des styles d'une manière similaire aux «styles» de Tikz.

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.

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|.

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


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

Il y a quatre paramètres pour ajuster finement la position verticale des flèches :
|ygap|, |ystart|, |start-adjust| et |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| (c'était le comportement par défaut dans les versions antérieures à la version 1.13). 
\begin{Verbatim}
$\begin{WithArrows}~emphase#[start-adjust=0pt, end-adjust=0pt]@
A & = (a+1)^2 \Arrow{on développe} \\
  & = a^2 + 2a + 1  
\end{WithArrows}$
\end{Verbatim}

$\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 depuis la version 1.13 (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 |adjust| qui fixe à la fois |start-adjust| et |end-ajust|.

\bigskip
Puisque le mécanisme de |start-adjust| et |end-ajust| a été ajouté dans la 
version 1.13 of \pkg{witharrows}, cette version n'est pas strictement compatible avec
les versions précédentes. Néanmoins, il est possible de retrouver le comportement précédent
en fixant simplement |start-adjust| et |end-adjust| à $0$~pt:
\begin{Verbatim}
\WithArrowsOptions{adjust = 0pt}
\end{Verbatim}

\bigskip
Depuis la version 2.1 de \pkg{witharrows}, 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 |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{Verbatim}
\[\begin{WithArrows}[~emphase#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{Verbatim}


\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 |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 |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 |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é par é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}
L'environnement {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|.


%
\begin{Verbatim}[formatcom=\small\color{gray}]
$\begin{WithArrows}[interline=0.5ex]
~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} 
\Arrow{parce que les deux sont dans $[-\frac{\pi}2,\frac{\pi}2]$} \\
& \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
& \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 
\Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
& \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
+ \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} 
\end{WithArrows}$
\end{Verbatim}


\medskip
$\begin{WithArrows}[interline=0.5ex]
\MoveEqLeft \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} 
\Arrow{parce que les deux sont dans \([-\frac{\pi}2,\frac{\pi}2]\)} \\
& \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
& \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 
\Arrow{\(\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}\)} \\
& \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
+ \frac5{13}\sqrt{1-\bigl(\frac45\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{Verbatim}
\NewDocumentCommand \DoubleArrow { O {} m m }
  {
    \Arrow[tikz=->,~#1]{~#2}%
    \Arrow[o,tikz=<-,~#1]{~#3}
  }
\end{Verbatim}


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


\bigskip
Exemple d'utilisation :

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

\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{Verbatim}
\begin{WithArrows}%
     [format = c,    
      interline = 4mm,
      tikz = {~emphase#every node/.style = {circle,@
              ~emphase#                     draw,@
              ~emphase#                     auto = false,@
              ~emphase#                     fill = gray!50,@
              ~emphase#                     inner sep = 1pt,@
              ~emphase#                     font = \tiny}@}]
 3 (2x+4) = 6 \Arrow{$\div 3$} \\
 2x+4 = 2     \Arrow{$-4$} \\
 2x = -2      \Arrow{$\div 2$} \\
 2x = -1
\end{WithArrows}
\end{Verbatim}

\[\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{Verbatim}
\begin{DispWithArrows*}%
      [displaystyle,
       ygap = 2mm,
       ystart = 0mm,
       ~emphase#tikz-code = {\draw (~#1) -- ++(4.5cm,0) |- (~#2) ;@
       ~emphase#             \path (~#1) -- (~#2) @
       ~emphase#                    node[text width = 4.2cm, right, midway] {~#3} ;}@]
S_n
& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr)
...........
\end{Verbatim}


\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
& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr)
\Arrow{$\cos x = \Re(e^{ix})$}\\
& = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\
& = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\
& = \frac1n \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}$}\\
& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\
& = \frac1n \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{Verbatim}
\WithArrowsNewStyle{MonStyle}       
  {displaystyle,
   ygap = 2mm, 
   xoffset = 0pt,
   ystart = 0mm,
   tikz-code = {\path let \p1 = (~#~#1)
                      in (~#~#1)
                          -- node [anchor = west, 
                                   text width = {~emphase#\WithArrowsRightX@ - \x1 - 0.5 em}] 
                                  {~#~#3} 
                         (~#~#2) ;
                \draw let \p1 = (~#~#1) 
                      in (~#~#1) -- ++(~emphase#\WithArrowsRightX@ - \x1,0) |- (~#~#2) ; }}
\end{Verbatim}

\begin{Verbatim}
\begin{DispWithArrows}[MonStyle]
  S_n
  & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\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
& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr)
\Arrow{$\cos x = \Re(e^{ix})$}\\
& = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\
& = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right)
\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\
& = \frac1n \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}$}\\
& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\
& = \frac1n \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{Verbatim}
\begin{WithArrows}[ll,interline=5mm,xoffset=5mm,
      ~emphase#tikz-code  = {\draw[rounded corners,@
      ~emphase#                    every node/.style = {circle,@
      ~emphase#                                         draw,@
      ~emphase#                                         auto = false,@
      ~emphase#                                         inner sep = 1pt,@
      ~emphase#                                         fill = gray!50,@
      ~emphase#                                         font = \tiny }]@ 
      ~emphase#                    let \p1 = (~#1),@
      ~emphase#                        \p2 = (~#2)@
      ~emphase#                    dans \ifdim \x1 > \x2@
      ~emphase#                         (\p1) -- node {~#3} (\x1,\y2) -- (\p2)@
      ~emphase#                       \else@
      ~emphase#                         (\p1) -- (\x2,\y1) -- node {~#3} (\p2)@
      ~emphase#                       \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{Verbatim}


\[\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
|\NewDocumentCommand| de \pkg{xparse} et |\foreach| de \pkg{pgffor} (ces deux
extensions sont chargées quand \pkg{witharrows} est chargé.).

\begin{Verbatim}
\NewDocumentCommande \NomberedLoop {}
        {\foreach \j dans {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).


\bigskip
\begin{Verbatim}
$\begin{WithArrows}[~emphase#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{Verbatim}

\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{Verbatim}
tikz-code = {\draw (~#1) to node {\footnotesize (~#3)} (~#2) ;}
\end{Verbatim}

\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. 




\end{document}
