texlive[50078] Master/texmf-dist: witharrows (20feb19)

commits+karl at tug.org commits+karl at tug.org
Wed Feb 20 23:43:27 CET 2019


Revision: 50078
          http://tug.org/svn/texlive?view=revision&revision=50078
Author:   karl
Date:     2019-02-20 23:43:27 +0100 (Wed, 20 Feb 2019)
Log Message:
-----------
witharrows (20feb19)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
    trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
    trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty

Modified: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx	2019-02-20 22:43:15 UTC (rev 50077)
+++ trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx	2019-02-20 22:43:27 UTC (rev 50078)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{1.14}
-\def\myfiledate{2019/02/01}
+\def\myfileversion{1.15}
+\def\myfiledate{2019/02/20}
 %
 %
 %<*batchfile>
@@ -44,7 +44,7 @@
 \endgroup
 %</batchfile>
 %
-%<@@=wa>
+%<@@=witharrows>
 %<*driver>
 \documentclass[dvipsnames]{l3doc}% dvipsnames is for xcolor (loaded by Tikz, loaded by witharrows)
 \usepackage{xltxtra}
@@ -75,22 +75,25 @@
 % \maketitle
 %
 % \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.
+% 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}
 %
 %
 % \vskip1cm 
-% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by the classical workflow
-% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two compilations may be necessary. This package requires the
-% packages \pkg{expl3}, \pkg{xparse} and \pkg{tikz}. The Tikz libraries \pkg{arrows.meta} and
+% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by
+% the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two
+% compilations may be necessary. This package requires the packages \pkg{expl3},
+% \pkg{xparse} and \pkg{tikz}. The Tikz libraries \pkg{arrows.meta} and
 % \pkg{bending} are also required.
 %
 % \bigskip
-% This package provides an environment |{WithArrows}| to construct alignments of equations with arrows for the
-% explanations on the right side:
-% %
+% 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}@ \\
@@ -106,23 +109,27 @@
 %
 %
 % \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).
+% 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 |amsmath| (and
-% |mathtools|). The extension \pkg{witharrows} also provides an environment |{DispWithArrows}| which is similar to
-% the environment |{align}| of |amsmath|: cf. p. \pageref{DispWithArrows}.
+% The environment |{WithArrows}| bears similarities with the environment
+% |{aligned}| of |amsmath| (and |mathtools|). The extension \pkg{witharrows}
+% also provides an environment |{DispWithArrows}| which is similar to the
+% environment |{align}| of |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 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$).
+% 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}
@@ -133,18 +140,14 @@
 % \end{WithArrows}$
 % \end{Verbatim}
 %
-% 
-%
 % $\begin{WithArrows}
-% A & = \bigl((a+b)+1\bigr)^2 \Arrow[jump=2]{we expand} \\
+% 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]@ \\
@@ -160,9 +163,8 @@
 % \end{WithArrows}$
 %
 % \interitem
-% The option |xoffset| shifts the arrows to the right (we usually don't want the arrows to be stucked on the text).
-% The default value of |xoffset| is $3$~mm.
-% 
+% The option |xoffset| shifts the arrows 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 
@@ -179,10 +181,10 @@
 %
 %
 % \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.
-% %
+% 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} \\
@@ -196,8 +198,8 @@
 % \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~|<-|.
+% 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}
@@ -213,8 +215,8 @@
 % \end{WithArrows}$
 %
 % \interitem
-% It's also possible to suppress both tips of the arrow with the Tikz option |-|.
-% %
+% 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} \\
@@ -228,8 +230,8 @@
 % \end{WithArrows}$
 %
 % \interitem
-% In order to have straight arrows instead of curved ones, we must use the Tikz option ``|bend left = 0|''.
-% %
+% 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} \\
@@ -243,12 +245,13 @@
 % \end{WithArrows}$
 %
 % \smallskip 
-% In fact, it's possible to change more drastically the shape or the arrows with the option |TikzCode| presented
-% p.~\pageref{TikzCode}.
+% In fact, it's possible to change more drastically the shape or the arrows with
+% the option |TikzCode| presented p.~\pageref{TikzCode}.
 %
 % \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.}
+% 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}
@@ -261,22 +264,26 @@
 %
 % $\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
+% \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 
+% & = (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}.
+% 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.
+% 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}
@@ -291,12 +298,15 @@
 % \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. 
+% 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}
@@ -311,34 +321,37 @@
 % \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}|.
+% If we want exactly the same result as previously, we have to give to the
+% option |font| the value |{\itshape\small\bfseries}|.
 %
 %
 % \interitem 
-% Almost all the options can be given directly between square brackets to the environment |{WithArrows}|. 
-% \textbf{There must be no space before the opening bracket (|[|) of the options of the environment.}
-% The options apply to all the arrows of the environment.\footnote{They also apply to the nested environments 
-% |{WithArrows}| (with the logical exceptions of |interline|, |CodeBefore| and |CodeAfter|).}
+% Almost all the options can be given directly between square brackets to the
+% environment |{WithArrows}|. \textbf{There must be no space before the opening
+% bracket (|[|) of the options of the environment.} The options apply to all the
+% arrows of the environment.\footnote{They also apply to the nested environments
+% |{WithArrows}| (with the logical exceptions of |interline|, |CodeBefore| and
+% |CodeAfter|).}
 % %
 % \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 & = \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 & = \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}).
+% 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|:
@@ -379,13 +392,17 @@
 %
 %
 % \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 = {}}}|.}
+% 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}@
@@ -407,13 +424,16 @@
 %
 %
 % \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}|.
+% 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 |CommandName| for this purpose. The new name of the command must be given to
-% the option \emph{without} the leading backslash.
+% 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 |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}
@@ -435,9 +455,11 @@
 %
 %
 % \interitem 
-% The environment |{WithArrows}| gives also two 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 avalaible only at the environment level and they are not applied to the nested environments).
+% The environment |{WithArrows}| gives also two 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#CodeBefore = \color{blue}@]
@@ -452,22 +474,25 @@
 % \end{WithArrows}$
 % 
 % \medskip 
-% Special commands are available in |CodeAfter|: 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}.
+% Special commands are available in |CodeAfter|: 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{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 |shownodes| 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.}
+% 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,shownodes]
+% $\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 \\
@@ -480,17 +505,19 @@
 % \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}.
+% 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).
+% 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.
+% 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
@@ -511,8 +538,8 @@
 %
 %
 % \interitem
-% There is also an option called \texttt{i} ($i$ for \emph{intermediate}). With this option, the arrow is vertical
-% and at the leftmost position.
+% There is also an option called \texttt{i} ($i$ for \emph{intermediate}). With
+% this option, the arrow is vertical and at the leftmost position.
 %
 % \begin{Verbatim}
 % $\begin{WithArrows}
@@ -532,8 +559,9 @@
 %
 %
 % \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.
+% 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@]
@@ -558,13 +586,15 @@
 %
 %
 % \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 line; 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.
+% 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]
@@ -577,19 +607,24 @@
 %   & = 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.
+% \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
+% 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).
+% 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}
@@ -617,8 +652,9 @@
 % \section{The options ``up'' and ``down'' for individual arrows}
 %
 % \label{up-and-down}
-% At the local, level, there is also two options for individuals arrows, called ``|up|'' and ``|down|''. The
-% following example illustrates these types of arrows:
+% 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}
@@ -643,21 +679,25 @@
 %
 %
 % \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.
+% 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}.}
+% |{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.
+% 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}
@@ -674,11 +714,12 @@
 %
 %
 % \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}.}
+% 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@]
@@ -697,8 +738,8 @@
 %
 %
 % \bigskip
-% However, this new value of |\jot| will also be used in other alignments included in the
-% environment~|{WithArrows}|:
+% However, this new value of |\jot| will also be used in other alignments
+% included in the environment~|{WithArrows}|:
 % %
 % \begin{Verbatim}
 % $\begin{WithArrows}[jot=2ex]
@@ -726,8 +767,8 @@
 % \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.
+% 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@]
@@ -756,9 +797,10 @@
 %
 %
 % \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.
+% 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
@@ -799,7 +841,8 @@
 %
 %
 % \interitem
-% Unlike |{aligned}|, the environment |{WithArrows}| uses |\textstyle| by default.
+% Unlike |{aligned}|, the environment |{WithArrows}| uses |\textstyle| by
+% default.
 %
 % Once again, it's possible to change this behaviour with |\WithArrowsOptions|:
 %
@@ -820,9 +863,11 @@
 %
 %
 % \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
+% 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\{
@@ -838,9 +883,10 @@
 %
 % \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|, |CodeBefore| and |CodeAfter|). The
-% command |Arrow| can be used as usual in each environment |{WithArrows}|.
+% 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|, |CodeBefore| and |CodeAfter|). The command |Arrow|
+% can be used as usual in each environment |{WithArrows}|.
 % 
 % \begin{Verbatim}[formatcom=\small\color{gray}]
 % $~emphase#\begin{WithArrows}@
@@ -877,11 +923,11 @@
 % \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 :
+% 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}[CodeAfter = {\Arrow[v]{1-2}{2-2}{division by $2$}}]
+% $\begin{WithArrows}[CodeAfter = \Arrow[v]{1-2}{2-2}{division by $2$} ]
 % \varphi(x,y)=0
 %   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
 %   & \Leftrightarrow
@@ -899,8 +945,9 @@
 %
 %
 % \bigskip
-% Such a construction is possible by using |\Arrow| in the |CodeAfter| option. Indeed, in |CodeAfter|, a special
-% version of |\Arrow| is available (we will call it ``|\Arrow| in |CodeAfter|'').
+% Such a construction is possible by using |\Arrow| in the |CodeAfter| option.
+% Indeed, in |CodeAfter|, a special version of |\Arrow| is available (we will
+% call it ``|\Arrow| in |CodeAfter|'').
 %
 % \smallskip
 % A command |\Arrow| in |CodeAfter| takes three arguments :
@@ -909,15 +956,17 @@
 % \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).
+% 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.
+% 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}|.
+% In the previous example, there are two environments |{WithArrows}| nested in
+% the main environment |{WithArrows}|.
 %
 % $\begin{WithArrows}[TikzCode = {\path (#1) to node {#3} (#2) ; }]
 % \varphi(x,y)=0
@@ -936,11 +985,12 @@
 % \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 |CodeAfter| :
+% 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 |CodeAfter| :
 % \begin{Verbatim}
-% $\begin{WithArrows}[~emphase#CodeAfter = {\Arrow{1-2}{2-2}{division by $2$}}@]
+% $\begin{WithArrows}[~emphase#CodeAfter = \Arrow{1-2}{2-2}{division by $2$}@ ]
 % \varphi(x,y)=0
 %   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
 % .........
@@ -947,7 +997,7 @@
 % \end{WithArrows}$
 % \end{Verbatim}
 %
-% $\begin{WithArrows}[CodeAfter = {\Arrow{1-2}{2-2}{division by $2$}}]
+% $\begin{WithArrows}[CodeAfter = \Arrow{1-2}{2-2}{division by $2$} ]
 % \varphi(x,y)=0
 %   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
 %   & \Leftrightarrow
@@ -964,16 +1014,18 @@
 % \end{WithArrows}$
 % 
 % \bigskip
-% The options allowed for a command |\Arrow| in |CodeAfter| are : |ll|, |lr|, |rl|, |rr|, |v|, |xoffset|, |tikz|
-% and |TikzCode|. Except |v|, which is specific to |\Arrow| in |CodeAfter|, all these options have their usual
+% The options allowed for a command |\Arrow| in |CodeAfter| are : |ll|, |lr|,
+% |rl|, |rr|, |v|, |xoffset|, |tikz| and |TikzCode|. Except |v|, which is
+% specific to |\Arrow| in |CodeAfter|, 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 |CodeAfter|. However, it's always possible to translate an arrow with
-% |xoffset| (or |xshift| of Tikz). 
+% 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 |CodeAfter|. However, it's always possible to
+% translate an arrow with |xoffset| (or |xshift| of Tikz).
 % \begin{Verbatim}
-% $\begin{WithArrows}[CodeAfter = {\Arrow~emphase#[v]@{1-2}{2-2}{division by $2$}}]
+% $\begin{WithArrows}[CodeAfter = \Arrow~emphase#[v]@{1-2}{2-2}{division by $2$} ]
 % \varphi(x,y)=0
 %   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
 % .........
@@ -980,7 +1032,7 @@
 % \end{WithArrows}$
 % \end{Verbatim}
 %
-% $\begin{WithArrows}[CodeAfter = {\Arrow[v]{1-2}{2-2}{division by $2$}}]
+% $\begin{WithArrows}[CodeAfter = \Arrow[v]{1-2}{2-2}{division by $2$} ]
 % \varphi(x,y)=0
 %   & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
 %   & \Leftrightarrow
@@ -998,15 +1050,16 @@
 %
 %  
 % \interitem
-% The package \pkg{witharrows} gives also another command available only in |CodeAfter|: 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}.
+% The package \pkg{witharrows} gives also another command available only in
+% |CodeAfter|: 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,
-%                     CodeAfter = {~emphase#\MultiArrow{1,...,4}{text}@}]
+%                     CodeAfter = {~emphase#\MultiArrow{1,...,4}{text}@} ]
 % A & = B \\
 %   & = C \\
 %   & = D \\
@@ -1026,25 +1079,29 @@
 % \end{WithArrows}$
 %
 % \medskip
-% As of now, there is no option available for the command |\MultiArrow| (maybe in a future release).
+% 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.
+% 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''.
+% 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 |shownodenames| to show the names of these nodes.}
+% 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}[shownodes,shownodenames]
+% \[\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]
@@ -1075,21 +1132,28 @@
 % \end{WithArrows}\]
 %
 % \medskip
-% The package \pkg{witharrows} provides some tools facilitating the use of these nodes:
+% 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$;
+% \item the command |\WithArrowsLastEnv| gives the number of the last
+% environment of level~$0$;
 %
-% \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 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 |TikzCode|. This style is modified (in TeX scopes) by the option |tikz| of \pkg{witharrows}.};
+% \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
+% |TikzCode|. 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|).
+% \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
+% 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}
@@ -1137,12 +1201,14 @@
 % \end{tikzpicture}
 %
 % \medskip
-% In this case, it would be easier to use a command |\Arrow| in |CodeAfter| but this is an example to explain how
-% the Tikz nodes created by \pkg{witharrows} can be used.
+% In this case, it would be easier to use a command |\Arrow| in |CodeAfter| 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.
+% 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@]
@@ -1186,13 +1252,14 @@
 % \section{The environment \{DispWithArrows\}}
 % \label{DispWithArrows}
 % 
-% As previously said, the environment |{WithArrows}| bears similarities with the environment |{aligned}| of
-% |amsmath| (and |mathtools|). This extension also provides an environment |{DispWithArrows}| which is similar to
-% the environments |{align}| and |{flalign}| of |amsmath|.
+% As previously said, the environment |{WithArrows}| bears similarities with the
+% environment |{aligned}| of |amsmath| (and |mathtools|). This extension also
+% provides an environment |{DispWithArrows}| which is similar to the
+% environments |{align}| and |{flalign}| of |amsmath|.
 %
 % \medskip
-% The environment |{DispWithArrows}| must be used \emph{outside} math mode. Like |{align}|, it should be used in
-% horizontal mode.
+% 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} \\
@@ -1209,7 +1276,8 @@
 % 
 % 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|.
+% 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}
@@ -1222,14 +1290,16 @@
 % 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}).
+% 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}.}
+% 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 \\
@@ -1242,9 +1312,11 @@
 % \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|.}
+% 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} \\
@@ -1257,10 +1329,12 @@
 % \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.
+% 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} \\
@@ -1275,9 +1349,11 @@
 % \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.
+% 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@]
@@ -1291,25 +1367,31 @@
 % \end{DispWithArrows}
 %
 % \medskip
-% \emph{Remark} : By design, the option |fleqn| of \pkg{witharrows} is independant 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.
+% \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.
 %
 % \bigskip
-% If the package \pkg{amsmath} is loaded, it's possible to use the environment |{subequations}| and the command
-% |\intertext| in the environments |{DispWithArrows}| and |{DispWithArrows*}| (and even the |\intertext| of
+% If the package \pkg{amsmath} is loaded, it's possible to use the environment
+% |{subequations}| and the command |\intertext| in the environments
+% |{DispWithArrows}| and |{DispWithArrows*}| (and even the |\intertext| of
 % \pkg{nccmath} if this package is loaded).
 %
-% 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.}
+% 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.}
 %
 % \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.
+% 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)}
@@ -1338,36 +1420,44 @@
 % 
 %
 % \bigskip 
-% 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}).
+% 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}| allows only two columns.
-% \item The environment |{DispWithArrows}| can not 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 second column. 
+% \item The environment |{DispWithArrows}| can not 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 second column.
 % \item 
 % \begin{bfseries}
-% Last but not least, by default, the elements of a \texttt{\{DispWithArrows\}} are composed in \texttt{textstyle} and not in
-% \texttt{displaystyle} (it's possible to change this point with the option \texttt{displaystyle}).
+% Last but not least, by default, the elements of a \texttt{\{DispWithArrows\}}
+% are composed in \texttt{textstyle} and not in \texttt{displaystyle} (it's
+% possible to change this point with the option \texttt{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.}
+% 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).
 %
 % \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} 
+% 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@]
@@ -1390,9 +1480,10 @@
 % \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 |CodeAfter| of the environments |{DispWithArrows}| or |{DispWithArrows*}|.
+% 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 |CodeAfter|
+% of the environments |{DispWithArrows}| or |{DispWithArrows*}|.
 % 
 %
 %
@@ -1403,17 +1494,20 @@
 %
 % \label{TikzCode}
 %
-% The option |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 |TikzCode| will have no effect for
-% the arrows of this environment but only for the arrows in the nested environments |{WithArrows}|.}
+% The option |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 |TikzCode| 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 |TikzCode|. 
+% For example, the options ``|up|'' and ``|down|'' described previously (cf.
+% p.~\pageref{up-and-down}) are programmed internally with |TikzCode|.
 % 
 % \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.
+% 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:
@@ -1423,8 +1517,8 @@
 %
 %
 % \bigskip
-% In the following example, we replace this default path by a path with three segments (and the node overwriting
-% the second segment).
+% 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}[ygap=5pt,interline=4mm,
 %       ~emphase#TikzCode = {\draw[rounded corners]@
@@ -1468,25 +1562,27 @@
 % \end{WithArrows}\]
 %
 % \bigskip
-% The environments |{DispWithArrows}| and its starred version |{DispWithArrows*}| provide a command
-% |\WithArrowsRightX| which can be used in a definition of |TikzCode|. 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}. 
+% The environments |{DispWithArrows}| and its starred version
+% |{DispWithArrows*}| provide a command |\WithArrowsRightX| which can be used in
+% a definition of |TikzCode|. 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 WithArrowsNewStyle}
 %
-% The extension \pkg{witharrows} provides a command |\WithArrowsNewStyle| to define styles in a way similar to the
-% ``styles'' of Tikz.
+% 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 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|. 
+% 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}.
 %
@@ -1494,15 +1590,17 @@
 % \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|. 
+% 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:
+% 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).
+% \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}
 %
 %
@@ -1529,13 +1627,14 @@
 % \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.
+% 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).
+% 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} \\
@@ -1550,8 +1649,9 @@
 %
 %
 % \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.
+% 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}
@@ -1561,12 +1661,14 @@
 %
 %
 % \bigskip
-% It's also possible to use the option |adjust| which sets both |start-adjust| and |end-ajust|.
+% 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 :
+% 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}
@@ -1574,30 +1676,35 @@
 % \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|.
+% 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}.
+% 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
+% 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.
+% 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}.
+% 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:
+% 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}
@@ -1609,22 +1716,26 @@
 % \bigskip
 % \subsection{Note for developpers}
 %
-% If you want to construct an environment upon an environment of \pkg{witharrows}, it's recommand to call the
-% environment with the construction |\WithArrows|-|\endWithArrows| or |\DispWithArrows|-|\endDispWithArrows| (and
+% 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.
+% 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}|:
+% 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:
+% 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.
@@ -1631,11 +1742,11 @@
 % \end{BVerbatim}
 % 
 % \interitem
-% Another example is the definition of the environment |{DispWithArrows*}| internally in the package
-% \pkg{witharrows} by the following code:
+% 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}
+%     {\WithArrowsOptions{notag}%
 %      \DispWithArrows}
 %     {\endDispWithArrows}
 % \end{Verbatim}
@@ -1644,8 +1755,8 @@
 %
 % \subsection{With only one column}
 %
-% It's possible to use the environment |{WithArrows}| with making use of the left column only, or the right column
-% only.
+% It's possible to use the environment |{WithArrows}| with making use of the
+% left column only, or the right column only.
 % %
 % \begin{Verbatim}
 % $\begin{WithArrows}
@@ -1664,7 +1775,8 @@
 % \bigskip
 % \subsection{MoveEqLeft}
 %
-% It's possible to use |\MoveEqLeft| of \pkg{mathtools} (if we don't want ampersand on the first line):
+% It's possible to use |\MoveEqLeft| of \pkg{mathtools} (if we don't want
+% ampersand on the first line):
 % %
 % \begin{Verbatim}[formatcom=\small\color{gray}]
 % $\begin{WithArrows}[interline=0.5ex]
@@ -1694,8 +1806,8 @@
 % \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.
+% 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}%
@@ -1737,19 +1849,23 @@
 % \bigskip
 % \subsection{Examples with the option TikzCode}
 %
-% We recall that the option |TikzCode| 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 |TikzCode| is not used for this environment (but is used for the environments nested inside).}
+% We recall that the option |TikzCode| 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 |TikzCode| is not used for this environment (but is used for the
+% environments nested inside).}
 %
 % \smallskip
-% The value by defaut of |TikzCode| 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.
+% The value by defaut of |TikzCode| 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 |TikzCode| 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.
+% In the following example, we define the value of |TikzCode| 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*}%
@@ -1790,11 +1906,13 @@
 % \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 |TikzCode|, 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}.
+% 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 |TikzCode|, 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}       
@@ -1852,8 +1970,9 @@
 % \bigskip
 % \subsubsection{Example 3}
 % 
-% In the following example, we change the shape of the arrow depending on wether the start row is longer than the
-% end row or not. This example requires the Tikz library \pkg{calc}.
+% In the following example, we change the shape of the arrow depending on wether
+% 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,
@@ -1914,10 +2033,11 @@
 % 
 % \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 |CodeAfter|. 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).
+% 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 |CodeAfter|. 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 {}
@@ -1927,8 +2047,9 @@
 %          \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}}
 % \end{Verbatim}
 % 
-% The command |\WithArrowsNbLines| is a command available in |CodeAfter| which gives the total number of lines (=rows) of the
-% current environment (it's a command and not a counter).
+% The command |\WithArrowsNbLines| is a command available in |CodeAfter| which
+% gives the total number of lines (=rows) of the current environment (it's a
+% command and not a counter).
 %
 %
 % \bigskip
@@ -1961,9 +2082,10 @@
 %
 %
 % \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 |TikzCode|:
+% 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
+% |TikzCode|:
 %
 % \begin{Verbatim}
 % TikzCode = {\draw (~#1) to node {\footnotesize (~#3)} (~#2) ;}
@@ -1971,7 +2093,7 @@
 %
 % \WithArrowsOptions{TikzCode = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}}
 %
-% $\begin{WithArrows}[CodeAfter = {\NumberedLoop}]
+% $\begin{WithArrows}[CodeAfter = \NumberedLoop]
 % a.\;& f \text{ est continuous on } E \\
 % b.\;& f \text{ est continuous in } 0 \\
 % c.\;& f \text{ is bounded on the unit sphere} \\
@@ -1981,24 +2103,27 @@
 %
 % \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|} 
+% 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}
 \RequirePackage{tikz}
 \usetikzlibrary{arrows.meta,bending}
-\RequirePackage{expl3}[2019/01/28]
+\RequirePackage{expl3}[2019/02/15]
 %    \end{macrocode}
 %
 % \bigskip
-% Then, we can give the traditional declaration of a package written with |expl3|:
+% Then, we can give the traditional declaration of a package written with
+% |expl3|:
 %    \begin{macrocode}
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
@@ -2009,56 +2134,65 @@
 %    \end{macrocode}
 %
 % \bigskip
-% The package \pkg{xparse} will be used to define the environments |{WithArrows}|, |{DispWithArrows}|,
-% |{DispWithArrows*}| and the commands |\Arrow|, |\WithArrowsOptions| and |\WithArrowsNewStyle|. 
+% 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]
+\RequirePackage { xparse } [ 2018-10-17 ]
 %    \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|.
+% 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.
+% The boolean |\g_@@_footnotehyper_bool| will indicate if the option
+% |footnotehyper| is used.
 %    \begin{macrocode}
 \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.
+% 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
 %    \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 } }
+%    \end{macrocode}
 % 
 % \medskip
-% We define a set of keys |WithArrows/package| for these options. However, first, we define a ``level of options''
-% |\l_@@_level_int| even if, in the version \myfileversion{} of \pkg{witharrows}, this integer is not used by the
-% options of the set |WithArrows/package|.
+% We define a set of keys |WithArrows/package| for these options.
 %    \begin{macrocode}
-\int_new:N \l_@@_level_int
+\keys_define:nn { WithArrows / package }
+  { 
+    footnote .bool_gset:N = \g_@@_footnote_bool ,
+    footnotehyper .bool_gset:N = \g_@@_footnotehyper_bool ,
+    unknown .code:n = 
+      \msg_fatal:nn { witharrows } { Option~unknown~for~package } 
+  }
 %    \end{macrocode}
 %
-%
-%    \begin{macrocode}
-\keys_define:nn {WithArrows/package}
-      {footnote      .bool_gset:N = \g_@@_footnote_bool,
-       footnotehyper .bool_gset:N = \g_@@_footnotehyper_bool,
-       unknown       .code:n      = \msg_fatal:nn {witharrows} 
-                                         {Option~unknown~for~package}}
-%    \end{macrocode}
-%
 %    \begin{macrocode}          
-\msg_new:nnn {witharrows}
-             {Option~unknown~for~package}
-             {You~can't~use~the~option~"\tl_use:N\l_keys_key_tl"~when~loading~the~
-              package~witharrows.}
+\@@_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}
 %
 %
@@ -2065,81 +2199,89 @@
 % \bigskip
 % We process the options when the package is loaded (with |\usepackage|).
 %    \begin{macrocode}
-\ProcessKeysOptions {WithArrows/package}
+\ProcessKeysOptions { WithArrows / package }
 %    \end{macrocode}
 % 
 %
 % \medskip
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Option~incompatible~with~Beamer}
-             {The~option~"\tl_use:N \l_keys_key_tl"\ is~incompatible~
-              with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes.}
+\@@_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:nnn {witharrows}
-             {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.}
+\@@_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. 
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {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.}
+\@@_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. 
+  }
 %    \end{macrocode}
 %
 % \medskip
 %    \begin{macrocode}
 \bool_if:NT \g_@@_footnote_bool 
