texlive[49561] Master/texmf-dist: witharrows (31dec18)

commits+karl at tug.org commits+karl at tug.org
Mon Dec 31 23:11:36 CET 2018


Revision: 49561
          http://tug.org/svn/texlive?view=revision&revision=49561
Author:   karl
Date:     2018-12-31 23:11:36 +0100 (Mon, 31 Dec 2018)
Log Message:
-----------
witharrows (31dec18)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/witharrows/README.md
    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/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/witharrows/README.md	2018-12-31 22:11:23 UTC (rev 49560)
+++ trunk/Master/texmf-dist/doc/latex/witharrows/README.md	2018-12-31 22:11:36 UTC (rev 49561)
@@ -6,10 +6,12 @@
 ## Presentation
 This extension has been written by F. Pantigny (`fpantigny at wanadoo.fr`).
 
-The extension `witharrows` gives a LaTeX environment `{WithArrows}` which is similar
-to the environment `{aligned}` of `amsmath` but which gives the possibility to draw arrows 
-on the right side of the equations for explanations.
 
+The LaTeX package `witharrows` provides environments `{WithArrows}` and `{DispWithArrows}`
+similar to the environments `{aligned}` and `{align}` of `amsmath` but with the possibility to draw arrows on the right side of the alignment. These arrows are usually used to give explanations concerning the mathematical calculus presented.
+
+
+
 ## Installation
 
 The package `witharrows` is present in the distributions MiKTeX, TeXLive and MacTeX.

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	2018-12-31 22:11:23 UTC (rev 49560)
+++ trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx	2018-12-31 22:11:36 UTC (rev 49561)
@@ -15,8 +15,8 @@
 %
 % \fi
 % \iffalse
-\def\myfileversion{1.12}
-\def\myfiledate{2018/11/26}
+\def\myfileversion{1.13}
+\def\myfiledate{2018/12/31}
 %
 %
 %<*batchfile>
@@ -246,7 +246,8 @@
 % p.~\pageref{TikzCode}.
 %
 % \interitem
-% One of the most useful options is ``|text width|'' to control the width of the text associated to the arrow. 
+% 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}
@@ -265,6 +266,7 @@
 %   & = 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}.
@@ -372,44 +374,8 @@
 % & = \frac73
 % \end{WithArrows}$
 %
-% \interitem
-% There are also two options for a fine tuning of the arrows:
-% 
-% \begin{itemize}
-% \item the option |ystart| sets the vertical distance between the base line of the text and the start of the arrow
-% (default value: 0.4 ex);
-% \item the option |ygap| sets the vertical distance between two consecutive arrows (default value: 0.4~ex).
-% \end{itemize}
 %
 %
-% \bigskip
-% $\begin{WithArrows}[interline=1mm]
-%  (\cos x + \sin x)^2 & = \cos^2 x +2 \cos x \sin x + \sin^2 x\Arrow{}\tikz[remember picture] \coordinate (A) ; \\
-%    & = \cos^2x + \sin^2x + 2\sin x\cos x \Arrow{} \\
-%    & = 1 + \sin(2x) 
-% \end{WithArrows}$
-%
-% \begin{tikzpicture}[remember picture,overlay,blue]
-% \draw (wa-\WithArrowsLastEnv-1-r.south) to ++(1,0) coordinate (B) to ++(0.1,0) ;;
-% \draw (A) to ++(1,0) coordinate (C) to ++(0.1,0) ;;
-% \draw (B) -- (C) ;
-% \draw[<-] (B) to ++(0,0.2) ;
-% \draw[<-] (C) to ++(0,-0.2) ;
-% \path (C) node[right=1mm] {\texttt{ystart}} ;
-% \draw (wa-\WithArrowsLastEnv-2-r.north) to ++(3,0) coordinate (E) to ++(0.1,0);
-% \draw (wa-\WithArrowsLastEnv-2-r.south) to ++(3,0) coordinate (F) to ++(0.1,0);
-% \draw (E) -- (F) ;
-% \draw[<-] (E) to ++(0,0.2) ;
-% \draw[<-] (F) to ++(0,-0.2) ;
-% \path (F) node[right=1mm] {\texttt{ygap}} ;
-% \end{tikzpicture}
-%
-%
-% \bigskip
-% \emph{Remark}: It's also possible to use the options ``|shorten <|'' and ``|shorten >|'' of Tikz (via the option
-% |tikz| of \pkg{witharrows}).
-%
-%
 % \interitem 
 % Almost all the options can also be set at the document level with the command |\WithArrowsOptions|. In this case,
 % the scope of the declarations is the current TeX group (these declarations are ``semi-global''). For example, if
@@ -468,7 +434,7 @@
 %
 % \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. Theses options are not designed to be hooks (they
+% 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).
 % %
 % \begin{Verbatim}
@@ -644,6 +610,9 @@
 % & = \frac1{\cos^nx}\cdot\frac{\sin(n+1)x}{\sin x}
 % \end{WithArrows}$
 %
+% \interitem
+%
+%
 % \section{Comparison with the environment \{aligned\}}
 %
 % |{WithArrows}| bears similarities with the environment |{aligned}| of the extension \pkg{amsmath}. These are only
@@ -652,8 +621,8 @@
 %
 % \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 is has exactly the same effect as
-% |\\| since an environment |{WithArrows}| is always unbreakable).
+% 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.
 % %
 % \begin{Verbatim}
 % $\begin{WithArrows}
@@ -673,7 +642,7 @@
 % 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 an given environment.\footnote{It's also possible to change |\jot| with the environment |{spreadlines}|
+% |\jot| for a given environment.\footnote{It's also possible to change |\jot| with the environment |{spreadlines}|
 % of \pkg{mathtools}.}
 % %
 % \begin{Verbatim}
@@ -997,7 +966,7 @@
 % 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{pgfkeys}.
+% |\foreach| command of \pkg{pgffor}.
 %
 %
 % \begin{Verbatim}
@@ -1223,8 +1192,9 @@
 % 
 % \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.
+% 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 \\
@@ -1352,9 +1322,9 @@
 % 
 % \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{refstyle},
-% \pkg{refcheck}, \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}, \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).
@@ -1361,7 +1331,8 @@
 %
 % \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.\label{wrap-lines}
+% 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@]
@@ -1402,7 +1373,7 @@
 % the arrows of this environment but only for the arrows in the nested environments |{WithArrows}|.}
 %
 % \smallskip
-% The value of this option must be a valid Tikz drawing instruction (with the final semi-colon) with three markers
+% 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
@@ -1457,7 +1428,6 @@
 %   & \Longleftrightarrow x = -1
 % \end{WithArrows}\]
 %
-%
 % \bigskip
 % The environments |{DispWithArrows}| and its starred version |{DispWithArrows*}| provide a command
 % |\WithArrowsRightX| which can be used in a definition of |TikzCode|. This command gives the
@@ -1464,6 +1434,7 @@
 % $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}
 %
@@ -1478,8 +1449,89 @@
 % the optional arguments of |{WithArrows}| and |{DispWithArrows}|).
 %
 % For an example of use, see p.~\pageref{example-WithArrowsRightX}.
+%
+%
+% \bigskip
+% \subsection{Vertical positioning of the arrows}
 % 
+% There are four parameters for fine tuning of the vertical positioning of the arrows : |ygap|, |ystart|,
+% |start-adjust| and |end-adjust|. 
+% 
+% \medskip
+% We first explain the behaviour when the parameters |start-adjust| and |end-adjust| are equal to zero:
+% \begin{itemize}
+% \item the option |ystart| sets the vertical distance between the base line of the text and the start of the arrow
+% (default value: 0.4 ex);
+% \item the option |ygap| sets the vertical distance between two consecutive arrows (default value: 0.4~ex).
+% \end{itemize}
+%
+%
 % \bigskip
