texlive[51778] Master/texmf-dist: witharrows (30jul19)

commits+karl at tug.org commits+karl at tug.org
Tue Jul 30 23:00:57 CEST 2019


Revision: 51778
          http://tug.org/svn/texlive?view=revision&revision=51778
Author:   karl
Date:     2019-07-30 23:00:57 +0200 (Tue, 30 Jul 2019)
Log Message:
-----------
witharrows (30jul19)

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/generic/witharrows/
    trunk/Master/texmf-dist/doc/generic/witharrows/README.md
    trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf
    trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.tex
    trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf
    trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex
    trunk/Master/texmf-dist/source/generic/witharrows/
    trunk/Master/texmf-dist/source/generic/witharrows/witharrows.dtx
    trunk/Master/texmf-dist/source/generic/witharrows/witharrows.ins
    trunk/Master/texmf-dist/tex/generic/witharrows/
    trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.sty

Added: trunk/Master/texmf-dist/doc/generic/witharrows/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/README.md	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,32 @@
+# Readme for the package witharrows
+
+Author : F. Pantigny (`fpantigny at wanadoo.fr`).
+
+CTAN page : `https://ctan.org/pkg/witharrows`
+
+## License
+The extension `witharrows` for TeX and LaTeX is distributed under the LPPL 1.3 license.
+
+## Presentation
+
+The LaTeX package `witharrows` provides environments `{WithArrows}` and `{DispWithArrows}`
+similar to the environments `{aligned}` and `{align}` of `amsmath` but with the possibility to draw arrows on the right side of the alignment. These arrows are usually used to give explanations concerning the mathematical calculus presented.
+
+The extension `witharrows` can also be used with plain-TeX.
+
+
+
+## Installation
+
+The package `witharrows` is present in the distributions MiKTeX, TeXLive and MacTeX.
+
+For a manual installation:
+
+* put the files `witharrows.ins` dans `witharrows.dtx` in the same directory; 
+* run `latex witharrows.ins`.
+
+The files `witharrows.sty` and `witharrows.tex` will be generated.
+
+The file `witharrows.sty` is the only file necessary to use the extension `witharrows` with LaTeX (with `\usepakage{witharrows}`).
+
+The file `witharrows.tex` is the only file necessary to use the extension `witharrows` with plain-TeX (with `\input{witharrows.tex}`).


Property changes on: trunk/Master/texmf-dist/doc/generic/witharrows/README.md
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf	2019-07-30 20:59:58 UTC (rev 51777)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf	2019-07-30 21:00:57 UTC (rev 51778)

Property changes on: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.tex	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,2275 @@
+% -*- coding: utf-8 ; -*-
+\documentclass[dvipsnames]{article}% dvipsnames est pour xcolor (chargé par Tikz)
+\usepackage{xltxtra}
+\usepackage[french]{babel}
+
+\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[footnotehyper]{witharrows}
+\usepackage{amsfonts}
+\usepackage{amssymb}
+\usepackage{varwidth}
+\usetikzlibrary{calc}
+\usepackage[only,llbracket,rrbracket]{stmaryrd}
+
+\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}
+
+
+\def\interitem{\vskip 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 at wanadoo.fr}}  
+
+\maketitle
+
+\begin{abstract}
+L'extension \pkg{witharrows} fournit des environments \verb|{WithArrows}| et
+\verb|{DispWithArrows}| similaires aux environnements \verb|{aligned}| et \verb|{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 \verb|xelatex|,
+\verb|lualatex|, \verb|pdflatex| mais aussi avec le cheminement classique \verb|latex|-\verb|dvips|-\verb|ps2pdf|
+(ou Adobe Distiller). L'extension \pkg{witharrows} charge les extensions \pkg{expl3}, \pkg{xparse}, \pkg{tikz}
+ainsi que les extensions 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 \verb|{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 \verb|\Arrow| dans la rangée dont la flèche part. La commande \verb|\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 \verb|{WithArrows}| est proche de l'environnement
+\verb|{aligned}| de l'\pkg{amsmath}. L'extension \pkg{witharrows}
+propose aussi un environnement \verb|{DispWithArrows}| qui est similaire à l'environnement \verb|{align}| de
+l'\pkg{amsmath}: cf. p. \pageref{DispWithArrows}. 
+
+
+\section{Options pour la forme des flèches}
+
+La commande \verb|\Arrow| a plusieurs options. Ces options peuvent être placées entre crochets, avant, ou après,
+l'argument obligatoire.
+
+L'option \verb|jump| indique le nombre\footnote{Il n'est pas possible de donner une valeur négative à \verb|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 par défaut 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 \verb|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 par défaut de \verb|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 \verb|\Arrow| a une option 
+\verb|tikz| qui peut être utilisée pour donner à la flèche (en fait, à la commande \verb|\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~\verb|<-|.\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 «\verb|-|».
+\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 
+«\verb|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
+\verb|tikz-code| (présentée p.~\pageref{tikz-code}).
+
+\interitem
+Il est possible d'utiliser l'option «\verb|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
+avec l'option «\verb|align = flush left|» de Tikz.}
+%
+\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 \verb|{DispWithArrows}| et \verb|{DispWithArrows*}|, il y a une
+option \verb|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 
+\verb|\bfseries|, \verb|\large| ou \verb|\sffamily| au début du texte.
+Mais, par défaut, les étiquettes sont composées avec une combinaison
+de \verb|\small| et \verb|\itshape|. En ajoutant \verb|\bfseries| au début du texte, on ne va pas supprimer le
+\verb|\small| et le \verb|\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 \verb|\\| 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 \verb|align=left|, et, ainsi, cela devient possible.}. Néanmoins, si on utilise des commandes \verb|\\|, une instruction de fonte placée au début
+du texte aura un effet seulement jusqu'à la première occurrence de~\verb|\\| (comme
+dans un environnement \verb|{tabular}|). C'est pourquoi Tikz fournit une option
+\verb|font| pour modifier la fonte de tout le texte de l'étiquette. Cette fois-ci, si on utilise une option
+\verb|tikz={font={\bfseries}}|, la spécification par défaut constituée par \verb|\small| et \verb|\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 \verb|font| la valeur
+\verb|\itshape\small\bfseries|.
+
+
+\interitem 
+Presque toutes les options peuvent être données entre crochets à l'environnement \verb|{WithArrows}|. Il ne doit
+pas y avoir d'espace entre le \verb|\begin{WithArrows}| et le crochet ouvrant (\verb|[|) 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 \verb|{WithArrows}| donné (avec des exceptions attendues
+  pour les options \verb|interline|, \verb|code-before| et \verb|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 \verb|{WithArrows}| a une option \verb|displaystyle|. Avec cette option,
+tous les éléments sont composés en \verb|\displaystyle| (comme dans un environnement
+\verb|{aligned}| de l'\pkg{amsmath}).
+
+\medskip
+Sans l'option \verb|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 \verb|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
+\verb|\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
+\verb|{WithArrows}| soient composés en \verb|\displaystyle| avec des flèches bleues, nous pouvons écrire
+\verb|\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{Il est aussi possible de configurer \pkg{witharrows} en
+  modifiant le style Tikz \verb|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 : \verb|\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 \verb|\Arrow| est reconnue seulement dans les environnements \verb|{WithArrows}|. Si on
+dispose d'une commande \verb|\Arrow| précédemment définie, il est possible de continuer à l'utiliser à
+l'extérieur des environnements \verb|{WithArrows}|.
+
+Néanmoins, une commande \verb|\Arrow| définie précédemment pourrait encore être utile dans un environnement \verb|{WithArrows}|.
+Si vous voulez l'utiliser dans un tel environnement, il est possible de changer le nom de la commande \verb|\Arrow| de
+l'extension \pkg{witharrows} grâce à une option \verb|command-name|\footnote{Pour des raisons historiques, il y a
+  un alias pour cette option : \verb|CommandeName|.} 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 \verb|{WithArrows}| fournit aussi deux options \verb|code-before| et
+\verb|code-after|\footnote{Pour des raisons historiques, il y a aussi des alias pour ces options :
+  \verb|CodeBefore| et \verb|CodeAfter|.} 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 \verb|code-after| : une commande \verb|\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 \verb|\Arrow| et la commande \verb|\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 \verb|{WithArrows}| qu'avec deux colonnes. Néanmoins, il est
+possible de l'utiliser avec un nombre arbitraire de colonnes grâce à l'option \verb|format|. La valeur
+donnée à cette option est similaire au préambule d'un environnement \verb|{array}|: il s'agit d'une séquence de
+lettres \verb|r|, \verb|c| et \verb|l|. La valeur par défaut de cette option \verb|format| est, en fait, \verb|rl|.
+
+
+\bigskip
+Par exemple, si on veut seulement une colonne alignée à gauche, on peut utiliser l'option \verb|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
+\verb|{DispWithArrows*}| utilisé est présenté p.~\pageref{DispWithArrows}).
+
+\begin{Verbatim}
+\begin{DispWithArrows*}[~emphase#format = ccccc@,
+                        wrap-lines,
+                        tikz = {align = flush left},
+                        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,
+                        tikz = {align = flush left},
+                        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 \verb|{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
+\verb|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 \verb|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 \verb|lr|, \verb|rl| et \verb|ll| (\emph{l} for \emph{left} en anglais). Ces flèches sont, la
+plupart du temps, non verticales.
+
+
+Therefore
+$\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 \verb|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^2$}\\
+& = a^4-b^4 
+\end{WithArrows}$
+
+
+\interitem 
+L'environnement \verb|{WithArrows}| propose aussi une option \verb|group|. Avec cette option,
+\emph{toutes} les flèches de l'environnement sont regroupées sur une même verticale calée à gauche.
+%
+\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 \verb|{WithArrows}| fournit encore une autre option, nommée \verb|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{one} \\
+  & = C+D \Arrow{two} \\
+  & = D' \\
+  & = E+F+G+H+I \\
+  & = K + L + M \Arrow{three}\\
+  & = N \Arrow{four}\\
+  & = O
+\end{WithArrows}$
+
+\bigskip 
+Dans un environnement qui utilise l'option \verb|group| ou l'option \verb|groups|, il est encore possible de donner
+une option de position (\verb|ll|, \verb|lr|, \verb|rl|, \verb|rr| ou \verb|i|) à une flèche individuelle. Une
+telle flèche sera tracée indépendamment des groupes. Il est aussi possible de commencer un nouveau groupe avec
+l'option \verb|new-group| pour une certaine flèche.
+
+
+\bigskip
+Si on le souhaite, on peut passer l'option \verb|group| ou \verb|groups| à la commande \verb|WithArrowsOptions| de
+telle sorte qu'elle deviendra la valeur par défaut (jusqu'à la fin du groupe TeX). Dans ce cas, il est encore
+possible de revenir au comportement par défaut pour un environnement \verb|{WithArrows}| donné avec l'option
+\verb|rr|: \verb|\begin{WithArrows}[rr]|. 
+
+
+\vspace{1cm}
+Dans l'exemple suivant, nous avons utilisé l'option \verb|group| pour l'environnement
+et l'option \verb|rr| 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,group]
+\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[rr]{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{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ée «\verb|up|» et «\verb|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}
+
+\vspace{1cm}
+\(\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 \verb|up| et \verb|down| nécessitent l'extension \pkg{varwidth} et l'extension Tikz
+\pkg{calc}. Si elles ne sont pas chargées, une erreur sera levée.
+
+
+\interitem
+
+\section{Comparaison avec l'environnement \{aligned\}}
+
+L'environnement \verb|{WithArrows}| présente des similitudes avec l'environnement \verb|{aligned}| de l'extension
+\pkg{amsmath}. Ce sont seulement des similitudes car \verb|{WithArrows}| n'a pas été écrit en s'appuyant sur
+\verb|{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 \verb|\\| de fin de ligne (il est aussi possible d'utiliser \verb|\\*| mais cela a
+exactement le même effet que \verb|\\| puisqu'un environnement \verb|{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é \verb|\jot| (il s'agit d'une dimension et non d'un ressort). C'est aussi le cas
+pour l'environnement \verb|{WithArrows}|. Une option \verb|jot| a été ajoutée à l'environnement \verb|{WithArrows}|
+dans le but de changer ce paramètre \verb|\jot| pour un environnement donné.\footnote{Il est aussi possible de
+changer \verb|\jot| avec l'environnement \verb|{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 \verb|\jot| sera aussi utilisée dans les nouveaux alignements
+inclus dans l'environnement~\verb|{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
+\verb|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 \verb|{aligned}|, \verb|{WithArrows}| a une option de placement qui peut prendre les valeurs
+\verb|t|, \verb|c| ou \verb|b|. Néanmoins, la valeur par défaut n'est pas \verb|c| mais \verb|t|. 
+Si on le souhaite, il est possible d'avoir la valeur \verb|c| comme valeur par défaut
+en utilisant l'instruction \verb|\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 \verb|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 à \verb|{aligned}|, l'environnement \verb|{WithArrows}| utilise \verb|\textstyle| par
+défaut.
+
+Là aussi, il est possible de changer ce comportement avec \verb|\WithArrowsOptions|:
+
+\quad \verb|\WithArrowsOptions{displaystyle}|.
+
+
+\smallskip
+L'exemple suivant est composé avec \verb|{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 \verb|{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 \verb|{aligned}|.
+Les versions plus récentes n'ajoutent pas d'espace et \verb|{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 \verb|{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 \verb|interline|, \verb|code-before| et \verb|code-after|). La commande
+\verb|Arrow| peut être utilisée dans chaque environnement \verb|{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 \verb|\Arrow| dans le \verb|code-after| :
+dans le \verb|code-after|, une version spéciale de la commande \verb|\Arrow| est disponible 
+(nous l'appellerons  «\verb|\Arrow| dans le \verb|code-after|»).
+
+\smallskip
+Une commande \verb|\Arrow| dans le \verb|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 \verb|{WithArrows}| imbriqués dans l'environnement
+\verb|{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 \verb|1-2|) et arrive à la rangée~$2$
+du sous-environnement \no $2$ (et, par conséquent, la spécification est \verb|2-2|).
+Nous pouvons tracer la flèche avec une commande \verb|\Arrow| dans le \verb|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 \verb|\Arrow| dans le \verb|code-after| sont : \verb|ll|, \verb|lr|,
+\verb|rl|, \verb|rr|, \verb|v|, \verb|xoffset|, \verb|tikz| et \verb|tikz-code|. Exceptée \verb|v|, qui est 
+spécifique à \verb|\Arrow| dans le \verb|code-after|, toutes ces options ont leur signification habituelle.
+
+
+Avec l'option \verb|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 \verb|i|. Pour le moment, l'option \verb|i| n'est pas disponible
+pour la commande~\verb|\Arrow| dans le \verb|code-after|. Néanmoins, il est toujours possible
+de déplacer une flèche avec \verb|xoffset| (ou \verb|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 \verb|code-after| : la commande
+\verb|\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 \verb|\MultiArrow|. La syntaxe utilisée pour décrire cette liste
+est celle de la commande \verb|\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 \verb|\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 \verb|{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ée par \pkg{witharrows} est préfixé par \verb|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 \verb|l| pour un nœud de gauche et le suffixe \verb|r| pour un nœud de droite.
+
+\smallskip
+À titre d'illustration, nous donnons un exemple d'environnements \verb|{WithArrows}| imbriqués et, pour chaque nœud
+de droite, le nom de ce nœud.\footnote{Il existe une option \verb|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 \verb|\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 \verb|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 \verb|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 «\verb|every path|» avant le dessin de la
+  flèche (qui se fait avec l'instruction Tikz stockée dans \verb|tikz-code|). Ce style est modifié par l'option
+  \verb|tikz| de \pkg{witharrows} (avec une portée correspondant au groupe TeX courant).} ;
+
+\item le style Tikz \verb|WithArrows/arrow/tips| est le style utilisé pour la pointe de flèche (ce style est
+lui-même chargé par le style \verb|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 \verb|\Arrow| dans le \verb|code-after| mais
+c'était seulement un exemple pour expliquer comment les nœuds Tikz créés par \pkg{witharrows} peuvent être utilisés.
+
+\bigskip
+Dans l'exemple suivant, on crée deux environnements \verb|{WithArrows}| nommés
+«\verb|premier|» et «\verb|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 at -1-r.south)
+   to ([xshift=3mm]~emphase#second at -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 \verb|{WithArrows}| présente des similitudes avec l'environnement
+\verb|{aligned}| de l'\pkg{amsmath} (et de \verb|mathtools|). L'extension \pkg{witharrows}
+fournit aussi un environnement \verb|{DispWithArrows}| qui est similaire aux 
+environnements \verb|{align}| et \verb|{flalign}| de l'\pkg{amsmath}.
+
+\medskip
+L'environnement \verb|{DispWithArrows}| doit être utilisé \emph{hors} du mode mathématique. Comme
+\verb|{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 \verb|\notag| (ou \verb|\nonumber|) pour supprimer un numéro d'équation. 
+
+Il est possible d'utiliser la commande \verb|\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 
+\verb|\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 \eqref{mon-équation}. On a obtenu ce lien avec la commande
+\verb|\eqref{mon-équation}| (la commande \verb|\eqref| est une commande de l'extension \pkg{amsmath}).
+
+\medskip
+Si \pkg{amsmath} (ou \pkg{mathtools}) est chargée, il est toujours possible d'utiliser
+\verb|\tag*| qui, comme dans l'extension\pkg{amsmath}, compose le label sans les parenthèses.
+Par exemple, il est possible de l'utiliser pour mettre le symbole \verb|\square| de
+\pkg{amssymb}. Ce symbole est souvent utilisé pour marquer la fin d'une démonstration.\footnote{Signalons que l'environnement \verb|{DispWithArrows}| est compatible
+avec la commande \verb|\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 \verb|notag| (ou
+\verb|nonumber|), au niveau global ou bien au niveau d'un environnement.
+
+Enfin, il existe aussi 
+un environnement \verb|{DispWithArrows*}| qui supprime tous les numéros.\footnote{Même dans ce cas, il est possible
+de mettre une étiquette manuellement avec la commande \verb|\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 \verb|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
+\verb|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 \verb|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 \verb|fleqn|, l'environnement est composé calé à gauche (d'une manière similaire
+à l'option \verb|fleqn| des classes standard de LaTeX). Dans ce cas, la marge gauche peut être réglée avec
+l'option \verb|mathindent| (qui a un nom inspiré du paramètre \verb|\mathindent| de LaTeX). La valeur par défaut
+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 \verb|fleqn| de \pkg{witharrows} est 
+indépendante de l'option de classe \verb|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 \verb|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 \verb|leqno| est utilisée comme option de classe, les labels seront composés
+à gauche également pour les environnements \verb|{DispWithArrows}|.\footnote{L'extension \pkg{amsmath} a une option \verb|leqno|
+mais \pkg{witharrows}, bien entendu, ne tient pas compte de cette option : \pkg{witharrows}
+vérifie seulement l'option \verb|leqno| de la classe du document.}
+
+
+\medskip
+Si l'extension \pkg{amsmath} est chargée, il est possible d'utiliser la commande \verb|\intertext| dans les
+environnements \verb|{DispWithArrows}|. Il est également possible d'utiliser l'environnement \verb|{subequations}|.
+Néanmoins, il existe pour les environnements \verb|{DispWithArrows}| une option \verb|subequations| qui demande
+d'encapsuler l'environnement dans un environnement \verb|{subequations}|. 
+
+
+\medskip
+Dans l'exemple suivant, l'option \verb|subequations| est fixée via la commande \verb|\WithArrowsOptions|. Chacun
+des environnements suivants sera alors sous-numéroté (dans la portée de la commande \verb|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 \verb|{DispWithArrows}|, l'utilisateur peut
+utiliser la commande \verb|\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 \verb|{DispWithArrows}| et \verb|{DispWithArrows*}| fournissent également une option
+\verb|wrap-lines|. Avec cette option, les lignes de l'étiquette sont automatiquement coupées à droite.\footnote{Il
+  est possible d'éviter la coupure des mots avec l'option «\verb|align = flush left|» de Tikz.}\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 \verb|wrap-lines| ne s'applique pas aux environnements \verb|{WithArrows}|
+imbriqués dans un environnement \verb|{DispWithArrows}| ou \verb|{DispWithArrows*}|. Néanmoins,
+elle s'applique aux instructions \verb|\Arrow| et \verb|\MultiArrow| du \verb|code-after|
+de l'environnement englobant.
+
+\vspace{1cm}
+Nous avons dit que les environnements \verb|{DispWithArrows}| et \verb|{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 \verb|\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 \verb|standard-behaviour-with-items|.}
+
+\medskip
+Voici un exemple où, avec \verb|{DispWithArrows}|, on peut insérer l'équation dans un environnement 
+\verb|{enumerate}| tout en utilisant l'option \verb|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 \verb|{DispWithArrows}| est similaire à l'environnement \verb|{align}| de
+l'\pkg{amsmath}. Néanmoins, \verb|{DispWithArrows}| n'est pas construit en utilisant \verb|{align}|
+(en fait, il est possible d'utiliser \pkg{witharrows} sans \pkg{amsmath}).
+
+Il y a quelques différences entre \verb|{DispWithArrows}| et \verb|{align}|. 
+\begin{itemize}
+\item L'environnement \verb|{DispWithArrows}| ne peut pas être inséré dans un environment
+\verb|{gather}| de l'\pkg{amsmath}.
+\item Un environment \verb|{DispWithArrows}| est toujours insécable (même avec
+\verb|\allowdisplaybreaks| de l'\pkg{amsmath}).
+\item Les commandes \verb|\label|, \verb|\tag|, \verb|\notag| et \verb|\nonumber| ne sont autorisées
+que dans la dernière colonne.
+\item Après un \verb|\item| d'une liste LaTeX, aucun espace vertical n'est ajouté (cela peut être 
+modifié avec l'option \verb|standard-behaviour-with-items|).
+\item 
+\begin{bfseries}
+Enfin, par défaut, les éléments d'un environnement \verb|\{DispWithArrows\}|
+sont composés en \verb|textstyle| et non en \verb|displaystyle| (il est possible de modifier
+ce point avec l'option \verb|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{fncylab},
+\pkg{hyperref}, \pkg{listlbls}, \pkg{prettyref}, \pkg{refcheck},
+\pkg{refstyle}, \pkg{showlabels}, \pkg{smartref}, \pkg{typedref} et
+\pkg{varioref} et avec les options \verb|showonlyrefs| et \verb|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 \verb|{DispWithArrows}| propose une option \verb|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 \verb|left-brace| peut aussi être utilisée sans valeur: dans ce cas, seule
+  l'accolade est tracée.}
+
+Pour la lisibilité, cette option \verb|left-brace| est aussi disponible avec une syntaxe spéciale : on peut la
+rentrer en la mettant entre chevrons (\verb|<| et \verb|>|) juste après le \verb|{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 \verb|{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 \verb|{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 \verb|subnumerate| (disponible
+quand l'\verb|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 \eqref{système} (cette référence a été obtenue avec \verb|\eqref{système}|) et la
+dernière équation est l'équation \eqref{dernière-équation} (référence obtenue avec
+\verb|\eqref{dernière-équation}|). Notons que \verb|\ref*|, utilisé dans le code ci-dessus, est une variante de
+\verb|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 \verb|replace-left-brace-by|. Par exemple «\verb|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
+\verb|\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 \verb|\begin{WithArrows}| et \verb|\end{WithArrows}| comme en LaTeX, on doit utiliser un
+pseudo-environnement délimité par \verb|\Witharrows| et \verb|\endWithArrows| (de même pour
+\verb|{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 \verb|tikz-code|\footnote{Pour des raisons historiques, l'option \verb|tikz-code| a un alias :
+  \verb|TikzCode|.} permet à l'utilisateur de changer la forme des flèches.\footnote{Si l'option \verb|wrap-lines|
+  est utilisée dans un environnement \verb|{DispWithArrows}| ou \verb|{DispWithArrows*}|, l'option \verb|tikz-code|
+  n'aura pas d'effet sur les flèches de cet environnement mais uniquement sur les flèches des environnements
+  \verb|{WithArrows}| imbriqués.}
+
+\smallskip
+Par exemple, les options «\verb|up|» et «\verb|down|» décrites précédemment (cf.
+p.~\pageref{up-and-down}) sont programmées en interne avec \verb|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 \verb|#1|, \verb|#2| et \verb|#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 \verb|tikz-code| est la suivante :
+
+\smallskip
+\qquad \verb|\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 \verb|{DispWithArrows}| et sa version étoilée \verb|{DispWithArrows*}| fournissent une commande
+\verb|\WithArrowsRightX| qui peut être utilisée dans l'option \verb|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 \verb|\WithArrowsNewStyle| pour définir
+des styles d'une manière similaire aux «styles» de Tikz.
+
+La commande \verb|\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 \verb|\WithArrowsNewStyle| est le groupe TeX courant.
+
+Le style peut être utilisé comme une clé au niveau du document (avec \verb|\WithArrowsOptions|), au niveau d'un
+environnement (via les arguments optionnels) ou bien encore dans une autre commande \verb|\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 :
+\verb|ygap|, \verb|ystart|, \verb|start-adjust| et \verb|end-adjust|.
+
+\medskip
+Nous expliquons d'abord le comportement quand les paramètres \verb|start-adjust| et \verb|end-adjust| sont égaux à
+zéro:
+\begin{itemize}
+\item l'option \verb|ystart| représente la distance verticale entre la ligne de base du
+texte et le début de la flèche (valeur par défaut : $0.4$~ex);
+\item l'option \verb|ygap| représente la distance verticale entre deux flèches consécutives
+(valeur par défaut : $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é \verb|start-adjust|) et termine la flèche un peu plus
+bas (par une quantité \verb|end-adjust|). Par défaut, ces deux paramètres \verb|start-adjust|
+est \verb|end-adjust| sont égaux à $0.4$~ex.
+
+\bigskip
+Voici par exemple le comportement sans le mécanisme de \verb|start-adjust| et
+\verb|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
+\verb|start-adjust| et \verb|end-ajust| sont utilisés avec la valeur par défaut $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 \verb|adjust| qui fixe à la fois \verb|start-adjust| et \verb|end-ajust|.
+
+\bigskip
+Puisque le mécanisme de \verb|start-adjust| et \verb|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 \verb|start-adjust| et \verb|end-adjust| à $0$~pt:
+\begin{Verbatim}
+\WithArrowsOptions{adjust = 0pt}
+\end{Verbatim}
+
+\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 \verb|\footnotemark|--\verb|\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 \verb|footnote| (avec \verb|\usepackage[footnote]{witharrows}| ou
+avec \verb|\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 \verb|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 \verb|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 \verb|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 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 
+\verb|\WithArrows|--\verb|\endWithArrows| ou \verb|\DispWithArrows|--\verb|\endDispWithArrows| (et
+non \verb|\begin{WithArrows}|--\verb|\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 \verb|{DWA}| qui va être un alias de \verb|{DispWithArrows}|:
+\begin{BVerbatim}
+\NewDocumentEnvironment {DWA} {} {\DispWithArrows}{\endDispWithArrows}
+\end{BVerbatim}
+
+\smallskip
+Si vous utilisez cet environnement \verb|{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 \verb|{DispWithArrows*}|
+dans l'extension \pkg{witharrows} avec le code suivant:
+\begin{Verbatim}
+\NewDocumentEnvironment {DispWithArrows*} {}
+    {\WithArrowsOptions{notag}%
+     \DispWithArrows}
+    {\endDispWithArrows}
+\end{Verbatim}
+
+
+
+\section{Examples}
+
+\subsection{\textbackslash MoveEqLeft}
+
+Il est possible d'utiliser \verb|\MoveEqLeft| de \pkg{mathtools}. Dans ce cas, on doit se souvenir que la commande
+\verb|\MoveEqLeft| a aussi la valeur d'une esperluette (\verb|&|). Il faut en tenir compte pour le positionnement
+d'une éventuelle commande \verb|\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{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é «\verb|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 \verb|tikz-code| est le code Tikz utilisé par \pkg{witharrows}
+pour tracer les flèches.\footnote{Si un environnement \verb|{DispWithArrows}| ou
+\verb|{DispWithArrows*}| est utilisé avec l'option \verb|wrap-lines|, la valeur de l'option
+\verb|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 par défaut de \verb|tikz-code| est \verb|\draw (#1) to node {#3} (#2) ;|
+où les trois marqueurs \verb|#1|, \verb|#2| et \verb|#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 \verb|tikz-code| avec deux
+instructions \verb|\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) \verb|- (~#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 «\verb|text width|» calculé automatiquement en fonction 
+de la marge droite (d'une manière similaire à l'option \verb|wrap-lines|) dans les environnements
+\verb|{DispWithArrows}| et \verb|{DispWithArrows*}|. Dans la définition de \verb|tikz-code|, nous utilisons la commande 
+\verb|\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 \verb|\BoucleNumérotée| qui fera le travail quand elle 
+sera utilisée dans le \verb|code-after|. Dans l'exemple suivant, nous avons écrit cette commande avec
+\verb|\NewDocumentCommand| de \pkg{xparse} et \verb|\foreach| de \pkg{pgffor} (ces deux
+extensions sont chargées quand \pkg{witharrows} est chargé.).
+
+\begin{Verbatim}
+\NewDocumentCommande \NombreedLoop {}
+        {\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 \verb|\WithArrowsNbLines| est une commande disponible dans le \verb|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 = \BoucleNumérotée@]
+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 \BoucleNumérotée {}
+        {\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 = \BoucleNumérotée]
+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 \verb|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
+\verb|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 = \BoucleNumérotée]
+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}
+
+
+
+
+
+\end{document}


Property changes on: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows-french.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf	2019-07-30 20:59:58 UTC (rev 51777)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf	2019-07-30 21:00:57 UTC (rev 51778)

Property changes on: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,1694 @@
+%%
+%% This is file `witharrows.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% witharrows.dtx  (with options: `plain-TeX')
+%% 
+%% Copyright (C) 2017-2019 by F. Pantigny
+%% 
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version.  The latest version of this license is in:
+%% 
+%%      http://www.latex-project.org/lppl.txt
+%% 
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%% 
+\def\myfileversion{2.0}
+\def\myfiledate{2019/07/30}
+\input tikz.tex
+\input expl3-generic.tex
+\usetikzlibrary{arrows.meta,bending}
+\ExplSyntaxOn
+\catcode `\@ = 11
+\cs_new_protected:Npn \__wa_msg_new:nn { \msg_new:nnn { witharrows } }
+\cs_new_protected:Npn \__wa_msg_new:nnn { \msg_new:nnnn { witharrows } }
+\cs_new_protected:Npn \__wa_msg_redirect_name:nn
+  { \msg_redirect_name:nnn { witharrows } }
+\cs_new_protected:Npn \__wa_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__wa_warning:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__wa_fatal:n { \msg_fatal:nn { witharrows } }
+\cs_new_protected:Npn \__wa_error:nn  { \msg_error:nnn { witharrows } }
+\cs_generate_variant:Nn \__wa_error:nn { n x }
+\cs_generate_variant:Nn \tl_put_right:Nn { N v }
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
+\AtBeginDocument
+  {
+    \clist_map_inline:nn
+      {
+        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
+        typedref, unicode-math, varwidth
+      }
+      {
+        \bool_new:c { c__wa_#1_loaded_bool }
+        \bool_set_false:c { c__wa_#1_loaded_bool }
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__wa_strcmp:nn  #1 #2
+      { \lua_now:e { l3kernel.strcmp('#1','#2') } }
+  }
+  {
+    \cs_new_protected:Npn \__wa_strcmp:nn #1 #2
+      { \pdftex_strcmp:D { #1 } { #2 } }
+  }
+\cs_new_protected:Npn \__wa_sort_seq:N #1
+  {
+    \seq_sort:Nn #1
+      {
+        \int_compare:nNnTF
+          {
+            \__wa_strcmp:nn
+              { \str_lower_case:n { ##1 } }
+              { \str_lower_case:n { ##2 } }
+          }
+          > 0
+          \sort_return_swapped:
+          \sort_return_same:
+      }
+  }
+\cs_new_protected:Npn \__wa_convert_to_str_seq:N #1
+  {
+    \seq_clear:N \l_tmpa_seq
+    \seq_map_inline:Nn #1
+      {
+        \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+      }
+    \seq_set_eq:NN #1 \l_tmpa_seq
+  }
+\cs_new_protected:Npn \__wa_set_seq_of_str_from_clist:Nn #1 #2
+  {
+    \seq_set_from_clist:Nn #1 { #2 }
+    \__wa_convert_to_str_seq:N #1
+  }
+\cs_new_protected:Npn \__wa_save:N #1
+  {
+    \seq_set_split:Nxx \l_tmpa_seq
+       { \char_generate:nn { `_ } { 12 } }
+       { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _if_exist:cF }
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+      {
+        \use:c { \l_tmpa_str _new:c }
+          { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+      }
+    \use:c { \l_tmpa_str _gset_eq:cN }
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1
+  }
+\cs_new_protected:Npn \__wa_restore:N #1
+  {
+    \seq_set_split:Nxx \l_tmpa_seq
+      { \char_generate:nn { `_ } { 12 } }
+      { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _set_eq:Nc }
+      #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+  }
+\tikzset
+  {
+    __wa_node_style / .style =
+      {
+        above = \l__wa_ystart_dim ,
+        inner~sep = \c_zero_dim ,
+        minimum~width = \c_zero_dim ,
+        minimum~height = \l__wa_ygap_dim
+      }
+  }
+\tikzset
+  {
+    __wa_standard / .style =
+      {
+        remember~picture ,
+        overlay ,
+        name~prefix = wa - \l__wa_prefix_str -
+      }
+  }
+\tikzset
+  {
+    WithArrows / arrow / tips / .style =
+      { > = { Straight~Barb [ scale = 1.2 , bend ] } }
+  }
+\tikzset
+ {
+   WithArrows / arrow / .style  =
+     {
+       align = left ,
+       auto = left ,
+       WithArrows / arrow / tips ,
+       bend~left = 45 ,
+       ->
+     }
+ }
+        \cs_new_protected:Npn \spread at equation
+          {
+            \openup \jot
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:
+          }
+\tl_new:N \l__wa_left_brace_tl
+\tl_set_eq:NN \l__wa_left_brace_tl \c_novalue_tl
+\bool_new:N \l__wa_in_WithArrows_bool
+\bool_new:N \l__wa_in_DispWithArrows_bool
+\bool_new:N \l__wa_in_code_after_bool
+\seq_new:N \g__wa_position_in_the_tree_seq
+\seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
+\int_new:N \g__wa_last_env_int
+\int_new:N \l__wa_pos_env_int
+\int_new:N \l__wa_pos_arrow_int
+\int_set:Nn \l__wa_pos_arrow_int 3
+\seq_new:N \g__wa_arrow_int_seq
+\int_new:N \g__wa_arrow_int
+\seq_new:N \g__wa_line_int_seq
+\int_new:N \g__wa_line_int
+\seq_new:N \g__wa_col_int_seq
+\int_new:N \g__wa_col_int
+\str_new:N \l__wa_command_name_str
+\str_set:Nn \l__wa_command_name_str { Arrow }
+\str_new:N \l__wa_string_Arrow_for_msg_str
+\str_set:Nx \l__wa_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+\seq_new:N \g__wa_names_seq
+\bool_new:N \l__wa_in_first_columns_bool
+\bool_new:N \l__wa_new_group_bool
+\bool_new:N \l__wa_initial_r_bool
+\bool_new:N \l__wa_final_r_bool
+\tl_new:N \l__wa_initial_tl
+\tl_new:N \l__wa_final_tl
+\int_new:N \l__wa_nb_cols_int
+\str_new:N \l__wa_format_str
+\cs_new_protected:Npn \__wa_eval_if_allowed:n #1
+  {
+    \str_if_empty:NTF \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        #1
+      }
+      { \__wa_error:n { Incompatible~options } }
+  }
+\cs_new_protected:Npn \__wa_fix_pos_option:n #1
+  { \__wa_eval_if_allowed:n { \int_set:Nn \l__wa_pos_arrow_int { #1 } } }
+\keys_define:nn { WithArrows / Global }
+  {
+    ygap .dim_set:N = \l__wa_ygap_dim ,
+    ygap .value_required:n = true ,
+    ygap .initial:n = 0.4 ex ,
+    ystart .dim_set:N = \l__wa_ystart_dim ,
+    ystart .value_required:n = true ,
+    ystart .initial:n = 0.4 ex ,
+    more-columns .code:n =
+      \__wa_msg_redirect_name:nn { Too~much~columns~in~WithArrows } { none } ,
+    more-columns .value_forbidden:n = true,
+    command-name .code:n =
+      \str_set:Nn \l__wa_command_name_str { #1 }
+      \str_set:Nx \l__wa_string_Arrow_for_msg_str
+        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+    command-name .value_required:n = true ,
+    tikz-code .tl_set:N = \l__wa_tikz_code_tl,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz-code .value_required:n = true ,
+    TikzCode .meta:n = { tikz-code = #1 } ,
+    displaystyle .bool_set:N = \l__wa_displaystyle_bool ,
+    displaystyle .default:n = true ,
+    show-nodes .code:n =
+      \tikzset { __wa_node_style / .append~style = { draw , red } } ,
+    show-nodes .value_forbidden:n = true,
+    show-node-names .bool_set:N = \l__wa_show_node_names_bool ,
+    show-node-names .default:n = true ,
+    group .code:n =
+      \str_if_empty:NTF \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { group }
+          \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__wa_pos_arrow_int 7
+        }
+        { \__wa_error:n { Incompatible~options } } ,
+    group .value_forbidden:n = true ,
+    groups .code:n =
+      \str_if_empty:NTF \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { groups }
+          \seq_if_in:NnF \l__wa_options_Arrow_seq { new-group }
+            { \seq_put_right:Nn \l__wa_options_Arrow_seq { new-group } }
+          \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__wa_pos_arrow_int 6
+        }
+        { \__wa_error:n { Incompatible~options } } ,
+    groups .value_forbidden:n = true ,
+    tikz   .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz   .initial:n         = \c_empty_tl ,
+    tikz   .value_required:n  = true ,
+    rr     .value_forbidden:n = true ,
+    rr     .code:n            = \__wa_fix_pos_option:n 3 ,
+    ll     .value_forbidden:n = true ,
+    ll     .code:n            = \__wa_fix_pos_option:n 1 ,
+    rl     .value_forbidden:n = true ,
+    rl     .code:n            = \__wa_fix_pos_option:n 2 ,
+    lr     .value_forbidden:n = true ,
+    lr     .code:n            = \__wa_fix_pos_option:n 0 ,
+    i      .value_forbidden:n = true ,
+    i      .code:n            = \__wa_fix_pos_option:n 5 ,
+    xoffset .dim_set:N  = \l__wa_xoffset_dim ,
+    xoffset .value_required:n  = true ,
+    xoffset .initial:n = 3 mm ,
+    jot .dim_set:N = \jot ,
+    jot .value_required:n = true ,
+    interline .skip_set:N = \l__wa_interline_skip ,
+    interline .value_required:n = true ,
+    start-adjust .dim_set:N = \l__wa_start_adjust_dim ,
+    start-adjust .value_required:n = true ,
+    start-adjust .initial:n = 0.4 ex ,
+    end-adjust .dim_set:N = \l__wa_end_adjust_dim ,
+    end-adjust .value_required:n = true ,
+    end-adjust .initial:n = 0.4 ex ,
+    adjust .meta:n  = { start-adjust = #1 , end-adjust = #1 } ,
+    adjust .value_required:n = true ,
+    no-arrows .code:n =
+      \cs_set_eq:NN \__wa_draw_arrows:nn \use_none:nn
+      \cs_set_eq:NN \__wa_draw_arrow:nnn \use_none:nnn  ,
+    no-arrows .value_forbidden:n = true ,
+  }
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+  {
+    t   .code:n            = \int_set:Nn \l__wa_pos_env_int O ,
+    t   .value_forbidden:n = true ,
+    c   .code:n            = \int_set:Nn \l__wa_pos_env_int 1 ,
+    c   .value_forbidden:n = true ,
+    b   .code:n            = \int_set:Nn \l__wa_pos_env_int 2 ,
+    b   .value_forbidden:n = true
+  }
+\clist_new:N \c__wa_extensible_delimiters_clist
+\clist_set:Nn \c__wa_extensible_delimiters_clist
+  {
+    ., \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor
+  }
+\keys_define:nn { WithArrows / DispWithArrowsSpecific }
+  {
+    fleqn .bool_set:N = \l__wa_fleqn_bool ,
+    fleqn .default:n = true ,
+    mathindent .dim_set:N = \l__wa_mathindent_dim ,
+    mathindent .value_required:n = true ,
+    mathindent .initial:n = 25 pt ,
+    wrap-lines .bool_set:N = \l__wa_wrap_lines_bool ,
+    wrap-lines .default:n = true ,
+    replace-left-brace-by .code:n =
+      {
+        \tl_set:Nx \l_tmpa_tl { \tl_head:n { #1 } }
+        \clist_if_in:NVTF
+          \c__wa_extensible_delimiters_clist
+          \l_tmpa_tl
+          { \tl_set:Nn \l__wa_replace_left_brace_by_tl { #1 } }
+          { \__wa_error:n { Bad~value~for~replace~brace~by } }
+      } ,
+    replace-left-brace-by .initial:n = \lbrace ,
+  }
+\keys_define:nn { WithArrows / Env }
+  {
+    name .code:n =
+      \str_set:Nn \l_tmpa_str { #1 }
+      \seq_if_in:NVTF \g__wa_names_seq \l_tmpa_str
+        { \__wa_error:n { Duplicate~name } }
+        { \seq_gput_left:NV \g__wa_names_seq \l_tmpa_str }
+      \str_set_eq:NN \l__wa_name_str \l_tmpa_str ,
+    name .value_required:n = true ,
+    code-before .code:n = \tl_put_right:Nn \l__wa_code_before_tl { #1 } ,
+    code-before .value_required:n = true,
+    CodeBefore .meta:n = { code-before = #1 } ,
+    code-after .code:n = \tl_put_right:Nn \l__wa_code_after_tl { #1 } ,
+    code-after .value_required:n = true ,
+    CodeAfter  .meta:n = { code-after = #1 } ,
+    format .code:n =
+      \tl_if_empty:nTF { #1 }
+        { \__wa_error:n { Invalid~option~format } }
+        {
+          \regex_match:nnTF { \A[rcl]*\Z } { #1 }
+            { \tl_set:Nn \l__wa_format_str { #1 } }
+            { \__wa_error:n { Invalid~option~format } }
+        } ,
+    format .value_required:n = true ,
+  }
+\keys_define:nn { WithArrows }
+  {
+    WithArrows .inherit:n =
+      {
+        WithArrows / Global ,
+        WithArrows / WithArrowsSpecific ,
+        WithArrows / Env
+      } ,
+    DispWithArrows .inherit:n =
+      {
+        WithArrows / DispWithArrowsSpecific ,
+        WithArrows / Global ,
+        WithArrows / Env ,
+      } ,
+    WithArrowsOptions .inherit:n =
+      {
+        WithArrows / Global ,
+        WithArrows / WithArrowsSpecific ,
+        WithArrows / DispWithArrowsSpecific
+      }
+  }
+\seq_new:N \l__wa_options_WithArrows_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_WithArrows_seq
+  {
+    adjust, b, c, code-after, code-before, command-name,
+    displaystyle, end-adjust,
+    format, group, groups, i,
+    interline, jot, ll,
+    lr, more-columns, name,
+    no-arrows, rl, rr,
+    show-node-names, show-nodes, start-adjust,
+    t, tikz, tikz-code,
+    xoffset, ygap, ystart
+  }
+\__wa_convert_to_str_seq:N \l__wa_options_WithArrows_seq
+\keys_define:nn { WithArrows / WithArrows }
+  {
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_WithArrows_seq
+      \__wa_error:n { Unknown~option~WithArrows }
+  }
+\keys_define:nn { WithArrows / DispWithArrows }
+  {
+    left-brace .tl_set:N = \l__wa_left_brace_tl ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_DispWithArrows_seq
+      \__wa_error:n { Unknown~option~DispWithArrows }
+  }
+\seq_new:N \l__wa_options_DispWithArrows_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_DispWithArrows_seq
+  {
+    code-after, code-before, command-name, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot,
+    left-brace, ll, lr, mathindent, name, no-arrows, replace-left-brace-by, rl,
+    rr, show-node-names, show-nodes, start-adjust, tikz, wrap-lines, xoffset,
+    ygap, ystart,
+  }
+\keys_define:nn { WithArrows / WithArrowsOptions }
+  {
+    allow-duplicate-names .code:n =
+      \__wa_msg_redirect_name:nn { Duplicate~name } { none } ,
+    allow-duplicate-names .value_forbidden:n = true ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_WithArrowsOptions_seq
+      \__wa_error:n { Unknown~option~WithArrowsOptions }
+  }
+\seq_new:N \l__wa_options_WithArrowsOptions_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_WithArrowsOptions_seq
+  {
+    allow-duplicate-names, b, c, command-name, more-columns, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+    mathindent, no-arrows, rl, rr, show-node-names, show-nodes, start-adjust, t,
+    tikz, wrap-lines, xoffset, ygap, ystart,
+  }
+\cs_new_protected:Npn \__wa_set_independent:
+  {
+    \str_if_empty:NTF \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        \str_set:Nn \l__wa_status_arrow_str { independent }
+        \str_if_eq:VnF \l_keys_value_tl { NoValue }
+          { \__wa_error:n { Value~for~a~key } }
+      }
+      { \__wa_error:n { Incompatible~options~in~Arrow } }
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    jump .code:n =
+      \int_compare:nTF { #1 > 0 }
+        { \int_set:Nn \l__wa_jump_int { #1 } }
+        { \__wa_error:n { Negative~jump } } ,
+    jump .value_required:n  = true,
+    rr .code:n = \__wa_set_independent: ,
+    ll .code:n = \__wa_set_independent: ,
+    rl .code:n = \__wa_set_independent: ,
+    lr .code:n = \__wa_set_independent: ,
+    i  .code:n = \__wa_set_independent: ,
+    rr .default:n = NoValue ,
+    ll .default:n = NoValue ,
+    rl .default:n = NoValue ,
+    lr .default:n = NoValue ,
+    i  .default:n = NoValue ,
+    new-group .value_forbidden:n = true,
+    new-group .code:n =
+      \int_compare:nTF { \l__wa_pos_arrow_int = 6 }
+        { \str_set:Nn \l__wa_status_arrow_str { new-group } }
+        { \__wa_error:n { new-group~without~groups } } ,
+    tikz-code .code:n = \prg_do_nothing: ,
+    tikz-code .value_required:n = true ,
+    tikz .code:n = \prg_do_nothing: ,
+    tikz .value_required:n = true ,
+    xoffset .code:n =
+      \int_compare:nNnT \l__wa_pos_arrow_int > 5
+        { \__wa_error:n { Option~xoffset~forbidden } } ,
+    xoffset .value_required:n = true ,
+    start-adjust .code:n = \prg_do_nothing: ,
+    start-adjust .value_required:n = true ,
+    end-adjust .code:n = \prg_do_nothing: ,
+    end-adjust .value_required:n = true ,
+    adjust .code:n  = \prg_do_nothing: ,
+    adjust .value_required:n = true ,
+    unknown .code:n =
+      \__wa_sort_seq:N \l__wa_options_Arrow_seq
+      \seq_if_in:NVTF \l__wa_options_WithArrows_seq \l_keys_key_tl
+        {
+          \str_set:Nn \l_tmpa_str
+           { ~However,~this~key~can~be~used~in~the~options~of~\{WithArrows\}. }
+        }
+        { \str_clear:N \l_tmpa_str }
+      \__wa_error:n { Unknown~option~in~Arrow }
+  }
+\seq_new:N \l__wa_options_Arrow_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_Arrow_seq
+  {
+    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, tikz-code,
+    xoffset
+  }
+\cs_new_protected:Npn \__wa_fix_pos_arrow:n #1
+  {
+    \str_if_empty:NT \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        \int_set:Nn \l__wa_pos_arrow_int { #1 }
+      }
+  }
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+  {
+    tikz-code .tl_set:N = \l__wa_tikz_code_tl ,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz .initial:n = \c_empty_tl ,
+    rr .code:n = \__wa_fix_pos_arrow:n 3 ,
+    ll .code:n = \__wa_fix_pos_arrow:n 1 ,
+    rl .code:n = \__wa_fix_pos_arrow:n 2 ,
+    lr .code:n = \__wa_fix_pos_arrow:n 0 ,
+    i  .code:n = \__wa_fix_pos_arrow:n 5 ,
+    xoffset .code:n  =
+      \int_compare:nNnF \l__wa_pos_arrow_int > 5
+        { \dim_set:Nn \l__wa_xoffset_dim { #1 } } ,
+    start-adjust .dim_set:N = \l__wa_start_adjust_dim,
+    end-adjust .dim_set:N = \l__wa_end_adjust_dim,
+    adjust .code:n  =
+      \dim_set:Nn \l__wa_start_adjust_dim { #1 }
+      \dim_set:Nn \l__wa_end_adjust_dim { #1 } ,
+  }
+\cs_set_protected:Npn \WithArrowsOptions #1
+  {
+    \str_clear_new:N \l__wa_previous_key_str
+    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
+  }
+\cs_new_protected:Npn \__wa_Arrow
+  {
+    \peek_meaning:NTF [
+      { \__wa_Arrow_i }
+      { \__wa_Arrow_i [ ] }
+  }
+\cs_new_protected:Npn \__wa_Arrow_i [ #1 ] #2
+  {
+    \peek_meaning:NTF [
+      { \__wa_Arrow_ii [ #1 ] { #2 } }
+      { \__wa_Arrow_ii [ #1 ] { #2 } [ ] }
+  }
+\cs_new_protected:Npn \__wa_Arrow_ii [ #1 ] #2 [ #3 ]
+  {
+    \int_gincr:N \g__wa_arrow_int
+    \str_clear_new:N \l__wa_previous_key_str
+    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 }
+    \prop_put:NnV \l_tmpa_prop { initial } \g__wa_line_int
+    \int_set:Nn \l_tmpa_int { \g__wa_line_int + \l__wa_jump_int }
+    \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int
+    \prop_put:NnV \l_tmpa_prop { status } \l__wa_status_arrow_str
+    \prop_put:Nnn \l_tmpa_prop { options } { #1 , #3 }
+    \prop_put:Nnn \l_tmpa_prop { label } { #2 }
+    \prop_put:Nnx \l_tmpa_prop { input-line } \msg_line_number:
+    \prop_gclear_new:c
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop }
+    \prop_gset_eq:cN
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop }
+      \l_tmpa_prop
+  }
+\cs_new_protected:Npn \__wa_Arrow_first_columns:
+  { \__wa_error:n { Arrow~not~in~last~column } \__wa_Arrow }
+\cs_new_protected:Npn \__wa_pre_halign:n #1
+  {
+    \cs_if_exist:NT \tikz at library@external at loaded
+      { \tikzset { external / export = false } }
+    \str_clear_new:N \l__wa_name_str
+    \str_clear_new:N \l__wa_status_arrow_str
+    \dim_zero_new:N \l__wa_x_dim
+    \str_clear_new:N \l__wa_input_line_str
+    \seq_gput_right:NV \g__wa_arrow_int_seq \g__wa_arrow_int
+    \int_gzero:N \g__wa_arrow_int
+    \seq_gput_right:NV \g__wa_line_int_seq \g__wa_line_int
+    \int_gzero:N \g__wa_line_int
+    \seq_gput_right:NV \g__wa_col_int_seq \g__wa_col_int
+    \int_gzero:N \g__wa_col_int
+    \int_gzero_new:N \g__wa_static_col_int
+    \seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
+    \seq_set_eq:NN \l_tmpa_seq \g__wa_position_in_the_tree_seq
+    \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
+    \str_clear_new:N \l__wa_prefix_str
+    \str_set:Nx \l__wa_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - }
+    \cs_set_eq:NN \\ \__wa_cr:
+    \dim_zero:N \mathsurround
+    \int_zero_new:N \l__wa_initial_int
+    \int_zero_new:N \l__wa_final_int
+    \int_zero_new:N \l__wa_arrow_int
+    \int_zero_new:N \l__wa_pos_of_arrow_int
+    \int_zero_new:N \l__wa_jump_int
+    \int_set:Nn \l__wa_jump_int \c_one_int
+    \str_set:Nn \l__wa_format_str { rl }
+    \skip_zero:N \l__wa_interline_skip
+    \tl_clear_new:N \l__wa_code_before_tl
+    \tl_clear_new:N \l__wa_code_after_tl
+    \str_clear_new:N \l__wa_previous_key_str
+    \bool_if:NT \l__wa_in_WithArrows_bool
+      { \keys_set:nn { WithArrows / WithArrows } { #1 } }
+    \bool_if:NT \l__wa_in_DispWithArrows_bool
+      { \keys_set:nn { WithArrows / DispWithArrows } { #1 } }
+    \cs_set_eq:cN \l__wa_command_name_str \__wa_Arrow_first_columns:
+    \int_set:Nn \l__wa_nb_cols_int { \str_count:N \l__wa_format_str }
+    \int_gset_eq:NN \g__wa_col_int \l__wa_nb_cols_int
+    \seq_clear_new:N \l__wa_format_seq
+    \seq_set_split:NnV \l__wa_format_seq { } \l__wa_format_str
+    \l__wa_code_before_tl
+    \spread at equation
+  }
+\cs_new_protected:Npn \__wa_construct_halign:
+  {
+    \seq_pop_right:NNTF \l__wa_format_seq \l__wa_type_col_str
+      {
+        \use:x
+          {
+            \int_gdecr:N \g__wa_col_int
+            \__wa_construct_halign:
+            \int_compare:nNnT \g__wa_col_int = \l__wa_nb_cols_int
+              {
+                \cs_set_eq:cN { \l__wa_command_name_str } \__wa_Arrow
+              }
+            \str_if_eq:VnT \l__wa_type_col_str { c } \hfil
+            \str_if_eq:VnT \l__wa_type_col_str { r } \hfill
+            \int_gincr:N \g__wa_col_int
+            \int_gset:Nn \g__wa_static_col_int { \int_use:N \g__wa_col_int }
+            \c_math_toggle_token
+              {
+                { }
+                \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+                ####
+              }
+            \c_math_toggle_token
+            \int_compare:nNnTF \g__wa_col_int = \l__wa_nb_cols_int
+              { \__wa_construct_nodes: }
+              {
+                \str_if_eq:VnT \l__wa_type_col_str { l } \hfil
+                \str_if_eq:VnT \l__wa_type_col_str { c } \hfil
+                \bool_if:NT \l__wa_in_DispWithArrows_bool { \tabskip = \c_zero_skip }
+                &
+              }
+          }
+      }
+      {
+        \bool_if:NTF \l__wa_in_WithArrows_bool
+          {
+            \ialign
+            \bgroup
+          }
+          {
+            \halign to \l__wa_linewidth_dim
+            \bgroup
+            \bool_if:NT \l__wa_fleqn_bool
+              { \skip_horizontal:N \l__wa_mathindent_dim }
+          }
+        \int_gincr:N \g__wa_line_int
+        \int_gzero:N \g__wa_col_int
+        \tl_if_eq:NNF \l__wa_left_brace_tl \c_novalue_tl
+          {
+            \skip_horizontal:n
+              { \box_wd:N \l__wa_left_brace_box + \l__wa_delim_wd_dim }
+          }
+        \strut
+      }
+  }
+\cs_new_protected:Npn \__wa_construct_nodes:
+  {
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __wa_node_style ,
+          name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - l ,
+          alias =
+            {
+              \str_if_empty:NF \l__wa_name_str
+                { \l__wa_name_str - \int_use:N \g__wa_line_int - l }
+            }
+        ]
+        ;
+    \hfil
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __wa_node_style ,
+          name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r ,
+          alias =
+            {
+              \str_if_empty:NF \l__wa_name_str
+                { \l__wa_name_str - \int_use:N \g__wa_line_int - r }
+            }
+        ]
+        ;
+    \bool_if:NT \l__wa_show_node_names_bool
+      {
+        \hbox_overlap_right:n
+          { \small wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r }
+      }
+  }
+\cs_new_protected:Npn \WithArrows
+  {
+    \group_begin:
+    \peek_meaning:NTF [
+     { \WithArrows_i }
+     { \WithArrows_i [  ] }
+  }
+\cs_new_protected:Npn \WithArrows_i [ #1 ]
+  {
+    \bool_set_true:N \l__wa_in_WithArrows_bool
+    \bool_set_false:N \l__wa_in_DispWithArrows_bool
+    \str_clear_new:N \l__wa_type_env_str
+    \str_set:Nn \l__wa_type_env_str { WithArrows }
+    \__wa_pre_halign:n { #1 }
+    \if_mode_math: \else:
+      \__wa_error:n { WithArrows~outside~math~mode }
+    \fi:
+    \int_case:nn \l__wa_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+    \bgroup
+    \__wa_construct_halign:
+    &&
+    \__wa_error:n { Too~much~columns~in~WithArrows }
+    \c_math_toggle_token
+    \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+    { ## }
+    \c_math_toggle_token
+    \cr
+  }
+\cs_new_protected:Npn \endWithArrows
+  {
+    \\
+    \egroup
+    \egroup
+    \__wa_post_halign:
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_post_halign:
+  {
+    \cs_set:Npn \WithArrowsRightX { \g__wa_right_x_dim }
+    \int_compare:nNnT \g__wa_arrow_int > 0 \__wa_scan_arrows:
+    \group_begin:
+      \tikzset { every~picture / .style = __wa_standard }
+      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__wa_line_int }
+      \cs_set_eq:NN \MultiArrow \__wa_MultiArrow:nn
+      \cs_set_eq:cN \l__wa_command_name_str \__wa_Arrow_code_after
+      \bool_set_true:N \l__wa_in_code_after_bool
+      \l__wa_code_after_tl
+    \group_end:
+    \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gput_right:Nx \g__wa_position_in_the_tree_seq
+      { \int_eval:n { \l_tmpa_tl + 1 } }
+    \int_compare:nNnT { \seq_count:N \g__wa_position_in_the_tree_seq } = 1
+      { \int_gincr:N \g__wa_last_env_int }
+    \seq_gpop_right:NN \g__wa_arrow_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_arrow_int \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_line_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_line_int \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_col_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_col_int \l_tmpa_tl
+  }
+\cs_new_protected:Npn \__wa_cr:
+  {
+    \scan_stop:
+    \int_compare:nNnF \g__wa_col_int = \g__wa_static_col_int
+      { \__wa_error:n { omit~probably~used } }
+    \prg_replicate:nn { \l__wa_nb_cols_int - \g__wa_static_col_int } { & { } }
+    \group_align_safe_begin:
+    \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i:
+  }
+\cs_new_protected:Npn \__wa_cr_i:
+  { \peek_meaning:NTF [ \__wa_cr_ii: { \__wa_cr_ii: [ \c_zero_dim ] } }
+\cs_new_protected:Npn \__wa_cr_ii: [ #1 ]
+  {
+    \group_align_safe_end:
+    \bool_if:NT \l__wa_in_DispWithArrows_bool
+      {
+            &
+            \tikz [ __wa_standard ]
+               \coordinate ( \int_use:N \g__wa_line_int - v ) ;
+      }
+    \dim_compare:nNnT { #1 } < \c_zero_dim
+       { \__wa_error:n { option~of~cr~negative } }
+
+    \cr
+    \noalign
+      {
+        \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim }
+        \skip_vertical:n { \l_tmpa_dim + \l__wa_interline_skip }
+        \scan_stop:
+      }
+  }
+\cs_new_protected:Npn \DispWithArrows
+  {
+    \group_begin:
+    \peek_meaning:NTF <
+      { \DispWithArrows_i }
+      { \DispWithArrows_i < \c_novalue_tl > }
+  }
+\cs_new_protected:Npn \DispWithArrows_i < #1 >
+  {
+    \peek_meaning:NTF [
+      { \DispWithArrows_ii < #1 > }
+      { \DispWithArrows_ii < #1 > [ ] }
+  }
+\cs_new_protected:Npn \DispWithArrows_ii < #1 > [ #2 ]
+  {
+    \bool_set_true:N \l__wa_in_DispWithArrows_bool
+    \str_clear_new:N \l__wa_type_env_str
+    \str_set:Nn \l__wa_type_env_str { DispWithArrows }
+    \exp_args:No \tl_if_novalue:nF { #1 } { \tl_set:Nn \l__wa_left_brace_tl { #1 } }
+    \__wa_pre_halign:n { #2 }
+    \tl_if_eq:NNF \l__wa_left_brace_tl \c_novalue_tl
+      {
+        \hbox_set:Nn \l_tmpa_box
+          {
+            \group_begin:
+            \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+            \c_math_toggle_token
+            \left \l__wa_replace_left_brace_by_tl \vcenter to 1 cm { } \right.
+            \c_math_toggle_token
+            \group_end:
+          }
+        \dim_zero_new:N \l__wa_delim_wd_dim
+        \dim_set:Nn \l__wa_delim_wd_dim { \box_wd:N \l_tmpa_box }
+        \box_clear_new:N \l__wa_left_brace_box
+        \hbox_set:Nn \l__wa_left_brace_box
+          {
+            \group_begin:
+              \cs_set_eq:NN \label \__wa_old_label
+              \c_math_toggle_token
+              \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+              \l__wa_left_brace_tl
+              { }
+              \c_math_toggle_token
+            \group_end:
+          }
+      }
+    \if_mode_math:
+      \__wa_fatal:n { DispWithArrows~in~math~mode }
+    \fi:
+     \dim_zero_new:N \linewidth
+     \dim_set_eq:NN \linewidth \displaywidth
+        \if_mode_vertical:
+        \nointerlineskip
+        \hbox_to_wd:nn { .6 \linewidth } { }
+        \fi:
+        \c_math_toggle_token \c_math_toggle_token
+    \dim_zero_new:N \l__wa_linewidth_dim
+    \dim_set_eq:NN \l__wa_linewidth_dim \displaywidth
+    \box_clear_new:N \l__wa_halign_box
+    \setbox \l__wa_halign_box \vtop \bgroup
+    \tabskip =
+      \bool_if:NTF \l__wa_fleqn_bool
+        \c_zero_skip
+        { 0 pt plus 1000 pt minus 1000 pt }
+    \__wa_construct_halign:
+    \tabskip = 0 pt plus 1000 pt minus 1000 pt
+    &
+    $ ## $
+    \tabskip = \c_zero_skip
+    &&
+    \__wa_fatal:n { Too~much~columns~in~DispWithArrows }
+    \bool_if:nT \c_false_bool { ## }
+    \cr
+  }
+\cs_new_protected:Npn \endDispWithArrows
+  {
+    \\
+    \egroup
+    \unskip \unpenalty \unskip \unpenalty
+    \box_set_to_last:N \l_tmpa_box
+    \nointerlineskip
+    \box_use:N \l_tmpa_box
+    \dim_gzero_new:N \g__wa_alignment_dim
+    \dim_gset:Nn \g__wa_alignment_dim { \box_wd:N \l_tmpa_box }
+    \box_clear_new:N \l__wa_new_box
+    \hbox_set:Nn \l__wa_new_box { \hbox_unpack_clear:N \l_tmpa_box }
+    \dim_compare:nNnT
+      { \box_wd:N \l__wa_new_box } < \g__wa_alignment_dim
+      { \dim_gset:Nn \g__wa_alignment_dim { \box_wd:N \l__wa_new_box } }
+    \egroup
+     \tl_if_eq:NNTF \l__wa_left_brace_tl \c_novalue_tl
+       { \box_use_drop:N \l__wa_halign_box }
+       {
+         \hbox_to_wd:nn \l__wa_linewidth_dim
+           {
+            \bool_if:NTF \l__wa_fleqn_bool
+              { \skip_horizontal:n \l__wa_mathindent_dim }
+              \hfil
+            \hbox_to_wd:nn \g__wa_alignment_dim
+              {
+                \box_use_drop:N \l__wa_left_brace_box
+                \dim_set:Nn \l_tmpa_dim
+                  {
+                    \box_ht:N \l__wa_halign_box
+                    + \box_dp:N \l__wa_halign_box
+                  }
+                \group_begin:
+                \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+                \c_math_toggle_token
+                  \left \l__wa_replace_left_brace_by_tl
+                    \vcenter to \l_tmpa_dim { \vfil }
+                  \right.
+                \c_math_toggle_token
+                \group_end:
+                \hfil
+              }
+            \hfil
+           }
+         \skip_horizontal:n { - \l__wa_linewidth_dim }
+         \vcenter { \box_use_drop:N \l__wa_halign_box }
+       }
+    \dim_gzero_new:N \g__wa_right_x_dim
+    \dim_gset_eq:NN \g__wa_right_x_dim \c_max_dim
+    \tikzpicture [ __wa_standard ]
+      \int_step_variable:nNn \g__wa_line_int \l_tmpa_int
+        {
+          \cs_if_free:cTF
+            { pgf at sh@ns at wa - \l__wa_prefix_str - \l_tmpa_int - v }
+            { \__wa_fatal:n { Inexistent~v-node } }
+            {
+              \tikz at parse@node\pgfutil at firstofone ( \l_tmpa_int - v )
+              \dim_set:Nn \l_tmpa_dim \pgf at x
+              \dim_compare:nNnT \l_tmpa_dim < \g__wa_right_x_dim
+                { \dim_gset:Nn \g__wa_right_x_dim \l_tmpa_dim }
+            }
+        }
+    \endtikzpicture
+    \__wa_post_halign:
+      \c_math_toggle_token \c_math_toggle_token
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_if_in_last_col_of_disp:Nn #1 #2
+  {
+    \bool_if:NTF \l__wa_in_WithArrows_bool
+      { \__wa_error:nn { Not~allowed~in~WithArrows } { #1 } }
+      {
+        \int_compare:nNnTF \g__wa_col_int < \l__wa_nb_cols_int
+          { \__wa_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+          { #2 }
+      }
+  }
+\cs_new_protected:Npn \__wa_scan_arrows:
+  {
+    \group_begin:
+    \int_compare:nNnT \l__wa_pos_arrow_int = 7
+      {
+        \__wa_scan_arrows_i:
+        \int_set:Nn \l__wa_pos_arrow_int 8
+      }
+    \__wa_scan_arrows_i:
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_scan_arrows_i:
+  {
+    \int_zero_new:N \l__wa_first_arrow_of_group_int
+    \int_zero_new:N \l__wa_first_line_of_group_int
+    \int_zero_new:N \l__wa_last_line_of_group_int
+    \seq_clear_new:N \l__wa_first_arrows_seq
+    \seq_clear_new:N \l__wa_last_arrows_seq
+    \bool_set_true:N \l__wa_new_group_bool
+    \int_set:Nn \l__wa_arrow_int \c_one_int
+    \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
+      {
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__wa_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__wa_final_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { status } \l__wa_status_arrow_str
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { input-line } \l__wa_input_line_str
+        \int_compare:nNnTF \l__wa_final_int > \g__wa_line_int
+          {
+            \int_compare:nNnF \l__wa_pos_arrow_int = 8
+              { \__wa_error:n { Too~few~lines~for~an~arrow } }
+          }
+          \__wa_code_for_possible_arrow:
+        \int_incr:N \l__wa_arrow_int
+      }
+    \bool_if:nT
+      {
+        \int_compare_p:n { \l__wa_pos_arrow_int != 7 }
+          &&
+        \int_compare_p:nNn \l__wa_first_arrow_of_group_int > 0
+      }
+      { \__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int \g__wa_arrow_int }
+  }
+\cs_new_protected:Npn \__wa_code_for_possible_arrow:
+  {
+    \bool_if:nT
+      {
+        \int_compare_p:nNn \l__wa_arrow_int > \c_one_int
+        &&
+       ( \int_compare_p:n { \l__wa_initial_int > \l__wa_last_line_of_group_int }
+           &&
+         \int_compare_p:n { \l__wa_pos_arrow_int != 7 }
+           ||
+         \str_if_eq_p:Vn \l__wa_status_arrow_str { new-group }
+       )
+      }
+      {
+        \int_compare:nNnF \l__wa_first_arrow_of_group_int = \c_zero_int
+          {
+            \__wa_draw_arrows:nn
+              \l__wa_first_arrow_of_group_int
+              { \l__wa_arrow_int - 1 }
+          }
+        \bool_set_true:N \l__wa_new_group_bool
+      }
+    \bool_if:nTF \l__wa_new_group_bool
+      {
+        \bool_set_false:N \l__wa_new_group_bool
+        \int_set_eq:NN \l__wa_first_arrow_of_group_int \l__wa_arrow_int
+        \int_set_eq:NN \l__wa_first_line_of_group_int \l__wa_initial_int
+        \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int
+        \seq_clear:N \l__wa_first_arrows_seq
+        \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int
+        \seq_clear:N \l__wa_last_arrows_seq
+        \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int
+        \int_compare:nT { \l__wa_pos_arrow_int != 8 }
+          { \dim_set:Nn \l__wa_x_dim { - \c_max_dim } }
+      }
+      {
+        \bool_if:nF
+          { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } }
+          {
+            \int_compare:nT
+              { \l__wa_initial_int = \l__wa_first_line_of_group_int }
+              { \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int }
+            \int_compare:nNnTF \l__wa_final_int > \l__wa_last_line_of_group_int
+              {
+                \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int
+                \seq_clear:N \l__wa_last_arrows_seq
+                \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int
+              }
+              {
+                \int_compare:nNnT \l__wa_final_int = \l__wa_last_line_of_group_int
+                  { \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int }
+              }
+          }
+      }
+    \bool_if:nF { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } }
+      {
+        \int_compare:nT { \l__wa_pos_arrow_int != 8 }
+          { \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int }
+      }
+  }
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Npn \__wa_keys_set:
+  { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
+\cs_new_protected:Npn \__wa_draw_arrows:nn #1 #2
+  {
+    \group_begin:
+    \int_zero_new:N \l__wa_first_arrow_int
+    \int_set:Nn \l__wa_first_arrow_int { #1 }
+    \int_zero_new:N \l__wa_last_arrow_int
+    \int_set:Nn \l__wa_last_arrow_int { #2 }
+    \int_set:Nn \l__wa_arrow_int \l__wa_first_arrow_int
+    \int_until_do:nNnn \l__wa_arrow_int > \l__wa_last_arrow_int
+      {
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__wa_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__wa_final_int \l_tmpa_tl
+        \int_compare:nT { \l__wa_final_int <= \g__wa_line_int } \__wa_draw_arrows_i:
+        \int_incr:N \l__wa_arrow_int
+      }
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_draw_arrows_i:
+  {
+    \group_begin:
+    \prop_get:cnN
+      { g__wa_arrow _\l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+      { options } \l_tmpa_tl
+    \str_clear_new:N \l__wa_previous_key_str
+    \exp_args:NNo \exp_args:No
+    \__wa_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__wa_xoffset_dim } }
+    \bool_set_false:N \l__wa_initial_r_bool
+    \bool_set_false:N \l__wa_final_r_bool
+    \int_case:nn \l__wa_pos_arrow_int
+      {
+        0 { \bool_set_true:N \l__wa_final_r_bool }
+        2 { \bool_set_true:N \l__wa_initial_r_bool }
+        3
+          {
+            \bool_set_true:N \l__wa_initial_r_bool
+            \bool_set_true:N \l__wa_final_r_bool
+          }
+      }
+    \int_compare:nNnT \l__wa_pos_arrow_int = 5
+      {
+        \dim_set:Nn \l__wa_x_dim { - \c_max_dim }
+        \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int
+      }
+    \tl_set:Nx \l__wa_initial_tl
+      {
+        \int_use:N \l__wa_initial_int - \bool_if:NTF \l__wa_initial_r_bool rl
+        .south
+      }
+    \tl_set:Nx \l__wa_final_tl
+      { \int_use:N \l__wa_final_int - \bool_if:NTF \l__wa_final_r_bool rl .north }
+    \prop_get:cnN
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+      { label }
+      \l_tmpa_tl
+    \seq_if_in:NxTF \l__wa_first_arrows_seq
+      { \int_use:N \l__wa_arrow_int }
+      { \bool_set_true:N \l_tmpa_bool }
+      { \bool_set_false:N \l_tmpa_bool }
+    \seq_if_in:NxTF \l__wa_last_arrows_seq
+      { \int_use:N \l__wa_arrow_int }
+      { \bool_set_true:N \l_tmpb_bool }
+      { \bool_set_false:N \l_tmpb_bool }
+    \int_compare:nNnT \l__wa_pos_arrow_int = 5
+      {
+        \bool_set_true:N \l_tmpa_bool
+        \bool_set_true:N \l_tmpb_bool
+      }
+    \tikzpicture [ __wa_standard ]
+      \tikz at scan@one at point \pgfutil at firstofone ( \l__wa_initial_tl )
+      \tl_gset:Nx \g_tmpa_tl
+        {
+          \int_compare:nNnTF \l__wa_pos_arrow_int < 5
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l__wa_x_dim } ,
+          \bool_if:NTF \l_tmpa_bool
+            { \dim_eval:n { \pgf at y + \l__wa_start_adjust_dim } }
+            { \dim_use:N \pgf at y }
+        }
+      \tikz at scan@one at point \pgfutil at firstofone ( \l__wa_final_tl )
+      \tl_gset:Nx \g_tmpb_tl
+        {
+          \int_compare:nNnTF \l__wa_pos_arrow_int < 5
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l__wa_x_dim } ,
+          \bool_if:NTF \l_tmpb_bool
+            { \dim_eval:n { \pgf at y - \l__wa_end_adjust_dim } }
+            { \dim_use:N \pgf at y }
+        }
+    \endtikzpicture
+    \__wa_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_def_function_tmpa:n #1
+  {
+    \cs_set:Npn \__wa_tmpa:nnn ##1 ##2 ##3
+      {
+        \tikzpicture
+          [
+            __wa_standard ,
+            every~path / .style = WithArrows / arrow
+          ]
+          #1
+        \endtikzpicture
+      }
+  }
+\cs_new_protected:Npn \__wa_draw_arrow:nnn #1 #2 #3
+  {
+    \bool_if:nT { \l__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool }
+       { \tl_set_eq:NN \l__wa_tikz_code_tl \c__wa_tikz_code_wrap_lines_tl }
+    \exp_args:NV \__wa_def_function_tmpa:n \l__wa_tikz_code_tl
+    \__wa_tmpa:nnn { #1 } { #2 } { #3 }
+  }
+\cs_generate_variant:Nn \__wa_draw_arrow:nnn { n n o }
+\tl_const:Nn \c__wa_tikz_code_wrap_lines_tl
+  {
+    \draw ( #1 ) to node ( __wa_label ) { } ( #2 ) ;
+    \tikz at parse@node \pgfutil at firstofone ( __wa_label.west )
+    \dim_set:Nn \l_tmpa_dim
+      { \g__wa_right_x_dim - \pgf at x - \pgfkeysvalueof { / pgf / inner~xsep } }
+    \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+    \tl_if_empty:NF \g_tmpa_tl
+      {
+        \dim_set:Nn \l_tmpb_dim \g_tmpa_tl
+        \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+          { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim }
+      }
+    \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim
+      {
+        \path ( __wa_label.west )
+           node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ]
+                { #3 } ;
+      }
+  }
+\cs_new_protected:Npn \__wa_update_x:nn #1 #2
+  {
+    \int_step_inline:nnn { #1 } { #2 }
+      {
+        \tikzpicture [ __wa_standard ]
+          \tikz at scan@one at point \pgfutil at firstofone ( ##1 - l )
+          \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__wa_x_dim \pgf at x }
+        \endtikzpicture
+        \dim_set_eq:NN \l__wa_x_dim \g_tmpa_dim
+      }
+  }
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__wa_last_env_int }
+\keys_define:nn { WithArrows / Arrow / code-after }
+  {
+    tikz     .code:n =
+      \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz     .value_required:n  = true ,
+    rr       .value_forbidden:n = true ,
+    rr       .code:n            = \__wa_fix_pos_option:n 0 ,
+    ll       .value_forbidden:n = true,
+    ll       .code:n            = \__wa_fix_pos_option:n 1 ,
+    rl       .value_forbidden:n = true ,
+    rl       .code:n            = \__wa_fix_pos_option:n 2 ,
+    lr       .value_forbidden:n = true ,
+    lr       .code:n            = \__wa_fix_pos_option:n 3 ,
+    v        .value_forbidden:n = true ,
+    v        .code:n            = \__wa_fix_pos_option:n 4 ,
+    tikz-code .tl_set:N          = \l__wa_tikz_code_tl ,
+    tikz-code .value_required:n  = true ,
+    xoffset  .dim_set:N         = \l__wa_xoffset_dim ,
+    xoffset  .value_required:n  = true ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_Arrow_code_after_seq
+      \__wa_error:n { Unknown~option~Arrow~in~code-after }
+  }
+\seq_new:N \l__wa_options_Arrow_code_after_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_Arrow_code_after_seq
+  { ll, lr, rl, rr, tikz, tikz-code, v, x, offset }
+\cs_new_protected:Npn \__wa_Arrow_code_after
+  {
+    \peek_meaning:NTF [
+      { \__wa_Arrow_code_after_i }
+      { \__wa_Arrow_code_after_i [ ] }
+  }
+\cs_new_protected:Npn \__wa_Arrow_code_after_i [ #1 ] #2 #3 #4
+  {
+    \peek_meaning:NTF [
+      { \__wa_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } }
+      { \__wa_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } [ ] }
+  }
+\cs_new_protected:Npn \__wa_Arrow_code_after_ii [ #1 ] #2 #3 #4 [ #5 ]
+  {
+    \int_set:Nn \l__wa_pos_arrow_int 1
+    \str_clear_new:N \l__wa_previous_key_str
+    \group_begin:
+      \keys_set:nn { WithArrows / Arrow / code-after }
+        { #1, #5, tikz = { xshift = \l__wa_xoffset_dim } }
+      \bool_set_false:N \l__wa_initial_r_bool
+      \bool_set_false:N \l__wa_final_r_bool
+      \int_case:nn \l__wa_pos_arrow_int
+        {
+          0
+            {
+              \bool_set_true:N \l__wa_initial_r_bool
+              \bool_set_true:N \l__wa_final_r_bool
+            }
+          2 { \bool_set_true:N \l__wa_initial_r_bool }
+          3 { \bool_set_true:N \l__wa_final_r_bool }
+        }
+      \tl_if_eq:nnTF { #2 } { #3 }
+        { \__wa_error:nn { Both~lines~are~equal } { #2 } }
+        {
+          \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - #2 - l }
+            { \__wa_error:nx { Wrong~line~in~Arrow } { #2 } }
+            {
+              \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - #3 - l }
+                { \__wa_error:nx { Wrong~line~in~Arrow } { #3 }  }
+                {
+                  \int_compare:nNnTF \l__wa_pos_arrow_int = 4
+                    {
+                      \tikzpicture [ __wa_standard ]
+                        \tikz at scan@one at point \pgfutil at firstofone (#2-l.south)
+                        \dim_set_eq:NN \l_tmpa_dim \pgf at x
+                        \dim_set_eq:NN \l_tmpb_dim \pgf at y
+                        \tikz at scan@one at point \pgfutil at firstofone (#3-l.north)
+                        \dim_set:Nn \l_tmpa_dim
+                          { \dim_max:nn \l_tmpa_dim \pgf at x }
+                        \tl_gset:Nx \g_tmpa_tl
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \l_tmpb_dim }
+                        \tl_gset:Nx \g_tmpb_tl
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf at y }
+                      \endtikzpicture
+                    }
+                    {
+                      \tikzpicture [ __wa_standard ]
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #2-\bool_if:NTF\l__wa_initial_r_bool rl .south )
+                        \tl_gset:Nx \g_tmpa_tl
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #3-\bool_if:NTF\l__wa_final_r_bool rl .north )
+                        \tl_gset:Nx \g_tmpb_tl
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+                      \endtikzpicture
+                    }
+                  \__wa_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
+                }
+            }
+        }
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_MultiArrow:nn #1 #2
+  {
+    \foreach \x in { #1 }
+      {
+        \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - \x - l }
+           { \__wa_error:nx { Wrong~line~specification~in~MultiArrow } \x }
+           { \clist_gput_right:Nx \g_tmpa_clist \x }
+      }
+    \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 }
+      { \__wa_error:n { Too~small~specification~for~MultiArrow } }
+      {
+        \clist_sort:Nn \g_tmpa_clist
+          {
+            \int_compare:nTF { ##1 > ##2 }
+              \sort_return_swapped:
+              \sort_return_same:
+          }
+        \clist_pop:NN \g_tmpa_clist \l_tmpa_tl
+        \clist_reverse:N \g_tmpa_clist
+        \clist_pop:NN \g_tmpa_clist \l_tmpb_tl
+        \exp_args:NV \__wa_MultiArrow_i:n \g_tmpa_clist
+        \tikzpicture
+          [
+            __wa_standard ,
+            every~path / .style = { WithArrows / arrow }
+          ]
+          \draw [<->] ([xshift = \l__wa_xoffset_dim]\l_tmpa_tl-r.south)
+                      -- ++(5mm,0)
+                      -- node (__wa_label) {}
+                         ([xshift = \l__wa_xoffset_dim+5mm]\l_tmpb_tl-r.south)
+                      -- ([xshift = \l__wa_xoffset_dim]\l_tmpb_tl-r.south)  ;
+          \tikz at parse@node \pgfutil at firstofone (__wa_label.west)
+          \dim_set:Nn \l_tmpa_dim { 20 cm }
+          \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+          \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl }
+          \bool_if:nT { \l__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool }
+            {
+              \dim_set:Nn \l_tmpb_dim
+                { \g__wa_right_x_dim - \pgf at x - 0.3333 em }
+              \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+                { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim }
+            }
+          \path (__wa_label.west)
+           node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ;
+        \endtikzpicture
+      }
+  }
+\cs_new_protected:Npn \__wa_MultiArrow_i:n #1
+  {
+        \tikzpicture
+      [
+        __wa_standard ,
+        every~path / .style = { WithArrows / arrow }
+      ]
+      \foreach \k in { #1 }
+        {
+          \draw [ <- ]
+            ( [xshift = \l__wa_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
+        } ;
+        \endtikzpicture
+  }
+\str_const:Nn \c__wa_option_ignored_str
+  { If~you~go~on,~this~option~will~be~ignored. }
+\str_const:Nn \c__wa_command_ignored_str
+  { If~you~go~on,~this~command~will~be~ignored. }
+\__wa_msg_new:nn { Bad~value~for~replace~brace~by }
+  {
+    Bad~value~for~the~option~'\l_keys_key_tl'.~The~value~must~begin~
+    with~an~extensible~left~delimiter.~The~possible~values~are:~.,
+    \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~
+    \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~
+    \token_to_str:N \langle,~\token_to_str:N \lmoustache,~
+    \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\
+    (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\
+    if~amsmath~or~unicode-math~is~loaded~in~LaTeX).\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { option~of~cr~negative }
+  {
+    The~argument~of~the~command~\token_to_str:N\\~
+    should~be~positive~in~the~row~\int_use:N \g__wa_line_int\
+    of~your~environment~\{\l__wa_type_env_str\}.\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { omit~probably~used }
+  {
+    There~is~a~problem.~Maybe~you~have~used~a~command~
+    \token_to_str:N\omit\ in~the~line~\int_use:N \g__wa_line_int\
+    (or~another~line)~of~your~environment~\{\l__wa_type_env_str\}.\\
+    You~can~go~on~but~you~may~have~others~errors.
+  }
+\__wa_msg_new:nn { Invalid~option~format }
+  {
+    The~key~'format'~should~contain~only~letters~r,~c~and~l~and~
+    must~not~be~empty.\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Value~for~a~key }
+  {
+    The~key~'\l_keys_key_tl'~should~be~used~without~value. \\
+    However,~you~can~go~on~for~this~time.
+  }
+\__wa_msg_new:nnn { Unknown~option~in~Arrow }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~for~the~command~
+    \l__wa_string_Arrow_for_msg_str\ in~the~row~
+    \int_use:N \g__wa_line_int\ of~your~environment~
+    \{\l__wa_type_env_str\}. \l_tmpa_str \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_Arrow_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~WithArrows }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_WithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~DispWithArrows }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_DispWithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~WithArrowsOptions }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \WithArrowsOptions. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_WithArrowsOptions_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~Arrow~in~code-after }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \Arrow\ in~code-after. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_Arrow_code_after_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nn { Too~much~columns~in~WithArrows }
+  {
+    Your~environment~\{\l__wa_type_env_str\}~has~\int_use:N
+    \l__wa_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~
+    If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~
+    the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\
+    However,~you~can~go~one~for~this~time.
+  }
+\__wa_msg_new:nn { Too~much~columns~in~DispWithArrows }
+  {
+    Your~environment~\{\l__wa_type_env_str\}~has~\int_use:N
+    \l__wa_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
+    at~the~end~of~row~\int_use:N \g__wa_line_int. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Negative~jump }
+  {
+    You~can't~use~a~negative~value~for~the~option~'jump'~of~command~
+    \l__wa_string_Arrow_for_msg_str\
+    in~the~row~\int_use:N \g__wa_line_int\
+    of~your~environment~\{\l__wa_type_env_str\}.~
+    You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { new-group~without~groups }
+  {
+    You~can't~use~the~option~'new-group'~for~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~
+    'groups'~in~your~environment~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn
+  { Too~few~lines~for~an~arrow }
+  {
+    Line~\l__wa_input_line_str\
+    :~an~arrow~specified~in~the~row~\int_use:N \l__wa_initial_int\
+    of~your~environment~\{\l__wa_type_env_str\}~can't~be~drawn~
+    because~it~arrives~after~the~last~row~of~the~environment. \\
+    If~you~go~on,~this~arrow~will~be~ignored.
+  }
+\__wa_msg_new:nn { WithArrows~outside~math~mode }
+  {
+    The~environment~\{\l__wa_type_env_str\}~should~be~used~only~in~math~mode~
+    like~the~environment~\{aligned\}~of~amsmath. \\
+    Nevertheless,~you~can~go~on.
+  }
+\__wa_msg_new:nn { DispWithArrows~in~math~mode }
+  {
+    The~environment~\{\l__wa_type_env_str\}~should~be~used~only~outside~math~
+    mode~like~the~environment~\{align\}~of~amsmath. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Incompatible~options~in~Arrow }
+  {
+    You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l__wa_previous_key_str'~set~in~the~same~command~
+    \l__wa_string_Arrow_for_msg_str. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Incompatible~options }
+  { You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l__wa_previous_key_str'~set~in~the~same~command~
+    \bool_if:NT \l__wa_in_code_after_bool
+      {
+        \l__wa_string_Arrow_for_msg_str\
+        in~the~code-after~of~your~environment~\{\l__wa_type_env_str\}
+      }. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Arrow~not~in~last~column }
+  {
+    You~should~use~the~command~\l__wa_string_Arrow_for_msg_str\
+    only~in~the~last~column~(column~\int_use:N\l__wa_nb_cols_int)~
+    of~your~environment~\{\l__wa_type_env_str\}.\\
+    However~you~can~go~on~for~this~time.
+  }
+\__wa_msg_new:nn { Wrong~line~in~Arrow }
+  {
+    The~specification~of~line~'#1'~you~use~in~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    in~the~'code-after'~of~\{\l__wa_type_env_str\}~doesn't~exist. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Both~lines~are~equal }
+  {
+    In~the~'code-after'~of~\{\l__wa_type_env_str\}~you~try~to~
+    draw~an~arrow~going~to~itself~from~the~line~'#1'.~This~is~not~possible. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Wrong~line~specification~in~MultiArrow }
+  {
+    The~specification~of~line~'#1'~doesn't~exist. \\
+    If~you~go~on,~it~will~be~ignored~for~\token_to_str:N \MultiArrow.
+  }
+\__wa_msg_new:nn { Too~small~specification~for~MultiArrow }
+  {
+    The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\
+    is~too~small:~you~need~at~least~two~lines. \\
+    \c__wa_command_ignored_str
+  }
+\__wa_msg_new:nn { Not~allowed~in~DispWithArrows }
+  {
+    The~command~\token_to_str:N #1
+    is~allowed~only~in~the~last~column~
+    (column~\int_use:N\l__wa_nb_cols_int)~of~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Not~allowed~in~WithArrows }
+  {
+    The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__wa_type_env_str\}~
+    (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Inexistent~v-node }
+  {
+    There~is~a~problem.~Maybe~you~have~put~a~command~\token_to_str:N\cr\
+    instead~of~a~command~\token_to_str:N\\~at~the~end~of~
+    the~row~\l_tmpa_int\
+    of~your~environment~\{\l__wa_type_env_str\}. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Option~xoffset~forbidden }
+  {
+    You~can't~use~the~option~'xoffset'~in~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    while~you~are~using~the~option~
+    ' \int_compare:nNnTF \l__wa_pos_arrow_int = 7
+        { group }
+        { groups } '. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nnn { Duplicate~name }
+  {
+    The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
+    the~same~environment~name~twice.~You~can~go~on,~but,~
+    maybe,~you~will~have~incorrect~results. \\
+    For~a~list~of~the~names~already~used,~type~H~<return>. \\
+    If~you~don't~want~to~see~this~message~again,~use~the~option~
+    'allow-duplicate-names'.
+  }
+  {
+    The~names~already~defined~in~this~document~are:~
+    \seq_use:Nnnn \g__wa_names_seq { ,~ } { ,~ } { ~and~ }.
+  }
+\cs_new_protected:Npn \WithArrowsNewStyle #1 #2
+  {
+    \keys_if_exist:nnTF { WithArrows / Global } { #1 }
+      { \__wa_error:nn { Key~already~defined } { #1 } }
+      {
+        \keys_define:nn { WithArrows / Global }
+          {
+            #1 .code:n =
+             { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } }
+          }
+        \seq_put_right:Nx \l__wa_options_WithArrows_seq { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l__wa_options_DispWithArrows_seq
+          { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l__wa_options_WithArrowsOptions_seq
+          { \tl_to_str:N { #1 } }
+        \group_begin:
+          \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
+            {
+              The~key~'\l_keys_key_tl'~can't~be~set~in~the~
+              definition~of~a~style.~You~can~go~on~for~this~time~
+              but~you~should~suppress~this~key.
+            }
+          \WithArrowsOptions { #2 }
+        \group_end:
+      }
+  }
+\__wa_msg_new:nn { Key~already~defined }
+  {
+    The~key~'#1'~is~already~defined. \\
+    If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\
+    will~be~ignored.
+  }
+\tl_const:Nn \c__wa_tikz_code_up_tl
+  {
+    \draw [ rounded~corners ]
+       let \p1 = (#1) ,
+           \p2 = (#2)
+       in (\p1) -- node {
+                            #3
+                        }
+          (\x2,\y1) -- (\p2) ;
+  }
+\tl_const:Nn \c__wa_tikz_code_down_tl
+  {
+    \draw [ rounded~corners ]
+      let \p1 = (#1) ,
+          \p2 = (#2)
+      in (\p1) -- (\x1,\y2) --
+               node {
+                        #3
+                    }
+               (\p2) ;
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    up   .code:n = \__wa_set_independent: ,
+    down .code:n = \__wa_set_independent: ,
+    up   .default:n = NoValue ,
+    down .default:n = NoValue
+  }
+\keys_define:nn { WithArrows / Arrow / SecondPass }
+  {
+    up .code:n =
+      \str_if_empty:NT \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { up }
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                {
+                  \int_set:Nn \l__wa_pos_arrow_int \c_one_int
+                  \bool_set_false:N \l__wa_wrap_lines_bool
+                  \tl_set_eq:NN \l__wa_tikz_code_tl
+                    \c__wa_tikz_code_up_tl
+                }
+                { \__wa_error:n { calc~not~loaded } }
+        } ,
+    down .code:n =
+      \str_if_empty:NT \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { down }
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                {
+                  \int_set:Nn \l__wa_pos_arrow_int \c_one_int
+                  \bool_set_false:N \l__wa_wrap_lines_bool
+                  \tl_set_eq:NN \l__wa_tikz_code_tl
+                    \c__wa_tikz_code_down_tl
+                }
+                { \__wa_error:n { calc~not~loaded } }
+        }
+  }
+\seq_put_right:Nn \l__wa_options_Arrow_seq { down }
+\seq_put_right:Nn \l__wa_options_Arrow_seq { up }
+\__wa_msg_new:nn { varwidth~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~
+    you~don't~have~loaded~the~package~'varwidth'. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { calc~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~you~don't~have~loaded~the~
+    Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}'~
+    ~in~the~preamble~of~your~document. \\
+    \c__wa_option_ignored_str
+  }
+\catcode `\@ = 12
+\ExplSyntaxOff
+\endinput
+%%
+%% End of file `witharrows.tex'.


Property changes on: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/generic/witharrows/witharrows.dtx
===================================================================
--- trunk/Master/texmf-dist/source/generic/witharrows/witharrows.dtx	                        (rev 0)
+++ trunk/Master/texmf-dist/source/generic/witharrows/witharrows.dtx	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,6977 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2017-2019 by F. Pantigny
+% -----------------------------------
+%
+% This file may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in:
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% \fi
+% \iffalse
+\def\myfileversion{2.0}
+\def\myfiledate{2019/07/30}
+%
+%
+%<*batchfile>
+\begingroup
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/witharrows}
+\preamble
+
+Copyright (C) 2017-2019 by F. Pantigny
+-----------------------------------
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3
+of this license or (at your option) any later version.
+The latest version of this license is in:
+
+http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+\endpreamble
+\askforoverwritefalse
+\endgroup
+%</batchfile>
+%
+%<*driver>
+\documentclass[dvipsnames]{l3doc}% dvipsnames is for xcolor (loaded by Tikz, loaded by witharrows)
+\usepackage{xltxtra}
+\usepackage[xetex]{geometry}
+\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
+\usepackage[footnotehyper]{witharrows}
+\usetikzlibrary{calc}
+\usepackage{mathtools}
+\usepackage{amssymb}
+\usepackage[only,llbracket,rrbracket]{stmaryrd}
+\usepackage{varwidth}
+\NewDocumentEnvironment {scope} {} {} {}
+\def\interitem{\vskip 7mm plus 2 mm minus 3mm}          
+\def\emphase{\bgroup\color{RoyalPurple}\let\next=}
+\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
+\DeclareMathOperator{\re}{Re}
+\skip \footins = 2 \bigskipamount
+\parindent 0pt
+\DisableCrossrefs
+\begin{document}
+\DocInput{witharrows.dtx}
+\end{document}
+%</driver>
+% \fi 
+% \VerbatimFootnotes
+% \title{The package \pkg{witharrows} for plain-TeX and LaTeX\thanks{This document corresponds to the
+% version~\myfileversion\space of \pkg{witharrows}, at the date
+% of~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny at wanadoo.fr}} 
+%
+% \maketitle
+%
+% \hypersetup{
+%   pdfinfo = {
+%      Title = { The extension 'witharrows' },
+%      Subject = { A extension for plain-TeX and LaTeX} ,
+%      Author = { F. Pantigny }
+%   }
+% }
+%
+%
+% \begin{abstract}
+% The LaTeX package \pkg{witharrows} provides environments |{WithArrows}| and
+% |{DispWithArrows}| similar to the environments |{aligned}| and |{align}| of
+% \pkg{amsmath} but with the possibility to draw arrows on the right side of the
+% alignment. These arrows are usually used to give explanations concerning the
+% mathematical calculus presented.
+% \end{abstract}
+%
+%
+% \vspace{1cm} In this document, we describe the LaTeX extension
+% \pkg{witharrows} (however, \pkg{witharrows} can also be used with plain-TeX:
+% see p.~\pageref{plain-TeX}). This package can be used with |xelatex|,
+% |lualatex|, |pdflatex| but also by the classical workflow
+% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). This package loads the packages
+% \pkg{expl3}, \pkg{l3keys2e}, \pkg{xparse}, \pkg{tikz} and the Tikz libraries
+% \pkg{arrows.meta} and \pkg{bending}. The arrows are drawn with Tikz and that's
+% why several compilations may be necessary.
+%
+% \bigskip
+% This package provides an environment |{WithArrows}| to construct alignments of
+% equations with arrows for the explanations on the right side:
+% 
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 ~emphase#\Arrow{we expand}@ \\
+%   & = a^2 + 2a + 1  % don't put \\ here
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+%
+%
+%
+% \medskip
+% The arrow has been drawn with the command |\Arrow| on the row from which it
+% starts. The command |\Arrow| must be used in the second column (the best way
+% is to put it at the end of the second cell of the row as in the previous
+% example).
+%
+% \medskip
+% The environment |{WithArrows}| bears similarities with the environment
+% |{aligned}| of \pkg{amsmath} (and |mathtools|). The extension \pkg{witharrows}
+% also provides an environment |{DispWithArrows}| which is similar to the
+% environment |{align}| of \pkg{amsmath}: cf. p. \pageref{DispWithArrows}.
+% 
+%
+% \section{Options for the shape of the arrows}
+%
+% The command |\Arrow| has several options. These options can be put between
+% square brackets, before, or after the mandatory argument.
+%
+% The option |jump| gives the number\footnote{It's not possible to give a
+% non-positive value to |jump|. See below (p.~\pageref{Backwards}) the way to
+% draw an arrow which goes backwards.} of rows the arrow must jump (the default
+% value is, of course,~$1$).
+%
+% 
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = \bigl((a+b)+1\bigr)^2 \Arrow[~emphase#jump=2@]{we expand} \\
+%   & = (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]{we expand} \\
+%   & = (a+b)^2 + 2(a+b) +1 \\
+%   & = a^2 + 2ab + b^2 + 2a + 2b +1 
+% \end{WithArrows}$
+%
+% \interitem
+% It's possible to put several arrows which start from the same row.
+% \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
+% The option |xoffset| shifts the arrow to the right (we usually don't want the
+% arrows to be stucked on the text). The default value of |xoffset| is $3$~mm.
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = \bigl((a+b)+1\bigr)^2 
+% \Arrow[~emphase#xoffset=1cm@]{with \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]{with \texttt{xoffset=1cm}} \\
+%   & = (a+b)^2 + 2(a+b) +1 
+% \end{WithArrows}$
+%
+%
+% \interitem 
+% The arrows are drawn with Tikz. That's why the command |\Arrow| has an option
+% |tikz| which can be used to give to the arrow (in fact, the command |\path| of
+% Tikz) the options proposed by Tikz for such an arrow. The following example
+% gives an thick arrow.
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[~emphase#tikz=thick@]{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[tikz=thick]{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \interitem
+% It's also possible to change the arrowheads. For example, we can draw an arrow
+% which goes backwards with the Tikz option~|<-|.
+% \label{Backwards} 
+%
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow~emphase#[tikz=<-]@{we factorize} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[tikz=<-]{we factorize} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \interitem
+% It's also possible to suppress both tips of the arrow with the Tikz option
+% ``|-|''.
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[~emphase#tikz=-@]{very classical} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[tikz=-]{very classical} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \interitem
+% In order to have straight arrows instead of curved ones, we must use the Tikz
+% option ``|bend left = 0|''.
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow~emphase#[tikz={bend left=0}]@{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[tikz={bend left=0}]{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \smallskip 
+% In fact, it's possible to change more drastically the shape or the arrows with
+% the option |tikz-code| (presented p.~\pageref{tikz-code}).
+%
+% \interitem
+% It's possible to use the Tikz option ``|text width|'' to control the width of
+% the text associated to the arrow.\footnote{It's possible to avoid the
+% hyphenations of the words with the option ``|align = flush left|'' of Tikz.}
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = \bigl((a+b)+1\bigr)^2 
+% \Arrow[jump=2,~emphase#tikz={text width=5.3cm}@]{We have done...} \\
+%   & = (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}]{We have done a two-stages expansion but
+% it would have been clever
+% to expand with the multinomial theorem.} \\
+% & = (a+b)^2 + 2(a+b) +1 \\
+% & = a^2 + 2ab + b^2 + 2a + 2b +1
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% In the environments |{DispWithArrows}| and |{DispWithArrows*}|, there is an
+% option |wrap-lines|. With this option, the lines of the labels are
+% automatically wrapped on the right: see p.~\pageref{wrap-lines}.
+% 
+% \interitem
+% If we want to change the font of the text associated to the arrow, we can, of
+% course, put a command like |\bfseries|, |\large| or |\sffamily| at the
+% beginning of the text. But, by default, the texts are composed with a
+% combination of |\small| and |\itshape|. When adding |\bfseries| at the
+% beginning of the text, we won't suppress the |\small| and the |\itshape| and
+% we will consequently have a text in a bold, italic and small font.
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{~emphase#\bfseries@ we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{\bfseries we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \interitem 
+% It's possible to put commands |\\| in the text to force new lines\footnote{By
+% default, this is not possible in a Tikz node. However, in \pkg{witharrows},
+% the nodes are created with the option |align=left|, and, thus, it becomes
+% possible.}. However, if we put a |\\| , a command of font placed in the
+% beginning of the text will have effect only until the first command |\\| (like
+% in an environment |{tabular}|). That's why Tikz gives an option |font| to
+% modify the font of the whole text. Nevertheless, if we use the option
+% |tikz={font={\bfseries}}|, the default specification of |\small| and
+% |\itshape| will be overwritten.
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[~emphase#tikz={font={\bfseries}}@]{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow[tikz={font={\bfseries}}]{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \medskip
+% If we want exactly the same result as previously, we have to give to the
+% option |font| the value |\itshape\small\bfseries|.
+%
+%
+% \interitem 
+% The options can be given directly between square brackets to the environment
+% |{WithArrows}|. There must be no space between the |\begin{WithArrows}| and
+% the opening bracket (|[|) of the options of the environment. Such options
+% apply to all the arrows of the environment.\footnote{They also apply to the
+% nested environments |{WithArrows}| (with the logical exceptions of
+% |interline|, |code-before| and |code-after|).}
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#tikz=blue@]
+% A & = \bigl((a+b)+1\bigr)^2 \Arrow{first expansion.} \\
+%   & = (a+b)^2 + 2(a+b) +1 \Arrow{second expansion.} \\
+%   & = a^2 + 2ab + b^2 + 2a + 2b +1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}[tikz=blue]
+% A & = \bigl((a+b)+1\bigr)^2 \Arrow{first expansion.} \\
+%   & = (a+b)^2 + 2(a+b) +1 \Arrow{second expansion.} \\
+%   & = a^2 + 2ab + b^2 + 2a + 2b +1 
+% \end{WithArrows}$
+%
+%
+% \interitem
+% The environment |{WithArrows}| has an option |displaystyle|. With this option,
+% all the elements are composed in |\displaystyle| (like in an environment
+% |{aligned}| of \pkg{amsmath}).
+%
+% \medskip
+% Without the option |displaystyle|:
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% \int_0^1 (x+1)^2 dx 
+% & = \int_0^1 (x^2+2x+1) dx
+% \Arrow{linearity of integration}     \\
+% & = \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{linearity of integration}     \\
+% & = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
+% & = \frac13 + 2\frac12 + 1 \\
+% & = \frac73
+% \end{WithArrows}$
+%
+%
+% \medskip
+% The same example with the option |displaystyle|:\par\nobreak
+%
+% $\begin{WithArrows}[displaystyle]
+% \int_0^1 (x+1)^2 dx 
+% & = \int_0^1 (x^2+2x+1) dx
+% \Arrow{linearity of integration}     \\
+% & = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
+% & = \frac13 + 2\frac12 + 1 \\
+% & = \frac73
+% \end{WithArrows}$
+%
+%
+%
+% \interitem 
+% Almost all the options can also be set at the document level with the command
+% |\WithArrowsOptions|. In this case, the scope of the declarations is the
+% current TeX group (these declarations are ``semi-global''). For example, if we
+% want all the environments |{WithArrows}| composed in |\displaystyle| with blue
+% arrows, we can write
+% |\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{It's also possible to
+% configure \pkg{witharrows} by modifying the Tikz style |WithArrows/arrow|
+% which is the style used by \pkg{witharrows} when drawing an arrow. For
+% example, to have the labels in blue with roman (upright) types, one can use
+% the following instruction: 
+% |\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{by linearity}\\
+% & = \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{by linearity}\\
+% & = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n
+% \end{WithArrows}$
+% \end{scope}
+%
+%
+% \interitem
+% The command |\Arrow| is recognized only in the environments |{WithArrows}|. If
+% we have a command |\Arrow| previously defined, it's possible to go on using it
+% outside the environments |{WithArrows}|.
+%
+% However, a previouly defined command |\Arrow| may still be useful in an
+% environment |{WithArrows}|. If we want to use it in such an environment, it's
+% possible to change the name of the command |\Arrow| of the package
+% \pkg{witharrows}: there is an option |command-name|\footnote{For historical
+% reasons, there is an alias for this option: |CommandName|.} for this purpose.
+% The new name of the command must be given to the option \emph{without} the
+% leading backslash.
+% %
+% \begin{Verbatim}
+% \NewDocumentCommand {\Arrow} {} {\longmapsto}
+% $\begin{WithArrows}[~emphase#command-name=Explanation@]
+% f & = \bigl(x \Arrow (x+1)^2\bigr)
+% ~emphase#\Explanation{we work directly on fonctions}@\\
+% & = \bigl(x \Arrow x^2+2x+1\bigr)
+% \end{WithArrows}$
+% \end{Verbatim}
+% %
+% \begin{scope}
+% \NewDocumentCommand {\Arrow} {} {\longmapsto}
+% $\begin{WithArrows}[command-name=Explanation]
+% f & = \bigl(x \Arrow (x+1)^2\bigr)
+% \Explanation{we work directly on fonctions}\\
+% & = \bigl(x \Arrow x^2+2x+1\bigr)
+% \end{WithArrows}$
+% \end{scope}
+%
+%
+% \interitem 
+% The environment |{WithArrows}| provides also two options |code-before| and
+% |code-after|\footnote{For historical reasons, there are aliases for these
+% options: |CodeBefore| and |CodeAfter|.} for LaTeX code that will be executed
+% at the beginning and at the end of the environment. These options are not
+% designed to be hooks (they are available only at the environment level and
+% they do not apply to the nested environments).
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#code-before = \color{blue}@]
+% A & = (a+b)^2 \Arrow{we expand} \\
+%   & = a^2 + 2ab + b^2 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}[code-before = \color{blue}]
+% A & = (a+b)^2 \Arrow{we expand} \\
+%   & = a^2 + 2ab + b^2 
+% \end{WithArrows}$
+% 
+% \medskip 
+% Special commands are available in |code-after|: a command |\WithArrowsNbLines|
+% which gives the number of lines (=rows) of the current environment (this is a
+% command and not a counter), a special form of the command |\Arrow| and the
+% command |\MultiArrow|: these commands are described in the section concerning
+% the nested environments, p.~\pageref{NestedEnv}.
+%
+% \section{Numbers of columns}
+%
+% So far, we have used the environment |{WithArrows}| with two columns. However,
+% it's possible to use the environment with an arbitrary number of columns with
+% the option |format|. The value given to this option is like the preamble of an
+% environment |{array}|, that is to say a sequence of letters |r|, |c| and |l|.
+% The default value of the option |format| is, in fact, |rl|.
+%
+% \bigskip
+% For exemple, if we want only one column left-aligned, we use the option |format=l|.
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#format = l@]
+% f(x) \ge g(x) \Arrow{by squaring both sides} \\
+% f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\
+% f(x)^2 - g(x)^2 \ge 0 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}[format = l]
+% f(x) \ge g(x) \Arrow{by squaring both sides} \\
+% f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\
+% f(x)^2 - g(x)^2 \ge 0 
+% \end{WithArrows}$
+%
+% \interitem
+% In the following example, we use five columns all centered (the environment
+% |{DispWithArrows*}| is  presented p.~\pageref{DispWithArrows}).
+%
+% \begin{Verbatim}
+% \begin{DispWithArrows*}[~emphase#format = ccccc@,
+%                         wrap-lines,
+%                         tikz = {align = flush left},
+%                         interline=1mm]
+% k & \;\le\; & t & \;\le\; & k+1 \\
+% \frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} 
+% \Arrow{we can integrate the inequalities since $k \leq k+1$ } \\
+% \int\limits_k^{k+1} \frac{d t}{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,
+%                         tikz = {align = flush left},
+%                         interline=1mm]
+% k & \;\le\; & t & \;\le\; & k+1 \\
+% \frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} 
+% \Arrow{we can integrate the inequalities since $k \leq k+1$ } \\
+% \int\limits_k^{k+1} \frac{d t}{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{Precise positioning of the arrows}
+%
+%
+% The environment |{WithArrows}| defines, during the composition of the array,
+% two series of nodes materialized in red in the following example.\footnote{The
+% option |show-nodes| can be used to materialize the nodes. The nodes are in
+% fact Tikz nodes of shape ``rectangle'', but with zero width. An arrow between
+% two nodes starts at the \emph{south} anchor of the first node and arrives at
+% the \emph{north} anchor of the second node.}
+%
+% \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
+% The nodes of the left are at the end of each line of text. These nodes will be
+% called \emph{left nodes}. The nodes of the right side are aligned vertically
+% on the right side of the array. These nodes will be called \emph{right nodes}.
+%
+% By default, the arrows use the right nodes. We will say that they are in |rr|
+% mode ($r$ for \emph{right}). These arrows are vertical (we will say that an
+% arrow is \emph{vertical} when its two ends have the same abscissa).
+%
+%
+% \smallskip
+% However, it's possible to use the left nodes, or a combination of left and
+% right nodes, with one of the options |lr|, |rl| and |ll| ($l$ for
+% \emph{left}). Those arrows are, usually, not vertical.
+%
+%
+% Therefore
+% $\begin{WithArrows}[displaystyle]
+% I
+% & = \int_{\frac{\pi}4}^0 \ln\Bigl(1+\tan\left(\tfrac{\pi}4-u\right)\Bigr)(-d u) 
+% \Arrow[lr]{This arrow uses the |lr| option.}\\
+% & = \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}]{This arrow uses a |ll| option
+% and a |jump| equal to $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
+% There is also an option called |i| (\emph{i} for \emph{intermediate}). With
+% this option, the arrow is vertical and at the leftmost position.
+%
+% \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]@{because $(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]{because $(x-y)(x+y)=x^2-y^2$}\\
+% & = a^4-b^4 
+% \end{WithArrows}$
+%
+%
+% \interitem 
+% The environment |{WithArrows}| gives also a |group| option. With this option,
+% \emph{all} the arrows of the environment are grouped on a same vertical line
+% and at a leftmost position.
+% %
+% \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{we replace $y_0$ by its value}\\
+% & \Longleftrightarrow 2xK'x^{\frac32} = x^{\frac12} \Arrow{simplification of the $x$}\\
+% & \Longleftrightarrow K' = \tfrac1{2x^2} \Arrow{antiderivation}\\
+% & \Longleftrightarrow K = -\tfrac1{2x} 
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% The environment |{WithArrows}| gives also a |groups| option (with a \emph{s}
+% in the name). With this option, the arrows are divided into several
+% ``groups''. Each group is a set of connected\footnote{More precisely: for each
+% arrow $a$, we note $i(a)$ the number of its initial row and $f(a)$ the number
+% of its final row; for two arrows $a$ and $b$, we say that $a \sim b$ when
+% $\llbracket i(a),f(a)\rrbracket \cap \llbracket i(b),f(b)\rrbracket \neq
+% \varnothing$; the groups are the equivalence classes of the transitive closure
+% of $\sim$.} arrows. All the arrows of a given group are grouped on a same
+% vertical line and at a leftmost position.
+%
+% \bigskip
+% $\begin{WithArrows}[groups]
+% A & = B \Arrow{one} \\
+%   & = C+D \Arrow{two} \\
+%   & = D' \\
+%   & = E+F+G+H+I \\
+%   & = K + L + M \Arrow{three}\\
+%   & = N \Arrow{four}\\
+%   & = O
+% \end{WithArrows}$
+%
+% \bigskip 
+% In an environment which uses the option |group| or the option |groups|, it's
+% still possible to give an option of position (|ll|, |lr|, |rl|, |rr| or |i|)
+% to an individual arrow. Such arrow will be drawn irrespective of the groups.
+% It's also possible to start a new group by applying the option |new-group| to
+% an given arrow.
+% 
+% \bigskip
+% If desired, the option |group| or the option |groups| can be given to the
+% command |\WithArrowsOptions| so that it will become the default value. In this
+% case, it's still possible to come back to the default behaviour for a given
+% environment |{WithArrows}| with the option |rr|: |\begin{WithArrows}[rr]|
+%
+%
+% \vspace{1cm}
+% In the following example, we have used the option |group| for the environment
+% and the option |rr| for the last arrow (that's why the last arrow is not
+% aligned with the others).
+%
+% $\begin{WithArrows}[interline=1mm,group]
+% \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$ is real} \\
+% & = \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{sum of terms of a geometric progression} \\
+% & = \Re \left(\frac{1-\left(\frac{e^{ix}}{\cos x}\right)^{n+1}}{1-\frac{e^{ix}}{\cos x}} \right)
+% \Arrow{algebraic calculation} \\
+% & = \Re \left(\frac{1-\frac{e^{i(n+1)x}}{\cos^{n+1}x}}{1-\frac{e^{ix}}{\cos x}}\right)
+% \Arrow{reduction to common denominator} \\
+% & = \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)$ if $k$ is real} \\
+% & = \frac1{\cos^n x}\Re \left(\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos x-e^{ix}}\right)
+% \Arrow[rr]{algebraic form of the 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[The options 'up' and 'down' for individual arrows]%
+%     {The options ``up'' and ``down'' for individual arrows} 
+%
+% \label{up-and-down}
+% At the local level, there are also two options for individuals arrows, called
+% ``|up|'' and ``|down|''. The following example illustrates these types of
+% arrows:
+% 
+% \begin{Verbatim}
+% \(\begin{WithArrows}
+% A & = B 
+% \Arrow~emphase#[up]@{an arrow of type \texttt{up}} \\
+%   & = C + C + C + C + C + C + C + C  \\
+%   & = C + C + C + C + C + C + C + C  
+% \Arrow~emphase#[down]@{an arrow of type \texttt{down}} \\
+%   & = E + E 
+% \end{WithArrows}\)
+% \end{Verbatim}
+% 
+% \vspace{1cm}
+% \(\begin{WithArrows}
+% A & = B 
+% \Arrow[up]{an arrow of type \texttt{up}} \\
+%   & = C + C + C + C + C + C + C + C  \\
+%   & = C + C + C + C + C + C + C + C  
+% \Arrow[down]{an arrow of type \texttt{down}} \\
+%   & = E + E 
+% \end{WithArrows}\)
+%
+%
+% \vspace{1cm}
+% The options |up| and |down| require the package \pkg{varwidth} and the Tikz
+% library \pkg{calc}. It they are not loaded, an error will be raised.
+%
+%
+% \interitem
+%
+% \section{Comparison with the environment \{aligned\}}
+%
+% |{WithArrows}| bears similarities with the environment |{aligned}| of the
+% extension \pkg{amsmath}. These are only similarities because |{WithArrows}|
+% has not been written upon the environment |{aligned}|.\footnote{In fact, it's
+% possible to use the package \pkg{witharrows} without the package
+% \pkg{amsmath}.}
+%
+% \interitem
+% As in the environments of \pkg{amsmath}, it's possible to change the spacing
+% between two given rows with the option of the command |\\| of end of line
+% (it's also possible to use |\\*| but it has exactly the same effect as |\\|
+% since an environment |{WithArrows}| is always unbreakable). This option is
+% designed to be used with positive values only.
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} ~emphase#\\[2ex]@
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\*[2ex]
+% \noalign{\vspace{3mm}}
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+%
+% \interitem 
+% In the environments of \pkg{amsmath} (or \pkg{mathtools}), the spacing between
+% rows is fixed by a parameter called |\jot| (it's a dimension and not a skip).
+% That's also the case for the environment |{WithArrows}|. An option |jot| has
+% been given to the environment |{WithArrows}| in order to change the value of
+% this parameter |\jot| for a given environment.\footnote{It's also possible to
+% change |\jot| with the environment |{spreadlines}| of \pkg{mathtools}.}
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}[displaystyle,~emphase#jot=2ex@]
+% F & = \frac12G     \Arrow{we expand}\\
+%   & = H + \frac12K \Arrow{we go on}\\
+%   & = K 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+%
+% $\begin{WithArrows}[displaystyle,jot=2ex]
+% F & = \frac12G     \Arrow{we expand}\\
+%   & = H + \frac12K \Arrow{we go on}\\
+%   & = K 
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% However, this new value of |\jot| will also be used in other alignments
+% included in the environment~|{WithArrows}|:
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}[jot=2ex]
+% \varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
+% \Arrow{$x$ and $y$ are real}\\
+% & \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$ and $y$ are real}\\
+% & \Leftrightarrow \left\{
+% \begin{aligned}
+% x+y & = 0 \\
+% x+2y & = 0 
+% \end{aligned}
+% \right.
+% \end{WithArrows}$
+%
+% \bigskip
+% Maybe this doesn't correspond to the desired outcome. That's why an option
+% |interline| is proposed. It's possible to use a skip (=glue) for this option.
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#interline=2ex@]
+% \varphi(x,y) = 0  & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 
+% \Arrow{$x$ and $y$ are real}\\
+% & \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$ and $y$ are real}\\
+% & \Leftrightarrow \left\{
+% \begin{aligned}
+% x+y & = 0 \\
+% x+2y & = 0 \\
+% \end{aligned}
+% \right.
+% \end{WithArrows}$
+%
+%
+% \interitem
+% Like the environment |{aligned}|, |{WithArrows}| has an option of placement
+% which can assume the values |t|, |c| or |b|. However, the default value is not
+% |c| but |t|. If desired, it's possible to have the |c| value as the default
+% with the command |\WithArrowsOptions{c}| at the beginning of the document.
+% %
+% \begin{Verbatim}
+% So\enskip
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% So\enskip 
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{WithArrows}$
+%
+% \bigskip
+% The value |c| may be useful, for example, if we want to add curly braces:
+%
+% \smallskip
+% \begin{Verbatim}
+% Let's set\enskip $~emphase#\left\{@
+% \begin{WithArrows}[~emphase#c@]
+% f(x) & = 3x^3+2x^2-x+4 
+% \Arrow[tikz=-]{both are polynoms}\\
+% g(x) & = 5x^2-5x+6
+% \end{WithArrows}
+% ~emphase#\right.@$
+% \end{Verbatim}
+%
+%
+% Let's set\enskip $\left\{
+% \begin{WithArrows}[c]
+% f(x) & = 3x^3+2x^2-x+4 
+% \Arrow[tikz=-]{both are polynoms}\\
+% g(x) & = 5x^2-5x+6
+% \end{WithArrows}
+% \right.$
+%
+%
+% \interitem
+% Unlike |{aligned}|, the environment |{WithArrows}| uses |\textstyle| by
+% default.
+%
+% Once again, it's possible to change this behaviour with |\WithArrowsOptions|:
+%
+% \quad |\WithArrowsOptions{displaystyle}|.
+%
+%
+% \smallskip
+% The following example is composed with |{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 
+% The following is composed with |{WithArrows}[c,displaystyle]|. The results are
+% strictly identical.\footnote{In versions of \pkg{amsmath} older than the
+% 5~nov.~2016, a thin space was added on the left of an environment |{aligned}|.
+% The new versions do not add this space and neither do
+% |{WithArrows}|.}\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{Arrows in nested environments}
+%
+% \label{NestedEnv}
+%
+% The environments |{WithArrows}| can be nested. In this case, the options given
+% to the encompassing environment applies also to the inner ones (with logical
+% exceptions for |interline|, |code-before| and |code-after|). The command |Arrow|
+% can be used as usual in each environment |{WithArrows}|.
+% 
+% \begin{Verbatim}[formatcom=\small\color{gray}]
+% $~emphase#\begin{WithArrows}@
+% \varphi(x,y)=0
+%   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\
+%   & \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=-]{the same equation}\\
+%   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{the numbers are real}\\
+%   & \Leftrightarrow
+%   \left\{\begin{WithArrows}[c]
+%   x+2y & = 0 \\
+%   2x+4y & = 0 
+%   \end{WithArrows}\right. \\
+%   & \Leftrightarrow
+%   \left\{\begin{WithArrows}[c]
+%   x+2y & = 0 \Arrow[tikz=-]{the same equation}\\
+%   x+2y & = 0 
+%   \end{WithArrows}\right. \\
+%   & \Leftrightarrow x+2y=0 
+% \end{WithArrows}$
+%
+% \bigskip
+% However, one may want to draw an arrow between rows that are not in the same
+% environment. For example, one may want to draw the following arrow :
+%
+% \bigskip
+% $\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division by $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
+% Such a construction is possible by using |\Arrow| in the |code-after| option.
+% Indeed, in |code-after|, a special version of |\Arrow| is available (we will
+% call it ``|\Arrow| in |code-after|'').
+%
+% \smallskip
+% A command |\Arrow| in |code-after| takes three arguments :
+% \begin{itemize}
+% \item a specification of the start row of the arrow ;
+% \item a specification of the end row of the arrow ;
+% \item the label of the arrow.
+% \end{itemize}
+% As usual, it's also possible to give options within square brackets before or
+% after the three arguments. However, these options are limited (see below).
+% 
+% \bigskip
+% The specification of the row is constructed with the position of the concerned
+% environment in the nesting tree, followed (after an hyphen) by the number of
+% the row.
+%
+% \bigskip
+% In the previous example, there are two environments |{WithArrows}| nested in
+% the main environment |{WithArrows}|.
+%
+% $\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{environment number 1}\\
+%   2x+4y & = 0 
+%   \end{WithArrows}\right. \\
+%   & \Leftrightarrow \color{red}
+%   \left\{\begin{WithArrows}[c]
+%   x+2y & = 0 \Arrow{environment number 2}\\
+%   x+2y & = 0 
+%   \end{WithArrows}\right. \\
+%   & \Leftrightarrow x+2y=0 
+% \end{WithArrows}$
+%
+% \bigskip
+% The arrow we want to draw starts in the row~$2$ of the sub-environment
+% number~$1$ (and therefore, the specification is |1-2|) and ends in the row~$2$
+% of the sub-environment number~$2$ (and therefore, the specification is |2-2|).
+% We can draw the arrow with the following command |\Arrow| in |code-after| :
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#code-after = \Arrow{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{1-2}{2-2}{division by $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
+% The options allowed for a command |\Arrow| in |code-after| are : |ll|, |lr|,
+% |rl|, |rr|, |v|, |xoffset|, |tikz| and |tikz-code|. Except |v|, which is
+% specific to |\Arrow| in |code-after|, all these options have their usual
+% meaning.
+%
+% With the option |v|, the arrow drawn is vertical to an abscissa computed with
+% the start row and the end row only : the intermediate lines are not taken into
+% account unlike with the option |i|. Currently, the option |i| is not available
+% for the command~|\Arrow| in |code-after|. However, it's always possible to
+% translate an arrow with |xoffset| (or |xshift| of 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 by $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
+% The package \pkg{witharrows} gives also another command available only in
+% |code-after|: the command |\MultiArrow|. This command draws a ``rak''. The list
+% of the rows of the environment concerned by this rak are given in the first
+% argument of the command |\MultiArrow|. This list is given with the syntax of
+% the list in a |\foreach| command of \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
+% As of now, there is no option available for the command |\MultiArrow| (maybe
+% in a future release).
+% 
+% 
+% \bigskip
+% \section{Arrows from outside environments \{WithArrows\}}
+%
+% If someone wants to draw arrows from outside the environments |{WithArrows}|,
+% he can use the Tikz nodes created in the environments.
+% 
+% The Tikz name of a node created by \pkg{witharrows} is prefixed by |wa-|.
+% Then, we have a list of numbers which give the position in the nesting tree
+% and the row number in the environment. At the end, we have the suffixe |l| for
+% a ``left node'' and |r| for a ``right node''.
+% 
+% \smallskip
+% For illustrative purposes, we give an example of nested environments
+% |{WithArrows}|, and, for each ``right node'', the name of that
+% node.\footnote{There is an option |show-node-names| to show the names of these
+% nodes.}
+% 
+% \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} provides some tools facilitating the use of these
+% nodes:
+% \begin{itemize}
+% \item the command |\WithArrowsLastEnv| gives the number of the last
+% environment of level~$0$ (\emph{i.e.} which is not included in another
+% environnment of the package \pkg{witharrows});
+%
+% \item a name can be given to a given environment with the option |name| and,
+% in this case, the nodes created in the environment will have aliases
+% constructed with this name;
+%
+% \item the Tikz style |WithArrows/arrow| is the style used by \pkg{witharrows}
+% when drawing an arrow\footnote{More precisely, this style is given to the Tikz
+% option ``|every path|'' before drawing the arrow with the code of the option
+% |tikz-code|. This style is modified (in TeX scopes) by the option |tikz| of
+% \pkg{witharrows}.};
+%
+% \item the Tikz style |WithArrows/arrow/tips| is the style for the tip of the
+% arrow (loaded by |WithArrows/arrow|).
+% \end{itemize}
+%
+% For example, we can draw an arrow from \texttt{wa-\WithArrowsLastEnv-2-1-2-r.south}
+% to \texttt{wa-\WithArrowsLastEnv-3-2-r.north} with the following Tikz command. 
+%
+% \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
+% In this case, it would be easier to use a command |\Arrow| in |code-after| but
+% this is an example to explain how the Tikz nodes created by \pkg{witharrows}
+% can be used.
+% 
+% \bigskip
+% In the following example, we create two environments |{WithArrows}| named
+% ``|first|'' and ``|second|'' and we draw a line between a node of the first
+% and a node of the second.
+%
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#name=first@]
+% 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#first at -1-r.south)
+%    to ([xshift=3mm]~emphase#second at -1-r.north) ;
+% \end{tikzpicture}
+% \end{Verbatim}
+% 
+%
+% \begin{center}
+% $\begin{WithArrows}[name=first]
+% 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]first-1-r.south)
+%    to ([xshift=3mm]second-1-r.north) ;
+% \end{tikzpicture}
+% 
+% \section{The environment \{DispWithArrows\}}
+% \label{DispWithArrows}
+% 
+% As previously said, the environment |{WithArrows}| bears similarities with the
+% environment |{aligned}| of \pkg{amsmath} (and |mathtools|). This extension also
+% provides an environment |{DispWithArrows}| which is similar to the
+% environments |{align}| and |{flalign}| of \pkg{amsmath}.
+%
+% \medskip
+% The environment |{DispWithArrows}| must be used \emph{outside} math mode. Like
+% |{align}|, it should be used in horizontal mode.
+% \begin{Verbatim}
+% \begin{~emphase#DispWithArrows@}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{~emphase#DispWithArrows@}
+% \end{Verbatim}
+% \begin{DispWithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{DispWithArrows}
+%
+% \medskip
+% It's possible to use the command |\notag| (or |\nonumber|) to suppress a tag. 
+% 
+% It's possible to use the command |\tag| to put a special tag (e.g. $\star$).
+%
+% It's also possible to put a label to the line of an equation with the command
+% |\label|.
+% 
+% These commands must be in the second column of the environment.
+% \begin{Verbatim}
+% \begin{DispWithArrows}
+% A & = (a+1)^2 \Arrow{we expand} ~emphase#\notag@ \\
+%   & = a^2 + 2a + 1 ~emphase#\tag{$\star$} \label{my-equation}@
+% \end{DispWithArrows}
+% \end{Verbatim}
+% \begin{DispWithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \notag \\
+%   & = a^2 + 2a + 1 \tag{$\star$} \label{my-equation}
+% \end{DispWithArrows}
+% A link to the equation \eqref{my-equation}. This link has been composed with
+% |\eqref{my-equation}| (the command |\eqref| is a command of \pkg{amsmath}).
+% 
+% \medskip
+% If \pkg{amsmath} (or \pkg{mathtools}) is loaded, it's also possible to use
+% |\tag*| which, as in \pkg{amsmath}, typesets the tag without the parenthesis.
+% For example, it's possible to use it to put the symbol |\square| of
+% \pkg{amssymb}. This symbol is often used to mark the end of a
+% proof.\footnote{Notice that the environment |{DispWithArrows}| is compatible
+% with the command |\qedhere| of \pkg{amsthm}.}
+% \begin{Verbatim}
+% \begin{DispWithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \notag \\
+%   & = a^2 + 2a + 1 ~emphase#\tag*{$\square$}@
+% \end{DispWithArrows}
+% \end{Verbatim}
+% \begin{DispWithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \notag \\
+%   & = a^2 + 2a + 1 \tag*{$\square$} 
+% \end{DispWithArrows}
+%
+% \medskip
+% It's also possible to suppress all the autogenerated numbers with the boolean
+% option |notag| (or |nonumber|), at the global or environment level. There is
+% also an environment |{DispWithArrows*}| which suppresses all these
+% numbers.\footnote{Even in this case, it's possible to put a ``manual tag''
+% with the command |\tag|.}
+% \begin{Verbatim}
+% \begin{~emphase#DispWithArrows*@}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{~emphase#DispWithArrows*@}
+% \end{Verbatim}
+% \begin{DispWithArrows*}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{DispWithArrows*}
+%
+% \medskip
+% In fact, there is also another option |tagged-lines| which can be used to
+% control the lines that will be tagged. The value of this option is a list of
+% the numbers of the lines that must to be tagged. For example, with the option
+% |tagged-lines = {first,3,last}|, only the first, the third and the last line
+% of the environment will be tagged. There is also the special value |all| which
+% means that all the lines will be tagged.
+% \begin{Verbatim}
+% \begin{DispWithArrows}[~emphase#tagged-lines = last@]
+% A & = A_1 \Arrow{first stage} \\
+%   & = A_2 \Arrow{second stage} \\
+%   & = A_3 
+% \end{DispWithArrows}
+% \end{Verbatim}
+% \begin{DispWithArrows}[tagged-lines = last]
+% A & = A_1 \Arrow{first stage} \\
+%   & = A_2 \Arrow{second stage} \\
+%   & = A_3 
+% \end{DispWithArrows}
+%
+% \bigskip
+% With the option |fleqn|, the environment is composed flush left (in a way
+% similar to the option |fleqn| of the standard classes of LaTeX). In this case,
+% the left margin can be controlled with the option |mathindent| (with a name
+% inspired by the parameter |\mathindent| of standard LaTeX). The default value
+% of this parameter is 25~pt.
+%
+% \begin{Verbatim}
+% \begin{DispWithArrows}[~emphase#fleqn,mathindent = 1cm@]
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{DispWithArrows}
+% \end{Verbatim}
+% \begin{DispWithArrows}[fleqn,mathindent = 1cm]
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \end{DispWithArrows}
+%
+% \medskip
+% \emph{Remark} : By design, the option |fleqn| of \pkg{witharrows} is
+% independent of the option |fleqn| of LaTeX. Indeed, since the environments of
+% \pkg{witharrows} are meant to be used with arrows on the right side, the user
+% may want to use \pkg{witharrows} with the option |fleqn| (in order to have
+% more space on the right of the equations for the arrows) while still centering
+% the classical equations.
+%
+% \medskip
+% If the option |leqno| is used as a class option, the labels will be composed
+% on the left also for the environments |{DispWithArrows}| and
+% |{DispWithArrows*}|.\footnote{The package \pkg{amsmath} has an option |leqno|
+% but \pkg{witharrows}, of course, is not aware of that option: \pkg{witharrows}
+% only checks the option |leqno| of the document class.}
+%
+% \medskip
+% If the package \pkg{amsmath} is loaded, it's possible to use the command
+% |\intertext| in the environments |{DispWithArrows}|. It's also possible to use
+% the environment |{subequations}|. However, there is, for the environments
+% |{DispWithArrows}| an option |subequations| to encapsulate the environment in
+% an environment |{subequations}|.
+%
+% \medskip
+% In the following example, the key |{subequations}| is fixed by the command
+% |\WithArrowsOptions|. Each environment |{DispWithArrows}| will subnumerated
+% (in the scope of the |\WithArrowsOptions|)
+% \begin{Verbatim}
+% ~emphase#\WithArrowsOptions{subequations}@
+% First environment.
+% \begin{DispWithArrows}
+% A & = B \\
+%   & = C 
+% \end{DispWithArrows}
+% Second environment.
+% \begin{DispWithArrows}
+% D & = E \\
+%   & = F 
+% \end{DispWithArrows}
+% \end{Verbatim}
+% %
+% \begin{scope}
+% \WithArrowsOptions{subequations}
+% First environment.
+% \begin{DispWithArrows}
+% A & = B \\
+%   & = C 
+% \end{DispWithArrows}
+% Second environment.
+% \begin{DispWithArrows}
+% D & = E \\
+%   & = F 
+% \end{DispWithArrows}
+% \end{scope}
+%
+% \bigskip
+% If there is not enough space to put the tag at the end of a line, there is no
+% automatic positioning of the label on the next line (as in the environments of
+% \pkg{amsmath}). However, in |{DispWithArrows}|, the user can use the command
+% |\tagnextline| to manually require the composition of the tag on the following
+% line.
+% \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\xB2
+%    +(-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
+% The environments |{DispWithArrows}| and |{DispWithArrows*}| provide an option
+% |wrap-lines|. With this option, the lines of the label are automatically
+% wrapped on the right.\footnote{It's possible to avoid the hyphenations of the
+% words with the option ``|align = flush left|'' of Tikz.}\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{sum of terms of a geometric progression of ratio $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{This line has been wrapped automatically.} \\
+% & = \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{sum of terms of a geometric progression of ratio $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{This line has been wrapped automatically.} \\
+% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) 
+% \end{DispWithArrows*}
+% 
+% \bigskip
+% The option |wrap-lines| doesn't apply to the environments |{WithArrows}|
+% nested in an environment |{DispWithArrows}| or |{DispWithArrows*}|. However,
+% it applies to the instructions |\Arrow| and |\MultiArrow| of the |code-after|
+% of the environments |{DispWithArrows}| or |{DispWithArrows*}|.
+% 
+% \vspace{1cm}
+% We have said that the environments |{DispWithArrows}| and |{DispWithArrows*}|
+% should be used in horizontal mode and not in vertical mode. However, there is
+% an exception. These environments can be used directly after a |\item| of a
+% LaTeX list. In this case, no vertical space is added before the
+% environment.\footnote{It's possible to disable this feature with the option |standard-behaviour-with-items|.}
+%
+% \medskip
+% Here is an example. The use of |{DispWithArrows}| gives the ability to tag an
+% equation (and also to use |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{we use the formula for a sum of terms of a geometric progression of
+% ratio $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{we use the formula for a sum of terms of a geometric progression of
+% ratio $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}
+% The environment |{DispWithArrows}| is similar to the environment |{align}| of
+% \pkg{amsmath}. However, |{DispWithArrows}| is not constructed upon |{align}|
+% (in fact, it's possible to use \pkg{witharrows} without \pkg{amsmath}).
+%
+% There are differences between |{DispWithArrows}| and |{align}|. 
+% \begin{itemize}
+% \item The environment |{DispWithArrows}| cannot be inserted in an environment
+% |{gather}| of \pkg{amsmath}.
+% \item An environment |{DispWithArrows}| is always unbreakable (even with
+% |\allowdisplaybreaks| of \pkg{amsmath}).
+% \item The commands |\label|, |\tag|, |\notag| and |\nonumber| are allowed only
+% in the last column.
+% \item After an |\item| of a LaTeX list, no vertical space is added (this can
+% be changed with the option |standard-behaviour-with-items|).
+% \item 
+% \begin{bfseries}
+% Last but not least, by default, the elements of a |\{DispWithArrows\}|
+% are composed in |textstyle| and not in |displaystyle| (it's possible to change
+% this point with the option |displaystyle|). 
+% \end{bfseries}
+% \end{itemize}
+% 
+% \bigskip 
+% Concerning the references, the package \pkg{witharrows} is compatible with the
+% extensions \pkg{autonum}, \pkg{cleveref}, \pkg{fancyref}, \pkg{fncylab},
+% \pkg{hyperref}, \pkg{listlbls}, \pkg{prettyref}, \pkg{refcheck},
+% \pkg{refstyle}, \pkg{showlabels}, \pkg{smartref}, \pkg{typedref} and
+% \pkg{varioref}, and with the options |showonlyrefs| and |showmanualtags| of
+% \pkg{mathtools}.\footnote{We recall that \pkg{varioref}, \pkg{hyperref},
+% \pkg{cleveref} and \pkg{autonum} must be loaded in this order. The package
+% \pkg{witharrows} can be loaded anywhere.}
+%
+% It is not compatible with \pkg{showkeys} (not all the labels are shown).
+%
+% 
+%
+%
+% \subsection{The option <...> of DispWithArrows}
+%
+% The environment |{DispWithArrows}| provides an option |left-brace|. When present,
+% the value of this option is composed on the left, followed by a curly brace
+% (hence the name) and the body of the environment.\footnote{The option
+% |left-brace| can also be used without value: in this case, only the brace is drawn...}
+%
+% For lisibility, this option |left-brace| is also available with a special
+% syntax: it's possible to give this option between angle brackets  
+% (\verb|<| and \verb|>|) just after \verb|{DispWithArrows}| (before the optional
+% arguments between square brackets).
+%
+% \bigskip 
+% The following code is an example of multi-case equations.\footnote{The
+% environment |{cases}| of \pkg{amsmath} is a way to compose such multi-cases
+% equations. However, it's not possible to use the automatic numbering of
+% equations with this environment. The environment |{numcases}| of the extension
+% \pkg{cases} (written by Donald Arseneau) provides this possibility but, of
+% course, it's not possible to draw arrows with this extension.}
+%
+% \medskip
+%
+% \begin{BVerbatim}
+% \begin{DispWithArrows}~emphase#< \binom{n}{p} = >@[format = ll,fleqn,displaystyle]
+% 0 & \quad \text{if } p > n  
+% \Arrow{if fact, it's a special case\\ of the following one} \\
+% \frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{if } 0 \leq p \leq n  \\
+% 0 & \quad \text{if } p < 0 
+% \end{DispWithArrows}
+% \end{BVerbatim}
+% %
+% \begin{DispWithArrows}< \binom{n}{p} = >[format = ll,fleqn,displaystyle]
+% 0 & \quad \text{if } p > n  
+% \Arrow{if fact, it's a special case\\ of the following one} \\
+% \frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{if } 0 \leq p \leq n  \\
+% 0 & \quad \text{if } p < 0 
+% \end{DispWithArrows}
+%
+% \interitem
+% In the following example, we subnumerate the equations with the option
+% |subnumerate| (available when the package \pkg{amsmath} is loaded).
+%
+% \begin{Verbatim}
+% \begin{DispWithArrows}~emphase#< \label{system} (\ref*{system}) \Leftrightarrow >@[
+%     format = l, subequations ]
+% x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\
+% xy+xz+yz=-2 \\
+% xyz = -15 \label{last-equation}
+% \end{DispWithArrows}
+% \end{Verbatim}
+% %
+% \begin{DispWithArrows}< \label{system} (\ref*{system}) \Leftrightarrow >[
+%    format = l, subequations]
+% x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\
+% xy+xz+yz=-2 \\
+% xyz = -15 \label{last-equation} 
+% \end{DispWithArrows}
+%
+%
+% \bigskip
+% The whole system is the equation \eqref{system} (this reference has been coded
+% by |\eqref{system}|) whereas the last equation is the equation
+% \eqref{last-equation} (this reference has been coded by
+% |\eqref{last-equation}|). The command |\ref*| used in the code above is
+% provided by \pkg{hyperref}. It's a variant of |\ref| which doesn't create 
+% interactive link.
+%
+% \bigskip
+% With the option \verb|replace-left-brace-by|, it's possible to replace the
+% left curly brace by another extensible delimiter. For example,
+% ``|replace-left-brace-by = [\enskip|'' will compose with a bracket and add also a
+% |\enskip| after this bracket.
+% 
+% \bigskip
+% \section{Advanced features}
+%
+% \subsection{Utilisation with plain-TeX}
+% \label{plain-TeX}
+%
+% The extension \pkg{witharrows} can be used with plain-TeX. In this case, the
+% extension must be loaded with |\input|:
+% \begin{Verbatim}
+% \input{witharrows.tex}
+% \end{Verbatim}
+% 
+% \medskip
+% In plain-TeX, there is not environments as in LaTeX. Instead of using the
+% environment |{Witharrows}|, with |\begin{WithArrows}| and |\end{WithArrows}|,
+% one should use a pseudo-environnement delimited by |\WithArrows| and
+% |\endWithArrows| (idem for |{DispWithArrows}|).
+%
+% \begin{Verbatim}
+% $\WithArrows
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1 
+% \endWithArrows$
+% \end{Verbatim}
+%
+% \medskip
+% The version of \pkg{witharrows} for plain-TeX doesn't provide all the
+% functionnlities of the LaTeX version. In particular, the funcionnalities which
+% deal with the number of the equations are not available (since they rely upon
+% the system of tags of LaTeX).
+%
+% \subsection{The option tikz-code : how to change the shape of the arrows}
+%
+% \label{tikz-code}
+%
+% The option |tikz-code|\footnote{For historical reasons, the option |tikz-code|
+% has an alias: |TikzCode|.} allows the user to change the shape of the 
+% arrows.\footnote{If the option |wrap-lines| is used in an environment
+% |{DispWithArrows}| or |{DispWithArrows*}|, the option |tikz-code| will have no
+% effect for the arrows of this environment but only for the arrows in the
+% nested environments |{WithArrows}|.}
+%
+% \smallskip
+% For example, the options ``|up|'' and ``|down|'' described previously (cf.
+% p.~\pageref{up-and-down}) are programmed internally with |tikz-code|.
+% 
+% \smallskip
+% The value of this option must be a valid Tikz drawing instruction (with the
+% final semicolon) with three markers |#1|, |#2| and |#3| for the start point,
+% the end point and the label of the arrow.
+%
+% \bigskip
+% By default, the value is the following:
+% 
+% \smallskip
+% \qquad \verb|\draw (#1) to node {#3} (#2) ;|
+%
+%
+% \bigskip
+% In the following example, we replace this default path by a path with three
+% segments (and the node overwriting the second 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
+% The environments |{DispWithArrows}| and its starred version
+% |{DispWithArrows*}| provide a command |\WithArrowsRightX| which can be used in
+% a definition of |tikz-code|. This command gives the $x$-value of the right side
+% of the composition box (taking into account the eventual tags of the
+% equations). For an example of use, see p.~\pageref{example-WithArrowsRightX}.
+%
+%
+% \bigskip
+% \subsection{The command \textbackslash WithArrowsNewStyle}
+%
+% The extension \pkg{witharrows} provides a command |\WithArrowsNewStyle| to
+% define styles in a way similar to the ``styles'' of Tikz.
+%
+% The command |\WithArrowsNewStyle| takes two mandatory arguments. The first is
+% the name of the style and the second is a list of key-value pairs. The scope
+% of the definition done by |\WithArrowsNewStyle| is the current TeX scope.
+%
+% The style can be used as a key at the document level (with
+% |\WithArrowsOptions|) or at the environment level (in the optional arguments
+% of |{WithArrows}| and |{DispWithArrows}|). The style can also be used in
+% another command |\WithArrowsNewStyle|.
+%
+% For an example of use, see p.~\pageref{example-WithArrowsRightX}.
+%
+%
+% \bigskip
+% \subsection{Vertical positioning of the arrows}
+% 
+% There are four parameters for fine tuning of the vertical positioning of the
+% arrows : |ygap|, |ystart|, |start-adjust| and |end-adjust|.
+% 
+% \medskip
+% We first explain the behaviour when the parameters |start-adjust| and
+% |end-adjust| are equal to zero:
+% \begin{itemize}
+% \item the option |ystart| sets the vertical distance between the base line of
+% the text and the start of the arrow (default value: 0.4 ex);
+% \item the option |ygap| sets the vertical distance between two consecutive
+% arrows (default value: 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] {|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] {|ygap|} ;
+% \end{tikzpicture}
+%
+% \interitem 
+% However, for aesthetic reasons, when it's possible, \pkg{witharrows} starts
+% the arrow a bit higher (by an amount |start-adjust|) and ends the arrow a bit
+% lower (by an amount |end-adjust|). By default, both parameters |start-adjust|
+% and |end-adjust| are equal to $0.4$~ex.
+%
+% \bigskip
+% Here is for example the behaviour without the mechanism of |start-adjust| and
+% |end-adjust| (this was the standard behaviour for versions prior to 1.13).
+% % \begin{Verbatim}
+% $\begin{WithArrows}~emphase#[start-adjust=0pt, end-adjust=0pt]@
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}[start-adjust=0pt, end-adjust=0pt]
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% Here is the standard behaviour since version 1.13 (the parameters
+% |start-adjust| and |end-ajust| are used with the default value $0.4$~ex). The
+% arrow is longer and the result is more aesthetic.
+% 
+% \medskip
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% It's also possible to use the option |adjust| which sets both |start-adjust|
+% and |end-ajust|.
+%
+% \bigskip
+% Since the mechanism of |start-adjust| and |end-ajust| has been added in
+% version 1.13 of \pkg{witharrows}, that version is not stricty compatible with
+% older versions. However, it's possible to restore the previous behaviour
+% simply by setting |start-adjust| and |end-adjust| to $0$~pt:
+% \begin{Verbatim}
+% \WithArrowsOptions{adjust = 0pt}
+% \end{Verbatim}
+% 
+% \bigskip
+% \subsection{Footnotes in the environments of witharrows}
+% 
+% If you want to put footnotes in an environment |{WithArrows}| or
+% |{DispWithArrows}|, you can use a pair |\footnotemark|--|\footnotetext|.
+%
+% \smallskip
+% It's also possible to extract the footnotes with the help of the package
+% \pkg{footnote} or the package \pkg{footnotehyper}.
+%
+% \smallskip
+% If \pkg{witharrows} is loaded with the option |footnote| (with
+% |\usepackage[footnote]{witharrows}| or with |\PassOptionsToPackage|), the
+% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to
+% extract the footnotes.
+%
+% \smallskip
+% If \pkg{witharrows} is loaded with the option |footnotehyper|, the package
+% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to
+% extract footnotes.
+%
+% \smallskip
+% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible.
+% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote}
+% and should be used preferently. The package \pkg{footnote} has some drawbacks,
+% in particular: it must be loaded after the package \pkg{xcolor} and it is not
+% perfectly compatible with \pkg{hyperref}.
+%
+% \medskip
+% In this document, the package \pkg{witharrows} has been loaded with the option
+% |footnotehyper| and we give an example with a footnote in the label of an
+% arrow:
+%
+% \smallskip
+% $\begin{WithArrows}
+% A & = (a+b)^2 
+% \Arrow{We expand\,\footnote{A footnote.}} \\
+%    & = a^2+b^2+2ab
+% \end{WithArrows}$
+%
+% \bigskip
+% \subsection{Option no-arrows}
+%
+% The option |no-arrows| is a convenience given to the user. With this option
+% the arrows are not drawn. However, an analyse of the arrows is done and some
+% errors can be raised, for example if an arrow would arrive after the last row
+% of the environment.
+%
+%
+% \bigskip
+% \subsection{Note for developpers}
+%
+% If you want to construct an environment upon an environment of
+% \pkg{witharrows}, we recommand to call the environment with the construction
+% |\WithArrows|-|\endWithArrows| or |\DispWithArrows|-|\endDispWithArrows| (and
+% not |\begin{WithArrows}|-|\end{WithArrows}|, etc.).
+%
+% \smallskip
+% By doing so, the error messages generated by \pkg{witharrows} will (usually)
+% mention the name of your environment and they will be easier to understand by
+% the final user.
+%
+% \smallskip
+% By example, you can define an environment |{DWA}| which is an alias of
+% |{DispWithArrows}|:
+% \begin{BVerbatim}
+% \NewDocumentEnvironment {DWA} {} {\DispWithArrows}{\endDispWithArrows}
+% \end{BVerbatim}
+% 
+% \smallskip
+% If you use this environment |{DWA}| in math mode, you will have the following
+% error message:
+% 
+% \begin{BVerbatim}
+% The environment {DWA} should be used only outside math mode.
+% \end{BVerbatim}
+% 
+% \interitem
+% Another example is the definition of the environment |{DispWithArrows*}|
+% internally in the package \pkg{witharrows} by the following code:
+% \begin{Verbatim}
+% \NewDocumentEnvironment {DispWithArrows*} {}
+%     {\WithArrowsOptions{notag}%
+%      \DispWithArrows}
+%     {\endDispWithArrows}
+% \end{Verbatim}
+%
+%
+%
+% \section{Examples}
+%
+% \subsection{\textbackslash MoveEqLeft}
+%
+% It's possible to use |\MoveEqLeft| of \pkg{mathtools}. Don't forget that
+% |\MoveEqLeft| has also the value of an ampersand (|&|). That's important for the
+% placement of an eventual command |\Arrow|.
+% 
+% 
+% 
+% \begin{Verbatim}[formatcom=\small\color{gray}]
+% $\begin{WithArrows}[interline=0.5ex]
+% ~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} 
+% \Arrow{because both are in $[-\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{because both are in $[-\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{Modifying the shape of the nodes}
+%
+% It's possible to change the shape of the labels, which are Tikz nodes, by
+% modifying the key ``|every node|'' of 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{Examples with the option tikz-code}
+%
+% We recall that the option |tikz-code| is the Tikz code used by \pkg{witharrows}
+% to draw the arrows.\footnote{If an environment |{DispWithArrows}| or
+% |{DispWithArrows*}| is used with the option |wrap-lines|, the value of the
+% option |tikz-code| is not used for this environment (but is used for the
+% environments nested inside).}
+%
+% \smallskip
+% The value by defaut of |tikz-code| is \verb|\draw (#1) to node {#3} (#2) ;|
+% where the three markers |#1|, |#2| and |#3| represent the start row, the end
+% row and the label of the arrow.
+%
+%
+% \bigskip
+% \subsubsection{Example 1}
+% In the following example, we define the value of |tikz-code| with two
+% instructions |\path| : the first instruction draws the arrow itself and the
+% second puts the label in a Tikz node in the rectangle delimited by the arrow.
+%
+% \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$ is a morphism for $\times$ et $+$} \\
+% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
+% \Arrow{sum of terms of a geometric progression of ratio $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{Example 2}
+%
+% \label{example-WithArrowsRightX}
+% It's possible to modify the previous example to have the ``|text width|''
+% automatically computed with the right margin (in a way similar as the
+% |wrap-lines| option) in the environments |{DispWithArrows}| and
+% |{DispWithArrows*}|. In the definition of |tikz-code|, we use the command
+% |\WithArrowsRightX| which is the $x$-value of the right margin of the current
+% composition box (it's a TeX command and not a dimension). For lisibility, we
+% use a style. This example requires the Tikz library \pkg{calc}.
+%
+% \begin{Verbatim}
+% \WithArrowsNewStyle{MyStyle}       
+%   {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}[MyStyle]
+%   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{MyStyle}       
+% {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}[MyStyle]
+% 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$ is a morphism for $\times$ et $+$} \\
+% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
+% \Arrow{sum of terms of a geometric progression of ratio $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{Example 3}
+% 
+% In the following example, we change the shape of the arrow depending on whether
+% the start row is longer than the end row or not. This example requires the
+% Tikz library \pkg{calc}.
+% 
+% \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#                    in \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{Automatic numbered loop}
+%
+% Assume we want to draw a loop of numbered arrows. In this purpose, it's
+% possible to write a dedicated command |\NumberedLoop| which will do the job
+% when used in |code-after|. In the following example, we write this command with
+% |\NewDocumentCommand| of \pkg{xparse} and |\foreach| of \pkg{pgffor} (both
+% packages are loaded when \pkg{witharrows} is loaded).
+%
+% \begin{Verbatim}
+% \NewDocumentCommand \NumberedLoop {}
+%         {\foreach \j in {2,...,\WithArrowsNbLines} 
+%               { \pgfmathtruncatemacro{\i}{\j-1}
+%                 \Arrow[rr]{\i}{\j}{\i} }
+%          \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}}
+% \end{Verbatim}
+% 
+% The command |\WithArrowsNbLines| is a command available in |code-after| which
+% gives the total number of lines (=rows) of the current environment (it's a
+% command and not a counter).
+%
+%
+% \bigskip
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#code-after = \NumberedLoop@]
+% a.\;& f \text{ est continuous on } E \\
+% b.\;& f \text{ est continuous in } 0 \\
+% c.\;& f \text{ is bounded on the unit sphere} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian} 
+% \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 continuous on } E \\
+% b.\;& f \text{ est continuous in } 0 \\
+% c.\;& f \text{ is bounded on the unit sphere} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian} 
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% As usual, it's possible to change the characteristic of both arrows and nodes
+% with the option |tikz|. However, if we want to change the style to have, for
+% example, numbers in parenthesis, the best way is to change the value of
+% |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 continuous on } E \\
+% b.\;& f \text{ est continuous in } 0 \\
+% c.\;& f \text{ is bounded on the unit sphere} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian}  
+% \end{WithArrows}$
+%
+% \end{scope}
+%
+% \vspace{2cm}
+% 
+% \section{Implementation}
+%
+% \subsection{Declaration of the package and extensions loaded}
+%
+%
+% First, \pkg{tikz} and some Tikz libraries are loaded before the
+% |\ProvidesExplPackage|. They are loaded this way because |\usetikzlibrary| in
+% |expl3| code fails.\footnote{cf.
+%   |tex.stackexchange.com/questions/57424/using-of-usetikzlibrary-in-an-expl3-package-fails|}
+%
+%    \begin{macrocode} 
+%<@@=wa>
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+%<*LaTeX>
+\RequirePackage{tikz}
+\RequirePackage{expl3}[2019/02/15]
+%</LaTeX>
+%<*plain-TeX>
+\input tikz.tex
+\input expl3-generic.tex
+%</plain-TeX>
+\usetikzlibrary{arrows.meta,bending}
+%    \end{macrocode}
+%
+% \bigskip
+% Then, we can give the traditional declaration of a package written with
+% |expl3|:
+%    \begin{macrocode}
+%<*LaTeX>
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+  {witharrows}
+  {\myfiledate}
+  {\myfileversion}
+  {Draws arrows for explanations on the right}
+%    \end{macrocode}
+%
+% \bigskip
+% The package \pkg{xparse} will be used to define the environments
+% |{WithArrows}|, |{DispWithArrows}|, |{DispWithArrows*}| and the commands
+% |\Arrow|, |\WithArrowsOptions| and |\WithArrowsNewStyle|.
+%    \begin{macrocode}
+\RequirePackage { xparse } [ 2018-10-17 ]
+%</LaTeX>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*plain-TeX>
+\ExplSyntaxOn
+\catcode `\@ = 11
+%</plain-TeX>
+%    \end{macrocode}
+%
+% \bigskip
+% \subsection{The packages footnote and footnotehyper}
+%
+% A few options can be given to the package \pkg{witharrows} when it is loaded
+% (with |\usepackage|, |\RequirePackage| or |\PassOptionsToPackage|). Currently
+% (version \myfileversion), there are two such options: |footnote| and
+% |footnotehyper|. With the option |footnote|, \pkg{witharrows} loads
+% \pkg{footnote} and uses it to extract the footnotes from the environments
+% |{WithArrows}|. Idem for the option |footnotehyper|.
+%
+% \medskip
+% The boolean |\g_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
+%    \begin{macrocode}
+%<*LaTeX>
+\bool_new:N \g_@@_footnotehyper_bool
+%    \end{macrocode}
+%
+% \medskip
+% The boolean |\g_@@_footnote_bool| will indicate if the option |footnote| is
+% used, but quicky, it will also be set to |true| if the option |footnotehyper|
+% is used.
+%    \begin{macrocode}
+\bool_new:N \g_@@_footnote_bool
+%</LaTeX>
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { witharrows } }
+\cs_new_protected:Npn \@@_msg_new:nnn { \msg_new:nnnn { witharrows } }
+\cs_new_protected:Npn \@@_msg_redirect_name:nn 
+  { \msg_redirect_name:nnn { witharrows } }
+\cs_new_protected:Npn \@@_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \@@_warning:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { witharrows } }
+\cs_new_protected:Npn \@@_error:nn  { \msg_error:nnn { witharrows } }
+\cs_generate_variant:Nn \@@_error:nn { n x }
+%    \end{macrocode}
+% 
+% \medskip
+% We define a set of keys |WithArrows/package| for these options.
+%    \begin{macrocode}
+%<*LaTeX>
+\keys_define:nn { WithArrows / package }
+  { 
+    footnote .bool_gset:N = \g_@@_footnote_bool ,
+    footnotehyper .bool_gset:N = \g_@@_footnotehyper_bool ,
+    unknown .code:n = 
+      \@@_fatal:n { Option~unknown~for~package } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Option~unknown~for~package }
+  { 
+    You~can't~use~the~option~'\l_keys_key_tl'~when~loading~the~
+    package~witharrows.~Try~to~use~the~command~
+    \token_to_str:N\WithArrowsOptions. 
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% We process the options when the package is loaded (with |\usepackage|).
+%    \begin{macrocode}
+\ProcessKeysOptions { WithArrows / package }
+%    \end{macrocode}
+% 
+%
+% \medskip
+%    \begin{macrocode}
+\@@_msg_new:nn { Option~incompatible~with~Beamer }
+  { 
+    The~option~'\l_keys_key_tl'\ is~incompatible~
+    with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { footnote~with~footnotehyper~package }
+  { 
+    You~can't~use~the~option~'footnote'~because~the~package~
+    footnotehyper~has~already~been~loaded.~
+    If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~  
+    within~the~environments~of~witharrows~will~be~extracted~with~the~tools~
+    of~the~package~footnotehyper.\\
+    If~you~go~on,~the~package~footnote~won't~be~loaded.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { footnotehyper~with~footnote~package }
+  { 
+    You~can't~use~the~option~'footnotehyper'~because~the~package~
+    footnote~has~already~been~loaded.~
+    If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~  
+    within~the~environments~of~witharrows~will~be~extracted~with~the~tools~
+    of~the~package~footnote.\\ 
+    If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+  }
+%    \end{macrocode}
+%
+% \medskip
+%    \begin{macrocode}
+\bool_if:NT \g_@@_footnote_bool 
+  { 
+    \@ifclassloaded { beamer }
+      { \msg_info:nn { witharrows } { Option~incompatible~with~Beamer } }
+      { 
+        \@ifpackageloaded { footnotehyper }
+          { \@@_error:n { footnote~with~footnotehyper~package } }
+          { \usepackage { footnote } }
+      }
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\bool_if:NT \g_@@_footnotehyper_bool 
+  { 
+    \@ifclassloaded { beamer }
+      { \@@_info:n  { Option~incompatible~with~Beamer } }
+      { 
+        \@ifpackageloaded { footnote }
+          { \@@_error:n { footnotehyper~with~footnote~package } }
+          { \usepackage { footnotehyper } }
+      }
+    \bool_gset_true:N \g_@@_footnote_bool 
+  }
+%    \end{macrocode}
+% The flag |\g_@@_footnote_bool| is raised and so, we will only have to test
+% |\g_@@_footnote_bool| in order to know if we have to insert an environnement
+% |{savenotes}| (the |\begin{savenotes}| is in |\@@_pre_halign:n| and
+% |\end{savenotes}| at the end of the environments |{WithArrows}| and
+% |{DispWithArrows}|).
+%
+% \bigskip
+% \subsection{The class option leqno}
+%
+% The boolean |\c_@@_leqno_bool| will indicate if the class option |leqno| is
+% used. When this option is used in LaTeX, the command |\@eqnnum| is redefined
+% (as one can see in the file |leqno.clo|). That's enough to put the labels on
+% the left in our environments |{DispWithArrows}| and |{DispWithArrows*}|.
+% However, that's not enough when our option |wrap-lines| is used. That's why we
+% have to know if this option is used as a class option. With the following
+% programmation, |leqno| \emph{can't} be given as an option of \pkg{witharrows}
+% (by design).
+%    \begin{macrocode}
+\bool_new:N \c_@@_leqno_bool
+\DeclareOption { leqno } { \bool_set_true:N \c_@@_leqno_bool }
+\DeclareOption* { }
+\ProcessOptions* 
+%</LaTeX>
+%    \end{macrocode}
+%
+% 
+%
+% \bigskip
+% \subsection{Some technical definitions}
+%
+% 
+%    \begin{macrocode}
+\cs_generate_variant:Nn \tl_put_right:Nn { N v }
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
+%    \end{macrocode}
+% 
+% \medskip
+% We create booleans in order to know if some packages are loaded. For example,
+% for the package \pkg{amsmath}, the boolean is called
+% |\c_@@_amsmath_loaded_bool|.\footnote{It's not possible to use
+%   |\@ifpackageloaded| in the core of the functions because |\@ifpackageloaded|
+%   is available only in the preamble.}
+%    \begin{macrocode}
+\AtBeginDocument 
+  { 
+    \clist_map_inline:nn
+      { 
+        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
+        typedref, unicode-math, varwidth 
+      }
+      {
+        \bool_new:c { c_@@_#1_loaded_bool }
+%<*LaTeX>
+        \@ifpackageloaded { #1 }
+          { \bool_set_true:c { c_@@_#1_loaded_bool } }
+          { } 
+%</LaTeX>
+%<*plain-TeX>
+        \bool_set_false:c { c_@@_#1_loaded_bool }
+%</plain-TeX>
+      }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% We define a command |\@@_strcmp:nn| to compare two token lists. It will be
+% available whether the engine is pdfTeX, XeTeX or LuaTeX.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  { 
+    \cs_new_protected:Npn \@@_strcmp:nn  #1 #2
+      { \lua_now:e { l3kernel.strcmp('#1','#2') } } 
+  }
+  { 
+    \cs_new_protected:Npn \@@_strcmp:nn #1 #2 
+      { \pdftex_strcmp:D { #1 } { #2 } } 
+  } 
+%    \end{macrocode}
+%
+% \bigskip
+% We can now define a command |\@@_sort_seq:N| which will sort a sequence.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_sort_seq:N #1
+  { 
+    \seq_sort:Nn #1
+      { 
+        \int_compare:nNnTF 
+          { 
+            \@@_strcmp:nn 
+              { \str_lower_case:n { ##1 } } 
+              { \str_lower_case:n { ##2 } } 
+          } 
+          > 0
+          \sort_return_swapped:
+          \sort_return_same:    
+      } 
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The following command converts each item of a sequence from |tl| to |str|. It
+% will be used when creating list of keys (a key name is always a |str|).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_convert_to_str_seq:N #1
+  {
+    \seq_clear:N \l_tmpa_seq
+    \seq_map_inline:Nn #1 
+      {
+        \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+      }
+    \seq_set_eq:NN #1 \l_tmpa_seq
+  }
+\cs_new_protected:Npn \@@_set_seq_of_str_from_clist:Nn #1 #2
+  {
+    \seq_set_from_clist:Nn #1 { #2 }
+    \@@_convert_to_str_seq:N #1
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The command |\@@_save:N| saves a \pkg{expl3} variable by creating a global
+% version of the variable. For a variable named |\l_|\texttt{\slshape
+%   name}|_|\texttt{\slshape type}, the corresponding global variable will be
+% named |\g_|\texttt{\slshape name}|_|\texttt{\slshape type}. The type of the
+% variable is determinated by the suffix \texttt{\slshape type} and is used to
+% apply the corresponding \pkg{expl3} commands.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_save:N #1
+  { 
+    \seq_set_split:Nxx \l_tmpa_seq 
+       { \char_generate:nn { `_ } { 12 } } 
+       { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+%    \end{macrocode}
+% The string |\l_tmpa_str| will contains the \emph{type} of the variable.
+%    \begin{macrocode}
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _if_exist:cF }
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+      { 
+        \use:c { \l_tmpa_str _new:c }
+          { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } 
+      }
+    \use:c { \l_tmpa_str _gset_eq:cN } 
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1 
+  }
+%    \end{macrocode}
+% 
+% \medskip
+% The command |\@@_restore:N| affects to the \pkg{expl3} variable the value of
+% the (previously) set value of the corresponding \emph{global} variable.
+%    \begin{macrocode}  
+\cs_new_protected:Npn \@@_restore:N #1
+  { 
+    \seq_set_split:Nxx \l_tmpa_seq 
+      { \char_generate:nn { `_ } { 12 } } 
+      { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _set_eq:Nc } 
+      #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ } 
+  }
+%    \end{macrocode}
+% 
+% 
+% \bigskip
+% We define a Tikz style |@@_node_style| for the |l|-nodes and |r|-nodes that
+% will be created in the |\halign|. These nodes are Tikz nodes of shape
+% ``rectangle'' but with zero width. An arrow between two nodes starts from the
+% \emph{south} anchor of the first node and arrives at the \emph{north} anchor
+% of the second node.
+%    \begin{macrocode}
+\tikzset
+  { 
+    @@_node_style / .style = 
+      { 
+        above = \l_@@_ystart_dim ,
+        inner~sep = \c_zero_dim ,
+        minimum~width = \c_zero_dim ,
+        minimum~height = \l_@@_ygap_dim
+      }
+  }
+%    \end{macrocode}
+% If the user uses the option |show-nodes| (it's a \pkg{l3keys} option), the
+% Tikz options |draw| and |red| will be appended to this style. This feature may
+% be useful for debugging.\footnote{The |v|-nodes, created near the end of line
+%   in |{DispWithArrows}| and |{DispWithArrows*}| are not shown with the option
+%   |show-nodes|.}
+%
+% 
+% \bigskip
+% The style |@@_standard| is loaded in standard in the |{tikzpicture}| we need.
+% The names of the nodes are prefixed by |wa| (by security) but also by a prefix
+% which is the position-in-the-tree of the nested environments.
+%    \begin{macrocode}
+\tikzset
+  { 
+    @@_standard / .style = 
+      { 
+        remember~picture ,
+        overlay ,
+        name~prefix = wa - \l_@@_prefix_str -
+      }
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% We also define a style for the tips of arrow. The final user of the extension
+% \pkg{witharrows} will use this style if he wants to draw an arrow directly
+% with a Tikz command in his document (probably using the Tikz nodes created by
+% |{WithArrows}| in the |\halign|).
+%    \begin{macrocode}
+\tikzset
+  { 
+    WithArrows / arrow / tips / .style = 
+      { > = { Straight~Barb [ scale = 1.2 , bend ] } } 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The style |WithArrows/arrow| will be used to draw the arrows (more precisely,
+% it will be passed to |every~path|).
+%    \begin{macrocode}
+\tikzset 
+ { 
+   WithArrows / arrow / .style  = 
+     { 
+       align = left ,
+%    \end{macrocode}
+%
+% We have put the option |align = left| because we want to give the user the
+% possibility of using |\\| in the labels.
+%    \begin{macrocode}
+       auto = left ,
+%<*LaTeX>
+       font = \small \itshape ,
+%</LaTeX>
+       WithArrows / arrow / tips ,
+       bend~left = 45 ,
+       -> 
+     } 
+ }
+%    \end{macrocode}
+%
+% \bigskip
+% The option |subequations| is an option which uses the environment
+% |{subequations}| of \pkg{amsmath}. That's why, if \pkg{amsmath} is loaded, we
+% add the key |subequations| to the list of the keys available in
+% |\WithArrowsOptions| and |{DispWithArrows}|.
+%    \begin{macrocode}
+%<*LaTeX>
+\AtBeginDocument 
+  {
+    \bool_if:NTF \c_@@_amsmath_loaded_bool
+      {
+        \seq_put_right:Nn \l_@@_options_WithArrowsOptions_seq { subequations }
+        \seq_put_right:Nn \l_@@_options_DispWithArrows_seq { subequations }
+      }
+%    \end{macrocode}
+%
+% \bigskip
+% In order to increase the interline in the environments |{WithArrows}|,
+% |{DispWithArrows}|, etc., we will use the command |\spread at equation| of
+% \pkg{amsmath}. When used, this command becomes no-op (in the current TeX
+% group). Therefore, it will be possible to use the environments of
+% \pkg{amsmath} (e.g. |{aligned}|) in an environment |{WithArrows}|.
+% 
+% Nevertheless, we want the extension \pkg{witharrows} available without
+% \pkg{amsmath}. That's why we give a definition of |\spread at equation| if
+% \pkg{amsmath} is not loaded (we put the code in a |\AtBeginDocument| because
+% the flag |\c_@@_amsmath_loaded_bool| is itself set in a |\AtBeginDocument|).
+%    \begin{macrocode}
+      { 
+%</LaTeX>
+        \cs_new_protected:Npn \spread at equation
+          { 
+            \openup \jot   
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:
+          }
+%<*LaTeX>
+      } 
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\tl_new:N \l_@@_left_brace_tl
+\tl_set_eq:NN \l_@@_left_brace_tl \c_novalue_tl
+%    \end{macrocode}
+%
+% \bigskip
+% \subsection{Variables}
+%
+% The boolean |\l_@@_in_WithArrows_bool| will be raised in an environment
+% |{WithArrows}| and the boolean |\l_@@_in_dispwitharrows_bool| will be raised
+% in an environment |{DispWithArrows}| or |{DispWithArrows*}|. The boolean
+% |\l_@@_in_code_after_bool| will be raised during the execution of the
+% |code-after| (option |code-after|).
+%    \begin{macrocode}
+\bool_new:N \l_@@_in_WithArrows_bool
+\bool_new:N \l_@@_in_DispWithArrows_bool
+\bool_new:N \l_@@_in_code_after_bool
+%    \end{macrocode}
+%
+% \bigskip
+% The following sequence is the position of the last environment |{WithArrows}|
+% in the tree of the nested environments |{WithArrows}|.
+%    \begin{macrocode}
+\seq_new:N \g_@@_position_in_the_tree_seq
+\seq_gput_right:Nn \g_@@_position_in_the_tree_seq 1
+%    \end{macrocode}
+%
+% \bigskip
+% The following counter will give the number of the last environment
+% |{WithArrows}| of level~$0$. This counter will be used only in the definition
+% of |\WithArrowsLastEnv|.
+%    \begin{macrocode}
+\int_new:N \g_@@_last_env_int
+%    \end{macrocode}
+%
+% \bigskip
+% The following integer indicates the position of the box that will be created
+% for an environment |{WithArrows}| (not an environment |{DispWithArrows}|) :
+% 0 (=|t|=|\vtop|), 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|).
+%    \begin{macrocode}
+\int_new:N \l_@@_pos_env_int 
+%    \end{macrocode}
+%
+% \bigskip
+% The integer |\l_@@_pos_arrow_int| indicates the position of the arrow with the
+% following code (the option |v| is accessible only for the arrows in
+% |code-after| where the options |i|, |group| et |groups| are not available).
+%
+% \begin{center}
+% \begin{tabular}{l}
+% \begin{tabular}{@{}l*8c@{}}
+% \toprule
+% option                 & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\
+% \midrule
+% |\l_@@_pos_arrow_int| & $0$  & $1$  & $2$  & $3$  & $4$ & $5$  & $6$  & $7$  \\
+% \bottomrule
+% \end{tabular} \\
+% \footnotesize The option |v| can be used only in |\Arrow| in |code-after| (see
+% below). 
+% \end{tabular}
+% \end{center}
+%
+%    \begin{macrocode}
+\int_new:N \l_@@_pos_arrow_int
+\int_set:Nn \l_@@_pos_arrow_int 3
+%    \end{macrocode}
+%
+%
+% \bigskip
+% In the |\halign| of an environment |{WithArrows}| or |{DispWithArrows}|, we
+% will have to use four counters:
+% \begin{itemize}
+% \item |\g_@@_arrow_int| to count the arrows created in the environment ;
+% \item |\g_@@_line_int| to count the lines of the |\halign| ;
+% \item |\g_@@_col_int| to count the column of the |\halign|.
+% \end{itemize}
+%
+%
+% These counters will be incremented in a cell of the |\halign| and, therefore,
+% the incrementation must be global. However, we want to be able to include a
+% |{WithArrows}| in another |{WithArrows}|. To do so, we must restore the
+% previous value of these counters at the end of an environment |{WithArrows}|
+% and we decide to manage a stack for each of these counters.
+%    \begin{macrocode}
+\seq_new:N \g_@@_arrow_int_seq
+\int_new:N \g_@@_arrow_int
+\seq_new:N \g_@@_line_int_seq
+\int_new:N \g_@@_line_int
+\seq_new:N \g_@@_col_int_seq
+\int_new:N \g_@@_col_int
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% For the environment |{DispWithArrows}|, the comma list |\l_@@_tags_clist| will
+% be the list of the numbers of lines to be tagged (with the counter |equation|
+% of LaTeX). In fact, |\l_@@_tags_clist| may contain non negative integers but
+% also three special values, |first|, |last| and |all|.
+%    \begin{macrocode}
+%<*LaTeX>
+\clist_new:N \l_@@_tags_clist
+\clist_set:Nn \l_@@_tags_clist { all }
+%    \end{macrocode}
+%
+% \bigskip
+% During the execution of an environment |{DispWithArrows}|, if a row must be
+% tagged, the (local) value of |\l_@@_tags_clist| will be put (by convention) to
+% |all|. 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_test_if_to_tag:
+  { 
+    \clist_if_in:NVT \l_@@_tags_clist \g_@@_line_int
+      { \clist_set:Nn \l_@@_tags_clist { all } }
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+%
+% \bigskip
+% If the user has given a value for the option |command-name| (at the global or
+% at the \emph{environment} level), a command with this name is defined locally
+% in the environment with meaning |\@@_Arrow|. The default value of the option
+% |command-name| is ``|Arrow|'' and thus, by default, the name of the command
+% will be |\Arrow|.
+%    \begin{macrocode}
+\str_new:N \l_@@_command_name_str
+\str_set:Nn \l_@@_command_name_str { Arrow }
+%    \end{macrocode}
+%
+% \bigskip
+% The string |\l_@@_string_Arrow_for_msg_str| is only a string that will be
+% displayed in some error messages. For example, if |command-name| is defined to
+% be |Explanation|, this string will contain ``|\Arrow alias \Explanation|''. 
+%    \begin{macrocode}
+\str_new:N \l_@@_string_Arrow_for_msg_str 
+\str_set:Nx \l_@@_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+%    \end{macrocode}
+%
+% \bigskip
+% The sequence |\g_@@_names_seq| will be the list of all the names of
+% environments used (via the option |name|) in the document: two environments
+% must not have the same name. However, it's possible to use the option
+% |allow-duplicate-names|.
+%    \begin{macrocode}
+\seq_new:N \g_@@_names_seq
+%    \end{macrocode}
+% 
+% \bigskip
+% The boolean |\l_@@_sbwi_bool| corresponds to the option
+% |standard-behaviour-with-items|. Since the version 1.16 of \pkg{witharrows},
+% no vertical space is added between an |\item| of a LaTeX list and an
+% environment |{DispWithArrows}|. With the option
+% |standard-behaviour-with-items|, it's possible to restore the previous
+% behaviour (which corresponds to the standard behaviour of |{align}| of
+% \pkg{amsmath}). |\l_@@_sbwi_bool| is the boolean corresponding to this option.
+%    \begin{macrocode}
+%<*LaTeX>
+\bool_new:N \l_@@_sbwi_bool 
+%</LaTeX>
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+%<*LaTeX>
+\bool_new:N \l_@@_tag_star_bool
+\bool_new:N \l_@@_tag_next_line_bool
+\bool_new:N \l_@@_qedhere_bool
+%</LaTeX>
+\bool_new:N \l_@@_in_first_columns_bool
+\bool_new:N \l_@@_new_group_bool
+\bool_new:N \l_@@_initial_r_bool
+\bool_new:N \l_@@_final_r_bool
+\tl_new:N \l_@@_initial_tl
+\tl_new:N \l_@@_final_tl
+\int_new:N \l_@@_nb_cols_int
+%    \end{macrocode}
+% 
+% \bigskip
+% The string |\l_@@_format_str| will contain the \emph{format} of the array
+% which is a succession of letters |r|, |c| and |l| specifying the type of the
+% columns of the |\halign| (except the column for the labels of the equations
+% in the environment |{DispWithArrows}|). 
+%    \begin{macrocode}
+\str_new:N \l_@@_format_str
+%    \end{macrocode}
+% 
+% \bigskip
+% The option boolean corresponds to the option |subequations|.
+%    \begin{macrocode}
+%<*LaTeX>
+\bool_new:N \l_@@_subequations_bool
+%</LaTeX>
+%    \end{macrocode}
+% 
+% \bigskip
+% \subsection{The definition of the options}
+%
+% There are four levels where options can be set:
+% \begin{itemize}
+% \item with |\usepackage[...]{witharrows}|: this level will be called
+% \emph{package} level;
+% \item with |\WithArrowsOptions{...}|: this level will be called \emph{global}
+% level\footnote{This level is called \emph{global level} but the settings done
+% by |\WithArrowsOptions| are local in the TeX sense: their scope corresponds to
+% the current TeX group.};
+% \item with |\begin{WithArrows}[...]|: this level will be called
+% \emph{environment} level;
+% \item with |\Arrow[...]| (included in |code-after|): this level will be called
+% \emph{local} level.
+% \end{itemize}
+%
+%
+% \bigskip
+% When we scan a list of options, we want to be able to raise an error if two
+% options of position (|ll|, |rl|, |i|, etc.) of the arrows are present. That's
+% why we keep the first option of position in a variable called
+% |\l_@@_previous_key_str|. The following function |\@@_eval_if_allowed:n| will
+% execute its argument only if a first key of position has not been set (and
+% raise an error elsewhere). 
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_eval_if_allowed:n #1
+  { 
+    \str_if_empty:NTF \l_@@_previous_key_str
+      { 
+        \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl
+        #1
+      }
+      { \@@_error:n { Incompatible~options } }
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_fix_pos_option:n #1
+  { \@@_eval_if_allowed:n { \int_set:Nn \l_@@_pos_arrow_int { #1 } } }
+%    \end{macrocode}
+%
+% \bigskip
+% First a set of keys that will be used at the global or environment level of
+% options.
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Global }
+  {
+    ygap .dim_set:N = \l_@@_ygap_dim ,
+    ygap .value_required:n = true ,
+    ygap .initial:n = 0.4 ex ,
+    ystart .dim_set:N = \l_@@_ystart_dim ,
+    ystart .value_required:n = true ,
+    ystart .initial:n = 0.4 ex ,
+    more-columns .code:n = 
+      \@@_msg_redirect_name:nn { Too~much~columns~in~WithArrows } { none } ,
+    more-columns .value_forbidden:n = true,
+    command-name .code:n =
+      \str_set:Nn \l_@@_command_name_str { #1 }
+      \str_set:Nx \l_@@_string_Arrow_for_msg_str
+        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+    command-name .value_required:n = true ,
+    tikz-code .tl_set:N = \l_@@_tikz_code_tl,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz-code .value_required:n = true ,
+    TikzCode .meta:n = { tikz-code = #1 } ,
+    displaystyle .bool_set:N = \l_@@_displaystyle_bool ,
+    displaystyle .default:n = true ,
+    show-nodes .code:n =  
+      \tikzset { @@_node_style / .append~style = { draw , red } } ,
+    show-nodes .value_forbidden:n = true,
+    show-node-names .bool_set:N = \l_@@_show_node_names_bool ,
+    show-node-names .default:n = true ,
+    group .code:n = 
+      \str_if_empty:NTF \l_@@_previous_key_str
+        {
+          \str_set:Nn \l_@@_previous_key_str { group }
+          \seq_remove_all:Nn \l_@@_options_Arrow_seq { xoffset }
+          \int_set:Nn \l_@@_pos_arrow_int 7 
+        }
+        { \@@_error:n { Incompatible~options } } ,
+    group .value_forbidden:n = true ,
+    groups .code:n = 
+      \str_if_empty:NTF \l_@@_previous_key_str
+        { 
+          \str_set:Nn \l_@@_previous_key_str { groups }
+          \seq_if_in:NnF \l_@@_options_Arrow_seq { new-group }
+            { \seq_put_right:Nn \l_@@_options_Arrow_seq { new-group } }
+          \seq_remove_all:Nn \l_@@_options_Arrow_seq { xoffset }
+          \int_set:Nn \l_@@_pos_arrow_int 6
+        }
+        { \@@_error:n { Incompatible~options } } ,
+    groups .value_forbidden:n = true ,
+    tikz   .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } , 
+    tikz   .initial:n         = \c_empty_tl ,
+    tikz   .value_required:n  = true ,
+    rr     .value_forbidden:n = true ,
+    rr     .code:n            = \@@_fix_pos_option:n 3 ,
+    ll     .value_forbidden:n = true ,
+    ll     .code:n            = \@@_fix_pos_option:n 1 ,
+    rl     .value_forbidden:n = true ,
+    rl     .code:n            = \@@_fix_pos_option:n 2 ,
+    lr     .value_forbidden:n = true ,
+    lr     .code:n            = \@@_fix_pos_option:n 0 ,
+    i      .value_forbidden:n = true ,
+    i      .code:n            = \@@_fix_pos_option:n 5 ,
+    xoffset .dim_set:N  = \l_@@_xoffset_dim ,
+    xoffset .value_required:n  = true ,
+    xoffset .initial:n = 3 mm ,
+    jot .dim_set:N = \jot ,
+    jot .value_required:n = true ,
+    interline .skip_set:N = \l_@@_interline_skip ,
+    interline .value_required:n = true ,
+    start-adjust .dim_set:N = \l_@@_start_adjust_dim ,
+    start-adjust .value_required:n = true ,
+    start-adjust .initial:n = 0.4 ex ,
+    end-adjust .dim_set:N = \l_@@_end_adjust_dim ,
+    end-adjust .value_required:n = true ,
+    end-adjust .initial:n = 0.4 ex ,
+    adjust .meta:n  = { start-adjust = #1 , end-adjust = #1 } ,
+    adjust .value_required:n = true ,
+%    \end{macrocode}
+%
+% \medskip
+% With the option |no-arrows|, the arrows won't be drawn. However, the ``first
+% pass'' of the arrows is done and some errors may be detected. The
+% nullification of |\@@_draw_arrows:nn| is for the standard arrows and the
+% nullification of |\@@_draw_arrow:nnn| is for ``Arrow in |code-after|''.
+%    \begin{macrocode}
+    no-arrows .code:n = 
+      \cs_set_eq:NN \@@_draw_arrows:nn \use_none:nn
+      \cs_set_eq:NN \@@_draw_arrow:nnn \use_none:nnn  ,
+    no-arrows .value_forbidden:n = true ,
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% Now a set of keys specific to the environments |{WithArrows}| (and not
+% |{DispWithArrow}}|). Despite its name, this set of keys will also be used in
+% |\WithArrowsOptions|. 
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+  { 
+    t   .code:n            = \int_set:Nn \l_@@_pos_env_int O ,
+    t   .value_forbidden:n = true ,
+    c   .code:n            = \int_set:Nn \l_@@_pos_env_int 1 ,
+    c   .value_forbidden:n = true ,
+    b   .code:n            = \int_set:Nn \l_@@_pos_env_int 2 ,
+    b   .value_forbidden:n = true
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The following list of the (left) extensible delimiters of LaTeX is only for
+% the validation of the key |replace-left-brace-by|.
+%    \begin{macrocode}
+\clist_new:N \c_@@_extensible_delimiters_clist
+\clist_set:Nn \c_@@_extensible_delimiters_clist
+  { 
+    ., \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor
+  }
+%<*LaTeX>
+\AtBeginDocument
+  { 
+    \bool_if:nT 
+      { \c_@@_amsmath_loaded_bool || \use:c { c_@@_unicode-math_loaded_bool } } 
+      { 
+        \clist_put_right:Nn \c_@@_extensible_delimiters_clist { \lvert, \lVert }
+      }  
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+%
+% \bigskip
+% Now a set of keys specific to the environments |{DispWithArrows}| and
+% |{DispWithArrows*}| (and not |{WithArrows}|). Despite its name, this set of
+% keys will also be used in |\WithArrowsOptions|. 
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / DispWithArrowsSpecific }
+  {  
+    fleqn .bool_set:N = \l_@@_fleqn_bool ,
+    fleqn .default:n = true ,
+    mathindent .dim_set:N = \l_@@_mathindent_dim ,
+    mathindent .value_required:n = true ,
+    mathindent .initial:n = 25 pt ,
+%<*LaTeX>
+    notag .code:n = 
+      \str_if_eq:nnTF { #1 } { true }
+        { \clist_clear:N \l_@@_tags_clist }
+        { \clist_set:Nn \l_@@_tags_clist { all } } ,
+    notag .default:n = true ,
+%    \end{macrocode}
+% Since the option |subequations| is an option which insert the environment
+% |{DispWithArrows}| in an environment |{subequations}| of \pkg{amsmath}, we
+% must test whether the package \pkg{amsmath} is loaded. 
+%    \begin{macrocode}
+    subequations .code:n = 
+      \bool_if:NTF \c_@@_amsmath_loaded_bool
+        { \bool_set_true:N \l_@@_subequations_bool }
+        { 
+          \@@_error:n { amsmath~not~loaded } 
+          \group_begin:
+          \globaldefs = 1
+          \@@_msg_redirect_name:nn { amsmath~not~loaded } { info }
+          \group_end:
+        } ,
+    subequations .default:n = true ,
+    subequations .value_forbidden:n = true ,
+    nonumber .meta:n = notag ,
+    allow-multiple-labels .code:n = 
+      \@@_msg_redirect_name:nn { Multiple~labels } { none } ,
+    allow-multiple-labels .value_forbidden:n = true ,
+    tagged-lines .code:n =   
+      \clist_set:Nn \l_@@_tags_clist { #1 }
+      \clist_if_in:NnT \l_@@_tags_clist { first }
+        {
+          \clist_remove_all:Nn \l_@@_tags_clist { first }
+          \clist_put_left:Nn \l_@@_tags_clist \c_one_int
+        } ,
+    tagged-lines .value_required:n = true ,
+%</LaTeX>
+    wrap-lines .bool_set:N = \l_@@_wrap_lines_bool ,
+    wrap-lines .default:n = true ,
+    replace-left-brace-by .code:n = 
+      {
+        \tl_set:Nx \l_tmpa_tl { \tl_head:n { #1 } }
+        \clist_if_in:NVTF 
+          \c_@@_extensible_delimiters_clist
+          \l_tmpa_tl
+          { \tl_set:Nn \l_@@_replace_left_brace_by_tl { #1 } }
+          { \@@_error:n { Bad~value~for~replace~brace~by } }
+      } ,
+    replace-left-brace-by .initial:n = \lbrace ,
+%    \end{macrocode}
+%
+% Since the version 1.16 of \pkg{witharrows}, no vertical space is added between
+% an |\item| of a LaTeX list and an environment |{DispWithArrows}|. With the
+% option |standard-behaviour-with-items|, it's possible to restore the previous
+% behaviour (which corresponds to the standard behaviour of |{align}| of
+% \pkg{amsmath}).
+%    \begin{macrocode}
+%<*LaTeX>>
+    standard-behaviour-with-items .bool_set:N = \l_@@_sbwi_bool ,
+    standard-behaviour-with-items .default:n = true 
+%</LaTeX>
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% Now a set of keys which will be used in all the environments (but not in
+% |\WithArrowsOptions}|). 
+%
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Env } 
+  { 
+    name .code:n = 
+%    \end{macrocode}
+% First, we convert the value in a |str| because the list of the names will be a
+% list of |str|.
+%    \begin{macrocode}
+      \str_set:Nn \l_tmpa_str { #1 }
+      \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str
+        { \@@_error:n { Duplicate~name } }
+        { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str }
+      \str_set_eq:NN \l_@@_name_str \l_tmpa_str ,
+    name .value_required:n = true ,
+    code-before .code:n = \tl_put_right:Nn \l_@@_code_before_tl { #1 } ,
+    code-before .value_required:n = true,
+    CodeBefore .meta:n = { code-before = #1 } ,
+    code-after .code:n = \tl_put_right:Nn \l_@@_code_after_tl { #1 } ,
+    code-after .value_required:n = true ,
+    CodeAfter  .meta:n = { code-after = #1 } ,
+    format .code:n = 
+      \tl_if_empty:nTF { #1 } 
+        { \@@_error:n { Invalid~option~format } }
+        {
+          \regex_match:nnTF { \A[rcl]*\Z } { #1 }
+            { \tl_set:Nn \l_@@_format_str { #1 } }
+            { \@@_error:n { Invalid~option~format } }
+        } ,
+    format .value_required:n = true ,
+  }
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% Now, we begin the construction of the major sets of keys, named
+% ``|WithArrows / WithArrows|'', ``|WithArrows / DispWithArrows|'' and 
+% ``|WithArrows / WithArrowsOptions|''. Each of these sets of keys will be
+% completed after.
+%    \begin{macrocode}
+\keys_define:nn { WithArrows } 
+  { 
+    WithArrows .inherit:n = 
+      { 
+        WithArrows / Global , 
+        WithArrows / WithArrowsSpecific , 
+        WithArrows / Env
+      } , 
+    DispWithArrows .inherit:n = 
+      { 
+        WithArrows / DispWithArrowsSpecific , 
+        WithArrows / Global ,
+        WithArrows / Env ,
+      } ,
+    WithArrowsOptions .inherit:n = 
+      { 
+        WithArrows / Global , 
+        WithArrows / WithArrowsSpecific , 
+        WithArrows / DispWithArrowsSpecific 
+      } 
+  }
+%    \end{macrocode}
+% 
+% 
+% \bigskip
+% A sequence of |str| for the options available in |{WithArrows}|. This sequence
+% will be used in the error messages and can be modified dynamically.
+%    \begin{macrocode}
+\seq_new:N \l_@@_options_WithArrows_seq
+\@@_set_seq_of_str_from_clist:Nn \l_@@_options_WithArrows_seq
+  { 
+    adjust, b, c, code-after, code-before, command-name,
+    displaystyle, end-adjust, 
+    format, group, groups, i,
+    interline, jot, ll,
+    lr, more-columns, name, 
+    no-arrows, rl, rr, 
+    show-node-names, show-nodes, start-adjust,
+    t, tikz, tikz-code, 
+    xoffset, ygap, ystart 
+  } 
+\@@_convert_to_str_seq:N \l_@@_options_WithArrows_seq
+%    \end{macrocode}
+%
+% \medskip
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / WithArrows } 
+  { 
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_WithArrows_seq 
+      \@@_error:n { Unknown~option~WithArrows } 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / DispWithArrows } 
+  { 
+    left-brace .tl_set:N = \l_@@_left_brace_tl ,
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_DispWithArrows_seq
+      \@@_error:n { Unknown~option~DispWithArrows } 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% A sequence of the options available in |{DispWithArrows}|. This sequence will
+% be used in the error messages and can be modified dynamically.
+%    \begin{macrocode}
+\seq_new:N \l_@@_options_DispWithArrows_seq
+\@@_set_seq_of_str_from_clist:Nn \l_@@_options_DispWithArrows_seq
+  { 
+    code-after, code-before, command-name, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot,
+    left-brace, ll, lr, mathindent, name, no-arrows, replace-left-brace-by, rl,
+    rr, show-node-names, show-nodes, start-adjust, tikz, wrap-lines, xoffset,
+    ygap, ystart,
+%<*LaTeX>>  
+    allow-multiple-labels, tagged-lines, nonumber, notag
+%</LaTeX>
+  }
+%    \end{macrocode}
+% 
+%
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / WithArrowsOptions } 
+  { 
+    allow-duplicate-names .code:n = 
+      \@@_msg_redirect_name:nn { Duplicate~name } { none } ,
+    allow-duplicate-names .value_forbidden:n = true ,
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_WithArrowsOptions_seq
+      \@@_error:n { Unknown~option~WithArrowsOptions } 
+  }
+%    \end{macrocode}
+% 
+%
+% \bigskip
+% A sequence of the options available in |\WithArrowsOptions|. This sequence
+% will be used in the error messages and can be modified dynamically.
+%    \begin{macrocode}
+\seq_new:N \l_@@_options_WithArrowsOptions_seq
+\@@_set_seq_of_str_from_clist:Nn \l_@@_options_WithArrowsOptions_seq
+  { 
+    allow-duplicate-names, b, c, command-name, more-columns, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+    mathindent, no-arrows, rl, rr, show-node-names, show-nodes, start-adjust, t,
+    tikz, wrap-lines, xoffset, ygap, ystart, 
+%<*LaTeX>>
+    allow-multiple-labels, nonumber, notag, standard-behaviour-with-items,
+    tagged-lines
+%</LaTeX>
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The command |\@@_set_independent:| is a command without argument that will be
+% used to specify that the arrow will be ``independent'' (of the potential
+% groups of the option |group| or |groups|). This information will be stored in
+% the field ``status'' of the arrow. Another value of the field ``status'' is
+% ``new-group''.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_set_independent:
+  { 
+    \str_if_empty:NTF \l_@@_previous_key_str
+      {
+        \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl
+        \str_set:Nn \l_@@_status_arrow_str { independent } 
+        \str_if_eq:VnF \l_keys_value_tl { NoValue }
+          { \@@_error:n { Value~for~a~key } }
+      }
+      { \@@_error:n { Incompatible~options~in~Arrow } }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The options of an individual arrow are parsed twice. The first pass is when
+% the command |\Arrow| is read. The second pass is when the arrows are drawn
+% (after the end of the environment |{WithArrows}| or |{DispWithArrows}|). Now,
+% we present the keys set for the first pass. The main goal is to extract
+% informations which will be necessary during the scan of the arrows. For
+% instance, we have to know if some arrows are ``independent'' or use the
+% option ``new-group''.
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  { 
+    jump .code:n = 
+      \int_compare:nTF { #1 > 0 }
+        { \int_set:Nn \l_@@_jump_int { #1 } }
+        { \@@_error:n { Negative~jump } } ,
+    jump .value_required:n  = true,
+    rr .code:n = \@@_set_independent: ,
+    ll .code:n = \@@_set_independent: ,
+    rl .code:n = \@@_set_independent: ,
+    lr .code:n = \@@_set_independent: ,
+    i  .code:n = \@@_set_independent: ,
+    rr .default:n = NoValue ,
+    ll .default:n = NoValue ,
+    rl .default:n = NoValue ,
+    lr .default:n = NoValue ,
+    i  .default:n = NoValue ,
+    new-group .value_forbidden:n = true,
+    new-group .code:n = 
+      \int_compare:nTF { \l_@@_pos_arrow_int = 6 }
+        { \str_set:Nn \l_@@_status_arrow_str { new-group } }
+        { \@@_error:n { new-group~without~groups } } , 
+%    \end{macrocode}
+%
+% \medskip
+% The other keys don't give any information necessary during the scan of the
+% arrows. However, you try to detect errors and that's why all the keys are
+% listed in this keys set. An unknown key will be detected at the point of the
+% command |\Arrow| and not at the end of the environment.
+%    \begin{macrocode}
+    tikz-code .code:n = \prg_do_nothing: ,
+    tikz-code .value_required:n = true ,
+    tikz .code:n = \prg_do_nothing: ,
+    tikz .value_required:n = true ,
+%    \end{macrocode}
+%
+% \medskip
+% The option |xoffset| is not allowed when the option |group| or the option
+% |groups| is used (since it would be meaningless).
+%    \begin{macrocode}
+    xoffset .code:n = 
+      \int_compare:nNnT \l_@@_pos_arrow_int > 5
+        { \@@_error:n { Option~xoffset~forbidden } } ,
+    xoffset .value_required:n = true ,
+    start-adjust .code:n = \prg_do_nothing: ,
+    start-adjust .value_required:n = true ,
+    end-adjust .code:n = \prg_do_nothing: ,
+    end-adjust .value_required:n = true ,
+    adjust .code:n  = \prg_do_nothing: ,
+    adjust .value_required:n = true ,
+    unknown .code:n = 
+      \@@_sort_seq:N \l_@@_options_Arrow_seq
+      \seq_if_in:NVTF \l_@@_options_WithArrows_seq \l_keys_key_tl
+        { 
+          \str_set:Nn \l_tmpa_str
+           { ~However,~this~key~can~be~used~in~the~options~of~\{WithArrows\}. } 
+        }
+        { \str_clear:N \l_tmpa_str }
+      \@@_error:n { Unknown~option~in~Arrow }
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% A sequence of the options available in |\Arrow|. This sequence will be used in
+% the error messages and can be modified dynamically.
+%    \begin{macrocode}
+\seq_new:N \l_@@_options_Arrow_seq
+\@@_set_seq_of_str_from_clist:Nn \l_@@_options_Arrow_seq
+  { 
+    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, tikz-code,
+    xoffset 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_fix_pos_arrow:n #1
+  { 
+    \str_if_empty:NT \l_@@_previous_key_str
+      { 
+        \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl
+        \int_set:Nn \l_@@_pos_arrow_int { #1 } 
+      }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The options of the individual commands |\Arrows| are scanned twice. The second
+% pass is just before the drawing of the arrow. In this set of keys, we don't
+% put an item for the unknown keys because an unknown key would have been
+% already detected during the first pass.
+%
+%    \begin{macrocode} 
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+  { 
+    tikz-code .tl_set:N = \l_@@_tikz_code_tl ,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz .initial:n = \c_empty_tl ,
+    rr .code:n = \@@_fix_pos_arrow:n 3 ,
+    ll .code:n = \@@_fix_pos_arrow:n 1 ,
+    rl .code:n = \@@_fix_pos_arrow:n 2 ,
+    lr .code:n = \@@_fix_pos_arrow:n 0 ,
+    i  .code:n = \@@_fix_pos_arrow:n 5 ,
+%    \end{macrocode}
+%
+% \medskip
+% The option |xoffset| is not allowed when the option |group| or the option 
+% |groups| is used (since it would be meaningless). An error has been raised 
+% during the first pass. Here, we manage to avoid a second error which
+% would be redundant.
+%    \begin{macrocode}
+    xoffset .code:n  = 
+      \int_compare:nNnF \l_@@_pos_arrow_int > 5
+        { \dim_set:Nn \l_@@_xoffset_dim { #1 } } ,
+    start-adjust .dim_set:N = \l_@@_start_adjust_dim,
+    end-adjust .dim_set:N = \l_@@_end_adjust_dim,
+    adjust .code:n  =  
+      \dim_set:Nn \l_@@_start_adjust_dim { #1 }
+      \dim_set:Nn \l_@@_end_adjust_dim { #1 } ,
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% |\WithArrowsOptions| is the command of the \pkg{witharrows} package to fix
+% options at the document level. It's possible to fix in |\WithArrowsOptions|
+% some options specific to |{WithArrows}| (in contrast with |{DispWithArrows}|)
+% or specific to |{DispWithArrows}| (in contrast with |{WithArrows}|). That's
+% why we have constructed a set of keys specific to |\WithArrowsOptions|.
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentCommand \WithArrowsOptions { m }
+%</LaTeX>
+%<*plain-TeX>
+\cs_set_protected:Npn \WithArrowsOptions #1
+%</plain-TeX>
+  { 
+    \str_clear_new:N \l_@@_previous_key_str
+    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 } 
+  }
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% \subsection{The command \textbackslash Arrow}
+%
+% In fact, the internal command is not named |\Arrow| but |\@@_Arrow|. Usually,
+% at the beginning of an environment |{WithArrows}|, |\Arrow| is set to be
+% equivalent to |\@@_Arrow|. However, the user can change the name with the
+% option |command-name| and the user command for |\@@_Arrow| will be different.
+% This mechanism can be useful when the user has already a command named
+% |\Arrow| he still wants to use in the environments |{WithArrows}| or
+% |{DispWithArrows}|. 
+%
+% \medskip
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentCommand \@@_Arrow { O { } m ! O { } }
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \@@_Arrow
+  {
+    \peek_meaning:NTF [ 
+      { \@@_Arrow_i } 
+      { \@@_Arrow_i [ ] }
+  }
+\cs_new_protected:Npn \@@_Arrow_i [ #1 ] #2 
+  {
+    \peek_meaning:NTF [
+      { \@@_Arrow_ii [ #1 ] { #2 } }
+      { \@@_Arrow_ii [ #1 ] { #2 } [ ] } 
+  }
+\cs_new_protected:Npn \@@_Arrow_ii [ #1 ] #2 [ #3 ]
+%</plain-TeX>
+  {
+%    \end{macrocode}
+%
+% The counter |\g_@@_arrow_int| counts the arrows in the environment. The
+% incrementation must be global (|gincr|) because the command |\Arrow| will be
+% used in the cell of a |\halign|. It's recalled that we manage a stack for this
+% counter.
+%    \begin{macrocode}
+    \int_gincr:N \g_@@_arrow_int
+%    \end{macrocode}
+% 
+% \medskip
+% We will construct a global property list to store the informations of the
+% considered arrow. The six fields of this property list are ``initial'',
+% ``final'', ``status'', ``options'', ``label'' and ``input-line''. In order to
+% compute the value of ``final'' (the destination row of the arrow), we have to
+% take into account a potential option |jump|. In order to compute the value of
+% the field ``status'', we have to take into account options as |ll|, |rl|,
+% |rr|, |lr|, etc. or |new-group|.
+% 
+% We will do that job with a first analyze of the options of the command
+% |\Arrow| with a dedicated set of keys called |WithArrows/Arrow/FirstPass|.
+% 
+%    \begin{macrocode}
+    \str_clear_new:N \l_@@_previous_key_str
+    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 } 
+%    \end{macrocode}
+%
+% \medskip
+% We construct now a global property list to store the informations of the
+% considered arrow with the six fields ``initial'', ``final'', ``status'',
+% ``options'', ``label'' and ``input-line''.
+%
+% \smallskip
+% \begin{enumerate}
+% \item First, the row from which the arrow starts:
+%    \begin{macrocode}
+    \prop_put:NnV \l_tmpa_prop { initial } \g_@@_line_int
+%    \end{macrocode}
+%
+% \item The row where the arrow ends (that's why it was necessary to analyze the
+% key |jump|):
+%    \begin{macrocode}
+    \int_set:Nn \l_tmpa_int { \g_@@_line_int + \l_@@_jump_int }
+    \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int
+%    \end{macrocode}
+%
+% \item The ``status'' of the arrow, with 3 possible values: empty,
+% |independent|, or |new-group|.
+%    \begin{macrocode} 
+    \prop_put:NnV \l_tmpa_prop { status } \l_@@_status_arrow_str
+%    \end{macrocode}
+% 
+% \item The options of the arrow (it's a token list):
+%    \begin{macrocode}
+    \prop_put:Nnn \l_tmpa_prop { options } { #1 , #3 }
+%    \end{macrocode}
+%
+% \item The label of the arrow (it's also a token list):
+%    \begin{macrocode}
+    \prop_put:Nnn \l_tmpa_prop { label } { #2 }
+%    \end{macrocode}
+% 
+% \item The number of the line where the command |\Arrow| is issued in the TeX
+% source (as of now, this is only useful for an error message).
+%    \begin{macrocode}
+    \prop_put:Nnx \l_tmpa_prop { input-line } \msg_line_number:
+%    \end{macrocode}
+% \end{enumerate}
+%
+% The property list has been created in a local variable for convenience. Now,
+% it will be stored in a global variable indicating both the
+% position-in-the-tree and the number of the arrow.
+% 
+%    \begin{macrocode}
+    \prop_gclear_new:c 
+      { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \g_@@_arrow_int _ prop }
+    \prop_gset_eq:cN 
+      { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \g_@@_arrow_int _ prop } 
+      \l_tmpa_prop
+  }       
+%    \end{macrocode}
+%
+% \medskip
+% The command |\Arrow| (or the corresponding command with a name given by the
+% user with the option |command-name|) will be available only in the last column of
+% the environments |{WithArrows}| and |{DispWithArrows}|. In the other columns,
+% the command will be linked to the following command |\@@_Arrow_first_columns:|
+% which will raise an error.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_Arrow_first_columns: 
+  { \@@_error:n { Arrow~not~in~last~column } \@@_Arrow }
+%    \end{macrocode}
+%                                
+%
+% \bigskip
+% \subsection{The environments \{WithArrows\} and \{DispWithArrows\}}
+%
+% \subsubsection{Code before the \textbackslash halign}
+%
+% The command |\@@_pre_halign:n| is a code common to the environments
+% |{WithArrows}| and |{DispWithArrows}|. The argument is the list of options
+% given to the environment.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_pre_halign:n #1
+%    \end{macrocode}
+%
+% First, the initialisation of |\l_@@_type_env_str| which is the name of the
+% encompassing environment. In fact, this token list is used only in the error
+% messages.
+%    \begin{macrocode}
+  { 
+%<*LaTeX>
+    \str_clear_new:N \l_@@_type_env_str
+    \str_set:NV \l_@@_type_env_str \@currenvir
+%</LaTeX>
+%    \end{macrocode}
+%
+% \bigskip
+% We deactivate the potential externalization of Tikz. The Tikz elements created
+% by \pkg{witharrows} can't be externalized since they are created in Tikz
+% pictures with |overlay| and |remember picture|.
+%    \begin{macrocode}
+    \cs_if_exist:NT \tikz at library@external at loaded
+      { \tikzset { external / export = false } }
+%    \end{macrocode}
+%
+% \bigskip
+% The token list |\l_@@_name_str| will contain the potential name of the
+% environment (given with the option |name|). This name will be used to create
+% aliases for the names of the nodes.
+%    \begin{macrocode}
+    \str_clear_new:N \l_@@_name_str
+%    \end{macrocode}
+%
+% \bigskip
+% The parameter |\l_@@_status_arrow_str| will be used to store the ``status'' of
+% an individual arrow. It will be used to fill the field ``status'' in the
+% property list describing an arrow.
+%    \begin{macrocode}
+    \str_clear_new:N \l_@@_status_arrow_str
+%    \end{macrocode}
+%
+% \bigskip
+% The dimension |\l_@@_x_dim| will be used to compute the $x$-value for some
+% vertical arrows when one of the options |i|, |group| and |groups| (values 5, 6
+% and 7 of |\l_@@_pos_arrow_int|) is used.
+%    \begin{macrocode}
+    \dim_zero_new:N \l_@@_x_dim
+%    \end{macrocode}
+%
+% \medskip
+% The variable |\l_@@_input_line_str| will be used only to store, for each
+% command |\Arrow| the line (in the TeX file) where the command is issued. This
+% information will be stored in the field ``input-line'' of the arrow. As of
+% now, this information is used only in the error message of a arrow impossible
+% to draw (because it arrives after the last row of the environment).
+%    \begin{macrocode}
+    \str_clear_new:N \l_@@_input_line_str
+%    \end{macrocode}
+%
+% 
+% The initialisation of the counters |\g_@@_arrow_int|, |\g_@@_line_int| and
+% |\g_@@_col_int|. However, we have to save their previous values with the
+% stacks created for this end. 
+%    \begin{macrocode}
+    \seq_gput_right:NV \g_@@_arrow_int_seq \g_@@_arrow_int
+    \int_gzero:N \g_@@_arrow_int 
+    \seq_gput_right:NV \g_@@_line_int_seq \g_@@_line_int
+    \int_gzero:N \g_@@_line_int 
+    \seq_gput_right:NV \g_@@_col_int_seq \g_@@_col_int
+    \int_gzero:N \g_@@_col_int 
+%    \end{macrocode}
+%
+% In the preamble of the |\halign|, there will be \emph{two} counters of the
+% columns. The aim of this programmation is to detect the utilisation of a
+% command |\omit| in a cell of the |\halign| (it should be forbidden).
+% For example, in the part of the preamble concerning the third column (if there
+% is a third column in the environment), we will have the following instructions :
+% \begin{Verbatim}
+%  \int_gincr:N \g_~@~@_col_int
+%  \int_gset:Nn \g_~@~@_static_col_int 3
+% \end{Verbatim}
+%  The counter |\g_@@_col_int| is incremented dynamically and the second is
+%  static. If the user has used a command |\omit|, the dynamic incrementation is
+%  not done in the cell and, at this end of the row, the difference between the
+%  counters may infer the presence of |\omit| at least once.
+%    \begin{macrocode}
+    \int_gzero_new:N \g_@@_static_col_int
+%    \end{macrocode}
+% 
+% \bigskip
+% We also have to update the position on the nesting tree.
+%    \begin{macrocode}
+    \seq_gput_right:Nn \g_@@_position_in_the_tree_seq 1
+%    \end{macrocode}
+%
+% The nesting tree is used to create a prefix which will be used in the names of
+% the Tikz nodes and in the names of the arrows (each arrow is a property list
+% of six fields). If we are in the second environment |{WithArrows}| nested in
+% the third environment |{WithArrows}| of the document, the prefix will be |3-2|
+% (although the position in the tree is $[3,2,1]$ since such a position always
+% ends with a~$1$). First, we do a copy of the position-in-the-tree and then we
+% pop the last element of this copy (in order to drop the last~$1$).
+%    \begin{macrocode}
+    \seq_set_eq:NN \l_tmpa_seq \g_@@_position_in_the_tree_seq
+    \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
+    \str_clear_new:N \l_@@_prefix_str
+    \str_set:Nx \l_@@_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - }
+%    \end{macrocode}
+% 
+% \bigskip
+% We define the command |\\| to be the command |\@@_cr:| (defined below). 
+%    \begin{macrocode}
+    \cs_set_eq:NN \\ \@@_cr:
+    \dim_zero:N \mathsurround 
+%    \end{macrocode}
+%
+% \bigskip
+% These counters will be used later as variables.
+%    \begin{macrocode}
+    \int_zero_new:N \l_@@_initial_int
+    \int_zero_new:N \l_@@_final_int
+    \int_zero_new:N \l_@@_arrow_int
+    \int_zero_new:N \l_@@_pos_of_arrow_int
+    \int_zero_new:N \l_@@_jump_int
+%    \end{macrocode}
+%
+% \medskip
+% The counter |\l_@@_jump_int| corresponds to the option |jump|. Now, we set the
+% default value for this option.
+%    \begin{macrocode}
+    \int_set:Nn \l_@@_jump_int \c_one_int
+%    \end{macrocode}
+%
+% \medskip
+% The string |\l_@@_format_str| corresponds to the option |format|. Now, we set
+% the default value for this option.
+%    \begin{macrocode}
+    \str_set:Nn \l_@@_format_str { rl }
+%    \end{macrocode}
+% 
+%
+%
+% \bigskip
+% In (the last column of) |{DispWithArrows}|, it's possible to put several
+% labels (for the same number of equation). That's why these labels will be
+% stored in a sequence |\l_@@_labels_seq|.
+%    \begin{macrocode}
+%<*LaTeX>
+    \seq_clear_new:N \l_@@_labels_seq
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+    \bool_set_false:N \l_@@_tag_next_line_bool
+%</LaTeX>
+%    \end{macrocode}
+% 
+% \bigskip
+% The value corresponding to the key |interline| is put to zero before the
+% treatment of the options of the environment.\footnote{It's recalled that, by
+% design, the option |interline| of an environment doesn't apply in the nested
+% environments.}
+%    \begin{macrocode}
+    \skip_zero:N \l_@@_interline_skip
+%    \end{macrocode}
+%
+% \bigskip
+% The value corresponding to the key |code-before| is put to nil before the
+% treatment of the options of the environment, because, of course, we don't want
+% the code executed at the beginning of all the nested
+% environments~|{WithArrows}|. Idem for |code-after|. 
+%    \begin{macrocode}
+    \tl_clear_new:N \l_@@_code_before_tl
+    \tl_clear_new:N \l_@@_code_after_tl
+%    \end{macrocode}
+%
+% \bigskip
+% We process the options given to the environment |{WithArrows}| or
+% |{DispWithArrows}|.
+%    \begin{macrocode}
+    \str_clear_new:N \l_@@_previous_key_str 
+    \bool_if:NT \l_@@_in_WithArrows_bool
+      { \keys_set:nn { WithArrows / WithArrows } { #1 } }
+    \bool_if:NT \l_@@_in_DispWithArrows_bool
+      { \keys_set:nn { WithArrows / DispWithArrows } { #1 } }
+%    \end{macrocode}
+%
+% \medskip
+% Now we link the command |\Arrow| (or the corresponding command with a name
+% given by the user with the option |command-name|: that's why the following line
+% must be after the loading of the options) to the command
+% |\@@_Arrow_first_columns:| which will raise an error. 
+%    \begin{macrocode}
+    \cs_set_eq:cN \l_@@_command_name_str \@@_Arrow_first_columns: 
+%    \end{macrocode}
+% It's only in the last column of the environment that it will be linked to the
+% command |\@@_Arrow:|.
+%
+% \medskip
+% The counter |\l_@@_nb_cols_int| is the number of columns in the
+% |\halign| (excepted the column for the labels of equations in
+% |{DispWithArrows}| and excepted eventuals other columns in |{WithArrows}| allowed
+% by the option |more-columns|).
+%    \begin{macrocode}
+    \int_set:Nn \l_@@_nb_cols_int { \str_count:N \l_@@_format_str } 
+%    \end{macrocode}
+%   
+% \medskip
+% Be careful! The following counter |\g_@@_col_int| will be used for two usages:
+% \begin{itemize}
+% \item during, the construction of the preamble of the |\halign|, it will be
+% used as counter for the number of the column under construction in the
+% preamble (since the preamble is constructed backwards, |\g_@@_col_int| will go
+% decreasing from |\l_@@_nb_cols_int| to $1$) ;
+% \item once the preamble constructed, the primitive |\halign| is executed, and,
+% in each row of the |\halign|, the counter |\g_@@_col_int| will be increased
+% from column to column.
+% \end{itemize}
+%
+%    \begin{macrocode}
+    \int_gset_eq:NN \g_@@_col_int \l_@@_nb_cols_int
+%    \end{macrocode}
+% 
+% \medskip
+% We convert the format in a sequence because we use it as a stack (with the top
+% of the stack at the end of the sequence) in the construction of the preamble.
+%    \begin{macrocode}
+    \seq_clear_new:N \l_@@_format_seq
+    \seq_set_split:NnV \l_@@_format_seq { } \l_@@_format_str
+%    \end{macrocode}
+%
+% \bigskip
+% If the option |footnote| or the option |footnotehyper| is used, then we
+% extract the footnotes with an environment |{savenotes}| (of the package
+% \pkg{footnote} or the package \pkg{footnotehyper}).
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:NT \g_@@_footnote_bool { \begin { savenotes } }
+%</LaTeX>
+%    \end{macrocode}
+%
+% \bigskip
+% We execute the code |\l_@@_code_before_tl| of the option |code-before| of the
+% environment after the eventual |\begin{savenotes}| and, symetrically, we will
+% execute the |\l_@@_code_after_tl| before the eventual |\end{savenotes}| (we
+% have a good reason for the last point: we want to extract the footnotes of the
+% arrows executed in the |code-after|).
+%    \begin{macrocode}
+    \l_@@_code_before_tl
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\spread at equation| is the command used by \pkg{amsmath} in the
+% beginning of an alignment to fix the interline. When used, it becomes no-op.
+% However, it's possible to use \pkg{witharrows} without \pkg{amsmath} since we
+% have redefined |\spread at equation| (if it is not defined yet).
+%    \begin{macrocode}
+    \spread at equation
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+%<*LaTeX>
+    \cs_set_eq:NN \notag \@@_notag:
+    \cs_set_eq:NN \nonumber \@@_nonumber:
+    \cs_set_eq:NN \tag \@@_tag
+    \cs_set_eq:NN \@@_old_label \label
+    \cs_set_eq:NN \label \@@_label:n
+    \cs_set_eq:NN \tagnextline \@@_tagnextline:
+%</LaTeX>
+  }
+%    \end{macrocode}
+% This is the end of |\@@_pre_halign:n|.
+%
+% \bigskip
+% \subsubsection{The construction of the preamble of the \textbackslash halign}
+%
+% The control sequence |\@@_construct_halign:| will ``start'' the |\halign| and
+% the preamble. In fact, it constructs all the preamble excepted the end of
+% the last column (more precisely: except the part concerning the construction
+% of the left node and the right node).
+%
+% The same function |\@@_construct_halign:| will be used both for the
+% environment |{WithArrows}| and the environment |{DispWithArrows}|.
+% 
+% Several important points must be noted concerning that construction of the
+% preamble.
+% \begin{itemize}
+% \item The construction of the preamble is done by reading backwards the
+% format |\l_@@_format_str| and adding the corresponding tokens in the input
+% stream of TeX. That means that the part of the preamble concerning the last
+% cell will be constructed first.
+% \item The function |\@@_construct_halign:| is recursive in order to treat
+% succesively all the letters of the preamble.
+% \item Each part of the preamble is created with a |\use:x| function. This
+% expansion of the preamble gives the ability of controlling which parts of the
+% code will be expanded during the construction of the preamble (other parts
+% will be expanded and executed only during the execution of the |\halign|).
+% \item The counter |\g_@@_col_int| is used during the loop of the construction
+% of the preamble but, it will also appears in the preamble (we could have
+% chosen two differents counters but this way saves a counter).
+% \end{itemize}
+% 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_construct_halign:
+  {
+    \seq_pop_right:NNTF \l_@@_format_seq \l_@@_type_col_str
+      {
+%    \end{macrocode}
+% Here is the |\use:x| which is fundamental: it will really construct the part
+% of the preamble corresponding to a column by expanding only some parts of the
+% following code.
+%    \begin{macrocode}
+        \use:x
+          {
+%    \end{macrocode}
+% Before the recursive call of |\@@_construct_halign:|, we decrease the integer
+% |\g_@@_col_bool|. But, during the construction of the column which is
+% constructed first (that is to say which is the last column of the |\halign|),
+% it is \emph{not} lowered because |\int_decr:N|, which is protected, won't be
+% expanded by the |\use:x|.
+%
+% We begin the construction of a generic column.
+%    \begin{macrocode}
+            \int_gdecr:N \g_@@_col_int
+            \@@_construct_halign:
+            \int_compare:nNnT \g_@@_col_int = \l_@@_nb_cols_int
+              { 
+%    \end{macrocode}
+% We redefine the command |\Arrow| (or the name given to the corresponding
+% command by the option |command-name|) in each cell of the last column.
+% The braces around |\l_@@_command_name_str| are mandatory because
+% |\l_@@_command_name_str| will be expanded by the |\use:x| and the command
+% |\cs_set_eq:cN| must still be efficient during the execution of the |\halign|.
+%    \begin{macrocode}
+                \cs_set_eq:cN { \l_@@_command_name_str } \@@_Arrow
+%<*LaTeX>
+                \bool_if:NT \l_@@_in_DispWithArrows_bool
+                  {
+%    \end{macrocode}
+% The command |\@@_test_if_to_tag:| (which is protected and, thus, will not be
+% expanded during the construction of the preamble) will test, at each row,
+% whether the current row must be tagged (and the tag will be put in the very
+% last column).
+%    \begin{macrocode}
+                    \@@_test_if_to_tag:
+%    \end{macrocode}
+% The command |\@@_set_qedhere:| will do a redefinition of |\qedhere| in each
+% cell of the last column.
+%    \begin{macrocode}
+                    \bool_if:NT \c_@@_amsthm_loaded_bool \@@_set_qedhere:
+                  }
+%</LaTeX>
+              }
+            \str_if_eq:VnT \l_@@_type_col_str { c } \hfil
+            \str_if_eq:VnT \l_@@_type_col_str { r } \hfill
+            \int_gincr:N \g_@@_col_int
+            \int_gset:Nn \g_@@_static_col_int { \int_use:N \g_@@_col_int }
+            \c_math_toggle_token
+              {
+                { }
+                \bool_if:NT \l_@@_displaystyle_bool \displaystyle
+                ####
+              }
+            \c_math_toggle_token
+            \int_compare:nNnTF \g_@@_col_int = \l_@@_nb_cols_int
+              { \@@_construct_nodes: }
+              {
+%    \end{macrocode}
+% The following glue (|\hfil|) will be added only if we are not in the last cell
+% because, in the last cell, a glue (=skip) is added between the nodes (in
+% |\@@_construct_nodes:|). 
+%    \begin{macrocode}
+                \str_if_eq:VnT \l_@@_type_col_str { l } \hfil
+                \str_if_eq:VnT \l_@@_type_col_str { c } \hfil
+                \bool_if:NT \l_@@_in_DispWithArrows_bool { \tabskip = \c_zero_skip }
+                &
+              }
+          } 
+      }
+%    \end{macrocode}
+% Now the tokens that will be inserted after the analyze of all the tokens of
+% the format: here is the token |\halign|.
+%    \begin{macrocode}
+      { 
+        \bool_if:NTF \l_@@_in_WithArrows_bool
+          {
+            \ialign
+            \bgroup
+          }
+          {
+            \halign to \l_@@_linewidth_dim
+            \bgroup
+            \bool_if:NT \l_@@_fleqn_bool
+              { \skip_horizontal:N \l_@@_mathindent_dim }
+          }
+        \int_gincr:N \g_@@_line_int 
+        \int_gzero:N \g_@@_col_int
+        \tl_if_eq:NNF \l_@@_left_brace_tl \c_novalue_tl
+          {
+            \skip_horizontal:n 
+              { \box_wd:N \l_@@_left_brace_box + \l_@@_delim_wd_dim } 
+          }
+        \strut
+      }
+  }
+%    \end{macrocode}
+% 
+%
+% \bigskip
+% The command |\@@_construct_nodes:| is only for the lisibility of the code
+% because, in fact, it is used only once. It constructs the ``left node'' and
+% the ``right node'' at the end of each row of the arrow.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_construct_nodes:
+  { 
+%    \end{macrocode}
+% We create the ``left node'' of the line (when using macros in Tikz node names,
+% the macros have to be fully expandable: here, |\int_use:N| is fully
+% expandable).
+%    \begin{macrocode}
+    \tikz [ remember~picture , overlay ] 
+      \node 
+        [ 
+          node~contents = { } ,
+          @@_node_style ,
+          name = wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - l ,
+          alias = 
+            { 
+              \str_if_empty:NF \l_@@_name_str
+                { \l_@@_name_str - \int_use:N \g_@@_line_int - l }
+            } 
+        ] 
+        ;
+    \hfil
+%    \end{macrocode}
+%
+% \bigskip
+% Now, after the |\hfil|, we create the ``right node'' and, if the option
+% |show-node-names| is raised, the name of the node is written in the document
+% (useful for debugging).
+%    \begin{macrocode}
+    \tikz [ remember~picture , overlay ] 
+      \node 
+        [ 
+          node~contents = { } ,
+          @@_node_style ,
+          name = wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - r ,
+          alias = 
+            {
+              \str_if_empty:NF \l_@@_name_str
+                { \l_@@_name_str - \int_use:N \g_@@_line_int - r }
+            } 
+        ] 
+        ;
+    \bool_if:NT \l_@@_show_node_names_bool
+      { 
+        \hbox_overlap_right:n 
+          { \small wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - r }
+      }
+  }
+%    \end{macrocode}
+%
+%
+%
+% \bigskip
+% \subsubsection{The environment \{WithArrows\}}
+%
+% 
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentEnvironment { WithArrows } { ! O { } }
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \WithArrows 
+  {
+    \group_begin:
+    \peek_meaning:NTF [
+     { \WithArrows_i }
+     { \WithArrows_i [  ] }
+  }
+\cs_new_protected:Npn \WithArrows_i [ #1 ]
+%</plain-TeX>
+  { 
+    \bool_set_true:N \l_@@_in_WithArrows_bool
+    \bool_set_false:N \l_@@_in_DispWithArrows_bool
+%<*plain-TeX>
+    \str_clear_new:N \l_@@_type_env_str
+    \str_set:Nn \l_@@_type_env_str { WithArrows }
+%</plain-TeX>
+    \@@_pre_halign:n { #1 } 
+    \if_mode_math: \else:
+      \@@_error:n { WithArrows~outside~math~mode }
+    \fi:
+%    \end{macrocode}
+%
+% \bigskip 
+% The environment begins with a |\vtop|, a |\vcenter| or a
+% |\vbox|\footnote{Notice that the use of |\vtop| seems color-safe here...}
+% depending of the value of |\l_@@_pos_env_int| (fixed by the options |t|, |c|
+% or |b|). The environment |{WithArrows}| must be used in math mode\footnote{An
+% error is raised if the environment is used outside math mode.} and therefore,
+% we can use |\vcenter|.
+%    \begin{macrocode}
+    \int_case:nn \l_@@_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+    \bgroup
+%    \end{macrocode}
+%
+% \bigskip
+% We begin the |\halign| and the preamble. During the construction of the
+% preamble, |\l_tmpa_int| will be incremented during each column constructed.
+%    \begin{macrocode}
+    \@@_construct_halign: 
+%    \end{macrocode}
+% 
+% 
+% \medskip
+% In fact, the construction of the preamble is not finished. We add a little more.
+% 
+% \medskip
+% An environmemnt |{WithArrows}| should have a number of columns equal to the
+% length of its format (by default, 2 since the default format is |rl|).
+% Nevertheless, if the user wants to use more columns (without arrows)
+% it's possible with the option |more-columns|.
+%    \begin{macrocode}
+    && 
+    \@@_error:n { Too~much~columns~in~WithArrows }
+    \c_math_toggle_token
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { ## } 
+    \c_math_toggle_token
+    \cr
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip 
+% We begin the second part of the environment |{WithArrows}|. We have two
+% |\egroup|\,: one for the |\halign| and one for the |\vtop| (or |\vcenter| or
+% |\vbox|).
+%    \begin{macrocode}
+%<*plain-TeX>
+\cs_new_protected:Npn \endWithArrows 
+%</plain-TeX>
+  {
+    \\
+    \egroup 
+    \egroup
+    \@@_post_halign:
+%    \end{macrocode}
+%
+% \bigskip
+% If the option |footnote| or the option |footnotehyper| is used, then we
+% extract the footnotes with an environment |{footnote}| (of the package
+% \pkg{footnote} or the package \pkg{footnotehyper}).
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:NT \g_@@_footnote_bool { \end { savenotes } }
+%</LaTeX>
+%<*plain-TeX>
+    \group_end:
+%</plain-TeX>
+  }
+%    \end{macrocode}
+% This is the end of the environment |{WithArrows}|.
+% 
+%
+% \bigskip
+% \subsubsection{After the construction of the \textbackslash halign}
+%
+% The command |\@@_post_halign:| is a code common to the second part of the
+% environment |{WithArrows}| and the environment |{DispWithArrows}|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_post_halign:
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\WithArrowsRightX| is not used by \pkg{witharrows}. It's only a
+% convenience given to the user.
+%    \begin{macrocode}
+  { 
+    \cs_set:Npn \WithArrowsRightX { \g_@@_right_x_dim }  
+%    \end{macrocode}
+%
+% \bigskip 
+% It there is really arrows in the environment, we draw the arrows.
+%    \begin{macrocode}
+    \int_compare:nNnT \g_@@_arrow_int > 0 \@@_scan_arrows:
+%    \end{macrocode}
+%
+% \bigskip
+% We will execute the code specified in the option |code-after|, after some
+% settings. 
+%    \begin{macrocode}
+    \group_begin:
+      \tikzset { every~picture / .style = @@_standard }
+%    \end{macrocode}
+% The command |\WithArrowsNbLines| is not used by \pkg{witharrows}. It's only a
+% convenience given to the user.  
+%    \begin{macrocode}
+      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g_@@_line_int }
+%    \end{macrocode}
+% The command |\MultiArrow| is available in |code-after|, and we have a special
+% version of |\Arrow|, called ``|\Arrow| in |code-after|'' in the
+% documentation.\footnote{As for now, |\MultiArrow| has no option, and that's
+% why its internal name is a name of \pkg{expl3} with the signature |:nn|
+% whereas |\Arrow| in |code-after| provides options and has the name of a
+% function defined with |\NewDocumentCommand|.}
+%    \begin{macrocode}
+      \cs_set_eq:NN \MultiArrow \@@_MultiArrow:nn
+      \cs_set_eq:cN \l_@@_command_name_str \@@_Arrow_code_after
+      \bool_set_true:N \l_@@_in_code_after_bool
+      \l_@@_code_after_tl
+    \group_end:
+%    \end{macrocode}
+%
+% \bigskip
+% We update the position-in-the-tree. First, we drop the last component and then
+% we increment the last element.
+%    \begin{macrocode}
+    \seq_gpop_right:NN \g_@@_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gpop_right:NN \g_@@_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gput_right:Nx \g_@@_position_in_the_tree_seq 
+      { \int_eval:n { \l_tmpa_tl + 1 } }
+%    \end{macrocode}
+%
+% \bigskip
+% We update the value of the counter |\g_@@_last_env_int|. This counter is used
+% only by the user function |\WithArrowsLastEnv|.
+%    \begin{macrocode}
+    \int_compare:nNnT { \seq_count:N \g_@@_position_in_the_tree_seq } = 1
+      { \int_gincr:N \g_@@_last_env_int }
+%    \end{macrocode}
+%
+% \bigskip
+% Finally, we restore the previous values of the counters |\g_@@_arrow_int|,
+% |\g_@@_line_int| and |\g_@@_col_int|. It is recalled that we manage three
+% stacks in order to be able to do such a restoration.
+%    \begin{macrocode}
+    \seq_gpop_right:NN \g_@@_arrow_int_seq \l_tmpa_tl 
+    \int_gset:Nn \g_@@_arrow_int \l_tmpa_tl 
+    \seq_gpop_right:NN \g_@@_line_int_seq \l_tmpa_tl
+    \int_gset:Nn \g_@@_line_int \l_tmpa_tl
+    \seq_gpop_right:NN \g_@@_col_int_seq \l_tmpa_tl
+    \int_gset:Nn \g_@@_col_int \l_tmpa_tl
+  }
+%    \end{macrocode}
+% That's the end of the command |\@@_post_halign:|.
+%
+% \bigskip
+% \subsubsection{The command of end of row}
+%
+% We give now the definition of |\@@_cr:| which is the definition of |\\| in an
+% environment |{WithArrows}|. The two \pkg{expl3} commands
+% |\group_align_safe_begin:| and |\group_align_safe_end:| are specifically
+% designed for this purpose: test the token that follows in an |\halign|
+% structure.
+%
+% First, we remove an eventual token |*| (just after the |\\|: there should not
+% be space between the two) since the commands |\\| and |\\*| are equivalent in
+% an environment |{WithArrows}| (an environment |{WithArrows}|, like an
+% environment |{aligned}| of \pkg{amsmath}, is always unbreakable). 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cr:
+  { 
+    \scan_stop:
+%    \end{macrocode}
+% We try to detect some |\omit| (as of now, an |\omit| in the last column is
+% not detected).
+%    \begin{macrocode}
+    \int_compare:nNnF \g_@@_col_int = \g_@@_static_col_int
+      { \@@_error:n { omit~probably~used } }
+    \prg_replicate:nn { \l_@@_nb_cols_int - \g_@@_static_col_int } { & { } } 
+    \group_align_safe_begin:
+    \peek_meaning_remove:NTF * \@@_cr_i: \@@_cr_i:
+  }
+%    \end{macrocode}
+%
+% \medskip
+% Then, we peek the next token to see if it's a |[|. In this case, the command
+% |\\| has an optional argument which is the vertical skip (=glue) to put.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cr_i:
+  { \peek_meaning:NTF [ \@@_cr_ii: { \@@_cr_ii: [ \c_zero_dim ] } }
+%    \end{macrocode}
+% 
+% \bigskip
+% Now, we test if the next token is the token |\end|. Indeed, we want to test if
+% the following tokens are |\end{WithArrows}| (or |\end{DispWithArrows}|, etc).
+% In this case, we raise an error because the user must not put "\\" at the end
+% of its alignment.
+%    \begin{macrocode}
+%<*LaTeX>
+\cs_new_protected:Npn \@@_cr_ii: [ #1 ]
+  { 
+    \peek_meaning_ignore_spaces:NTF \end 
+      { 
+        \@@_cr_iii:n { #1 } 
+%    \end{macrocode}
+% The analyse of the argument of the token |\end| must be after the
+% |\group_align_safe_end:| which is the beginning of |\@@_cr_iii:n|.
+%    \begin{macrocode}
+        \@@_analyze_end:Nn 
+      }
+      { \@@_cr_iii:n { #1 } }
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_cr_iii:n #1 
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \@@_cr_ii: [ #1 ] 
+%</plain-TeX>
+  {
+    \group_align_safe_end:
+%    \end{macrocode}
+% For the environment |{DispWithArrows}|, the behaviour of |\\| is different
+% because we add the last column which is the column for the tag (number of the
+% equation). Even if there is no tag, this column is used for the
+% |v|-nodes.\footnote{The |v|-nodes are used to compute the abscissa of the
+% right margin, used by the option |wrap-lines|.}
+%    \begin{macrocode}
+    \bool_if:NT \l_@@_in_DispWithArrows_bool
+%    \end{macrocode}
+% At this stage, we know that we have a tag to put if (and only if) the value of
+% |\l_@@_tags_clist| is the comma list |all| (only one element). Maybe,
+% previously, the value of |\l_@@_tags_clist| was, for example, |1,last| (which
+% means that only the first line and the last line must be tagged). However, in
+% this case, the comparison with the number of line has be done before and, now,
+% if we are in a line to tag, the value of |\l_@@_tags_clist| is |all|.
+%    \begin{macrocode}
+      { 
+%<*LaTeX>
+        \clist_if_in:NnTF \l_@@_tags_clist { all }
+          {
+%    \end{macrocode}
+% Here, we can't use |\refstepcounter{equation}| because if the user has issued
+% a |\tag| command, we have to use |\l_@@_tag_tl| and not |\theequation|. That's
+% why we have to do the job done by |\refstepcounter| manually.
+% 
+% First, the incrementation of the counter (potentially).
+%    \begin{macrocode}
+            \tl_if_empty:NT \l_@@_tag_tl { \int_gincr:N \c at equation }
+%    \end{macrocode}
+% 
+% We store in |\g_tmpa_tl| the tag we will have to compose at the end of the
+% line. We use a global variable because we will use it in the \emph{next} cell
+% (after the |&|).
+%    \begin{macrocode}
+            \cs_gset:Npx \g_tmpa_tl
+              { \tl_if_empty:NTF \l_@@_tag_tl \theequation \l_@@_tag_tl }
+%    \end{macrocode}
+% It's possible to put several labels for the same line (it's not possible in
+% the environments of \pkg{amsmath}). That's why the differents labels of a same
+% line are stored in a sequence |\l_@@_labels_seq|.
+%    \begin{macrocode}
+            \seq_if_empty:NF \l_@@_labels_seq
+              {
+%    \end{macrocode}
+% Now, we do the job done by |\refstepcounter| and by the redefinitions of
+% |\refstepcounter| done by some packages (the incrementation of the counter has
+% been done yet).
+%
+% First an action which is in the definition of |\refstepcounter|. The command
+% |\p at equation| is redefined by some extensions like \pkg{fncylab}.
+%    \begin{macrocode}
+                \cs_set:Npx \@currentlabel { \p at equation \g_tmpa_tl }
+%    \end{macrocode}
+% Then, an action done by \pkg{hyperref} in its redefinition of
+% |\refstepcounter|.
+%    \begin{macrocode}
+                \bool_if:NT \c_@@_hyperref_loaded_bool
+                  { 
+                    \str_set:Nn \This at name { equation }
+                    \hyper at refstepcounter { equation }
+                  }
+%    \end{macrocode}
+% Then, an action done by \pkg{cleveref} in its redefinition of
+% |\refstepcounter|. The package \pkg{cleveref} creates in the |aux| file a
+% command |\cref at currentlabel| similar to |\@currentlabel| but with more
+% informations.
+%    \begin{macrocode}        
+                \bool_if:NT \c_@@_cleveref_loaded_bool
+                  {
+                    \cref at constructprefix { equation } \cref at result
+                    \protected at edef \cref at currentlabel
+                      { 
+                        [ 
+                          \cs_if_exist:NTF \cref at equation@alias 
+                            \cref at equation@alias 
+                            { equation } 
+                        ] 
+                        [ \arabic { equation } ] [ \cref at result ]
+                        \p at equation \g_tmpa_tl
+                      }
+                  }
+%    \end{macrocode}
+% Now, we can issue the command |\label| (some packages may have redefined
+% |\label|, for example \pkg{typedref}) for each item in the sequence of the
+% labels (it's possible with \pkg{witharrows} to put several labels to the same
+% line and that's why the labels are in the sequence |\l_@@_labels_seq|).
+%    \begin{macrocode}
+                \seq_map_function:NN \l_@@_labels_seq \@@_old_label
+              }
+%    \end{macrocode}
+% We save the booleans |\l_@@_tag_star_bool| and |\l_@@_qedhere_bool| because
+% they will be used in the \emph{next} cell (after the |&|). We recall that the
+% cells of a |\halign| are TeX groups.
+%    \begin{macrocode}
+            \@@_save:N \l_@@_tag_star_bool
+            \@@_save:N \l_@@_qedhere_bool
+            \bool_if:NT \l_@@_tag_next_line_bool 
+              { 
+                \openup -\jot 
+                \bool_set_false:N \l_@@_tag_next_line_bool 
+                \notag \\ & 
+              }
+            & 
+            \@@_restore:N \l_@@_tag_star_bool
+            \@@_restore:N \l_@@_qedhere_bool
+            \bool_if:NT \l_@@_qedhere_bool 
+               { \hbox_overlap_left:n \@@_qedhere_i: }
+            \cs_set_eq:NN \theequation \g_tmpa_tl
+            \bool_if:NT \l_@@_tag_star_bool 
+              { \cs_set_eq:NN \tagform@ \prg_do_nothing: }
+%    \end{macrocode}
+% We use |\@eqnnum| (we recall that there are two definitions of |\@eqnnum|, a
+% standard definition and another, loaded if the class option |leqno| is used).
+% However, of course, the position of the |v|-node is not the same whether the
+% option |leqno| is used or not. That's here that we use the flag
+% |\c_@@_leqno_bool|.
+%    \begin{macrocode}
+            \hbox_overlap_left:n 
+              { 
+                \bool_if:NF \c_@@_leqno_bool
+                  { 
+                    \tikz [ @@_standard ] 
+                      \coordinate ( \int_use:N \g_@@_line_int - v ) ; 
+                  }
+                \quad
+                \@eqnnum 
+              }
+            \bool_if:NT \c_@@_leqno_bool
+              { 
+                \tikz [ @@_standard ] 
+                  \coordinate ( \int_use:N \g_@@_line_int - v ) ; 
+              } 
+          }
+          { 
+            \@@_save:N \l_@@_qedhere_bool 
+%</LaTeX>
+            & 
+%<*LaTeX>
+            \@@_restore:N \l_@@_qedhere_bool
+            \bool_if:NT \l_@@_qedhere_bool 
+               { \hbox_overlap_left:n \@@_qedhere_i: }
+%</LaTeX>
+            \tikz [ @@_standard ] 
+               \coordinate ( \int_use:N \g_@@_line_int - v ) ; 
+%<*LaTeX>
+          }
+%</LaTeX>
+      }
+    \dim_compare:nNnT { #1 } < \c_zero_dim
+       { \@@_error:n { option~of~cr~negative } }
+
+    \cr 
+    \noalign 
+      { 
+        \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim }
+        \skip_vertical:n { \l_tmpa_dim + \l_@@_interline_skip }
+        \scan_stop: 
+      }  
+  }
+%    \end{macrocode}
+% According to the documentation of \pkg{expl3}, the previous addition in 
+% ``|#1 + \l_@@_interline_skip|'' is really an addition of skips (=glues).
+%
+%
+% The following command will be used when, after a |\\| (and its optional
+% arguments) there is a |\end|. You want to known if this is the end of the
+% environment |{WithArrows}| (or |{DispWithArrows}|, etc.) because, in this
+% case, we will explain that the environment must not be ended by |\\|. If it is
+% not the case, that means it's a classical situation of LaTeX environments not
+% correctly imbricated and there will be a LaTeX error.
+%    \begin{macrocode}
+%<*LaTeX>
+\cs_new_protected:Npn \@@_analyze_end:Nn #1 #2
+  {
+    \exp_args:NV \str_if_eq:nnT \l_@@_type_env_str { #2 }
+      { \@@_warning:n { newline~at~the~end~of~env } }
+%    \end{macrocode}
+% We reput in the stream the |\end{...}| we have extracted.
+%    \begin{macrocode}
+    \end { #2 }
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+% \bigskip
+% \subsubsection{The environment \{DispWithArrows\}}
+%
+% For the environment |{DispWithArrows}|, the general form of the construction
+% is of the type:
+%
+% |\[\vtop{\halign to \displaywidth {...}}\]|
+% 
+% The purpose of the |\vtop| is to have an environment unbreakable.
+%
+% However, if we are juste after an item of a LaTeX list or at the beginning of
+% a |{minipage}|, the construction is slightly different:
+%
+% |\[\vtop{\halign to \linewidth {...}}\]|
+% 
+% 
+% \bigskip
+% The boolean |\l_@@_in_label_or_minipage_bool| will be raised if we are just after a |\item|
+% of a list of LaTeX or at the beginning of a |{minipage}|.
+%    \begin{macrocode}
+%<*LaTeX>
+\bool_new:N \l_@@_in_label_or_minipage_bool
+%</LaTeX>
+%    \end{macrocode}
+%
+% 
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentEnvironment { DispWithArrows } { ! d < > ! O { } }
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \DispWithArrows 
+  {
+    \group_begin:
+    \peek_meaning:NTF <
+      { \DispWithArrows_i }
+      { \DispWithArrows_i < \c_novalue_tl > }
+  }
+\cs_new_protected:Npn \DispWithArrows_i < #1 > 
+  {
+    \peek_meaning:NTF [
+      { \DispWithArrows_ii < #1 > }
+      { \DispWithArrows_ii < #1 > [ ] }
+  }
+\cs_new_protected:Npn \DispWithArrows_ii < #1 > [ #2 ]
+%</plain-TeX>
+  { 
+    \bool_set_true:N \l_@@_in_DispWithArrows_bool
+%<*plain-TeX>
+    \str_clear_new:N \l_@@_type_env_str
+    \str_set:Nn \l_@@_type_env_str { DispWithArrows }
+%</plain-TeX>
+%    \end{macrocode}
+% If \pkg{mathtools} has been loaded with the option |showonlyrefs|, we disable
+% the code of \pkg{mathtools} for the option |showonlyrefs| with the command
+% |\MT_showonlyrefs_false:| (it will be reactivated at the end of the
+% environment). 
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:nT \c_@@_mathtools_loaded_bool 
+      { 
+        \MH_if_boolean:nT { show_only_refs } 
+          {
+            \MT_showonlyrefs_false:
+%    \end{macrocode}
+% However, we have to re-raise the flag |{show_only_refs}| of \pkg{mhsetup}
+% because it has been switched off by |\MT_showonlyrefs_false:| and we will use
+% it in the code of the new version of |\label|.
+%    \begin{macrocode}
+            \MH_set_boolean_T:n { show_only_refs } 
+          }
+      }
+%    \end{macrocode}
+%
+% An action done by \pkg{typedref} in its redefinition of |\refstepcounter|. The
+% command |\sr at name| is a prefix added to the name of the label by the
+% redefinition of |\label| done by \pkg{typedref}.
+%    \begin{macrocode}
+    \bool_if:NT \c_@@_typedref_loaded_bool { \str_set:Nn \sr at name { equation } }
+%    \end{macrocode}
+%
+% The command |\intertext@| is a command of \pkg{amsmath} which loads the
+% definition of |\intertext|.
+%    \begin{macrocode}
+    \bool_if:NT \c_@@_amsmath_loaded_bool \intertext@
+%</LaTeX>
+    \exp_args:No \tl_if_novalue:nF { #1 } { \tl_set:Nn \l_@@_left_brace_tl { #1 } }
+    \@@_pre_halign:n { #2 }
+%    \end{macrocode}
+%
+% If |subequations| is used, we encapsulate the environment in an
+% environment |{subequations}| of \pkg{amsmath}.
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:NT \l_@@_subequations_bool { \begin { subequations } }
+%</LaTeX>
+%    \end{macrocode}
+% Since the version 1.16 of \pkg{witharrows}, no space is added between an
+% |\item| of a LaTeX list and an environment |{DispWithArrows}| except with the
+% option |standard-behaviour-with-items| stored in the boolean
+% |\l_@@_sbwi_bool|. We have to know if we are just after an |\item| and this
+% information will be stored in |\l_@@_in_label_or_minipage_bool|.
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:NF \l_@@_sbwi_bool
+      {  
+        \if at inlabel
+        \bool_set_true:N \l_@@_in_label_or_minipage_bool
+        \fi
+        \if at minipage
+        \bool_set_true:N \l_@@_in_label_or_minipage_bool
+        \fi
+      }
+%</LaTeX>
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+    \tl_if_eq:NNF \l_@@_left_brace_tl \c_novalue_tl
+      {
+%    \end{macrocode}
+% We compute the value of the width of the left delimiter.
+%    \begin{macrocode}
+        \hbox_set:Nn \l_tmpa_box 
+          { 
+%    \end{macrocode}
+% Even if the default value of |\nulldelimiterspace| is 1.2~pt, we take it into account.
+%    \begin{macrocode}
+            \group_begin:
+            \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+            \c_math_toggle_token
+            \left \l_@@_replace_left_brace_by_tl \vcenter to 1 cm { } \right.
+            \c_math_toggle_token
+            \group_end:
+          }
+        \dim_zero_new:N \l_@@_delim_wd_dim
+        \dim_set:Nn \l_@@_delim_wd_dim { \box_wd:N \l_tmpa_box }
+        \box_clear_new:N \l_@@_left_brace_box
+        \hbox_set:Nn \l_@@_left_brace_box 
+          { 
+            \group_begin:
+              \cs_set_eq:NN \label \@@_old_label
+              \c_math_toggle_token
+              \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+              \l_@@_left_brace_tl
+              { } 
+              \c_math_toggle_token
+            \group_end:
+          }  
+      }
+%    \end{macrocode}
+% 
+% \bigskip
+% The token list |\l_@@_tag_tl| will contain the argument of the command |\tag|.
+%    \begin{macrocode}
+%<*LaTeX>
+    \tl_clear_new:N \l_@@_tag_tl
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+    \bool_set_false:N \l_@@_qedhere_bool
+%    \end{macrocode}
+%
+% \bigskip
+% The boolean |\l_@@_tag_star_bool| will be raised if the user uses the command
+% |\tag| with a star.
+%    \begin{macrocode}
+    \bool_set_false:N \l_@@_tag_star_bool
+%</LaTeX>
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+    \if_mode_math:
+      \@@_fatal:n { DispWithArrows~in~math~mode }
+    \fi:
+%    \end{macrocode}
+%
+% \bigskip
+% The construction is not exactly the same whether we are just after an |\item|
+% of a LaTeX list or not. We know if we are after an |\item| thanks to the
+% boolean |\l_@@_in_label_or_minipage_bool|.
+%    \begin{macrocode}
+%<*plain-TeX>
+     \dim_zero_new:N \linewidth
+     \dim_set_eq:NN \linewidth \displaywidth
+%</plain-TeX>
+%<*LaTeX>
+    \bool_if:NTF \l_@@_in_label_or_minipage_bool
+      { \c_math_toggle_token } 
+      {  
+%</LaTeX>
+%    \end{macrocode}
+% We don't use |\[| of LaTeX because some extensions, like \pkg{autonum}, do a
+% redefinition of |\[|. However, we put the following lines which are in the
+% definition of |\[| even though they are in case of misuse.
+%    \begin{macrocode}
+        \if_mode_vertical:
+        \nointerlineskip
+        \hbox_to_wd:nn { .6 \linewidth } { }
+        \fi:
+        \c_math_toggle_token \c_math_toggle_token
+%<*LaTeX>
+      }
+%</LaTeX>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+    \dim_zero_new:N \l_@@_linewidth_dim
+%<*LaTeX>
+    \bool_if:NTF \l_@@_in_label_or_minipage_bool 
+       { \dim_set_eq:NN \l_@@_linewidth_dim \linewidth }
+       { \dim_set_eq:NN \l_@@_linewidth_dim \displaywidth }
+%</LaTeX>
+%<*plain-TeX>
+    \dim_set_eq:NN \l_@@_linewidth_dim \displaywidth
+%</plain-TeX>
+%    \end{macrocode}
+%
+% 
+%    \begin{macrocode}
+    \box_clear_new:N \l_@@_halign_box
+    \setbox \l_@@_halign_box \vtop \bgroup
+    \tabskip =
+      \bool_if:NTF \l_@@_fleqn_bool
+        \c_zero_skip 
+        { 0 pt plus 1000 pt minus 1000 pt }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+    \@@_construct_halign:
+    \tabskip = 0 pt plus 1000 pt minus 1000 pt
+    & 
+%    \end{macrocode}
+%
+% If the user tries to use more columns than the length of the format, we have to
+% raise an error. However, the error won't be in the next column which is the
+% columns for the labels of the equations. The error will be after... and it
+% must be after. That means that we must not have an error in the next column
+% simply because we are not in math mode. That's why this column, even if it is
+% for the labels, is in math mode.
+%    \begin{macrocode}
+    $ ## $
+    \tabskip = \c_zero_skip
+    && 
+    \@@_fatal:n { Too~much~columns~in~DispWithArrows } 
+    \bool_if:nT \c_false_bool { ## }
+    \cr
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% We begin the second part of the environment |{DispWithArrows}|.
+%    \begin{macrocode}
+%<*plain-TeX>
+\cs_new_protected:Npn \endDispWithArrows
+%</plain-TeX>
+  { 
+%<*LaTeX>
+    \clist_if_in:NnT \l_@@_tags_clist { last }
+      { \clist_set:Nn \l_@@_tags_clist { all } }
+%</LaTeX>
+    \\
+%    \end{macrocode}
+% The following |\egroup| is for the |\halign|.
+%    \begin{macrocode}
+    \egroup 
+    \unskip \unpenalty \unskip \unpenalty 
+    \box_set_to_last:N \l_tmpa_box
+    \nointerlineskip 
+    \box_use:N \l_tmpa_box 
+    \dim_gzero_new:N \g_@@_alignment_dim
+    \dim_gset:Nn \g_@@_alignment_dim { \box_wd:N \l_tmpa_box }
+    \box_clear_new:N \l_@@_new_box
+    \hbox_set:Nn \l_@@_new_box { \hbox_unpack_clear:N \l_tmpa_box } 
+    \dim_compare:nNnT 
+      { \box_wd:N \l_@@_new_box } < \g_@@_alignment_dim
+      { \dim_gset:Nn \g_@@_alignment_dim { \box_wd:N \l_@@_new_box } }
+%    \end{macrocode}
+% The |\egroup| is for the box |\l_@@_halign_box|.
+%    \begin{macrocode}
+    \egroup
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+     \tl_if_eq:NNTF \l_@@_left_brace_tl \c_novalue_tl
+       { \box_use_drop:N \l_@@_halign_box }
+       { 
+         \hbox_to_wd:nn \l_@@_linewidth_dim
+           {
+            \bool_if:NTF \l_@@_fleqn_bool
+              { \skip_horizontal:n \l_@@_mathindent_dim }
+              \hfil
+            \hbox_to_wd:nn \g_@@_alignment_dim 
+              { 
+                \box_use_drop:N \l_@@_left_brace_box
+                \dim_set:Nn \l_tmpa_dim 
+                  { 
+                    \box_ht:N \l_@@_halign_box
+                    + \box_dp:N \l_@@_halign_box
+                  }
+                \group_begin:
+                \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+                \c_math_toggle_token
+                  \left \l_@@_replace_left_brace_by_tl 
+                    \vcenter to \l_tmpa_dim { \vfil } 
+                  \right. 
+                \c_math_toggle_token
+                \group_end:
+                \hfil
+              }
+            \hfil
+           } 
+         \skip_horizontal:n { - \l_@@_linewidth_dim } 
+         \vcenter { \box_use_drop:N \l_@@_halign_box }
+       }
+%    \end{macrocode}
+% 
+% We compute the dimension |\g_@@_right_x_dim|. As a first approximation,
+% |\g_@@_right_x_dim| is the $x$-value of the right side of the current
+% composition box. In fact, we must take into account the potential labels of
+% the equations. That's why we compute |\g_@@_right_x_dim| with the |v|-nodes of
+% each row specifically built in this goal. |\g_@@_right_x_dim| is the minimal
+% value of the $x$-value of these nodes.
+%    \begin{macrocode}
+    \dim_gzero_new:N \g_@@_right_x_dim 
+    \dim_gset_eq:NN \g_@@_right_x_dim \c_max_dim
+%<*LaTeX>
+    \begin { tikzpicture } [ @@_standard ]
+%</LaTeX>
+%<*plain-TeX>
+    \tikzpicture [ @@_standard ]
+%</plain-TeX>
+      \int_step_variable:nNn \g_@@_line_int \l_tmpa_int
+        { 
+          \cs_if_free:cTF 
+            { pgf at sh@ns at wa - \l_@@_prefix_str - \l_tmpa_int - v }
+            { \@@_fatal:n { Inexistent~v-node } }
+            { 
+              \tikz at parse@node\pgfutil at firstofone ( \l_tmpa_int - v )
+              \dim_set:Nn \l_tmpa_dim \pgf at x
+              \dim_compare:nNnT \l_tmpa_dim < \g_@@_right_x_dim
+                { \dim_gset:Nn \g_@@_right_x_dim \l_tmpa_dim } 
+            } 
+        }
+%<*LaTeX>
+    \end { tikzpicture } 
+%</LaTeX>
+%<*plain-TeX>
+    \endtikzpicture
+%</plain-TeX>
+%    \end{macrocode}
+% 
+%
+% \bigskip
+% The code in |\@@_post_halign:| is common to |{WithArrows}| and
+% |{DispWithArrows}|.
+%    \begin{macrocode}
+    \@@_post_halign:
+%    \end{macrocode}
+% If \pkg{mathtools} has been loaded with the option |showonlyrefs|, we
+% reactivate the code of \pkg{mathtools} for the option |showonlyrefs| with the
+% command |\MT_showonlyrefs_true:| (it has been deactivated in the beginning of
+% the environment).
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:nT \c_@@_mathtools_loaded_bool
+      { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: }
+    \bool_if:NTF \l_@@_in_label_or_minipage_bool
+      { 
+        \c_math_toggle_token
+        \skip_vertical:N \belowdisplayskip
+      }
+      { \c_math_toggle_token \c_math_toggle_token }
+%</LaTeX>
+%<*plain-TeX>
+      \c_math_toggle_token \c_math_toggle_token
+%</plain-TeX>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*LaTeX>
+    \bool_if:NT \l_@@_subequations_bool { \end { subequations } }
+%    \end{macrocode}
+%
+% \bigskip 
+% If the option |footnote| or the option |footnotehyper| is used, then we
+% extract the footnotes with an environment |{savenotes}| (of the package
+% \pkg{footnote} or the package \pkg{footnotehyper}).
+%    \begin{macrocode}
+    \bool_if:NT \g_@@_footnote_bool { \end { savenotes } }
+%</LaTeX>
+%<*plain-TeX>
+    \group_end:
+%</plain-TeX>
+%<*LaTeX>
+    \ignorespacesafterend
+%</LaTeX>
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% With the environment |{DispWithArrows*}|, the equations are not numbered. We
+% don't put |\begin{DispWithArrows}| and |\end{DispWithArrows}| because there is
+% a |\@currenvir| in some error messages.
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentEnvironment { DispWithArrows* } { }
+  { 
+    \WithArrowsOptions { notag }
+    \DispWithArrows
+  }
+  \endDispWithArrows
+%</LaTeX>
+%    \end{macrocode}
+%
+% 
+% \bigskip
+% \subsection{The commands \textbackslash tag, \textbackslash notag,
+% \textbackslash label, \textbackslash tagnextline and \textbackslash qedhere for
+% \{DispWithArrows\}} 
+%
+% Some commands are allowed only in the last column of the environment
+% |{DispWithArrows}|. We write a command |\@@_if_in_last_col_of_disp:Nn| to
+% execute this command only if we are in the last column. If we are in 
+% another column, an error is raised. The first argument of
+% |\@@_if_in_last_col_of_disp:Nn| is the name of the command used in the error
+% message and the second is the code to execute.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_if_in_last_col_of_disp:Nn #1 #2
+  { 
+    \bool_if:NTF \l_@@_in_WithArrows_bool
+      { \@@_error:nn { Not~allowed~in~WithArrows } { #1 } }
+      { 
+        \int_compare:nNnTF \g_@@_col_int < \l_@@_nb_cols_int
+          { \@@_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+          { #2 }
+      }
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The command |\@@_notag:| will be linked to the command |\notag| and also to
+% in the environments |{WithArrows}| and |{DispWithArrows}|. 
+%    \begin{macrocode}
+%<*LaTeX>
+\cs_new_protected:Npn \@@_notag: 
+  { \@@_if_in_last_col_of_disp:Nn \notag { \clist_clear:N \l_@@_tags_clist } }
+%    \end{macrocode}
+% 
+% \bigskip
+% The command |\@@_nonumber:| will be linked to the command |\nonumber| and also to
+% in the environments |{WithArrows}| and |{DispWithArrows}|. 
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_nonumber: 
+  { \@@_if_in_last_col_of_disp:Nn \nonumber { \clist_clear:N \l_@@_tags_clist } }
+%    \end{macrocode}
+%
+% \bigskip 
+% The command |\@@_tag| will be linked to |\tag| in |{WithArrows}| and
+% |{DispWithArrows}|. We do the definition with |\NewDocumentCommand| because this
+% command has a starred version.
+%    \begin{macrocode}
+\NewDocumentCommand \@@_tag { s m } 
+  { 
+    \@@_if_in_last_col_of_disp:Nn \tag
+      { 
+        \tl_if_empty:NF \l_@@_tag_tl
+          { \@@_error:nn  { Multiple~tags } { #2 } }
+        \clist_set:Nn \l_@@_tags_clist { all }
+        \bool_if:nT \c_@@_mathtools_loaded_bool
+          {
+            \MH_if_boolean:nT { show_only_refs }
+              {
+                \MH_if_boolean:nF { show_manual_tags }
+                  { \clist_clear:N \l_@@_tags_clist }
+              }
+          }
+        \tl_set:Nn \l_@@_tag_tl { #2 }
+        \bool_set:Nn \l_@@_tag_star_bool { #1 }
+%    \end{macrocode}
+% The starred version |\tag*| can't be used if \pkg{amsmath} has not been loaded
+% because this version does the job by deactivating the command |\tagform@|
+% inserted by \pkg{amsmath} in the (two versions of the) command
+% |\@eqnnum|.\footnote{There are two versions of |@eqnnum|, a standard version
+% and a version for the option |leqno|.}
+%    \begin{macrocode}
+        \bool_if:nT { #1 && ! \bool_if_p:N \c_@@_amsmath_loaded_bool }
+          { \@@_error:n { tag*~without~amsmath } } 
+      }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\@@_label:n| will be linked to |\label| in the environments
+% |{WithArrows}| and |{DispWithArrows}|. In these environments, it's possible to
+% put several labels for the same line (it's not possible in the environments of
+% \pkg{amsmath}). That's why we store the differents labels of a same line in a
+% sequence |\l_@@_labels_seq|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_label:n #1
+  {  
+    \@@_if_in_last_col_of_disp:Nn \label
+      { 
+        \seq_if_empty:NF \l_@@_labels_seq 
+          { 
+            \bool_if:NTF \c_@@_cleveref_loaded_bool
+              { \@@_error:n { Multiple~labels~with~cleveref } }
+              { \@@_error:n { Multiple~labels } } 
+          }
+        \seq_put_right:Nn \l_@@_labels_seq { #1 }
+        \bool_if:nT \c_@@_mathtools_loaded_bool
+          {
+            \MH_if_boolean:nT { show_only_refs } 
+              { 
+                \cs_if_exist:cTF { MT_r_#1 }
+                  { \clist_set:Nn \l_@@_tags_clist { all } }
+                  { \clist_clear:N \l_@@_tags_clist } 
+              }
+          }
+        \bool_if:nT \c_@@_autonum_loaded_bool
+          { 
+            \cs_if_exist:cTF { autonum@#1Referenced }
+              { \clist_set:Nn \l_@@_tags_clist { all } }
+              { \clist_clear:N \l_@@_tags_clist } 
+          } 
+      } 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The command |\@@_tagnextline:| will be linked to |\tagnextline| in 
+% |{DispWithArrows}|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_tagnextline:
+  { 
+    \@@_if_in_last_col_of_disp:Nn \tagnextline
+      { \bool_set_true:N \l_@@_tag_next_line_bool }
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% The environments |{DispWithArrows}| and |{DispWithArrows*}| are compliant with
+% the command |\qedhere| of \pkg{amsthm}. However, this compatibility requires a
+% special version of |\qedhere|.
+% 
+% This special version is called |\@@_qedhere:| and will be linked with
+% |\qedhere| in the last column of the environment |{DispWithArrows}| (only if
+% the package \pkg{amsthm} has been loaded). |\@@_qedhere:| raises the boolean
+% |\l_@@_qedhere_bool|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_qedhere: { \bool_set_true:N \l_@@_qedhere_bool }
+\cs_new_protected:Npn \@@_set_qedhere: { \cs_set_eq:NN \qedhere \@@_qedhere: }  
+%    \end{macrocode}
+%
+% In the last column of the |\halign| of |{DispWithArrows}| (column of the
+% labels, that is to say the numbers of the equations), a command
+% |\@@_qedhere_i:| will be issued if the flag |\l_@@_qedhere_bool| has been
+% raised. The code of this command is an adaptation of the code of |\qedhere| in
+% \pkg{amsthm}.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_qedhere_i: 
+  {
+    \group_begin:
+      \cs_set_eq:NN \qed \qedsymbol
+%    \end{macrocode}
+% The line |\cs_set_eq:NN \qed at elt \setQED at elt| is a preparation for an action
+% on the \textsc{qed} stack. Despite its form, the instruction |\QED at stack|
+% executes an operation on the stack. This operation prints the \textsc{qed}
+% symbol and nullify the top of the stack.
+%    \begin{macrocode}
+      \cs_set_eq:NN \qed at elt \setQED at elt 
+      \QED at stack \relax \relax 
+    \group_end: 
+  }
+%</LaTeX>
+%    \end{macrocode}
+% 
+% 
+%
+%
+% \subsection{We draw the arrows}
+%
+% \bigskip
+% The arrows are divided in groups. There is two reasons for this division.
+% \begin{itemize}
+% \item If the option |group| or the option |groups| is used, all the arrows of
+% a group are drawn on a same vertical at an abscissa of |\l_@@_x_dim|.
+% \item For aesthetic reasons, the starting point of all the starting arrows of
+% a group is raised upwards by the value |\l_@@_start_adjust_dim|. Idem for the
+% ending arrows.
+% \end{itemize}
+% 
+% \medskip
+% If the option |group| is used (|\l_@@_pos_arrow_int| = 7), we scan the arrows
+% twice: in the first step we only compute the value of |\l_@@_x_dim| for the
+% whole group, and, in the second step (|\l_@@_pos_arrow_int| is set to 8), we
+% divide the arrows in groups (for the vertical adjustement) and we actually
+% draw the arrows.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_scan_arrows:
+  { 
+    \group_begin:
+    \int_compare:nNnT \l_@@_pos_arrow_int = 7
+      { 
+        \@@_scan_arrows_i:
+        \int_set:Nn \l_@@_pos_arrow_int 8 
+      }
+    \@@_scan_arrows_i:
+    \group_end:
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_scan_arrows_i:
+  { 
+%    \end{macrocode}
+%
+% \bigskip 
+% |\l_@@_first_arrow_of_group_int| will be the first arrow of the current group.
+%
+% |\l_@@_first_line_of_group_int| will be the first line involved in the group
+% of arrows (equal to the initial line of the first arrow of the group because
+% the option |jump| is always positive).
+%
+% |\l_@@_first_arrows_seq| will be the list the arrows of the group starting at
+% the first line of the group (we may have several arrows starting from the same
+% line). We have to know all these arrows because of the adjustement by
+% |\l_@@_start_adjust_dim|.
+%
+% |\l_@@_last_line_of_group_int| will be the last line involved in the group
+% (impossible to guess in advance).
+%
+% |\l_@@_last_arrows_seq| will be the list of all the arrows of the group
+% ending at the last line of the group (impossible to guess in advance).
+%    \begin{macrocode}
+    \int_zero_new:N \l_@@_first_arrow_of_group_int 
+    \int_zero_new:N \l_@@_first_line_of_group_int
+    \int_zero_new:N \l_@@_last_line_of_group_int
+    \seq_clear_new:N \l_@@_first_arrows_seq
+    \seq_clear_new:N \l_@@_last_arrows_seq
+%    \end{macrocode}
+%
+% \medskip
+% The boolean |\l_@@_new_group_bool| is a switch that we will use the indicate
+% that a group is finished (and the lines of that group have to be drawn). This
+% boolean is not directed connected to the option |new-group| of an individual
+% arrow.
+%    \begin{macrocode}
+    \bool_set_true:N \l_@@_new_group_bool
+%    \end{macrocode}
+%
+% \bigskip
+% We begin a loop over all the arrows of the environment. Inside this loop, if a
+% group is finished, we will draw the arrows of that group.
+%    \begin{macrocode}
+    \int_set:Nn \l_@@_arrow_int \c_one_int
+    \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int
+      { 
+%    \end{macrocode}
+%
+% \bigskip 
+% We extract from the property list of the current arrow the fields ``initial'',
+% ``final'', ``status'' and ``input-line''. For the two former, we have to do
+% conversions to integers.
+%    \begin{macrocode}
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l_@@_initial_int \l_tmpa_tl
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l_@@_final_int \l_tmpa_tl
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { status } \l_@@_status_arrow_str
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { input-line } \l_@@_input_line_str
+%    \end{macrocode}
+%
+% \bigskip
+% We recall that, after the construction of the |\halign|, |\g_@@_line_int| is
+% the total number of lines of the environment. Therefore, the conditionnal
+% |\l_@@_final_int > \g_@@_line_int| tests whether an arrow arrives after the
+% last line of the environment. In this case, we raise an error (except in the
+% second step of treatment for the option |group|). The arrow will be completely
+% ignored, even for the computation of |\l_@@_x_dim|.
+%    \begin{macrocode}
+        \int_compare:nNnTF \l_@@_final_int > \g_@@_line_int
+          { 
+            \int_compare:nNnF \l_@@_pos_arrow_int = 8
+              { \@@_error:n { Too~few~lines~for~an~arrow } }
+          }
+          \@@_code_for_possible_arrow:
+%    \end{macrocode}
+%
+% \bigskip
+% Incrementation of the index of the loop (and end of the loop).
+%    \begin{macrocode}
+        \int_incr:N \l_@@_arrow_int
+      }
+%    \end{macrocode}
+%
+% \bigskip
+% After the last arrow of the environment, we have to draw the last group of
+% arrows. If we are in option |group| and in the first step of treatment
+% (|\l_@@_pos_arrow_int| = 7), we don't draw because, in the first step, we
+% don't draw anything. If there is no arrow in the group, we don't draw (this
+% situation occurs when all the arrows of the potential group arrive after the
+% last line of the environment).
+%    \begin{macrocode}
+    \bool_if:nT
+      { 
+        \int_compare_p:n { \l_@@_pos_arrow_int != 7 } 
+          &&
+        \int_compare_p:nNn \l_@@_first_arrow_of_group_int > 0 
+      }
+      { \@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int }
+  }
+%    \end{macrocode}
+%
+% \bigskip
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_code_for_possible_arrow:
+  { 
+%    \end{macrocode}
+% We test whether the previous arrow was in fact the last arrow of a group. In
+% this case, we have to draw all the arrows of that group, except if we are with
+% the option |group| and in the first step of treatment (|\l_@@_pos_arrow_int| =
+% 7). 
+%    \begin{macrocode}
+    \bool_if:nT 
+      { 
+        \int_compare_p:nNn \l_@@_arrow_int > \c_one_int
+        && 
+       ( \int_compare_p:n { \l_@@_initial_int > \l_@@_last_line_of_group_int }
+           &&
+         \int_compare_p:n { \l_@@_pos_arrow_int != 7 }
+           ||
+         \str_if_eq_p:Vn \l_@@_status_arrow_str { new-group }
+       ) 
+      }
+      { 
+        \int_compare:nNnF \l_@@_first_arrow_of_group_int = \c_zero_int
+          { 
+            \@@_draw_arrows:nn 
+              \l_@@_first_arrow_of_group_int 
+              { \l_@@_arrow_int - 1 } 
+          }
+        \bool_set_true:N \l_@@_new_group_bool
+      }
+%    \end{macrocode}
+%
+% \bigskip 
+% The flag |\l_@@_new_group_bool| indicates if we have to begin a new group of
+% arrows. In fact, we have to begin a new group in three circonstancies: if we
+% are at the first arrow of the environment (that's why the flag is raised
+% before the beginning of the loop), if we have just finished a group (that's
+% why the flag is raised in the previous conditionnal, for topological reasons
+% or if the previous arrows had the status ``new-group''). At the beginning of a
+% group, we have to initialize the following variables: |\l_@@_first_arrow_int|,
+% |\l_@@_first_line_of_group_int|, |\l_@@_last_line_of_group|,
+% |\l_@@_first_arrows_seq|, |\l_@@_last_arrows_seq|.
+%
+%    \begin{macrocode}
+    \bool_if:nTF \l_@@_new_group_bool
+      { 
+        \bool_set_false:N \l_@@_new_group_bool
+        \int_set_eq:NN \l_@@_first_arrow_of_group_int \l_@@_arrow_int
+        \int_set_eq:NN \l_@@_first_line_of_group_int \l_@@_initial_int
+        \int_set_eq:NN \l_@@_last_line_of_group_int \l_@@_final_int
+        \seq_clear:N \l_@@_first_arrows_seq 
+        \seq_put_left:NV \l_@@_first_arrows_seq \l_@@_arrow_int
+        \seq_clear:N \l_@@_last_arrows_seq 
+        \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int
+%    \end{macrocode}
+%
+% If we are in option |group| and in the second step of treatment
+% (|\l_@@_pos_arrow_int| = 8), we don't initialize |\l_@@_x_dim| because we want
+% to use the same value of |\l_@@_x_dim| (computed during the first step) for
+% all the groups.
+%    \begin{macrocode}
+        \int_compare:nT { \l_@@_pos_arrow_int != 8 }
+          { \dim_set:Nn \l_@@_x_dim { - \c_max_dim } }
+      }
+%    \end{macrocode}
+%
+% \bigskip
+% If we are not at the beginning of a new group.
+%    \begin{macrocode}
+      { 
+%    \end{macrocode}
+% 
+% If the arrow is independent, we don't take into account this arrow for the
+% detection of the end of the group.
+%    \begin{macrocode}
+        \bool_if:nF 
+          { \str_if_eq_p:Vn \l_@@_status_arrow_str { independent } }
+          { 
+%    \end{macrocode}
+% If the arrow is not independant, the arrow belongs to the current group and we
+% have to take it into account in some variables.
+%    \begin{macrocode}
+            \int_compare:nT 
+              { \l_@@_initial_int = \l_@@_first_line_of_group_int }
+              { \seq_put_left:NV \l_@@_first_arrows_seq \l_@@_arrow_int }
+            \int_compare:nNnTF \l_@@_final_int > \l_@@_last_line_of_group_int
+              { 
+                \int_set_eq:NN \l_@@_last_line_of_group_int \l_@@_final_int
+                \seq_clear:N \l_@@_last_arrows_seq
+                \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int
+              }
+              { 
+                \int_compare:nNnT \l_@@_final_int = \l_@@_last_line_of_group_int
+                  { \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int }
+              }
+          }
+      }
+%    \end{macrocode}
+%
+% \bigskip 
+% If the arrow is not independent, we update the current $x$-value (in 
+% |\l_@@_x_dim|) with the dedicated command |\@@_update_x:nn|. If we are
+% in option |group| and in the second step of treatment (|\l_@@_pos_arrow_int| =
+% 8), we don't initialize |\l_@@_x_dim| because we want to use the same value of
+% |\l_@@_x_dim| (computed during the first step) for all the groups.
+%    \begin{macrocode}
+    \bool_if:nF { \str_if_eq_p:Vn \l_@@_status_arrow_str { independent } }
+      { 
+        \int_compare:nT { \l_@@_pos_arrow_int != 8 }
+          { \@@_update_x:nn \l_@@_initial_int \l_@@_final_int }
+      } 
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% The following code is necessary because we will have to expand an argument
+% exactly 3 times.
+%    \begin{macrocode}
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Npn \@@_keys_set: 
+  { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
+%    \end{macrocode}
+%
+% \bigskip
+% The macro |\@@_draw_arrows:nn| draws all the arrows whose numbers are between
+% |#1| and |#2|. |#1| and |#2| must be expressions that expands to an integer
+% (they are expanded in the beginning of the macro). This macro is nullified by
+% the option |no-arrows|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_arrows:nn #1 #2
+  {
+    \group_begin:
+    \int_zero_new:N \l_@@_first_arrow_int
+    \int_set:Nn \l_@@_first_arrow_int { #1 }
+    \int_zero_new:N \l_@@_last_arrow_int
+    \int_set:Nn \l_@@_last_arrow_int { #2 }
+%    \end{macrocode}
+%
+% \bigskip
+% We begin a loop over the arrows we have to draw. The variable
+% |\l_@@_arrow_int| (local in the environment |{WithArrows}|) will be used as
+% index for the loop.
+%    \begin{macrocode}
+    \int_set:Nn \l_@@_arrow_int \l_@@_first_arrow_int
+    \int_until_do:nNnn \l_@@_arrow_int > \l_@@_last_arrow_int
+      {
+%    \end{macrocode}
+%
+% \bigskip 
+% We extract from the property list of the current arrow the fields ``initial''
+% and ``final'' and we store these values in |\l_@@_initial_int| and
+% |\l_@@_final_int|. However, we have to do a conversion because the components
+% of a property list are token lists.
+%    \begin{macrocode}
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l_@@_initial_int \l_tmpa_tl
+        \prop_get:cnN 
+          { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l_@@_final_int \l_tmpa_tl
+%    \end{macrocode}
+%
+% \bigskip
+% If the arrow ends after the last line of the environment, we don't draw the
+% arrow (an error has already been raised in |\@@_scan_arrows:|). We recall
+% that, after the construction of the |\halign|, |\g_@@_line_int| is the total
+% number of lines of the environment).
+%    \begin{macrocode}
+        \int_compare:nT { \l_@@_final_int <= \g_@@_line_int } \@@_draw_arrows_i:
+        \int_incr:N \l_@@_arrow_int
+      } 
+    \group_end:
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% The macro |\@@_draw_arrows_i:| is only for the lisibility of the code. The
+% first |\group_begin:| is for the options of the arrows (but we remind that the
+% options |ll|, |rr|, |rl|, |lr|, |i| and |jump| have already been extracted and
+% are not present in the field |options| of the property list of the arrow).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_arrows_i:
+  { 
+    \group_begin:
+%    \end{macrocode}
+%
+% \bigskip
+% We process the options of the current arrow. The second argument of
+% |\keys_set:nn| must be expanded exactly three times. An x-expansion is not
+% possible because there can be tokens like |\bfseries| in the option |font| of
+% the option |tikz|. This expansion is a bit tricky.
+%    \begin{macrocode}
+    \prop_get:cnN 
+      { g_@@_arrow _\l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } 
+      { options } \l_tmpa_tl
+    \str_clear_new:N \l_@@_previous_key_str
+    \exp_args:NNo \exp_args:No 
+    \@@_keys_set: { \l_tmpa_tl , tikz = { xshift = \l_@@_xoffset_dim } }
+%    \end{macrocode}
+%
+% We create two booleans to indicate the position of the initial node and final
+% node of the arrow in cases of options |rr|, |rl|, |lr| or |ll|:
+%    \begin{macrocode}
+    \bool_set_false:N \l_@@_initial_r_bool
+    \bool_set_false:N \l_@@_final_r_bool
+    \int_case:nn \l_@@_pos_arrow_int 
+      {
+        0 { \bool_set_true:N \l_@@_final_r_bool }
+        2 { \bool_set_true:N \l_@@_initial_r_bool }
+        3 
+          { 
+            \bool_set_true:N \l_@@_initial_r_bool
+            \bool_set_true:N \l_@@_final_r_bool 
+          }
+      }
+%    \end{macrocode}
+%
+% \bigskip
+% \begin{center}
+% \begin{tabular}{l}
+% \begin{tabular}{@{}l*8c@{}}
+% \toprule
+% option & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\
+% \midrule
+% |\l_@@_pos_arrow_int| & $0$  & $1$  & $2$  & $3$  & $4$ & $5$  & $6$  & $7$ \\
+% \bottomrule
+% \end{tabular} \\
+% \footnotesize The option |v| can be used only in |\Arrow| in |code-after| (see
+% below). 
+% \end{tabular}
+% \end{center}
+% 
+% \bigskip
+% In case of option |i| at a local or global level (|\l_@@_pos_arrow_int| = 5),
+% we have to compute the $x$-value of the arrow (which is vertical). The
+% computed $x$-value is stored in |\l_@@_x_dim| (the same variable used when the
+% option |group| or the option |groups| is used).
+%    \begin{macrocode}
+    \int_compare:nNnT \l_@@_pos_arrow_int = 5
+      { 
+        \dim_set:Nn \l_@@_x_dim { - \c_max_dim }
+        \@@_update_x:nn \l_@@_initial_int \l_@@_final_int 
+      }
+%    \end{macrocode}
+%
+% \bigskip
+% |\l_@@_initial_tl| contains the name of the Tikz node from which the arrow
+% starts (in normal cases... because with the option |i|, |group| and |groups|,
+% the point will perhaps have another
+% $x$-value --- but always the same $y$-value). Idem for |\l_@@_final_tl|.
+%    \begin{macrocode}
+    \tl_set:Nx \l_@@_initial_tl 
+      { 
+        \int_use:N \l_@@_initial_int - \bool_if:NTF \l_@@_initial_r_bool rl 
+        .south 
+      } 
+    \tl_set:Nx \l_@@_final_tl 
+      { \int_use:N \l_@@_final_int - \bool_if:NTF \l_@@_final_r_bool rl .north }
+%    \end{macrocode}
+% We use ``|.south|'' and ``|.north|'' because we want a small gap between two
+% consecutive arrows (and the Tikz nodes created have the shape of small
+% vertical segments: use option |show-nodes| to visualize the nodes).
+%
+% \bigskip
+% The label of the arrow will be stored in |\l_tmpa_tl|.
+%    \begin{macrocode}
+    \prop_get:cnN 
+      { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } 
+      { label } 
+      \l_tmpa_tl 
+%    \end{macrocode}
+%
+% \bigskip
+% Now, we have to know if the arrow starts at the first line of the group and/or
+% ends at the last line of the group. That's the reason why we have stored in
+% |\l_@@_first_arrows_seq| the list of all the arrows starting at the
+% first line of the group and in |\l_@@_last_arrows_seq| the list of
+% all the arrows ending at the last line of the group. We compute these values
+% in the booleans |\l_tmpa_bool| and |\l_tmpb_bool|. These computations can't be
+% done in the following |{tikzpicture}| because the command |\seq_if_in:NnTF|
+% which is \emph{not} expandable.
+%    \begin{macrocode}
+    \seq_if_in:NxTF \l_@@_first_arrows_seq 
+      { \int_use:N \l_@@_arrow_int }
+      { \bool_set_true:N \l_tmpa_bool }
+      { \bool_set_false:N \l_tmpa_bool }
+    \seq_if_in:NxTF \l_@@_last_arrows_seq 
+      { \int_use:N \l_@@_arrow_int } 
+      { \bool_set_true:N \l_tmpb_bool }
+      { \bool_set_false:N \l_tmpb_bool }
+    \int_compare:nNnT \l_@@_pos_arrow_int = 5
+      { 
+        \bool_set_true:N \l_tmpa_bool
+        \bool_set_true:N \l_tmpb_bool 
+      }
+%    \end{macrocode}
+%
+% \bigskip 
+% We compute and store in |\g_tmpa_tl| and |\g_tmpb_tl| the exact coordinates of
+% the extremities of the arrow.
+% \begin{itemize}
+% \item Concerning the
+% $x$-values, the abscissa computed in |\l_@@_x_dim| will be used if the option
+% of position is |i|, |group| or |groups|.
+% \item Concerning the
+% $y$-values, an adjustement is done for each arrow starting at the first line
+% of the group and each arrow ending at the last line of the group (with the
+% values of |\l_@@_start_adjust_dim| and |\l_@@_end_adjust_dim|).
+% \end{itemize}
+% 
+%    \begin{macrocode}
+%<*LaTeX>
+    \begin { tikzpicture } [ @@_standard ]
+%</LaTeX>
+%<*plain-TeX>
+    \tikzpicture [ @@_standard ]
+%</plain-TeX>
+      \tikz at scan@one at point \pgfutil at firstofone ( \l_@@_initial_tl )
+      \tl_gset:Nx \g_tmpa_tl 
+        {
+          \int_compare:nNnTF \l_@@_pos_arrow_int < 5
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l_@@_x_dim } , 
+          \bool_if:NTF \l_tmpa_bool
+            { \dim_eval:n { \pgf at y + \l_@@_start_adjust_dim } }
+            { \dim_use:N \pgf at y } 
+        }
+      \tikz at scan@one at point \pgfutil at firstofone ( \l_@@_final_tl )
+      \tl_gset:Nx \g_tmpb_tl 
+        {
+          \int_compare:nNnTF \l_@@_pos_arrow_int < 5 
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l_@@_x_dim } , 
+          \bool_if:NTF \l_tmpb_bool
+            { \dim_eval:n { \pgf at y - \l_@@_end_adjust_dim } }
+            { \dim_use:N \pgf at y } 
+        } 
+%<*LaTeX>
+    \end { tikzpicture } 
+%</LaTeX>
+%<*plain-TeX>
+    \endtikzpicture
+%</plain-TeX>
+%    \end{macrocode}
+%
+% \bigskip
+% Eventually, we can draw the arrow with the code in |\l_@@_tikz_code_tl|. We
+% recall that the value by default for this token list is :\enskip
+% ``\verb|\draw (#1) to node {#3} (#2) ;|''. This value can be modified with the
+% option |tikz-code|. We use the variant |\@@_draw_arrow:nno| of the macro
+% |\@@_draw_arrow:nnn| because of the characters \emph{underscore} in the name
+% |\l_tmpa_tl|: if the user uses the Tikz library |babel|, the third argument of
+% the command |\@@_draw_arrow:nno| will be rescanned because this third argument
+% will be in the argument of a command |node| of an instruction |\draw| of
+% Tikz... and we will have an error because of the characters
+% \emph{underscore}.\footnote{There were other solutions: use another name
+% without \emph{underscore} (like \Verb|\ltmpatl|) or use the package
+% \pkg{underscore} (with this package, the characters \emph{underscore} will be
+% rescanned without errors, even in text mode).}
+%    \begin{macrocode}
+    \@@_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
+%    \end{macrocode}
+%
+% \smallskip
+% We close the TeX group opened for the options given to |\Arrow[...]| (local
+% level of the options).
+%    \begin{macrocode}
+    \group_end: 
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% The function |@@_tmpa:nnn| will draw the arrow. It's merely an environment
+% |{tikzpicture}|. However, the Tikz instruction in this environment must be
+% inserted from |\l_@@_tikz_code_tl| with the markers |#1|, |#2| and |#3|.
+% That's why we create a function |\@@_def_function_tmpa:n| which will create
+% the function |\@@_tmpa:nnn|.
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_def_function_tmpa:n #1
+  { 
+    \cs_set:Npn \@@_tmpa:nnn ##1 ##2 ##3
+      { 
+%<*LaTeX>
+        \begin{tikzpicture} 
+%</LaTeX>
+%<*plain-TeX>
+        \tikzpicture
+%</plain-TeX>
+          [ 
+            @@_standard , 
+            every~path / .style = WithArrows / arrow 
+          ] 
+          #1 
+%<*LaTeX>
+        \end{tikzpicture}
+%</LaTeX>
+%<*plain-TeX>
+        \endtikzpicture
+%</plain-TeX>
+      }
+  }
+%    \end{macrocode}
+%
+% \medskip
+% When we draw the arrow (with |\@@_draw_arrow:nnn|), we first create the
+% function |\@@_tmpa:nnn| and, then, we use the function |\@@_tmpa:nnn| :
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_draw_arrow:nnn #1 #2 #3
+  {
+%    \end{macrocode}
+%
+% \medskip
+% If the option |wrap-lines| is used, we have to use a special version of
+% |\l_@@_tikz_code_tl| (which corresponds to the option |tikz-code|).
+%    \begin{macrocode}
+    \bool_if:nT { \l_@@_wrap_lines_bool && \l_@@_in_DispWithArrows_bool }
+       { \tl_set_eq:NN \l_@@_tikz_code_tl \c_@@_tikz_code_wrap_lines_tl }
+%    \end{macrocode}
+% 
+% \medskip
+% Now, the main lines of this function |\@@_draw_arrow:nnn|.
+%    \begin{macrocode}
+    \exp_args:NV \@@_def_function_tmpa:n \l_@@_tikz_code_tl
+    \@@_tmpa:nnn { #1 } { #2 } { #3 } 
+  }
+\cs_generate_variant:Nn \@@_draw_arrow:nnn { n n o }
+%    \end{macrocode}
+% 
+% \bigskip
+% If the option |wrap-lines| is used, we have to use a special version of
+% |\l_@@_tikz_code_tl| (which corresponds to the option |tikz-code|).
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_tikz_code_wrap_lines_tl
+  { 
+%    \end{macrocode}
+% First, we draw the arrow without the label.
+%    \begin{macrocode}
+    \draw ( #1 ) to node ( @@_label ) { } ( #2 ) ;
+%    \end{macrocode}
+% We retrieve in |\pgf at x| the abscissa of the left-side of the label we will
+% put.
+%    \begin{macrocode}
+    \tikz at parse@node \pgfutil at firstofone ( @@_label.west )
+%    \end{macrocode}
+% We compute in |\l_tmpa_dim| the maximal width possible for the label. 
+% Here is the use of |\g_@@_right_x_dim| which has been computed previously with
+% the |v|-nodes. 
+%    \begin{macrocode}
+    \dim_set:Nn \l_tmpa_dim 
+      { \g_@@_right_x_dim - \pgf at x - \pgfkeysvalueof { / pgf / inner~xsep } } 
+%    \end{macrocode}
+% We retrieve in |\g_tmpa_tl| the current value of the Tikz parameter 
+% ``|text width|''.\footnote{In fact, it's not the current value of 
+% ``|text width|'': it's the value of ``|text width|'' set in the option |tikz|
+% provided by \pkg{witharrows}. These options are given to Tikz in a 
+% ``|every path|''. That's why we have to retrieve it in a path.}
+%    \begin{macrocode}
+    \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+%    \end{macrocode}
+% Maybe the current value of the parameter ``|text width|'' is shorter than
+% |\l_tmpa_dim|. In this case, we must use ``|text width|'' (we update
+% |\l_tmpa_dim|).
+%    \begin{macrocode}
+    \tl_if_empty:NF \g_tmpa_tl
+      {
+        \dim_set:Nn \l_tmpb_dim \g_tmpa_tl
+        \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+          { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim }
+      }
+%    \end{macrocode}
+% Now, we can put the label with the right value for ``|text width|''.
+%    \begin{macrocode}
+    \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim
+      { 
+        \path ( @@_label.west ) 
+           node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ] 
+                { #3 } ; 
+      } 
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+% The command |\@@_update_x:nn| will analyze the lines between |#1| and
+% |#2| in order to modify |\l_@@_x_dim| in consequence. More precisely,
+% |\l_@@_x_dim| is increased if a line longer than the current value of
+% |\l_@@_x_dim| is found. |\@@_update_x:nn| is used in |\@@_scan_arrows:|
+% (for options |group| and |groups|) and in |\@@_draw_arrows:nn| (for option
+% |i|).
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_update_x:nn #1 #2
+  { 
+    \int_step_inline:nnn { #1 } { #2 } 
+      { 
+%<*LaTeX>
+        \begin { tikzpicture } [ @@_standard ]
+%</LaTeX>
+%<*plain-TeX>
+        \tikzpicture [ @@_standard ]
+%</plain-TeX>
+          \tikz at scan@one at point \pgfutil at firstofone ( ##1 - l )
+          \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l_@@_x_dim \pgf at x }
+%<*LaTeX>
+        \end { tikzpicture }
+%</LaTeX>
+%<*plain-TeX>
+        \endtikzpicture
+%</plain-TeX>
+        \dim_set_eq:NN \l_@@_x_dim \g_tmpa_dim 
+      } 
+  } 
+%    \end{macrocode}
+%
+%
+% \bigskip
+% The command |\WithArrowsLastEnv| is not used by the package \pkg{witharrows}.
+% It's only a facility given to the final user. It gives the number of the last
+% environment |{WithArrows}| at
+% level~$0$ (to the sense of the nested environments). This macro is fully
+% expandable and, thus, can be used directly in the name of a Tikz node.
+%    \begin{macrocode}
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g_@@_last_env_int }
+%    \end{macrocode}
+%
+% \bigskip
+% \subsection{The command \textbackslash Arrow in code-after}
+%
+% The option |code-after| is an option of the environment |{WithArrows}| (this
+% option is only available at the environment level). In the option |code-after|,
+% one can use the command |Arrow| but it's a special version of the command
+% |Arrow|. For this special version (internally called |\@@_Arrow_code_after|),
+% we define a special set of keys called |WithArrows/Arrow/code-after|.
+%
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Arrow / code-after }
+  {
+    tikz     .code:n = 
+      \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz     .value_required:n  = true ,
+    rr       .value_forbidden:n = true ,
+    rr       .code:n            = \@@_fix_pos_option:n 0 ,
+    ll       .value_forbidden:n = true,
+    ll       .code:n            = \@@_fix_pos_option:n 1 ,
+    rl       .value_forbidden:n = true ,
+    rl       .code:n            = \@@_fix_pos_option:n 2 ,
+    lr       .value_forbidden:n = true ,
+    lr       .code:n            = \@@_fix_pos_option:n 3 ,
+    v        .value_forbidden:n = true ,
+    v        .code:n            = \@@_fix_pos_option:n 4 ,
+    tikz-code .tl_set:N          = \l_@@_tikz_code_tl ,
+    tikz-code .value_required:n  = true ,
+    xoffset  .dim_set:N         = \l_@@_xoffset_dim ,
+    xoffset  .value_required:n  = true ,
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_Arrow_code_after_seq
+      \@@_error:n { Unknown~option~Arrow~in~code-after } 
+  }
+%    \end{macrocode}
+%
+% \bigskip
+% A sequence of the options available in |\Arrow| in |code-after|. This sequence
+% will be used in the error messages and can be modified dynamically.
+%    \begin{macrocode}
+\seq_new:N \l_@@_options_Arrow_code_after_seq
+\@@_set_seq_of_str_from_clist:Nn \l_@@_options_Arrow_code_after_seq
+  { ll, lr, rl, rr, tikz, tikz-code, v, x, offset }
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentCommand \@@_Arrow_code_after { O { } m m m ! O { } }
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \@@_Arrow_code_after 
+  { 
+    \peek_meaning:NTF [
+      { \@@_Arrow_code_after_i }
+      { \@@_Arrow_code_after_i [ ] }
+  }
+\cs_new_protected:Npn \@@_Arrow_code_after_i [ #1 ] #2 #3 #4
+  {
+    \peek_meaning:NTF [
+      { \@@_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } }
+      { \@@_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } [ ] }
+  } 
+\cs_new_protected:Npn \@@_Arrow_code_after_ii [ #1 ] #2 #3 #4 [ #5 ]
+%</plain-TeX>
+  {
+    \int_set:Nn \l_@@_pos_arrow_int 1
+    \str_clear_new:N \l_@@_previous_key_str
+    \group_begin:
+      \keys_set:nn { WithArrows / Arrow / code-after } 
+        { #1, #5, tikz = { xshift = \l_@@_xoffset_dim } }
+      \bool_set_false:N \l_@@_initial_r_bool
+      \bool_set_false:N \l_@@_final_r_bool
+      \int_case:nn \l_@@_pos_arrow_int
+        { 
+          0
+            { 
+              \bool_set_true:N \l_@@_initial_r_bool
+              \bool_set_true:N \l_@@_final_r_bool
+            }
+          2 { \bool_set_true:N \l_@@_initial_r_bool }
+          3 { \bool_set_true:N \l_@@_final_r_bool } 
+        }
+%    \end{macrocode}
+% We prevent drawing a arrow from a line to itself.
+%    \begin{macrocode}
+      \tl_if_eq:nnTF { #2 } { #3 }
+        { \@@_error:nn { Both~lines~are~equal } { #2 } }
+%    \end{macrocode}
+% We test whether the two Tikz nodes |(#2-l)| and |(#3-l)| really exist. If not, 
+% the arrow won't be drawn.
+%    \begin{macrocode}
+        {
+          \cs_if_free:cTF { pgf at sh@ns at wa - \l_@@_prefix_str - #2 - l }
+            { \@@_error:nx { Wrong~line~in~Arrow } { #2 } }
+            { 
+              \cs_if_free:cTF { pgf at sh@ns at wa - \l_@@_prefix_str - #3 - l }
+                { \@@_error:nx { Wrong~line~in~Arrow } { #3 }  }
+                { 
+                  \int_compare:nNnTF \l_@@_pos_arrow_int = 4
+                    {
+%<*LaTeX>
+                      \begin { tikzpicture } [ @@_standard ]
+%</LaTeX>
+%<*plain-TeX>
+                      \tikzpicture [ @@_standard ]
+%</plain-TeX>
+                        \tikz at scan@one at point \pgfutil at firstofone (#2-l.south)
+                        \dim_set_eq:NN \l_tmpa_dim \pgf at x
+                        \dim_set_eq:NN \l_tmpb_dim \pgf at y
+                        \tikz at scan@one at point \pgfutil at firstofone (#3-l.north)
+                        \dim_set:Nn \l_tmpa_dim 
+                          { \dim_max:nn \l_tmpa_dim \pgf at x }
+                        \tl_gset:Nx \g_tmpa_tl 
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \l_tmpb_dim } 
+                        \tl_gset:Nx \g_tmpb_tl 
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf at y } 
+%<*LaTeX>
+                      \end { tikzpicture } 
+%</LaTeX>
+%<*plain-TeX>
+                      \endtikzpicture
+%</plain-TeX>
+                    }
+                    { 
+%<*LaTeX>
+                      \begin { tikzpicture } [ @@_standard ]
+%</LaTeX>
+%<*plain-TeX>
+                      \tikzpicture [ @@_standard ]
+%</plain-TeX>
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #2-\bool_if:NTF\l_@@_initial_r_bool rl .south )
+                        \tl_gset:Nx \g_tmpa_tl 
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #3-\bool_if:NTF\l_@@_final_r_bool rl .north )
+                        \tl_gset:Nx \g_tmpb_tl 
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+%<*LaTeX>
+                      \end { tikzpicture } 
+%</LaTeX>
+%<*plain-TeX>
+                      \endtikzpicture
+%</plain-TeX>
+                    }
+                  \@@_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 } 
+                } 
+            }
+        }
+    \group_end:
+  }
+%    \end{macrocode}
+%
+%                               
+% \bigskip
+% \subsection{The command \textbackslash MultiArrow in code-after}
+% The command |\@@_MultiArrow:nn| will be linked to |\MultiArrow| when the
+% |code-after| is executed.
+%    
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_MultiArrow:nn #1 #2
+  {  
+%    \end{macrocode}
+% The user of the command |\MultiArrow| (in |code-after|) will be able to specify
+% the list of lines with the same syntax as the loop |\foreach| of \pkg{pgffor}.
+% That's why we construct a ``clist'' of \pkg{expl3} from the specification of
+% list given by the user. The construction of the ``clist'' must be global in
+% order to exit the |\foreach| and that's why we construct the list in
+% |\g_tmpa_clist|.
+%    \begin{macrocode}
+    \foreach \x in { #1 } 
+      { 
+        \cs_if_free:cTF { pgf at sh@ns at wa - \l_@@_prefix_str - \x - l }
+           { \@@_error:nx { Wrong~line~specification~in~MultiArrow } \x }
+           { \clist_gput_right:Nx \g_tmpa_clist \x } 
+      } 
+%    \end{macrocode}
+% We sort the list |\g_tmpa_clist| because we want to extract the minimum and
+% the maximum.
+%    \begin{macrocode}
+    \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 }
+      { \@@_error:n { Too~small~specification~for~MultiArrow } }
+      {
+        \clist_sort:Nn \g_tmpa_clist 
+          {
+            \int_compare:nTF { ##1 > ##2 }
+              \sort_return_swapped: 
+              \sort_return_same:
+          }
+%    \end{macrocode}
+% We extract the minimum in |\l_tmpa_tl| (it must be an integer but we store it
+% in a token list of \pkg{expl3}).
+%    \begin{macrocode}
+        \clist_pop:NN \g_tmpa_clist \l_tmpa_tl
+%    \end{macrocode}
+%
+% We extract the maximum in |\l_tmpb_tl|. The remaining list (in
+% |\g_tmpa_clist|) will be sorted in decreasing order but never mind...
+%    \begin{macrocode}
+        \clist_reverse:N \g_tmpa_clist
+        \clist_pop:NN \g_tmpa_clist \l_tmpb_tl
+%    \end{macrocode}
+%
+% We draw the teeth of the rak (except the first one and the last one) with the
+% auxiliary function |\@@_MultiArrow_i:n|. This auxiliary fonction is necessary
+% to expand the specification of the list in the |\foreach| loop. The first and
+% the last teeth of the rak can't be drawn the same way as the others (think,
+% for example, to the case of the option ``|rounded corners|'' is used).
+%    \begin{macrocode}
+        \exp_args:NV \@@_MultiArrow_i:n \g_tmpa_clist
+%    \end{macrocode}
+%
+% Now, we draw the rest of the structure.
+%    \begin{macrocode}
+%<*LaTeX>
+        \begin { tikzpicture }
+%</LaTeX>
+%<*plain-TeX>
+        \tikzpicture
+%</plain-TeX>
+          [ 
+            @@_standard , 
+            every~path / .style = { WithArrows / arrow } 
+          ] 
+          \draw [<->] ([xshift = \l_@@_xoffset_dim]\l_tmpa_tl-r.south)
+                      -- ++(5mm,0)
+                      -- node (@@_label) {} 
+                         ([xshift = \l_@@_xoffset_dim+5mm]\l_tmpb_tl-r.south)
+                      -- ([xshift = \l_@@_xoffset_dim]\l_tmpb_tl-r.south)  ;
+          \tikz at parse@node \pgfutil at firstofone (@@_label.west)
+          \dim_set:Nn \l_tmpa_dim { 20 cm }
+          \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+          \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl }
+          \bool_if:nT { \l_@@_wrap_lines_bool && \l_@@_in_DispWithArrows_bool }
+            { 
+              \dim_set:Nn \l_tmpb_dim 
+                { \g_@@_right_x_dim - \pgf at x - 0.3333 em }
+              \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+                { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } 
+            }
+          \path (@@_label.west) 
+           node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ;
+%<*LaTeX>
+        \end{tikzpicture} 
+%</LaTeX>
+%<*plain-TeX>
+        \endtikzpicture
+%</plain-TeX>
+      } 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\cs_new_protected:Npn \@@_MultiArrow_i:n #1
+  { 
+%<*LaTeX>
+        \begin { tikzpicture }
+%</LaTeX>
+%<*plain-TeX>
+        \tikzpicture
+%</plain-TeX>
+      [ 
+        @@_standard , 
+        every~path / .style = { WithArrows / arrow } 
+      ] 
+      \foreach \k in { #1 }
+        { 
+          \draw [ <- ] 
+            ( [xshift = \l_@@_xoffset_dim]\k-r.south ) -- ++(5mm,0) ; 
+        } ;
+%<*LaTeX>
+        \end{tikzpicture} 
+%</LaTeX>
+%<*plain-TeX>
+        \endtikzpicture
+%</plain-TeX>
+  }
+%    \end{macrocode}
+%
+%
+% \bigskip
+% \subsection{The error messages of the package}
+%
+%    \begin{macrocode}
+\str_const:Nn \c_@@_option_ignored_str
+  { If~you~go~on,~this~option~will~be~ignored. }
+\str_const:Nn \c_@@_command_ignored_str
+  { If~you~go~on,~this~command~will~be~ignored. }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*LaTeX>
+\@@_msg_new:nn { amsmath~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~the~
+    package~'amsmath'~has~not~been~loaded.\\
+    If~you~go~on,~this~option~will~be~ignored~in~the~rest~
+    of~the~document.
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Bad~value~for~replace~brace~by }
+  {
+    Bad~value~for~the~option~'\l_keys_key_tl'.~The~value~must~begin~ 
+    with~an~extensible~left~delimiter.~The~possible~values~are:~.,
+    \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~
+    \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~
+    \token_to_str:N \langle,~\token_to_str:N \lmoustache,~
+    \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\ 
+    (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\
+    if~amsmath~or~unicode-math~is~loaded~in~LaTeX).\\
+    \c_@@_option_ignored_str 
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { option~of~cr~negative }
+  {
+    The~argument~of~the~command~\token_to_str:N\\~
+    should~be~positive~in~the~row~\int_use:N \g_@@_line_int\
+    of~your~environment~\{\l_@@_type_env_str\}.\\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { omit~probably~used } 
+  {
+    There~is~a~problem.~Maybe~you~have~used~a~command~
+    \token_to_str:N\omit\ in~the~line~\int_use:N \g_@@_line_int\
+    (or~another~line)~of~your~environment~\{\l_@@_type_env_str\}.\\ 
+    You~can~go~on~but~you~may~have~others~errors.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*LaTeX>
+\@@_msg_new:nn { newline~at~the~end~of~env }
+  { 
+    Your~environment~\{\l_@@_type_env_str\}~should~not~end~with~
+    a~\token_to_str:N \\.\\
+    This~warning~might~become~an~error~in~a~future~version.
+  }
+%</LaTeX>
+%    \end{macrocode}    
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Invalid~option~format }
+  {
+    The~key~'format'~should~contain~only~letters~r,~c~and~l~and~
+    must~not~be~empty.\\  
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Value~for~a~key }
+  {
+    The~key~'\l_keys_key_tl'~should~be~used~without~value. \\
+    However,~you~can~go~on~for~this~time.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nnn { Unknown~option~in~Arrow }
+  { 
+    The~key~'\l_keys_key_tl'~is~unknown~for~the~command~
+    \l_@@_string_Arrow_for_msg_str\ in~the~row~
+    \int_use:N \g_@@_line_int\ of~your~environment~
+    \{\l_@@_type_env_str\}. \l_tmpa_str \\
+    \c_@@_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  { 
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l_@@_options_Arrow_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}          
+\@@_msg_new:nnn { Unknown~option~WithArrows }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l_@@_type_env_str\}. \\
+    \c_@@_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l_@@_options_WithArrows_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nnn { Unknown~option~DispWithArrows }
+  { 
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l_@@_type_env_str\}. \\
+    \c_@@_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l_@@_options_DispWithArrows_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nnn { Unknown~option~WithArrowsOptions }
+  { 
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \WithArrowsOptions. \\
+    \c_@@_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>. 
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l_@@_options_WithArrowsOptions_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nnn { Unknown~option~Arrow~in~code-after }
+  { 
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \Arrow\ in~code-after. \\
+    \c_@@_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  { 
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l_@@_options_Arrow_code_after_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Too~much~columns~in~WithArrows }
+  { 
+    Your~environment~\{\l_@@_type_env_str\}~has~\int_use:N 
+    \l_@@_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~
+    If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~ 
+    the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\
+    However,~you~can~go~one~for~this~time.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Too~much~columns~in~DispWithArrows }
+  { 
+    Your~environment~\{\l_@@_type_env_str\}~has~\int_use:N 
+    \l_@@_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ 
+    at~the~end~of~row~\int_use:N \g_@@_line_int. \\
+    This~error~is~fatal.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Negative~jump }
+  { 
+    You~can't~use~a~negative~value~for~the~option~'jump'~of~command~
+    \l_@@_string_Arrow_for_msg_str\
+    in~the~row~\int_use:N \g_@@_line_int\
+    of~your~environment~\{\l_@@_type_env_str\}.~
+    You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { new-group~without~groups }
+  { 
+    You~can't~use~the~option~'new-group'~for~the~command~
+    \l_@@_string_Arrow_for_msg_str\
+    because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~
+    'groups'~in~your~environment~\{\l_@@_type_env_str\}. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn          
+  { Too~few~lines~for~an~arrow }
+  { 
+    Line~\l_@@_input_line_str\
+    :~an~arrow~specified~in~the~row~\int_use:N \l_@@_initial_int\
+    of~your~environment~\{\l_@@_type_env_str\}~can't~be~drawn~
+    because~it~arrives~after~the~last~row~of~the~environment. \\
+    If~you~go~on,~this~arrow~will~be~ignored.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { WithArrows~outside~math~mode }
+  { 
+    The~environment~\{\l_@@_type_env_str\}~should~be~used~only~in~math~mode~
+    like~the~environment~\{aligned\}~of~amsmath. \\
+    Nevertheless,~you~can~go~on.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { DispWithArrows~in~math~mode }
+  { 
+    The~environment~\{\l_@@_type_env_str\}~should~be~used~only~outside~math~
+    mode~like~the~environment~\{align\}~of~amsmath. \\ 
+    This~error~is~fatal.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Incompatible~options~in~Arrow }
+  { 
+    You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l_@@_previous_key_str'~set~in~the~same~command~
+    \l_@@_string_Arrow_for_msg_str. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+% 
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Incompatible~options }
+  { You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l_@@_previous_key_str'~set~in~the~same~command~
+    \bool_if:NT \l_@@_in_code_after_bool
+      { 
+        \l_@@_string_Arrow_for_msg_str\
+        in~the~code-after~of~your~environment~\{\l_@@_type_env_str\}
+      }. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Arrow~not~in~last~column }
+  { 
+    You~should~use~the~command~\l_@@_string_Arrow_for_msg_str\
+    only~in~the~last~column~(column~\int_use:N\l_@@_nb_cols_int)~
+    of~your~environment~\{\l_@@_type_env_str\}.\\
+    However~you~can~go~on~for~this~time.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Wrong~line~in~Arrow }
+  { 
+    The~specification~of~line~'#1'~you~use~in~the~command~
+    \l_@@_string_Arrow_for_msg_str\
+    in~the~'code-after'~of~\{\l_@@_type_env_str\}~doesn't~exist. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Both~lines~are~equal }
+  {
+    In~the~'code-after'~of~\{\l_@@_type_env_str\}~you~try~to~
+    draw~an~arrow~going~to~itself~from~the~line~'#1'.~This~is~not~possible. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { Wrong~line~specification~in~MultiArrow }
+  { 
+    The~specification~of~line~'#1'~doesn't~exist. \\
+    If~you~go~on,~it~will~be~ignored~for~\token_to_str:N \MultiArrow.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Too~small~specification~for~MultiArrow }
+  { 
+    The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\ 
+    is~too~small:~you~need~at~least~two~lines. \\
+    \c_@@_command_ignored_str
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Not~allowed~in~DispWithArrows }
+  { 
+    The~command~\token_to_str:N #1
+    is~allowed~only~in~the~last~column~
+    (column~\int_use:N\l_@@_nb_cols_int)~of~\{\l_@@_type_env_str\}. \\ 
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { Not~allowed~in~WithArrows }
+  { 
+    The~command~\token_to_str:N #1 is~not~allowed~in~\{\l_@@_type_env_str\}~
+    (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*LaTeX>
+\@@_msg_new:nn { tag*~without~amsmath }
+  { 
+    We~can't~use~\token_to_str:N\tag*~because~you~haven't~loaded~amsmath~
+    (or~mathtools). \\
+    If~you~go~on,~the~command~\token_to_str:N\tag\ 
+    will~be~used~instead.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Multiple~tags }
+  {
+    You~can't~use~twice~the~command~\token_to_str:N\tag\ 
+    in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\
+    If~you~go~on,~the~tag~'#1'~will~be~used.
+  }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Multiple~labels }
+  { 
+    Normally,~we~can't~use~the~command~\token_to_str:N\label\ 
+    twice~in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\
+    However,~you~can~go~on.~
+    \bool_if:NT \c_@@_showlabels_loaded_bool
+      { However,~only~the~last~label~will~be~shown~by~showlabels.~ }
+    If~you~don't~want~to~see~this~message~again,~you~can~use~the~option~
+    'allow-multiple-labels'~at~the~global~or~environment~level.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { Multiple~labels~with~cleveref }
+  {
+    Since~you~use~cleveref,~you~can't~use~the~command~\token_to_str:N\label\ 
+    twice~in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\
+    If~you~go~on,~you~may~have~undefined~references.
+  }
+%</LaTeX>
+%    \end{macrocode}
+%
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { Inexistent~v-node }
+  {
+    There~is~a~problem.~Maybe~you~have~put~a~command~\token_to_str:N\cr\
+    instead~of~a~command~\token_to_str:N\\~at~the~end~of~
+    the~row~\l_tmpa_int\
+    of~your~environment~\{\l_@@_type_env_str\}. \\
+    This~error~is~fatal.
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}          
+\@@_msg_new:nn { Option~xoffset~forbidden }
+  { 
+    You~can't~use~the~option~'xoffset'~in~the~command~
+    \l_@@_string_Arrow_for_msg_str\
+    while~you~are~using~the~option~
+    ' \int_compare:nNnTF \l_@@_pos_arrow_int = 7
+        { group } 
+        { groups } '. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\@@_msg_new:nnn { Duplicate~name }
+  { 
+    The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
+    the~same~environment~name~twice.~You~can~go~on,~but,~
+    maybe,~you~will~have~incorrect~results. \\
+    For~a~list~of~the~names~already~used,~type~H~<return>. \\ 
+    If~you~don't~want~to~see~this~message~again,~use~the~option~
+    'allow-duplicate-names'. 
+  }
+  {
+    The~names~already~defined~in~this~document~are:~
+    \seq_use:Nnnn \g_@@_names_seq { ,~ } { ,~ } { ~and~ }.
+  }
+%    \end{macrocode}
+%
+% 
+%
+% \subsection{The command \textbackslash WithArrowsNewStyle}
+%
+% A new key defined with |\WithArrowsNewStyle| will not be available at the
+% local level.
+%    \begin{macrocode}
+%<*LaTeX>
+\NewDocumentCommand \WithArrowsNewStyle { m m }
+%</LaTeX>
+%<*plain-TeX>
+\cs_new_protected:Npn \WithArrowsNewStyle #1 #2 
+%</plain-TeX>
+  { 
+    \keys_if_exist:nnTF { WithArrows / Global } { #1 }
+      { \@@_error:nn { Key~already~defined } { #1 } }
+      { 
+        \keys_define:nn { WithArrows / Global }
+          { 
+            #1 .code:n = 
+             { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } }
+          } 
+        \seq_put_right:Nx \l_@@_options_WithArrows_seq { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l_@@_options_DispWithArrows_seq 
+          { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l_@@_options_WithArrowsOptions_seq 
+          { \tl_to_str:N { #1 } }
+%    \end{macrocode}
+% We now set the options in a TeX group in order to detect if some keys in |#2|
+% are unknown. If a key is unknown, an error will be raised. However, the key
+% will, even so, be stored in the definition of key~|#1|. 
+%    \begin{macrocode}
+        \group_begin:
+          \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
+            {
+              The~key~'\l_keys_key_tl'~can't~be~set~in~the~
+              definition~of~a~style.~You~can~go~on~for~this~time~
+              but~you~should~suppress~this~key. 
+            }
+          \WithArrowsOptions { #2 }
+        \group_end:
+      } 
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { Key~already~defined }
+  {
+    The~key~'#1'~is~already~defined. \\
+    If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\ 
+    will~be~ignored.
+  }
+%    \end{macrocode}
+%
+%
+% \subsection{The options up and down}
+%
+% The options |up| and |down| are available for individual arrows. The
+% corresponding code is given here. It is independent of the main code of the
+% extension \pkg{witharrows}.
+% 
+% This code is the only part of the code of \pkg{witharrows} which uses the
+% package \pkg{varwidth} and also the Tikz library |calc|. That's why we have
+% decided not to load this package and this library. If they are not loaded, the
+% user will have an error only when using the option |up| or the option |down|.
+% 
+% \medskip
+% The token list |\c_@@_tikz_code_up_tl| is the value of |tikz-code| which will
+% be used for an option |up|.
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_tikz_code_up_tl
+  {
+    \draw [ rounded~corners ]
+       let \p1 = (#1) ,
+           \p2 = (#2)
+       in (\p1) -- node { 
+%<*LaTeX>
+                          \dim_set:Nn \l_tmpa_dim { \x2 - \x1 }
+                          \begin { varwidth } \l_tmpa_dim
+%    \end{macrocode}
+% |\narrowragged| is a command of the package \pkg{varwidth}.
+%    \begin{macrocode}
+                            \narrowragged
+                            #3
+                          \end { varwidth } 
+%</LaTeX>
+%<*plain-TeX>
+                            #3
+%</plain-TeX>
+                        } 
+          (\x2,\y1) -- (\p2) ;
+  }
+%    \end{macrocode}
+% 
+%
+% \medskip
+% Idem for the option |down|.
+%    \begin{macrocode}
+\tl_const:Nn \c_@@_tikz_code_down_tl
+  {
+    \draw [ rounded~corners ]
+      let \p1 = (#1) ,
+          \p2 = (#2)
+      in (\p1) -- (\x1,\y2) --
+               node {
+%<*LaTeX>
+                      \dim_set:Nn \l_tmpa_dim { \x1 - \x2 }
+                      \begin { varwidth } \l_tmpa_dim
+                        \narrowragged
+                        #3
+                      \end { varwidth }
+%</LaTeX>
+%<*plain-TeX>           
+                        #3
+%</plain-TeX>
+                    } 
+               (\p2) ;
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    up   .code:n = \@@_set_independent: ,
+    down .code:n = \@@_set_independent: ,
+    up   .default:n = NoValue ,
+    down .default:n = NoValue 
+  }
+%    \end{macrocode}
+% 
+% \bigskip
+%    \begin{macrocode}
+\keys_define:nn { WithArrows / Arrow / SecondPass }
+  { 
+    up .code:n =  
+      \str_if_empty:NT \l_@@_previous_key_str
+        { 
+          \str_set:Nn \l_@@_previous_key_str { up }
+%<*LaTeX>
+          \bool_if:NTF \c_@@_varwidth_loaded_bool
+            { 
+%</LaTeX>
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                { 
+                  \int_set:Nn \l_@@_pos_arrow_int \c_one_int
+%    \end{macrocode}
+% We have to set |\l_@@_wrap_lines_bool| to |false| because, otherwise, if the
+% option |wrap_lines| is used at a higher level (global or environment), we will
+% have a special affectation to |tikz-code| that will overwrite our affectation.
+%    \begin{macrocode}
+                  \bool_set_false:N \l_@@_wrap_lines_bool
+                  \tl_set_eq:NN \l_@@_tikz_code_tl 
+                    \c_@@_tikz_code_up_tl
+                }
+                { \@@_error:n { calc~not~loaded } }
+%<*LaTeX>
+            }
+            { \@@_error:n { varwidth~not~loaded } } 
+%</LaTeX>
+        } ,
+    down .code:n = 
+      \str_if_empty:NT \l_@@_previous_key_str
+        { 
+          \str_set:Nn \l_@@_previous_key_str { down }
+%<*LaTeX>
+          \bool_if:NTF \c_@@_varwidth_loaded_bool
+            { 
+%</LaTeX>
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                { 
+                  \int_set:Nn \l_@@_pos_arrow_int \c_one_int
+                  \bool_set_false:N \l_@@_wrap_lines_bool
+                  \tl_set_eq:NN \l_@@_tikz_code_tl 
+                    \c_@@_tikz_code_down_tl
+                }
+                { \@@_error:n { calc~not~loaded } }
+%<*LaTeX>
+            }
+            { \@@_error:n { varwidth~not~loaded } } 
+%</LaTeX>
+        }
+  }
+%    \end{macrocode}
+%
+%    
+% 
+%    \begin{macrocode}
+\seq_put_right:Nn \l_@@_options_Arrow_seq { down }
+\seq_put_right:Nn \l_@@_options_Arrow_seq { up }
+%    \end{macrocode}
+%
+%
+%    \begin{macrocode}
+\@@_msg_new:nn { varwidth~not~loaded } 
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~
+    you~don't~have~loaded~the~package~'varwidth'. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+% 
+%    \begin{macrocode}
+\@@_msg_new:nn { calc~not~loaded }
+  { 
+    You~can't~use~the~option~'\l_keys_key_tl'~because~you~don't~have~loaded~the~
+    Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}'~
+    ~in~the~preamble~of~your~document. \\
+    \c_@@_option_ignored_str
+  }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+%<*plain-TeX>
+\catcode `\@ = 12
+\ExplSyntaxOff
+%</plain-TeX>
+%    \end{macrocode}
+% 
+% \section{History}
+%
+% \subsection*{Changes between versions 1.0 and 1.1}
+% 
+% Option for the command |\\| and option |interline|
+% 
+% Compatibility with |\usetikzlibrary{babel}|
+%
+% Possibility of nested environments |{WithArrows}|
+% 
+%
+% \subsection*{Changes between versions 1.1 and 1.2}
+%
+% The package \pkg{witharrows} can now be loaded without having loaded
+% previously \pkg{tikz} and the libraries |arrow.meta| and |bending| (this
+% extension and these libraries are loaded silently by \pkg{witharrows}).
+%
+% New option |groups| (with a \emph{s})
+%
+% 
+% \subsection*{Changes between versions 1.2 and 1.3}
+% 
+% New options |ygap| and |ystart| for fine tuning.
+%
+% \subsection*{Changes between versions 1.3 and 1.4}
+% 
+% The package \pkg{footnote} is no longer loaded by default. Instead, two
+% options |footnote| and |footnotehyper| have been added. In particular,
+% \pkg{witharrows} becomes compatible with \cls{beamer}.
+% 
+% \subsection*{Changes between versions 1.4 and 1.5}
+% 
+% The Tikz code used to draw the arrows can be changed with the option
+% |tikz-code|.
+%
+% Two new options |code-before| and |code-after| have been added at the
+% environment level.
+%
+% A special version of |\Arrow| is available in |code-after| in order to draw
+% arrows in nested environments.
+% 
+% A command |\MultiArrow| is available in |code-after| to draw arrows of other
+% shapes.
+% 
+% \subsection*{Changes between versions 1.5 and 1.6}
+% 
+% The code has been improved to be faster and the Tikz library |calc| is no
+% longer required.
+%
+% A new option |name| is available for the environments |{WithArrows}|.
+%
+% \subsection*{Changes between 1.6 and 1.7}
+%
+% New environments |{DispWithArrows}| and |{DispWithArrows*}|.
+%
+% \subsection*{Changes between 1.7 and 1.8}
+%
+% The numbers and tags of the environment |{DispWithArrows}| are now compatible
+% with all the major LaTeX packages concerning references (\pkg{autonum},
+% \pkg{cleveref}, \pkg{fancyref}, \pkg{hyperref}, \pkg{prettyref},
+% \pkg{refstyle}, \pkg{typedref} and \pkg{varioref}) and with the options
+% |showonlyrefs| and |showmanualtags| of \pkg{mathtools}.
+%
+% \subsection*{Changes between 1.8 and 1.9}
+% 
+% New option |wrap-lines| for the environments |{DispWithArrows}| and
+% |{DispWithArrows*}|.
+%
+% \subsection*{Changes between 1.9 and 1.10}
+%
+% If the option |wrap-lines| is used, the option ``|text width|'' of Tikz is
+% still active: if the value given to ``|text width|'' is lower than the width
+% computed by |wrap-lines|, this value is used to wrap the lines.
+%
+% The option |wrap-lines| is now fully compatible with the class option |leqno|.
+%
+% Correction of a bug: |\nointerlineskip| and |\makebox[.6\linewidth]{}| should
+% be inserted in |{DispWithArrows}| only in vertical mode.
+%
+% \subsection*{Changes between 1.10 and 1.11}
+%
+% New commands |\WithArrowsNewStyle| and |\WithArrowsRightX|.
+%
+% \subsection*{Changes between 1.11 and 1.12}
+%
+% New command |\tagnextline|.
+%
+% New option |tagged-lines|.
+%
+% An option of position (|ll|, |lr|, |rl|, |rr| or |i|) is now allowed at the
+% local level even if the option |group| or the option |groups| is used at the
+% global or environment level.
+%
+% Compatibility of |{DispWithArrows}| with |\qedhere| of \pkg{amsthm}.
+%
+% Compatibility with the packages \pkg{refcheck}, \pkg{showlabels} and
+% \pkg{listlbls}.
+%
+% The option |\AllowLineWithoutAmpersand| is deprecated because lines without
+% ampersands are now always allowed.
+%
+% \subsection*{Changes between 1.12 and 1.13}
+%
+% Options |start-adjust|, |end-adjust| and |adjust|.
+% 
+% This version is not stricty compatible with previous ones. To restore the
+% behaviour of the previous versions, one has to use the option |adjust| with
+% the value $0$~pt:
+% 
+% \begin{Verbatim}
+% \WithArrowsOptions{adjust = 0pt}
+% \end{Verbatim}
+%
+% \subsection*{Changes between 1.13 and 1.14}
+%
+% New options |up| and |down| for the arrows.
+%
+% \smallskip
+% Replacement of some options |O { }| in commands and environments defined with
+% \pkg{xparse} by |! O { }| (a recent version of \pkg{xparse} introduced
+% the specifier |!| and modified the default behaviour of the last optional
+% arguments:
+% |//www.texdev.net/2018/04/21/xparse-optional-arguments-at-the-end|).
+%
+% \smallskip
+% Modification of the code of |\WithArrowsNewStyle| following a correction of a
+% bug in \pkg{l3keys} in the version of \pkg{l3kernel} of 2019/01/28.
+% 
+% New error message |Inexistent~v-node| to avoid a \pkg{pgf} error.
+%
+% The error |Option incompatible with 'group(s)'| was suppressed in the version
+% 1.12 but this was a mistake since this error is used with the option |xoffset|
+% at the local level. The error is put back.
+% 
+% \subsection*{Changes between 1.14 and 1.15}
+%
+% Option |new-group| to start a new group of arrows (only available when the
+% environment is composed with the option |groups|).
+%
+% Tikz externalization is now deactivated in the environments of the
+% extension \pkg{witharrows}.\footnote{Before this version, there was an error
+% when using \pkg{witharrows} with Tikz externalization. In any case, it's not
+% possible to externalize the Tikz elements constructed by \pkg{witharrows}
+% because they use the options |overlay| and |remember picture|.} 
+%
+% \subsection*{Changes between 1.15 and 1.16}
+%
+% Option |no-arrows| 
+%
+% The behaviour of |{DispWithArrows}| after an |\item| of a LaTeX list has been
+% changed : no vertical is added. The previous behaviour can be restored with
+% the option |standard-behaviour-with-items|.
+% 
+% A given name can no longer be used for two distinct environments. However,
+% it's possible to deactivate this control with the option
+% |allow-duplicate-names|.
+% 
+%
+% \subsection*{Changes between 1.16 and 1.17}
+% 
+% Option |format|
+%
+% \subsection*{Changes between 1.17 and 1.18}
+%
+% New option |<...>| for |{DispWithArrows}|.
+%
+% Option |subequations|.
+%
+% Warning when |{WithArrows}| or |{DispWithArrows}| ends by "\\".
+% 
+% No space before an environnement |{DispWithArrows}| if we are at the beginning
+% of a |{minipage}|.
+%
+% \subsection*{Changes between 1.18 and 2.0}
+% 
+% A version of \pkg{witharrows} is available for plain-TeX.
+% 
+% \PrintIndex
+%
+% \tableofcontents
+%
+% \endinput
+% Local Variables:
+% TeX-fold-mode: nil
+% fill-column: 80
+% End:


Property changes on: trunk/Master/texmf-dist/source/generic/witharrows/witharrows.dtx
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/source/generic/witharrows/witharrows.ins
===================================================================
--- trunk/Master/texmf-dist/source/generic/witharrows/witharrows.ins	                        (rev 0)
+++ trunk/Master/texmf-dist/source/generic/witharrows/witharrows.ins	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,48 @@
+%%
+%% Copyright (C) 2017-2019 by F. Pantigny
+%%
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version.  The latest version of this license is in:
+%%
+%%      http://www.latex-project.org/lppl.txt
+%%
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%%
+\input l3docstrip.tex
+\keepsilent
+\usedir{tex/latex/witharrows}
+\preamble
+
+Copyright (C) 2017-2019 by F. Pantigny
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 of this license or (at your option) any later
+version.  The latest version of this license is in:
+
+     http://www.latex-project.org/lppl.txt
+
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+\endpreamble
+\generate{\file{witharrows.sty}{\from{witharrows.dtx}{LaTeX}}
+          \file{witharrows.tex}{\from{witharrows.dtx}{plain-TeX}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space witharrows.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file witharrows.dtx}
+\Msg{* through XeLaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
+

Added: trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.sty	2019-07-30 21:00:57 UTC (rev 51778)
@@ -0,0 +1,2047 @@
+%%
+%% This is file `witharrows.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% witharrows.dtx  (with options: `LaTeX')
+%% 
+%% Copyright (C) 2017-2019 by F. Pantigny
+%% 
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version.  The latest version of this license is in:
+%% 
+%%      http://www.latex-project.org/lppl.txt
+%% 
+%% and version 1.3 or later is part of all distributions of
+%% LaTeX version 2005/12/01 or later.
+%% 
+\def\myfileversion{2.0}
+\def\myfiledate{2019/07/30}
+\RequirePackage{tikz}
+\RequirePackage{expl3}[2019/02/15]
+\usetikzlibrary{arrows.meta,bending}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+  {witharrows}
+  {\myfiledate}
+  {\myfileversion}
+  {Draws arrows for explanations on the right}
+\RequirePackage { xparse } [ 2018-10-17 ]
+\bool_new:N \g__wa_footnotehyper_bool
+\bool_new:N \g__wa_footnote_bool
+\cs_new_protected:Npn \__wa_msg_new:nn { \msg_new:nnn { witharrows } }
+\cs_new_protected:Npn \__wa_msg_new:nnn { \msg_new:nnnn { witharrows } }
+\cs_new_protected:Npn \__wa_msg_redirect_name:nn
+  { \msg_redirect_name:nnn { witharrows } }
+\cs_new_protected:Npn \__wa_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__wa_warning:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__wa_fatal:n { \msg_fatal:nn { witharrows } }
+\cs_new_protected:Npn \__wa_error:nn  { \msg_error:nnn { witharrows } }
+\cs_generate_variant:Nn \__wa_error:nn { n x }
+\keys_define:nn { WithArrows / package }
+  {
+    footnote .bool_gset:N = \g__wa_footnote_bool ,
+    footnotehyper .bool_gset:N = \g__wa_footnotehyper_bool ,
+    unknown .code:n =
+      \__wa_fatal:n { Option~unknown~for~package }
+  }
+\__wa_msg_new:nn { Option~unknown~for~package }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~when~loading~the~
+    package~witharrows.~Try~to~use~the~command~
+    \token_to_str:N\WithArrowsOptions.
+  }
+\ProcessKeysOptions { WithArrows / package }
+\__wa_msg_new:nn { Option~incompatible~with~Beamer }
+  {
+    The~option~'\l_keys_key_tl'\ is~incompatible~
+    with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes.
+  }
+\__wa_msg_new:nn { footnote~with~footnotehyper~package }
+  {
+    You~can't~use~the~option~'footnote'~because~the~package~
+    footnotehyper~has~already~been~loaded.~
+    If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~
+    within~the~environments~of~witharrows~will~be~extracted~with~the~tools~
+    of~the~package~footnotehyper.\\
+    If~you~go~on,~the~package~footnote~won't~be~loaded.
+  }
+\__wa_msg_new:nn { footnotehyper~with~footnote~package }
+  {
+    You~can't~use~the~option~'footnotehyper'~because~the~package~
+    footnote~has~already~been~loaded.~
+    If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~
+    within~the~environments~of~witharrows~will~be~extracted~with~the~tools~
+    of~the~package~footnote.\\
+    If~you~go~on,~the~package~footnotehyper~won't~be~loaded.
+  }
+\bool_if:NT \g__wa_footnote_bool
+  {
+    \@ifclassloaded { beamer }
+      { \msg_info:nn { witharrows } { Option~incompatible~with~Beamer } }
+      {
+        \@ifpackageloaded { footnotehyper }
+          { \__wa_error:n { footnote~with~footnotehyper~package } }
+          { \usepackage { footnote } }
+      }
+  }
+\bool_if:NT \g__wa_footnotehyper_bool
+  {
+    \@ifclassloaded { beamer }
+      { \__wa_info:n  { Option~incompatible~with~Beamer } }
+      {
+        \@ifpackageloaded { footnote }
+          { \__wa_error:n { footnotehyper~with~footnote~package } }
+          { \usepackage { footnotehyper } }
+      }
+    \bool_gset_true:N \g__wa_footnote_bool
+  }
+\bool_new:N \c__wa_leqno_bool
+\DeclareOption { leqno } { \bool_set_true:N \c__wa_leqno_bool }
+\DeclareOption* { }
+\ProcessOptions*
+\cs_generate_variant:Nn \tl_put_right:Nn { N v }
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
+\AtBeginDocument
+  {
+    \clist_map_inline:nn
+      {
+        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
+        typedref, unicode-math, varwidth
+      }
+      {
+        \bool_new:c { c__wa_#1_loaded_bool }
+        \@ifpackageloaded { #1 }
+          { \bool_set_true:c { c__wa_#1_loaded_bool } }
+          { }
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Npn \__wa_strcmp:nn  #1 #2
+      { \lua_now:e { l3kernel.strcmp('#1','#2') } }
+  }
+  {
+    \cs_new_protected:Npn \__wa_strcmp:nn #1 #2
+      { \pdftex_strcmp:D { #1 } { #2 } }
+  }
+\cs_new_protected:Npn \__wa_sort_seq:N #1
+  {
+    \seq_sort:Nn #1
+      {
+        \int_compare:nNnTF
+          {
+            \__wa_strcmp:nn
+              { \str_lower_case:n { ##1 } }
+              { \str_lower_case:n { ##2 } }
+          }
+          > 0
+          \sort_return_swapped:
+          \sort_return_same:
+      }
+  }
+\cs_new_protected:Npn \__wa_convert_to_str_seq:N #1
+  {
+    \seq_clear:N \l_tmpa_seq
+    \seq_map_inline:Nn #1
+      {
+        \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } }
+      }
+    \seq_set_eq:NN #1 \l_tmpa_seq
+  }
+\cs_new_protected:Npn \__wa_set_seq_of_str_from_clist:Nn #1 #2
+  {
+    \seq_set_from_clist:Nn #1 { #2 }
+    \__wa_convert_to_str_seq:N #1
+  }
+\cs_new_protected:Npn \__wa_save:N #1
+  {
+    \seq_set_split:Nxx \l_tmpa_seq
+       { \char_generate:nn { `_ } { 12 } }
+       { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _if_exist:cF }
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+      {
+        \use:c { \l_tmpa_str _new:c }
+          { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+      }
+    \use:c { \l_tmpa_str _gset_eq:cN }
+      { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1
+  }
+\cs_new_protected:Npn \__wa_restore:N #1
+  {
+    \seq_set_split:Nxx \l_tmpa_seq
+      { \char_generate:nn { `_ } { 12 } }
+      { \cs_to_str:N #1 }
+    \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl
+    \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } }
+    \use:c { \l_tmpa_str _set_eq:Nc }
+      #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ }
+  }
+\tikzset
+  {
+    __wa_node_style / .style =
+      {
+        above = \l__wa_ystart_dim ,
+        inner~sep = \c_zero_dim ,
+        minimum~width = \c_zero_dim ,
+        minimum~height = \l__wa_ygap_dim
+      }
+  }
+\tikzset
+  {
+    __wa_standard / .style =
+      {
+        remember~picture ,
+        overlay ,
+        name~prefix = wa - \l__wa_prefix_str -
+      }
+  }
+\tikzset
+  {
+    WithArrows / arrow / tips / .style =
+      { > = { Straight~Barb [ scale = 1.2 , bend ] } }
+  }
+\tikzset
+ {
+   WithArrows / arrow / .style  =
+     {
+       align = left ,
+       auto = left ,
+       font = \small \itshape ,
+       WithArrows / arrow / tips ,
+       bend~left = 45 ,
+       ->
+     }
+ }
+\AtBeginDocument
+  {
+    \bool_if:NTF \c__wa_amsmath_loaded_bool
+      {
+        \seq_put_right:Nn \l__wa_options_WithArrowsOptions_seq { subequations }
+        \seq_put_right:Nn \l__wa_options_DispWithArrows_seq { subequations }
+      }
+      {
+        \cs_new_protected:Npn \spread at equation
+          {
+            \openup \jot
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:
+          }
+      }
+  }
+\tl_new:N \l__wa_left_brace_tl
+\tl_set_eq:NN \l__wa_left_brace_tl \c_novalue_tl
+\bool_new:N \l__wa_in_WithArrows_bool
+\bool_new:N \l__wa_in_DispWithArrows_bool
+\bool_new:N \l__wa_in_code_after_bool
+\seq_new:N \g__wa_position_in_the_tree_seq
+\seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
+\int_new:N \g__wa_last_env_int
+\int_new:N \l__wa_pos_env_int
+\int_new:N \l__wa_pos_arrow_int
+\int_set:Nn \l__wa_pos_arrow_int 3
+\seq_new:N \g__wa_arrow_int_seq
+\int_new:N \g__wa_arrow_int
+\seq_new:N \g__wa_line_int_seq
+\int_new:N \g__wa_line_int
+\seq_new:N \g__wa_col_int_seq
+\int_new:N \g__wa_col_int
+\clist_new:N \l__wa_tags_clist
+\clist_set:Nn \l__wa_tags_clist { all }
+\cs_new_protected:Npn \__wa_test_if_to_tag:
+  {
+    \clist_if_in:NVT \l__wa_tags_clist \g__wa_line_int
+      { \clist_set:Nn \l__wa_tags_clist { all } }
+  }
+\str_new:N \l__wa_command_name_str
+\str_set:Nn \l__wa_command_name_str { Arrow }
+\str_new:N \l__wa_string_Arrow_for_msg_str
+\str_set:Nx \l__wa_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+\seq_new:N \g__wa_names_seq
+\bool_new:N \l__wa_sbwi_bool
+\bool_new:N \l__wa_tag_star_bool
+\bool_new:N \l__wa_tag_next_line_bool
+\bool_new:N \l__wa_qedhere_bool
+\bool_new:N \l__wa_in_first_columns_bool
+\bool_new:N \l__wa_new_group_bool
+\bool_new:N \l__wa_initial_r_bool
+\bool_new:N \l__wa_final_r_bool
+\tl_new:N \l__wa_initial_tl
+\tl_new:N \l__wa_final_tl
+\int_new:N \l__wa_nb_cols_int
+\str_new:N \l__wa_format_str
+\bool_new:N \l__wa_subequations_bool
+\cs_new_protected:Npn \__wa_eval_if_allowed:n #1
+  {
+    \str_if_empty:NTF \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        #1
+      }
+      { \__wa_error:n { Incompatible~options } }
+  }
+\cs_new_protected:Npn \__wa_fix_pos_option:n #1
+  { \__wa_eval_if_allowed:n { \int_set:Nn \l__wa_pos_arrow_int { #1 } } }
+\keys_define:nn { WithArrows / Global }
+  {
+    ygap .dim_set:N = \l__wa_ygap_dim ,
+    ygap .value_required:n = true ,
+    ygap .initial:n = 0.4 ex ,
+    ystart .dim_set:N = \l__wa_ystart_dim ,
+    ystart .value_required:n = true ,
+    ystart .initial:n = 0.4 ex ,
+    more-columns .code:n =
+      \__wa_msg_redirect_name:nn { Too~much~columns~in~WithArrows } { none } ,
+    more-columns .value_forbidden:n = true,
+    command-name .code:n =
+      \str_set:Nn \l__wa_command_name_str { #1 }
+      \str_set:Nx \l__wa_string_Arrow_for_msg_str
+        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+    command-name .value_required:n = true ,
+    tikz-code .tl_set:N = \l__wa_tikz_code_tl,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz-code .value_required:n = true ,
+    TikzCode .meta:n = { tikz-code = #1 } ,
+    displaystyle .bool_set:N = \l__wa_displaystyle_bool ,
+    displaystyle .default:n = true ,
+    show-nodes .code:n =
+      \tikzset { __wa_node_style / .append~style = { draw , red } } ,
+    show-nodes .value_forbidden:n = true,
+    show-node-names .bool_set:N = \l__wa_show_node_names_bool ,
+    show-node-names .default:n = true ,
+    group .code:n =
+      \str_if_empty:NTF \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { group }
+          \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__wa_pos_arrow_int 7
+        }
+        { \__wa_error:n { Incompatible~options } } ,
+    group .value_forbidden:n = true ,
+    groups .code:n =
+      \str_if_empty:NTF \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { groups }
+          \seq_if_in:NnF \l__wa_options_Arrow_seq { new-group }
+            { \seq_put_right:Nn \l__wa_options_Arrow_seq { new-group } }
+          \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__wa_pos_arrow_int 6
+        }
+        { \__wa_error:n { Incompatible~options } } ,
+    groups .value_forbidden:n = true ,
+    tikz   .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz   .initial:n         = \c_empty_tl ,
+    tikz   .value_required:n  = true ,
+    rr     .value_forbidden:n = true ,
+    rr     .code:n            = \__wa_fix_pos_option:n 3 ,
+    ll     .value_forbidden:n = true ,
+    ll     .code:n            = \__wa_fix_pos_option:n 1 ,
+    rl     .value_forbidden:n = true ,
+    rl     .code:n            = \__wa_fix_pos_option:n 2 ,
+    lr     .value_forbidden:n = true ,
+    lr     .code:n            = \__wa_fix_pos_option:n 0 ,
+    i      .value_forbidden:n = true ,
+    i      .code:n            = \__wa_fix_pos_option:n 5 ,
+    xoffset .dim_set:N  = \l__wa_xoffset_dim ,
+    xoffset .value_required:n  = true ,
+    xoffset .initial:n = 3 mm ,
+    jot .dim_set:N = \jot ,
+    jot .value_required:n = true ,
+    interline .skip_set:N = \l__wa_interline_skip ,
+    interline .value_required:n = true ,
+    start-adjust .dim_set:N = \l__wa_start_adjust_dim ,
+    start-adjust .value_required:n = true ,
+    start-adjust .initial:n = 0.4 ex ,
+    end-adjust .dim_set:N = \l__wa_end_adjust_dim ,
+    end-adjust .value_required:n = true ,
+    end-adjust .initial:n = 0.4 ex ,
+    adjust .meta:n  = { start-adjust = #1 , end-adjust = #1 } ,
+    adjust .value_required:n = true ,
+    no-arrows .code:n =
+      \cs_set_eq:NN \__wa_draw_arrows:nn \use_none:nn
+      \cs_set_eq:NN \__wa_draw_arrow:nnn \use_none:nnn  ,
+    no-arrows .value_forbidden:n = true ,
+  }
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+  {
+    t   .code:n            = \int_set:Nn \l__wa_pos_env_int O ,
+    t   .value_forbidden:n = true ,
+    c   .code:n            = \int_set:Nn \l__wa_pos_env_int 1 ,
+    c   .value_forbidden:n = true ,
+    b   .code:n            = \int_set:Nn \l__wa_pos_env_int 2 ,
+    b   .value_forbidden:n = true
+  }
+\clist_new:N \c__wa_extensible_delimiters_clist
+\clist_set:Nn \c__wa_extensible_delimiters_clist
+  {
+    ., \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor
+  }
+\AtBeginDocument
+  {
+    \bool_if:nT
+      { \c__wa_amsmath_loaded_bool || \use:c { c__wa_unicode-math_loaded_bool } }
+      {
+        \clist_put_right:Nn \c__wa_extensible_delimiters_clist { \lvert, \lVert }
+      }
+  }
+\keys_define:nn { WithArrows / DispWithArrowsSpecific }
+  {
+    fleqn .bool_set:N = \l__wa_fleqn_bool ,
+    fleqn .default:n = true ,
+    mathindent .dim_set:N = \l__wa_mathindent_dim ,
+    mathindent .value_required:n = true ,
+    mathindent .initial:n = 25 pt ,
+    notag .code:n =
+      \str_if_eq:nnTF { #1 } { true }
+        { \clist_clear:N \l__wa_tags_clist }
+        { \clist_set:Nn \l__wa_tags_clist { all } } ,
+    notag .default:n = true ,
+    subequations .code:n =
+      \bool_if:NTF \c__wa_amsmath_loaded_bool
+        { \bool_set_true:N \l__wa_subequations_bool }
+        {
+          \__wa_error:n { amsmath~not~loaded }
+          \group_begin:
+          \globaldefs = 1
+          \__wa_msg_redirect_name:nn { amsmath~not~loaded } { info }
+          \group_end:
+        } ,
+    subequations .default:n = true ,
+    subequations .value_forbidden:n = true ,
+    nonumber .meta:n = notag ,
+    allow-multiple-labels .code:n =
+      \__wa_msg_redirect_name:nn { Multiple~labels } { none } ,
+    allow-multiple-labels .value_forbidden:n = true ,
+    tagged-lines .code:n =
+      \clist_set:Nn \l__wa_tags_clist { #1 }
+      \clist_if_in:NnT \l__wa_tags_clist { first }
+        {
+          \clist_remove_all:Nn \l__wa_tags_clist { first }
+          \clist_put_left:Nn \l__wa_tags_clist \c_one_int
+        } ,
+    tagged-lines .value_required:n = true ,
+    wrap-lines .bool_set:N = \l__wa_wrap_lines_bool ,
+    wrap-lines .default:n = true ,
+    replace-left-brace-by .code:n =
+      {
+        \tl_set:Nx \l_tmpa_tl { \tl_head:n { #1 } }
+        \clist_if_in:NVTF
+          \c__wa_extensible_delimiters_clist
+          \l_tmpa_tl
+          { \tl_set:Nn \l__wa_replace_left_brace_by_tl { #1 } }
+          { \__wa_error:n { Bad~value~for~replace~brace~by } }
+      } ,
+    replace-left-brace-by .initial:n = \lbrace ,
+    standard-behaviour-with-items .bool_set:N = \l__wa_sbwi_bool ,
+    standard-behaviour-with-items .default:n = true
+  }
+\keys_define:nn { WithArrows / Env }
+  {
+    name .code:n =
+      \str_set:Nn \l_tmpa_str { #1 }
+      \seq_if_in:NVTF \g__wa_names_seq \l_tmpa_str
+        { \__wa_error:n { Duplicate~name } }
+        { \seq_gput_left:NV \g__wa_names_seq \l_tmpa_str }
+      \str_set_eq:NN \l__wa_name_str \l_tmpa_str ,
+    name .value_required:n = true ,
+    code-before .code:n = \tl_put_right:Nn \l__wa_code_before_tl { #1 } ,
+    code-before .value_required:n = true,
+    CodeBefore .meta:n = { code-before = #1 } ,
+    code-after .code:n = \tl_put_right:Nn \l__wa_code_after_tl { #1 } ,
+    code-after .value_required:n = true ,
+    CodeAfter  .meta:n = { code-after = #1 } ,
+    format .code:n =
+      \tl_if_empty:nTF { #1 }
+        { \__wa_error:n { Invalid~option~format } }
+        {
+          \regex_match:nnTF { \A[rcl]*\Z } { #1 }
+            { \tl_set:Nn \l__wa_format_str { #1 } }
+            { \__wa_error:n { Invalid~option~format } }
+        } ,
+    format .value_required:n = true ,
+  }
+\keys_define:nn { WithArrows }
+  {
+    WithArrows .inherit:n =
+      {
+        WithArrows / Global ,
+        WithArrows / WithArrowsSpecific ,
+        WithArrows / Env
+      } ,
+    DispWithArrows .inherit:n =
+      {
+        WithArrows / DispWithArrowsSpecific ,
+        WithArrows / Global ,
+        WithArrows / Env ,
+      } ,
+    WithArrowsOptions .inherit:n =
+      {
+        WithArrows / Global ,
+        WithArrows / WithArrowsSpecific ,
+        WithArrows / DispWithArrowsSpecific
+      }
+  }
+\seq_new:N \l__wa_options_WithArrows_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_WithArrows_seq
+  {
+    adjust, b, c, code-after, code-before, command-name,
+    displaystyle, end-adjust,
+    format, group, groups, i,
+    interline, jot, ll,
+    lr, more-columns, name,
+    no-arrows, rl, rr,
+    show-node-names, show-nodes, start-adjust,
+    t, tikz, tikz-code,
+    xoffset, ygap, ystart
+  }
+\__wa_convert_to_str_seq:N \l__wa_options_WithArrows_seq
+\keys_define:nn { WithArrows / WithArrows }
+  {
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_WithArrows_seq
+      \__wa_error:n { Unknown~option~WithArrows }
+  }
+\keys_define:nn { WithArrows / DispWithArrows }
+  {
+    left-brace .tl_set:N = \l__wa_left_brace_tl ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_DispWithArrows_seq
+      \__wa_error:n { Unknown~option~DispWithArrows }
+  }
+\seq_new:N \l__wa_options_DispWithArrows_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_DispWithArrows_seq
+  {
+    code-after, code-before, command-name, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot,
+    left-brace, ll, lr, mathindent, name, no-arrows, replace-left-brace-by, rl,
+    rr, show-node-names, show-nodes, start-adjust, tikz, wrap-lines, xoffset,
+    ygap, ystart,
+    allow-multiple-labels, tagged-lines, nonumber, notag
+  }
+\keys_define:nn { WithArrows / WithArrowsOptions }
+  {
+    allow-duplicate-names .code:n =
+      \__wa_msg_redirect_name:nn { Duplicate~name } { none } ,
+    allow-duplicate-names .value_forbidden:n = true ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_WithArrowsOptions_seq
+      \__wa_error:n { Unknown~option~WithArrowsOptions }
+  }
+\seq_new:N \l__wa_options_WithArrowsOptions_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_WithArrowsOptions_seq
+  {
+    allow-duplicate-names, b, c, command-name, more-columns, tikz-code, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+    mathindent, no-arrows, rl, rr, show-node-names, show-nodes, start-adjust, t,
+    tikz, wrap-lines, xoffset, ygap, ystart,
+    allow-multiple-labels, nonumber, notag, standard-behaviour-with-items,
+    tagged-lines
+  }
+\cs_new_protected:Npn \__wa_set_independent:
+  {
+    \str_if_empty:NTF \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        \str_set:Nn \l__wa_status_arrow_str { independent }
+        \str_if_eq:VnF \l_keys_value_tl { NoValue }
+          { \__wa_error:n { Value~for~a~key } }
+      }
+      { \__wa_error:n { Incompatible~options~in~Arrow } }
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    jump .code:n =
+      \int_compare:nTF { #1 > 0 }
+        { \int_set:Nn \l__wa_jump_int { #1 } }
+        { \__wa_error:n { Negative~jump } } ,
+    jump .value_required:n  = true,
+    rr .code:n = \__wa_set_independent: ,
+    ll .code:n = \__wa_set_independent: ,
+    rl .code:n = \__wa_set_independent: ,
+    lr .code:n = \__wa_set_independent: ,
+    i  .code:n = \__wa_set_independent: ,
+    rr .default:n = NoValue ,
+    ll .default:n = NoValue ,
+    rl .default:n = NoValue ,
+    lr .default:n = NoValue ,
+    i  .default:n = NoValue ,
+    new-group .value_forbidden:n = true,
+    new-group .code:n =
+      \int_compare:nTF { \l__wa_pos_arrow_int = 6 }
+        { \str_set:Nn \l__wa_status_arrow_str { new-group } }
+        { \__wa_error:n { new-group~without~groups } } ,
+    tikz-code .code:n = \prg_do_nothing: ,
+    tikz-code .value_required:n = true ,
+    tikz .code:n = \prg_do_nothing: ,
+    tikz .value_required:n = true ,
+    xoffset .code:n =
+      \int_compare:nNnT \l__wa_pos_arrow_int > 5
+        { \__wa_error:n { Option~xoffset~forbidden } } ,
+    xoffset .value_required:n = true ,
+    start-adjust .code:n = \prg_do_nothing: ,
+    start-adjust .value_required:n = true ,
+    end-adjust .code:n = \prg_do_nothing: ,
+    end-adjust .value_required:n = true ,
+    adjust .code:n  = \prg_do_nothing: ,
+    adjust .value_required:n = true ,
+    unknown .code:n =
+      \__wa_sort_seq:N \l__wa_options_Arrow_seq
+      \seq_if_in:NVTF \l__wa_options_WithArrows_seq \l_keys_key_tl
+        {
+          \str_set:Nn \l_tmpa_str
+           { ~However,~this~key~can~be~used~in~the~options~of~\{WithArrows\}. }
+        }
+        { \str_clear:N \l_tmpa_str }
+      \__wa_error:n { Unknown~option~in~Arrow }
+  }
+\seq_new:N \l__wa_options_Arrow_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_Arrow_seq
+  {
+    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, tikz-code,
+    xoffset
+  }
+\cs_new_protected:Npn \__wa_fix_pos_arrow:n #1
+  {
+    \str_if_empty:NT \l__wa_previous_key_str
+      {
+        \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl
+        \int_set:Nn \l__wa_pos_arrow_int { #1 }
+      }
+  }
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+  {
+    tikz-code .tl_set:N = \l__wa_tikz_code_tl ,
+    tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz .initial:n = \c_empty_tl ,
+    rr .code:n = \__wa_fix_pos_arrow:n 3 ,
+    ll .code:n = \__wa_fix_pos_arrow:n 1 ,
+    rl .code:n = \__wa_fix_pos_arrow:n 2 ,
+    lr .code:n = \__wa_fix_pos_arrow:n 0 ,
+    i  .code:n = \__wa_fix_pos_arrow:n 5 ,
+    xoffset .code:n  =
+      \int_compare:nNnF \l__wa_pos_arrow_int > 5
+        { \dim_set:Nn \l__wa_xoffset_dim { #1 } } ,
+    start-adjust .dim_set:N = \l__wa_start_adjust_dim,
+    end-adjust .dim_set:N = \l__wa_end_adjust_dim,
+    adjust .code:n  =
+      \dim_set:Nn \l__wa_start_adjust_dim { #1 }
+      \dim_set:Nn \l__wa_end_adjust_dim { #1 } ,
+  }
+\NewDocumentCommand \WithArrowsOptions { m }
+  {
+    \str_clear_new:N \l__wa_previous_key_str
+    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
+  }
+\NewDocumentCommand \__wa_Arrow { O { } m ! O { } }
+  {
+    \int_gincr:N \g__wa_arrow_int
+    \str_clear_new:N \l__wa_previous_key_str
+    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 }
+    \prop_put:NnV \l_tmpa_prop { initial } \g__wa_line_int
+    \int_set:Nn \l_tmpa_int { \g__wa_line_int + \l__wa_jump_int }
+    \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int
+    \prop_put:NnV \l_tmpa_prop { status } \l__wa_status_arrow_str
+    \prop_put:Nnn \l_tmpa_prop { options } { #1 , #3 }
+    \prop_put:Nnn \l_tmpa_prop { label } { #2 }
+    \prop_put:Nnx \l_tmpa_prop { input-line } \msg_line_number:
+    \prop_gclear_new:c
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop }
+    \prop_gset_eq:cN
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop }
+      \l_tmpa_prop
+  }
+\cs_new_protected:Npn \__wa_Arrow_first_columns:
+  { \__wa_error:n { Arrow~not~in~last~column } \__wa_Arrow }
+\cs_new_protected:Npn \__wa_pre_halign:n #1
+  {
+    \str_clear_new:N \l__wa_type_env_str
+    \str_set:NV \l__wa_type_env_str \@currenvir
+    \cs_if_exist:NT \tikz at library@external at loaded
+      { \tikzset { external / export = false } }
+    \str_clear_new:N \l__wa_name_str
+    \str_clear_new:N \l__wa_status_arrow_str
+    \dim_zero_new:N \l__wa_x_dim
+    \str_clear_new:N \l__wa_input_line_str
+    \seq_gput_right:NV \g__wa_arrow_int_seq \g__wa_arrow_int
+    \int_gzero:N \g__wa_arrow_int
+    \seq_gput_right:NV \g__wa_line_int_seq \g__wa_line_int
+    \int_gzero:N \g__wa_line_int
+    \seq_gput_right:NV \g__wa_col_int_seq \g__wa_col_int
+    \int_gzero:N \g__wa_col_int
+    \int_gzero_new:N \g__wa_static_col_int
+    \seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
+    \seq_set_eq:NN \l_tmpa_seq \g__wa_position_in_the_tree_seq
+    \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
+    \str_clear_new:N \l__wa_prefix_str
+    \str_set:Nx \l__wa_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - }
+    \cs_set_eq:NN \\ \__wa_cr:
+    \dim_zero:N \mathsurround
+    \int_zero_new:N \l__wa_initial_int
+    \int_zero_new:N \l__wa_final_int
+    \int_zero_new:N \l__wa_arrow_int
+    \int_zero_new:N \l__wa_pos_of_arrow_int
+    \int_zero_new:N \l__wa_jump_int
+    \int_set:Nn \l__wa_jump_int \c_one_int
+    \str_set:Nn \l__wa_format_str { rl }
+    \seq_clear_new:N \l__wa_labels_seq
+    \bool_set_false:N \l__wa_tag_next_line_bool
+    \skip_zero:N \l__wa_interline_skip
+    \tl_clear_new:N \l__wa_code_before_tl
+    \tl_clear_new:N \l__wa_code_after_tl
+    \str_clear_new:N \l__wa_previous_key_str
+    \bool_if:NT \l__wa_in_WithArrows_bool
+      { \keys_set:nn { WithArrows / WithArrows } { #1 } }
+    \bool_if:NT \l__wa_in_DispWithArrows_bool
+      { \keys_set:nn { WithArrows / DispWithArrows } { #1 } }
+    \cs_set_eq:cN \l__wa_command_name_str \__wa_Arrow_first_columns:
+    \int_set:Nn \l__wa_nb_cols_int { \str_count:N \l__wa_format_str }
+    \int_gset_eq:NN \g__wa_col_int \l__wa_nb_cols_int
+    \seq_clear_new:N \l__wa_format_seq
+    \seq_set_split:NnV \l__wa_format_seq { } \l__wa_format_str
+    \bool_if:NT \g__wa_footnote_bool { \begin { savenotes } }
+    \l__wa_code_before_tl
+    \spread at equation
+    \cs_set_eq:NN \notag \__wa_notag:
+    \cs_set_eq:NN \nonumber \__wa_nonumber:
+    \cs_set_eq:NN \tag \__wa_tag
+    \cs_set_eq:NN \__wa_old_label \label
+    \cs_set_eq:NN \label \__wa_label:n
+    \cs_set_eq:NN \tagnextline \__wa_tagnextline:
+  }
+\cs_new_protected:Npn \__wa_construct_halign:
+  {
+    \seq_pop_right:NNTF \l__wa_format_seq \l__wa_type_col_str
+      {
+        \use:x
+          {
+            \int_gdecr:N \g__wa_col_int
+            \__wa_construct_halign:
+            \int_compare:nNnT \g__wa_col_int = \l__wa_nb_cols_int
+              {
+                \cs_set_eq:cN { \l__wa_command_name_str } \__wa_Arrow
+                \bool_if:NT \l__wa_in_DispWithArrows_bool
+                  {
+                    \__wa_test_if_to_tag:
+                    \bool_if:NT \c__wa_amsthm_loaded_bool \__wa_set_qedhere:
+                  }
+              }
+            \str_if_eq:VnT \l__wa_type_col_str { c } \hfil
+            \str_if_eq:VnT \l__wa_type_col_str { r } \hfill
+            \int_gincr:N \g__wa_col_int
+            \int_gset:Nn \g__wa_static_col_int { \int_use:N \g__wa_col_int }
+            \c_math_toggle_token
+              {
+                { }
+                \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+                ####
+              }
+            \c_math_toggle_token
+            \int_compare:nNnTF \g__wa_col_int = \l__wa_nb_cols_int
+              { \__wa_construct_nodes: }
+              {
+                \str_if_eq:VnT \l__wa_type_col_str { l } \hfil
+                \str_if_eq:VnT \l__wa_type_col_str { c } \hfil
+                \bool_if:NT \l__wa_in_DispWithArrows_bool { \tabskip = \c_zero_skip }
+                &
+              }
+          }
+      }
+      {
+        \bool_if:NTF \l__wa_in_WithArrows_bool
+          {
+            \ialign
+            \bgroup
+          }
+          {
+            \halign to \l__wa_linewidth_dim
+            \bgroup
+            \bool_if:NT \l__wa_fleqn_bool
+              { \skip_horizontal:N \l__wa_mathindent_dim }
+          }
+        \int_gincr:N \g__wa_line_int
+        \int_gzero:N \g__wa_col_int
+        \tl_if_eq:NNF \l__wa_left_brace_tl \c_novalue_tl
+          {
+            \skip_horizontal:n
+              { \box_wd:N \l__wa_left_brace_box + \l__wa_delim_wd_dim }
+          }
+        \strut
+      }
+  }
+\cs_new_protected:Npn \__wa_construct_nodes:
+  {
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __wa_node_style ,
+          name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - l ,
+          alias =
+            {
+              \str_if_empty:NF \l__wa_name_str
+                { \l__wa_name_str - \int_use:N \g__wa_line_int - l }
+            }
+        ]
+        ;
+    \hfil
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __wa_node_style ,
+          name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r ,
+          alias =
+            {
+              \str_if_empty:NF \l__wa_name_str
+                { \l__wa_name_str - \int_use:N \g__wa_line_int - r }
+            }
+        ]
+        ;
+    \bool_if:NT \l__wa_show_node_names_bool
+      {
+        \hbox_overlap_right:n
+          { \small wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r }
+      }
+  }
+\NewDocumentEnvironment { WithArrows } { ! O { } }
+  {
+    \bool_set_true:N \l__wa_in_WithArrows_bool
+    \bool_set_false:N \l__wa_in_DispWithArrows_bool
+    \__wa_pre_halign:n { #1 }
+    \if_mode_math: \else:
+      \__wa_error:n { WithArrows~outside~math~mode }
+    \fi:
+    \int_case:nn \l__wa_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+    \bgroup
+    \__wa_construct_halign:
+    &&
+    \__wa_error:n { Too~much~columns~in~WithArrows }
+    \c_math_toggle_token
+    \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+    { ## }
+    \c_math_toggle_token
+    \cr
+  }
+  {
+    \\
+    \egroup
+    \egroup
+    \__wa_post_halign:
+    \bool_if:NT \g__wa_footnote_bool { \end { savenotes } }
+  }
+\cs_new_protected:Npn \__wa_post_halign:
+  {
+    \cs_set:Npn \WithArrowsRightX { \g__wa_right_x_dim }
+    \int_compare:nNnT \g__wa_arrow_int > 0 \__wa_scan_arrows:
+    \group_begin:
+      \tikzset { every~picture / .style = __wa_standard }
+      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__wa_line_int }
+      \cs_set_eq:NN \MultiArrow \__wa_MultiArrow:nn
+      \cs_set_eq:cN \l__wa_command_name_str \__wa_Arrow_code_after
+      \bool_set_true:N \l__wa_in_code_after_bool
+      \l__wa_code_after_tl
+    \group_end:
+    \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gput_right:Nx \g__wa_position_in_the_tree_seq
+      { \int_eval:n { \l_tmpa_tl + 1 } }
+    \int_compare:nNnT { \seq_count:N \g__wa_position_in_the_tree_seq } = 1
+      { \int_gincr:N \g__wa_last_env_int }
+    \seq_gpop_right:NN \g__wa_arrow_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_arrow_int \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_line_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_line_int \l_tmpa_tl
+    \seq_gpop_right:NN \g__wa_col_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__wa_col_int \l_tmpa_tl
+  }
+\cs_new_protected:Npn \__wa_cr:
+  {
+    \scan_stop:
+    \int_compare:nNnF \g__wa_col_int = \g__wa_static_col_int
+      { \__wa_error:n { omit~probably~used } }
+    \prg_replicate:nn { \l__wa_nb_cols_int - \g__wa_static_col_int } { & { } }
+    \group_align_safe_begin:
+    \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i:
+  }
+\cs_new_protected:Npn \__wa_cr_i:
+  { \peek_meaning:NTF [ \__wa_cr_ii: { \__wa_cr_ii: [ \c_zero_dim ] } }
+\cs_new_protected:Npn \__wa_cr_ii: [ #1 ]
+  {
+    \peek_meaning_ignore_spaces:NTF \end
+      {
+        \__wa_cr_iii:n { #1 }
+        \__wa_analyze_end:Nn
+      }
+      { \__wa_cr_iii:n { #1 } }
+  }
+\cs_new_protected:Npn \__wa_cr_iii:n #1
+  {
+    \group_align_safe_end:
+    \bool_if:NT \l__wa_in_DispWithArrows_bool
+      {
+        \clist_if_in:NnTF \l__wa_tags_clist { all }
+          {
+            \tl_if_empty:NT \l__wa_tag_tl { \int_gincr:N \c at equation }
+            \cs_gset:Npx \g_tmpa_tl
+              { \tl_if_empty:NTF \l__wa_tag_tl \theequation \l__wa_tag_tl }
+            \seq_if_empty:NF \l__wa_labels_seq
+              {
+                \cs_set:Npx \@currentlabel { \p at equation \g_tmpa_tl }
+                \bool_if:NT \c__wa_hyperref_loaded_bool
+                  {
+                    \str_set:Nn \This at name { equation }
+                    \hyper at refstepcounter { equation }
+                  }
+                \bool_if:NT \c__wa_cleveref_loaded_bool
+                  {
+                    \cref at constructprefix { equation } \cref at result
+                    \protected at edef \cref at currentlabel
+                      {
+                        [
+                          \cs_if_exist:NTF \cref at equation@alias
+                            \cref at equation@alias
+                            { equation }
+                        ]
+                        [ \arabic { equation } ] [ \cref at result ]
+                        \p at equation \g_tmpa_tl
+                      }
+                  }
+                \seq_map_function:NN \l__wa_labels_seq \__wa_old_label
+              }
+            \__wa_save:N \l__wa_tag_star_bool
+            \__wa_save:N \l__wa_qedhere_bool
+            \bool_if:NT \l__wa_tag_next_line_bool
+              {
+                \openup -\jot
+                \bool_set_false:N \l__wa_tag_next_line_bool
+                \notag \\ &
+              }
+            &
+            \__wa_restore:N \l__wa_tag_star_bool
+            \__wa_restore:N \l__wa_qedhere_bool
+            \bool_if:NT \l__wa_qedhere_bool
+               { \hbox_overlap_left:n \__wa_qedhere_i: }
+            \cs_set_eq:NN \theequation \g_tmpa_tl
+            \bool_if:NT \l__wa_tag_star_bool
+              { \cs_set_eq:NN \tagform@ \prg_do_nothing: }
+            \hbox_overlap_left:n
+              {
+                \bool_if:NF \c__wa_leqno_bool
+                  {
+                    \tikz [ __wa_standard ]
+                      \coordinate ( \int_use:N \g__wa_line_int - v ) ;
+                  }
+                \quad
+                \@eqnnum
+              }
+            \bool_if:NT \c__wa_leqno_bool
+              {
+                \tikz [ __wa_standard ]
+                  \coordinate ( \int_use:N \g__wa_line_int - v ) ;
+              }
+          }
+          {
+            \__wa_save:N \l__wa_qedhere_bool
+            &
+            \__wa_restore:N \l__wa_qedhere_bool
+            \bool_if:NT \l__wa_qedhere_bool
+               { \hbox_overlap_left:n \__wa_qedhere_i: }
+            \tikz [ __wa_standard ]
+               \coordinate ( \int_use:N \g__wa_line_int - v ) ;
+          }
+      }
+    \dim_compare:nNnT { #1 } < \c_zero_dim
+       { \__wa_error:n { option~of~cr~negative } }
+
+    \cr
+    \noalign
+      {
+        \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim }
+        \skip_vertical:n { \l_tmpa_dim + \l__wa_interline_skip }
+        \scan_stop:
+      }
+  }
+\cs_new_protected:Npn \__wa_analyze_end:Nn #1 #2
+  {
+    \exp_args:NV \str_if_eq:nnT \l__wa_type_env_str { #2 }
+      { \__wa_warning:n { newline~at~the~end~of~env } }
+    \end { #2 }
+  }
+\bool_new:N \l__wa_in_label_or_minipage_bool
+\NewDocumentEnvironment { DispWithArrows } { ! d < > ! O { } }
+  {
+    \bool_set_true:N \l__wa_in_DispWithArrows_bool
+    \bool_if:nT \c__wa_mathtools_loaded_bool
+      {
+        \MH_if_boolean:nT { show_only_refs }
+          {
+            \MT_showonlyrefs_false:
+            \MH_set_boolean_T:n { show_only_refs }
+          }
+      }
+    \bool_if:NT \c__wa_typedref_loaded_bool { \str_set:Nn \sr at name { equation } }
+    \bool_if:NT \c__wa_amsmath_loaded_bool \intertext@
+    \exp_args:No \tl_if_novalue:nF { #1 } { \tl_set:Nn \l__wa_left_brace_tl { #1 } }
+    \__wa_pre_halign:n { #2 }
+    \bool_if:NT \l__wa_subequations_bool { \begin { subequations } }
+    \bool_if:NF \l__wa_sbwi_bool
+      {
+        \if at inlabel
+        \bool_set_true:N \l__wa_in_label_or_minipage_bool
+        \fi
+        \if at minipage
+        \bool_set_true:N \l__wa_in_label_or_minipage_bool
+        \fi
+      }
+    \tl_if_eq:NNF \l__wa_left_brace_tl \c_novalue_tl
+      {
+        \hbox_set:Nn \l_tmpa_box
+          {
+            \group_begin:
+            \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+            \c_math_toggle_token
+            \left \l__wa_replace_left_brace_by_tl \vcenter to 1 cm { } \right.
+            \c_math_toggle_token
+            \group_end:
+          }
+        \dim_zero_new:N \l__wa_delim_wd_dim
+        \dim_set:Nn \l__wa_delim_wd_dim { \box_wd:N \l_tmpa_box }
+        \box_clear_new:N \l__wa_left_brace_box
+        \hbox_set:Nn \l__wa_left_brace_box
+          {
+            \group_begin:
+              \cs_set_eq:NN \label \__wa_old_label
+              \c_math_toggle_token
+              \bool_if:NT \l__wa_displaystyle_bool \displaystyle
+              \l__wa_left_brace_tl
+              { }
+              \c_math_toggle_token
+            \group_end:
+          }
+      }
+    \tl_clear_new:N \l__wa_tag_tl
+    \bool_set_false:N \l__wa_qedhere_bool
+    \bool_set_false:N \l__wa_tag_star_bool
+    \if_mode_math:
+      \__wa_fatal:n { DispWithArrows~in~math~mode }
+    \fi:
+    \bool_if:NTF \l__wa_in_label_or_minipage_bool
+      { \c_math_toggle_token }
+      {
+        \if_mode_vertical:
+        \nointerlineskip
+        \hbox_to_wd:nn { .6 \linewidth } { }
+        \fi:
+        \c_math_toggle_token \c_math_toggle_token
+      }
+    \dim_zero_new:N \l__wa_linewidth_dim
+    \bool_if:NTF \l__wa_in_label_or_minipage_bool
+       { \dim_set_eq:NN \l__wa_linewidth_dim \linewidth }
+       { \dim_set_eq:NN \l__wa_linewidth_dim \displaywidth }
+    \box_clear_new:N \l__wa_halign_box
+    \setbox \l__wa_halign_box \vtop \bgroup
+    \tabskip =
+      \bool_if:NTF \l__wa_fleqn_bool
+        \c_zero_skip
+        { 0 pt plus 1000 pt minus 1000 pt }
+    \__wa_construct_halign:
+    \tabskip = 0 pt plus 1000 pt minus 1000 pt
+    &
+    $ ## $
+    \tabskip = \c_zero_skip
+    &&
+    \__wa_fatal:n { Too~much~columns~in~DispWithArrows }
+    \bool_if:nT \c_false_bool { ## }
+    \cr
+  }
+  {
+    \clist_if_in:NnT \l__wa_tags_clist { last }
+      { \clist_set:Nn \l__wa_tags_clist { all } }
+    \\
+    \egroup
+    \unskip \unpenalty \unskip \unpenalty
+    \box_set_to_last:N \l_tmpa_box
+    \nointerlineskip
+    \box_use:N \l_tmpa_box
+    \dim_gzero_new:N \g__wa_alignment_dim
+    \dim_gset:Nn \g__wa_alignment_dim { \box_wd:N \l_tmpa_box }
+    \box_clear_new:N \l__wa_new_box
+    \hbox_set:Nn \l__wa_new_box { \hbox_unpack_clear:N \l_tmpa_box }
+    \dim_compare:nNnT
+      { \box_wd:N \l__wa_new_box } < \g__wa_alignment_dim
+      { \dim_gset:Nn \g__wa_alignment_dim { \box_wd:N \l__wa_new_box } }
+    \egroup
+     \tl_if_eq:NNTF \l__wa_left_brace_tl \c_novalue_tl
+       { \box_use_drop:N \l__wa_halign_box }
+       {
+         \hbox_to_wd:nn \l__wa_linewidth_dim
+           {
+            \bool_if:NTF \l__wa_fleqn_bool
+              { \skip_horizontal:n \l__wa_mathindent_dim }
+              \hfil
+            \hbox_to_wd:nn \g__wa_alignment_dim
+              {
+                \box_use_drop:N \l__wa_left_brace_box
+                \dim_set:Nn \l_tmpa_dim
+                  {
+                    \box_ht:N \l__wa_halign_box
+                    + \box_dp:N \l__wa_halign_box
+                  }
+                \group_begin:
+                \dim_set_eq:NN \nulldelimiterspace \c_zero_dim
+                \c_math_toggle_token
+                  \left \l__wa_replace_left_brace_by_tl
+                    \vcenter to \l_tmpa_dim { \vfil }
+                  \right.
+                \c_math_toggle_token
+                \group_end:
+                \hfil
+              }
+            \hfil
+           }
+         \skip_horizontal:n { - \l__wa_linewidth_dim }
+         \vcenter { \box_use_drop:N \l__wa_halign_box }
+       }
+    \dim_gzero_new:N \g__wa_right_x_dim
+    \dim_gset_eq:NN \g__wa_right_x_dim \c_max_dim
+    \begin { tikzpicture } [ __wa_standard ]
+      \int_step_variable:nNn \g__wa_line_int \l_tmpa_int
+        {
+          \cs_if_free:cTF
+            { pgf at sh@ns at wa - \l__wa_prefix_str - \l_tmpa_int - v }
+            { \__wa_fatal:n { Inexistent~v-node } }
+            {
+              \tikz at parse@node\pgfutil at firstofone ( \l_tmpa_int - v )
+              \dim_set:Nn \l_tmpa_dim \pgf at x
+              \dim_compare:nNnT \l_tmpa_dim < \g__wa_right_x_dim
+                { \dim_gset:Nn \g__wa_right_x_dim \l_tmpa_dim }
+            }
+        }
+    \end { tikzpicture }
+    \__wa_post_halign:
+    \bool_if:nT \c__wa_mathtools_loaded_bool
+      { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: }
+    \bool_if:NTF \l__wa_in_label_or_minipage_bool
+      {
+        \c_math_toggle_token
+        \skip_vertical:N \belowdisplayskip
+      }
+      { \c_math_toggle_token \c_math_toggle_token }
+    \bool_if:NT \l__wa_subequations_bool { \end { subequations } }
+    \bool_if:NT \g__wa_footnote_bool { \end { savenotes } }
+    \ignorespacesafterend
+  }
+\NewDocumentEnvironment { DispWithArrows* } { }
+  {
+    \WithArrowsOptions { notag }
+    \DispWithArrows
+  }
+  \endDispWithArrows
+\cs_new_protected:Npn \__wa_if_in_last_col_of_disp:Nn #1 #2
+  {
+    \bool_if:NTF \l__wa_in_WithArrows_bool
+      { \__wa_error:nn { Not~allowed~in~WithArrows } { #1 } }
+      {
+        \int_compare:nNnTF \g__wa_col_int < \l__wa_nb_cols_int
+          { \__wa_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+          { #2 }
+      }
+  }
+\cs_new_protected:Npn \__wa_notag:
+  { \__wa_if_in_last_col_of_disp:Nn \notag { \clist_clear:N \l__wa_tags_clist } }
+\cs_new_protected:Npn \__wa_nonumber:
+  { \__wa_if_in_last_col_of_disp:Nn \nonumber { \clist_clear:N \l__wa_tags_clist } }
+\NewDocumentCommand \__wa_tag { s m }
+  {
+    \__wa_if_in_last_col_of_disp:Nn \tag
+      {
+        \tl_if_empty:NF \l__wa_tag_tl
+          { \__wa_error:nn  { Multiple~tags } { #2 } }
+        \clist_set:Nn \l__wa_tags_clist { all }
+        \bool_if:nT \c__wa_mathtools_loaded_bool
+          {
+            \MH_if_boolean:nT { show_only_refs }
+              {
+                \MH_if_boolean:nF { show_manual_tags }
+                  { \clist_clear:N \l__wa_tags_clist }
+              }
+          }
+        \tl_set:Nn \l__wa_tag_tl { #2 }
+        \bool_set:Nn \l__wa_tag_star_bool { #1 }
+        \bool_if:nT { #1 && ! \bool_if_p:N \c__wa_amsmath_loaded_bool }
+          { \__wa_error:n { tag*~without~amsmath } }
+      }
+  }
+\cs_new_protected:Npn \__wa_label:n #1
+  {
+    \__wa_if_in_last_col_of_disp:Nn \label
+      {
+        \seq_if_empty:NF \l__wa_labels_seq
+          {
+            \bool_if:NTF \c__wa_cleveref_loaded_bool
+              { \__wa_error:n { Multiple~labels~with~cleveref } }
+              { \__wa_error:n { Multiple~labels } }
+          }
+        \seq_put_right:Nn \l__wa_labels_seq { #1 }
+        \bool_if:nT \c__wa_mathtools_loaded_bool
+          {
+            \MH_if_boolean:nT { show_only_refs }
+              {
+                \cs_if_exist:cTF { MT_r_#1 }
+                  { \clist_set:Nn \l__wa_tags_clist { all } }
+                  { \clist_clear:N \l__wa_tags_clist }
+              }
+          }
+        \bool_if:nT \c__wa_autonum_loaded_bool
+          {
+            \cs_if_exist:cTF { autonum@#1Referenced }
+              { \clist_set:Nn \l__wa_tags_clist { all } }
+              { \clist_clear:N \l__wa_tags_clist }
+          }
+      }
+  }
+\cs_new_protected:Npn \__wa_tagnextline:
+  {
+    \__wa_if_in_last_col_of_disp:Nn \tagnextline
+      { \bool_set_true:N \l__wa_tag_next_line_bool }
+  }
+\cs_new_protected:Npn \__wa_qedhere: { \bool_set_true:N \l__wa_qedhere_bool }
+\cs_new_protected:Npn \__wa_set_qedhere: { \cs_set_eq:NN \qedhere \__wa_qedhere: }
+\cs_new_protected:Npn \__wa_qedhere_i:
+  {
+    \group_begin:
+      \cs_set_eq:NN \qed \qedsymbol
+      \cs_set_eq:NN \qed at elt \setQED at elt
+      \QED at stack \relax \relax
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_scan_arrows:
+  {
+    \group_begin:
+    \int_compare:nNnT \l__wa_pos_arrow_int = 7
+      {
+        \__wa_scan_arrows_i:
+        \int_set:Nn \l__wa_pos_arrow_int 8
+      }
+    \__wa_scan_arrows_i:
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_scan_arrows_i:
+  {
+    \int_zero_new:N \l__wa_first_arrow_of_group_int
+    \int_zero_new:N \l__wa_first_line_of_group_int
+    \int_zero_new:N \l__wa_last_line_of_group_int
+    \seq_clear_new:N \l__wa_first_arrows_seq
+    \seq_clear_new:N \l__wa_last_arrows_seq
+    \bool_set_true:N \l__wa_new_group_bool
+    \int_set:Nn \l__wa_arrow_int \c_one_int
+    \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
+      {
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__wa_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__wa_final_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { status } \l__wa_status_arrow_str
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { input-line } \l__wa_input_line_str
+        \int_compare:nNnTF \l__wa_final_int > \g__wa_line_int
+          {
+            \int_compare:nNnF \l__wa_pos_arrow_int = 8
+              { \__wa_error:n { Too~few~lines~for~an~arrow } }
+          }
+          \__wa_code_for_possible_arrow:
+        \int_incr:N \l__wa_arrow_int
+      }
+    \bool_if:nT
+      {
+        \int_compare_p:n { \l__wa_pos_arrow_int != 7 }
+          &&
+        \int_compare_p:nNn \l__wa_first_arrow_of_group_int > 0
+      }
+      { \__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int \g__wa_arrow_int }
+  }
+\cs_new_protected:Npn \__wa_code_for_possible_arrow:
+  {
+    \bool_if:nT
+      {
+        \int_compare_p:nNn \l__wa_arrow_int > \c_one_int
+        &&
+       ( \int_compare_p:n { \l__wa_initial_int > \l__wa_last_line_of_group_int }
+           &&
+         \int_compare_p:n { \l__wa_pos_arrow_int != 7 }
+           ||
+         \str_if_eq_p:Vn \l__wa_status_arrow_str { new-group }
+       )
+      }
+      {
+        \int_compare:nNnF \l__wa_first_arrow_of_group_int = \c_zero_int
+          {
+            \__wa_draw_arrows:nn
+              \l__wa_first_arrow_of_group_int
+              { \l__wa_arrow_int - 1 }
+          }
+        \bool_set_true:N \l__wa_new_group_bool
+      }
+    \bool_if:nTF \l__wa_new_group_bool
+      {
+        \bool_set_false:N \l__wa_new_group_bool
+        \int_set_eq:NN \l__wa_first_arrow_of_group_int \l__wa_arrow_int
+        \int_set_eq:NN \l__wa_first_line_of_group_int \l__wa_initial_int
+        \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int
+        \seq_clear:N \l__wa_first_arrows_seq
+        \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int
+        \seq_clear:N \l__wa_last_arrows_seq
+        \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int
+        \int_compare:nT { \l__wa_pos_arrow_int != 8 }
+          { \dim_set:Nn \l__wa_x_dim { - \c_max_dim } }
+      }
+      {
+        \bool_if:nF
+          { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } }
+          {
+            \int_compare:nT
+              { \l__wa_initial_int = \l__wa_first_line_of_group_int }
+              { \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int }
+            \int_compare:nNnTF \l__wa_final_int > \l__wa_last_line_of_group_int
+              {
+                \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int
+                \seq_clear:N \l__wa_last_arrows_seq
+                \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int
+              }
+              {
+                \int_compare:nNnT \l__wa_final_int = \l__wa_last_line_of_group_int
+                  { \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int }
+              }
+          }
+      }
+    \bool_if:nF { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } }
+      {
+        \int_compare:nT { \l__wa_pos_arrow_int != 8 }
+          { \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int }
+      }
+  }
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Npn \__wa_keys_set:
+  { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
+\cs_new_protected:Npn \__wa_draw_arrows:nn #1 #2
+  {
+    \group_begin:
+    \int_zero_new:N \l__wa_first_arrow_int
+    \int_set:Nn \l__wa_first_arrow_int { #1 }
+    \int_zero_new:N \l__wa_last_arrow_int
+    \int_set:Nn \l__wa_last_arrow_int { #2 }
+    \int_set:Nn \l__wa_arrow_int \l__wa_first_arrow_int
+    \int_until_do:nNnn \l__wa_arrow_int > \l__wa_last_arrow_int
+      {
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__wa_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__wa_final_int \l_tmpa_tl
+        \int_compare:nT { \l__wa_final_int <= \g__wa_line_int } \__wa_draw_arrows_i:
+        \int_incr:N \l__wa_arrow_int
+      }
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_draw_arrows_i:
+  {
+    \group_begin:
+    \prop_get:cnN
+      { g__wa_arrow _\l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+      { options } \l_tmpa_tl
+    \str_clear_new:N \l__wa_previous_key_str
+    \exp_args:NNo \exp_args:No
+    \__wa_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__wa_xoffset_dim } }
+    \bool_set_false:N \l__wa_initial_r_bool
+    \bool_set_false:N \l__wa_final_r_bool
+    \int_case:nn \l__wa_pos_arrow_int
+      {
+        0 { \bool_set_true:N \l__wa_final_r_bool }
+        2 { \bool_set_true:N \l__wa_initial_r_bool }
+        3
+          {
+            \bool_set_true:N \l__wa_initial_r_bool
+            \bool_set_true:N \l__wa_final_r_bool
+          }
+      }
+    \int_compare:nNnT \l__wa_pos_arrow_int = 5
+      {
+        \dim_set:Nn \l__wa_x_dim { - \c_max_dim }
+        \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int
+      }
+    \tl_set:Nx \l__wa_initial_tl
+      {
+        \int_use:N \l__wa_initial_int - \bool_if:NTF \l__wa_initial_r_bool rl
+        .south
+      }
+    \tl_set:Nx \l__wa_final_tl
+      { \int_use:N \l__wa_final_int - \bool_if:NTF \l__wa_final_r_bool rl .north }
+    \prop_get:cnN
+      { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop }
+      { label }
+      \l_tmpa_tl
+    \seq_if_in:NxTF \l__wa_first_arrows_seq
+      { \int_use:N \l__wa_arrow_int }
+      { \bool_set_true:N \l_tmpa_bool }
+      { \bool_set_false:N \l_tmpa_bool }
+    \seq_if_in:NxTF \l__wa_last_arrows_seq
+      { \int_use:N \l__wa_arrow_int }
+      { \bool_set_true:N \l_tmpb_bool }
+      { \bool_set_false:N \l_tmpb_bool }
+    \int_compare:nNnT \l__wa_pos_arrow_int = 5
+      {
+        \bool_set_true:N \l_tmpa_bool
+        \bool_set_true:N \l_tmpb_bool
+      }
+    \begin { tikzpicture } [ __wa_standard ]
+      \tikz at scan@one at point \pgfutil at firstofone ( \l__wa_initial_tl )
+      \tl_gset:Nx \g_tmpa_tl
+        {
+          \int_compare:nNnTF \l__wa_pos_arrow_int < 5
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l__wa_x_dim } ,
+          \bool_if:NTF \l_tmpa_bool
+            { \dim_eval:n { \pgf at y + \l__wa_start_adjust_dim } }
+            { \dim_use:N \pgf at y }
+        }
+      \tikz at scan@one at point \pgfutil at firstofone ( \l__wa_final_tl )
+      \tl_gset:Nx \g_tmpb_tl
+        {
+          \int_compare:nNnTF \l__wa_pos_arrow_int < 5
+            { \dim_use:N \pgf at x }
+            { \dim_use:N \l__wa_x_dim } ,
+          \bool_if:NTF \l_tmpb_bool
+            { \dim_eval:n { \pgf at y - \l__wa_end_adjust_dim } }
+            { \dim_use:N \pgf at y }
+        }
+    \end { tikzpicture }
+    \__wa_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_def_function_tmpa:n #1
+  {
+    \cs_set:Npn \__wa_tmpa:nnn ##1 ##2 ##3
+      {
+        \begin{tikzpicture}
+          [
+            __wa_standard ,
+            every~path / .style = WithArrows / arrow
+          ]
+          #1
+        \end{tikzpicture}
+      }
+  }
+\cs_new_protected:Npn \__wa_draw_arrow:nnn #1 #2 #3
+  {
+    \bool_if:nT { \l__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool }
+       { \tl_set_eq:NN \l__wa_tikz_code_tl \c__wa_tikz_code_wrap_lines_tl }
+    \exp_args:NV \__wa_def_function_tmpa:n \l__wa_tikz_code_tl
+    \__wa_tmpa:nnn { #1 } { #2 } { #3 }
+  }
+\cs_generate_variant:Nn \__wa_draw_arrow:nnn { n n o }
+\tl_const:Nn \c__wa_tikz_code_wrap_lines_tl
+  {
+    \draw ( #1 ) to node ( __wa_label ) { } ( #2 ) ;
+    \tikz at parse@node \pgfutil at firstofone ( __wa_label.west )
+    \dim_set:Nn \l_tmpa_dim
+      { \g__wa_right_x_dim - \pgf at x - \pgfkeysvalueof { / pgf / inner~xsep } }
+    \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+    \tl_if_empty:NF \g_tmpa_tl
+      {
+        \dim_set:Nn \l_tmpb_dim \g_tmpa_tl
+        \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+          { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim }
+      }
+    \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim
+      {
+        \path ( __wa_label.west )
+           node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ]
+                { #3 } ;
+      }
+  }
+\cs_new_protected:Npn \__wa_update_x:nn #1 #2
+  {
+    \int_step_inline:nnn { #1 } { #2 }
+      {
+        \begin { tikzpicture } [ __wa_standard ]
+          \tikz at scan@one at point \pgfutil at firstofone ( ##1 - l )
+          \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__wa_x_dim \pgf at x }
+        \end { tikzpicture }
+        \dim_set_eq:NN \l__wa_x_dim \g_tmpa_dim
+      }
+  }
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__wa_last_env_int }
+\keys_define:nn { WithArrows / Arrow / code-after }
+  {
+    tikz     .code:n =
+      \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz     .value_required:n  = true ,
+    rr       .value_forbidden:n = true ,
+    rr       .code:n            = \__wa_fix_pos_option:n 0 ,
+    ll       .value_forbidden:n = true,
+    ll       .code:n            = \__wa_fix_pos_option:n 1 ,
+    rl       .value_forbidden:n = true ,
+    rl       .code:n            = \__wa_fix_pos_option:n 2 ,
+    lr       .value_forbidden:n = true ,
+    lr       .code:n            = \__wa_fix_pos_option:n 3 ,
+    v        .value_forbidden:n = true ,
+    v        .code:n            = \__wa_fix_pos_option:n 4 ,
+    tikz-code .tl_set:N          = \l__wa_tikz_code_tl ,
+    tikz-code .value_required:n  = true ,
+    xoffset  .dim_set:N         = \l__wa_xoffset_dim ,
+    xoffset  .value_required:n  = true ,
+    unknown .code:n  =
+      \__wa_sort_seq:N \l__wa_options_Arrow_code_after_seq
+      \__wa_error:n { Unknown~option~Arrow~in~code-after }
+  }
+\seq_new:N \l__wa_options_Arrow_code_after_seq
+\__wa_set_seq_of_str_from_clist:Nn \l__wa_options_Arrow_code_after_seq
+  { ll, lr, rl, rr, tikz, tikz-code, v, x, offset }
+\NewDocumentCommand \__wa_Arrow_code_after { O { } m m m ! O { } }
+  {
+    \int_set:Nn \l__wa_pos_arrow_int 1
+    \str_clear_new:N \l__wa_previous_key_str
+    \group_begin:
+      \keys_set:nn { WithArrows / Arrow / code-after }
+        { #1, #5, tikz = { xshift = \l__wa_xoffset_dim } }
+      \bool_set_false:N \l__wa_initial_r_bool
+      \bool_set_false:N \l__wa_final_r_bool
+      \int_case:nn \l__wa_pos_arrow_int
+        {
+          0
+            {
+              \bool_set_true:N \l__wa_initial_r_bool
+              \bool_set_true:N \l__wa_final_r_bool
+            }
+          2 { \bool_set_true:N \l__wa_initial_r_bool }
+          3 { \bool_set_true:N \l__wa_final_r_bool }
+        }
+      \tl_if_eq:nnTF { #2 } { #3 }
+        { \__wa_error:nn { Both~lines~are~equal } { #2 } }
+        {
+          \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - #2 - l }
+            { \__wa_error:nx { Wrong~line~in~Arrow } { #2 } }
+            {
+              \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - #3 - l }
+                { \__wa_error:nx { Wrong~line~in~Arrow } { #3 }  }
+                {
+                  \int_compare:nNnTF \l__wa_pos_arrow_int = 4
+                    {
+                      \begin { tikzpicture } [ __wa_standard ]
+                        \tikz at scan@one at point \pgfutil at firstofone (#2-l.south)
+                        \dim_set_eq:NN \l_tmpa_dim \pgf at x
+                        \dim_set_eq:NN \l_tmpb_dim \pgf at y
+                        \tikz at scan@one at point \pgfutil at firstofone (#3-l.north)
+                        \dim_set:Nn \l_tmpa_dim
+                          { \dim_max:nn \l_tmpa_dim \pgf at x }
+                        \tl_gset:Nx \g_tmpa_tl
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \l_tmpb_dim }
+                        \tl_gset:Nx \g_tmpb_tl
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf at y }
+                      \end { tikzpicture }
+                    }
+                    {
+                      \begin { tikzpicture } [ __wa_standard ]
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #2-\bool_if:NTF\l__wa_initial_r_bool rl .south )
+                        \tl_gset:Nx \g_tmpa_tl
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #3-\bool_if:NTF\l__wa_final_r_bool rl .north )
+                        \tl_gset:Nx \g_tmpb_tl
+                           { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+                      \end { tikzpicture }
+                    }
+                  \__wa_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
+                }
+            }
+        }
+    \group_end:
+  }
+\cs_new_protected:Npn \__wa_MultiArrow:nn #1 #2
+  {
+    \foreach \x in { #1 }
+      {
+        \cs_if_free:cTF { pgf at sh@ns at wa - \l__wa_prefix_str - \x - l }
+           { \__wa_error:nx { Wrong~line~specification~in~MultiArrow } \x }
+           { \clist_gput_right:Nx \g_tmpa_clist \x }
+      }
+    \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 }
+      { \__wa_error:n { Too~small~specification~for~MultiArrow } }
+      {
+        \clist_sort:Nn \g_tmpa_clist
+          {
+            \int_compare:nTF { ##1 > ##2 }
+              \sort_return_swapped:
+              \sort_return_same:
+          }
+        \clist_pop:NN \g_tmpa_clist \l_tmpa_tl
+        \clist_reverse:N \g_tmpa_clist
+        \clist_pop:NN \g_tmpa_clist \l_tmpb_tl
+        \exp_args:NV \__wa_MultiArrow_i:n \g_tmpa_clist
+        \begin { tikzpicture }
+          [
+            __wa_standard ,
+            every~path / .style = { WithArrows / arrow }
+          ]
+          \draw [<->] ([xshift = \l__wa_xoffset_dim]\l_tmpa_tl-r.south)
+                      -- ++(5mm,0)
+                      -- node (__wa_label) {}
+                         ([xshift = \l__wa_xoffset_dim+5mm]\l_tmpb_tl-r.south)
+                      -- ([xshift = \l__wa_xoffset_dim]\l_tmpb_tl-r.south)  ;
+          \tikz at parse@node \pgfutil at firstofone (__wa_label.west)
+          \dim_set:Nn \l_tmpa_dim { 20 cm }
+          \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+          \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl }
+          \bool_if:nT { \l__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool }
+            {
+              \dim_set:Nn \l_tmpb_dim
+                { \g__wa_right_x_dim - \pgf at x - 0.3333 em }
+              \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim
+                { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim }
+            }
+          \path (__wa_label.west)
+           node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ;
+        \end{tikzpicture}
+      }
+  }
+\cs_new_protected:Npn \__wa_MultiArrow_i:n #1
+  {
+        \begin { tikzpicture }
+      [
+        __wa_standard ,
+        every~path / .style = { WithArrows / arrow }
+      ]
+      \foreach \k in { #1 }
+        {
+          \draw [ <- ]
+            ( [xshift = \l__wa_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
+        } ;
+        \end{tikzpicture}
+  }
+\str_const:Nn \c__wa_option_ignored_str
+  { If~you~go~on,~this~option~will~be~ignored. }
+\str_const:Nn \c__wa_command_ignored_str
+  { If~you~go~on,~this~command~will~be~ignored. }
+\__wa_msg_new:nn { amsmath~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~the~
+    package~'amsmath'~has~not~been~loaded.\\
+    If~you~go~on,~this~option~will~be~ignored~in~the~rest~
+    of~the~document.
+  }
+\__wa_msg_new:nn { Bad~value~for~replace~brace~by }
+  {
+    Bad~value~for~the~option~'\l_keys_key_tl'.~The~value~must~begin~
+    with~an~extensible~left~delimiter.~The~possible~values~are:~.,
+    \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~
+    \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~
+    \token_to_str:N \langle,~\token_to_str:N \lmoustache,~
+    \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\
+    (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\
+    if~amsmath~or~unicode-math~is~loaded~in~LaTeX).\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { option~of~cr~negative }
+  {
+    The~argument~of~the~command~\token_to_str:N\\~
+    should~be~positive~in~the~row~\int_use:N \g__wa_line_int\
+    of~your~environment~\{\l__wa_type_env_str\}.\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { omit~probably~used }
+  {
+    There~is~a~problem.~Maybe~you~have~used~a~command~
+    \token_to_str:N\omit\ in~the~line~\int_use:N \g__wa_line_int\
+    (or~another~line)~of~your~environment~\{\l__wa_type_env_str\}.\\
+    You~can~go~on~but~you~may~have~others~errors.
+  }
+\__wa_msg_new:nn { newline~at~the~end~of~env }
+  {
+    Your~environment~\{\l__wa_type_env_str\}~should~not~end~with~
+    a~\token_to_str:N \\.\\
+    This~warning~might~become~an~error~in~a~future~version.
+  }
+\__wa_msg_new:nn { Invalid~option~format }
+  {
+    The~key~'format'~should~contain~only~letters~r,~c~and~l~and~
+    must~not~be~empty.\\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Value~for~a~key }
+  {
+    The~key~'\l_keys_key_tl'~should~be~used~without~value. \\
+    However,~you~can~go~on~for~this~time.
+  }
+\__wa_msg_new:nnn { Unknown~option~in~Arrow }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~for~the~command~
+    \l__wa_string_Arrow_for_msg_str\ in~the~row~
+    \int_use:N \g__wa_line_int\ of~your~environment~
+    \{\l__wa_type_env_str\}. \l_tmpa_str \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_Arrow_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~WithArrows }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_WithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~DispWithArrows }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_DispWithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~WithArrowsOptions }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \WithArrowsOptions. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_WithArrowsOptions_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nnn { Unknown~option~Arrow~in~code-after }
+  {
+    The~key~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \Arrow\ in~code-after. \\
+    \c__wa_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__wa_options_Arrow_code_after_seq {~and~} {,~} {~and~}.
+  }
+\__wa_msg_new:nn { Too~much~columns~in~WithArrows }
+  {
+    Your~environment~\{\l__wa_type_env_str\}~has~\int_use:N
+    \l__wa_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~
+    If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~
+    the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\
+    However,~you~can~go~one~for~this~time.
+  }
+\__wa_msg_new:nn { Too~much~columns~in~DispWithArrows }
+  {
+    Your~environment~\{\l__wa_type_env_str\}~has~\int_use:N
+    \l__wa_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
+    at~the~end~of~row~\int_use:N \g__wa_line_int. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Negative~jump }
+  {
+    You~can't~use~a~negative~value~for~the~option~'jump'~of~command~
+    \l__wa_string_Arrow_for_msg_str\
+    in~the~row~\int_use:N \g__wa_line_int\
+    of~your~environment~\{\l__wa_type_env_str\}.~
+    You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { new-group~without~groups }
+  {
+    You~can't~use~the~option~'new-group'~for~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~
+    'groups'~in~your~environment~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn
+  { Too~few~lines~for~an~arrow }
+  {
+    Line~\l__wa_input_line_str\
+    :~an~arrow~specified~in~the~row~\int_use:N \l__wa_initial_int\
+    of~your~environment~\{\l__wa_type_env_str\}~can't~be~drawn~
+    because~it~arrives~after~the~last~row~of~the~environment. \\
+    If~you~go~on,~this~arrow~will~be~ignored.
+  }
+\__wa_msg_new:nn { WithArrows~outside~math~mode }
+  {
+    The~environment~\{\l__wa_type_env_str\}~should~be~used~only~in~math~mode~
+    like~the~environment~\{aligned\}~of~amsmath. \\
+    Nevertheless,~you~can~go~on.
+  }
+\__wa_msg_new:nn { DispWithArrows~in~math~mode }
+  {
+    The~environment~\{\l__wa_type_env_str\}~should~be~used~only~outside~math~
+    mode~like~the~environment~\{align\}~of~amsmath. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Incompatible~options~in~Arrow }
+  {
+    You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l__wa_previous_key_str'~set~in~the~same~command~
+    \l__wa_string_Arrow_for_msg_str. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Incompatible~options }
+  { You~try~to~use~the~option~'\l_keys_key_tl'~but~
+    this~option~is~incompatible~or~redundant~with~the~option~
+    '\l__wa_previous_key_str'~set~in~the~same~command~
+    \bool_if:NT \l__wa_in_code_after_bool
+      {
+        \l__wa_string_Arrow_for_msg_str\
+        in~the~code-after~of~your~environment~\{\l__wa_type_env_str\}
+      }. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Arrow~not~in~last~column }
+  {
+    You~should~use~the~command~\l__wa_string_Arrow_for_msg_str\
+    only~in~the~last~column~(column~\int_use:N\l__wa_nb_cols_int)~
+    of~your~environment~\{\l__wa_type_env_str\}.\\
+    However~you~can~go~on~for~this~time.
+  }
+\__wa_msg_new:nn { Wrong~line~in~Arrow }
+  {
+    The~specification~of~line~'#1'~you~use~in~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    in~the~'code-after'~of~\{\l__wa_type_env_str\}~doesn't~exist. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Both~lines~are~equal }
+  {
+    In~the~'code-after'~of~\{\l__wa_type_env_str\}~you~try~to~
+    draw~an~arrow~going~to~itself~from~the~line~'#1'.~This~is~not~possible. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Wrong~line~specification~in~MultiArrow }
+  {
+    The~specification~of~line~'#1'~doesn't~exist. \\
+    If~you~go~on,~it~will~be~ignored~for~\token_to_str:N \MultiArrow.
+  }
+\__wa_msg_new:nn { Too~small~specification~for~MultiArrow }
+  {
+    The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\
+    is~too~small:~you~need~at~least~two~lines. \\
+    \c__wa_command_ignored_str
+  }
+\__wa_msg_new:nn { Not~allowed~in~DispWithArrows }
+  {
+    The~command~\token_to_str:N #1
+    is~allowed~only~in~the~last~column~
+    (column~\int_use:N\l__wa_nb_cols_int)~of~\{\l__wa_type_env_str\}. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { Not~allowed~in~WithArrows }
+  {
+    The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__wa_type_env_str\}~
+    (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { tag*~without~amsmath }
+  {
+    We~can't~use~\token_to_str:N\tag*~because~you~haven't~loaded~amsmath~
+    (or~mathtools). \\
+    If~you~go~on,~the~command~\token_to_str:N\tag\
+    will~be~used~instead.
+  }
+\__wa_msg_new:nn { Multiple~tags }
+  {
+    You~can't~use~twice~the~command~\token_to_str:N\tag\
+    in~a~line~of~the~environment~\{\l__wa_type_env_str\}. \\
+    If~you~go~on,~the~tag~'#1'~will~be~used.
+  }
+\__wa_msg_new:nn { Multiple~labels }
+  {
+    Normally,~we~can't~use~the~command~\token_to_str:N\label\
+    twice~in~a~line~of~the~environment~\{\l__wa_type_env_str\}. \\
+    However,~you~can~go~on.~
+    \bool_if:NT \c__wa_showlabels_loaded_bool
+      { However,~only~the~last~label~will~be~shown~by~showlabels.~ }
+    If~you~don't~want~to~see~this~message~again,~you~can~use~the~option~
+    'allow-multiple-labels'~at~the~global~or~environment~level.
+  }
+\__wa_msg_new:nn { Multiple~labels~with~cleveref }
+  {
+    Since~you~use~cleveref,~you~can't~use~the~command~\token_to_str:N\label\
+    twice~in~a~line~of~the~environment~\{\l__wa_type_env_str\}. \\
+    If~you~go~on,~you~may~have~undefined~references.
+  }
+\__wa_msg_new:nn { Inexistent~v-node }
+  {
+    There~is~a~problem.~Maybe~you~have~put~a~command~\token_to_str:N\cr\
+    instead~of~a~command~\token_to_str:N\\~at~the~end~of~
+    the~row~\l_tmpa_int\
+    of~your~environment~\{\l__wa_type_env_str\}. \\
+    This~error~is~fatal.
+  }
+\__wa_msg_new:nn { Option~xoffset~forbidden }
+  {
+    You~can't~use~the~option~'xoffset'~in~the~command~
+    \l__wa_string_Arrow_for_msg_str\
+    while~you~are~using~the~option~
+    ' \int_compare:nNnTF \l__wa_pos_arrow_int = 7
+        { group }
+        { groups } '. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nnn { Duplicate~name }
+  {
+    The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
+    the~same~environment~name~twice.~You~can~go~on,~but,~
+    maybe,~you~will~have~incorrect~results. \\
+    For~a~list~of~the~names~already~used,~type~H~<return>. \\
+    If~you~don't~want~to~see~this~message~again,~use~the~option~
+    'allow-duplicate-names'.
+  }
+  {
+    The~names~already~defined~in~this~document~are:~
+    \seq_use:Nnnn \g__wa_names_seq { ,~ } { ,~ } { ~and~ }.
+  }
+\NewDocumentCommand \WithArrowsNewStyle { m m }
+  {
+    \keys_if_exist:nnTF { WithArrows / Global } { #1 }
+      { \__wa_error:nn { Key~already~defined } { #1 } }
+      {
+        \keys_define:nn { WithArrows / Global }
+          {
+            #1 .code:n =
+             { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } }
+          }
+        \seq_put_right:Nx \l__wa_options_WithArrows_seq { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l__wa_options_DispWithArrows_seq
+          { \tl_to_str:n { #1 } }
+        \seq_put_right:Nx \l__wa_options_WithArrowsOptions_seq
+          { \tl_to_str:N { #1 } }
+        \group_begin:
+          \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
+            {
+              The~key~'\l_keys_key_tl'~can't~be~set~in~the~
+              definition~of~a~style.~You~can~go~on~for~this~time~
+              but~you~should~suppress~this~key.
+            }
+          \WithArrowsOptions { #2 }
+        \group_end:
+      }
+  }
+\__wa_msg_new:nn { Key~already~defined }
+  {
+    The~key~'#1'~is~already~defined. \\
+    If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\
+    will~be~ignored.
+  }
+\tl_const:Nn \c__wa_tikz_code_up_tl
+  {
+    \draw [ rounded~corners ]
+       let \p1 = (#1) ,
+           \p2 = (#2)
+       in (\p1) -- node {
+                          \dim_set:Nn \l_tmpa_dim { \x2 - \x1 }
+                          \begin { varwidth } \l_tmpa_dim
+                            \narrowragged
+                            #3
+                          \end { varwidth }
+                        }
+          (\x2,\y1) -- (\p2) ;
+  }
+\tl_const:Nn \c__wa_tikz_code_down_tl
+  {
+    \draw [ rounded~corners ]
+      let \p1 = (#1) ,
+          \p2 = (#2)
+      in (\p1) -- (\x1,\y2) --
+               node {
+                      \dim_set:Nn \l_tmpa_dim { \x1 - \x2 }
+                      \begin { varwidth } \l_tmpa_dim
+                        \narrowragged
+                        #3
+                      \end { varwidth }
+                    }
+               (\p2) ;
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    up   .code:n = \__wa_set_independent: ,
+    down .code:n = \__wa_set_independent: ,
+    up   .default:n = NoValue ,
+    down .default:n = NoValue
+  }
+\keys_define:nn { WithArrows / Arrow / SecondPass }
+  {
+    up .code:n =
+      \str_if_empty:NT \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { up }
+          \bool_if:NTF \c__wa_varwidth_loaded_bool
+            {
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                {
+                  \int_set:Nn \l__wa_pos_arrow_int \c_one_int
+                  \bool_set_false:N \l__wa_wrap_lines_bool
+                  \tl_set_eq:NN \l__wa_tikz_code_tl
+                    \c__wa_tikz_code_up_tl
+                }
+                { \__wa_error:n { calc~not~loaded } }
+            }
+            { \__wa_error:n { varwidth~not~loaded } }
+        } ,
+    down .code:n =
+      \str_if_empty:NT \l__wa_previous_key_str
+        {
+          \str_set:Nn \l__wa_previous_key_str { down }
+          \bool_if:NTF \c__wa_varwidth_loaded_bool
+            {
+              \cs_if_exist:cTF { tikz at library@calc at loaded }
+                {
+                  \int_set:Nn \l__wa_pos_arrow_int \c_one_int
+                  \bool_set_false:N \l__wa_wrap_lines_bool
+                  \tl_set_eq:NN \l__wa_tikz_code_tl
+                    \c__wa_tikz_code_down_tl
+                }
+                { \__wa_error:n { calc~not~loaded } }
+            }
+            { \__wa_error:n { varwidth~not~loaded } }
+        }
+  }
+\seq_put_right:Nn \l__wa_options_Arrow_seq { down }
+\seq_put_right:Nn \l__wa_options_Arrow_seq { up }
+\__wa_msg_new:nn { varwidth~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~
+    you~don't~have~loaded~the~package~'varwidth'. \\
+    \c__wa_option_ignored_str
+  }
+\__wa_msg_new:nn { calc~not~loaded }
+  {
+    You~can't~use~the~option~'\l_keys_key_tl'~because~you~don't~have~loaded~the~
+    Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}'~
+    ~in~the~preamble~of~your~document. \\
+    \c__wa_option_ignored_str
+  }
+\endinput
+%%
+%% End of file `witharrows.sty'.


Property changes on: trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


More information about the tex-live-commits mailing list