-      {\@ifclassloaded {beamer}
-                {\msg_fatal:nn {witharrows} 
-                               {Option~incompatible~with~Beamer}}
-                {}
-       \@ifpackageloaded{footnotehyper}
-           {\msg_fatal:nn {witharrows}
-                          {footnote~with~footnotehyper~package}}
-           {}
-       \usepackage{footnote}}
+  { 
+    \@ifclassloaded { beamer }
+      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
+      { }
+    \@ifpackageloaded { footnotehyper }
+      { \msg_fatal:nn { witharrows } { footnote~with~footnotehyper~package } }
+      { }
+    \usepackage { footnote } 
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
 \bool_if:NT \g_@@_footnotehyper_bool 
-      {\@ifclassloaded {beamer}
-                {\msg_fatal:nn {witharrows} 
-                               {Option~incompatible~with~Beamer}}
-                {}
-       \@ifpackageloaded{footnote}
-           {\msg_fatal:nn {witharrows}
-                          {footnotehyper~with~footnote~package}}
-           {}
-       \usepackage{footnotehyper}
-       \bool_gset_true:N \g_@@_footnote_bool}
+  { 
+    \@ifclassloaded { beamer }
+      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
+      { }
+    \@ifpackageloaded { footnote }
+      { \msg_fatal:nn { witharrows } { 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
-% known if we have to insert an environnement |{savenotes}| (the |\savenotes| is in |\@@_pre_environment:n|
-% and |\endsavenotes| at the end of the environments |{WithArrows}| and |{DispWithArrows}|).
+% 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_environment: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).
+% 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* {}
+\DeclareOption { leqno } { \bool_set_true:N \c_@@_leqno_bool }
+\DeclareOption* { }
 \ProcessOptions* 
 %    \end{macrocode}
 %
@@ -2149,155 +2291,243 @@
 % \subsection{Some technical definitions}
 %
 %    \begin{macrocode}
-\cs_new_protected:Nn \@@_error:n 
-        {\msg_error:nn {witharrows} {#1}}
-\cs_new_protected:Nn \@@_error:nn
-        {\msg_error:nnn {witharrows} {#1} {#2}}
-\cs_generate_variant:Nn \@@_error:nn {nx}
+\cs_new_protected:Npn \@@_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \@@_error:nn  { \msg_error:nnn { witharrows } }
+\cs_generate_variant:Nn \@@_error:nn { n x }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_bool_new:N
-      {\bool_if_exist:NTF #1
-         {\bool_set_false:N #1}
-         {\bool_new:N #1}}
+  {
+    \bool_if_exist:NTF #1
+      { \bool_set_false:N #1 }
+      { \bool_new:N #1 }
+  }
 %    \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.}
+% 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,mathtools,autonum,cleveref,hyperref,typedref,showlabels,
-             amsthm,varwidth}
-            {\bool_new:c {c_@@_#1_loaded_bool}
-             \@ifpackageloaded {#1}
-                   {\bool_set_true:c {c_@@_#1_loaded_bool}}
-                   {}}}
+\AtBeginDocument 
+  { 
+    \clist_map_inline:nn
+      { 
+        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
+        typedref, varwidth 
+      }
+      {
+        \bool_new:c { c_@@_#1_loaded_bool }
+        \@ifpackageloaded { #1 }
+          { \bool_set_true:c { c_@@_#1_loaded_bool } }
+          { } 
+      }
+  }
 %    \end{macrocode}
 %
+% \bigskip
+% We define a command |\@@_strcmp:nn| to compare two token lists. It will be
+% available wether the engine is pdfTeX, XeTeX or LuaTeX.
+%    \begin{macrocode}
+\sys_if_engine_luatex:TF
+  { 
+    \cs_new_protected:Nn \@@_strcmp:nn 
+      { \lua_now:e { l3kernel.strcmp('#1','#2') } } 
+  }
+  { \cs_new_protected:Nn \@@_strcmp:nn { \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:Nn \@@_sort_seq:N 
+  { 
+    \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 variant will be used in the following command.
 %    \begin{macrocode}
-\cs_generate_variant:Nn \seq_set_split:Nnn {Nxx}
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
 %    \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.
+% 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:Nn \@@_save:N
-   {\seq_set_split:Nxx \l_tmpa_seq {\char_generate:nn {`_} {12}} {\cs_to_str: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 }
+    \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.
+% 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:Nn \@@_restore:N 
-   {\seq_set_split:Nxx \l_tmpa_seq {\char_generate:nn {`_} {12}} {\cs_to_str: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 _ _ _ } }
+    \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.
+% 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 = 0 pt,
-               minimum~width = 0pt,
-               minimum~height = \l_@@_ygap_dim}}
+\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 |shownodes| (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 |shownodes|.}
+% 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.
+% 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-}}
+\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|).
+% 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]} }}
+\tikzset
+  { 
+    WithArrows / arrow / tips / .style = 
+      { > = { Straight~Barb [ scale = 1.2 , bend ] } } 
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% The style |WithArrows/arrow| will be used to draw the arrow (more precisely, it will be passed to |every~path|).
+% 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,
+\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.
+%
+% 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,
-                                      font = \small\itshape,
-                                      WithArrows/arrow/tips,
-                                      bend~left = 45,
-                                      -> }}
+     auto = left ,
+     font = \small \itshape ,
+     WithArrows / arrow / tips ,
+     bend~left = 45 ,
+     -> 
+   }
+ }
 %    \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}|.
+% 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
+% 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}
-\AtBeginDocument
-    {\bool_if:NF \c_@@_amsmath_loaded_bool
-       {\cs_set_protected:Npn \spread at equation
-           {\openup\jot   
-            \cs_set_eq:NN \spread at equation \prg_do_nothing:}}}
+\AtBeginDocument 
+  {
+    \bool_if:NF \c_@@_amsmath_loaded_bool
+      { 
+        \cs_set_protected:Npn \spread at equation
+          { 
+            \openup \jot   
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:
+          }
+      } 
+  }
 %    \end{macrocode}
-% Don't put |\cs_set_eq:NN \spread at equation \prog_do_nothing:| in the last line because this would raise errors
-% with nested environments. 
 %
-%
 % \bigskip
 % \subsection{Variables}
 %
-% The boolean |\l_@@_in_WithArrows_bool| will be raised in an environment |{WithArrows}| and the
-% boolean |\l_@@_in_dispwitharrows_bool| in an environment |{DispWithArrows}| or |{DispWithArrows*}|.
+% The boolean |\l_@@_in_WithArrows_bool| will be raised in an environment
+% |{WithArrows}| and the boolean |\l_@@_in_dispwitharrows_bool| in an
+% environment |{DispWithArrows}| or |{DispWithArrows*}|. The boolean
+% |\l_@@_in_CodeAfter_bool| will be raised during the execution of the
+% |CodeAfter| (option |CodeAfter|).
 %    \begin{macrocode}
 \bool_new:N \l_@@_in_WithArrows_bool
 \bool_new:N \l_@@_in_DispWithArrows_bool
+\bool_new:N \l_@@_in_CodeAfter_bool
 %    \end{macrocode}
 %
-% The following sequence is the position of the last environment |{WithArrows}| in the tree of the nested
-% environments |{WithArrows}|. 
+% 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
@@ -2304,21 +2534,23 @@
 %    \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|.
+% 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 skip (=glue) is the vertical space inserted between two lines (=rows) of the |\halign|.
+% The following skip (=glue) is the vertical space inserted between two lines
+% (=rows) of the |\halign|.
 %    \begin{macrocode}
 \skip_new:N \l_@@_interline_skip
 %    \end{macrocode}
 %
 % \bigskip
-% The following integer indicates the position of the box that will be created: 0 (=|t|=|\vtop|),
-% 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|).
+% The following integer indicates the position of the box that will be created:
+% 0 (=|t|=|\vtop|), 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|).
 %    \begin{macrocode}
 \int_new:N \l_@@_pos_env_int 
 %    \end{macrocode}
@@ -2326,13 +2558,14 @@
 % \bigskip
 %    \begin{macrocode}
 \dim_new:N \l_@@_xoffset_dim
-\dim_set:Nn \l_@@_xoffset_dim {3mm}
+\dim_set:Nn \l_@@_xoffset_dim { 3 mm }
 %    \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 |CodeAfter| where the options |i|, |group| et |groups| are not available).
+% 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
+% |CodeAfter| where the options |i|, |group| et |groups| are not available).
 %
 % \begin{center}
 % \begin{tabular}{l}
@@ -2343,7 +2576,8 @@
 % |\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 |CodeAfter| (see below).
+% \footnotesize The option |v| can be used only in |\Arrow| in |CodeAfter| (see
+% below). 
 % \end{tabular}
 % \end{center}
 %
@@ -2354,37 +2588,36 @@
 %    \end{macrocode}
 %
 % \medskip
-% When we scan a list of options, we want to be able to raise an error if two options of position of the arrows
-% are present. That's why we keep the code of the first option of position in a variable called
-% |\l_@@_previous_pos_arrow_int|. This variable will be set to $-1$ each time we start the scanning of a list of options.
-%
+% 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 after the last row of the environment.
 %    \begin{macrocode}
-\int_new:N \l_@@_previous_pos_arrow_int
+\str_new:N \l_@@_input_line_str
 %    \end{macrocode}
 %
 % \bigskip
-%
-% At each possible level for the options (\emph{global}, \emph{environment} or \emph{local}: see below), the new
-% values will be appended on the right of this token list.
-%
-% \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.
+% 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_new:N \l_@@_x_dim
 %    \end{macrocode}
 %
 % \bigskip
-% In the |\halign| of an environment |{WithArrows}|, we will have to use two counters:
+% In the |\halign| of an environment |{WithArrows}| or |{DispWithArrows}|, we
+% will have to use two 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|.
 % \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.
+% 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
@@ -2392,27 +2625,24 @@
 \int_new:N \g_@@_line_int
 %    \end{macrocode}
 %
-% \bigskip
-% The token list |\l_@@_name_tl| will contain the 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}
-\tl_new:N \l_@@_name_tl
-%    \end{macrocode}
 %
 %
 % \bigskip
-% The boolean |\l_@@_fleqn_bool| indicates wether the environments |{DispWithArrows}| must be composed flush left or
-% centered. It corresponds to the option |fleqn|.
+% The boolean |\l_@@_fleqn_bool| indicates wether the environments
+% |{DispWithArrows}| must be composed flush left or centered. It corresponds to
+% the option |fleqn|.
 %    \begin{macrocode}
 \bool_new:N \l_@@_fleqn_bool
 %    \end{macrocode}
 % 
 % \bigskip
-% The dimension |\l_@@_mathindent_dim| is used only by the environments |{DispWithArrows}|: it's the left margin of
-% the environments |{DispWithArrows}| if the environment |{DispWithArrows}| is composed flush left (option |fleqn|).
+% The dimension |\l_@@_mathindent_dim| is used only by the environments
+% |{DispWithArrows}|: it's the left margin of the environments
+% |{DispWithArrows}| if the environment |{DispWithArrows}| is composed flush
+% left (option |fleqn|).
 %    \begin{macrocode}
 \dim_new:N \l_@@_mathindent_dim
-\dim_set:Nn \l_@@_mathindent_dim {25pt}
+\dim_set:Nn \l_@@_mathindent_dim { 25 pt }
 %    \end{macrocode}
 % 
 % \bigskip
@@ -2422,12 +2652,13 @@
 %    \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|.
+% 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}
 \clist_new:N \l_@@_tags_clist
-\clist_set:Nn \l_@@_tags_clist {all}
+\clist_set:Nn \l_@@_tags_clist { all }
 %    \end{macrocode}
 % 
 % \bigskip
@@ -2437,7 +2668,8 @@
 %    \end{macrocode}
 % 
 % \bigskip
-% The boolean |\l_@@_tag_star_bool| will be raised if the user uses the command |\tag| with a star.
+% The boolean |\l_@@_tag_star_bool| will be raised if the user uses the command
+% |\tag| with a star.
 %    \begin{macrocode}
 \bool_new:N \l_@@_tag_star_bool
 %    \end{macrocode}
@@ -2444,8 +2676,8 @@
 %
 % 
 % \bigskip
-% The boolean |\l_@@_in_first_column_bool| will be used to know wether we are in the first column of the
-% environment |{WithArrows}| or |{DispWithArrows}|.
+% The boolean |\l_@@_in_first_column_bool| will be used to know wether we are in
+% the first column of the environment |{WithArrows}| or |{DispWithArrows}|.
 %    \begin{macrocode}
 \bool_new:N \l_@@_in_first_column_bool
 %    \end{macrocode}
@@ -2457,499 +2689,600 @@
 %    \end{macrocode}
 %
 % \bigskip
-% The dimension |\l_@@_start_adjust_dim| and |\l_@@_end_adjust_dim| correspond to the options
-% |start-adjust| and |end-adjust|.
+% The dimension |\l_@@_start_adjust_dim| and |\l_@@_end_adjust_dim| correspond
+% to the options |start-adjust| and |end-adjust|.
 %    \begin{macrocode}
 \dim_new:N \l_@@_start_adjust_dim
-\dim_set:Nn \l_@@_start_adjust_dim {0.4ex}
+\dim_set:Nn \l_@@_start_adjust_dim { 0.4 ex }
 \dim_new:N \l_@@_end_adjust_dim
-\dim_set:Nn \l_@@_end_adjust_dim {0.4ex}
+\dim_set:Nn \l_@@_end_adjust_dim { 0.4 ex }
 %    \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_new:N \l_@@_CommandName_str
-\str_set:Nn \l_@@_CommandName_str {Arrow}
+\str_new:N \l_@@_status_arrow_str
 %    \end{macrocode}
 %
 % \bigskip
-% The string |\l_@@_string_Arrow_for_messages_str| is only a string that will be displayed in some error messages.
-% For example, if |CommandName| is defined to be |Explanation|, the string |\l_@@_string_Arrow_for_messages_str|
-% will contain "|\Arrow (renamed here in \Explanation)|". 
 %    \begin{macrocode}
-\str_new:N \l_@@_string_Arrow_for_messages_str
-\str_set:Nx \l_@@_string_Arrow_for_messages_str {\token_to_str:N \Arrow}
+\str_set:Nn \l_@@_CommandName_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 |CommandName| is defined to
+% be |Explanation|, the string |\l_@@_string_Arrow_for_msg_str| will contain
+% ``|\Arrow alias \Explanation|''. 
+%    \begin{macrocode}
+\str_set:Nx \l_@@_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
+\bool_new:N \l_@@_displaystyle_bool
+\bool_new:N \l_@@_show_node_names_bool
+%    \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 (number~$0$);
-% \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.} (number~$1$);
-% \item with |\begin{WithArrows}[...]|: this level will be called \emph{environment} level (number~$2$);
-% \item with |\Arrow[...]| (included in |CodeAfter|): this level will be called \emph{local} level (number~$3$). 
+% \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 |CodeAfter|): this level will be called
+% \emph{local} level.
 % \end{itemize}
 %
+%
 % \bigskip
-% The level is specified in the variable |\l_@@_level_int| and the code attached to the options can use this
-% information to alter its actions.
+% When we scan a list of options, we want to be able to raise an error if two
+% options of position of the arrows are present. That's why we keep 
+% the first option of position in a variable called |\l_@@_previous_key_str|.
 %
-% \medskip
 %    \begin{macrocode}
-\int_set:Nn \l_@@_level_int 1
+\cs_new_protected:Nn \@@_eval_if_allowed:n
+  { 
+    \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}
 %
-% \bigskip
-% We start with a submodule which will be loaded only at the global or the environment level.
 %
-% \medskip
-% The options |t|, |c| and |b| indicate if we will create a |\vtop|, a |\vcenter| or a |\vbox|. This information is
-% stored in the variable |\l_@@_pos_env_int|. Of course, they are available only in |{WithArrows}| and not in
-% |{DispWithArrows}| or |{DispWithArrows*}|
 %    \begin{macrocode}