+% $\begin{WithArrows}[interline=1mm, adjust = 0pt]
+%  (\cos x + \sin x)^2 & = \cos^2 x +2 \cos x \sin x + \sin^2 x\Arrow{}\tikz[remember picture] \coordinate (A) ; \\
+%    & = \cos^2x + \sin^2x + 2\sin x\cos x \Arrow{} \\
+%    & = 1 + \sin(2x) 
+% \end{WithArrows}$
+%
+% \begin{tikzpicture}[remember picture,overlay,blue]
+% \draw (wa-\WithArrowsLastEnv-1-r.south) to ++(1,0) coordinate (B) to ++(0.1,0) ;;
+% \draw (A) to ++(1,0) coordinate (C) to ++(0.1,0) ;;
+% \draw (B) -- (C) ;
+% \draw[<-] (B) to ++(0,0.2) ;
+% \draw[<-] (C) to ++(0,-0.2) ;
+% \path (C) node[right=1mm] {\texttt{ystart}} ;
+% \draw (wa-\WithArrowsLastEnv-2-r.north) to ++(3,0) coordinate (E) to ++(0.1,0);
+% \draw (wa-\WithArrowsLastEnv-2-r.south) to ++(3,0) coordinate (F) to ++(0.1,0);
+% \draw (E) -- (F) ;
+% \draw[<-] (E) to ++(0,0.2) ;
+% \draw[<-] (F) to ++(0,-0.2) ;
+% \path (F) node[right=1mm] {\texttt{ygap}} ;
+% \end{tikzpicture}
+%
+% \interitem 
+% However, for aesthetic reasons, when it's possible, \pkg{witharrows} starts the arrow a bit higher (by an amount
+% |start-adjust|) and ends the arrow a bit lower (by an amount |end-adjust|). By default, both parameters
+% |start-adjust| and |end-adjust| are equal to $0.4$~ex.
+%
+% \bigskip
+% Here is for example the behaviour without the mechanism of |start-adjust| and |end-adjust| (this was the standard
+% behaviour for versions prior to 1.13).
+% % \begin{Verbatim}
+% $\begin{WithArrows}~emphase#[start-adjust=0pt, end-adjust=0pt]@
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}[start-adjust=0pt, end-adjust=0pt]
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% Here is the standard behaviour since version 1.13 (the parameters |start-adjust| and |end-ajust| are used with
+% the default value $0.4$~ex). The arrow is longer and the result is more aesthetic.
+% 
+% \medskip
+% $\begin{WithArrows}
+% A & = (a+1)^2 \Arrow{we expand} \\
+%   & = a^2 + 2a + 1  
+% \end{WithArrows}$
+%
+%
+% \bigskip
+% It's also possible to use the option |adjust| which sets both |start-adjust| and |end-ajust|.
+%
+% \bigskip
+% Since the mechanism of |start-adjust| and |end-ajust| has been added in version 1.13 of \pkg{witharrows}, that
+% version is not stricty compatible with older versions. However, it's possible to restore the previous behaviour
+% simply by setting |start-adjust| and |end-adjust| to $0$~pt :
+% \begin{Verbatim}
+% \WithArrowsOptions{adjust = 0pt}
+% \end{Verbatim}
+% 
+% \bigskip
 % \subsection{Footnotes in the environments of witharrows}
 % 
 % If you want to put footnotes in an environment |{WithArrows}| or |{DispWithArrows}|, you can use a pair
@@ -1524,7 +1576,7 @@
 % %
 % \begin{Verbatim}
 % $\begin{WithArrows}
-% &f(x) \ge g(x) \Arrow{by squaring both sides} \\
+% & f(x) \ge g(x) \Arrow{by squaring both sides} \\
 % & f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\
 % & f(x)^2 - g(x)^2 \ge 0 
 % \end{WithArrows}$
@@ -1531,7 +1583,7 @@
 % \end{Verbatim}
 %
 % $\begin{WithArrows}
-% &f(x) \ge g(x) \Arrow{by squaring both sides} \\
+% & f(x) \ge g(x) \Arrow{by squaring both sides} \\
 % & f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\
 % & f(x)^2 - g(x)^2 \ge 0 
 % \end{WithArrows}$
@@ -1851,11 +1903,12 @@
 % b.\;& f \text{ est continuous in } 0 \\
 % c.\;& f \text{ is bounded on the unit sphere} \\
 % d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
-% e.\;& f \text{ is lipschitzian}  \\
+% e.\;& f \text{ is lipschitzian}  
 % \end{WithArrows}$
 %
 % \end{scope}
 %
+%
 % \section{Implementation}
 %
 % \subsection{Declaration of the package and extensions loaded}
@@ -1868,6 +1921,7 @@
 %    \begin{macrocode}
 \RequirePackage{tikz}
 \usetikzlibrary{arrows.meta,bending}
+\RequirePackage{expl3}[2018-01-01]
 %    \end{macrocode}
 %
 % \bigskip
@@ -1883,7 +1937,7 @@
 %
 % \bigskip
 % The package \pkg{xparse} will be used to define the environments |{WithArrows}|, |{DispWithArrows}|,
-% |{DispWithArrows*}| and the document-level commands |\Arrow| and |\WithArrowsOptions|.
+% |{DispWithArrows*}| and the commands |\Arrow|, |\WithArrowsOptions| and |\WithArrowsNewStyle|. 
 %    \begin{macrocode}
 \RequirePackage{xparse}
 %    \end{macrocode}
@@ -1998,9 +2052,8 @@
        \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 |\begin{savenotes}| is in |\@@_pre_environment:n|
-% and |\end{savenotes}| in |\@@_post_environment:| which are executed at the beginning and at the end of the
-% environments |{WithArrows}| and |{DispWithArrows}|).
+% 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}|).
 %
 % \bigskip
 % \subsection{The class option leqno}