-\keys_define:nn {WithArrows/GlobalOrEnv}
-   {  t   .code:n            = {\bool_if:NTF \l_@@_in_DispWithArrows_bool
-                                 {\@@_error:n {Option~will~be~ignored}
-                                 {\int_set:Nn \l_@@_pos_env_int 0}}},
-      t   .value_forbidden:n = true,
-      c   .code:n            = {\bool_if:NTF \l_@@_in_DispWithArrows_bool
-                                 {\@@_error:n {Option~will~be~ignored}}
-                                 {\int_set:Nn \l_@@_pos_env_int 1}},
-      c   .value_forbidden:n = true,
-      b   .code:n            = {\bool_if:NTF \l_@@_in_DispWithArrows_bool
-                                 {\@@_error:n {Option~will~be~ignored}}
-                                 {\int_set:Nn \l_@@_pos_env_int 2}},
-      b   .value_forbidden:n = true,
+\cs_new_protected:Nn \@@_fix_pos_option:n
+  { \@@_eval_if_allowed:n { \int_set:Nn \l_@@_pos_arrow_int { #1 } } }
 %    \end{macrocode}
 %
 % \bigskip
-% The gap between two consecutive arrows.
+% First a set of keys that will be used at the global or environment level of
+% options.
 %    \begin{macrocode}
-      ygap .dim_set:N        = \l_@@_ygap_dim,
-      ygap .value_required:n = true,
-      ygap .initial:n        = 0.4 ex,
+\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 { Third~column~in~WithArrows } { none } ,
+    more-columns .value_forbidden:n = true,
+    CommandName .code:n =
+      \str_set:Nn \l_@@_CommandName_str { #1 }
+      \str_set:Nx \l_@@_string_Arrow_for_msg_str
+        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+    CommandName .value_required:n = true ,
+    TikzCode .tl_set:N = \l_@@_tikz_code_tl,
+    TikzCode .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    TikzCode .value_required:n = true ,
+    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 ,
+    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 ,
+    end-adjust .dim_set:N = \l_@@_end_adjust_dim ,
+    end-adjust .value_required:n = true ,
+    adjust .code:n  = 
+      \dim_set:Nn \l_@@_start_adjust_dim { #1 }
+      \dim_set:Nn \l_@@_end_adjust_dim { #1 } ,
+    adjust .value_required:n = true
+  }
 %    \end{macrocode}
-%
-% \bigskip
-% The vertical position of the start point of an arrow.
-%    \begin{macrocode}
-      ystart .dim_set:N        = \l_@@_ystart_dim,
-      ystart .value_required:n = true,
-      ystart .initial:n        = 0.4 ex,
-%    \end{macrocode}
-%
 % 
 % \bigskip
-% Usually, the number of columns in a |{WithArrows}| environment is limited to 2. Nevertheless, it's possible to
-% have more columns with the option |MoreColumns|.
+% 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}
-      MoreColumns .code:n            = { \bool_if:NTF \l_@@_in_DispWithArrows_bool
-                                           {\@@_error:n {Option~will~be~ignored}}
-                                           { \msg_redirect_name:nnn
-                                             {witharrows}
-                                             {Third~column~in~WithArrows}
-                                             {none} }},
-      MoreColumns .value_forbidden:n = true,
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+  { 
+    t   .code:n            = \int_set:Nn \l_@@_pos_env_int 0 ,
+    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 option |AllowLineWithoutAmpersand| is obsolete and will be deleted in a future version.
+% 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}
-      AllowLineWithoutAmpersand .code:n = { \@@_error:n
-                                            {AllowLineWithoutAmpersand}},
-      AllowLineWithoutAmpersand .value_forbidden:n = true,
+\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 ,
+    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 ,
+    nonumber .meta:n = notag ,
+    allow-multiple-labels .code:n = 
+      \@@_msg_redirect_name:nn { Multiple~labels } { none } ,
+    allow-multiple-labels .value_forbidden:n = true ,
+    wrap-lines .bool_set:N = \l_@@_wrap_lines_bool ,
+    wrap-lines .default: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 
+  }
 %    \end{macrocode}
-% 
-% \bigskip
-% If the user wants to give a new name to the |\Arrow| command (and the name |\Arrow| remains free).
-%    \begin{macrocode}
-      CommandName .code:n = 
-        {\str_set:Nn \l_@@_CommandName_str {#1}
-%    \end{macrocode}
 %
-% The string |\l_@@_string_Arrow_for_messages_str| will be used only in some error messages.
-%    \begin{macrocode}
-         \str_set:Nx \l_@@_string_Arrow_for_messages_str
-                    {\c_backslash_str Arrow~(renamed~here~in~\c_backslash_str #1)}},
-      CommandName .value_required:n = true,
-%    \end{macrocode}
 %
 % \bigskip
+% Now, we begin the construction of the set of keys that will be used in the
+% environments |{WithArrows}|.
 %    \begin{macrocode}
-      TikzCode .tl_set:N         = \l_@@_tikz_code_tl,
-      TikzCode .initial:n        = \draw~(#1)~to~node{#3}~(#2)~; ,
-      TikzCode .value_required:n = true,
+\keys_define:nn { WithArrows } 
+  { 
+    WithArrows .inherit:n = 
+      { 
+        WithArrows / Global , 
+        WithArrows / WithArrowsSpecific 
+      }
+  }
 %    \end{macrocode}
-%    
-% \bigskip
-% With the option |displaystyle|, the environments will be composed in |\displaystyle|.
-%    \begin{macrocode}
-      displaystyle .bool_set:N     = \l_@@_displaystyle_bool,
-      displaystyle .initial:n      = false,
-%    \end{macrocode}
-%
-% \bigskip
-% With the option |shownodes|, the nodes will be drawn in red (useful only for debugging).
-%    \begin{macrocode}
-      shownodes .code:n            = {\tikzset{@@_node_style/.append~style = {draw,red}}},
-      shownodes .value_forbidden:n = true,
-%    \end{macrocode}
 % 
-% \bigskip
-% With the option |shownodenames|, the name of the ``right nodes'' will be written in the document (useful only
-% for debugging). 
+% \medskip
 %    \begin{macrocode}
-      shownodenames .bool_set:N    = \l_@@_shownodenames_bool,
-      shownodenames .initial:n     = false,
+\keys_define:nn { WithArrows / WithArrows } 
+ { 
+   name .tl_set:N = \l_@@_name_str ,
+   name .value_required:n = true ,
+   CodeBefore .code:n = \tl_put_right:Nn \l_@@_code_before_tl { #1 } ,
+   CodeBefore .value_required:n = true,
+   CodeAfter .code:n = \tl_put_right:Nn \l_@@_code_after_tl { #1 } ,
+   CodeAfter .value_required:n = true ,
+   unknown .code:n  = 
+     \@@_sort_seq:N \l_@@_options_WithArrows_seq 
+     \@@_error:n { Unknown~option~WithArrows } 
+ }
 %    \end{macrocode}
-%
-% \bigskip
-% With the option |group|, \emph{all} the arrows of the environment are vertical with the same abscissa and at a
-% leftmost position.
-%    \begin{macrocode}
-      group    .code:n    = {\int_compare:nNnT \l_@@_previous_pos_arrow_int > {-1}
-                                    {\@@_error:n {Incompatible~options}}
-                             \int_set:Nn \l_@@_previous_pos_arrow_int 7
-                             \int_set:Nn \l_@@_pos_arrow_int 7} ,
-      group    .value_forbidden:n = true,
-%    \end{macrocode}
-%
-% \bigskip
-% With the option |groups| (with a \emph{s}), the arrows of the environment are divided in groups by an argument of
-% connexity, and, in each group, the arrows are vertical with the same abscissa and at a leftmost position. 
-%    \begin{macrocode}
-      groups   .code:n   = {\int_compare:nNnT \l_@@_previous_pos_arrow_int > {-1}
-                                   {\@@_error:n {Incompatible~options}}
-                            \int_set:Nn \l_@@_previous_pos_arrow_int 6
-                            \int_set:Nn \l_@@_pos_arrow_int 6} ,
-      groups   .value_forbidden:n = true,
-%    \end{macrocode}
 % 
 % \bigskip
-% The option |CodeBefore| gives a code that is executed at the beginning of the environment |{WithArrows}| (after
-% the eventual |\savenotes|).
+% A sequence of the options available in |{WithArrows}|. This sequence will be
+% used in the error messages and can be modified dynamically.
 %    \begin{macrocode}
-      CodeBefore  .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
-                              {\@@_error:n {Option~will~be~ignored}}
-                              {\tl_put_right:Nn \l_@@_code_before_tl {#1}}} ,
-      CodeBefore  .value_required:n = true,
+\seq_set_from_clist:Nn \l_@@_options_WithArrows_seq
+  { 
+    adjust, b, c, CodeAfter, CodeBefore, CommandName, displaystyle, end-adjust,
+    group, groups, i, interline, jot, ll, lr, more-columns, name, rl, rr,
+    show-node-names, show-nodes, start-adjust, t, tikz, TikzCode, xoffset, ygap,
+    ystart
+  } 
 %    \end{macrocode}
 %
 % \bigskip
-% The option |CodeAfter| gives a code that is executed at the end of the environment |{WithArrows}| (before the
-% eventual |\endsavenotes|).
+% Now, we construct the keys set which will be used in the environments
+% |{DispWithArrows}| and |{DispWithArrows*}|.
 %    \begin{macrocode}
-      CodeAfter .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
-                              {\@@_error:n {Option~will~be~ignored}}
-                              {\tl_put_right:Nn \l_@@_code_after_tl {#1}}} ,
-      CodeAfter .value_required:n = true,
+\keys_define:nn { WithArrows } 
+  { 
+    DispWithArrows .inherit:n = 
+     { 
+       WithArrows / DispWithArrowsSpecific , 
+       WithArrows / Global 
+     } 
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% The option |name| is a name given to the environment. If this option is used, the nodes created in the
-% environment will have aliases constructed with this name (and it will be easier to use these nodes from outside
-% the environment).
 %    \begin{macrocode}
-      name .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
-                              {\@@_error:n {Option~will~be~ignored}}
-                              {\tl_set:Nn \l_@@_name_tl {#1}}} ,
-      name .value_required:n = true,
+\keys_define:nn { WithArrows / DispWithArrows } 
+  { 
+    name .tl_set:N = \l_@@_name_str ,
+    name .value_required:n = true ,
+    CodeBefore .code:n = \tl_put_right:Nn \l_@@_code_before_tl { #1 } ,
+    CodeBefore .value_required:n = true ,
+    CodeAfter .code:n  =  \tl_put_right:Nn \l_@@_code_after_tl { #1 } ,
+    CodeAfter .value_required:n = true ,
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_DispWithArrows_seq
+      \@@_error:n { Unknown~option~DispWithArrows } 
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% The option |fleqn| indicates wether the environments |{DispWithArrows}| are composed centered or flush left.
+% A sequence of the options available in |{DispWithArrows}|. This sequence will
+% be used in the error messages and can be modified dynamically.
 %    \begin{macrocode}
-      fleqn   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                             {\@@_error:n {Option~will~be~ignored}}
-                             {\str_if_eq:nnTF {#1} {true}
-                                 {\bool_set_true:N \l_@@_fleqn_bool}
-                                 {\bool_set_false:N \l_@@_fleqn_bool}}},
-      fleqn   .default:n = true,
+\seq_set_from_clist:Nn \l_@@_options_DispWithArrows_seq
+  { 
+    allow-multiple-labels, CodeAfter, CodeBefore, CommandName, TikzCode, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr, 
+    mathindent, name, nonumber, notag, rl, rr, show-node-names, show-nodes, 
+    start-adjust, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart 
+  }
 %    \end{macrocode}
 % 
 % \bigskip
-% The option |mathindent| is the left margin of the environments |{DispWithArrows}| when the option |fleqn| is used.
+% Now, we construct the keys set which will be used with the command |\WithArrowsOptions|.
 %    \begin{macrocode}
-      mathindent   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                               {\@@_error:n {Option~will~be~ignored}}
-                               {\dim_set:Nn \l_@@_mathindent_dim {#1}}},
-      mathindent   .value_required:n = true,
+\keys_define:nn { WithArrows } 
+  { 
+    WithArrowsOptions .inherit:n = 
+     { 
+       WithArrows / Global , 
+       WithArrows / WithArrowsSpecific , 
+       WithArrows / DispWithArrowsSpecific 
+     } 
+  }
 %    \end{macrocode}
-% 
-% \bigskip
-% The option |notag| indicates wether the environments |{DispWithArrows}| will be without tags (like |{DispWithArrows*}|).
+%
 %    \begin{macrocode}
-      notag   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                             {\@@_error:n {Option~will~be~ignored}}
-                             {\str_if_eq:nnTF {#1} {true}
-                                 {\clist_clear:N \l_@@_tags_clist}
-                                 {\clist_set:Nn \l_@@_tags_clist {all}}}},
-      notag   .default:n = true,
-      nonumber .meta:n   = notag,
+\keys_define:nn { WithArrows / WithArrowsOptions } 
+  { 
+    unknown .code:n  = 
+      \@@_sort_seq:N \l_@@_options_WithArrowsOptions_seq
+      \@@_error:n { Unknown~option~WithArrowsOptions } 
+  }
 %    \end{macrocode}
 % 
+%
 % \bigskip
-% The option |AllowMultipleLabels| indicates wether multiple labels are allowed for the same line of an environment
-% |{DispWithArrows}| or |{DispWithArrows*}|.
+% A sequence of the options available in |\WithArrowsOptions|. This sequence
+% will be used in the error messages and can be modified dynamically.
 %    \begin{macrocode}
-      AllowMultipleLabels .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                                         {\@@_error:n {Option~will~be~ignored}}
-                                         {\msg_redirect_name:nnn {witharrows} 
-                                                           {Multiple~labels}
-                                                           {none}}},
-      AllowMultipleLabels .value_forbidden:n = true,
+\seq_set_from_clist:Nn \l_@@_options_WithArrowsOptions_seq
+  { 
+    allow-multiple-labels, b, c, CommandName, more-columns, TikzCode, adjust, 
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr, 
+    mathindent, nonumber, notag, rl, rr, show-node-names, show-nodes, 
+    start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart
+  }
 %    \end{macrocode}
 % 
 % \bigskip
-% With the option |wrap-lines|, a special |TikzCode| is used in the environments |{DispWithArrows}| and
-% |{DispWithArrows*}| and, with this |TikzCode|, the lines of the labels are automatically wrapped on the right.
+% The command |\@@_set_independent:| is a command without argument that will be
+% used to specifiy 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}
-      wrap-lines   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                               {\@@_error:n {Option~will~be~ignored}}
-                               {\str_if_eq:nnTF {#1} {true}
-                                   {\bool_set_true:N \l_@@_wrap_lines_bool}
-                                   {\bool_set_false:N \l_@@_wrap_lines_bool}}},
-      wrap-lines   .default:n = true,
+\cs_new_protected:Nn \@@_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 known if some arrows are ``independent'' or use the
+% option ``new-group''.
 %    \begin{macrocode}
-      tagged-lines .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
-                              {\@@_error:n {Option~will~be~ignored}}
-                              {\clist_set:Nn \l_@@_tags_clist {#1}
+\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}
-% In the list given as value for the key |tagged-lines|, the user may use |first| as synonymous of |1|. We do the replacement.
-%    \begin{macrocode}
-                               \clist_if_in:NnT \l_@@_tags_clist {first}
-                                  {\clist_remove_all:Nn \l_@@_tags_clist {first}
-                                   \clist_put_left:Nn \l_@@_tags_clist 1 }}},
-      tagged-lines .value_required:n = true,
-%    \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}
-      unknown .code:n  = \@@_error:n {Unknown~option}
-     }
+    TikzCode .code:n = \prg_do_nothing: ,
+    TikzCode .value_required:n = true ,
+    tikz .code:n = \prg_do_nothing: ,
+    tikz .value_required:n = true ,
 %    \end{macrocode}
-% 
-% \bigskip
-% Then we define the main module called |WithArrows/General| which will be loaded at all the levels.
 %
 % \medskip
-% The option |tikz| gives Tikz parameters that will be given to the arrow when it is drawn (more precisely, the
-% parameters will be given to the command |\path| of Tikz).
+% The option |xoffset| is not allowed when the option |group| or the option
+% |groups| is used (since it would be meaningless).
 %    \begin{macrocode}
-\keys_define:nn {WithArrows/General}
-     {tikz     .code:n            = \tikzset {WithArrows/arrow/.append~style = {#1}},
-      tikz     .initial:n         = {},
-      tikz     .value_required:n  = true,
+    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
+      \@@_error:n { Unknown~option~in~Arrow }
+  }
 %    \end{macrocode}
 %
-% \bigskip
-% The other options are for the position of the arrows. The treatment is the same for the options |ll|, |rr|, |lr|,
-% |lr| and |i| and that's why a dedicated fonction |\@@_analyze_option_position:n| has been written (see below).
-%    \begin{macrocode}
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \@@_analyze_option_position:n 3 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \@@_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \@@_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \@@_analyze_option_position:n 0 ,
-      i        .value_forbidden:n = true,
-      i        .code:n            = \@@_analyze_option_position:n 5 ,
-%    \end{macrocode}
 %
 % \bigskip
-% The option |xoffset| change the $x$-offset of the arrows (towards the right). It's a dimension and not a skip.
-% It's not possible to change the value of this parameter for a individual arrow if the option |group| or the
-% option |groups| is used. When we will treat an individual arrow, we will give it the option
-% |tikz={xshift=\l_@@_xoffset_dim}| (we can't to it at the global or the environment level because the Tikz options
-% |xshift| are cumulative.
-%
+% A sequence of the options available in |\Arrow|. This sequence will be used in
+% the error messages and can be modified dynamically.
 %    \begin{macrocode}
-      xoffset  .code:n  = {\bool_if:nTF {\int_compare_p:nNn \l_@@_level_int = 3 &&
-                                        \int_compare_p:nNn \l_@@_pos_arrow_int > 5}
-                               {\@@_error:n {Option~incompatible~with~group}}
-                               {\dim_set:Nn \l_@@_xoffset_dim {#1}}} ,
-      xoffset  .value_required:n  = true,
+\seq_set_from_clist:Nn \l_@@_options_Arrow_seq
+  { 
+    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, TikzCode,
+    xoffset 
+  }
 %    \end{macrocode}
 %
 % \bigskip
-% The option |jot| exists for compatibility. It changes directly the value of the parameter |\jot|, which is a
-% LaTeX parameter and not a parameter specific to \pkg{witharrows}. It's allowed only at the level of the
-% environment (maybe we should suppress completely this option in the future).
 %    \begin{macrocode}
-      jot       .code:n     = {\int_compare:nNnTF \l_@@_level_int = 2
-                                  {\dim_set:Nn \jot {#1}}
-                                  {\@@_error:n {Option~will~be~ignored}}} , 
-      jot       .value_required:n  = true,
+\cs_new_protected:Nn \@@_fix_pos_arrow:n
+  { 
+    \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 option |interline| gives the vertical skip (=glue) inserted between two lines (independently of |\jot|). It's
-% accepted only at the level of the environment (this last point is a kind of security). Futhermore, this option has a
-% particular behaviour: it applies only to the current environment and doesn't apply to the nested environments.
-%    \begin{macrocode}
-      interline   .code:n       = {\int_compare:nNnTF \l_@@_level_int = 2
-                                      {\skip_set:Nn \l_@@_interline_skip {#1}}
-                                      {\@@_error:n {Option~will~be~ignored}}} ,
-      interline   .value_required:n = true,
-%    \end{macrocode}
+% 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.
 %
-% The dimensions |\l_@@_start_adjust_dim| and |\l_@@_end_adjust_dim| are the vertical shift added to some arrows.
-%    \begin{macrocode}
-      start-adjust .dim_set:N = \l_@@_start_adjust_dim,
-      start-adjust .value_required:n = true,
-      end-adjust  .dim_set:N = \l_@@_end_adjust_dim,
-      end-adjust  .value_required:n = true,
-      adjust      .code:n  = {\dim_set:Nn \l_@@_start_adjust_dim {#1}
-                              \dim_set:Nn \l_@@_end_adjust_dim {#1} }, 
-      adjust      .value_required:n = true,
-      unknown     .code:n  = \@@_error:n {Unknown~option}
-}
+%    \begin{macrocode} 
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+  { 
+    TikzCode .tl_set:N = \l_@@_tikz_code_tl ,
+    TikzCode .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}
 %
-% \bigskip
-% The key |jump| indicates the number of lines jumped by the arrow (1 by default). This key will be extracted when
-% the command |\Arrow| will be executed because we want to compute right away the final line of the arrow (this
-% will be useful for the options |group| and |groups|).
+% \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}
-\keys_define:nn {WithArrows/Arrow}
-     {jump  .code:n = {\int_set:Nn \l_@@_jump_int {#1}
-                       \int_compare:nNnF \l_@@_jump_int > 0
-                           {\@@_error:n {Negative~value~for~jump}}} ,
-      jump  .value_required:n  = true,
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \@@_analyze_option_position:n 3 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \@@_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \@@_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \@@_analyze_option_position:n 0 ,
-      i        .value_forbidden:n = true,
-      i        .code:n            = \@@_analyze_option_position:n 5 }
+    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
-% The following command is for technical reasons. It's used for the following options of position: |ll|,
-% |lr|, |rl|, |rr| and |i|. The argument is the corresponding code for the position of the arrows.
+% |\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 construct with |{WithArrows}|). That's
+% why we have constructed a set of keys specific to |\WithArrowsOptions|.
 %    \begin{macrocode}
-\cs_new_protected:Nn \@@_analyze_option_position:n
-     {\int_compare:nNnT \l_@@_previous_pos_arrow_int > {-1}
-        {\@@_error:n {Incompatible~options}}
-      \int_set:Nn \l_@@_previous_pos_arrow_int {#1}
-      \int_set:Nn \l_@@_pos_arrow_int {#1}}
+\NewDocumentCommand \WithArrowsOptions { m }
+  { 
+    \str_clear_new:N \l_@@_previous_key_str
+    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 } 
+  }
 %    \end{macrocode}
 %
-%
-% \bigskip
-% |\WithArrowsOptions| is the command of the \pkg{witharrows} package to fix options at the document level.
-%    \begin{macrocode}
-\NewDocumentCommand \WithArrowsOptions {m}
-    {\int_set:Nn \l_@@_previous_pos_arrow_int {-1}
-     \keys_set_known:nnN {WithArrows/General} {#1} \l_tmpa_tl
-     \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl}
-%    \end{macrocode}
-%
 % 
 % \bigskip
 % \subsection{The command 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 |CommandName| and the user command for |\@@_Arrow| will be different. This mechanism can be useful when
-% the user has already a command named |\Arrow| he wants to still be able to use in the environment |{WithArrows}|.
+% 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 |CommandName| 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}
-\NewDocumentCommand \@@_Arrow {O{} m !O{}}
-         {
+\NewDocumentCommand \@@_Arrow { O { } m ! O { } }
+  {
 %    \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.
+% 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
+    \int_gincr:N \g_@@_arrow_int
 %    \end{macrocode}
-%
-% We will extract immediately the options |ll|, |rr|, |lr|, |rl|, |i| and |jump|. For the position, we use the
-% integer |\l_@@_pos_arrow_int| locally in the cell of the |\halign|: we won't change the exterior evalue of
-% |\l_@@_pos_arrow_int| set by the environment |{WithArrows}| of by the command |\WithArrowsOptions|. The default
-% value of |\l_@@_pos_arrow_int| will be $-1$ for an arrow without option of position.
+% 
+% \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}
-          \int_set:Nn \l_@@_previous_pos_arrow_int {-1}
-          \int_set:Nn \l_@@_pos_arrow_int {-1}
+    \str_clear_new:N \l_@@_previous_key_str
+    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 } 
 %    \end{macrocode}
-% The level of options is set to 3 which is the level for the options in a command |\Arrow|.
-%    \begin{macrocode}
-          \int_set:Nn \l_@@_level_int 3
-%    \end{macrocode}
-% The options |ll|, |rr|, |lr|, |rl|, |i| and |jump| are extracted. The other options are stored in |\l_tmpa_tl|
-% and will be stored in the field ``options'' of the property list later.
-%    \begin{macrocode}
-          \keys_set_known:nnN {WithArrows/Arrow} {#1,#3} \l_tmpa_tl
-%    \end{macrocode}
 %
 % \medskip
-% We will construct a global property list to store the informations of the considered arrow. The five fields of
-% this property list are ``initial'', ``final'', ``position'', ``options'' and ``label''.
+% 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 line from which the arrow starts:
+% \item First, the row from which the arrow starts:
 %    \begin{macrocode}
-          \prop_put:NnV \l_tmpa_prop {initial} \g_@@_line_int
+    \prop_put:NnV \l_tmpa_prop { initial } \g_@@_line_int
 %    \end{macrocode}
 %
-% \item The line where the arrow ends (that's why it was necessary to extract the key |jump|):
+% \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
+    \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 ``position'' of the arrow. If the arrow has no option of position, the default value $-1$ is stored in
-% that field.
+% \item The ``status'' of the arrow, with 3 possible values: empty,
+% |independent|, or |new-group|.
 %    \begin{macrocode} 
-          \prop_put:NnV \l_tmpa_prop {position} \l_@@_pos_arrow_int
+    \prop_put:NnV \l_tmpa_prop { status } \l_@@_status_arrow_str
 %    \end{macrocode}
 % 
-% \item The other options of the arrow (it's a token list):
+% \item The options of the arrow (it's a token list):
 %    \begin{macrocode}
-          \prop_put:NnV \l_tmpa_prop {options} \l_tmpa_tl
+    \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}
+    \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. 
+% 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
-          }       
+    \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
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_Arrow_first_column: 
-               {\@@_error:n {Arrow~in~first~column}
-                \@@_Arrow}
+  { \@@_error:n { Arrow~in~first~column } \@@_Arrow }
 %    \end{macrocode}
 %                                
 %
@@ -2956,124 +3289,155 @@
 % \bigskip
 % \subsection{The environment \{WithArrows\}}
 %
-% The command |\@@_pre_environement:| is a code common to the environments |{WithArrows}| and |{DispWithArrows}|.
-% The argument is the list of options given to the environment.
+% The command |\@@_pre_environement:| 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:Nn \@@_pre_environment:n
 %    \end{macrocode}
 %
-% First the initialisation of |\l_@@_type_env_tl| which is the name of the encompassing environment. In fact, this
-% token list is used only in the error messages.
+% 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}
-         { \tl_clear_new:N \l_@@_type_env_tl
-           \tl_set:NV \l_@@_type_env_tl \@currenvir
+  { 
+    \str_clear_new:N \l_@@_type_env_str
+    \str_set:NV \l_@@_type_env_str \@currenvir
 %    \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}
 % 
-% The initialisation of the counters |\g_@@_arrow_int| and |\g_@@_line_int|. However, we have to save their
-% previous values with the two stacks created for this end.
+% The initialisation of the counters |\g_@@_arrow_int| and |\g_@@_line_int|.
+% However, we have to save their previous values with the two 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_@@_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 
 %    \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
+    \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 four 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$).
+% 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 {-} {-} {-}}
+    \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 
+    \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
-           \int_set:Nn \l_@@_jump_int 1
+    \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
+    \int_set:Nn \l_@@_jump_int \c_one_int
 %    \end{macrocode}
 %
 % \bigskip
-% In (the second 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|.
+% In (the second 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}
-           \seq_clear_new:N \l_@@_labels_seq
+    \seq_clear_new:N \l_@@_labels_seq
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-           \@@_bool_new:N \l_@@_tag_next_line_bool
+    \@@_bool_new:N \l_@@_tag_next_line_bool
 %    \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.}
+% 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
+    \skip_zero:N \l_@@_interline_skip
 %    \end{macrocode}
 %
 % \bigskip
-% The value corresponding to the key |CodeBefore| 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 |CodeAfter|.
+% The value corresponding to the key |CodeBefore| 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 |CodeAfter|. 
 %    \begin{macrocode}
-           \tl_clear_new:N \l_@@_code_before_tl
-           \tl_clear_new:N \l_@@_code_after_tl
+    \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 |{WithArrows}| environment. The level of options is set to 2.
+% We process the options given to the environment |{WithArrows}| or |{DispWithArrows}|. 
 %    \begin{macrocode}
-           \int_set:Nn \l_@@_previous_pos_arrow_int {-1}
-           \int_set:Nn \l_@@_level_int 2
-           \keys_set_known:nnN {WithArrows/General} {#1} \l_tmpa_tl
-           \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl
+    \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}
 %
 % \bigskip
-% If the option |footnote| or the option |footnotehyper| is used, then we extract the footnotes with a pair
-% |\savenotes|-|\endsavenotes| (of the package \pkg{footnote} or the package \pkg{footnotehyper}). We don't use an 
-% environment |{savenotes}| because there is a |\@currenvir| in some error messages. 
+% If the option |footnote| or the option |footnotehyper| is used, then we
+% extract the footnotes with a environment |{savenotes}| (of the package
+% \pkg{footnote} or the package \pkg{footnotehyper}).
 %    \begin{macrocode}
-           \bool_if:NT \g_@@_footnote_bool \savenotes
+    \bool_if:NT \g_@@_footnote_bool { \begin { savenotes } }
 %    \end{macrocode}
 %
 % \bigskip
-% We execute the code |\l_@@_code_before_tl| of the option |CodeBefore| of the environment after the eventual
-% |\savenotes| and, symetrically, we will execute the |\l_@@_code_after_tl| before the eventual
-% |\endsavenotes| (we have a good reason for the last point : we want to extract the footnotes of the arrows
+% We execute the code |\l_@@_code_before_tl| of the option |CodeBefore| of the
+% environment after the eventual |\savenotes| and, symetrically, we will execute
+% the |\l_@@_code_after_tl| before the eventual |\endsavenotes| (we have a good
+% reason for the last point: we want to extract the footnotes of the arrows
 % executed in the |CodeAfter|).
 %    \begin{macrocode}
-           \l_@@_code_before_tl
+    \l_@@_code_before_tl
 %    \end{macrocode}
 %
 % \bigskip
-% If the user has given a value for the option |CommandName| (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 |CommandName| is ``|Arrow|'' and thus, by default, the name of the command will be |\Arrow|.
+% If the user has given a value for the option |CommandName| (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
+% |CommandName| is ``|Arrow|'' and thus, by default, the name of the command
+% will be |\Arrow|.
 %    \begin{macrocode}
-           \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow}
+    \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow
+  }
 %    \end{macrocode}
 % This is the end of |\@@_pre_environment:n|.
 %
@@ -3081,440 +3445,572 @@
 % \bigskip
 % Now, we begin the environment |{WithArrows}|.
 %    \begin{macrocode}
-\NewDocumentEnvironment {WithArrows} {!O{}}
-         { \bool_set_true:N \l_@@_in_WithArrows_bool
-           \bool_set_false:N \l_@@_in_DispWithArrows_bool
-           \@@_pre_environment:n {#1} 
-           \reverse_if:N \if_mode_math:
-                             \@@_error:n {WithArrows~outside~math~mode}
-                         \fi:
-           \cs_set_eq:NN \notag \@@_notag:
-           \cs_set_eq:NN \nonumber \@@_notag:
-           \cs_set_eq:NN \tag \@@_tag
-           \cs_set_eq:NN \label \@@_label:n
-           \cs_set_eq:NN \tagnextline \@@_tagnextline:
+\NewDocumentEnvironment { WithArrows } { ! O { } }
+  { 
+    \bool_set_true:N \l_@@_in_WithArrows_bool
+    \bool_set_false:N \l_@@_in_DispWithArrows_bool
+    \@@_pre_environment:n { #1 } 
+    \if_mode_math: \else:
+      \@@_error:n { WithArrows~outside~math~mode }
+    \fi:
+    \cs_set_eq:NN \notag \@@_notag:
+    \cs_set_eq:NN \nonumber \@@_notag:
+    \cs_set_eq:NN \tag \@@_tag
+    \cs_set_eq:NN \label \@@_label:n
+    \cs_set_eq:NN \tagnextline \@@_tagnextline:
 %    \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|.
+% \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
+    \int_case:nn \l_@@_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+    \bgroup
 %    \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). 
+% 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
+    \spread at equation
 %    \end{macrocode}
 %
 % \bigskip
 % We begin the |\halign| and the preamble.
 %    \begin{macrocode}
-           \ialign\bgroup
+    \ialign \bgroup
 %    \end{macrocode}
 %
 % \bigskip 
-% We increment the counter |\g_@@_line_int| which will be used in the names of the Tikz nodes created in the array.
-% This incrementation must be global (|gincr|) because we are in the cell of a |\halign|. It's recalled that we
+% We increment the counter |\g_@@_line_int| which will be used in the names of
+% the Tikz nodes created in the array. This incrementation must be global
+% (|gincr|) because we are in the cell of a |\halign|. It's recalled that we
 % manage a stack for this counter.
 %    \begin{macrocode}
-           \int_gincr:N \g_@@_line_int 
-           \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_first_column: 
-           \bool_set_true:N \l_@@_in_first_column_bool
-           \strut\hfil
-           $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {##}$
-           & 
+    \int_gincr:N \g_@@_line_int 
+    \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_first_column: 
+    \bool_set_true:N \l_@@_in_first_column_bool
+    \strut \hfil
+    $ 
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { ## } 
+    $
+    & 
 %    \end{macrocode}
 % 
 % \bigskip
 %    \begin{macrocode}
-           $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {{}##}$
+    $ 
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { { } ## } 
+    $
 %    \end{macrocode}
 %
 % \bigskip
-% We create the ``left node'' of the line (when using macros in Tikz node names, the macros have to be fully
-% expandable: here, |\tl_use:N| and |\int_use:N| are fully expandable).
+% 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_style,
-                        name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-l,
-                        alias = {\tl_if_empty:NF \l_@@_name_tl
-                                     {\l_@@_name_tl-\int_use:N\g_@@_line_int-l}} ] {} ;
-           \hfil
+    \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 |shownodenames| is raised, the name of
-% the node is written in the document (useful for debugging).
+% 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_style,
-                        name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-r,
-                        alias = {\tl_if_empty:NF \l_@@_name_tl
-                                   {\l_@@_name_tl-\int_use:N\g_@@_line_int-r}} ] {} ;
-           \bool_if:NT \l_@@_shownodenames_bool
-                {\hbox_overlap_right:n {\small wa-\l_@@_prefix_str
-                                                 -\int_use:N\g_@@_line_int}}
+    \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 }
+      }
 %    \end{macrocode}
 % 
 % \bigskip
-% Usually, the |\halign| of an environment |{WithArrows}| will have exactly two columns. Nevertheless, if the user
-% wants to use more columns (without arrows) it's possible with the option |MoreColumns|.
+% Usually, the |\halign| of an environment |{WithArrows}| will have exactly two
+% columns. Nevertheless, if the user wants to use more columns (without arrows)
+% it's possible with the option |more-columns|.
 %    \begin{macrocode}
-           && \@@_error:n {Third~column~in~WithArrows}
-           $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {##}$
-           \cr
-          }
+    && 
+    \@@_error:n { Third~column~in~WithArrows }
+    $ 
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { ## } 
+    $
+    \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|).
+% 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}
-          {\\
-           \egroup 
-           \egroup
-           \@@_post_environment:
+  {
+    \\
+    \egroup 
+    \egroup
+    \@@_post_environment:
 %    \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}). We don't use an 
-% environment |{savenotes}| because there is a |\@currenvir| in some error messages.
+% 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}
-           \bool_if:NT \g_@@_footnote_bool \endsavenotes
-}
+    \bool_if:NT \g_@@_footnote_bool { \end { savenotes } }
+  }
 %    \end{macrocode}
 % This is the end of the environment |{WithArrows}|.
 % 
 %
 % \bigskip
-% The command |\@@_post_environment:| is a code common to the second part of the environment |{WithArrows}| and the
-% environment |{DispWithArrows}|.
+% The command |\@@_post_environment:| is a code common to the second part of the
+% environment |{WithArrows}| and the environment |{DispWithArrows}|.
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_post_environment:
 %    \end{macrocode}
 %
 % \bigskip
-% The command |\WithArrowsRightX| is not used by \pkg{witharrows}. It's only a convenience given to the user. 
+% 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} 
+  { 
+    \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:
+    \int_compare:nNnT \g_@@_arrow_int > 0 \@@_scan_arrows:
 %    \end{macrocode}
 %
 % \bigskip
-% We will execute the code specified in the option |CodeAfter|, after some settings.
+% We will execute the code specified in the option |CodeAfter|, after some
+% settings. 
 %    \begin{macrocode}
-           \group_begin:
-           \tikzset{every~picture/.style = @@_standard}
+    \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. 
+% 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}
+      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g_@@_line_int }
 %    \end{macrocode}
-% The command |\MultiArrow| is available in |CodeAfter|, and we have a special version of |\Arrow|, called
-% ``|\Arrow| in |CodeAfter|'' 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 |CodeAfter| provides
-% options and has the name of a function defined with |\NewDocumentCommand|.}
+% The command |\MultiArrow| is available in |CodeAfter|, and we have a special
+% version of |\Arrow|, called ``|\Arrow| in |CodeAfter|'' 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 |CodeAfter| 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_@@_CommandName_str \@@_Arrow_code_after
-           \l_@@_code_after_tl
-           \group_end:
+      \cs_set_eq:NN \MultiArrow \@@_MultiArrow:nn
+      \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_code_after
+      \bool_set_true:N \l_@@_in_CodeAfter_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.
+% 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}}
+    \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|. 
+% 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}
+    \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| and |\g_@@_line_int| 
-% It is recalled that we manage three stacks in order to be able to do such a restoration.
+% Finally, we restore the previous values of the counters |\g_@@_arrow_int| and
+% |\g_@@_line_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_@@_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
+  }
 %    \end{macrocode}
 % That's the end of the command |\@@_post_environment:|.
 %
 % \bigskip
-% 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 a |\halign| structure.
+% 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 a |\halign|
+% structure.
 %
-% First, we remove an eventual token |*| since the commands |\\| and |\\*| are equivalent in an environment
-% |{WithArrows}| (an environment |{WithArrows}|, like an environment |{aligned}| of \pkg{amsmath}, is always unbreakable).
+% First, we remove an eventual token |*| 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:Nn \@@_cr:
-      {\scan_stop:
+  { 
+    \scan_stop:
+    \bool_if:NT \l_@@_in_first_column_bool { & { } } 
+    \group_align_safe_begin:
+    \peek_meaning_remove:NTF * \@@_cr_i: \@@_cr_i:
+  }
 %    \end{macrocode}
-% \bigskip
-%    \begin{macrocode}
-       \bool_if:NT \l_@@_in_first_column_bool { & {} } 
-       \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.
+% 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:Nn \@@_cr_i:
-      {\peek_meaning:NTF [ {\@@_cr_ii:} {\@@_cr_ii:[\c_zero_dim]} }
-\cs_new_protected:Npn \@@_cr_ii:[#1]
-      {\group_align_safe_end:
+  { \peek_meaning:NTF [ \@@_cr_ii: { \@@_cr_ii: [ \c_zero_dim ] } }
 %    \end{macrocode}
-% For the environment |{DispWithArrows}|, the behaviour of |\\| is different because we add the third column which
-% is the column for the tag (number of the equation). Even if there is no tag, the third column is used for the |v|-nodes.
+% 
+% \bigskip
 %    \begin{macrocode}
-       \bool_if:NT \l_@@_in_DispWithArrows_bool
+\cs_new_protected:Npn \@@_cr_ii: [ #1 ]
+  { 
+    \group_align_safe_end:
 %    \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|.
+% For the environment |{DispWithArrows}|, the behaviour of |\\| is different
+% because we add the third column which is the column for the tag (number of the
+% equation). Even if there is no tag, the third column is used for the
+% |v|-nodes.
 %    \begin{macrocode}
-           {\clist_if_in:NnTF \l_@@_tags_clist {all}
-                {
+    \bool_if:NT \l_@@_in_DispWithArrows_bool
 %    \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.
+% 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}
+      { 
+        \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}
+            \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 |&|).
+% 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}
+            \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|.
+% 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
-                      {
+            \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).
+% 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}.
+% 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}
+                \cs_set:Npx \@currentlabel { \p at equation \g_tmpa_tl }
 %    \end{macrocode}
-% Then, an action done by \pkg{hyperref} in its redefinition of |\refstepcounter|.
+% Then, an action done by \pkg{hyperref} in its redefinition of
+% |\refstepcounter|.
 %    \begin{macrocode}
-                       \bool_if:NT \c_@@_hyperref_loaded_bool
-                            {\cs_set:Npn \This at name {equation}
-                             \hyper at refstepcounter{equation}}
+                \bool_if:NT \c_@@_hyperref_loaded_bool
+                   { 
+                     \cs_set:Npn \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.
+% 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}
-                            \@ifundefined{cref at equation@alias}
-                                  {\def\@tempa{equation}}
-                                  {\def\@tempa{\csname cref at equation@alias\endcsname}}
-                            \protected at edef\cref at currentlabel
-                                           {[\@tempa][\arabic{equation}][\cref at result]
-                                            \p at equation \g_tmpa_tl}}
+                \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}
-% 
-% Then, 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}.
+% Then, 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
-                          {\cs_set:Npn \sr at name {equation}}
+                \bool_if:NT \c_@@_typedref_loaded_bool
+                   { \cs_set:Npn \sr at name { equation } }
 %    \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 to put several labels to the same line and that's why the
-% labels are in the sequence |\l_@@_labels_seq|).
+% 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 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}
+                \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.
+% 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:Npn \tagform@ {}}
+            \@@_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 wether the
-% option |leqno| is used or not. That's here that we use the flag |\c_@@_leqno_bool|.
+% 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 wether 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 
-                 & \@@_restore:N \l_@@_qedhere_bool
-                   \bool_if:NT \l_@@_qedhere_bool
-                         {\hbox_overlap_left:n \@@_qedhere_i:}
-                   \tikz [@@_standard] \coordinate (\int_use:N\g_@@_line_int-v)  ; }
-             }
-       \cr\noalign{\skip_vertical:n {#1 + \l_@@_interline_skip}
-       \scan_stop:}}
+            \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 
+            & 
+            \@@_restore:N \l_@@_qedhere_bool
+            \bool_if:NT \l_@@_qedhere_bool 
+               { \hbox_overlap_left:n \@@_qedhere_i: }
+            \tikz [ @@_standard ] 
+               \coordinate ( \int_use:N \g_@@_line_int - v ) ; 
+          }
+        }
+    \cr \noalign { \skip_vertical:n { #1 + \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).
+% According to the documentation of \pkg{expl3}, the previous addition in 
+% ``|#1 + \l_@@_interline_skip|'' is really an addition of skips (=glues).
 %
 %
 % 
 % \bigskip
-% \subsection{The commands tag, notag, label, tagnextline and qedhere for DispWithArrows}
+% \subsection{The commands tag, notag, label, tagnextline and qedhere for
+% DispWithArrows} 
 %
+% Some commands are allowed only in the second column of the environment
+% |{DispWithArrows}|. We write a command |\@@_if_in_second_col_of_disp:Nn| to
+% execute this command only if we are in the second column. If we are in the
+% first column, an error is raised. The first argument of
+% |\@@_if_in_second_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:Nn \@@_if_in_second_col_of_disp:nn
-     {\bool_if:NTF \l_@@_in_WithArrows_bool
-          {\@@_error:nn {Command~not~allowed~in~WithArrows} 
-                          {#1}}
-          {\bool_if:NTF \l_@@_in_first_column_bool
-             {\@@_error:nn {Command~not~allowed~in~DispWithArrows}
-                             {#1}}
-             {#2}}}
+\cs_new_protected:Nn \@@_if_in_second_col_of_disp:Nn
+  { 
+    \bool_if:NTF \l_@@_in_WithArrows_bool
+      { \@@_error:nn { Not~allowed~in~WithArrows } { #1 } }
+      { 
+        \bool_if:NTF \l_@@_in_first_column_bool
+          { \@@_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+          { #2 }
+      }
+  }
 %    \end{macrocode}
-% The command |\@@_notag:| will be linked to |\notag| and |\nonumber| in the environments |{WithArrows}| and
-% |{DispWithArrows}|. 
+% 
+% \bigskip
+% The command |\@@_notag:| will be linked to |\notag| and |\nonumber| in the
+% environments |{WithArrows}| and |{DispWithArrows}|.
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_notag: 
-     {\@@_if_in_second_col_of_disp:nn {\notag}
-             {\clist_clear:N \l_@@_tags_clist}}
+  { \@@_if_in_second_col_of_disp:Nn \notag { \clist_clear:N \l_@@_tags_clist } }
 %    \end{macrocode}
 % 
 %
 % \bigskip
-% The command |\@@_tag| will be linked to |\tag| in the environments |{WithArrows}| and |{DispWithArrows}|. We use
-% |\NewDocumentCommand| because this command has a starred version.
+% The command |\@@_tag| will be linked to |\tag| in the environments
+% |{WithArrows}| and |{DispWithArrows}|. We use |\NewDocumentCommand| because
+% this command has a starred version.
 %    \begin{macrocode}
-\NewDocumentCommand \@@_tag {sm}
-     {\@@_if_in_second_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}
+\NewDocumentCommand \@@_tag { s m } 
+  { 
+    \@@_if_in_second_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|.}
+% 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} }}
-    }
+        \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|.
+% 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:Nn \@@_label:n 
-     {\@@_if_in_second_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}}}}
+  {  
+    \@@_if_in_second_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 the environments |{WithArrows}| and
-% |{DispWithArrows}|.
+% The command |\@@_tagnextline:| will be linked to |\tagnextline| in the
+% environments |{WithArrows}| and |{DispWithArrows}|.
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_tagnextline:
-        {\@@_if_in_second_col_of_disp:nn {\tagnextline}
-             {\bool_set_true:N \l_@@_tag_next_line_bool}}
+  { 
+    \@@_if_in_second_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|.
+% 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 second column of the
-% environment |{DispWithArrows}| (only if the package \pkg{amsthm} has been loaded). |\@@_qedhere:| raises the
-% boolean |\l_@@_qedhere_bool|. 
+% This special version is called |\@@_qedhere:| and will be linked with
+% |\qedhere| in the second column of the environment |{DispWithArrows}| (only if
+% the package \pkg{amsthm} has been loaded). |\@@_qedhere:| raises the boolean
+% |\l_@@_qedhere_bool|.
 %    \begin{macrocode}
 \bool_new:N \l_@@_qedhere_bool
-\cs_new_protected:Nn \@@_qedhere: {\bool_set_true:N \l_@@_qedhere_bool}
+\cs_new_protected:Nn \@@_qedhere: { \bool_set_true:N \l_@@_qedhere_bool }
 %    \end{macrocode}
 %
-% In the third column of the |\halign| of |{DispWithArrows}|, 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}.
+% In the third column of the |\halign| of |{DispWithArrows}|, 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:Nn \@@_qedhere_i: {\group_begin:
-                                       \cs_set_eq:NN \qed \qedsymbol
+\cs_new_protected:Nn \@@_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}
+% 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: }
+      \cs_set_eq:NN \qed at elt \setQED at elt 
+      \QED at stack \relax \relax 
+    \group_end: 
+  }
 %    \end{macrocode}
 % 
 % 
@@ -3522,7 +4018,8 @@
 % \subsection{The environment \{DispWithArrows\}}
 %
 %
-% For the environment |{DispWithArrows}|, the construction is a construction of the type:
+% For the environment |{DispWithArrows}|, the construction is a construction of
+% the type:
 %
 % |\[\vcenter{\halign to \displaywith {...}}\]|
 % 
@@ -3530,158 +4027,210 @@
 % 
 % \bigskip
 %    \begin{macrocode}
-\NewDocumentEnvironment {DispWithArrows} {!O{}}
-         { 
+\NewDocumentEnvironment { DispWithArrows } { ! O { } }
+  { 
 %    \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).
+% 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}
-          \bool_if:nT \c_@@_mathtools_loaded_bool 
-                 {\MH_if_boolean:nT {show_only_refs} 
-                    {\MT_showonlyrefs_false:
+    \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|.
+% 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}}}
+            \MH_set_boolean_T:n { show_only_refs } 
+          }
+      }
 %    \end{macrocode}
-% The command |\intertext@| is a command of \pkg{amsmath} which loads the definition of |\intertext|.
+% 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@
-           \bool_set_true:N \l_@@_in_DispWithArrows_bool
-           \@@_pre_environment:n {#1}
-           \if_mode_math:
-               \@@_error:n {DispWithArrows~in~math~mode}
-           \fi:
+    \bool_if:NT \c_@@_amsmath_loaded_bool \intertext@
+    \bool_set_true:N \l_@@_in_DispWithArrows_bool
+    \@@_pre_environment:n { #1 }
+    \if_mode_math:
+      \@@_error:n { DispWithArrows~in~math~mode }
+    \fi:
 %    \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.
+% 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
-             \makebox[.6\linewidth]{}
-           \fi:
-           $$
+    \if_mode_vertical:
+      \nointerlineskip
+      \makebox [ .6 \linewidth ] { }
+    \fi:
+    $$
 %    \end{macrocode}
 % We use a |\vcenter| in order to prevent page breaks in the environment.
 %    \begin{macrocode}
-           \vcenter \bgroup 
-           \spread at equation 
-           \bool_if:NTF \l_@@_fleqn_bool
-                  {\tabskip = \c_zero_skip}
-                  {\tabskip = 0 pt plus 1000 pt minus 1000 pt}
-           \cs_set_eq:NN \@@_old_label \label
-           \cs_set_eq:NN \notag \@@_notag:
-           \cs_set_eq:NN \nonumber \@@_notag:
-           \cs_set_eq:NN \tag \@@_tag
-           \cs_set_eq:NN \label \@@_label:n
-           \cs_set_eq:NN \tagnextline \@@_tagnextline:
-           \halign to \displaywidth \bgroup
-             \int_gincr:N \g_@@_line_int
-             \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_first_column:
-             \bool_set_true:N \l_@@_in_first_column_bool
-             \strut
-             \bool_if:NT \l_@@_fleqn_bool
-                   {\skip_horizontal:n \l_@@_mathindent_dim}
-             \hfil
-             $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {##}$
-             \tabskip = \c_zero_skip
-            &
-             \clist_if_in:NVT \l_@@_tags_clist \g_@@_line_int
-                  {\clist_set:Nn \l_@@_tags_clist {all}}
+    \vcenter \bgroup 
+    \spread at equation 
+    \bool_if:NTF \l_@@_fleqn_bool
+      { \tabskip = \c_zero_skip }
+      { \tabskip = 0 pt plus 1000 pt minus 1000 pt }
+    \cs_set_eq:NN \@@_old_label \label
+    \cs_set_eq:NN \notag \@@_notag:
+    \cs_set_eq:NN \nonumber \@@_notag:
+    \cs_set_eq:NN \tag \@@_tag
+    \cs_set_eq:NN \label \@@_label:n
+    \cs_set_eq:NN \tagnextline \@@_tagnextline:
+    \halign to \displaywidth 
+    \bgroup
+    \int_gincr:N \g_@@_line_int
+    \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_first_column:
+    \bool_set_true:N \l_@@_in_first_column_bool
+    \strut
+    \bool_if:NT \l_@@_fleqn_bool { \skip_horizontal:n \l_@@_mathindent_dim }
+    \hfil
+    $
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { ## } 
+    $
+    \tabskip = \c_zero_skip
+    &
+    \clist_if_in:NVT \l_@@_tags_clist \g_@@_line_int
+         { \clist_set:Nn \l_@@_tags_clist { all } }
 %    \end{macrocode}
 % The command |\qedhere| of \pkg{amsthm} is redefined here. 
 %    \begin{macrocode}
-             \bool_if:NT \c_@@_amsthm_loaded_bool {\cs_set_eq:NN \qedhere \@@_qedhere:}
-             $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {{}##}$
-             \tabskip = 0 pt plus 1000 pt minus 1000 pt
-             \tikz [remember~picture,overlay]
-                  \node [_@@_node_style,
-                         name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-l,
-                         alias = {\tl_if_empty:NF \l_@@_name_tl 
-                                    {\l_@@_name_tl-\int_use:N\g_@@_line_int-l}} ] {} ;
-             \hfil
-             \tikz [remember~picture,overlay]
-                   \node [_@@_node_style,
-                          name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-r,
-                          alias = {\tl_if_empty:NF \l_@@_name_tl
-                                     {\l_@@_name_tl-\int_use:N\g_@@_line_int-r}} ] {} ;
-             \bool_if:NT \l_@@_shownodenames_bool
-                  {\hbox_overlap_right:n {\small wa-\l_@@_prefix_str
-                                                   -\int_use:N\g_@@_line_int}}
-            & ##
-             \tabskip = \c_zero_skip
-            && \@@_error:n {Third~column~in~DispWithArrows} 
-               \iffalse ## \fi
-             \cr}
+    \bool_if:NT \c_@@_amsthm_loaded_bool 
+      { \cs_set_eq:NN \qedhere \@@_qedhere: }
+    $
+    \bool_if:NT \l_@@_displaystyle_bool \displaystyle 
+    { { } ## }
+    $
+    \tabskip = 0 pt plus 1000 pt minus 1000 pt
+    \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
+    \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 } 
+       }
+    & 
+    ##
+    \tabskip = \c_zero_skip
+    && 
+    \@@_error:n { Third~column~in~DispWithArrows } 
+    \iffalse ## \fi
+    \cr
+  }
 %    \end{macrocode}
 % We begin the second part of the environment |{DispWithArrows}|.
 %    \begin{macrocode}
-          {\clist_if_in:NnT \l_@@_tags_clist {last}
-                   {\clist_set:Nn \l_@@_tags_clist {all}}
-           \\
+  { 
+    \clist_if_in:NnT \l_@@_tags_clist { last }
+      { \clist_set:Nn \l_@@_tags_clist { all } }
+    \\
 %    \end{macrocode}
 % The following |\egroup| is for the |\halign|.
 %    \begin{macrocode}
-           \egroup 
+    \egroup 
 %    \end{macrocode}
 % The following |\egroup| is for the |\vcenter| (aimed to prevent page breaks).
 %    \begin{macrocode}
-           \egroup 
+    \egroup 
 %    \end{macrocode}
 %
-% If we are in an environment |{DispWithArrows}| or |{DispWithArrows*}|, 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. 
+% If we are in an environment |{DispWithArrows}| or |{DispWithArrows*}|, 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}
-           \bool_if:NT \l_@@_in_DispWithArrows_bool
-             {\dim_gzero_new:N \g_@@_right_x_dim 
-              \dim_gset_eq:NN \g_@@_right_x_dim \c_max_dim
-              \begin{tikzpicture} [@@_standard]
-              \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}
-                       {\@@_error: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}} }
-              \end{tikzpicture}}
+    \bool_if:NT \l_@@_in_DispWithArrows_bool
+      { 
+        \dim_gzero_new:N \g_@@_right_x_dim 
+        \dim_gset_eq:NN \g_@@_right_x_dim \c_max_dim
+        \begin { tikzpicture } [ @@_standard ]
+          \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 }
+                 { \@@_error: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 } 
+                 } 
+             }
+        \end { tikzpicture } 
+      }
 %    \end{macrocode}
 % 
 % \bigskip
-% The code in |\@@_post_environment:| is common to |{WithArrows}| and |{DispWithArrows}|.
+% The code in |\@@_post_environment:| is common to |{WithArrows}| and
+% |{DispWithArrows}|.
 %    \begin{macrocode}
-           \@@_post_environment:
+    \@@_post_environment:
 %    \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
+% 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}
-           \bool_if:nT \c_@@_mathtools_loaded_bool
-                    {\MH_if_boolean:nT {show_only_refs} 
-                          \MT_showonlyrefs_true:}
-           $$
+    \bool_if:nT \c_@@_mathtools_loaded_bool
+      { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: }
+    $$
 %    \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}).
+%
+% \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 \endsavenotes
-           \ignorespacesafterend
-           }
+    \bool_if:NT \g_@@_footnote_bool { \end {savenotes } }
+    \ignorespacesafterend
+  }
 %    \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.
+% 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}
-\NewDocumentEnvironment {DispWithArrows*} {}
-     {\WithArrowsOptions{notag}
-      \DispWithArrows}
-     {\endDispWithArrows}
+\NewDocumentEnvironment { DispWithArrows* } {}
+   { 
+     \WithArrowsOptions { notag }
+     \DispWithArrows
+   }
+   { \endDispWithArrows }
 %    \end{macrocode}
 %
 %
@@ -3690,49 +4239,60 @@
 % \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 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.
+% \item If the option |group| or the option |groups| is used, all the arrows 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.
+% 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:Nn \@@_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:}
+ { 
+   \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
-% If an environment |{WithArrows}| is composed with the option |group| or the option |groups|, it's still possible
-% to put arrows with their option of position (|ll|, |rr|, |rl|, |lr| or |i|). Such arrows will be said to be
-% ``independant''. 
+% If an environment |{WithArrows}| is composed with the option |group| or the
+% option |groups|, it's still possible to put arrows with their option of
+% position (|ll|, |rr|, |rl|, |lr| or |i|). Such arrows will be said to be
+% ``independent''.
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_scan_arrows_i:
   { 
 %    \end{macrocode}
 %
-% \bigskip
-% |\l_@@_first_arrow_of_group_int| will be the first arrow of the current group. 
+% \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_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_of_group_seq| will 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 known all these arrows because of the
+% |\l_@@_first_arrows_of_group_seq| will 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 known 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_line_of_group_int| will be the last line involved in the group
+% (impossible to guess in advance).
 %
-% |\l_@@_last_arrows_of_group_seq| will the list of all the arrows of the group ending at the last line of the
-% group (impossible to guess in advance).
+% |\l_@@_last_arrows_of_group_seq| will 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
@@ -3743,226 +4303,282 @@
 %    \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.
+% 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 1
+    \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'' and ``position'' and we
-% store these values in |\l_@@_initial_int|, |\l_@@_final_int| and |\l_@@_pos_of_arrow_int|. However, we have to do
-% a conversion because the components of a property list are token lists.
+% We extract from the property list of the current arrow the fields ``initial'',
+% ``final'' and ``position'' and we store these values in |\l_@@_initial_int|,
+% |\l_@@_final_int| and |\l_@@_pos_of_arrow_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
-       \prop_get:cnN {g_@@_arrow_\l_@@_prefix_str _\int_use:N\l_@@_arrow_int _prop}
-                     {position} \l_tmpa_tl
-       \int_set:Nn \l_@@_pos_of_arrow_int \l_tmpa_tl
+        \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
-% If the arrow arrives after the last line of the environment we raise an error (we recall that, after the
-% construction of the |\halign|, |\g_@@_line_int| is the total number of lines of the environment). The arrow will be
-% completely ignored, even for the computation of |\l_@@_x_dim|.
+% If the arrow arrives after the last line of the environment we raise an error
+% (we recall that, after the construction of the |\halign|, |\g_@@_line_int| is
+% the total number of lines of the environment). 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
-          {\@@_error:n {Too~few~lines~for~an~arrow}}  
+        \int_compare:nNnTF \l_@@_final_int > \g_@@_line_int
+           { \@@_error:n { Too~few~lines~for~an~arrow } }
 %    \end{macrocode}
 %
 % \bigskip
-% We test if 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 you are with the option |group| and in the first step of treatment (|\l_@@_pos_arrow_int| = 7).
+% We test if 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 you 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 > 1
-                         && 
-                        \int_compare_p:nNn 
-                              \l_@@_initial_int > \l_@@_last_line_of_group_int
-                         &&
-                        \int_compare_p:n {\l_@@_pos_arrow_int != 7}}
-                 {\@@_draw_arrows:nn \l_@@_first_arrow_of_group_int {\l_@@_arrow_int - 1}
-                  \bool_set_true:N \l_@@_new_group_bool}
+           { 
+             \bool_if:nT 
+               { 
+                 \int_compare_p:nNn \l_@@_arrow_int > 1
+                 && 
+                ( \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 = 0
+                   { 
+                     \@@_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 two circonstancies: if we are at the first arrow of the environment (that's why the flag is raised
-% before the beginning of the loop) and if we have just finished a group (that's why the flag is raised in the
-% previous conditionnal). 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_of_group_seq|, |\l_@@_last_arrows_of_group_seq|. 
+% 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 two circonstancies: if we are
+% at the first arrow of the environment (that's why the flag is raised before
+% the beginning of the loop) and if we have just finished a group (that's why
+% the flag is raised in the previous conditionnal). 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_of_group_seq|, |\l_@@_last_arrows_of_group_seq|.
 %
 %    \begin{macrocode}
-           \bool_if:nTF \l_@@_new_group_bool
-                 {\bool_set_false:N \l_@@_new_group_bool
+             \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_of_group_seq 
-                  \seq_put_left:NV \l_@@_first_arrows_of_group_seq \l_@@_arrow_int
+                  \seq_put_left:NV \l_@@_first_arrows_of_group_seq 
+                    \l_@@_arrow_int
                   \seq_clear:N \l_@@_last_arrows_of_group_seq 
-                  \seq_put_left:NV \l_@@_last_arrows_of_group_seq \l_@@_arrow_int
+                  \seq_put_left:NV \l_@@_last_arrows_of_group_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.
+% 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}}
-                  }
+                  \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, we actualize |\l_@@_last_line_of_group_int|. If the arrow is
-% independant (|\l_@@_pos_of_arrow_int| non negative) we don't take into account this arrow for the detection of
-% the end of the group.
+% If we are not at the beginning of a new group, we actualize
+% |\l_@@_last_line_of_group_int|. If the arrow is independent, we don't take
+% into account this arrow for the detection of the end of the group.
 %    \begin{macrocode}
-                 {\int_compare:nNnT \l_@@_pos_of_arrow_int = {-1}
-                     {\int_compare:nNnT \l_@@_initial_int = \l_@@_first_line_of_group_int
-                           {\seq_put_left:NV \l_@@_first_arrows_of_group_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_of_group_seq
-                         \seq_put_left:NV \l_@@_last_arrows_of_group_seq \l_@@_arrow_int}
-                        {\int_compare:nNnT \l_@@_final_int = \l_@@_last_line_of_group_int
-                           {\seq_put_left:NV \l_@@_last_arrows_of_group_seq \l_@@_arrow_int}}}}
+                { 
+                  \bool_if:nF 
+                     { \str_if_eq_p:Vn \l_@@_status_arrow_str { independent } }
+                     { 
+                       \int_compare:nT 
+                         { \l_@@_initial_int = \l_@@_first_line_of_group_int }
+                         { 
+                           \seq_put_left:NV \l_@@_first_arrows_of_group_seq 
+                             \l_@@_arrow_int 
+                         }
+                       \int_compare:nTF 
+                         { \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_of_group_seq
+                           \seq_put_left:NV \l_@@_last_arrows_of_group_seq 
+                             \l_@@_arrow_int
+                         }
+                         { 
+                           \int_compare:nNnT 
+                             \l_@@_final_int = \l_@@_last_line_of_group_int 
+                             { 
+                               \seq_put_left:NV \l_@@_last_arrows_of_group_seq
+                                 \l_@@_arrow_int 
+                             }
+                         }
+                     }
+                }
 %    \end{macrocode}
 %
 % \bigskip 
-% If the arrow is not independant, we update the current $x$-value (in |\l_@@_x_dim|) with the dedicated command
-% |\@@_update_x_value: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. 
+% 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}
-           \int_compare:nNnT \l_@@_pos_of_arrow_int = {-1}
-              { \int_compare:nT {\l_@@_pos_arrow_int != 8}
-                   {\@@_update_x_value:nn \l_@@_initial_int \l_@@_final_int}} }
+             \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
 % Incrementation of the index of the loop (and end of the loop).
 %    \begin{macrocode}
-       \int_incr:N \l_@@_arrow_int
-     }
+        \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.
+% 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.
 %    \begin{macrocode}
-     \int_compare:nT {\l_@@_pos_arrow_int != 7}
-        {\@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int}
+     \int_compare:nT { \l_@@_pos_arrow_int != 7 }
+        { \@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int }
   }
 %    \end{macrocode}
 %
 % \bigskip
-% The following code is necessary because we will have to expand an argument exactly 3 times.
+% 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 {no}
-\cs_new_protected:Nn \@@_keys_set: {\keys_set:no {WithArrows/General}}
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Nn \@@_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).
+% 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).
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_draw_arrows:nn
-  {\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}
+  {
+    \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.
+% 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
-     {
+    \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
+% 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}
+        \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).
+% 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:nNnT \l_@@_final_int < {\g_@@_line_int + 1}
-         \@@_draw_arrows_i:
-      \int_incr:N \l_@@_arrow_int
-     } 
-   \group_end:
-   }
+        \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).
+% 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:Nn \@@_draw_arrows_i:
-     {\group_begin:
-      \int_set:Nn \l_@@_level_int 3
+  { 
+    \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
+% 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
-      \exp_args:NNo \exp_args:No 
-          \@@_keys_set: {\l_tmpa_tl,tikz={xshift = \l_@@_xoffset_dim}}
+    \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 retrieve the value of the field |position| of the current arrow. If the arrow has no option of position, the
-% value of this field is $-1$. If the arrow has a option of position, you modify the current value of
-% |\l_@@_pos_arrow_int| to reflect this value.
+% 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}
-      \prop_get:cnN {g_@@_arrow_\l_@@_prefix_str _\int_use:N\l_@@_arrow_int _prop}
-        {position} \l_tmpa_tl
-      \int_set:Nn \l_tmpa_int \l_tmpa_tl
-      \int_compare:nNnF \l_tmpa_int = {-1}
-         {\int_set_eq:NN \l_@@_pos_arrow_int \l_tmpa_int}
+    \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}
-% 
-% 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}
@@ -3974,368 +4590,488 @@
 % |\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 |CodeAfter| (see below).
+% \footnotesize The option |v| can be used only in |\Arrow| in |CodeAfter| (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).
+% 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_value:nn \l_@@_initial_int \l_@@_final_int }
+    \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|.
+% |\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}
+    \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 |shownodes| to visualize the nodes).
+% 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 
+    \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_of_group_seq| the list of all the arrows starting at
-% the first line of the group and in |\l_@@_last_arrows_of_group_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:NTF| which is \emph{not}
-% expandable. 
+% 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_of_group_seq| the list of all the arrows starting at the
+% first line of the group and in |\l_@@_last_arrows_of_group_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:NTF|
+% which is \emph{not} expandable.
 %    \begin{macrocode}
-      \seq_if_in:NxTF \l_@@_first_arrows_of_group_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_of_group_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}
+    \seq_if_in:NxTF \l_@@_first_arrows_of_group_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_of_group_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. 
+% 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|). 
+% \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}
-      \begin{tikzpicture} [@@_standard]
-          \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 }} 
-      \end{tikzpicture}
+    \begin { tikzpicture } [ @@_standard ]
+       \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 } 
+          } 
+    \end { tikzpicture } 
 %    \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 |TikzCode|. 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).}
+% 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 |TikzCode|. 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
+    \@@_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).
+% We close the TeX group opened for the options given to |\Arrow[...]| (local
+% level of the options).
 %    \begin{macrocode}
-      \group_end: }
+    \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|.
+% 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:Nn \@@_def_function_tmpa:n 
-    {\cs_set:Nn \@@_tmpa:nnn
-          {\begin{tikzpicture}[@@_standard,every~path/.style = {WithArrows/arrow}] 
-              #1 
-           \end{tikzpicture}}}
+  { 
+    \cs_set:Npn \@@_tmpa:nnn ##1 ##2 ##3
+      { 
+        \begin{tikzpicture} 
+          [ 
+            @@_standard , 
+            every~path / .style = WithArrows / arrow 
+          ] 
+          #1 
+        \end{tikzpicture}
+      }
+  }
 %    \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| :
+% 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:Nn \@@_draw_arrow:nnn
-           {
+  {
 %    \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 |TikzCode|). 
+% If the option |wrap-lines| is used, we have to use a special version of
+% |\l_@@_tikz_code_tl| (which corresponds to the option |TikzCode|).
 %    \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 }
+    \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:No \@@_def_function_tmpa:n \l_@@_tikz_code_tl
-            \@@_tmpa:nnn {#1} {#2} {#3} }
-\cs_generate_variant:Nn \@@_draw_arrow:nnn {nno}
+    \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 |TikzCode|).
+% If the option |wrap-lines| is used, we have to use a special version of
+% |\l_@@_tikz_code_tl| (which corresponds to the option |TikzCode|).
 %    \begin{macrocode}
-\tl_set:Nn \c_@@_tikz_code_wrap_lines_tl
-                 { 
+\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) ;
+    \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.
+% 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)
+    \tikz at parse@node \pgfutil at firstofone ( @@_label.west )
 %    \end{macrocode}
-% We compute in |\l_tmpa_dim| the maximal width possible for the label. |0.3333 em| is the default value of 
-% |inner sep| in the nodes of Tikz. Maybe we should put the exact Tikz parameter. Here is the use of
-% |\g_@@_right_x_dim| which has been computed previously with the |v|-nodes.
+% We compute in |\l_tmpa_dim| the maximal width possible for the label. 
+% |0.3333 em| is the default value of |inner sep| in the nodes of Tikz. Maybe we
+% should put the exact Tikz parameter. 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 - 0.3333 em} 
+    \dim_set:Nn \l_tmpa_dim { \g_@@_right_x_dim - \pgf at x - 0.3333 em } 
 %    \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.}
+% 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} ;
+    \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|).
+% 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}}
+    \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} ; } }
+    \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_value: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_value:nn| is used in |\@@_scan_arrows:| (for options |group| and
-% |groups|) and in |\@@_draw_arrows:nn| (for option |i|).
+% 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:Nn \@@_update_x_value:nn
-    {\int_step_inline:nnn {#1} {#2} 
-        {\begin{tikzpicture} [@@_standard]
-         \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 }
-         \end{tikzpicture}
-         \dim_set_eq:NN \l_@@_x_dim \g_tmpa_dim } } 
+\cs_new_protected:Nn \@@_update_x:nn
+  { 
+    \int_step_inline:nnn { #1 } { #2 } 
+       { 
+         \begin { tikzpicture } [ @@_standard ]
+           \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 }
+         \end { tikzpicture }
+         \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.
+% 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}
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g_@@_last_env_int }
 %    \end{macrocode}
 %
 % \bigskip
 % \subsection{The command Arrow in CodeAfter}
 %
-% The option |CodeAfter| is an option of the environment |{WithArrows}| (this option is only available at the
-% environment level). In the option |CodeAfter|, 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/CodeAfter|.
+% The option |CodeAfter| is an option of the environment |{WithArrows}| (this
+% option is only available at the environment level). In the option |CodeAfter|,
+% 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/CodeAfter|.
 %
 %    \begin{macrocode}
-\keys_define:nn {WithArrows/CodeAfter}
-     {tikz     .code:n            = \tikzset {WithArrows/arrow/.append~style = {#1}} ,
-      tikz     .value_required:n  = true,
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \@@_analyze_option_position:n 0 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \@@_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \@@_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \@@_analyze_option_position:n 3 ,
-      v        .value_forbidden:n = true,
-      v        .code:n            = \@@_analyze_option_position:n 4 ,
-      TikzCode .tl_set:N          = \l_@@_tikz_code_tl,
-      TikzCode .value_required:n  = true,
-      xoffset  .dim_set:N         = \l_@@_xoffset_dim,
-      xoffset  .value_required:n  = true}
+\keys_define:nn { WithArrows / Arrow / CodeAfter }
+  {
+    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 ,
+    TikzCode .tl_set:N          = \l_@@_tikz_code_tl ,
+    TikzCode .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_CodeAfter_seq
+      \@@_error:n { Unknown~option~Arrow~in~CodeAfter } 
+ }
 %    \end{macrocode}
-% 
 %
 % \bigskip
+% A sequence of the options available in |\Arrow| in |\CodeAfter|. This sequence
+% will be used in the error messages and can be modified dynamically.
 %    \begin{macrocode}
-\NewDocumentCommand \@@_Arrow_code_after {O{} mmm !O{}}
-     {\int_set:Nn \l_@@_pos_arrow_int 1
-      \int_set:Nn \l_@@_previous_pos_arrow_int {-1}
-      \group_begin:
+\seq_set_from_clist:Nn \l_@@_options_Arrow_CodeAfter_seq
+   { ll, lr, rl, rr, tikz, TikzCode, v, x, offset }
 %    \end{macrocode}
-% Even if |\Arrow| in |CodeAfter| has its own set of options (|WithArrows/CodeAfter|), we set the level of the
-% options to~$3$ (as with the classical command |\Arrow|) because of the error messages. 
+% 
+% \bigskip
 %    \begin{macrocode}
-           \int_set:Nn \l_@@_level_int 3
-           \keys_set:nn {WithArrows/CodeAfter} 
-                        {#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}}
+\NewDocumentCommand \@@_Arrow_code_after { O { } m m m ! O { } }
+  {
+    \int_set:Nn \l_@@_pos_arrow_int 1
+    \str_clear_new:N \l_@@_previous_key_str
+    \group_begin:
+      \keys_set:nn { WithArrows / Arrow / CodeAfter } 
+        { #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 test wether the two Tikz nodes |(#2-l)| and |(#3-l)| really exist. If not, the arrow won't be drawn.
+% We prevent drawing a arrow from a line to itself.
 %    \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
-                    {\begin{tikzpicture} [@@_standard]
-                        \tikz at scan@one at point\pgfutil at firstofone(#2-l.south)
+      \tl_if_eq:nnTF { #2 } { #3 }
+        { \@@_error:nn { Both~lines~are~equal } { #2 } }
+%    \end{macrocode}
+% We test wether 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
+                    {
+                      \begin { tikzpicture } [ @@_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}
+                        \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} 
+                          { \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} [@@_standard]
-                        \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}
-                     \end{tikzpicture}}
-                 \@@_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl {#4} }}
-      \group_end:
-      }
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf at y } 
+                      \end { tikzpicture } 
+                    }
+                    { 
+                      \begin { tikzpicture } [ @@_standard ]
+                        \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 }
+                      \end { tikzpicture } 
+                    }
+                  \@@_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 } 
+                } 
+            }
+        }
+    \group_end:
+  }
 %    \end{macrocode}
 %
 %                               
 % \bigskip
 % \subsection{MultiArrow}
-% The command |\@@_MultiArrow:nn| will be linked to |\MultiArrow| when the |CodeAfter| is executed.
+% The command |\@@_MultiArrow:nn| will be linked to |\MultiArrow| when the
+% |CodeAfter| is executed.
 %    
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_MultiArrow:nn
-    {
+  {  
 %    \end{macrocode}
-% The user of the command |\MultiArrow| (in |CodeAfter|) 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|.
+% The user of the command |\MultiArrow| (in |CodeAfter|) 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}} 
+    \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.
+% We sort the list |\g_tmpa_clist| because we want to extract the minimum and
+% the maximum.
 %    \begin{macrocode}
-     \int_compare:nNnTF {\clist_count:N \g_tmpa_clist} < 2 
-       {\@@_error:n {Too~small~specification~for~MultiArrow}}
-       {\clist_sort:Nn \g_tmpa_clist 
-                       {\int_compare:nNnTF {##1} > {##2}
-                             {\sort_return_swapped:}
-                             {\sort_return_same:}}
+    \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}).
+% 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
+         \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...
+% 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
+         \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).
+% 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:Nx \@@_MultiArrow_i:n {\g_tmpa_clist}
+         \exp_args:NV \@@_MultiArrow_i:n \g_tmpa_clist
 %    \end{macrocode}
 %
 % Now, we draw the rest of the structure.
 %    \begin{macrocode}
-        \begin{tikzpicture}[@@_standard,every~path/.style={WithArrows/arrow}] 
-          \draw [<->] ([xshift = \l_@@_xoffset_dim]\l_tmpa_tl-r.south)
+         \begin { tikzpicture }
+           [ 
+             @@_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} ;
-        \end{tikzpicture} } }
-
+           \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 } ;
+         \end{tikzpicture} 
+      } 
+ }
+%    \end{macrocode}
+%
+%    \begin{macrocode}
 \cs_new_protected:Nn \@@_MultiArrow_i:n
-     {\begin{tikzpicture}[@@_standard,every~path/.style={WithArrows/arrow}] 
-        \foreach \k in {#1}
-           {\draw[<-] ([xshift = \l_@@_xoffset_dim]\k-r.south) -- ++(5mm,0) ;} ;
-      \end{tikzpicture}}
+  { 
+    \begin {tikzpicture }
+      [ 
+        @@_standard , 
+        every~path / .style = { WithArrows / arrow } 
+      ] 
+      \foreach \k in { #1 }
+        { 
+          \draw [ <- ] 
+            ( [xshift = \l_@@_xoffset_dim]\k-r.south ) -- ++(5mm,0) ; 
+        } ;
+    \end { tikzpicture } 
+  }
 %    \end{macrocode}
 %
 %
@@ -4342,449 +5078,523 @@
 % \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. }
+%    \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 {witharrows}
-             {AllowLineWithoutAmpersand}
-             {The~option~"AllowLineWithoutAmpersand"~is~deprecated~because~lines~
-              without~ampersands~are~now~always~allowed.~The~option~
-              "AllowLineWithoutAmpersand"~will~probably~be~deleted~in~a~future~version.~
-              However,~you~can~go~on~for~this~time.}
-%    \end{macrocode}  
-% 
+\@@_msg_new:nnn { Unknown~option~in~Arrow }
+  { 
+    The~option~'\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\}. \\
+    \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 {witharrows}
-             {Unknown~option}
-             {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~
-              meaningless~in~the~context.~If~you~go~on,~it~will~be~ignored.}
+\@@_msg_new:nnn { Unknown~option~WithArrows }
+  {
+    The~option~'\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 {witharrows}
-             {Third~column~in~WithArrows}
-             {By~default,~an~environment~\{\l_@@_type_env_tl\}~can~only~have~
-              two~columns.~Maybe~you~have~forgotten~a~
-              \c_backslash_str\c_backslash_str.~If~you~really~want~more~than~
-              two~columns,~you~should~use~the~option~"MoreColumns"~at~a~global~
-              level~or~for~ an~environment.~However,~you~can~go~one~for~
-              this~time.}
+\@@_msg_new:nnn { Unknown~option~DispWithArrows }
+  { 
+    The~option~'\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 {witharrows}
-             {Third~column~in~DispWithArrows}
-             {An~environment~\{\l_@@_type_env_tl\}~can~only~have~two~columns.~
-              Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ at~the~end~
-              of~row~\int_use:N\g_@@_line_int.~If~you~go~on,~you~may~have~other~errors.}
+\@@_msg_new:nnn { Unknown~option~WithArrowsOptions }
+  { 
+    The~option~'\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~CodeAfter }
+  { 
+    The~option~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \Arrow\
+    in~\token_to_str:N \CodeAfter. \\
+    \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_CodeAfter_seq {~and~} {,~} {~and~}.
+  }
+%    \end{macrocode}
+%
+%
 %    \begin{macrocode}          
-\msg_new:nnn {witharrows}
-             {Negative~value~for~jump}
-             {You~can't~use~a~strictly~negative~value~for~the~option~"jump"~of~command~
-              \l_@@_string_Arrow_for_messages_str.~
-              You~can~create~an~arrow~going~backwards~with~ the~option~"<-"~of~Tikz.}
+\@@_msg_new:nn { Third~column~in~WithArrows }
+ { 
+   By~default,~an~environment~\{\l_@@_type_env_str\}~can~only~have~
+   two~columns.~Maybe~you~have~forgotten~a~
+   \c_backslash_str\c_backslash_str.~If~you~really~want~more~than~
+   two~columns,~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:nnn {witharrows}          
-             {Too~few~lines~for~an~arrow}
-             {An~arrow~specified~in~line~\int_use:N \l_@@_initial_int\ can't~be~drawn~
-              because~it~arrives~after~the~last~line~of~the~environment~(remind~that~
-              the~command~\l_@@_string_Arrow_for_messages_str.~
-              must~be~in~the~*start*~line~of~the~arrow).~
-              If~you~go~on,~this~arrow~will~be~ignored.}
+\@@_msg_new:nn { Third~column~in~DispWithArrows }
+  { 
+    An~environment~\{\l_@@_type_env_str\}~can~only~have~two~columns.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ 
+    at~the~end~of~row~\int_use:N \g_@@_line_int. \\
+    If~you~go~on,~you~may~have~other~errors.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}          
-\msg_new:nnn {witharrows}
-             {WithArrows~outside~math~mode}
-             {The~environment~\{\l_@@_type_env_tl\}~should~be~used~only~in~math~mode.~
-              Nevertheless,~you~can~go~on.}
+\@@_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:nnn {witharrows}
-             {DispWithArrows~in~math~mode}
-             {The~environment~\{\l_@@_type_env_tl\}~should~be~used~only~
-              outside~math~mode.~If~you~go~on,~you~will~have~other~errors.}
+\@@_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:nnn {witharrows}
-             {Incompatible~options}
-             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
-             this~option~is~incompatible~or~redundant~with~the~option~"
-             \int_case:nn\l_@@_previous_pos_arrow_int
-                 {0 {lr}
-                  1 {ll}
-                  2 {rl}
-                  3 {rr}
-                  4 {v}
-                  5 {i}
-                  6 {groups}
-                  7 {group}}"~
-             set~in~the~same~
-             \int_case:nn\l_@@_level_int 
-                  {1 {command~\token_to_str:N\WithArrowsOptions}
-                   2 {declaration~of~options~of~the~environment~
-                      \{\l_@@_type_env_tl\}}
-                   3 {command~\l_@@_string_Arrow_for_messages_str}}.~
-             If~you~go~on,~I~will~use~the~option~"\tl_use:N\l_keys_key_tl".}
+\@@_msg_new:nn { WithArrows~outside~math~mode }
+ { 
+   The~environment~\{\l_@@_type_env_str\}~should~be~used~only~in~math~mode. \\
+   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. \\
+    If~you~go~on,~you~will~have~other~errors.
+  }
+%    \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:nnn {witharrows}
-             {Option~will~be~ignored}
-             {The~option~"\tl_use:N\l_keys_key_tl"~can't~be~used~here.~
-              If~you~go~on,~it~will~be~ignored.}
+\@@_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_CodeAfter_bool
+      { 
+        \l_@@_string_Arrow_for_msg_str\
+        in~the~CodeAfter~of~your~environment~\{\l_@@_type_env_str\}
+      }. \\
+    \c_@@_option_ignored_str
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Arrow~in~first~column}
-             {You~should~not~use~the~command~\l_@@_string_Arrow_for_messages_str\
-              in~the~first~column~but~only~in~the~second~column.\\
-              However~you~can~go~on~for~this~time.}
+\@@_msg_new:nn { Arrow~in~first~column }
+  { 
+    You~should~not~use~the~command~\l_@@_string_Arrow_for_msg_str\
+    in~the~first~column~of~your~environment~\{\l_@@_type_env_str\}~
+    but~only~in~the~second~column. \\
+    However~you~can~go~on~for~this~time.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Wrong~line~in~Arrow}
-             {The~specification~of~line~"#1"~you~use~in~\token_to_str:N\Arrow\ 
-              ~doesn't~exist.\\
-              If~you~go~on,~the~arrow~will~be~ignored.}
+\@@_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~'CodeAfter'~of~\{\l_@@_type_env_str\}~doesn't~exist. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {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.}
+\@@_msg_new:nn { Both~lines~are~equal }
+  {
+    In~the~'CodeAfter'~of~\{\l_@@_type_env_str\}~you~try~to~
+    draw~an~arrow~going~to~it~self~from~the~line~'#1'.~This~is~not~possible. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+%
+%    \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:nnn {witharrows}
-             {Too~small~specification~for~MultiArrow}
-             {The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\ 
-              is~too~small:~we~need~at~least~two~lines.~If~you~go~on,~the~
-              command~\token_to_str:N\MultiArrow\ ~will~be~ignored.}
+\@@_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. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {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.}
+\@@_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:nnn {witharrows}
-             {Command~not~allowed~in~DispWithArrows}
-             {The~command~\token_to_str:N #1
-              is~not~allowed~in~the~first~column~of~\{\l_@@_type_env_tl\}~but~
-              only~in~the~second~column.~If~you~go~on,~this~command~will~be~ignored.}
+\@@_msg_new:nn { Not~allowed~in~DispWithArrows }
+  { 
+    The~command~\token_to_str:N #1
+    is~not~allowed~in~the~first~column~of~\{\l_@@_type_env_str\}~but~
+    only~in~the~second~column. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Command~not~allowed~in~WithArrows}
-             {The~command~\token_to_str:N #1 is~not~allowed~in~\{\l_@@_type_env_tl\}~
-              (it's~allowed~in~the~second~column~of~\{DispWithArrows\}).~If~you~go~on,
-              ~this~command~will~be~ignored.}
+\@@_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~second~column~of~\{DispWithArrows\}). \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Multiple~tags}
-             {You~can't~use~twice~the~command~\token_to_str:N\tag\ 
-              in~a~line~of~the~environment~\{\l_@@_type_env_tl\}.~If~you~go~on,~the~tag~ 
-              '#1'~will~be~used.}
+\@@_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:nnn {witharrows}
-             {Multiple~labels}
-             {Normally,~we~can't~use~the~command~\token_to_str:N\label\ 
-              twice~in~a~line~of~the~environment~\{\l_@@_type_env_tl\}.~
-              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~
-              "AllowMultipleLabels"~at~the~global~or~environment~level.}
+\@@_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:nnn {witharrows}
-             {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_tl\}.~
-              If~you~go~on,~you~may~have~undefined~references.}
+\@@_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.
+  }
 %    \end{macrocode}
 %
 % 
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {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.~If~you~go~on,~you~may~have~an~incorrect~output.}
+\@@_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~\int_use:N \l_tmpa_int\
+    of~your~environment~\{\l_@@_type_env_str\}. \\
+    If~you~go~on,~you~may~have~an~incorrect~output.
+  }
 %    \end{macrocode}
 %
 %    \begin{macrocode}          
-\msg_new:nnn {witharrows}
-             {Option~incompatible~with~group}
-             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
-              you~are~using~the~option~"
-              \int_compare:nNnTF \l_@@_pos_arrow_int = 5
-                   {group} 
-                   {groups}".~
-              It's~incompatible.~You~can~go~on~ignoring~this~option~
-              "\tl_use:N\l_keys_key_tl"~but~you~should~correct~your~code.}
+\@@_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}
 %
 % 