@@ -2027,6 +2080,7 @@
         {\msg_error:nn {witharrows} {#1}}
 \cs_new_protected:Nn \@@_error:nn
         {\msg_error:nnn {witharrows} {#1} {#2}}
+\cs_generate_variant:Nn \@@_error:nn {nx}
 %    \end{macrocode}
 % 
 %    \begin{macrocode}
@@ -2154,10 +2208,10 @@
     {\bool_if:NF \c_@@_amsmath_loaded_bool
        {\cs_set_protected:Npn \spread at equation
            {\openup\jot   
-            \cs_set_protected:Npn \spread at equation {}}}}
+            \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.
+% with nested environments. |\cs_set_protected:Npn \spread at equation {}|
 %
 %
 % \bigskip
@@ -2165,7 +2219,7 @@
 %
 %
 % The boolean |\l_@@_in_WithArrows_bool| will be raised in an environment |{WithArrows}| and the
-% boolean |\l_@@_in_dispwitharrows_bool| in a an environment |{DispWithArrows}| or |{DispWithArrows*}|.
+% boolean |\l_@@_in_dispwitharrows_bool| in an environment |{DispWithArrows}| or |{DispWithArrows*}|.
 %    \begin{macrocode}
 \bool_new:N \l_@@_in_WithArrows_bool
 \bool_new:N \l_@@_in_DispWithArrows_bool
@@ -2203,6 +2257,7 @@
 \dim_set:Nn \l_@@_xoffset_dim {3mm}
 %    \end{macrocode}
 %
+% 
 % \bigskip
 % The integer |\l_@@_pos_arrows_int| indicates the position of the arrows 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).
@@ -2211,7 +2266,7 @@
 % \begin{tabular}{l}
 % \begin{tabular}{@{}l*8c@{}}
 % \toprule
-% option                 & |rr| & |ll| & |rl| & |lr| & |v| & |i| & |group| & |groups| \\
+% option                 & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\
 % \midrule
 % |\l_@@_pos_arrows_int| & $0$  & $1$  & $2$  & $3$  & $4$ & $5$  & $6$  & $7$  \\
 % \bottomrule
@@ -2219,9 +2274,11 @@
 % \footnotesize The option |v| can be used only in |\Arrow| in |CodeAfter| (see below).
 % \end{tabular}
 % \end{center}
+%
 % 
 %    \begin{macrocode}
 \int_new:N \l_@@_pos_arrows_int
+\int_set:Nn \l_@@_pos_arrows_int 3
 %    \end{macrocode}
 %
 % \medskip
@@ -2315,7 +2372,7 @@
 %
 % 
 % \bigskip
-% The boolean |\l_@@_in_first_column_bool| will be used to known wether we are in the first column of the
+% 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
@@ -2327,6 +2384,16 @@
 \bool_new:N \l_@@_initial_l_bool 
 %    \end{macrocode}
 %
+% \bigskip
+% 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_new:N \l_@@_end_adjust_dim
+\dim_set:Nn \l_@@_end_adjust_dim {0.4ex}
+%    \end{macrocode}
+%
 % 
 % \bigskip
 % \subsection{The definition of the options}
@@ -2389,6 +2456,7 @@
       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|.
@@ -2404,8 +2472,7 @@
 % \bigskip
 % The option |AllowLineWithoutAmpersand| is obsolete and will be deleted in a future version.
 %    \begin{macrocode}
-      AllowLineWithoutAmpersand .code:n = { \msg_error:nn
-                                            {witharrows}
+      AllowLineWithoutAmpersand .code:n = { \@@_error:n
                                             {AllowLineWithoutAmpersand}},
       AllowLineWithoutAmpersand .value_forbidden:n = true,
 %    \end{macrocode}
@@ -2453,27 +2520,25 @@
 %    \begin{macrocode}
       group    .code:n    = {\int_compare:nNnT \l_@@_previous_pos_arrows_int > {-1}
                                     {\@@_error:n {Two~options~are~incompatible}}
-                             \int_set:Nn \l_@@_previous_pos_arrows_int 6
-                             \int_set:Nn \l_@@_pos_arrows_int 6} ,
+                             \int_set:Nn \l_@@_previous_pos_arrows_int 7
+                             \int_set:Nn \l_@@_pos_arrows_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. When
-% the option |group| or |groups| is used, it's not possible to specify another option of position like |ll|, |lr|, etc.
-% for a individual key.
+% 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_arrows_int > {-1}
                                    {\@@_error:n {Two~options~are~incompatible}}
-                            \int_set:Nn \l_@@_previous_pos_arrows_int 7
-                            \int_set:Nn \l_@@_pos_arrows_int 7} ,
+                            \int_set:Nn \l_@@_previous_pos_arrows_int 6
+                            \int_set:Nn \l_@@_pos_arrows_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 |\begin{savenotes}|).
+% the eventual |\savenotes|).
 %    \begin{macrocode}
       CodeBefore  .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
                               {\@@_error:n {Option~will~be~ignored}}
@@ -2482,8 +2547,8 @@
 %    \end{macrocode}
 %
 % \bigskip
-% The option |CodeAfter| gives a code that is executed at the end of the environment |{WithArrows}| (after the
-% eventual |\end{savenotes}|).
+% The option |CodeAfter| gives a code that is executed at the end of the environment |{WithArrows}| (before the
+% eventual |\endsavenotes|).
 %    \begin{macrocode}
       CodeAfter .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
                               {\@@_error:n {Option~will~be~ignored}}
@@ -2507,7 +2572,7 @@
 %    \begin{macrocode}
       fleqn   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
                              {\@@_error:n {Option~will~be~ignored}}
-                             {\tl_if_eq:nnTF {#1} {true}
+                             {\str_if_eq:nnTF {#1} {true}
                                  {\bool_set_true:N \l_@@_fleqn_bool}
                                  {\bool_set_false:N \l_@@_fleqn_bool}}},
       fleqn   .default:n = true,
@@ -2527,7 +2592,7 @@
 %    \begin{macrocode}
       notag   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
                              {\@@_error:n {Option~will~be~ignored}}
-                             {\tl_if_eq:nnTF {#1} {true}
+                             {\str_if_eq:nnTF {#1} {true}
                                  {\clist_clear:N \l_@@_tags_clist}
                                  {\clist_set:Nn \l_@@_tags_clist {all}}}},
       notag   .default:n = true,
@@ -2552,7 +2617,7 @@
 %    \begin{macrocode}
       wrap-lines   .code:n = {\bool_if:NTF \l_@@_in_WithArrows_bool
                                {\@@_error:n {Option~will~be~ignored}}
-                               {\tl_if_eq:nnTF {#1} {true}
+                               {\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,
@@ -2596,13 +2661,13 @@
 % |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 0 ,
+      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 3 ,
+      lr       .code:n            = \@@_analyze_option_position:n 0 ,
       i        .value_forbidden:n = true,
       i        .code:n            = \@@_analyze_option_position:n 5 ,
 %    \end{macrocode}
@@ -2644,6 +2709,18 @@
       interline   .value_required:n = true,
 %    \end{macrocode}
 %
+% 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,
+%    \end{macrocode}
+%
+%
 % \bigskip
 % Eventually, a key |jump| (see below) and a key for unknown keys.
 %    \begin{macrocode}
@@ -2655,9 +2732,8 @@
 %
 % \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. That's why there is a special module for this key. The key |jump| is
-% extracted in the command |\Arrow| because we want to compute right away the final line of the arrow (this will be
-% useful for the options |group| and |groups|).
+% 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|).
 %    \begin{macrocode}
 \keys_define:nn {WithArrows/Arrow}
      {jump  .code:n = {\int_set:Nn \l_@@_jump_int {#1}
@@ -2665,13 +2741,13 @@
                            {\@@_error:n {The~option~"jump"~must~be~non~negative}}} ,
       jump  .value_required:n  = true,
       rr       .value_forbidden:n = true,
-      rr       .code:n            = \@@_analyze_option_position:n 0 ,
+      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 3 ,
+      lr       .code:n            = \@@_analyze_option_position:n 0 ,
       i        .value_forbidden:n = true,
       i        .code:n            = \@@_analyze_option_position:n 5 }
 %    \end{macrocode}
@@ -2887,16 +2963,17 @@
 %    \end{macrocode}
 %
 % \bigskip
-% If the option |footnote| or the option |footnotehyper| is used, then we extract the footnotes with an environment
-% |{savenotes}| (of the package \pkg{footnote} or the package \pkg{footnotehyper}).
+% 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. 
 %    \begin{macrocode}
-           \bool_if:NT \g_@@_footnote_bool {\savenotes}
+           \bool_if:NT \g_@@_footnote_bool \savenotes
 %    \end{macrocode}
 %
 % \bigskip
 % We execute the code |\l_@@_code_before_tl| of the option |CodeBefore| of the environment after the eventual
-% |\begin{savenotes}| and, symetricaly, we will execute the |\l_@@_code_after_tl| before the eventual
-% |\end{savenotes}| (we have a good reason for the last point : we want to extract the footnotes of the arrows
+% |\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
@@ -3013,7 +3090,7 @@
 % 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}
-          {\crcr
+          {\\
            \egroup 
            \egroup
            \@@_post_environment:
@@ -3021,9 +3098,10 @@
 %
 % \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}).
+% |{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.
 %    \begin{macrocode}
-           \bool_if:NT \g_@@_footnote_bool {\endsavenotes}
+           \bool_if:NT \g_@@_footnote_bool \endsavenotes
 }
 %    \end{macrocode}
 % This is the end of the environment |{WithArrows}|.
@@ -3043,18 +3121,9 @@
 %    \end{macrocode}
 %
 % \bigskip 
-% It there is really arrows in the environment, we draw the arrows:
-% \begin{itemize}
-% \item if neither option |group| or |groups| is used, we can draw directly ;
-% \item if option |group| or option |groups| is used (|\l_@@_pos_arrows_int| > 5), we have to draw the
-% arrows group by group ; the macro |\@@_draw_arrows:| does the work.
-% \end{itemize}
-%
+% It there is really arrows in the environment, we draw the arrows.
 %    \begin{macrocode}
-           \int_compare:nNnT \g_@@_arrow_int > 0 
-                  {\int_compare:nNnTF \l_@@_pos_arrows_int > 5
-                    \@@_draw_arrows:
-                    {\@@_draw_arrows:nn 1 \g_@@_arrow_int}}
+           \int_compare:nNnT \g_@@_arrow_int > 0 \@@_scan_arrows:
 %    \end{macrocode}
 %
 % \bigskip
@@ -3117,9 +3186,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_cr:
       {\scan_stop:
+%    \end{macrocode}
 % \bigskip
 %    \begin{macrocode}
-       \bool_if:NT \l_@@_in_first_column_bool {& {} } 
+       \bool_if:NT \l_@@_in_first_column_bool { & {} } 
        \group_align_safe_begin:
        \peek_meaning_remove:NTF * \@@_cr_i: \@@_cr_i:}
 %    \end{macrocode}
@@ -3221,7 +3291,7 @@
                  & \@@_restore:N \l_@@_tag_star_bool
                    \@@_restore:N \l_@@_qedhere_bool
                    \bool_if:NT \l_@@_qedhere_bool
-                         {\hbox_overlap_left:n {\@@_qedhere_i:}}
+                         {\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@ {}}
 %    \end{macrocode}
@@ -3239,7 +3309,7 @@
                 {\@@_save:N \l_@@_qedhere_bool 
                  & \@@_restore:N \l_@@_qedhere_bool
                    \bool_if:NT \l_@@_qedhere_bool
-                         {\hbox_overlap_left:n {\@@_qedhere_i:}}
+                         {\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}
@@ -3256,12 +3326,10 @@
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_if_in_second_col_of_disp:nn
      {\bool_if:NTF \l_@@_in_WithArrows_bool
-          {\msg_error:nnn {witharrows} 
-                          {Command~not~allowed~in~{WithArrows}} 
+          {\@@_error:nn {Command~not~allowed~in~{WithArrows}} 
                           {#1}}
           {\bool_if:NTF \l_@@_in_first_column_bool
-             {\msg_error:nnn {witharrows}
-                             {Command~not~allowed~in~{DispWithArrows}}
+             {\@@_error:nn {Command~not~allowed~in~{DispWithArrows}}
                              {#1}}
              {#2}}}
 %    \end{macrocode}
@@ -3281,7 +3349,7 @@
 \NewDocumentCommand \@@_tag {sm}
      {\@@_if_in_second_col_of_disp:nn {\tag}
              {\tl_if_empty:NF \l_@@_tag_tl
-                   {\msg_error:nnn {witharrows} {Multiple~tags} {#2}}
+                   {\@@_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}
@@ -3345,7 +3413,7 @@
 %    \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 a adaptation of the code of
+% 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:
@@ -3482,7 +3550,7 @@
 %    \begin{macrocode}
            \bool_if:NT \l_@@_in_DispWithArrows_bool
              {\dim_gzero_new:N \g_@@_right_x_dim 
-              \dim_gset:Nn \g_@@_right_x_dim \c_max_dim
+              \dim_gset_eq:NN \g_@@_right_x_dim \c_max_dim
               \begin{tikzpicture} [@@_standard]
               \int_step_variable:nnnNn 1 1 \g_@@_line_int \l_tmpa_int
                     {\tikz at parse@node\pgfutil at firstofone (\l_tmpa_int-v)
@@ -3510,17 +3578,14 @@
 % 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 \endsavenotes
            \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 an error message.
+% and |\end{DispWithArrows}| because there is a |\@currenvir| in some error messages.
 %    \begin{macrocode}
 \NewDocumentEnvironment {DispWithArrows*} {}
      {\WithArrowsOptions{notag}
@@ -3532,16 +3597,35 @@
 % \subsection{We draw the arrows}
 %
 % \bigskip
-% |\@@_draw_arrows:| draws the arrows when the option |group| or the option |groups| is used. In both cases, we have
-% to compute the $x$-value of a group of arrows before actually drawing the arrows of that group. The arrows will
-% actually be drawn by the macro |\@@_draw_arrows:nn|.
+% 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.
+% \end{itemize}
 % 
+% \medskip
+% If the option |group| is used (|\l_@@_pos_arrows_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_arrows_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_arrows_int = 7
+                      { \@@_scan_arrows_i:
+                        \int_set:Nn \l_@@_pos_arrows_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''. 
 %    \begin{macrocode}
-\cs_new_protected:Nn \@@_draw_arrows:
-  { \group_begin:
+\cs_new_protected:Nn \@@_scan_arrows_i:
+  { 
 %    \end{macrocode}
 %
 % \bigskip
@@ -3550,17 +3634,26 @@
 % |\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
+% adjustement by |\l_@@_start_adjust_dim|.
+%
 % |\l_@@_last_line_of_group_int| will be the last line involved in the group (impossible to guess in advance).
+%
+% |\l_@@_last_arrows_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
     \int_zero_new:N \l_@@_last_line_of_group_int
+    \seq_clear_new:N \l_@@_first_arrows_of_group_seq
+    \seq_clear_new:N \l_@@_last_arrows_of_group_seq
     \bool_set_true:N \l_@@_new_group_bool
 %    \end{macrocode}
 %
 % \bigskip
 % We begin a loop over all the arrows of the environment. Inside this loop, if a group is finished, we will draw
-% the lines of that group.
+% the arrows of that group.
 %    \begin{macrocode}
     \int_set:Nn \l_@@_arrow_int 1
     \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int
@@ -3591,14 +3684,17 @@
        \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 (with the $x$-value computed in |\l_@@_x_dim|).
+% of that group, except if you are with the option |group| and in the first step of treatment (|\l_@@_pos_arrows_int| = 7).
 %    \begin{macrocode}
-          {\bool_if:nT {     \int_compare_p:nNn \l_@@_pos_arrows_int = 7
-                         && \int_compare_p:nNn \l_@@_arrow_int > 1
-                         && \int_compare_p:nNn 
-                                    \l_@@_initial_int > \l_@@_last_line_of_group_int}
+          {\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_arrows_int != 7}}
                  {\@@_draw_arrows:nn \l_@@_first_arrow_of_group_int {\l_@@_arrow_int - 1}
                   \bool_set_true:N \l_@@_new_group_bool}
 %    \end{macrocode}
@@ -3607,9 +3703,10 @@
 % 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 four variables:
-% |\l_@@_first_arrow_int|, |\l_@@_first_line_of_group_int|, |\l_@@_last_line_of_group| and |\l_@@_x_dim|.
-% The last two will evolve during the construction of the group.
+% 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
@@ -3616,7 +3713,20 @@
                   \int_set:Nn \l_@@_first_arrow_of_group_int \l_@@_arrow_int
                   \int_set:Nn \l_@@_first_line_of_group_int \l_@@_initial_int
                   \int_set:Nn \l_@@_last_line_of_group_int \l_@@_final_int
-                  \dim_set:Nn \l_@@_x_dim {-\c_max_dim}
+                  \seq_clear:N \l_@@_first_arrows_of_group_seq 
+                  \seq_put_left:Nx \l_@@_first_arrows_of_group_seq 
+                                   {\int_use:N \l_@@_arrow_int}
+                  \seq_clear:N \l_@@_last_arrows_of_group_seq 
+                  \seq_put_left:Nx \l_@@_last_arrows_of_group_seq 
+                                   {\int_use:N \l_@@_arrow_int}
+%    \end{macrocode}
+%
+% If we are in option |group| and in the second step of treatment (|\l_@@_pos_arrows_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_arrows_int != 8}
+                      {\dim_set:Nn \l_@@_x_dim {-\c_max_dim}}
                   }
 %    \end{macrocode}
 %
@@ -3626,16 +3736,28 @@
 % the end of the group.
 %    \begin{macrocode}
                  {\int_compare:nNnT \l_@@_pos_of_arrow_int = {-1}
-                     {\int_set:Nn \l_@@_last_line_of_group_int
-                        {\int_max:nn \l_@@_last_line_of_group_int \l_@@_final_int}}}
+                     {\int_compare:nNnT \l_@@_initial_int = \l_@@_first_line_of_group_int
+                           {\seq_put_left:Nx \l_@@_first_arrows_of_group_seq
+                                             {\int_use:N \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:Nx \l_@@_last_arrows_of_group_seq 
+                                          {\int_use:N \l_@@_arrow_int}}
+                        {\int_compare:nNnT \l_@@_final_int = \l_@@_last_line_of_group_int
+                           {\seq_put_left:Nx \l_@@_last_arrows_of_group_seq
+                                             {\int_use:N \l_@@_arrow_int}}}}}
 %    \end{macrocode}
 %
 % \bigskip 
-% If the arrow is independant (|\l_@@_pos_of_arrow_int| non negative), you update the current $x$-value (in
-% |\l_@@_x_dim|) with the dedicated command |\@@_update_x_value:nn|.
+% 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_arrows_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}
-              {\@@_update_x_value:nn \l_@@_initial_int \l_@@_final_int} }
+              { \int_compare:nT {\l_@@_pos_arrows_int != 8}
+                   {\@@_update_x_value:nn \l_@@_initial_int \l_@@_final_int}} }
 %    \end{macrocode}
 %
 % \bigskip
@@ -3646,10 +3768,12 @@
 %    \end{macrocode}
 %
 % \bigskip
-% After the last arrow of the environment, we have to draw the last group of arrows.
+% 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_arrows_int| = 7), we don't draw because, in the first step, we don't
+% draw anything.
 %    \begin{macrocode}
-     \@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int
-     \group_end:
+     \int_compare:nT {\l_@@_pos_arrows_int != 7}
+        {\@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int}
   }
 %    \end{macrocode}
 %
@@ -3698,14 +3822,11 @@
 %    \end{macrocode}
 %
 % \bigskip
-% If the arrow ends 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). However, if the
-% option |group| or the option |groups| is in force, we don't raise an error because the error has already been
-% raised in |\@@_draw_arrows:|.
+% 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:nNnTF \l_@@_final_int > \g_@@_line_int
-         {\int_compare:nNnT \l_@@_pos_arrows_int < 6
-               {\@@_error:n {Too~few~lines~for~an~arrow}}}
+      \int_compare:nNnT \l_@@_final_int < {\g_@@_line_int + 1}
          \@@_draw_arrows_i:
       \int_incr:N \l_@@_arrow_int
      } 
@@ -3718,7 +3839,7 @@
 % 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:Nn \@@_draw_arrows_i:
+\cs_new_protected:Nn \@@_draw_arrows_i:
      {\group_begin:
       \int_set:Nn \l_@@_level_int 3
 %    \end{macrocode}
@@ -3751,10 +3872,10 @@
       \bool_set_false:N \l_@@_initial_r_bool
       \bool_set_false:N \l_@@_final_r_bool
       \int_case:nn \l_@@_pos_arrows_int 
-             {0 {\bool_set_true:N \l_@@_initial_r_bool
-                 \bool_set_true:N \l_@@_final_r_bool}
+             {0 {\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}}
+              3 {\bool_set_true:N \l_@@_initial_r_bool
+                 \bool_set_true:N \l_@@_final_r_bool}}
 %    \end{macrocode}
 %
 % \bigskip
@@ -3762,7 +3883,7 @@
 % \begin{tabular}{l}
 % \begin{tabular}{@{}l*8c@{}}
 % \toprule
-% option                 & |rr| & |ll| & |rl| & |lr| & |v| & |i| & |group| & |groups| \\
+% option                 & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\
 % \midrule
 % |\l_@@_pos_arrows_int| & $0$  & $1$  & $2$  & $3$  & $4$ & $5$  & $6$  & $7$  \\
 % \bottomrule
@@ -3795,7 +3916,7 @@
 % nodes created have the shape of small vertical segments: use option |shownodes| to visualize the nodes).
 %
 % \bigskip
-% The label of the arrow will is stored in |\l_tmpa_tl|.
+% 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} 
@@ -3802,29 +3923,54 @@
                     \l_tmpa_tl 
 %    \end{macrocode}
 %
-% \bigskip 
-% We have to compute the coordinates of the extremities of the arrow. We retrieve the coordinates in |\g_tmpa_tl|
-% and |\g_tmpb_tl|. This extraction of the coordinates is necessary because we must give coordinates and not nodes
-% (even anchored) to |\@@_draw_arrow:nnn| to have the |xshift| correct.
+% \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. 
 %    \begin{macrocode}
-      \int_compare:nNnTF \l_@@_pos_arrows_int < 5
-         {\begin{tikzpicture} [@@_standard]
-              \tikz at scan@one at point\pgfutil at firstofone(\l_@@_initial_tl)
-              \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(\l_@@_final_tl)
-              \tl_gset:Nx \g_tmpb_tl {\dim_use:N\pgf at x,\dim_use:N\pgf at y}
-          \end{tikzpicture}
-}
+      \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_arrows_int = 5
+           {\bool_set_true:N \l_tmpa_bool
+            \bool_set_true:N \l_tmpb_bool}
 %    \end{macrocode}
+%
+% \bigskip 
+% We compute and store in |\g_tmpa_tl| and |\g_tmpb_tl| the exact coordinates of the extremities of the arrow. 
+% \begin{itemize}
+% \item Concerning the $x$-values, the abscissa computed in |\l_@@_x_dim| will be used if the option of position
+% is |i|, |group| or |groups|.
+% \item Concerning the $y$-values, an adjustement is done for each arrow starting at the first line of the group
+% and each arrow ending at the last line of the group (with the values of |\l_@@_start_adjust_dim| and 
+% |\l_@@_end_adjust_dim|). 
+% \end{itemize}
 % 
-% If we use option |i| or |group| or |groups|, we use the abscissa specially computed in |\l_@@_x_dim|.
 %    \begin{macrocode}
-         {\begin{tikzpicture} [@@_standard]
-              \tikz at scan@one at point\pgfutil at firstofone (\l_@@_initial_tl)
-              \tl_gset:Nx \g_tmpa_tl {\dim_use:N \l_@@_x_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 {\dim_use:N \l_@@_x_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_arrows_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_arrows_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
@@ -3838,7 +3984,7 @@
 % (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
@@ -3930,7 +4076,7 @@
 % \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 |\@@_draw_arrows:| (for options |group| and
+% 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|).
 %    \begin{macrocode}
 \cs_new_protected:Nn \@@_update_x_value:nn
@@ -3937,7 +4083,7 @@
     {\int_step_inline:nnnn {#1} 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}
+         \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}
@@ -4004,9 +4150,9 @@
 % 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}
-             {\msg_error:nnx {witharrows} {Wrong~line~specification~in~Arrow} {#2}}
+             {\@@_error:nx {Wrong~line~specification~in~Arrow} {#2}}
              {\cs_if_free:cTF {pgf at sh@ns at wa-\l_@@_prefix_str-#3-l}
-                {\msg_error:nnx {witharrows} {Wrong~line~specification~in~Arrow} {#3}}
+                {\@@_error:nx {Wrong~line~specification~in~Arrow} {#3}}
                 {\int_compare:nNnTF \l_@@_pos_arrows_int = 4
                     {\begin{tikzpicture} [@@_standard]
                         \tikz at scan@one at point\pgfutil at firstofone(#2-l.south)
@@ -4047,10 +4193,8 @@
 % |\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}
-                            {\msg_error:nnx {witharrows} 
-                                            {Wrong~line~specification~in~MultiArrow} 
-                                            {\x}}
-                            {\clist_gput_right:Nx \g_tmpa_clist {\x}}} 
+                            {\@@_error:nx {Wrong~line~specification~in~MultiArrow} \x }
+                            {\clist_gput_right:Nx \g_tmpa_clist \x}} 
 %    \end{macrocode}
 % We sort the list |\g_tmpa_clist| because we want to extract the minimum and the maximum.
 %    \begin{macrocode}
@@ -4189,8 +4333,8 @@
                   3 {lr}
                   4 {v}
                   5 {i}
-                  6 {group}
-                  7 {groups}}"~
+                  6 {groups}
+                  7 {group}}"~
              set~in~the~same~
              \int_case:nn\l_@@_level_int 
                   {1 {command~\token_to_str:N\WithArrowsOptions}
@@ -4214,7 +4358,7 @@
 \msg_new:nnn {witharrows}
              {Arrow~in~first~column}
              {You~should~not~use~the~command~\token_to_str:N\Arrow\
-              \tl_if_eq:NNF \l_@@_CommandName_tl \l_tmpa_tl
+              \str_if_eq:NNF \l_@@_CommandName_tl \l_tmpa_tl
                     {(renamed~in~\str_use:N \c_backslash_str
                      \tl_use:N \l_@@_CommandName_tl)~}
               ~in~the~first~column~but~only~in~the~second~column.\\
@@ -4402,6 +4546,7 @@
            \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}
@@ -4438,7 +4583,7 @@
 % 
 % \section{History}
 %
-% \subsection{Changes between versions 1.0 and 1.1}
+% \subsection*{Changes between versions 1.0 and 1.1}
 % 
 % Option for the command |\\| and option |interline|
 % 
@@ -4450,7 +4595,7 @@
 % 
 % Creation of a \textsc{dtx} file
 %
-% \subsection{Changes between versions 1.1 and 1.2}
+% \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}).
@@ -4459,18 +4604,18 @@
 %
 % Better error messages
 % 
-% \subsection{Changes between versions 1.2 and 1.3}
+% \subsection*{Changes between versions 1.2 and 1.3}
 % 
 % New options |ygap| and |ystart| for fine tuning.
 %
 % Minor bugs.
 %
-% \subsection{Changes between versions 1.3 and 1.4}
+% \subsection*{Changes between versions 1.3 and 1.4}
 % 
 % The package \pkg{footnote} is no longer loaded by default. Instead, two options |footnote| and |footnotehyper| have
 % been added. In particular, \pkg{witharrows} becomes compatible with \cls{beamer}.
 % 
-% \subsection{Changes between versions 1.4 and 1.5}
+% \subsection*{Changes between versions 1.4 and 1.5}
 % 
 % The Tikz code used to draw the arrows can be changed with the option |TikzCode|.
 %
@@ -4480,21 +4625,19 @@
 % 
 % A command |\MultiArrow| is available in |CodeAfter| to draw arrows of other shapes.
 % 
-% \subsection{Changes between versions 1.5 and 1.6}
+% \subsection*{Changes between versions 1.5 and 1.6}
 % 
 % The code has been improved to be faster and the Tikz library |calc| is no longer required.
 %
 % A new option |name| is available for the environments |{WithArrows}|.
 %
-% \subsubsection{Changes between 1.6 and 1.6.1}
+% In the version 1.6.1, correction of a bug that leads to incompatibility with |\usetikzlibrary{babel}|.
 %
-% Correction of a bug that leads to incompatibility with |\usetikzlibrary{babel}|.
+% \subsection*{Changes between 1.6.1 and 1.7}
 %
-% \subsection{Changes between 1.6.1 and 1.7}
-%
 % New environments |{DispWithArrows}| and |{DispWithArrows*}|.
 %
-% \subsection{Changes between 1.7 and 1.8}
+% \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},
@@ -4501,11 +4644,11 @@
 % \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}
+% \subsection*{Changes between 1.8 and 1.9}
 % 
 % New option |wrap-lines| for the environments |{DispWithArrows}| and |{DispWithArrows*}|.
 %
-% \subsection{Changes between 1.9 and 1.10}
+% \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.
@@ -4515,11 +4658,11 @@
 % 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}
+% \subsection*{Changes between 1.10 and 1.11}
 %
 % New commands |\WithArrowsNewStyle| and |\WithArrowsRightX|.
 %
-% \subsection{Changes between 1.11 and 1.12}
+% \subsection*{Changes between 1.11 and 1.12}
 %
 % New command |\tagnextline|.
 %
@@ -4533,7 +4676,18 @@
 % Compatibility with the packages \pkg{refcheck}, \pkg{showlabels} and \pkg{listlbls}.
 %
 % The option |\AllowLineWithoutAmpersand| is deprecated because lines without ampersands are now always allowed.
+%
+% \subsection*{Changes between 1.12 and 1.13}
+%
+% Options |start-adjust|, |end-adjust| and |adjust|.
 % 
+% This version is not stricty compatible with previous ones. To restore the behaviour of the previous versions, one
+% has to use the option |adjust| with the value $0$~pt :
+% 
+% \begin{Verbatim}
+% \WithArrowsOptions{adjust = 0pt}
+% \end{Verbatim}
+% 
 % \endinput
 %
 % Local Variables:

Modified: trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	2018-12-31 22:11:23 UTC (rev 49560)
+++ trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	2018-12-31 22:11:36 UTC (rev 49561)
@@ -18,10 +18,11 @@
 %% and version 1.3 or later is part of all distributions of
 %% LaTeX version 2005/12/01 or later.
 %% 
-\def\myfileversion{1.12}
-\def\myfiledate{2018/11/26}
+\def\myfileversion{1.13}
+\def\myfiledate{2018/12/31}
 \RequirePackage{tikz}
 \usetikzlibrary{arrows.meta,bending}
+\RequirePackage{expl3}[2018-01-01]
 \RequirePackage{l3keys2e}
 \ProvidesExplPackage
   {witharrows}
@@ -89,6 +90,7 @@
         {\msg_error:nn {witharrows} {#1}}
 \cs_new_protected:Nn \__wi_error:nn
         {\msg_error:nnn {witharrows} {#1} {#2}}
+\cs_generate_variant:Nn \__wi_error:nn {nx}
 \cs_new_protected:Nn \__wi_bool_new:N
       {\bool_if_exist:NTF #1
          {\bool_set_false:N #1}
@@ -138,7 +140,7 @@
     {\bool_if:NF \c__wi_amsmath_loaded_bool
        {\cs_set_protected:Npn \spread at equation
            {\openup\jot
-            \cs_set_protected:Npn \spread at equation {}}}}
+            \cs_set_eq:NN \spread at equation \prg_do_nothing:}}}
 \bool_new:N \l__wi_in_WithArrows_bool
 \bool_new:N \l__wi_in_DispWithArrows_bool
 \seq_new:N \g__wi_position_in_the_tree_seq
@@ -149,6 +151,7 @@
 \dim_new:N \l__wi_xoffset_dim
 \dim_set:Nn \l__wi_xoffset_dim {3mm}
 \int_new:N \l__wi_pos_arrows_int
+\int_set:Nn \l__wi_pos_arrows_int 3
 \int_new:N \l__wi_previous_pos_arrows_int
 \dim_new:N \l__wi_x_dim
 \seq_new:N \g__wi_arrow_int_seq
@@ -167,6 +170,10 @@
 \bool_new:N \l__wi_in_first_column_bool
 \bool_new:N \l__wi_initial_r_bool
 \bool_new:N \l__wi_initial_l_bool
+\dim_new:N \l__wi_start_adjust_dim
+\dim_set:Nn \l__wi_start_adjust_dim {0.4ex}
+\dim_new:N \l__wi_end_adjust_dim
+\dim_set:Nn \l__wi_end_adjust_dim {0.4ex}
 \int_set:Nn \l__wi_level_int 1
 \keys_define:nn {WithArrows/GlobalOrEnv}
    {  t   .code:n            = {\bool_if:NTF \l__wi_in_DispWithArrows_bool
@@ -192,8 +199,7 @@
                                          {Third~column~in~an~environment~{WithArrows}}
                                          {none} },
       MoreColumns .value_forbidden:n = true,
-      AllowLineWithoutAmpersand .code:n = { \msg_error:nn
-                                            {witharrows}
+      AllowLineWithoutAmpersand .code:n = { \__wi_error:n
                                             {AllowLineWithoutAmpersand}},
       AllowLineWithoutAmpersand .value_forbidden:n = true,
       CommandName .tl_set:N         = \l__wi_CommandName_tl,
@@ -210,13 +216,13 @@
       shownodenames .initial:n     = false,
       group    .code:n    = {\int_compare:nNnT \l__wi_previous_pos_arrows_int > {-1}
                                     {\__wi_error:n {Two~options~are~incompatible}}
-                             \int_set:Nn \l__wi_previous_pos_arrows_int 6
-                             \int_set:Nn \l__wi_pos_arrows_int 6} ,
+                             \int_set:Nn \l__wi_previous_pos_arrows_int 7
+                             \int_set:Nn \l__wi_pos_arrows_int 7} ,
       group    .value_forbidden:n = true,
       groups   .code:n   = {\int_compare:nNnT \l__wi_previous_pos_arrows_int > {-1}
                                    {\__wi_error:n {Two~options~are~incompatible}}
-                            \int_set:Nn \l__wi_previous_pos_arrows_int 7
-                            \int_set:Nn \l__wi_pos_arrows_int 7} ,
+                            \int_set:Nn \l__wi_previous_pos_arrows_int 6
+                            \int_set:Nn \l__wi_pos_arrows_int 6} ,
       groups   .value_forbidden:n = true,
       CodeBefore  .code:n = {\int_compare:nNnTF \l__wi_level_int = 1
                               {\__wi_error:n {Option~will~be~ignored}}
@@ -232,7 +238,7 @@
       name .value_required:n = true,
       fleqn   .code:n = {\bool_if:NTF \l__wi_in_WithArrows_bool
                              {\__wi_error:n {Option~will~be~ignored}}
-                             {\tl_if_eq:nnTF {#1} {true}
+                             {\str_if_eq:nnTF {#1} {true}
                                  {\bool_set_true:N \l__wi_fleqn_bool}
                                  {\bool_set_false:N \l__wi_fleqn_bool}}},
       fleqn   .default:n = true,
@@ -242,7 +248,7 @@
       mathindent   .value_required:n = true,
       notag   .code:n = {\bool_if:NTF \l__wi_in_WithArrows_bool
                              {\__wi_error:n {Option~will~be~ignored}}
-                             {\tl_if_eq:nnTF {#1} {true}
+                             {\str_if_eq:nnTF {#1} {true}
                                  {\clist_clear:N \l__wi_tags_clist}
                                  {\clist_set:Nn \l__wi_tags_clist {all}}}},
       notag   .default:n = true,
@@ -255,7 +261,7 @@
       AllowMultipleLabels .value_forbidden:n = true,
       wrap-lines   .code:n = {\bool_if:NTF \l__wi_in_WithArrows_bool
                                {\__wi_error:n {Option~will~be~ignored}}
-                               {\tl_if_eq:nnTF {#1} {true}
+                               {\str_if_eq:nnTF {#1} {true}
                                    {\bool_set_true:N \l__wi_wrap_lines_bool}
                                    {\bool_set_false:N \l__wi_wrap_lines_bool}}},
       wrap-lines   .default:n = true,
@@ -273,13 +279,13 @@
       tikz     .initial:n         = {},
       tikz     .value_required:n  = true,
       rr       .value_forbidden:n = true,
-      rr       .code:n            = \__wi_analyze_option_position:n 0 ,
+      rr       .code:n            = \__wi_analyze_option_position:n 3 ,
       ll       .value_forbidden:n = true,
       ll       .code:n            = \__wi_analyze_option_position:n 1 ,
       rl       .value_forbidden:n = true,
       rl       .code:n            = \__wi_analyze_option_position:n 2 ,
       lr       .value_forbidden:n = true,
-      lr       .code:n            = \__wi_analyze_option_position:n 3 ,
+      lr       .code:n            = \__wi_analyze_option_position:n 0 ,
       i        .value_forbidden:n = true,
       i        .code:n            = \__wi_analyze_option_position:n 5 ,
       xoffset  .code:n  = {\bool_if:nTF {\int_compare_p:nNn \l__wi_level_int = 3 &&
@@ -295,6 +301,13 @@
                                       {\skip_set:Nn \l__wi_interline_skip {#1}}
                                       {\__wi_error:n {Option~will~be~ignored}}} ,
       interline   .value_required:n = true,
+      start-adjust .dim_set:N = \l__wi_start_adjust_dim,
+      start-adjust .value_required:n = true,
+      end-adjust  .dim_set:N = \l__wi_end_adjust_dim,
+      end-adjust  .value_required:n = true,
+      adjust      .code:n  = {\dim_set:Nn \l__wi_start_adjust_dim {#1}
+                              \dim_set:Nn \l__wi_end_adjust_dim {#1} },
+      adjust      .value_required:n = true,
       jump    .code:n  = {\int_compare:nNnF \l__wi_level_int = 3
                              {\__wi_error:n {Option~will~be~ignored}}} ,
       unknown .code:n  = \__wi_error:n {Option~unknown}
@@ -305,13 +318,13 @@
                            {\__wi_error:n {The~option~"jump"~must~be~non~negative}}} ,
       jump  .value_required:n  = true,
       rr       .value_forbidden:n = true,
-      rr       .code:n            = \__wi_analyze_option_position:n 0 ,
+      rr       .code:n            = \__wi_analyze_option_position:n 3 ,
       ll       .value_forbidden:n = true,
       ll       .code:n            = \__wi_analyze_option_position:n 1 ,
       rl       .value_forbidden:n = true,
       rl       .code:n            = \__wi_analyze_option_position:n 2 ,
       lr       .value_forbidden:n = true,
-      lr       .code:n            = \__wi_analyze_option_position:n 3 ,
+      lr       .code:n            = \__wi_analyze_option_position:n 0 ,
       i        .value_forbidden:n = true,
       i        .code:n            = \__wi_analyze_option_position:n 5 }
 \cs_new_protected:Nn \__wi_analyze_option_position:n
@@ -373,7 +386,7 @@
            \int_set:Nn \l__wi_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__wi_footnote_bool {\savenotes}
+           \bool_if:NT \g__wi_footnote_bool \savenotes
            \l__wi_code_before_tl
            \cs_set_eq:cN \l__wi_CommandName_tl \__wi_Arrow}
 \NewDocumentEnvironment {WithArrows} {O{}}
@@ -420,18 +433,15 @@
            $\bool_if:NT \l__wi_displaystyle_bool \displaystyle {##}$
            \cr
           }
-          {\crcr
+          {\\
            \egroup
            \egroup
            \__wi_post_environment:
-           \bool_if:NT \g__wi_footnote_bool {\endsavenotes}
+           \bool_if:NT \g__wi_footnote_bool \endsavenotes
 }
 \cs_new_protected:Nn \__wi_post_environment:
           {\cs_set:Npn \WithArrowsRightX {\g__wi_right_x_dim}
-           \int_compare:nNnT \g__wi_arrow_int > 0
-                  {\int_compare:nNnTF \l__wi_pos_arrows_int > 5
-                    \__wi_draw_arrows:
-                    {\__wi_draw_arrows:nn 1 \g__wi_arrow_int}}
+           \int_compare:nNnT \g__wi_arrow_int > 0 \__wi_scan_arrows:
            \group_begin:
            \tikzset{every~picture/.style = __wi_standard}
            \cs_set:Npn \WithArrowsNbLines {\int_use:N \g__wi_line_int}
@@ -452,7 +462,7 @@
            }
 \cs_new_protected:Nn \__wi_cr:
       {\scan_stop:
-       \bool_if:NT \l__wi_in_first_column_bool {& {} }
+       \bool_if:NT \l__wi_in_first_column_bool { & {} }
        \group_align_safe_begin:
        \peek_meaning_remove:NTF * \__wi_cr_i: \__wi_cr_i:}
 \cs_new_protected:Nn \__wi_cr_i:
@@ -494,7 +504,7 @@
                  & \__wi_restore:N \l__wi_tag_star_bool
                    \__wi_restore:N \l__wi_qedhere_bool
                    \bool_if:NT \l__wi_qedhere_bool
-                         {\hbox_overlap_left:n {\__wi_qedhere_i:}}
+                         {\hbox_overlap_left:n \__wi_qedhere_i:}
                    \cs_set_eq:NN \theequation \g_tmpa_tl
                    \bool_if:NT \l__wi_tag_star_bool {\cs_set:Npn \tagform@ {}}
                    \hbox_overlap_left:n
@@ -507,7 +517,7 @@
                 {\__wi_save:N \l__wi_qedhere_bool
                  & \__wi_restore:N \l__wi_qedhere_bool
                    \bool_if:NT \l__wi_qedhere_bool
-                         {\hbox_overlap_left:n {\__wi_qedhere_i:}}
+                         {\hbox_overlap_left:n \__wi_qedhere_i:}
                    \tikz [__wi_standard] \coordinate (\int_use:N\g__wi_line_int-v)  ; }
              }
        \cr\noalign{\skip_vertical:n {#1 + \l__wi_interline_skip}
@@ -514,12 +524,10 @@
        \scan_stop:}}
 \cs_new_protected:Nn \__wi_if_in_second_col_of_disp:nn
      {\bool_if:NTF \l__wi_in_WithArrows_bool
-          {\msg_error:nnn {witharrows}
-                          {Command~not~allowed~in~{WithArrows}}
+          {\__wi_error:nn {Command~not~allowed~in~{WithArrows}}
                           {#1}}
           {\bool_if:NTF \l__wi_in_first_column_bool
-             {\msg_error:nnn {witharrows}
-                             {Command~not~allowed~in~{DispWithArrows}}
+             {\__wi_error:nn {Command~not~allowed~in~{DispWithArrows}}
                              {#1}}
              {#2}}}
 \cs_new_protected:Nn \__wi_notag:
@@ -528,7 +536,7 @@
 \NewDocumentCommand \__wi_tag {sm}
      {\__wi_if_in_second_col_of_disp:nn {\tag}
              {\tl_if_empty:NF \l__wi_tag_tl
-                   {\msg_error:nnn {witharrows} {Multiple~tags} {#2}}
+                   {\__wi_error:nn  {Multiple~tags} {#2}}
               \clist_set:Nn \l__wi_tags_clist {all}
               \bool_if:nT \c__wi_mathtools_loaded_bool
                     {\MH_if_boolean:nT {show_only_refs}
@@ -635,7 +643,7 @@
            \egroup
            \bool_if:NT \l__wi_in_DispWithArrows_bool
              {\dim_gzero_new:N \g__wi_right_x_dim
-              \dim_gset:Nn \g__wi_right_x_dim \c_max_dim
+              \dim_gset_eq:NN \g__wi_right_x_dim \c_max_dim
               \begin{tikzpicture} [__wi_standard]
               \int_step_variable:nnnNn 1 1 \g__wi_line_int \l_tmpa_int
                     {\tikz at parse@node\pgfutil at firstofone (\l_tmpa_int-v)
@@ -648,7 +656,7 @@
                     {\MH_if_boolean:nT {show_only_refs}
                           \MT_showonlyrefs_true:}
            $$
-           \bool_if:NT \g__wi_footnote_bool {\endsavenotes}
+           \bool_if:NT \g__wi_footnote_bool \endsavenotes
            \ignorespacesafterend
            }
 \NewDocumentEnvironment {DispWithArrows*} {}
@@ -655,11 +663,20 @@
      {\WithArrowsOptions{notag}
       \DispWithArrows}
      {\endDispWithArrows}
-\cs_new_protected:Nn \__wi_draw_arrows:
-  { \group_begin:
+\cs_new_protected:Nn \__wi_scan_arrows:
+                  { \group_begin:
+                    \int_compare:nNnT \l__wi_pos_arrows_int = 7
+                      { \__wi_scan_arrows_i:
+                        \int_set:Nn \l__wi_pos_arrows_int 8 }
+                    \__wi_scan_arrows_i:
+                    \group_end:}
+\cs_new_protected:Nn \__wi_scan_arrows_i:
+  {
     \int_zero_new:N \l__wi_first_arrow_of_group_int
     \int_zero_new:N \l__wi_first_line_of_group_int
     \int_zero_new:N \l__wi_last_line_of_group_int
+    \seq_clear_new:N \l__wi_first_arrows_of_group_seq
+    \seq_clear_new:N \l__wi_last_arrows_of_group_seq
     \bool_set_true:N \l__wi_new_group_bool
     \int_set:Nn \l__wi_arrow_int 1
     \int_until_do:nNnn \l__wi_arrow_int > \g__wi_arrow_int
@@ -675,10 +692,12 @@
        \int_set:Nn \l__wi_pos_of_arrow_int \l_tmpa_tl
        \int_compare:nNnTF \l__wi_final_int > \g__wi_line_int
           {\__wi_error:n {Too~few~lines~for~an~arrow}}
-          {\bool_if:nT {     \int_compare_p:nNn \l__wi_pos_arrows_int = 7
-                         && \int_compare_p:nNn \l__wi_arrow_int > 1
-                         && \int_compare_p:nNn
-                                    \l__wi_initial_int > \l__wi_last_line_of_group_int}
+          {\bool_if:nT {\int_compare_p:nNn \l__wi_arrow_int > 1
+                         &&
+                        \int_compare_p:nNn
+                              \l__wi_initial_int > \l__wi_last_line_of_group_int
+                         &&
+                        \int_compare_p:n {\l__wi_pos_arrows_int != 7}}
                  {\__wi_draw_arrows:nn \l__wi_first_arrow_of_group_int {\l__wi_arrow_int - 1}
                   \bool_set_true:N \l__wi_new_group_bool}
            \bool_if:nTF \l__wi_new_group_bool
@@ -686,17 +705,34 @@
                   \int_set:Nn \l__wi_first_arrow_of_group_int \l__wi_arrow_int
                   \int_set:Nn \l__wi_first_line_of_group_int \l__wi_initial_int
                   \int_set:Nn \l__wi_last_line_of_group_int \l__wi_final_int
-                  \dim_set:Nn \l__wi_x_dim {-\c_max_dim}
+                  \seq_clear:N \l__wi_first_arrows_of_group_seq
+                  \seq_put_left:Nx \l__wi_first_arrows_of_group_seq
+                                   {\int_use:N \l__wi_arrow_int}
+                  \seq_clear:N \l__wi_last_arrows_of_group_seq
+                  \seq_put_left:Nx \l__wi_last_arrows_of_group_seq
+                                   {\int_use:N \l__wi_arrow_int}
+                  \int_compare:nT {\l__wi_pos_arrows_int != 8}
+                      {\dim_set:Nn \l__wi_x_dim {-\c_max_dim}}
                   }
                  {\int_compare:nNnT \l__wi_pos_of_arrow_int = {-1}
-                     {\int_set:Nn \l__wi_last_line_of_group_int
-                        {\int_max:nn \l__wi_last_line_of_group_int \l__wi_final_int}}}
+                     {\int_compare:nNnT \l__wi_initial_int = \l__wi_first_line_of_group_int
+                           {\seq_put_left:Nx \l__wi_first_arrows_of_group_seq
+                                             {\int_use:N \l__wi_arrow_int}}
+                      \int_compare:nNnTF \l__wi_final_int > \l__wi_last_line_of_group_int
+                        {\int_set_eq:NN \l__wi_last_line_of_group_int \l__wi_final_int
+                         \seq_clear:N \l__wi_last_arrows_of_group_seq
+                         \seq_put_left:Nx \l__wi_last_arrows_of_group_seq
+                                          {\int_use:N \l__wi_arrow_int}}
+                        {\int_compare:nNnT \l__wi_final_int = \l__wi_last_line_of_group_int
+                           {\seq_put_left:Nx \l__wi_last_arrows_of_group_seq
+                                             {\int_use:N \l__wi_arrow_int}}}}}
            \int_compare:nNnT \l__wi_pos_of_arrow_int = {-1}
-              {\__wi_update_x_value:nn \l__wi_initial_int \l__wi_final_int} }
+              { \int_compare:nT {\l__wi_pos_arrows_int != 8}
+                   {\__wi_update_x_value:nn \l__wi_initial_int \l__wi_final_int}} }
        \int_incr:N \l__wi_arrow_int
      }
-     \__wi_draw_arrows:nn \l__wi_first_arrow_of_group_int \g__wi_arrow_int
-     \group_end:
+     \int_compare:nT {\l__wi_pos_arrows_int != 7}
+        {\__wi_draw_arrows:nn \l__wi_first_arrow_of_group_int \g__wi_arrow_int}
   }
 \cs_generate_variant:Nn \keys_set:nn {no}
 \cs_new_protected:Nn \__wi_keys_set: {\keys_set:no {WithArrows/General}}
@@ -715,15 +751,13 @@
       \prop_get:cnN {g__wi_arrow_\l__wi_prefix_str _\int_use:N\l__wi_arrow_int _prop}
                     {final} \l_tmpa_tl
       \int_set:Nn \l__wi_final_int {\l_tmpa_tl}
-      \int_compare:nNnTF \l__wi_final_int > \g__wi_line_int
-         {\int_compare:nNnT \l__wi_pos_arrows_int < 6
-               {\__wi_error:n {Too~few~lines~for~an~arrow}}}
+      \int_compare:nNnT \l__wi_final_int < {\g__wi_line_int + 1}
          \__wi_draw_arrows_i:
       \int_incr:N \l__wi_arrow_int
      }
    \group_end:
    }
-\cs_new:Nn \__wi_draw_arrows_i:
+\cs_new_protected:Nn \__wi_draw_arrows_i:
      {\group_begin:
       \int_set:Nn \l__wi_level_int 3
       \prop_get:cnN {g__wi_arrow_\l__wi_prefix_str
@@ -738,10 +772,10 @@
       \bool_set_false:N \l__wi_initial_r_bool
       \bool_set_false:N \l__wi_final_r_bool
       \int_case:nn \l__wi_pos_arrows_int
-             {0 {\bool_set_true:N \l__wi_initial_r_bool
-                 \bool_set_true:N \l__wi_final_r_bool}
+             {0 {\bool_set_true:N \l__wi_final_r_bool}
               2 {\bool_set_true:N \l__wi_initial_r_bool}
-              3 {\bool_set_true:N \l__wi_final_r_bool}}
+              3 {\bool_set_true:N \l__wi_initial_r_bool
+                 \bool_set_true:N \l__wi_final_r_bool}}
       \int_compare:nNnT \l__wi_pos_arrows_int = 5
            { \dim_set:Nn \l__wi_x_dim {-\c_max_dim}
              \__wi_update_x_value:nn \l__wi_initial_int \l__wi_final_int }
@@ -752,21 +786,34 @@
       \prop_get:cnN {g__wi_arrow_\l__wi_prefix_str _\int_use:N\l__wi_arrow_int _prop}
                     {label}
                     \l_tmpa_tl
-      \int_compare:nNnTF \l__wi_pos_arrows_int < 5
-         {\begin{tikzpicture} [__wi_standard]
-              \tikz at scan@one at point\pgfutil at firstofone(\l__wi_initial_tl)
-              \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(\l__wi_final_tl)
-              \tl_gset:Nx \g_tmpb_tl {\dim_use:N\pgf at x,\dim_use:N\pgf at y}
-          \end{tikzpicture}
-}
-         {\begin{tikzpicture} [__wi_standard]
-              \tikz at scan@one at point\pgfutil at firstofone (\l__wi_initial_tl)
-              \tl_gset:Nx \g_tmpa_tl {\dim_use:N \l__wi_x_dim , \dim_use:N \pgf at y}
-              \tikz at scan@one at point\pgfutil at firstofone (\l__wi_final_tl)
-              \tl_gset:Nx \g_tmpb_tl {\dim_use:N \l__wi_x_dim , \dim_use:N \pgf at y}
-          \end{tikzpicture}}
-      \__wi_draw_arrow:nno {\g_tmpa_tl} {\g_tmpb_tl} {\l_tmpa_tl}
+      \seq_if_in:NxTF \l__wi_first_arrows_of_group_seq {\int_use:N \l__wi_arrow_int}
+           {\bool_set_true:N \l_tmpa_bool}
+           {\bool_set_false:N \l_tmpa_bool}
+      \seq_if_in:NxTF \l__wi_last_arrows_of_group_seq {\int_use:N \l__wi_arrow_int}
+           {\bool_set_true:N \l_tmpb_bool}
+           {\bool_set_false:N \l_tmpb_bool}
+      \int_compare:nNnT \l__wi_pos_arrows_int = 5
+           {\bool_set_true:N \l_tmpa_bool
+            \bool_set_true:N \l_tmpb_bool}
+      \begin{tikzpicture} [__wi_standard]
+          \tikz at scan@one at point\pgfutil at firstofone (\l__wi_initial_tl)
+          \tl_gset:Nx \g_tmpa_tl
+               {\int_compare:nNnTF \l__wi_pos_arrows_int < 5
+                   { \dim_use:N \pgf at x }
+                   { \dim_use:N \l__wi_x_dim } ,
+                \bool_if:NTF \l_tmpa_bool
+                      { \dim_eval:n {\pgf at y + \l__wi_start_adjust_dim }}
+                      { \dim_use:N \pgf at y } }
+          \tikz at scan@one at point\pgfutil at firstofone (\l__wi_final_tl)
+          \tl_gset:Nx \g_tmpb_tl
+               {\int_compare:nNnTF \l__wi_pos_arrows_int < 5
+                   { \dim_use:N \pgf at x }
+                   { \dim_use:N \l__wi_x_dim } ,
+                \bool_if:NTF \l_tmpb_bool
+                      { \dim_eval:n {\pgf at y - \l__wi_end_adjust_dim }}
+                      { \dim_use:N \pgf at y }}
+      \end{tikzpicture}
+      \__wi_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
       \group_end: }
 \cs_new_protected:Nn \__wi_def_function_tmpa:n
     {\cs_set:Nn \__wi_tmpa:nnn
@@ -798,7 +845,7 @@
     {\int_step_inline:nnnn {#1} 1 {#2}
         {\begin{tikzpicture} [__wi_standard]
          \tikz at scan@one at point\pgfutil at firstofone (##1-l)
-         \dim_gset:Nn \g_tmpa_dim {\dim_max:nn \l__wi_x_dim \pgf at x}
+         \dim_gset:Nn \g_tmpa_dim {\dim_max:nn \l__wi_x_dim \pgf at x }
          \end{tikzpicture}
          \dim_set_eq:NN \l__wi_x_dim \g_tmpa_dim } }
 \cs_new:Npn \WithArrowsLastEnv {\int_use:N \g__wi_last_env_int}
@@ -834,9 +881,9 @@
                    2 {\bool_set_true:N \l__wi_initial_r_bool}
                    3 {\bool_set_true:N \l__wi_final_r_bool}}
            \cs_if_free:cTF {pgf at sh@ns at wa-\l__wi_prefix_str-#2-l}
-             {\msg_error:nnx {witharrows} {Wrong~line~specification~in~Arrow} {#2}}
+             {\__wi_error:nx {Wrong~line~specification~in~Arrow} {#2}}
              {\cs_if_free:cTF {pgf at sh@ns at wa-\l__wi_prefix_str-#3-l}
-                {\msg_error:nnx {witharrows} {Wrong~line~specification~in~Arrow} {#3}}
+                {\__wi_error:nx {Wrong~line~specification~in~Arrow} {#3}}
                 {\int_compare:nNnTF \l__wi_pos_arrows_int = 4
                     {\begin{tikzpicture} [__wi_standard]
                         \tikz at scan@one at point\pgfutil at firstofone(#2-l.south)
@@ -863,10 +910,8 @@
 \cs_new_protected:Nn \__wi_MultiArrow:nn
     {
      \foreach \x in {#1} {\cs_if_free:cTF {pgf at sh@ns at wa-\l__wi_prefix_str-\x-l}
-                            {\msg_error:nnx {witharrows}
-                                            {Wrong~line~specification~in~MultiArrow}
-                                            {\x}}
-                            {\clist_gput_right:Nx \g_tmpa_clist {\x}}}
+                            {\__wi_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
        {\__wi_error:n {Too~small~specification~for~MultiArrow}}
        {\clist_sort:Nn \g_tmpa_clist
@@ -951,8 +996,8 @@
                   3 {lr}
                   4 {v}
                   5 {i}
-                  6 {group}
-                  7 {groups}}"~
+                  6 {groups}
+                  7 {group}}"~
              set~in~the~same~
              \int_case:nn\l__wi_level_int
                   {1 {command~\token_to_str:N\WithArrowsOptions}
@@ -967,7 +1012,7 @@
 \msg_new:nnn {witharrows}
              {Arrow~in~first~column}
              {You~should~not~use~the~command~\token_to_str:N\Arrow\
-              \tl_if_eq:NNF \l__wi_CommandName_tl \l_tmpa_tl
+              \str_if_eq:NNF \l__wi_CommandName_tl \l_tmpa_tl
                     {(renamed~in~\str_use:N \c_backslash_str
                      \tl_use:N \l__wi_CommandName_tl)~}
               ~in~the~first~column~but~only~in~the~second~column.\\
@@ -1120,6 +1165,7 @@
            \bool_if:nT \c__wi_mathtools_loaded_bool
                     {\MH_if_boolean:nT {show_only_refs}
                           \MT_showonlyrefs_true:}
+           \bool_if:NT \g__wi_footnote_bool \endsavenotes
            \ignorespacesafterend
            }
 \NewDocumentCommand \WithArrowsNewStyle {mm}



More information about the tex-live-commits mailing list