-% \subsection{Environment \{CasesWithArrows\}}
 %
-%    \begin{macrocode}
-\coffin_new:N \l_@@_halign_coffin
-\NewDocumentEnvironment {CasesWithArrows} {m !O{}}
-         {\hbox_set:Nn \l_tmpa_box {$\left\{\vcenter to 1cm {} \right.$}
-          \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_part_box
-          \hbox_set:Nn \l_@@_left_part_box 
-                       {$\bool_if:NT \l_@@_displaystyle_bool \displaystyle #1 {}$}
-          \bool_if:nT \c_@@_mathtools_loaded_bool
-                 {\MH_if_boolean:nT {show_only_refs}
-                    {\MT_showonlyrefs_false:
-                      \MH_set_boolean_T:n {show_only_refs}
-                      \clist_set:Nn \l_@@_tags_clist {all}}}
-           \bool_if:NT \c_@@_amsmath_loaded_bool \intertext@
-           \if_mode_math:
-               \@@_error:n {DispWithArrows~in~math~mode}
-           \fi:
-           \bool_set_true:N \l_@@_in_DispWithArrows_bool
-           %
-           \_@@_pre_environment:n {#2}
-           \nointerlineskip
-           \hbox_to_wd:nn {0.6\linewidth} {}
-           $$
-           \spread at equation
-           \vcoffin_set:Nnw \l_@@_halign_coffin \displaywidth
-              \bool_if:NTF \l_@@_fleqn_bool
-                     {\tabskip = \c_zero_skip}
-                     {\tabskip = 0 pt plus 1000 pt minus 1000 pt}
-              \bool_if:NTF \c_@@_amsmath_loaded_bool
-                 {\cs_set_eq:NN \@@_old_label \ltx at label}
-                 {\cs_set_eq:NN \@@_old_label \label}
-              \halign to \displaywidth \bgroup
-                \int_gincr:N \g_@@_line_int
-                \cs_set_eq:cN \l_@@_CommandName_str \@@_Arrow_first_column:
-                \bool_set_true:N \l_@@_in_first_column_bool
-                \bool_if:NT \l_@@_fleqn_bool
-                      {\skip_horizontal:n \l_@@_mathindent_dim}
-                \hfil
-                \skip_horizontal:n {\box_wd:N \l_@@_left_part_box + \l_@@_delim_wd_dim}
-                $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {##}$
-                \tabskip = \c_zero_skip
-               &
-                \clist_if_in:NVT \l_@@_tags_clist \g_@@_line_int 
-                    {\clist_set:Nn \l_@@_tags_clist {all}}
-                \cs_set:Npn \notag {\clist_clear:N \l_@@_tags_clist}
-                $\bool_if:NT \l_@@_displaystyle_bool \displaystyle {{}##}$
-                \tabskip = 0 pt plus 1000 pt minus 1000 pt
-                \tikz [remember~picture,overlay]
-                     \node [@@_node_style,
-                            name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-l,
-                            alias = {\tl_if_empty:NF \l_@@_name_tl
-                                      {\l_@@_name_tl-\int_use:N\g_@@_line_int-l}} ] {} ;
-                \hfil
-                \tikz [remember~picture,overlay]
-                     \node [@@_node_style,
-                            name = wa-\l_@@_prefix_str-\int_use:N\g_@@_line_int-r,
-                            alias = {\tl_if_empty:NF \l_@@_name_tl
-                                      {\l_@@_name_tl-\int_use:N\g_@@_line_int-r}} ] {} ;
-                \bool_if:NT \l_@@_shownodenames_bool
-                     {\hbox_overlap_right:n {\small wa-\l_@@_prefix_str
-                                                      -\int_use:N\g_@@_line_int}}
-               & ##
-                \tabskip = \c_zero_skip
-               && \@@_error:n {Third~column~in~DispWithArrows}
-                  \if_false: ## \fi:
-                \cr}
-          {\clist_if_in:NnT \l_@@_tags_clist {last} 
-                   {\clist_set:Nn \l_@@_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_@@_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}}
-           \vcoffin_set_end:
-           \hbox_to_wd:nn \displaywidth 
-             {
-              \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_part_box
-                     \dim_set:Nn \l_tmpa_dim {   \box_ht:N \l_@@_halign_coffin
-                                               + \box_dp:N \l_@@_halign_coffin}
-                     $\left\{ \vcenter to \l_tmpa_dim {\vfil} \right.$}
-              \hfil}
-           \coffin_typeset:Nnnnn 
-                        \l_@@_halign_coffin {l} {vc} {-\displaywidth} \c_zero_dim
-           $$
-           \_@@_post_environment:
-           \bool_if:nT \c_@@_mathtools_loaded_bool
-                    {\MH_if_boolean:nT {show_only_refs}
-                          \MT_showonlyrefs_true:}
-           \bool_if:NT \g_@@_footnote_bool \endsavenotes
-           \ignorespacesafterend
-           }
-%    \end{macrocode}
-%
 % \subsection{The command WithArrowsNewStyle}
 %
-% A new key defined with |\WithArrowsNewStyle| will not be available at the local level (|\l_@@_level_int| = 3).
+% A new key defined with |\WithArrowsNewStyle| will not be available at the
+% local level.
 %    \begin{macrocode}
-\NewDocumentCommand \WithArrowsNewStyle {mm}
-   { \keys_if_exist:nnTF {WithArrows/General} {#1}
-       {\@@_error:nn {Key~already~defined} {#1}}
-       {\keys_define:nn {WithArrows/General}
-            {#1 .code:n = {\int_compare:nNnTF \l_@@_level_int < 3
-                            {\bool_set_eq:NN \l_tmpa_bool \l_@@_in_WithArrows_bool 
-                             \bool_set_eq:NN \l_tmpb_bool \l_@@_in_DispWithArrows_bool 
-                             \bool_set_false:N \l_@@_in_WithArrows_bool
-                             \bool_set_false:N \l_@@_in_DispWithArrows_bool
-                             \keys_set_known:nnN {WithArrows/General} {#2} \l_tmpa_tl
-                             \keys_set_known:nVN {WithArrows/GlobalOrEnv} 
-                                                 \l_tmpa_tl \l_tmpb_tl
-                             \bool_set_eq:NN \l_@@_in_WithArrows_bool \l_tmpa_bool
-                             \bool_set_eq:NN \l_@@_in_DispWithArrows_bool \l_tmpb_bool}
-                            {\@@_error:n {Unknown~option}}}}
+\NewDocumentCommand \WithArrowsNewStyle { m m }
+  { 
+    \keys_if_exist:nnTF { WithArrows / WithArrows } { #1 }
+      { \@@_error:nn { Key~already~defined } { #1 } }
+      { 
+        \keys_define:nn { WithArrows / WithArrows }
+           { 
+             #1 .code:n = 
+                  { 
+                    \keys_define:nn { WithArrows / WithArrows }
+                       { unknown .code:n = \prg_do_nothing: }
+                    \keys_set:nn { WithArrows / WithArrows } { #2 } 
+                    \keys_define:nn { WithArrows / WithArrows }
+                       { unknown .code:n = 
+                          \@@_error:n { Unknown~option~WithArrows }} 
+                  }
+           } 
+       \seq_put_right:Nn \l_@@_options_WithArrows_seq {#1}
+       \keys_define:nn { WithArrows / DispWithArrows }
+           { 
+             #1 .code:n = 
+                  { 
+                    \keys_define:nn { WithArrows / DispWithArrows }
+                       { unknown .code:n = \prg_do_nothing: }
+                    \keys_set:nn { WithArrows / DispWithArrows } { #2 } 
+                    \keys_define:nn {WithArrows / DispWithArrows }
+                       { unknown .code:n = 
+                           \@@_error:n { Unknown~option~DispWithArrows }} 
+                  }
+           } 
+       \seq_put_right:Nn \l_@@_options_DispWithArrows_seq { #1 }
+       \keys_define:nn { WithArrows / WithArrowsOptions }
+           { 
+             #1 .code:n = 
+              { \keys_set:nn { WithArrows / WithArrowsOptions } { #2 } } 
+           }
+       \seq_put_right:Nn \l_@@_options_WithArrowsOptions_seq { #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|. When the key~|#1|
-% will be used, the error will be raised again.
+% 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|. When the key~|#1| will
+% be used, the error will be raised again.
 %    \begin{macrocode}
-        \group_begin:
-           \msg_set:nnn {witharrows}
-                        {Option~will~be~ignored}
-                        {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~can't~be~
-                         used~in~\token_to_str:N\WithArrowsNewStyle.~If~you~go~on,~
-                         this~option~will~be~ignored~in~the~definition~of~style~'#1'.}
-           \msg_set:nnn {witharrows}
-                        {Unknown~option}
-                        {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown.~If~you~go~on,~
-                         this~option~will~be~ignored~in~the~definition~of~style~'#1'.}
-           \WithArrowsOptions{#2}
-        \group_end:} }
+       \group_begin:
+           \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
+              {
+                The~option~'\l_keys_key_tl'~can't~be~set~in~the~
+                definition~of~a~style. \\
+                If~you~go~on,~this~key~will~not~be~written~in~the~style~'#1'.
+              }
+           \WithArrowsOptions { #2 }
+       \group_end:
+      } 
+  }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {Key~already~defined}
-             {The~key~'#1'~is~already~defined.~If~you~go~on,~
-              your~instruction~\token_to_str:N\WithArrowsNewStyle\ will~be~ignored.}
+\@@_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 independant of the main code of the extension \pkg{witharrows}.
+% 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 if he uses the option |up| or the option |down|.
+% 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 if he uses the option |up| or the option |down|.
 % 
 % \medskip
-% The token list |\c_@@_tikz_code_up_tl| is the value of |TikzCode| which will be used for an option |up|.
+% The token list |\c_@@_tikz_code_up_tl| is the value of |TikzCode| which will
+% be used for an option |up|.
 %    \begin{macrocode}
-\tl_set:Nn \c_@@_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
+\tl_const:Nn \c_@@_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
                             \raggedright
-                               #3
-                            \end{varwidth}} 
-             (\x2,\y1) -- (\p2) ;}
+                            #3
+                          \end { varwidth } 
+                        } 
+          (\x2,\y1) -- (\p2) ;
+  }
 %    \end{macrocode}
 % 
 % \medskip
 % Idem for the option |down|.
 %    \begin{macrocode}
-\tl_set:Nn \c_@@_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
-                            \raggedright
-                               #3
-                            \end{varwidth}} 
-                   (\p2) ;}
+\tl_const:Nn \c_@@_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
+                         \raggedright
+                         #3
+                       \end { varwidth }
+                     } 
+                (\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/General}
-     {up .value_forbidden:n = true,
-      up .code:n = {\int_compare:nNnTF \l_@@_level_int = 3
-                     {\bool_if:NTF \c_@@_varwidth_loaded_bool
-                        {\cs_if_exist:cTF {tikz at library@calc at loaded}
-                           {\int_set:Nn \l_@@_pos_arrow_int 1
+\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 }
+                     \bool_if:NTF \c_@@_varwidth_loaded_bool
+                       { 
+                         \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 TikzCode that will overwrite our affectation.
+% 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 |TikzCode| 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}}}
-                        {\@@_error:n {varwidth~not~loaded}}}
-                     {\@@_error:n {Unknown~option}}},
-      down .value_forbidden:n = true,
-      down .code:n = {\int_compare:nNnTF \l_@@_level_int = 3
-                       {\bool_if:NTF \c_@@_varwidth_loaded_bool
-                          {\cs_if_exist:cTF {tikz at library@calc at loaded}
-                             {\int_set:Nn \l_@@_pos_arrow_int 1
+                             \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 } }
+                       }
+                       { \@@_error:n { varwidth~not~loaded } } 
+                   } ,
+   down .code:n = \str_if_empty:NT \l_@@_previous_key_str
+                    { 
+                      \str_set:Nn \l_@@_previous_key_str { down }
+                      \bool_if:NTF \c_@@_varwidth_loaded_bool
+                        { 
+                          \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}}}
-                          {\@@_error:n {varwidth~not~loaded}}}
-                       {\@@_error:n {Unknown~option}}}}
+                              \tl_set_eq:NN \l_@@_tikz_code_tl 
+                                \c_@@_tikz_code_down_tl
+                            }
+                            { \@@_error:n { calc~not~loaded } }
+                        }
+                        { \@@_error:n { varwidth~not~loaded } } 
+                    }
+ }
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
-\msg_new:nnn {witharrows}
-             {varwidth~not~loaded}
-             {You~can't~use~the~option~"\l_keys_key_tl"~because~
-              you~don't~have~loaded~the~package~
-              varwidth.~If~you~go~on,~this~option~will~be~forgotten.}
+\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:nnn {witharrows}
-             {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~your~preamble.~ 
-              ~If~you~go~on,~this~option~will~be~forgotten.}
+\@@_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~your~preamble. \\
+    \c_@@_option_ignored_str
+  }
 %    \end{macrocode}
 % 
 % \section{History}
@@ -4800,8 +5610,9 @@
 %
 % \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}).
+% 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})
 %
@@ -4813,26 +5624,33 @@
 %
 % \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}.
+% 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 |TikzCode|.
+% The Tikz code used to draw the arrows can be changed with the option
+% |TikzCode|.
 %
-% Two new options |CodeBefore| and |CodeAfter| have been added at the environment level.
+% Two new options |CodeBefore| and |CodeAfter| have been added at the
+% environment level.
 %
-% A special version of |\Arrow| is available in |CodeAfter| in order to draw arrows in nested environments.
+% A special version of |\Arrow| is available in |CodeAfter| in order to draw
+% arrows in nested environments.
 % 
-% A command |\MultiArrow| is available in |CodeAfter| to draw arrows of other shapes.
+% A command |\MultiArrow| is available in |CodeAfter| 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.
+% 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}|.
 %
-% In the version 1.6.1, correction of a bug that leads to incompatibility with |\usetikzlibrary{babel}|.
+% In the version 1.6.1, correction of a bug that leads to incompatibility with
+% |\usetikzlibrary{babel}|.
 %
 % \subsection*{Changes between 1.6.1 and 1.7}
 %
@@ -4840,24 +5658,27 @@
 %
 % \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}.
+% 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*}|.
+% 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.
+% 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.
+% 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}
 %
@@ -4869,21 +5690,25 @@
 %
 % 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.
+% 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}.
+% Compatibility with the packages \pkg{refcheck}, \pkg{showlabels} and
+% \pkg{listlbls}.
 %
-% The option |\AllowLineWithoutAmpersand| is deprecated because lines without ampersands are now always allowed.
+% 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:
+% 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}
@@ -4894,22 +5719,35 @@
 % New options |up| and |down| for the arrows.
 %
 % \smallskip
-% Replacement of some options |O{}| in commands and environments defined with \pkg{xparse} by |!O{}| (because 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|).
+% Replacement of some options |O { }| in commands and environments defined with
+% \pkg{xparse} by |! O { }| (because 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.
+% 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.
+% 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 et 1.15}
 %
+% Option |new-group| to start a new group of arrows (only available when the
+% environment is composed with the option 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|.} 
+%
 % \endinput
 % Local Variables:
 % TeX-fold-mode: nil
+% fill-column: 80
 % End:

Modified: trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	2019-02-20 22:43:15 UTC (rev 50077)
+++ trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	2019-02-20 22:43:27 UTC (rev 50078)
@@ -18,11 +18,11 @@
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 2005/12/01 or later.
 %% 
-\def\myfileversion{1.14}
-\def\myfiledate{2019/02/01}
+\def\myfileversion{1.15}
+\def\myfiledate{2019/02/20}
 \RequirePackage{tikz}
 \usetikzlibrary{arrows.meta,bending}
-\RequirePackage{expl3}[2019/01/28]
+\RequirePackage{expl3}[2019/02/15]
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {witharrows}
@@ -29,1245 +29,1743 @@
   {\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
-\int_new:N \l__wa_level_int
-\keys_define:nn {WithArrows/package}
-      {footnote      .bool_gset:N = \g__wa_footnote_bool,
-       footnotehyper .bool_gset:N = \g__wa_footnotehyper_bool,
-       unknown       .code:n      = \msg_fatal:nn {witharrows}
-                                         {Option~unknown~for~package}}
-\msg_new:nnn {witharrows}
-             {Option~unknown~for~package}
-             {You~can't~use~the~option~"\tl_use:N\l_keys_key_tl"~when~loading~the~
-              package~witharrows.}
-\ProcessKeysOptions {WithArrows/package}
-\msg_new:nnn {witharrows}
-             {Option~incompatible~with~Beamer}
-             {The~option~"\tl_use:N \l_keys_key_tl"\ is~incompatible~
-              with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes.}
-\msg_new:nnn {witharrows}
-             {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.}
-\msg_new:nnn {witharrows}
-             {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.}
-\bool_if:NT \g__wa_footnote_bool
-      {\@ifclassloaded {beamer}
-                {\msg_fatal:nn {witharrows}
-                               {Option~incompatible~with~Beamer}}
-                {}
-       \@ifpackageloaded{footnotehyper}
-           {\msg_fatal:nn {witharrows}
-                          {footnote~with~footnotehyper~package}}
-           {}
-       \usepackage{footnote}}
-\bool_if:NT \g__wa_footnotehyper_bool
-      {\@ifclassloaded {beamer}
-                {\msg_fatal:nn {witharrows}
-                               {Option~incompatible~with~Beamer}}
-                {}
-       \@ifpackageloaded{footnote}
-           {\msg_fatal:nn {witharrows}
-                          {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* {}
+\RequirePackage { xparse } [ 2018-10-17 ]
+\bool_new:N \g__witharrows_footnotehyper_bool
+\bool_new:N \g__witharrows_footnote_bool
+\cs_new_protected:Npn \__witharrows_msg_new:nn { \msg_new:nnn { witharrows } }
+\cs_new_protected:Npn \__witharrows_msg_new:nnn { \msg_new:nnnn { witharrows } }
+\cs_new_protected:Npn \__witharrows_msg_redirect_name:nn
+  { \msg_redirect_name:nnn { witharrows } }
+\keys_define:nn { WithArrows / package }
+  {
+    footnote .bool_gset:N = \g__witharrows_footnote_bool ,
+    footnotehyper .bool_gset:N = \g__witharrows_footnotehyper_bool ,
+    unknown .code:n =
+      \msg_fatal:nn { witharrows } { Option~unknown~for~package }
+  }
+\__witharrows_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 }
+\__witharrows_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.
+  }
+\__witharrows_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.
+  }
+\__witharrows_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.
+  }
+\bool_if:NT \g__witharrows_footnote_bool
+  {
+    \@ifclassloaded { beamer }
+      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
+      { }
+    \@ifpackageloaded { footnotehyper }
+      { \msg_fatal:nn { witharrows } { footnote~with~footnotehyper~package } }
+      { }
+    \usepackage { footnote }
+  }
+\bool_if:NT \g__witharrows_footnotehyper_bool
+  {
+    \@ifclassloaded { beamer }
+      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
+      { }
+    \@ifpackageloaded { footnote }
+      { \msg_fatal:nn { witharrows } { footnotehyper~with~footnote~package } }
+      { }
+    \usepackage { footnotehyper }
+    \bool_gset_true:N \g__witharrows_footnote_bool
+  }
+\bool_new:N \c__witharrows_leqno_bool
+\DeclareOption { leqno } { \bool_set_true:N \c__witharrows_leqno_bool }
+\DeclareOption* { }
 \ProcessOptions*
-\cs_new_protected:Nn \__wa_error:n
-        {\msg_error:nn {witharrows} {#1}}
-\cs_new_protected:Nn \__wa_error:nn
-        {\msg_error:nnn {witharrows} {#1} {#2}}
-\cs_generate_variant:Nn \__wa_error:nn {nx}
-\cs_new_protected:Nn \__wa_bool_new:N
-      {\bool_if_exist:NTF #1
-         {\bool_set_false:N #1}
-         {\bool_new:N #1}}
+\cs_new_protected:Npn \__witharrows_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__witharrows_error:nn  { \msg_error:nnn { witharrows } }
+\cs_generate_variant:Nn \__witharrows_error:nn { n x }
+\cs_new_protected:Nn \__witharrows_bool_new:N
+  {
+    \bool_if_exist:NTF #1
+      { \bool_set_false:N #1 }
+      { \bool_new:N #1 }
+  }
 \AtBeginDocument
-      {\clist_map_inline:nn
-            {amsmath,mathtools,autonum,cleveref,hyperref,typedref,showlabels,
-             amsthm,varwidth}
-            {\bool_new:c {c__wa_#1_loaded_bool}
-             \@ifpackageloaded {#1}
-                   {\bool_set_true:c {c__wa_#1_loaded_bool}}
-                   {}}}
-\cs_generate_variant:Nn \seq_set_split:Nnn {Nxx}
-\cs_new_protected:Nn \__wa_save:N
-   {\seq_set_split:Nxx \l_tmpa_seq {\char_generate:nn {`_} {12}} {\cs_to_str:N #1}
+  {
+    \clist_map_inline:nn
+      {
+        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
+        typedref, varwidth
+      }
+      {
+        \bool_new:c { c__witharrows_#1_loaded_bool }
+        \@ifpackageloaded { #1 }
+          { \bool_set_true:c { c__witharrows_#1_loaded_bool } }
+          { }
+      }
+  }
+\sys_if_engine_luatex:TF
+  {
+    \cs_new_protected:Nn \__witharrows_strcmp:nn
+      { \lua_now:e { l3kernel.strcmp('#1','#2') } }
+  }
+  { \cs_new_protected:Nn \__witharrows_strcmp:nn { \pdftex_strcmp:D { #1 } { #2 } } }
+\cs_new_protected:Nn \__witharrows_sort_seq:N
+  {
+    \seq_sort:Nn #1
+    {
+      \int_compare:nNnTF
+        {
+          \__witharrows_strcmp:nn
+            { \str_lower_case:n { ##1 } }
+            { \str_lower_case:n { ##2 } }
+        }
+        > 0
+        \sort_return_swapped:
+        \sort_return_same:
+    }
+  }
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
+\cs_new_protected:Nn \__witharrows_save:N
+  {
+    \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:Nn \__wa_restore:N
-   {\seq_set_split:Nxx \l_tmpa_seq {\char_generate:nn {`_} {12}} {\cs_to_str:N #1}
+    \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:Nn \__witharrows_restore:N
+  {
+    \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 = 0 pt,
-               minimum~width = 0pt,
-               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,
-                                      -> }}
+    \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
+  {
+    __witharrows_node_style / .style =
+      {
+        above = \l__witharrows_ystart_dim ,
+        inner~sep = \c_zero_dim ,
+        minimum~width = \c_zero_dim ,
+        minimum~height = \l__witharrows_ygap_dim
+      }
+  }
+\tikzset
+  {
+    __witharrows_standard / .style =
+      {
+        remember~picture ,
+        overlay ,
+        name~prefix = wa - \l__witharrows_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:NF \c__wa_amsmath_loaded_bool
-       {\cs_set_protected:Npn \spread at equation
-           {\openup\jot
-            \cs_set_eq:NN \spread at equation \prg_do_nothing:}}}
-\bool_new:N \l__wa_in_WithArrows_bool
-\bool_new:N \l__wa_in_DispWithArrows_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
-\skip_new:N \l__wa_interline_skip
-\int_new:N \l__wa_pos_env_int
-\dim_new:N \l__wa_xoffset_dim
-\dim_set:Nn \l__wa_xoffset_dim {3mm}
-\int_new:N \l__wa_pos_arrow_int
-\int_set:Nn \l__wa_pos_arrow_int 3
-\int_new:N \l__wa_previous_pos_arrow_int
-\dim_new:N \l__wa_x_dim
-\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
-\tl_new:N \l__wa_name_tl
-\bool_new:N \l__wa_fleqn_bool
-\dim_new:N \l__wa_mathindent_dim
-\dim_set:Nn \l__wa_mathindent_dim {25pt}
-\bool_new:N \l__wa_wrap_lines_bool
-\clist_new:N \l__wa_tags_clist
-\clist_set:Nn \l__wa_tags_clist {all}
-\tl_new:N \l__wa_tag_tl
-\bool_new:N \l__wa_tag_star_bool
-\bool_new:N \l__wa_in_first_column_bool
-\bool_new:N \l__wa_initial_r_bool
-\bool_new:N \l__wa_initial_l_bool
-\dim_new:N \l__wa_start_adjust_dim
-\dim_set:Nn \l__wa_start_adjust_dim {0.4ex}
-\dim_new:N \l__wa_end_adjust_dim
-\dim_set:Nn \l__wa_end_adjust_dim {0.4ex}
-\str_new:N \l__wa_CommandName_str
-\str_set:Nn \l__wa_CommandName_str {Arrow}
-\str_new:N \l__wa_string_Arrow_for_messages_str
-\str_set:Nx \l__wa_string_Arrow_for_messages_str {\token_to_str:N \Arrow}
-\int_set:Nn \l__wa_level_int 1
-\keys_define:nn {WithArrows/GlobalOrEnv}
-   {  t   .code:n            = {\bool_if:NTF \l__wa_in_DispWithArrows_bool
-                                 {\__wa_error:n {Option~will~be~ignored}
-                                 {\int_set:Nn \l__wa_pos_env_int 0}}},
-      t   .value_forbidden:n = true,
-      c   .code:n            = {\bool_if:NTF \l__wa_in_DispWithArrows_bool
-                                 {\__wa_error:n {Option~will~be~ignored}}
-                                 {\int_set:Nn \l__wa_pos_env_int 1}},
-      c   .value_forbidden:n = true,
-      b   .code:n            = {\bool_if:NTF \l__wa_in_DispWithArrows_bool
-                                 {\__wa_error:n {Option~will~be~ignored}}
-                                 {\int_set:Nn \l__wa_pos_env_int 2}},
-      b   .value_forbidden:n = true,
-      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,
-      MoreColumns .code:n            = { \bool_if:NTF \l__wa_in_DispWithArrows_bool
-                                           {\__wa_error:n {Option~will~be~ignored}}
-                                           { \msg_redirect_name:nnn
-                                             {witharrows}
-                                             {Third~column~in~WithArrows}
-                                             {none} }},
-      MoreColumns .value_forbidden:n = true,
-      AllowLineWithoutAmpersand .code:n = { \__wa_error:n
-                                            {AllowLineWithoutAmpersand}},
-      AllowLineWithoutAmpersand .value_forbidden:n = true,
-      CommandName .code:n =
-        {\str_set:Nn \l__wa_CommandName_str {#1}
-         \str_set:Nx \l__wa_string_Arrow_for_messages_str
-                    {\c_backslash_str Arrow~(renamed~here~in~\c_backslash_str #1)}},
-      CommandName .value_required:n = true,
-      TikzCode .tl_set:N         = \l__wa_tikz_code_tl,
-      TikzCode .initial:n        = \draw~(#1)~to~node{#3}~(#2)~; ,
-      TikzCode .value_required:n = true,
-      displaystyle .bool_set:N     = \l__wa_displaystyle_bool,
-      displaystyle .initial:n      = false,
-      shownodes .code:n            = {\tikzset{__wa_node_style/.append~style = {draw,red}}},
-      shownodes .value_forbidden:n = true,
-      shownodenames .bool_set:N    = \l__wa_shownodenames_bool,
-      shownodenames .initial:n     = false,
-      group    .code:n    = {\int_compare:nNnT \l__wa_previous_pos_arrow_int > {-1}
-                                    {\__wa_error:n {Incompatible~options}}
-                             \int_set:Nn \l__wa_previous_pos_arrow_int 7
-                             \int_set:Nn \l__wa_pos_arrow_int 7} ,
-      group    .value_forbidden:n = true,
-      groups   .code:n   = {\int_compare:nNnT \l__wa_previous_pos_arrow_int > {-1}
-                                   {\__wa_error:n {Incompatible~options}}
-                            \int_set:Nn \l__wa_previous_pos_arrow_int 6
-                            \int_set:Nn \l__wa_pos_arrow_int 6} ,
-      groups   .value_forbidden:n = true,
-      CodeBefore  .code:n = {\int_compare:nNnTF \l__wa_level_int = 1
-                              {\__wa_error:n {Option~will~be~ignored}}
-                              {\tl_put_right:Nn \l__wa_code_before_tl {#1}}} ,
-      CodeBefore  .value_required:n = true,
-      CodeAfter .code:n = {\int_compare:nNnTF \l__wa_level_int = 1
-                              {\__wa_error:n {Option~will~be~ignored}}
-                              {\tl_put_right:Nn \l__wa_code_after_tl {#1}}} ,
-      CodeAfter .value_required:n = true,
-      name .code:n = {\int_compare:nNnTF \l__wa_level_int = 1
-                              {\__wa_error:n {Option~will~be~ignored}}
-                              {\tl_set:Nn \l__wa_name_tl {#1}}} ,
-      name .value_required:n = true,
-      fleqn   .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                             {\__wa_error:n {Option~will~be~ignored}}
-                             {\str_if_eq:nnTF {#1} {true}
-                                 {\bool_set_true:N \l__wa_fleqn_bool}
-                                 {\bool_set_false:N \l__wa_fleqn_bool}}},
-      fleqn   .default:n = true,
-      mathindent   .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                               {\__wa_error:n {Option~will~be~ignored}}
-                               {\dim_set:Nn \l__wa_mathindent_dim {#1}}},
-      mathindent   .value_required:n = true,
-      notag   .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                             {\__wa_error:n {Option~will~be~ignored}}
-                             {\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,
-      nonumber .meta:n   = notag,
-      AllowMultipleLabels .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                                         {\__wa_error:n {Option~will~be~ignored}}
-                                         {\msg_redirect_name:nnn {witharrows}
-                                                           {Multiple~labels}
-                                                           {none}}},
-      AllowMultipleLabels .value_forbidden:n = true,
-      wrap-lines   .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                               {\__wa_error:n {Option~will~be~ignored}}
-                               {\str_if_eq:nnTF {#1} {true}
-                                   {\bool_set_true:N \l__wa_wrap_lines_bool}
-                                   {\bool_set_false:N \l__wa_wrap_lines_bool}}},
-      wrap-lines   .default:n = true,
-      tagged-lines .code:n = {\bool_if:NTF \l__wa_in_WithArrows_bool
-                              {\__wa_error:n {Option~will~be~ignored}}
-                              {\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 1 }}},
-      tagged-lines .value_required:n = true,
-      unknown .code:n  = \__wa_error:n {Unknown~option}
-     }
-\keys_define:nn {WithArrows/General}
-     {tikz     .code:n            = \tikzset {WithArrows/arrow/.append~style = {#1}},
-      tikz     .initial:n         = {},
-      tikz     .value_required:n  = true,
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \__wa_analyze_option_position:n 3 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \__wa_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \__wa_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \__wa_analyze_option_position:n 0 ,
-      i        .value_forbidden:n = true,
-      i        .code:n            = \__wa_analyze_option_position:n 5 ,
-      xoffset  .code:n  = {\bool_if:nTF {\int_compare_p:nNn \l__wa_level_int = 3 &&
-                                        \int_compare_p:nNn \l__wa_pos_arrow_int > 5}
-                               {\__wa_error:n {Option~incompatible~with~group}}
-                               {\dim_set:Nn \l__wa_xoffset_dim {#1}}} ,
-      xoffset  .value_required:n  = true,
-      jot       .code:n     = {\int_compare:nNnTF \l__wa_level_int = 2
-                                  {\dim_set:Nn \jot {#1}}
-                                  {\__wa_error:n {Option~will~be~ignored}}} ,
-      jot       .value_required:n  = true,
-      interline   .code:n       = {\int_compare:nNnTF \l__wa_level_int = 2
-                                      {\skip_set:Nn \l__wa_interline_skip {#1}}
-                                      {\__wa_error:n {Option~will~be~ignored}}} ,
-      interline   .value_required:n = true,
-      start-adjust .dim_set:N = \l__wa_start_adjust_dim,
-      start-adjust .value_required:n = true,
-      end-adjust  .dim_set:N = \l__wa_end_adjust_dim,
-      end-adjust  .value_required:n = true,
-      adjust      .code:n  = {\dim_set:Nn \l__wa_start_adjust_dim {#1}
-                              \dim_set:Nn \l__wa_end_adjust_dim {#1} },
-      adjust      .value_required:n = true,
-      unknown     .code:n  = \__wa_error:n {Unknown~option}
-}
-\keys_define:nn {WithArrows/Arrow}
-     {jump  .code:n = {\int_set:Nn \l__wa_jump_int {#1}
-                       \int_compare:nNnF \l__wa_jump_int > 0
-                           {\__wa_error:n {Negative~value~for~jump}}} ,
-      jump  .value_required:n  = true,
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \__wa_analyze_option_position:n 3 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \__wa_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \__wa_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \__wa_analyze_option_position:n 0 ,
-      i        .value_forbidden:n = true,
-      i        .code:n            = \__wa_analyze_option_position:n 5 }
-\cs_new_protected:Nn \__wa_analyze_option_position:n
-     {\int_compare:nNnT \l__wa_previous_pos_arrow_int > {-1}
-        {\__wa_error:n {Incompatible~options}}
-      \int_set:Nn \l__wa_previous_pos_arrow_int {#1}
-      \int_set:Nn \l__wa_pos_arrow_int {#1}}
-\NewDocumentCommand \WithArrowsOptions {m}
-    {\int_set:Nn \l__wa_previous_pos_arrow_int {-1}
-     \keys_set_known:nnN {WithArrows/General} {#1} \l_tmpa_tl
-     \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl}
-\NewDocumentCommand \__wa_Arrow {O{} m !O{}}
-         {
-          \int_gincr:N \g__wa_arrow_int
-          \int_set:Nn \l__wa_previous_pos_arrow_int {-1}
-          \int_set:Nn \l__wa_pos_arrow_int {-1}
-          \int_set:Nn \l__wa_level_int 3
-          \keys_set_known:nnN {WithArrows/Arrow} {#1,#3} \l_tmpa_tl
-          \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 {position} \l__wa_pos_arrow_int
-          \prop_put:NnV \l_tmpa_prop {options} \l_tmpa_tl
-          \prop_put:Nnn \l_tmpa_prop {label} {#2}
-          \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
+  {
+    \bool_if:NF \c__witharrows_amsmath_loaded_bool
+      {
+        \cs_set_protected:Npn \spread at equation
+          {
+            \openup \jot
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:
           }
-\cs_new_protected:Nn \__wa_Arrow_first_column:
-               {\__wa_error:n {Arrow~in~first~column}
-                \__wa_Arrow}
-\cs_new_protected:Nn \__wa_pre_environment:n
-         { \tl_clear_new:N \l__wa_type_env_tl
-           \tl_set:NV \l__wa_type_env_tl \@currenvir
-           \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: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 1
-           \seq_clear_new:N \l__wa_labels_seq
-           \__wa_bool_new: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
-           \int_set:Nn \l__wa_previous_pos_arrow_int {-1}
-           \int_set:Nn \l__wa_level_int 2
-           \keys_set_known:nnN {WithArrows/General} {#1} \l_tmpa_tl
-           \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl
-           \bool_if:NT \g__wa_footnote_bool \savenotes
-           \l__wa_code_before_tl
-           \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow}
-\NewDocumentEnvironment {WithArrows} {!O{}}
-         { \bool_set_true:N \l__wa_in_WithArrows_bool
-           \bool_set_false:N \l__wa_in_DispWithArrows_bool
-           \__wa_pre_environment:n {#1}
-           \reverse_if:N \if_mode_math:
-                             \__wa_error:n {WithArrows~outside~math~mode}
-                         \fi:
-           \cs_set_eq:NN \notag \__wa_notag:
-           \cs_set_eq:NN \nonumber \__wa_notag:
-           \cs_set_eq:NN \tag \__wa_tag
-           \cs_set_eq:NN \label \__wa_label:n
-           \cs_set_eq:NN \tagnextline \__wa_tagnextline:
-           \int_case:nn \l__wa_pos_env_int
-                   {0 \vtop
-                    1 \vcenter
-                    2 \vbox}
-           \bgroup
-           \spread at equation
-           \ialign\bgroup
-           \int_gincr:N \g__wa_line_int
-           \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_first_column:
-           \bool_set_true:N \l__wa_in_first_column_bool
-           \strut\hfil
-           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
-           &
-           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {{}##}$
-           \tikz [remember~picture,overlay]
-                 \node [__wa_node_style,
-                        name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-l,
-                        alias = {\tl_if_empty:NF \l__wa_name_tl
-                                     {\l__wa_name_tl-\int_use:N\g__wa_line_int-l}} ] {} ;
-           \hfil
-           \tikz [remember~picture,overlay]
-                 \node [__wa_node_style,
-                        name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-r,
-                        alias = {\tl_if_empty:NF \l__wa_name_tl
-                                   {\l__wa_name_tl-\int_use:N\g__wa_line_int-r}} ] {} ;
-           \bool_if:NT \l__wa_shownodenames_bool
-                {\hbox_overlap_right:n {\small wa-\l__wa_prefix_str
-                                                 -\int_use:N\g__wa_line_int}}
-           && \__wa_error:n {Third~column~in~WithArrows}
-           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
-           \cr
-          }
-          {\\
-           \egroup
-           \egroup
-           \__wa_post_environment:
-           \bool_if:NT \g__wa_footnote_bool \endsavenotes
-}
-\cs_new_protected:Nn \__wa_post_environment:
-          {\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_CommandName_str \__wa_Arrow_code_after
-           \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}
-           }
-\cs_new_protected:Nn \__wa_cr:
-      {\scan_stop:
-       \bool_if:NT \l__wa_in_first_column_bool { & {} }
-       \group_align_safe_begin:
-       \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i:}
-\cs_new_protected:Nn \__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
-           {\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
-                            {\cs_set:Npn \This at name {equation}
-                             \hyper at refstepcounter{equation}}
-                       \bool_if:NT \c__wa_cleveref_loaded_bool
-                           {\cref at constructprefix{equation}{\cref at result}
-                            \@ifundefined{cref at equation@alias}
-                                  {\def\@tempa{equation}}
-                                  {\def\@tempa{\csname cref at equation@alias\endcsname}}
-                            \protected at edef\cref at currentlabel
-                                           {[\@tempa][\arabic{equation}][\cref at result]
-                                            \p at equation \g_tmpa_tl}}
-                       \bool_if:NT \c__wa_typedref_loaded_bool
-                          {\cs_set:Npn \sr at name {equation}}
-                       \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:Npn \tagform@ {}}
-                   \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)  ; }
-             }
-       \cr\noalign{\skip_vertical:n {#1 + \l__wa_interline_skip}
-       \scan_stop:}}
-\cs_new_protected:Nn \__wa_if_in_second_col_of_disp:nn
-     {\bool_if:NTF \l__wa_in_WithArrows_bool
-          {\__wa_error:nn {Command~not~allowed~in~WithArrows}
-                          {#1}}
-          {\bool_if:NTF \l__wa_in_first_column_bool
-             {\__wa_error:nn {Command~not~allowed~in~DispWithArrows}
-                             {#1}}
-             {#2}}}
-\cs_new_protected:Nn \__wa_notag:
-     {\__wa_if_in_second_col_of_disp:nn {\notag}
-             {\clist_clear:N \l__wa_tags_clist}}
-\NewDocumentCommand \__wa_tag {sm}
-     {\__wa_if_in_second_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:Nn \__wa_label:n
-     {\__wa_if_in_second_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:Nn \__wa_tagnextline:
-        {\__wa_if_in_second_col_of_disp:nn {\tagnextline}
-             {\bool_set_true:N \l__wa_tag_next_line_bool}}
-\bool_new:N \l__wa_qedhere_bool
-\cs_new_protected:Nn \__wa_qedhere: {\bool_set_true:N \l__wa_qedhere_bool}
-\cs_new_protected:Nn \__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: }
-\NewDocumentEnvironment {DispWithArrows} {!O{}}
-         {
-          \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_amsmath_loaded_bool \intertext@
-           \bool_set_true:N \l__wa_in_DispWithArrows_bool
-           \__wa_pre_environment:n {#1}
-           \if_mode_math:
-               \__wa_error:n {DispWithArrows~in~math~mode}
-           \fi:
-           \if_mode_vertical:
-             \nointerlineskip
-             \makebox[.6\linewidth]{}
-           \fi:
-           $$
-           \vcenter \bgroup
-           \spread at equation
-           \bool_if:NTF \l__wa_fleqn_bool
-                  {\tabskip = \c_zero_skip}
-                  {\tabskip = 0 pt plus 1000 pt minus 1000 pt}
-           \cs_set_eq:NN \__wa_old_label \label
-           \cs_set_eq:NN \notag \__wa_notag:
-           \cs_set_eq:NN \nonumber \__wa_notag:
-           \cs_set_eq:NN \tag \__wa_tag
-           \cs_set_eq:NN \label \__wa_label:n
-           \cs_set_eq:NN \tagnextline \__wa_tagnextline:
-           \halign to \displaywidth \bgroup
-             \int_gincr:N \g__wa_line_int
-             \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_first_column:
-             \bool_set_true:N \l__wa_in_first_column_bool
-             \strut
-             \bool_if:NT \l__wa_fleqn_bool
-                   {\skip_horizontal:n \l__wa_mathindent_dim}
-             \hfil
-             $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
-             \tabskip = \c_zero_skip
-            &
-             \clist_if_in:NVT \l__wa_tags_clist \g__wa_line_int
-                  {\clist_set:Nn \l__wa_tags_clist {all}}
-             \bool_if:NT \c__wa_amsthm_loaded_bool {\cs_set_eq:NN \qedhere \__wa_qedhere:}
-             $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {{}##}$
-             \tabskip = 0 pt plus 1000 pt minus 1000 pt
-             \tikz [remember~picture,overlay]
-                  \node [__wa_node_style,
-                         name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-l,
-                         alias = {\tl_if_empty:NF \l__wa_name_tl
-                                    {\l__wa_name_tl-\int_use:N\g__wa_line_int-l}} ] {} ;
-             \hfil
-             \tikz [remember~picture,overlay]
-                   \node [__wa_node_style,
-                          name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-r,
-                          alias = {\tl_if_empty:NF \l__wa_name_tl
-                                     {\l__wa_name_tl-\int_use:N\g__wa_line_int-r}} ] {} ;
-             \bool_if:NT \l__wa_shownodenames_bool
-                  {\hbox_overlap_right:n {\small wa-\l__wa_prefix_str
-                                                   -\int_use:N\g__wa_line_int}}
-            & ##
-             \tabskip = \c_zero_skip
-            && \__wa_error:n {Third~column~in~DispWithArrows}
-               \iffalse ## \fi
-             \cr}
-          {\clist_if_in:NnT \l__wa_tags_clist {last}
-                   {\clist_set:Nn \l__wa_tags_clist {all}}
-           \\
-           \egroup
-           \egroup
-           \bool_if:NT \l__wa_in_DispWithArrows_bool
-             {\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_error: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_environment:
-           \bool_if:nT \c__wa_mathtools_loaded_bool
-                    {\MH_if_boolean:nT {show_only_refs}
-                          \MT_showonlyrefs_true:}
-           $$
-           \bool_if:NT \g__wa_footnote_bool \endsavenotes
-           \ignorespacesafterend
-           }
-\NewDocumentEnvironment {DispWithArrows*} {}
-     {\WithArrowsOptions{notag}
-      \DispWithArrows}
-     {\endDispWithArrows}
-\cs_new_protected:Nn \__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:Nn \__wa_scan_arrows_i:
+      }
+  }
+\bool_new:N \l__witharrows_in_WithArrows_bool
+\bool_new:N \l__witharrows_in_DispWithArrows_bool
+\bool_new:N \l__witharrows_in_CodeAfter_bool
+\seq_new:N \g__witharrows_position_in_the_tree_seq
+\seq_gput_right:Nn \g__witharrows_position_in_the_tree_seq 1
+\int_new:N \g__witharrows_last_env_int
+\skip_new:N \l__witharrows_interline_skip
+\int_new:N \l__witharrows_pos_env_int
+\dim_new:N \l__witharrows_xoffset_dim
+\dim_set:Nn \l__witharrows_xoffset_dim { 3 mm }
+\int_new:N \l__witharrows_pos_arrow_int
+\int_set:Nn \l__witharrows_pos_arrow_int 3
+\str_new:N \l__witharrows_input_line_str
+\dim_new:N \l__witharrows_x_dim
+\seq_new:N \g__witharrows_arrow_int_seq
+\int_new:N \g__witharrows_arrow_int
+\seq_new:N \g__witharrows_line_int_seq
+\int_new:N \g__witharrows_line_int
+\bool_new:N \l__witharrows_fleqn_bool
+\dim_new:N \l__witharrows_mathindent_dim
+\dim_set:Nn \l__witharrows_mathindent_dim { 25 pt }
+\bool_new:N \l__witharrows_wrap_lines_bool
+\clist_new:N \l__witharrows_tags_clist
+\clist_set:Nn \l__witharrows_tags_clist { all }
+\tl_new:N \l__witharrows_tag_tl
+\bool_new:N \l__witharrows_tag_star_bool
+\bool_new:N \l__witharrows_in_first_column_bool
+\bool_new:N \l__witharrows_initial_r_bool
+\bool_new:N \l__witharrows_initial_l_bool
+\dim_new:N \l__witharrows_start_adjust_dim
+\dim_set:Nn \l__witharrows_start_adjust_dim { 0.4 ex }
+\dim_new:N \l__witharrows_end_adjust_dim
+\dim_set:Nn \l__witharrows_end_adjust_dim { 0.4 ex }
+\str_new:N \l__witharrows_status_arrow_str
+\str_set:Nn \l__witharrows_CommandName_str { Arrow }
+\str_set:Nx \l__witharrows_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+\bool_new:N \l__witharrows_displaystyle_bool
+\bool_new:N \l__witharrows_show_node_names_bool
+\cs_new_protected:Nn \__witharrows_eval_if_allowed:n
   {
-    \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_of_group_seq
-    \seq_clear_new:N \l__wa_last_arrows_of_group_seq
-    \bool_set_true:N \l__wa_new_group_bool
-    \int_set:Nn \l__wa_arrow_int 1
-    \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
+    \str_if_empty:NTF \l__witharrows_previous_key_str
+      {
+        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
+        #1
+      }
+      { \__witharrows_error:n { Incompatible~options } }
+  }
+\cs_new_protected:Nn \__witharrows_fix_pos_option:n
+  { \__witharrows_eval_if_allowed:n { \int_set:Nn \l__witharrows_pos_arrow_int { #1 } } }
+\keys_define:nn { WithArrows / Global }
+  {
+    ygap .dim_set:N = \l__witharrows_ygap_dim ,
+    ygap .value_required:n = true ,
+    ygap .initial:n = 0.4 ex ,
+    ystart .dim_set:N = \l__witharrows_ystart_dim ,
+    ystart .value_required:n = true ,
+    ystart .initial:n = 0.4 ex ,
+    more-columns .code:n =
+      \__witharrows_msg_redirect_name:nn { Third~column~in~WithArrows } { none } ,
+    more-columns .value_forbidden:n = true,
+    CommandName .code:n =
+      \str_set:Nn \l__witharrows_CommandName_str { #1 }
+      \str_set:Nx \l__witharrows_string_Arrow_for_msg_str
+        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+    CommandName .value_required:n = true ,
+    TikzCode .tl_set:N = \l__witharrows_tikz_code_tl,
+    TikzCode .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+    TikzCode .value_required:n = true ,
+    displaystyle .bool_set:N = \l__witharrows_displaystyle_bool ,
+    displaystyle .default:n = true ,
+    show-nodes .code:n =
+      \tikzset { __witharrows_node_style / .append~style = { draw , red } } ,
+    show-nodes .value_forbidden:n = true,
+    show-node-names .bool_set:N = \l__witharrows_show_node_names_bool ,
+    show-node-names .default:n = true ,
+    group .code:n =
+      \str_if_empty:NTF \l__witharrows_previous_key_str
+        {
+          \str_set:Nn \l__witharrows_previous_key_str { group }
+          \seq_remove_all:Nn \l__witharrows_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__witharrows_pos_arrow_int 7
+        }
+        { \__witharrows_error:n { Incompatible~options } } ,
+    group .value_forbidden:n = true ,
+    groups .code:n =
+      \str_if_empty:NTF \l__witharrows_previous_key_str
+        {
+          \str_set:Nn \l__witharrows_previous_key_str { groups }
+          \seq_if_in:NnF \l__witharrows_options_Arrow_seq { new-group }
+            { \seq_put_right:Nn \l__witharrows_options_Arrow_seq { new-group } }
+          \seq_remove_all:Nn \l__witharrows_options_Arrow_seq { xoffset }
+          \int_set:Nn \l__witharrows_pos_arrow_int 6
+        }
+        { \__witharrows_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            = \__witharrows_fix_pos_option:n 3 ,
+    ll     .value_forbidden:n = true ,
+    ll     .code:n            = \__witharrows_fix_pos_option:n 1 ,
+    rl     .value_forbidden:n = true ,
+    rl     .code:n            = \__witharrows_fix_pos_option:n 2 ,
+    lr     .value_forbidden:n = true ,
+    lr     .code:n            = \__witharrows_fix_pos_option:n 0 ,
+    i      .value_forbidden:n = true ,
+    i      .code:n            = \__witharrows_fix_pos_option:n 5 ,
+    xoffset .dim_set:N  = \l__witharrows_xoffset_dim ,
+    xoffset .value_required:n  = true ,
+    jot .dim_set:N = \jot ,
+    jot .value_required:n = true ,
+    interline .skip_set:N = \l__witharrows_interline_skip ,
+    interline .value_required:n = true ,
+    start-adjust .dim_set:N = \l__witharrows_start_adjust_dim ,
+    start-adjust .value_required:n = true ,
+    end-adjust .dim_set:N = \l__witharrows_end_adjust_dim ,
+    end-adjust .value_required:n = true ,
+    adjust .code:n  =
+      \dim_set:Nn \l__witharrows_start_adjust_dim { #1 }
+      \dim_set:Nn \l__witharrows_end_adjust_dim { #1 } ,
+    adjust .value_required:n = true
+  }
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+  {
+    t   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 0 ,
+    t   .value_forbidden:n = true ,
+    c   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 1 ,
+    c   .value_forbidden:n = true ,
+    b   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 2 ,
+    b   .value_forbidden:n = true
+  }
+\keys_define:nn { WithArrows / DispWithArrowsSpecific }
+  {
+    fleqn .bool_set:N = \l__witharrows_fleqn_bool ,
+    fleqn .default:n = true ,
+    mathindent .dim_set:N = \l__witharrows_mathindent_dim ,
+    mathindent .value_required:n = true ,
+    notag .code:n =
+      \str_if_eq:nnTF { #1 } { true }
+        { \clist_clear:N \l__witharrows_tags_clist }
+        { \clist_set:Nn \l__witharrows_tags_clist { all } } ,
+    notag .default:n = true ,
+    nonumber .meta:n = notag ,
+    allow-multiple-labels .code:n =
+      \__witharrows_msg_redirect_name:nn { Multiple~labels } { none } ,
+    allow-multiple-labels .value_forbidden:n = true ,
+    wrap-lines .bool_set:N = \l__witharrows_wrap_lines_bool ,
+    wrap-lines .default:n = true ,
+    tagged-lines .code:n =
+      \clist_set:Nn \l__witharrows_tags_clist { #1 }
+      \clist_if_in:NnT \l__witharrows_tags_clist { first }
+        {
+          \clist_remove_all:Nn \l__witharrows_tags_clist { first }
+          \clist_put_left:Nn \l__witharrows_tags_clist \c_one_int
+        } ,
+    tagged-lines .value_required:n = true
+  }
+\keys_define:nn { WithArrows }
+  {
+    WithArrows .inherit:n =
+      {
+        WithArrows / Global ,
+        WithArrows / WithArrowsSpecific
+      }
+  }
+\keys_define:nn { WithArrows / WithArrows }
+ {
+   name .tl_set:N = \l__witharrows_name_str ,
+   name .value_required:n = true ,
+   CodeBefore .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
+   CodeBefore .value_required:n = true,
+   CodeAfter .code:n = \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
+   CodeAfter .value_required:n = true ,
+   unknown .code:n  =
+     \__witharrows_sort_seq:N \l__witharrows_options_WithArrows_seq
+     \__witharrows_error:n { Unknown~option~WithArrows }
+ }
+\seq_set_from_clist:Nn \l__witharrows_options_WithArrows_seq
+  {
+    adjust, b, c, CodeAfter, CodeBefore, CommandName, displaystyle, end-adjust,
+    group, groups, i, interline, jot, ll, lr, more-columns, name, rl, rr,
+    show-node-names, show-nodes, start-adjust, t, tikz, TikzCode, xoffset, ygap,
+    ystart
+  }
+\keys_define:nn { WithArrows }
+  {
+    DispWithArrows .inherit:n =
      {
-       \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}
-                     {position} \l_tmpa_tl
-       \int_set:Nn \l__wa_pos_of_arrow_int \l_tmpa_tl
-       \int_compare:nNnTF \l__wa_final_int > \g__wa_line_int
-          {\__wa_error:n {Too~few~lines~for~an~arrow}}
-          {\bool_if:nT {\int_compare_p:nNn \l__wa_arrow_int > 1
-                         &&
-                        \int_compare_p:nNn
-                              \l__wa_initial_int > \l__wa_last_line_of_group_int
-                         &&
-                        \int_compare_p:n {\l__wa_pos_arrow_int != 7}}
-                 {\__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_of_group_seq
-                  \seq_put_left:NV \l__wa_first_arrows_of_group_seq \l__wa_arrow_int
-                  \seq_clear:N \l__wa_last_arrows_of_group_seq
-                  \seq_put_left:NV \l__wa_last_arrows_of_group_seq \l__wa_arrow_int
-                  \int_compare:nT {\l__wa_pos_arrow_int != 8}
-                      {\dim_set:Nn \l__wa_x_dim {-\c_max_dim}}
-                  }
-                 {\int_compare:nNnT \l__wa_pos_of_arrow_int = {-1}
-                     {\int_compare:nNnT \l__wa_initial_int = \l__wa_first_line_of_group_int
-                           {\seq_put_left:NV \l__wa_first_arrows_of_group_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_of_group_seq
-                         \seq_put_left:NV \l__wa_last_arrows_of_group_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_of_group_seq \l__wa_arrow_int}}}}
-           \int_compare:nNnT \l__wa_pos_of_arrow_int = {-1}
-              { \int_compare:nT {\l__wa_pos_arrow_int != 8}
-                   {\__wa_update_x_value:nn \l__wa_initial_int \l__wa_final_int}} }
-       \int_incr:N \l__wa_arrow_int
+       WithArrows / DispWithArrowsSpecific ,
+       WithArrows / Global
      }
-     \int_compare:nT {\l__wa_pos_arrow_int != 7}
-        {\__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int \g__wa_arrow_int}
   }
-\cs_generate_variant:Nn \keys_set:nn {no}
-\cs_new_protected:Nn \__wa_keys_set: {\keys_set:no {WithArrows/General}}
-\cs_new_protected:Nn \__wa_draw_arrows:nn
-  {\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
+\keys_define:nn { WithArrows / DispWithArrows }
+  {
+    name .tl_set:N = \l__witharrows_name_str ,
+    name .value_required:n = true ,
+    CodeBefore .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
+    CodeBefore .value_required:n = true ,
+    CodeAfter .code:n  =  \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
+    CodeAfter .value_required:n = true ,
+    unknown .code:n  =
+      \__witharrows_sort_seq:N \l__witharrows_options_DispWithArrows_seq
+      \__witharrows_error:n { Unknown~option~DispWithArrows }
+  }
+\seq_set_from_clist:Nn \l__witharrows_options_DispWithArrows_seq
+  {
+    allow-multiple-labels, CodeAfter, CodeBefore, CommandName, TikzCode, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+    mathindent, name, nonumber, notag, rl, rr, show-node-names, show-nodes,
+    start-adjust, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart
+  }
+\keys_define:nn { WithArrows }
+  {
+    WithArrowsOptions .inherit:n =
      {
-      \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:nNnT \l__wa_final_int < {\g__wa_line_int + 1}
-         \__wa_draw_arrows_i:
-      \int_incr:N \l__wa_arrow_int
+       WithArrows / Global ,
+       WithArrows / WithArrowsSpecific ,
+       WithArrows / DispWithArrowsSpecific
      }
+  }
+\keys_define:nn { WithArrows / WithArrowsOptions }
+  {
+    unknown .code:n  =
+      \__witharrows_sort_seq:N \l__witharrows_options_WithArrowsOptions_seq
+      \__witharrows_error:n { Unknown~option~WithArrowsOptions }
+  }
+\seq_set_from_clist:Nn \l__witharrows_options_WithArrowsOptions_seq
+  {
+    allow-multiple-labels, b, c, CommandName, more-columns, TikzCode, adjust,
+    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+    mathindent, nonumber, notag, rl, rr, show-node-names, show-nodes,
+    start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart
+  }
+\cs_new_protected:Nn \__witharrows_set_independent:
+  {
+    \str_if_empty:NTF \l__witharrows_previous_key_str
+      {
+        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
+        \str_set:Nn \l__witharrows_status_arrow_str { independent }
+        \str_if_eq:VnF \l_keys_value_tl { NoValue }
+          { \__witharrows_error:n { Value~for~a~key } }
+      }
+      { \__witharrows_error:n { Incompatible~options~in~Arrow } }
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    jump .code:n =
+      \int_compare:nTF { #1 > 0 }
+        { \int_set:Nn \l__witharrows_jump_int { #1 } }
+        { \__witharrows_error:n { Negative~jump } } ,
+    jump .value_required:n  = true,
+    rr .code:n = \__witharrows_set_independent: ,
+    ll .code:n = \__witharrows_set_independent: ,
+    rl .code:n = \__witharrows_set_independent: ,
+    lr .code:n = \__witharrows_set_independent: ,
+    i  .code:n = \__witharrows_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__witharrows_pos_arrow_int = 6 }
+        { \str_set:Nn \l__witharrows_status_arrow_str { new-group } }
+        { \__witharrows_error:n { new-group~without~groups } } ,
+    TikzCode .code:n = \prg_do_nothing: ,
+    TikzCode .value_required:n = true ,
+    tikz .code:n = \prg_do_nothing: ,
+    tikz .value_required:n = true ,
+    xoffset .code:n =
+      \int_compare:nNnT \l__witharrows_pos_arrow_int > 5
+        { \__witharrows_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 =
+      \__witharrows_sort_seq:N \l__witharrows_options_Arrow_seq
+      \__witharrows_error:n { Unknown~option~in~Arrow }
+  }
+\seq_set_from_clist:Nn \l__witharrows_options_Arrow_seq
+  {
+    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, TikzCode,
+    xoffset
+  }
+\cs_new_protected:Nn \__witharrows_fix_pos_arrow:n
+  {
+    \str_if_empty:NT \l__witharrows_previous_key_str
+      {
+        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
+        \int_set:Nn \l__witharrows_pos_arrow_int { #1 }
+      }
+  }
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+  {
+    TikzCode .tl_set:N = \l__witharrows_tikz_code_tl ,
+    TikzCode .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 = \__witharrows_fix_pos_arrow:n 3 ,
+    ll .code:n = \__witharrows_fix_pos_arrow:n 1 ,
+    rl .code:n = \__witharrows_fix_pos_arrow:n 2 ,
+    lr .code:n = \__witharrows_fix_pos_arrow:n 0 ,
+    i  .code:n = \__witharrows_fix_pos_arrow:n 5 ,
+    xoffset .code:n  =
+      \int_compare:nNnF \l__witharrows_pos_arrow_int > 5
+        { \dim_set:Nn \l__witharrows_xoffset_dim { #1 } } ,
+    start-adjust .dim_set:N = \l__witharrows_start_adjust_dim,
+    end-adjust .dim_set:N = \l__witharrows_end_adjust_dim,
+    adjust .code:n  =
+      \dim_set:Nn \l__witharrows_start_adjust_dim { #1 }
+      \dim_set:Nn \l__witharrows_end_adjust_dim { #1 } ,
+  }
+\NewDocumentCommand \WithArrowsOptions { m }
+  {
+    \str_clear_new:N \l__witharrows_previous_key_str
+    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
+  }
+\NewDocumentCommand \__witharrows_Arrow { O { } m ! O { } }
+  {
+    \int_gincr:N \g__witharrows_arrow_int
+    \str_clear_new:N \l__witharrows_previous_key_str
+    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 }
+    \prop_put:NnV \l_tmpa_prop { initial } \g__witharrows_line_int
+    \int_set:Nn \l_tmpa_int { \g__witharrows_line_int + \l__witharrows_jump_int }
+    \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int
+    \prop_put:NnV \l_tmpa_prop { status } \l__witharrows_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__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \g__witharrows_arrow_int _ prop }
+    \prop_gset_eq:cN
+      { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \g__witharrows_arrow_int _ prop }
+      \l_tmpa_prop
+  }
+\cs_new_protected:Nn \__witharrows_Arrow_first_column:
+  { \__witharrows_error:n { Arrow~in~first~column } \__witharrows_Arrow }
+\cs_new_protected:Nn \__witharrows_pre_environment:n
+  {
+    \str_clear_new:N \l__witharrows_type_env_str
+    \str_set:NV \l__witharrows_type_env_str \@currenvir
+    \cs_if_exist:NT \tikz at library@external at loaded
+      { \tikzset { external / export = false } }
+    \str_clear_new:N \l__witharrows_name_str
+    \seq_gput_right:NV \g__witharrows_arrow_int_seq \g__witharrows_arrow_int
+    \int_gzero:N \g__witharrows_arrow_int
+    \seq_gput_right:NV \g__witharrows_line_int_seq \g__witharrows_line_int
+    \int_gzero:N \g__witharrows_line_int
+    \seq_gput_right:Nn \g__witharrows_position_in_the_tree_seq 1
+    \seq_set_eq:NN \l_tmpa_seq \g__witharrows_position_in_the_tree_seq
+    \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
+    \str_clear_new:N \l__witharrows_prefix_str
+    \str_set:Nx \l__witharrows_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - }
+    \cs_set_eq:NN \\ \__witharrows_cr:
+    \dim_zero:N \mathsurround
+    \int_zero_new:N \l__witharrows_initial_int
+    \int_zero_new:N \l__witharrows_final_int
+    \int_zero_new:N \l__witharrows_arrow_int
+    \int_zero_new:N \l__witharrows_pos_of_arrow_int
+    \int_zero_new:N \l__witharrows_jump_int
+    \int_set:Nn \l__witharrows_jump_int \c_one_int
+    \seq_clear_new:N \l__witharrows_labels_seq
+    \__witharrows_bool_new:N \l__witharrows_tag_next_line_bool
+    \skip_zero:N \l__witharrows_interline_skip
+    \tl_clear_new:N \l__witharrows_code_before_tl
+    \tl_clear_new:N \l__witharrows_code_after_tl
+    \str_clear_new:N \l__witharrows_previous_key_str
+    \bool_if:NT \l__witharrows_in_WithArrows_bool
+      { \keys_set:nn { WithArrows / WithArrows } { #1 } }
+    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
+      { \keys_set:nn { WithArrows / DispWithArrows } { #1 } }
+    \bool_if:NT \g__witharrows_footnote_bool { \begin { savenotes } }
+    \l__witharrows_code_before_tl
+    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow
+  }
+\NewDocumentEnvironment { WithArrows } { ! O { } }
+  {
+    \bool_set_true:N \l__witharrows_in_WithArrows_bool
+    \bool_set_false:N \l__witharrows_in_DispWithArrows_bool
+    \__witharrows_pre_environment:n { #1 }
+    \if_mode_math: \else:
+      \__witharrows_error:n { WithArrows~outside~math~mode }
+    \fi:
+    \cs_set_eq:NN \notag \__witharrows_notag:
+    \cs_set_eq:NN \nonumber \__witharrows_notag:
+    \cs_set_eq:NN \tag \__witharrows_tag
+    \cs_set_eq:NN \label \__witharrows_label:n
+    \cs_set_eq:NN \tagnextline \__witharrows_tagnextline:
+    \int_case:nn \l__witharrows_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+    \bgroup
+    \spread at equation
+    \ialign \bgroup
+    \int_gincr:N \g__witharrows_line_int
+    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_first_column:
+    \bool_set_true:N \l__witharrows_in_first_column_bool
+    \strut \hfil
+    $
+    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+    { ## }
+    $
+    &
+    $
+    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+    { { } ## }
+    $
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __witharrows_node_style ,
+          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l ,
+          alias =
+            {
+              \str_if_empty:NF \l__witharrows_name_str
+                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
+            }
+        ]
+        ;
+    \hfil
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __witharrows_node_style ,
+          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r ,
+          alias =
+            {
+              \str_if_empty:NF \l__witharrows_name_str
+                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
+            }
+        ]
+        ;
+    \bool_if:NT \l__witharrows_show_node_names_bool
+      {
+        \hbox_overlap_right:n
+          { \small wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int }
+      }
+    &&
+    \__witharrows_error:n { Third~column~in~WithArrows }
+    $
+    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+    { ## }
+    $
+    \cr
+  }
+  {
+    \\
+    \egroup
+    \egroup
+    \__witharrows_post_environment:
+    \bool_if:NT \g__witharrows_footnote_bool { \end { savenotes } }
+  }
+\cs_new_protected:Nn \__witharrows_post_environment:
+  {
+    \cs_set:Npn \WithArrowsRightX { \g__witharrows_right_x_dim }
+    \int_compare:nNnT \g__witharrows_arrow_int > 0 \__witharrows_scan_arrows:
+    \group_begin:
+      \tikzset { every~picture / .style = __witharrows_standard }
+      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__witharrows_line_int }
+      \cs_set_eq:NN \MultiArrow \__witharrows_MultiArrow:nn
+      \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_code_after
+      \bool_set_true:N \l__witharrows_in_CodeAfter_bool
+      \l__witharrows_code_after_tl
+    \group_end:
+    \seq_gpop_right:NN \g__witharrows_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gpop_right:NN \g__witharrows_position_in_the_tree_seq \l_tmpa_tl
+    \seq_gput_right:Nx \g__witharrows_position_in_the_tree_seq
+      { \int_eval:n { \l_tmpa_tl + 1 } }
+    \int_compare:nNnT { \seq_count:N \g__witharrows_position_in_the_tree_seq } = 1
+      { \int_gincr:N \g__witharrows_last_env_int }
+    \seq_gpop_right:NN \g__witharrows_arrow_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__witharrows_arrow_int \l_tmpa_tl
+    \seq_gpop_right:NN \g__witharrows_line_int_seq \l_tmpa_tl
+    \int_gset:Nn \g__witharrows_line_int \l_tmpa_tl
+  }
+\cs_new_protected:Nn \__witharrows_cr:
+  {
+    \scan_stop:
+    \bool_if:NT \l__witharrows_in_first_column_bool { & { } }
+    \group_align_safe_begin:
+    \peek_meaning_remove:NTF * \__witharrows_cr_i: \__witharrows_cr_i:
+  }
+\cs_new_protected:Nn \__witharrows_cr_i:
+  { \peek_meaning:NTF [ \__witharrows_cr_ii: { \__witharrows_cr_ii: [ \c_zero_dim ] } }
+\cs_new_protected:Npn \__witharrows_cr_ii: [ #1 ]
+  {
+    \group_align_safe_end:
+    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
+      {
+        \clist_if_in:NnTF \l__witharrows_tags_clist { all }
+          {
+            \tl_if_empty:NT \l__witharrows_tag_tl { \int_gincr:N \c at equation }
+            \cs_gset:Npx \g_tmpa_tl
+              { \tl_if_empty:NTF \l__witharrows_tag_tl \theequation \l__witharrows_tag_tl }
+            \seq_if_empty:NF \l__witharrows_labels_seq
+              {
+                \cs_set:Npx \@currentlabel { \p at equation \g_tmpa_tl }
+                \bool_if:NT \c__witharrows_hyperref_loaded_bool
+                   {
+                     \cs_set:Npn \This at name { equation }
+                     \hyper at refstepcounter { equation }
+                   }
+                \bool_if:NT \c__witharrows_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
+                        }
+                   }
+                \bool_if:NT \c__witharrows_typedref_loaded_bool
+                   { \cs_set:Npn \sr at name { equation } }
+                \seq_map_function:NN \l__witharrows_labels_seq \__witharrows_old_label
+              }
+            \__witharrows_save:N \l__witharrows_tag_star_bool
+            \__witharrows_save:N \l__witharrows_qedhere_bool
+            \bool_if:NT \l__witharrows_tag_next_line_bool
+              {
+                \openup -\jot
+                \bool_set_false:N \l__witharrows_tag_next_line_bool
+                \notag \\ &
+              }
+            &
+            \__witharrows_restore:N \l__witharrows_tag_star_bool
+            \__witharrows_restore:N \l__witharrows_qedhere_bool
+            \bool_if:NT \l__witharrows_qedhere_bool
+               { \hbox_overlap_left:n \__witharrows_qedhere_i: }
+            \cs_set_eq:NN \theequation \g_tmpa_tl
+            \bool_if:NT \l__witharrows_tag_star_bool
+               { \cs_set_eq:NN \tagform@ \prg_do_nothing: }
+            \hbox_overlap_left:n
+              {
+                \bool_if:NF \c__witharrows_leqno_bool
+                  {
+                    \tikz [ __witharrows_standard ]
+                      \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
+                  }
+                \quad
+                \@eqnnum
+              }
+            \bool_if:NT \c__witharrows_leqno_bool
+              {
+                \tikz [ __witharrows_standard ]
+                  \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
+              }
+          }
+          {
+            \__witharrows_save:N \l__witharrows_qedhere_bool
+            &
+            \__witharrows_restore:N \l__witharrows_qedhere_bool
+            \bool_if:NT \l__witharrows_qedhere_bool
+               { \hbox_overlap_left:n \__witharrows_qedhere_i: }
+            \tikz [ __witharrows_standard ]
+               \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
+          }
+        }
+    \cr \noalign { \skip_vertical:n { #1 + \l__witharrows_interline_skip } \scan_stop: }
+  }
+\cs_new_protected:Nn \__witharrows_if_in_second_col_of_disp:Nn
+  {
+    \bool_if:NTF \l__witharrows_in_WithArrows_bool
+      { \__witharrows_error:nn { Not~allowed~in~WithArrows } { #1 } }
+      {
+        \bool_if:NTF \l__witharrows_in_first_column_bool
+          { \__witharrows_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+          { #2 }
+      }
+  }
+\cs_new_protected:Nn \__witharrows_notag:
+  { \__witharrows_if_in_second_col_of_disp:Nn \notag { \clist_clear:N \l__witharrows_tags_clist } }
+\NewDocumentCommand \__witharrows_tag { s m }
+  {
+    \__witharrows_if_in_second_col_of_disp:Nn \tag
+      {
+        \tl_if_empty:NF \l__witharrows_tag_tl
+           { \__witharrows_error:nn  { Multiple~tags } { #2 } }
+        \clist_set:Nn \l__witharrows_tags_clist { all }
+        \bool_if:nT \c__witharrows_mathtools_loaded_bool
+          {
+            \MH_if_boolean:nT { show_only_refs }
+              {
+                \MH_if_boolean:nF { show_manual_tags }
+                  { \clist_clear:N \l__witharrows_tags_clist }
+              }
+          }
+        \tl_set:Nn \l__witharrows_tag_tl { #2 }
+        \bool_set:Nn \l__witharrows_tag_star_bool { #1 }
+        \bool_if:nT { #1 && ! \bool_if_p:N \c__witharrows_amsmath_loaded_bool }
+          { \__witharrows_error:n { tag*~without~amsmath } }
+      }
+  }
+\cs_new_protected:Nn \__witharrows_label:n
+  {
+    \__witharrows_if_in_second_col_of_disp:Nn \label
+      {
+        \seq_if_empty:NF \l__witharrows_labels_seq
+          {
+            \bool_if:NTF \c__witharrows_cleveref_loaded_bool
+              { \__witharrows_error:n { Multiple~labels~with~cleveref } }
+              { \__witharrows_error:n { Multiple~labels } }
+          }
+        \seq_put_right:Nn \l__witharrows_labels_seq { #1 }
+        \bool_if:nT \c__witharrows_mathtools_loaded_bool
+           {
+             \MH_if_boolean:nT { show_only_refs }
+               {
+                 \cs_if_exist:cTF { MT_r_#1 }
+                   { \clist_set:Nn \l__witharrows_tags_clist { all } }
+                   { \clist_clear:N \l__witharrows_tags_clist }
+               }
+           }
+        \bool_if:nT \c__witharrows_autonum_loaded_bool
+          {
+            \cs_if_exist:cTF { autonum@#1Referenced }
+              { \clist_set:Nn \l__witharrows_tags_clist { all } }
+              { \clist_clear:N \l__witharrows_tags_clist }
+          }
+      }
+  }
+\cs_new_protected:Nn \__witharrows_tagnextline:
+  {
+    \__witharrows_if_in_second_col_of_disp:Nn \tagnextline
+      { \bool_set_true:N \l__witharrows_tag_next_line_bool }
+  }
+\bool_new:N \l__witharrows_qedhere_bool
+\cs_new_protected:Nn \__witharrows_qedhere: { \bool_set_true:N \l__witharrows_qedhere_bool }
+\cs_new_protected:Nn \__witharrows_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:
+  }
+\NewDocumentEnvironment { DispWithArrows } { ! O { } }
+  {
+    \bool_if:nT \c__witharrows_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__witharrows_amsmath_loaded_bool \intertext@
+    \bool_set_true:N \l__witharrows_in_DispWithArrows_bool
+    \__witharrows_pre_environment:n { #1 }
+    \if_mode_math:
+      \__witharrows_error:n { DispWithArrows~in~math~mode }
+    \fi:
+    \if_mode_vertical:
+      \nointerlineskip
+      \makebox [ .6 \linewidth ] { }
+    \fi:
+    $$
+    \vcenter \bgroup
+    \spread at equation
+    \bool_if:NTF \l__witharrows_fleqn_bool
+      { \tabskip = \c_zero_skip }
+      { \tabskip = 0 pt plus 1000 pt minus 1000 pt }
+    \cs_set_eq:NN \__witharrows_old_label \label
+    \cs_set_eq:NN \notag \__witharrows_notag:
+    \cs_set_eq:NN \nonumber \__witharrows_notag:
+    \cs_set_eq:NN \tag \__witharrows_tag
+    \cs_set_eq:NN \label \__witharrows_label:n
+    \cs_set_eq:NN \tagnextline \__witharrows_tagnextline:
+    \halign to \displaywidth
+    \bgroup
+    \int_gincr:N \g__witharrows_line_int
+    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_first_column:
+    \bool_set_true:N \l__witharrows_in_first_column_bool
+    \strut
+    \bool_if:NT \l__witharrows_fleqn_bool { \skip_horizontal:n \l__witharrows_mathindent_dim }
+    \hfil
+    $
+    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+    { ## }
+    $
+    \tabskip = \c_zero_skip
+    &
+    \clist_if_in:NVT \l__witharrows_tags_clist \g__witharrows_line_int
+         { \clist_set:Nn \l__witharrows_tags_clist { all } }
+    \bool_if:NT \c__witharrows_amsthm_loaded_bool
+      { \cs_set_eq:NN \qedhere \__witharrows_qedhere: }
+    $
+    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+    { { } ## }
+    $
+    \tabskip = 0 pt plus 1000 pt minus 1000 pt
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __witharrows_node_style ,
+          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l ,
+          alias =
+            {
+              \str_if_empty:NF \l__witharrows_name_str
+                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
+            }
+        ]
+        ;
+    \hfil
+    \tikz [ remember~picture , overlay ]
+      \node
+        [
+          node~contents = { } ,
+          __witharrows_node_style ,
+          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r ,
+          alias =
+            {
+              \str_if_empty:NF \l__witharrows_name_str
+                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
+            }
+        ]
+        ;
+    \bool_if:NT \l__witharrows_show_node_names_bool
+       {
+         \hbox_overlap_right:n
+           { \small wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int }
+       }
+    &
+    ##
+    \tabskip = \c_zero_skip
+    &&
+    \__witharrows_error:n { Third~column~in~DispWithArrows }
+    \iffalse ## \fi
+    \cr
+  }
+  {
+    \clist_if_in:NnT \l__witharrows_tags_clist { last }
+      { \clist_set:Nn \l__witharrows_tags_clist { all } }
+    \\
+    \egroup
+    \egroup
+    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
+      {
+        \dim_gzero_new:N \g__witharrows_right_x_dim
+        \dim_gset_eq:NN \g__witharrows_right_x_dim \c_max_dim
+        \begin { tikzpicture } [ __witharrows_standard ]
+          \int_step_variable:nNn \g__witharrows_line_int \l_tmpa_int
+             {
+               \cs_if_free:cTF
+                 { pgf at sh@ns at wa - \l__witharrows_prefix_str - \l_tmpa_int - v }
+                 { \__witharrows_error: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__witharrows_right_x_dim
+                      { \dim_gset:Nn \g__witharrows_right_x_dim \l_tmpa_dim }
+                 }
+             }
+        \end { tikzpicture }
+      }
+    \__witharrows_post_environment:
+    \bool_if:nT \c__witharrows_mathtools_loaded_bool
+      { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: }
+    $$
+    \bool_if:NT \g__witharrows_footnote_bool { \end {savenotes } }
+    \ignorespacesafterend
+  }
+\NewDocumentEnvironment { DispWithArrows* } {}
+   {
+     \WithArrowsOptions { notag }
+     \DispWithArrows
+   }
+   { \endDispWithArrows }
+\cs_new_protected:Nn \__witharrows_scan_arrows:
+ {
+   \group_begin:
+   \int_compare:nNnT \l__witharrows_pos_arrow_int = 7
+      {
+        \__witharrows_scan_arrows_i:
+        \int_set:Nn \l__witharrows_pos_arrow_int 8
+      }
+   \__witharrows_scan_arrows_i:
    \group_end:
-   }
-\cs_new_protected:Nn \__wa_draw_arrows_i:
-     {\group_begin:
-      \int_set:Nn \l__wa_level_int 3
-      \prop_get:cnN {g__wa_arrow_\l__wa_prefix_str
-                        _\int_use:N\l__wa_arrow_int _prop} {options} \l_tmpa_tl
-      \exp_args:NNo \exp_args:No
-          \__wa_keys_set: {\l_tmpa_tl,tikz={xshift = \l__wa_xoffset_dim}}
-      \prop_get:cnN {g__wa_arrow_\l__wa_prefix_str _\int_use:N\l__wa_arrow_int _prop}
-        {position} \l_tmpa_tl
-      \int_set:Nn \l_tmpa_int \l_tmpa_tl
-      \int_compare:nNnF \l_tmpa_int = {-1}
-         {\int_set_eq:NN \l__wa_pos_arrow_int \l_tmpa_int}
-      \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_value: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_of_group_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_of_group_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:Nn \__wa_def_function_tmpa:n
-    {\cs_set:Nn \__wa_tmpa:nnn
-          {\begin{tikzpicture}[__wa_standard,every~path/.style = {WithArrows/arrow}]
-              #1
-           \end{tikzpicture}}}
-\cs_new_protected:Nn \__wa_draw_arrow:nnn
+ }
+\cs_new_protected:Nn \__witharrows_scan_arrows_i:
+  {
+    \int_zero_new:N \l__witharrows_first_arrow_of_group_int
+    \int_zero_new:N \l__witharrows_first_line_of_group_int
+    \int_zero_new:N \l__witharrows_last_line_of_group_int
+    \seq_clear_new:N \l__witharrows_first_arrows_of_group_seq
+    \seq_clear_new:N \l__witharrows_last_arrows_of_group_seq
+    \bool_set_true:N \l__witharrows_new_group_bool
+    \int_set:Nn \l__witharrows_arrow_int \c_one_int
+    \int_until_do:nNnn \l__witharrows_arrow_int > \g__witharrows_arrow_int
+      {
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__witharrows_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__witharrows_final_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { status } \l__witharrows_status_arrow_str
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { input-line } \l__witharrows_input_line_str
+        \int_compare:nNnTF \l__witharrows_final_int > \g__witharrows_line_int
+           { \__witharrows_error:n { Too~few~lines~for~an~arrow } }
            {
-            \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:No \__wa_def_function_tmpa:n \l__wa_tikz_code_tl
-            \__wa_tmpa:nnn {#1} {#2} {#3} }
-\cs_generate_variant:Nn \__wa_draw_arrow:nnn {nno}
-\tl_set: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 - 0.3333 em}
-                   \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:Nn \__wa_update_x_value:nn
-    {\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/CodeAfter}
-     {tikz     .code:n            = \tikzset {WithArrows/arrow/.append~style = {#1}} ,
-      tikz     .value_required:n  = true,
-      rr       .value_forbidden:n = true,
-      rr       .code:n            = \__wa_analyze_option_position:n 0 ,
-      ll       .value_forbidden:n = true,
-      ll       .code:n            = \__wa_analyze_option_position:n 1 ,
-      rl       .value_forbidden:n = true,
-      rl       .code:n            = \__wa_analyze_option_position:n 2 ,
-      lr       .value_forbidden:n = true,
-      lr       .code:n            = \__wa_analyze_option_position:n 3 ,
-      v        .value_forbidden:n = true,
-      v        .code:n            = \__wa_analyze_option_position:n 4 ,
-      TikzCode .tl_set:N          = \l__wa_tikz_code_tl,
-      TikzCode .value_required:n  = true,
-      xoffset  .dim_set:N         = \l__wa_xoffset_dim,
-      xoffset  .value_required:n  = true}
-\NewDocumentCommand \__wa_Arrow_code_after {O{} mmm !O{}}
-     {\int_set:Nn \l__wa_pos_arrow_int 1
-      \int_set:Nn \l__wa_previous_pos_arrow_int {-1}
-      \group_begin:
-           \int_set:Nn \l__wa_level_int 3
-           \keys_set:nn {WithArrows/CodeAfter}
-                        {#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}}
-           \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)
+             \bool_if:nT
+               {
+                 \int_compare_p:nNn \l__witharrows_arrow_int > 1
+                 &&
+                ( \int_compare_p:n
+                    { \l__witharrows_initial_int > \l__witharrows_last_line_of_group_int }
+                 &&
+                  \int_compare_p:n { \l__witharrows_pos_arrow_int != 7 }
+                 ||
+                  \str_if_eq_p:Vn \l__witharrows_status_arrow_str { new-group }
+                )
+               }
+               {
+                 \int_compare:nNnF \l__witharrows_first_arrow_of_group_int = 0
+                   {
+                     \__witharrows_draw_arrows:nn
+                       \l__witharrows_first_arrow_of_group_int
+                       { \l__witharrows_arrow_int - 1 }
+                   }
+                 \bool_set_true:N \l__witharrows_new_group_bool
+               }
+             \bool_if:nTF \l__witharrows_new_group_bool
+                {
+                  \bool_set_false:N \l__witharrows_new_group_bool
+                  \int_set_eq:NN \l__witharrows_first_arrow_of_group_int \l__witharrows_arrow_int
+                  \int_set_eq:NN \l__witharrows_first_line_of_group_int \l__witharrows_initial_int
+                  \int_set_eq:NN \l__witharrows_last_line_of_group_int \l__witharrows_final_int
+                  \seq_clear:N \l__witharrows_first_arrows_of_group_seq
+                  \seq_put_left:NV \l__witharrows_first_arrows_of_group_seq
+                    \l__witharrows_arrow_int
+                  \seq_clear:N \l__witharrows_last_arrows_of_group_seq
+                  \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
+                    \l__witharrows_arrow_int
+                  \int_compare:nT { \l__witharrows_pos_arrow_int != 8 }
+                    { \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim } }
+                }
+                {
+                  \bool_if:nF
+                     { \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent } }
+                     {
+                       \int_compare:nT
+                         { \l__witharrows_initial_int = \l__witharrows_first_line_of_group_int }
+                         {
+                           \seq_put_left:NV \l__witharrows_first_arrows_of_group_seq
+                             \l__witharrows_arrow_int
+                         }
+                       \int_compare:nTF
+                         { \l__witharrows_final_int > \l__witharrows_last_line_of_group_int }
+                         {
+                           \int_set_eq:NN \l__witharrows_last_line_of_group_int
+                             \l__witharrows_final_int
+                           \seq_clear:N \l__witharrows_last_arrows_of_group_seq
+                           \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
+                             \l__witharrows_arrow_int
+                         }
+                         {
+                           \int_compare:nNnT
+                             \l__witharrows_final_int = \l__witharrows_last_line_of_group_int
+                             {
+                               \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
+                                 \l__witharrows_arrow_int
+                             }
+                         }
+                     }
+                }
+             \bool_if:nF
+                { \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent } }
+                {
+                  \int_compare:nT { \l__witharrows_pos_arrow_int != 8 }
+                    { \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int }
+                }
+            }
+        \int_incr:N \l__witharrows_arrow_int
+      }
+     \int_compare:nT { \l__witharrows_pos_arrow_int != 7 }
+        { \__witharrows_draw_arrows:nn \l__witharrows_first_arrow_of_group_int \g__witharrows_arrow_int }
+  }
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Nn \__witharrows_keys_set:
+  { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
+\cs_new_protected:Nn \__witharrows_draw_arrows:nn
+  {
+    \group_begin:
+    \int_zero_new:N \l__witharrows_first_arrow_int
+    \int_set:Nn \l__witharrows_first_arrow_int { #1 }
+    \int_zero_new:N \l__witharrows_last_arrow_int
+    \int_set:Nn \l__witharrows_last_arrow_int { #2 }
+    \int_set:Nn \l__witharrows_arrow_int \l__witharrows_first_arrow_int
+    \int_until_do:nNnn \l__witharrows_arrow_int > \l__witharrows_last_arrow_int
+      {
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { initial } \l_tmpa_tl
+        \int_set:Nn \l__witharrows_initial_int \l_tmpa_tl
+        \prop_get:cnN
+          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+          { final } \l_tmpa_tl
+        \int_set:Nn \l__witharrows_final_int \l_tmpa_tl
+        \int_compare:nT { \l__witharrows_final_int <= \g__witharrows_line_int } \__witharrows_draw_arrows_i:
+        \int_incr:N \l__witharrows_arrow_int
+      }
+    \group_end:
+  }
+\cs_new_protected:Nn \__witharrows_draw_arrows_i:
+  {
+    \group_begin:
+    \prop_get:cnN
+      { g__witharrows_arrow _\l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+      { options } \l_tmpa_tl
+    \str_clear_new:N \l__witharrows_previous_key_str
+    \exp_args:NNo \exp_args:No
+    \__witharrows_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__witharrows_xoffset_dim } }
+    \bool_set_false:N \l__witharrows_initial_r_bool
+    \bool_set_false:N \l__witharrows_final_r_bool
+    \int_case:nn \l__witharrows_pos_arrow_int
+      {
+        0 { \bool_set_true:N \l__witharrows_final_r_bool }
+        2 { \bool_set_true:N \l__witharrows_initial_r_bool }
+        3 {
+            \bool_set_true:N \l__witharrows_initial_r_bool
+            \bool_set_true:N \l__witharrows_final_r_bool
+          }
+      }
+    \int_compare:nNnT \l__witharrows_pos_arrow_int = 5
+       {
+         \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim }
+         \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int
+       }
+    \tl_set:Nx \l__witharrows_initial_tl
+       { \int_use:N \l__witharrows_initial_int - \bool_if:NTF \l__witharrows_initial_r_bool rl .south }
+    \tl_set:Nx \l__witharrows_final_tl
+       { \int_use:N \l__witharrows_final_int - \bool_if:NTF \l__witharrows_final_r_bool rl .north }
+    \prop_get:cnN
+      { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+      { label }
+      \l_tmpa_tl
+    \seq_if_in:NxTF \l__witharrows_first_arrows_of_group_seq
+       { \int_use:N \l__witharrows_arrow_int }
+       { \bool_set_true:N \l_tmpa_bool }
+       { \bool_set_false:N \l_tmpa_bool }
+    \seq_if_in:NxTF \l__witharrows_last_arrows_of_group_seq
+       { \int_use:N \l__witharrows_arrow_int }
+       { \bool_set_true:N \l_tmpb_bool }
+       { \bool_set_false:N \l_tmpb_bool }
+    \int_compare:nNnT \l__witharrows_pos_arrow_int = 5
+       {
+         \bool_set_true:N \l_tmpa_bool
+         \bool_set_true:N \l_tmpb_bool
+       }
+    \begin { tikzpicture } [ __witharrows_standard ]
+       \tikz at scan@one at point \pgfutil at firstofone ( \l__witharrows_initial_tl )
+       \tl_gset:Nx \g_tmpa_tl
+          {
+            \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+              { \dim_use:N \pgf at x }
+              { \dim_use:N \l__witharrows_x_dim } ,
+            \bool_if:NTF \l_tmpa_bool
+              { \dim_eval:n { \pgf at y + \l__witharrows_start_adjust_dim } }
+              { \dim_use:N \pgf at y }
+          }
+       \tikz at scan@one at point \pgfutil at firstofone ( \l__witharrows_final_tl )
+       \tl_gset:Nx \g_tmpb_tl
+          {
+            \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+              { \dim_use:N \pgf at x }
+              { \dim_use:N \l__witharrows_x_dim } ,
+            \bool_if:NTF \l_tmpb_bool
+              { \dim_eval:n { \pgf at y - \l__witharrows_end_adjust_dim } }
+              { \dim_use:N \pgf at y }
+          }
+    \end { tikzpicture }
+    \__witharrows_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
+    \group_end:
+  }
+\cs_new_protected:Nn \__witharrows_def_function_tmpa:n
+  {
+    \cs_set:Npn \__witharrows_tmpa:nnn ##1 ##2 ##3
+      {
+        \begin{tikzpicture}
+          [
+            __witharrows_standard ,
+            every~path / .style = WithArrows / arrow
+          ]
+          #1
+        \end{tikzpicture}
+      }
+  }
+\cs_new_protected:Nn \__witharrows_draw_arrow:nnn
+  {
+    \bool_if:nT { \l__witharrows_wrap_lines_bool && \l__witharrows_in_DispWithArrows_bool }
+       { \tl_set_eq:NN \l__witharrows_tikz_code_tl \c__witharrows_tikz_code_wrap_lines_tl }
+    \exp_args:NV \__witharrows_def_function_tmpa:n \l__witharrows_tikz_code_tl
+    \__witharrows_tmpa:nnn { #1 } { #2 } { #3 }
+  }
+\cs_generate_variant:Nn \__witharrows_draw_arrow:nnn { n n o }
+\tl_const:Nn \c__witharrows_tikz_code_wrap_lines_tl
+  {
+    \draw ( #1 ) to node ( __witharrows_label ) { } ( #2 ) ;
+    \tikz at parse@node \pgfutil at firstofone ( __witharrows_label.west )
+    \dim_set:Nn \l_tmpa_dim { \g__witharrows_right_x_dim - \pgf at x - 0.3333 em }
+    \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 ( __witharrows_label.west )
+           node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ]
+                { #3 } ;
+      }
+  }
+\cs_new_protected:Nn \__witharrows_update_x:nn
+  {
+    \int_step_inline:nnn { #1 } { #2 }
+       {
+         \begin { tikzpicture } [ __witharrows_standard ]
+           \tikz at scan@one at point \pgfutil at firstofone ( ##1 - l )
+           \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__witharrows_x_dim \pgf at x }
+         \end { tikzpicture }
+         \dim_set_eq:NN \l__witharrows_x_dim \g_tmpa_dim
+       }
+  }
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__witharrows_last_env_int }
+\keys_define:nn { WithArrows / Arrow / CodeAfter }
+  {
+    tikz     .code:n =
+      \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+    tikz     .value_required:n  = true ,
+    rr       .value_forbidden:n = true ,
+    rr       .code:n            = \__witharrows_fix_pos_option:n 0 ,
+    ll       .value_forbidden:n = true,
+    ll       .code:n            = \__witharrows_fix_pos_option:n 1 ,
+    rl       .value_forbidden:n = true ,
+    rl       .code:n            = \__witharrows_fix_pos_option:n 2 ,
+    lr       .value_forbidden:n = true ,
+    lr       .code:n            = \__witharrows_fix_pos_option:n 3 ,
+    v        .value_forbidden:n = true ,
+    v        .code:n            = \__witharrows_fix_pos_option:n 4 ,
+    TikzCode .tl_set:N          = \l__witharrows_tikz_code_tl ,
+    TikzCode .value_required:n  = true ,
+    xoffset  .dim_set:N         = \l__witharrows_xoffset_dim ,
+    xoffset  .value_required:n  = true ,
+    unknown .code:n  =
+      \__witharrows_sort_seq:N \l__witharrows_options_Arrow_CodeAfter_seq
+      \__witharrows_error:n { Unknown~option~Arrow~in~CodeAfter }
+ }
+\seq_set_from_clist:Nn \l__witharrows_options_Arrow_CodeAfter_seq
+   { ll, lr, rl, rr, tikz, TikzCode, v, x, offset }
+\NewDocumentCommand \__witharrows_Arrow_code_after { O { } m m m ! O { } }
+  {
+    \int_set:Nn \l__witharrows_pos_arrow_int 1
+    \str_clear_new:N \l__witharrows_previous_key_str
+    \group_begin:
+      \keys_set:nn { WithArrows / Arrow / CodeAfter }
+        { #1, #5, tikz = { xshift = \l__witharrows_xoffset_dim } }
+      \bool_set_false:N \l__witharrows_initial_r_bool
+      \bool_set_false:N \l__witharrows_final_r_bool
+      \int_case:nn \l__witharrows_pos_arrow_int
+        { 0
+            {
+              \bool_set_true:N \l__witharrows_initial_r_bool
+              \bool_set_true:N \l__witharrows_final_r_bool
+            }
+          2 { \bool_set_true:N \l__witharrows_initial_r_bool }
+          3 { \bool_set_true:N \l__witharrows_final_r_bool }
+        }
+      \tl_if_eq:nnTF { #2 } { #3 }
+        { \__witharrows_error:nn { Both~lines~are~equal } { #2 } }
+        {
+          \cs_if_free:cTF { pgf at sh@ns at wa - \l__witharrows_prefix_str - #2 - l }
+            { \__witharrows_error:nx { Wrong~line~in~Arrow } { #2 } }
+            {
+              \cs_if_free:cTF { pgf at sh@ns at wa - \l__witharrows_prefix_str - #3 - l }
+                { \__witharrows_error:nx { Wrong~line~in~Arrow } { #3 }  }
+                {
+                  \int_compare:nNnTF \l__witharrows_pos_arrow_int = 4
+                    {
+                      \begin { tikzpicture } [ __witharrows_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}
+                        \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}
+                          { \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:
+                          { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf at y }
+                      \end { tikzpicture }
+                    }
+                    {
+                      \begin { tikzpicture } [ __witharrows_standard ]
+                        \tikz at scan@one at point \pgfutil at firstofone
+                           ( #2-\bool_if:NTF\l__witharrows_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__witharrows_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 }
+                    }
+                  \__witharrows_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
+                }
+            }
+        }
+    \group_end:
+  }
+\cs_new_protected:Nn \__witharrows_MultiArrow:nn
+  {
+    \foreach \x in { #1 }
+      {
+        \cs_if_free:cTF { pgf at sh@ns at wa - \l__witharrows_prefix_str - \x - l }
+           { \__witharrows_error:nx { Wrong~line~specification~in~MultiArrow } \x }
+           { \clist_gput_right:Nx \g_tmpa_clist \x }
       }
-\cs_new_protected:Nn \__wa_MultiArrow:nn
-    {
-     \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:nNnTF {\clist_count:N \g_tmpa_clist} < 2
-       {\__wa_error:n {Too~small~specification~for~MultiArrow}}
-       {\clist_sort:Nn \g_tmpa_clist
-                       {\int_compare:nNnTF {##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:Nx \__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)
+    \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 }
+       { \__witharrows_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 \__witharrows_MultiArrow_i:n \g_tmpa_clist
+         \begin { tikzpicture }
+           [
+             __witharrows_standard ,
+             every~path /.style = { WithArrows / arrow }
+           ]
+           \draw [<->] ([xshift = \l__witharrows_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:Nn \__wa_MultiArrow_i:n
-     {\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}}
-\msg_new:nnn {witharrows}
-             {AllowLineWithoutAmpersand}
-             {The~option~"AllowLineWithoutAmpersand"~is~deprecated~because~lines~
-              without~ampersands~are~now~always~allowed.~The~option~
-              "AllowLineWithoutAmpersand"~will~probably~be~deleted~in~a~future~version.~
-              However,~you~can~go~on~for~this~time.}
-\msg_new:nnn {witharrows}
-             {Unknown~option}
-             {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~
-              meaningless~in~the~context.~If~you~go~on,~it~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {Third~column~in~WithArrows}
-             {By~default,~an~environment~\{\l__wa_type_env_tl\}~can~only~have~
-              two~columns.~Maybe~you~have~forgotten~a~
-              \c_backslash_str\c_backslash_str.~If~you~really~want~more~than~
-              two~columns,~you~should~use~the~option~"MoreColumns"~at~a~global~
-              level~or~for~ an~environment.~However,~you~can~go~one~for~
-              this~time.}
-\msg_new:nnn {witharrows}
-             {Third~column~in~DispWithArrows}
-             {An~environment~\{\l__wa_type_env_tl\}~can~only~have~two~columns.~
-              Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ at~the~end~
-              of~row~\int_use:N\g__wa_line_int.~If~you~go~on,~you~may~have~other~errors.}
-\msg_new:nnn {witharrows}
-             {Negative~value~for~jump}
-             {You~can't~use~a~strictly~negative~value~for~the~option~"jump"~of~command~
-              \l__wa_string_Arrow_for_messages_str.~
-              You~can~create~an~arrow~going~backwards~with~ the~option~"<-"~of~Tikz.}
-\msg_new:nnn {witharrows}
-             {Too~few~lines~for~an~arrow}
-             {An~arrow~specified~in~line~\int_use:N \l__wa_initial_int\ can't~be~drawn~
-              because~it~arrives~after~the~last~line~of~the~environment~(remind~that~
-              the~command~\l__wa_string_Arrow_for_messages_str.~
-              must~be~in~the~*start*~line~of~the~arrow).~
-              If~you~go~on,~this~arrow~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {WithArrows~outside~math~mode}
-             {The~environment~\{\l__wa_type_env_tl\}~should~be~used~only~in~math~mode.~
-              Nevertheless,~you~can~go~on.}
-\msg_new:nnn {witharrows}
-             {DispWithArrows~in~math~mode}
-             {The~environment~\{\l__wa_type_env_tl\}~should~be~used~only~
-              outside~math~mode.~If~you~go~on,~you~will~have~other~errors.}
-\msg_new:nnn {witharrows}
-             {Incompatible~options}
-             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
-             this~option~is~incompatible~or~redundant~with~the~option~"
-             \int_case:nn\l__wa_previous_pos_arrow_int
-                 {0 {lr}
-                  1 {ll}
-                  2 {rl}
-                  3 {rr}
-                  4 {v}
-                  5 {i}
-                  6 {groups}
-                  7 {group}}"~
-             set~in~the~same~
-             \int_case:nn\l__wa_level_int
-                  {1 {command~\token_to_str:N\WithArrowsOptions}
-                   2 {declaration~of~options~of~the~environment~
-                      \{\l__wa_type_env_tl\}}
-                   3 {command~\l__wa_string_Arrow_for_messages_str}}.~
-             If~you~go~on,~I~will~use~the~option~"\tl_use:N\l_keys_key_tl".}
-\msg_new:nnn {witharrows}
-             {Option~will~be~ignored}
-             {The~option~"\tl_use:N\l_keys_key_tl"~can't~be~used~here.~
-              If~you~go~on,~it~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {Arrow~in~first~column}
-             {You~should~not~use~the~command~\l__wa_string_Arrow_for_messages_str\
-              in~the~first~column~but~only~in~the~second~column.\\
-              However~you~can~go~on~for~this~time.}
-\msg_new:nnn {witharrows}
-             {Wrong~line~in~Arrow}
-             {The~specification~of~line~"#1"~you~use~in~\token_to_str:N\Arrow\
-              ~doesn't~exist.\\
-              If~you~go~on,~the~arrow~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {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.}
-\msg_new:nnn {witharrows}
-             {Too~small~specification~for~MultiArrow}
-             {The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\
-              is~too~small:~we~need~at~least~two~lines.~If~you~go~on,~the~
-              command~\token_to_str:N\MultiArrow\ ~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {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.}
-\msg_new:nnn {witharrows}
-             {Command~not~allowed~in~DispWithArrows}
-             {The~command~\token_to_str:N #1
-              is~not~allowed~in~the~first~column~of~\{\l__wa_type_env_tl\}~but~
-              only~in~the~second~column.~If~you~go~on,~this~command~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {Command~not~allowed~in~WithArrows}
-             {The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__wa_type_env_tl\}~
-              (it's~allowed~in~the~second~column~of~\{DispWithArrows\}).~If~you~go~on,
-              ~this~command~will~be~ignored.}
-\msg_new:nnn {witharrows}
-             {Multiple~tags}
-             {You~can't~use~twice~the~command~\token_to_str:N\tag\
-              in~a~line~of~the~environment~\{\l__wa_type_env_tl\}.~If~you~go~on,~the~tag~
-              '#1'~will~be~used.}
-\msg_new:nnn {witharrows}
-             {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_tl\}.~
-              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~
-              "AllowMultipleLabels"~at~the~global~or~environment~level.}
-\msg_new:nnn {witharrows}
-             {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_tl\}.~
-              If~you~go~on,~you~may~have~undefined~references.}
-\msg_new:nnn {witharrows}
-             {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.~If~you~go~on,~you~may~have~an~incorrect~output.}
-\msg_new:nnn {witharrows}
-             {Option~incompatible~with~group}
-             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
-              you~are~using~the~option~"
-              \int_compare:nNnTF \l__wa_pos_arrow_int = 5
-                   {group}
-                   {groups}".~
-              It's~incompatible.~You~can~go~on~ignoring~this~option~
-              "\tl_use:N\l_keys_key_tl"~but~you~should~correct~your~code.}
-\coffin_new:N \l__wa_halign_coffin
-\NewDocumentEnvironment {CasesWithArrows} {m !O{}}
-         {\hbox_set:Nn \l_tmpa_box {$\left\{\vcenter to 1cm {} \right.$}
-          \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_part_box
-          \hbox_set:Nn \l__wa_left_part_box
-                       {$\bool_if:NT \l__wa_displaystyle_bool \displaystyle #1 {}$}
-          \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}
-                      \clist_set:Nn \l__wa_tags_clist {all}}}
-           \bool_if:NT \c__wa_amsmath_loaded_bool \intertext@
-           \if_mode_math:
-               \__wa_error:n {DispWithArrows~in~math~mode}
-           \fi:
-           \bool_set_true:N \l__wa_in_DispWithArrows_bool
-           %
-           \__wa_pre_environment:n {#2}
-           \nointerlineskip
-           \hbox_to_wd:nn {0.6\linewidth} {}
-           $$
-           \spread at equation
-           \vcoffin_set:Nnw \l__wa_halign_coffin \displaywidth
-              \bool_if:NTF \l__wa_fleqn_bool
-                     {\tabskip = \c_zero_skip}
-                     {\tabskip = 0 pt plus 1000 pt minus 1000 pt}
-              \bool_if:NTF \c__wa_amsmath_loaded_bool
-                 {\cs_set_eq:NN \__wa_old_label \ltx at label}
-                 {\cs_set_eq:NN \__wa_old_label \label}
-              \halign to \displaywidth \bgroup
-                \int_gincr:N \g__wa_line_int
-                \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_first_column:
-                \bool_set_true:N \l__wa_in_first_column_bool
-                \bool_if:NT \l__wa_fleqn_bool
-                      {\skip_horizontal:n \l__wa_mathindent_dim}
-                \hfil
-                \skip_horizontal:n {\box_wd:N \l__wa_left_part_box + \l__wa_delim_wd_dim}
-                $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
-                \tabskip = \c_zero_skip
-               &
-                \clist_if_in:NVT \l__wa_tags_clist \g__wa_line_int
-                    {\clist_set:Nn \l__wa_tags_clist {all}}
-                \cs_set:Npn \notag {\clist_clear:N \l__wa_tags_clist}
-                $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {{}##}$
-                \tabskip = 0 pt plus 1000 pt minus 1000 pt
-                \tikz [remember~picture,overlay]
-                     \node [__wa_node_style,
-                            name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-l,
-                            alias = {\tl_if_empty:NF \l__wa_name_tl
-                                      {\l__wa_name_tl-\int_use:N\g__wa_line_int-l}} ] {} ;
-                \hfil
-                \tikz [remember~picture,overlay]
-                     \node [__wa_node_style,
-                            name = wa-\l__wa_prefix_str-\int_use:N\g__wa_line_int-r,
-                            alias = {\tl_if_empty:NF \l__wa_name_tl
-                                      {\l__wa_name_tl-\int_use:N\g__wa_line_int-r}} ] {} ;
-                \bool_if:NT \l__wa_shownodenames_bool
-                     {\hbox_overlap_right:n {\small wa-\l__wa_prefix_str
-                                                      -\int_use:N\g__wa_line_int}}
-               & ##
-                \tabskip = \c_zero_skip
-               && \__wa_error:n {Third~column~in~DispWithArrows}
-                  \if_false: ## \fi:
-                \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}}
-           \vcoffin_set_end:
-           \hbox_to_wd:nn \displaywidth
+                       -- node (__witharrows_label) {}
+                          ([xshift = \l__witharrows_xoffset_dim+5mm]\l_tmpb_tl-r.south)
+                       -- ([xshift = \l__witharrows_xoffset_dim]\l_tmpb_tl-r.south)  ;
+           \tikz at parse@node \pgfutil at firstofone (__witharrows_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__witharrows_wrap_lines_bool && \l__witharrows_in_DispWithArrows_bool }
              {
-              \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_part_box
-                     \dim_set:Nn \l_tmpa_dim {   \box_ht:N \l__wa_halign_coffin
-                                               + \box_dp:N \l__wa_halign_coffin}
-                     $\left\{ \vcenter to \l_tmpa_dim {\vfil} \right.$}
-              \hfil}
-           \coffin_typeset:Nnnnn
-                        \l__wa_halign_coffin {l} {vc} {-\displaywidth} \c_zero_dim
-           $$
-           \__wa_post_environment:
-           \bool_if:nT \c__wa_mathtools_loaded_bool
-                    {\MH_if_boolean:nT {show_only_refs}
-                          \MT_showonlyrefs_true:}
-           \bool_if:NT \g__wa_footnote_bool \endsavenotes
-           \ignorespacesafterend
+               \dim_set:Nn \l_tmpb_dim
+                  { \g__witharrows_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 (__witharrows_label.west)
+            node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ;
+         \end{tikzpicture}
+      }
+ }
+\cs_new_protected:Nn \__witharrows_MultiArrow_i:n
+  {
+    \begin {tikzpicture }
+      [
+        __witharrows_standard ,
+        every~path / .style = { WithArrows / arrow }
+      ]
+      \foreach \k in { #1 }
+        {
+          \draw [ <- ]
+            ( [xshift = \l__witharrows_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
+        } ;
+    \end { tikzpicture }
+  }
+\str_const:Nn \c__witharrows_option_ignored_str
+  { If~you~go~on,~this~option~will~be~ignored. }
+\__witharrows_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.
+   }
+\__witharrows_msg_new:nnn { Unknown~option~in~Arrow }
+  {
+    The~option~'\l_keys_key_tl'~
+    is~unknown~for~the~command~\l__witharrows_string_Arrow_for_msg_str\
+    in~the~row~\int_use:N \g__witharrows_line_int\
+    of~your~environment~\{\l__witharrows_type_env_str\}. \\
+    \c__witharrows_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__witharrows_options_Arrow_seq {~and~} {,~} {~and~}.
+  }
+\__witharrows_msg_new:nnn { Unknown~option~WithArrows }
+  {
+    The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
+    \c__witharrows_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__witharrows_options_WithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__witharrows_msg_new:nnn { Unknown~option~DispWithArrows }
+  {
+    The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
+    \c__witharrows_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__witharrows_options_DispWithArrows_seq {~and~} {,~} {~and~}.
+  }
+\__witharrows_msg_new:nnn { Unknown~option~WithArrowsOptions }
+  {
+    The~option~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \WithArrowsOptions. \\
+    \c__witharrows_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__witharrows_options_WithArrowsOptions_seq {~and~} {,~} {~and~}.
+  }
+\__witharrows_msg_new:nnn { Unknown~option~Arrow~in~CodeAfter }
+  {
+    The~option~'\l_keys_key_tl'~is~unknown~in~
+    \token_to_str:N \Arrow\
+    in~\token_to_str:N \CodeAfter. \\
+    \c__witharrows_option_ignored_str \\
+    For~a~list~of~the~available~keys,~type~H~<return>.
+  }
+  {
+    The~available~keys~are~(in~alphabetic~order):~
+    \seq_use:Nnnn \l__witharrows_options_Arrow_CodeAfter_seq {~and~} {,~} {~and~}.
+  }
+\__witharrows_msg_new:nn { Third~column~in~WithArrows }
+ {
+   By~default,~an~environment~\{\l__witharrows_type_env_str\}~can~only~have~
+   two~columns.~Maybe~you~have~forgotten~a~
+   \c_backslash_str\c_backslash_str.~If~you~really~want~more~than~
+   two~columns,~you~should~use~the~option~'more-columns'~at~a~global~
+   level~or~for~an~environment. \\
+   However,~you~can~go~one~for~this~time.
+ }
+\__witharrows_msg_new:nn { Third~column~in~DispWithArrows }
+  {
+    An~environment~\{\l__witharrows_type_env_str\}~can~only~have~two~columns.~
+    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
+    at~the~end~of~row~\int_use:N \g__witharrows_line_int. \\
+    If~you~go~on,~you~may~have~other~errors.
+  }
+\__witharrows_msg_new:nn { Negative~jump }
+ {
+   You~can't~use~a~negative~value~for~the~option~'jump'~of~command~
+   \l__witharrows_string_Arrow_for_msg_str\
+   in~the~row~\int_use:N \g__witharrows_line_int\
+   of~your~environment~\{\l__witharrows_type_env_str\}.~
+   You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\
+   \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { new-group~without~groups }
+  {
+    You~can't~use~the~option~'new-group'~for~the~command~
+    \l__witharrows_string_Arrow_for_msg_str\
+    because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~
+    'groups'~in~your~environment~\{\l__witharrows_type_env_str\}. \\
+    \c__witharrows_option_ignored_str
+  }
+\__witharrows_msg_new:nn
+ { Too~few~lines~for~an~arrow }
+ { Line~\l__witharrows_input_line_str\
+   :~an~arrow~specified~in~the~row~\int_use:N \l__witharrows_initial_int\
+   of~your~environment~\{\l__witharrows_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.
+ }
+\__witharrows_msg_new:nn { WithArrows~outside~math~mode }
+ {
+   The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~in~math~mode. \\
+   Nevertheless,~you~can~go~on.
+ }
+\__witharrows_msg_new:nn { DispWithArrows~in~math~mode }
+  {
+    The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~
+    outside~math~mode. \\
+    If~you~go~on,~you~will~have~other~errors.
+  }
+\__witharrows_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__witharrows_previous_key_str'~set~in~the~same~command~
+    \l__witharrows_string_Arrow_for_msg_str. \\
+    \c__witharrows_option_ignored_str
+  }
+\__witharrows_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__witharrows_previous_key_str'~set~in~the~same~command~
+    \bool_if:NT \l__witharrows_in_CodeAfter_bool
+      {
+        \l__witharrows_string_Arrow_for_msg_str\
+        in~the~CodeAfter~of~your~environment~\{\l__witharrows_type_env_str\}
+      }. \\
+    \c__witharrows_option_ignored_str
+  }
+\__witharrows_msg_new:nn { Arrow~in~first~column }
+  {
+    You~should~not~use~the~command~\l__witharrows_string_Arrow_for_msg_str\
+    in~the~first~column~of~your~environment~\{\l__witharrows_type_env_str\}~
+    but~only~in~the~second~column. \\
+    However~you~can~go~on~for~this~time.
+  }
+\__witharrows_msg_new:nn { Wrong~line~in~Arrow }
+  {
+    The~specification~of~line~'#1'~you~use~in~the~command~
+    \l__witharrows_string_Arrow_for_msg_str\
+    in~the~'CodeAfter'~of~\{\l__witharrows_type_env_str\}~doesn't~exist. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+\__witharrows_msg_new:nn { Both~lines~are~equal }
+  {
+    In~the~'CodeAfter'~of~\{\l__witharrows_type_env_str\}~you~try~to~
+    draw~an~arrow~going~to~it~self~from~the~line~'#1'.~This~is~not~possible. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+\__witharrows_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.
+  }
+\__witharrows_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. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+\__witharrows_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.
+  }
+\__witharrows_msg_new:nn { Not~allowed~in~DispWithArrows }
+  {
+    The~command~\token_to_str:N #1
+    is~not~allowed~in~the~first~column~of~\{\l__witharrows_type_env_str\}~but~
+    only~in~the~second~column. \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+\__witharrows_msg_new:nn { Not~allowed~in~WithArrows }
+  {
+    The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__witharrows_type_env_str\}~
+    (it's~allowed~in~the~second~column~of~\{DispWithArrows\}). \\
+    If~you~go~on,~this~command~will~be~ignored.
+  }
+\__witharrows_msg_new:nn { Multiple~tags }
+ {
+   You~can't~use~twice~the~command~\token_to_str:N\tag\
+   in~a~line~of~the~environment~\{\l__witharrows_type_env_str\}. \\
+   If~you~go~on,~the~tag~'#1'~will~be~used.
+ }
+\__witharrows_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__witharrows_type_env_str\}. \\
+    However,~you~can~go~on.~
+    \bool_if:NT \c__witharrows_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.
+  }
+\__witharrows_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__witharrows_type_env_str\}. \\
+    If~you~go~on,~you~may~have~undefined~references.
+  }
+\__witharrows_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~\int_use:N \l_tmpa_int\
+    of~your~environment~\{\l__witharrows_type_env_str\}. \\
+    If~you~go~on,~you~may~have~an~incorrect~output.
+  }
+\__witharrows_msg_new:nn { Option~xoffset~forbidden }
+  { You~can't~use~the~option~'xoffset'~in~the~command~
+    \l__witharrows_string_Arrow_for_msg_str\
+    while~you~are~using~the~option~
+    ' \int_compare:nNnTF \l__witharrows_pos_arrow_int = 7
+         { group }
+         { groups } '. \\
+    \c__witharrows_option_ignored_str
+  }
+\NewDocumentCommand \WithArrowsNewStyle { m m }
+  {
+    \keys_if_exist:nnTF { WithArrows / WithArrows } { #1 }
+      { \__witharrows_error:nn { Key~already~defined } { #1 } }
+      {
+        \keys_define:nn { WithArrows / WithArrows }
+           {
+             #1 .code:n =
+                  {
+                    \keys_define:nn { WithArrows / WithArrows }
+                       { unknown .code:n = \prg_do_nothing: }
+                    \keys_set:nn { WithArrows / WithArrows } { #2 }
+                    \keys_define:nn { WithArrows / WithArrows }
+                       { unknown .code:n =
+                          \__witharrows_error:n { Unknown~option~WithArrows }}
+                  }
            }
-\NewDocumentCommand \WithArrowsNewStyle {mm}
-   { \keys_if_exist:nnTF {WithArrows/General} {#1}
-       {\__wa_error:nn {Key~already~defined} {#1}}
-       {\keys_define:nn {WithArrows/General}
-            {#1 .code:n = {\int_compare:nNnTF \l__wa_level_int < 3
-                            {\bool_set_eq:NN \l_tmpa_bool \l__wa_in_WithArrows_bool
-                             \bool_set_eq:NN \l_tmpb_bool \l__wa_in_DispWithArrows_bool
-                             \bool_set_false:N \l__wa_in_WithArrows_bool
-                             \bool_set_false:N \l__wa_in_DispWithArrows_bool
-                             \keys_set_known:nnN {WithArrows/General} {#2} \l_tmpa_tl
-                             \keys_set_known:nVN {WithArrows/GlobalOrEnv}
-                                                 \l_tmpa_tl \l_tmpb_tl
-                             \bool_set_eq:NN \l__wa_in_WithArrows_bool \l_tmpa_bool
-                             \bool_set_eq:NN \l__wa_in_DispWithArrows_bool \l_tmpb_bool}
-                            {\__wa_error:n {Unknown~option}}}}
-        \group_begin:
-           \msg_set:nnn {witharrows}
-                        {Option~will~be~ignored}
-                        {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~can't~be~
-                         used~in~\token_to_str:N\WithArrowsNewStyle.~If~you~go~on,~
-                         this~option~will~be~ignored~in~the~definition~of~style~'#1'.}
-           \msg_set:nnn {witharrows}
-                        {Unknown~option}
-                        {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown.~If~you~go~on,~
-                         this~option~will~be~ignored~in~the~definition~of~style~'#1'.}
-           \WithArrowsOptions{#2}
-        \group_end:} }
-\msg_new:nnn {witharrows}
-             {Key~already~defined}
-             {The~key~'#1'~is~already~defined.~If~you~go~on,~
-              your~instruction~\token_to_str:N\WithArrowsNewStyle\ will~be~ignored.}
-\tl_set: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
+       \seq_put_right:Nn \l__witharrows_options_WithArrows_seq {#1}
+       \keys_define:nn { WithArrows / DispWithArrows }
+           {
+             #1 .code:n =
+                  {
+                    \keys_define:nn { WithArrows / DispWithArrows }
+                       { unknown .code:n = \prg_do_nothing: }
+                    \keys_set:nn { WithArrows / DispWithArrows } { #2 }
+                    \keys_define:nn {WithArrows / DispWithArrows }
+                       { unknown .code:n =
+                           \__witharrows_error:n { Unknown~option~DispWithArrows }}
+                  }
+           }
+       \seq_put_right:Nn \l__witharrows_options_DispWithArrows_seq { #1 }
+       \keys_define:nn { WithArrows / WithArrowsOptions }
+           {
+             #1 .code:n =
+              { \keys_set:nn { WithArrows / WithArrowsOptions } { #2 } }
+           }
+       \seq_put_right:Nn \l__witharrows_options_WithArrowsOptions_seq { #1 }
+       \group_begin:
+           \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
+              {
+                The~option~'\l_keys_key_tl'~can't~be~set~in~the~
+                definition~of~a~style. \\
+                If~you~go~on,~this~key~will~not~be~written~in~the~style~'#1'.
+              }
+           \WithArrowsOptions { #2 }
+       \group_end:
+      }
+  }
+\__witharrows_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__witharrows_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
                             \raggedright
-                               #3
-                            \end{varwidth}}
-             (\x2,\y1) -- (\p2) ;}
-\tl_set: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
-                            \raggedright
-                               #3
-                            \end{varwidth}}
-                   (\p2) ;}
-\keys_define:nn {WithArrows/General}
-     {up .value_forbidden:n = true,
-      up .code:n = {\int_compare:nNnTF \l__wa_level_int = 3
-                     {\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 1
-                            \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}}}
-                     {\__wa_error:n {Unknown~option}}},
-      down .value_forbidden:n = true,
-      down .code:n = {\int_compare:nNnTF \l__wa_level_int = 3
-                       {\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 1
-                              \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}}}
-                       {\__wa_error:n {Unknown~option}}}}
-\msg_new:nnn {witharrows}
-             {varwidth~not~loaded}
-             {You~can't~use~the~option~"\l_keys_key_tl"~because~
-              you~don't~have~loaded~the~package~
-              varwidth.~If~you~go~on,~this~option~will~be~forgotten.}
-\msg_new:nnn {witharrows}
-             {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~your~preamble.~
-              ~If~you~go~on,~this~option~will~be~forgotten.}
+                            #3
+                          \end { varwidth }
+                        }
+          (\x2,\y1) -- (\p2) ;
+  }
+\tl_const:Nn \c__witharrows_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
+                         \raggedright
+                         #3
+                       \end { varwidth }
+                     }
+                (\p2) ;
+  }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+  {
+    up   .code:n = \__witharrows_set_independent: ,
+    down .code:n = \__witharrows_set_independent: ,
+    up   .default:n = NoValue ,
+    down .default:n = NoValue
+  }
+\keys_define:nn { WithArrows / Arrow / SecondPass }
+ {
+   up .code:n =  \str_if_empty:NT \l__witharrows_previous_key_str
+                   {
+                     \str_set:Nn \l__witharrows_previous_key_str { up }
+                     \bool_if:NTF \c__witharrows_varwidth_loaded_bool
+                       {
+                         \cs_if_exist:cTF { tikz at library@calc at loaded }
+                           {
+                             \int_set:Nn \l__witharrows_pos_arrow_int \c_one_int
+                             \bool_set_false:N \l__witharrows_wrap_lines_bool
+                             \tl_set_eq:NN \l__witharrows_tikz_code_tl
+                               \c__witharrows_tikz_code_up_tl
+                           }
+                           { \__witharrows_error:n { calc~not~loaded } }
+                       }
+                       { \__witharrows_error:n { varwidth~not~loaded } }
+                   } ,
+   down .code:n = \str_if_empty:NT \l__witharrows_previous_key_str
+                    {
+                      \str_set:Nn \l__witharrows_previous_key_str { down }
+                      \bool_if:NTF \c__witharrows_varwidth_loaded_bool
+                        {
+                          \cs_if_exist:cTF { tikz at library@calc at loaded }
+                            {
+                              \int_set:Nn \l__witharrows_pos_arrow_int \c_one_int
+                              \bool_set_false:N \l__witharrows_wrap_lines_bool
+                              \tl_set_eq:NN \l__witharrows_tikz_code_tl
+                                \c__witharrows_tikz_code_down_tl
+                            }
+                            { \__witharrows_error:n { calc~not~loaded } }
+                        }
+                        { \__witharrows_error:n { varwidth~not~loaded } }
+                    }
+ }
+\seq_put_right:Nn \l__witharrows_options_Arrow_seq { down }
+\seq_put_right:Nn \l__witharrows_options_Arrow_seq { up }
+\__witharrows_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__witharrows_option_ignored_str
+  }
+\__witharrows_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~your~preamble. \\
+    \c__witharrows_option_ignored_str
+  }
 \endinput
 %%
 %% End of file `witharrows.sty'.



More information about the tex-live-commits mailing list