summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/witharrows/witharrows.dtx')
-rw-r--r--Master/texmf-dist/source/latex/witharrows/witharrows.dtx1595
1 files changed, 1140 insertions, 455 deletions
diff --git a/Master/texmf-dist/source/latex/witharrows/witharrows.dtx b/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
index daefc27bc6e..cdd73303cb8 100644
--- a/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
+++ b/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
@@ -15,8 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{1.4}
-\def\myfiledate{2018/01/20}
+\def\myfileversion{1.5}
+\def\myfiledate{2018/02/12}
%
%
%<*batchfile>
@@ -46,16 +46,15 @@ version 2005/12/01 or later.
%
%<@@=wa>
%<*driver>
-\documentclass{l3doc} % load fancyvrb, amsmath, array, color, etc.
+\documentclass[dvipsnames]{l3doc} % load fancyvrb, amsmath, array, color, etc.
\usepackage{xltxtra}
\usepackage{lmodern}
\usepackage{geometry}
-\usepackage[dvipsnames]{xcolor} % color is already loaded with l3doc (?)
\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}}
\usepackage[footnotehyper]{witharrows}
\usepackage{mathtools}
\usepackage{amsfonts}
-\usepackage{stmaryrd}
+\usepackage[only,llbracket,rrbracket]{stmaryrd}
\NewDocumentEnvironment {scope} {} {} {}
\def\interitem{\vskip 7mm plus 2 mm minus 3mm}
\def\emphase#1{{\color{RoyalPurple}#1}}
@@ -68,6 +67,7 @@ version 2005/12/01 or later.
\end{document}
%</driver>
% \fi
+% \VerbatimFootnotes
% \title{The package \pkg{witharrows}\thanks{This document corresponds to the version~\myfileversion\space of \pkg{witharrows},
% at the date of~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}}
%
@@ -103,9 +103,11 @@ version 2005/12/01 or later.
% \end{WithArrows}$
%
%
+%
+%
% \medskip
% The arrow has been drawn with the command |\Arrow| on the line 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 line as in the previous exemple).
+% in the second column (the best way is to put it at the end of the second cell of the line as in the previous example).
%
%
% \section{Options for the shape of the arrows}
@@ -113,7 +115,7 @@ version 2005/12/01 or later.
% The commande |\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 \texttt{jump}. See
+% 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 lines the arrow must jump (the
% default value is, of course,~$1$).
%
@@ -174,17 +176,17 @@ version 2005/12/01 or later.
% \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 blue thick arrow.
+% example gives an thick arrow.
% %
% \begin{Verbatim}
% $\begin{WithArrows}
-% A & = (a+1)^2 \Arrow[~emphase#tikz={blue,thick}@]{we expand} \\
+% A & = (a+1)^2 \Arrow[~emphase#tikz=thick@]{we expand} \\
% & = a^2 + 2a + 1
% \end{WithArrows}$
% \end{Verbatim}
%
% $\begin{WithArrows}
-% A & = (a+1)^2 \Arrow[tikz={blue,thick}]{we expand} \\
+% A & = (a+1)^2 \Arrow[tikz=thick]{we expand} \\
% & = a^2 + 2a + 1
% \end{WithArrows}$
%
@@ -235,6 +237,10 @@ version 2005/12/01 or later.
% & = a^2 + 2a + 1
% \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}.
+%
% \interitem
% One of the most useful options is ``|text width|'' to control the width of the text associated to the arrow.
% %
@@ -299,7 +305,7 @@ version 2005/12/01 or later.
% \interitem
% Almost all the options can be given directly to the environment |{WithArrows}| (between square brackets). In this
% case, they apply to all the arrows of the environment.\footnote{They also apply to the nested environments
-% \texttt{\{WithArrows\}} with the notable exception of \texttt{interline}.}
+% |{WithArrows}| (with the logical exceptions of |interline|, |CodeBefore| and |CodeAfter|).}
% %
% \begin{Verbatim}
% $\begin{WithArrows}[~emphase#tikz=blue@]
@@ -356,13 +362,50 @@ version 2005/12/01 or later.
% & = \frac73
% \end{WithArrows}$
%
+% \interitem
+% The version 1.3 of \pkg{witharrows} give two options for a fine tuning of the arrows:
+%
+% \begin{itemize}
+% \item the option |ystart| set 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| set 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
% we want all the environments |{WithArrows}| composed in |\displaystyle| with blue arrows, we can write
% |\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{Since version 1.4 of \pkg{witharrows}, it's no longer possible
-% to give these options directly when loading the package, \emph{i.e.} with the command \texttt{\string\usepackage} in the preamble.}
+% to give these options directly when loading the package, \emph{i.e.} with the command |\usepackage| in the preamble.}
%
% \begin{Verbatim}
% ~emphase#\WithArrowsOptions{displaystyle,tikz=blue}@
@@ -393,7 +436,7 @@ version 2005/12/01 or later.
% the option \emph{without} the leading backslash.
% %
% \begin{Verbatim}
-% \newcommand{\Arrow}{\longmapsto}
+% \NewDocumentCommand {\Arrow} {} {\longmapsto}
% $\begin{WithArrows}[~emphase#CommandName=Explanation@]
% f & = \bigl(x \Arrow (x+1)^2\bigr)
% ~emphase#\Explanation{we work directly on fonctions}@\\
@@ -402,7 +445,7 @@ version 2005/12/01 or later.
% \end{Verbatim}
% %
% \begin{scope}
-% \newcommand{\Arrow}{\longmapsto}
+% \NewDocumentCommand {\Arrow} {} {\longmapsto}
% $\begin{WithArrows}[CommandName=Explanation]
% f & = \bigl(x \Arrow (x+1)^2\bigr)
% \Explanation{we work directly on fonctions}\\
@@ -412,27 +455,33 @@ version 2005/12/01 or later.
%
%
% \interitem
-% It's possible to use directly the nodes created by |{WithArrows}| with explicit Tikz instructions (in order, for
-% example, to draw something that can't be drawn with the command |\Arrow|). That's why a style for the tips of the
-% arrows has be created: |TipsOfWithArrows|. By using this style, we will have homogeneous tips for the arrows of
-% the document.
-%
-% Therefore, if we want to modify the tips of the arrows of |{WithArrows}|, we have to modify the style
-% |TipsOfWithArrows|.
+% 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
+% are avalaible only at the environment level and they are not applied to the nested environments).
% %
% \begin{Verbatim}
-% \tikzset{TipsOfWithArrows/.style= { > = {Latex[scale=1.2,bend]}} }
+% $\begin{WithArrows}[~emphase#CodeBefore = \color{blue}@]
+% A & = (a+b)^2 \Arrow{we expand} \\
+% & = a^2 + 2ab + b^2
+% \end{WithArrows}$
% \end{Verbatim}
%
-% The names of the Tikz nodes created by \pkg{witharrows} in the whole document are explained
-% p.~\pageref{NamesOfTheNodes}.
+% $\begin{WithArrows}[CodeBefore = \color{blue}]
+% A & = (a+b)^2 \Arrow{we expand} \\
+% & = a^2 + 2ab + b^2
+% \end{WithArrows}$
+%
+% \medskip
+% Special commands are available in |CodeAfter| : a command |\NbLines| which gives the number of lines 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 \texttt{shownodes} can be used to materialize the nodes. The
+% 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.}
%
@@ -582,8 +631,8 @@ version 2005/12/01 or later.
% In the environments of \pkg{amsmath} (or \pkg{mathtools}), the spacing between lines 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 \texttt{\string\jot} with the environment
-% \texttt{\{spreadlines\}} of \pkg{mathtools}.}
+% |\jot| for an 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@]
@@ -666,7 +715,7 @@ version 2005/12/01 or later.
% default with the command |\WithArrowsOptions{c}| at the beginning of the document.
% %
% \begin{Verbatim}
-% ~emphase#Et donc\enskip@
+% So\enskip
% $\begin{WithArrows}
% A & = (a+1)^2 \Arrow{we expand} \\
% & = a^2 + 2a + 1
@@ -726,8 +775,8 @@ version 2005/12/01 or later.
%
% \medskip
% The following is composed with |{WithArrows}[c,displaystyle]|. The results are stricly identical.\footnote{In
-% versions of \texttt{amsmath} older than the 5~nov.~2016, an thin space was added on the left of an environment
-% \texttt{\{aligned\}}. The new versions do not add this space and neither do \texttt{\{WithArrows\}}.}\par\nobreak
+% versions of \pkg{amsmath} older than the 5~nov.~2016, an 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\{
@@ -739,85 +788,155 @@ version 2005/12/01 or later.
% \right.$
%
%
-% \section{Examples}
+% \section{Arrows in nested environments}
%
-% \subsection{With only one column}
+% \label{NestedEnv}
%
-% 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}
-% &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}$
+% 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}@
+% \varphi(x,y)=0
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\
+% & \Leftrightarrow
+% \left\{~emphase#\begin{WithArrows}@[c]
+% x+2y & = 0 \\
+% 2x+4y & = 0
+% ~emphase#\end{WithArrows}@\right. \\
+% & \Leftrightarrow
+% \left\{~emphase#\begin{WithArrows}@[c]
+% x+2y & = 0 \Arrow[tikz=-]{the same equation}\\
+% x+2y & = 0
+% ~emphase#\end{WithArrows}@\right. \\
+% & \Leftrightarrow x+2y=0
+% ~emphase#\end{WithArrows}@$
% \end{Verbatim}
%
% $\begin{WithArrows}
-% &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
+% \varphi(x,y)=0
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\
+% & \Leftrightarrow
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \\
+% 2x+4y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \Arrow[tikz=-]{the same equation}\\
+% x+2y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow x+2y=0
% \end{WithArrows}$
%
+% \bigskip
+% However, one may want to draw an arrow between lines that are not in the same environment. For example, one may want
+% to draw the following arrow :
%
-% \subsection{MoveEqLeft}
-%
-% 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]
-% ~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13}
-% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\
-% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
-% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45
-% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
-% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
-% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} \\
+% \bigskip
+% $\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
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \\
+% 2x+4y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \\
+% x+2y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow x+2y=0
% \end{WithArrows}$
-% \end{Verbatim}
%
%
-% \medskip
-% $\begin{WithArrows}[interline=0.5ex]
-% \MoveEqLeft \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13}
-% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\
-% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
-% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45
-% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
-% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
-% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} \\
-% \end{WithArrows}$
+% \bigskip
+% 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 :
+% \begin{itemize}
+% \item a specification of the start line of the arrow ;
+% \item a specification of the end line of the arrow ;
+% \item the label of the arrow.
+% \end{itemize}
+% As usual, it's also possible to give options within square brackets before or after the three arguments. However,
+% these options are limited (see below).
+%
+% \bigskip
+% The specification of the line is constructed with the position of the concerned environment in the nesting tree,
+% followed (after an hyphen) by the number of the line.
%
+% \bigskip
+% In the previous example, there are two environments |{WithArrows}| nested in the main environment |{WithArrows}|.
%
-% \subsection{Nested environments}
+% $\begin{WithArrows}[TikzCode = {\path (#1) to node {#3} (#2) ; }]
+% \varphi(x,y)=0
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
+% & \Leftrightarrow \color{blue}
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \Arrow{environment number 1}\\
+% 2x+4y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow \color{red}
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \Arrow{environment number 2}\\
+% x+2y & = 0
+% \end{WithArrows}\right. \\
+% & \Leftrightarrow x+2y=0
+% \end{WithArrows}$
%
+% \bigskip
+% The arrow we want to draw starts in the line~$2$ of the sub-environment number~$1$ (and therefore, the
+% specification is |1-2|) and ends in the line~$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$}}@]
+% \varphi(x,y)=0
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
+% .........
+% \end{WithArrows}$
+% \end{Verbatim}
%
-% The environments |{WithArrows}| can be nested. In this case, the options given to the encompassing environment
-% applies also to the inner ones (with the notable exception of |interline|).
-% %
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% $~emphase#\begin{WithArrows}@[tikz=blue]
+% $\begin{WithArrows}[CodeAfter = {\Arrow{1-2}{2-2}{Division by $2$}}]
% \varphi(x,y)=0
-% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
% & \Leftrightarrow
-% \left\{~emphase#\begin{WithArrows}@[c]
+% \left\{\begin{WithArrows}[c]
% x+2y & = 0 \\
% 2x+4y & = 0
-% ~emphase#\end{WithArrows}@\right. \\
+% \end{WithArrows}\right. \\
% & \Leftrightarrow
-% \left\{~emphase#\begin{WithArrows}@[c]
-% x+2y & = 0 \Arrow[tikz=-]{the same équation}\\
+% \left\{\begin{WithArrows}[c]
+% x+2y & = 0 \\
% x+2y & = 0
-% ~emphase#\end{WithArrows}@\right. \\
+% \end{WithArrows}\right. \\
% & \Leftrightarrow x+2y=0
-% ~emphase#\end{WithArrows}@$
+% \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
+% meaning.
+%
+% With the option |v|, the arrow drawn is vertical to an abscissa computed with the start line and the end line
+% 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$}}]
+% \varphi(x,y)=0
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
+% .........
+% \end{WithArrows}$
% \end{Verbatim}
%
-% $\begin{WithArrows}[tikz=blue]
+% $\begin{WithArrows}[CodeAfter = {\Arrow[v]{1-2}{2-2}{Division by $2$}}]
% \varphi(x,y)=0
-% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\
+% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\
% & \Leftrightarrow
% \left\{\begin{WithArrows}[c]
% x+2y & = 0 \\
@@ -825,84 +944,222 @@ version 2005/12/01 or later.
% \end{WithArrows}\right. \\
% & \Leftrightarrow
% \left\{\begin{WithArrows}[c]
-% x+2y & = 0 \Arrow[tikz=-]{the same equation}\\
+% x+2y & = 0 \\
% x+2y & = 0
% \end{WithArrows}\right. \\
% & \Leftrightarrow x+2y=0
% \end{WithArrows}$
%
+%
+% \interitem
+% The package \pkg{witharrows} gives also another command available only in |CodeAfter| : the command
+% |\MultiArrow|. This commands draws a ``rak''. The list of the lines 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}.
%
%
-% \subsection{A loop flow}
-%
-% Here is an example with a loop flow.\par\nobreak
-% %
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% $\begin{WithArrows}[tikz={font={\tiny}}]
-% a.\;& f \text{ est continuous on } E
-% \Arrow{(1)}\Arrow[tikz=<-,jump=4,xoffset=1cm]{(5)}\\
-% b.\;& f \text{ est continuous in } 0
-% \Arrow{(2)}\\
-% c.\;& f \text{ is bounded on the unit sphere}
-% \Arrow{(3)}\\
-% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\|
-% \Arrow{(4)}\\
-% e.\;& f \text{ is lipschitzian}
+% \begin{Verbatim}
+% $\begin{WithArrows}[tikz = rounded corners,
+% CodeAfter = {~emphase#\MultiArrow{1,...,4}{text}@}]
+% A & = B \\
+% & = C \\
+% & = D \\
+% & = E \\
+% & = F
% \end{WithArrows}$
% \end{Verbatim}
-%
-% $\begin{WithArrows}[tikz={font={\tiny}}]
-% a.\;& f \text{ est continuous on } E
-% \Arrow{(1)}\Arrow[tikz=<-,jump=4,xoffset=1cm]{(5)}\\
-% b.\;& f \text{ est continuous in } 0
-% \Arrow{(2)}\\
-% c.\;& f \text{ is bounded on the unit sphere}
-% \Arrow{(3)}\\
-% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\|
-% \Arrow{(4)}\\
-% e.\;& f \text{ is lipschitzian}
+%
+%
+% $\begin{WithArrows}[tikz = rounded corners,
+% CodeAfter = {\MultiArrow{1,...,4}{text}}]
+% A & = B \\
+% & = C \\
+% & = D \\
+% & = E \\
+% & = F
% \end{WithArrows}$
%
+% \medskip
+% As of now, there is no option available for the command |\MultiArrow| (maybe in a future release).
+%
+%
+% \bigskip
+% \section{Arrows from outside environments WithArrows}
+%
+% If someone wants to draw arrows from outside the environments |{WithArrows}|, he can use the Tikz nodes created
+% in the environments.
+%
+% The Tikz name of a node created by \pkg{witharrows} is prefixed by |wa-|. Then, we have a list of numbers which
+% give the position in the nesting tree and the number of the line 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.}
+%
+% \medskip
+% \[\begin{WithArrows}[shownodes,shownodenames]
+% A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\
+% & \vartriangleleft \left\{
+% \begin{WithArrows}[c]
+% C & \vartriangleleft D \\
+% E & \vartriangleleft F
+% \end{WithArrows}
+% \right. \\
+% & \vartriangleleft
+% \left\{
+% \begin{WithArrows}[c]
+% G & \vartriangleleft H+H+H+H+H+H+H \\
+% I & \vartriangleleft
+% \left\{
+% \begin{WithArrows}
+% J &\vartriangleleft K \\
+% L &\vartriangleleft M
+% \end{WithArrows}
+% \right.
+% \end{WithArrows}
+% \right. \\
+% & \vartriangleleft
+% \left\{
+% \begin{WithArrows}[c]
+% N & \vartriangleleft O \\
+% P & \vartriangleleft Q
+% \end{WithArrows}
+% \right.
+% \end{WithArrows}\]
+%
+% \medskip
+% The package \pkg{witharrows} provides some tools to use directly these nodes :
+% \begin{itemize}
+% \item the command |\WithArrowsLastEnv| gives the number of the last environment of level~$0$ ;
%
-% \subsection{Automatic numerotation}
+% \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}.} ;
%
-% The option |font| of Tikz contains in fact a list of tokens which will be placed at the beginning of the text.
-% These tokens can be true commands for a change of font (like |\bfseries| or |\sffamily|) but can also be, in
-% fact, any TeX command.
+% \item the Tikz style |WithArrows/arrow/tips| is the style for the style of the arrow (loaded by |WithArrows/arrow|).
+% \end{itemize}
%
-% In the following example, the argument of |font| is the token list |\tiny\counter| where |\counter| is a command
-% which increments a counter previously defined and displays its new value. Thus, the arrows are automatically
-% numbered.
-% %
-% \begin{Verbatim}[formatcom=\small\color{gray}]
-% \newcounter{MyCounter}
-% \newcommand{\counter}{\stepcounter{MyCounter}\theMyCounter.}
-% $\begin{WithArrows}[tikz={~emphase#font={\tiny\counter}@}]
-% A(x)
-% & = B(x) \Arrow{} \\
-% & = C(x) \Arrow{} \\
-% & = C(x) \Arrow{} \\
-% & = E(x) \Arrow{} \\
-% & = F(x) \Arrow{} \\
-% & = G(x)
-% \end{WithArrows}$
+% For example, we can draw an arrow from \texttt{wa-\WithArrowsLastEnv-2-1-2-r.south} to
+% \texttt{wa-\WithArrowsLastEnv-3-2-r.north} with the following Tikz command.
+%
+% \begin{Verbatim}
+% \begin{tikzpicture}[remember picture,overlay]
+% \draw [WithArrows/arrow]
+% ($(wa-\WithArrowsLastEnv-2-1-2-r.south)+(3mm,0)$)
+% to ($(wa-\WithArrowsLastEnv-3-2-r.north)+(3mm,0)$) ;
+% \end{tikzpicture}
% \end{Verbatim}
%
-% \begin{scope}
-% \newcounter{MyCounter}
-% \newcommand{\counter}{\stepcounter{MyCounter}\theMyCounter.}
-% $\begin{WithArrows}[tikz={font={\tiny\counter}}]
-% A(x)
-% & = B(x) \Arrow{} \\
-% & = C(x) \Arrow{} \\
-% & = C(x) \Arrow{} \\
-% & = E(x) \Arrow{} \\
-% & = F(x) \Arrow{} \\
-% & = G(x)
-% \end{WithArrows}$
-% \end{scope}
+% \[\begin{WithArrows}
+% A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\
+% & \vartriangleleft \left\{
+% \begin{WithArrows}[c]
+% C & \vartriangleleft D \\
+% E & \vartriangleleft F
+% \end{WithArrows}
+% \right. \\
+% & \vartriangleleft
+% \left\{
+% \begin{WithArrows}[c]
+% G & \vartriangleleft H+H+H+H+H+H+H \\
+% I & \vartriangleleft
+% \left\{
+% \begin{WithArrows}
+% J &\vartriangleleft K \\
+% L &\vartriangleleft M
+% \end{WithArrows}
+% \right.
+% \end{WithArrows}
+% \right. \\
+% & \vartriangleleft
+% \left\{
+% \begin{WithArrows}[c]
+% N & \vartriangleleft O \\
+% P & \vartriangleleft Q
+% \end{WithArrows}
+% \right.
+% \end{WithArrows}\]
%
-% \section{Footnotes in the environment WithArrows}
+% \begin{tikzpicture}[remember picture,overlay]
+% \draw [WithArrows/arrow]
+% ($(wa-\WithArrowsLastEnv-2-1-2-r.south)+(3mm,0)$)
+% to ($(wa-\WithArrowsLastEnv-3-2-r.north)+(3mm,0)$) ;
+% \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.
+%
+%
+%
+% \section{Advanced features}
+%
+%
+% \subsection{The option TikzCode : how to change the shape of the arrows}
+%
+% \label{TikzCode}
+%
+% The option |TikzCode| allows the user to change the shape of the arrow.
+%
+% \smallskip
+% The value of this option must be an valid Tikz drawing instruction (with the final semi-colon) with three markers
+% |#1|, |#2| and |#3| for the start point, the end point and the label of the arrow.
+%
+% \bigskip
+% By default, the value is the following :
+%
+% \smallskip
+% \qquad \verb|\draw (#1) to node {#3} (#2) ;|
+%
+%
+% \bigskip
+% In the following example, we replace this default path by a path with three segments (and the node overwriting
+% the second segment).
+% \begin{Verbatim}
+% \begin{WithArrows}[ygap=5pt,interline=4mm,
+% ~emphase#TikzCode = {\draw[rounded corners]@
+% ~emphase# (~#1) -- ($(~#1) + (5mm,0)$)@
+% ~emphase# -- node[circle,@
+% ~emphase# draw,@
+% ~emphase# auto = false,@
+% ~emphase# fill = gray!50,@
+% ~emphase# inner sep = 1pt] {\tiny ~#3}@
+% ~emphase# ($(~#2) + (5mm,0)$)@
+% ~emphase# -- (~#2) ; }@]
+% E & \Longleftrightarrow 3 (2x+4) = 6 \Arrow{$\div 3$} \\
+% & \Longleftrightarrow 2x+4 = 2 \Arrow{$-4$} \\
+% & \Longleftrightarrow 2x = -2 \Arrow{$\div 2$} \\
+% & \Longleftrightarrow 2x = -1
+% \end{WithArrows}
+% \end{Verbatim}
+%
+%
+% \[\begin{WithArrows}[ygap=5pt,
+% interline=4mm,
+% TikzCode = {\draw[rounded corners]
+% (#1)
+% --
+% ($(#1) + (5mm,0)$)
+% -- node[circle,
+% draw,
+% auto=false,
+% fill=gray!50,
+% inner sep = 1pt] {\tiny #3}
+% ($(#2) + (5mm,0)$)
+% --
+% (#2) ; }]
+% E & \Longleftrightarrow 3 (2x+4) = 6
+% \Arrow{$\div 3$}\\
+% & \Longleftrightarrow 2x+4 = 2
+% \Arrow{$-4$}\\
+% & \Longleftrightarrow 2x = -2
+% \Arrow{$\div 2$} \\
+% & \Longleftrightarrow 2x = -1
+% \end{WithArrows}\]
+%
+% \bigskip
+% \subsection{Footnotes in the environment WithArrows}
%
% If you want to put footnotes in an environment |{WithArrows}|, you can use a pair
% |\footnotemark|--|\footnotetext|.
@@ -935,106 +1192,283 @@ version 2005/12/01 or later.
% \Arrow{We expand\,\footnote{A footnote.}} \\
% & = a^2+b^2+2ab
% \end{WithArrows}$
-%
-%\section{Fine tuning}
%
-% The version 1.3 of \pkg{witharrows} give two new options for a fine tuning of the arrows:
-%
-% \begin{itemize}
-% \item the option |ystart| set 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| set the vertical distance between two consecutive arrows (default value: 0.4~ex).
-% \end{itemize}
%
-% These options can be set at the document level or at the environment level.
+% \section{Examples}
+%
+% \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.
+% %
+% \begin{Verbatim}
+% $\begin{WithArrows}
+% &f(x) \ge g(x) \Arrow{by squaring both sides} \\
+% & f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\
+% & f(x)^2 - g(x)^2 \ge 0
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% $\begin{WithArrows}
+% &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}$
%
% \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)
+% \subsection{MoveEqLeft}
+%
+% 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]
+% ~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13}
+% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\
+% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
+% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45
+% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
+% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
+% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} \\
% \end{WithArrows}$
+% \end{Verbatim}
%
-% \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}
+%
+% \medskip
+% $\begin{WithArrows}[interline=0.5ex]
+% \MoveEqLeft \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13}
+% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\
+% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\
+% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45
+% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\
+% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2}
+% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} \\
+% \end{WithArrows}$
%
%
% \bigskip
-% \emph{Remark}: It's also possible to use the options ``|shorten <|'' and ``|shorten >|'' of Tikz (via the option
-% |tikz| of \pkg{witharrows}).
+% \subsection{Modifying the shape of the nodes}
%
-% \section{An technical remark about the names 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.
%
-% \label{NamesOfTheNodes}
-%
-% Environments |{WithArrows}| can be nested, and, therefore, we have a ``nesting tree'' for the environments
-% |{WithArrows}| of the whole document. This nesting tree is used to give a unique name to each node in the
-% document.
+% \begin{Verbatim}
+% \begin{WithArrows}[%
+% interline = 4mm,
+% tikz = {~emphase#every node/.style = {circle,@
+% ~emphase# draw,@
+% ~emphase# auto = false,@
+% ~emphase# fill = gray!50,@
+% ~emphase# inner sep = 1pt,@
+% ~emphase# font = \tiny}@}]
+% E & \Longleftrightarrow 3 (2x+4) = 6
+% \Arrow{$\div 3$}\\
+% & \Longleftrightarrow 2x+4 = 2
+% \Arrow{$-4$}\\
+% & \Longleftrightarrow 2x = -2
+% \Arrow{$\div 2$} \\
+% & \Longleftrightarrow 2x = -1
+% \end{WithArrows}
+% \end{Verbatim}
+%
+% \[\begin{WithArrows}[%
+% interline = 4mm,
+% tikz = {every node/.style = {circle,
+% draw,
+% auto = false,
+% fill = gray!50,
+% inner sep = 1pt,
+% font = \tiny}}]
+% E & \Longleftrightarrow 3 (2x+4) = 6
+% \Arrow{$\div 3$}\\
+% & \Longleftrightarrow 2x+4 = 2
+% \Arrow{$-4$}\\
+% & \Longleftrightarrow 2x = -2
+% \Arrow{$\div 2$} \\
+% & \Longleftrightarrow 2x = -1
+% \end{WithArrows}\]
+%
+%
+% \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.
%
-% \smallskip
-% 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 number of the line 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 \texttt{shownodenames} to show the names of these nodes.}
+% 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 line, the end line 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
+% draw the arrow itself and the second puts the label in a Tikz node in the rectangle delimited by the arrow.
+%
+% \begin{Verbatim}
+% $\begin{WithArrows}[
+% displaystyle,
+% ygap = 2mm,
+% ystart = 0mm,
+% ~emphase#TikzCode = {\path[draw] (~#1) -- ++(4.5cm,0) |- (~#2) ;@
+% ~emphase# \path (~#1) -- (~#2) @
+% ~emphase# node[text width = 4.2cm, right, midway] {~#3} ;}@]
+% S_n
+% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr)
+% ...........
+% \end{Verbatim}
+%
+%
+% \bigskip
+% $\begin{WithArrows}[
+% displaystyle,
+% ygap = 2mm,
+% ystart = 0mm,
+% TikzCode = {\path[draw] (#1) -- ++(4.5cm,0) |- (#2) ;
+% \path (#1) -- (#2)
+% node[text width = 4.2cm, right, midway] {#3} ;}]
+% S_n
+% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr)
+% \Arrow{$\cos x = \Re(e^{ix})$}\\
+% & = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right)
+% \Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\
+% & = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right)
+% \Arrow{$\exp$ is a morphism for $\times$ et $+$} \\
+% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right)
+% \Arrow{sum of terms of a geometric progression of ratio $e^{i\frac{2\pi}n}$}\\
+% & = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\
+% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right)
+% \end{WithArrows}$
+%
+% \bigskip
+% \subsubsection{Example 2}
%
-% \medskip
-% \[\begin{WithArrows}[shownodes,shownodenames]
-% A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\
-% & \vartriangleleft \left\{
-% \begin{WithArrows}[c]
-% C & \vartriangleleft D \\
-% E & \vartriangleleft F
-% \end{WithArrows}
-% \right. \\
-% & \vartriangleleft
-% \left\{
-% \begin{WithArrows}[c]
-% G & \vartriangleleft H+H+H+H+H+H+H \\
-% I & \vartriangleleft
-% \left\{
-% \begin{WithArrows}
-% J &\vartriangleleft K \\
-% L &\vartriangleleft M
-% \end{WithArrows}
-% \right.
-% \end{WithArrows}
-% \right. \\
-% & \vartriangleleft
-% \left\{
-% \begin{WithArrows}[c]
-% N & \vartriangleleft O \\
-% P & \vartriangleleft Q
+% In the following example, we change the shape of the arrow depending on wether the start line is longer than the
+% end line or not.
+%
+% \begin{Verbatim}
+% \begin{WithArrows}[ll,interline=5mm,xoffset=5mm,
+% ~emphase#TikzCode = {\draw[rounded corners,@
+% ~emphase# every node/.style = {circle,@
+% ~emphase# draw,@
+% ~emphase# auto = false,@
+% ~emphase# inner sep = 1pt,@
+% ~emphase# fill = gray!50,@
+% ~emphase# font = \tiny }]@
+% ~emphase# let \p1 = (~#1),@
+% ~emphase# \p2 = (~#2)@
+% ~emphase# in \ifdim \x1 > \x2@
+% ~emphase# (\p1) -- node {~#3} (\x1,\y2) -- (\p2)@
+% ~emphase# \else@
+% ~emphase# (\p1) -- (\x2,\y1) -- node {~#3} (\p2)@
+% ~emphase# \fi ;}@]
+% E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7
+% \Arrow{$\times 15$}\\
+% & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\
+% & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\
+% & \Longleftrightarrow 20x+29 = 105
+% \Arrow{$-29$}\\
+% & \Longleftrightarrow 20x = 76
+% \Arrow{$\div 20$}\\
+% & \Longleftrightarrow x = \frac{38}{10}
% \end{WithArrows}
-% \right.
+% \end{Verbatim}
+%
+%
+% \[\begin{WithArrows}[ll,interline=5mm,xoffset=5mm,
+% TikzCode = {\draw[rounded corners,
+% every node/.style = {circle,
+% draw,
+% auto = false,
+% inner sep = 1pt,
+% fill = gray!50,
+% font = \tiny}]
+% let \p1 = (#1),
+% \p2 = (#2)
+% in \ifdim \x1 > \x2
+% (\p1) -- node {#3} (\x1,\y2) -- (\p2)
+% \else
+% (\p1) -- (\x2,\y1) -- node {#3} (\p2)
+% \fi ;}]
+% E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7
+% \Arrow{$\times 15$}\\
+% & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\
+% & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\
+% & \Longleftrightarrow 20x+29 = 105
+% \Arrow{$-29$}\\
+% & \Longleftrightarrow 20x = 76
+% \Arrow{$\div 20$}\\
+% & \Longleftrightarrow x = \frac{38}{10}
% \end{WithArrows}\]
%
+%
+%
+% \subsection{Automatic numbered loop}
+%
+% Assume we want to draw a loop of numbered arrows. In this purpose, it's possible to write a dedicated command
+% |\NumberedLoop| which will do the job when used in |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 {}
+% {\foreach \j in {2,...,\NbLines}
+% { \pgfmathtruncatemacro{\i}{\j-1}
+% \Arrow[rr]{\i}{\j}{\i} }
+% \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\NbLines}{\NbLines}}
+% \end{Verbatim}
+%
+% The command |\NbLines| is a command available in |CodeAfter| which gives the total number of lines of the current
+% environment (it's a command and not a counter).
+%
+%
+% \bigskip
+% \begin{Verbatim}
+% $\begin{WithArrows}[~emphase#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} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian}
+% \end{WithArrows}$
+% \end{Verbatim}
+%
+% \bigskip
+% \begin{scope}
+% \NewDocumentCommand \NumberedLoop {}
+% {\foreach \j in {2,...,\NbLines}
+% { \pgfmathtruncatemacro{\i}{\j-1}
+% \Arrow[rr]{\i}{\j}{\i} }
+% \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\NbLines}{\NbLines}}
+%
+%
+% $\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} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian}
+% \end{WithArrows}$
+%
+%
% \bigskip
-% The command |\WithArrowsLastEnv| gives the number of the last environment of level~$0$. For example, we can draw
-% an arrow from the node \texttt{wa-\WithArrowsLastEnv-1} to the node \texttt{wa-\WithArrowsLastEnv-2-1} with the
-% following Tikz command.\footnote{The command \texttt{\string\WithArrowsLastEnv} is \emph{fully expandable} and
-% thus, can be used directly in the name of a Tikz node.}
+% 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 and to have, for example, numbers in parenthesis, the best way is to change the value
+% of |TikzCode|:
%
% \begin{Verbatim}
-% \begin{tikzpicture}[remember picture,overlay,->,TipsOfWithArrows]
-% \draw (wa-\WithArrowsLastEnv-1-r) to (wa-\WithArrowsLastEnv-2-1-r) ;
-% \end{tikzpicture}
+% TikzCode = {\draw (~#1) to node {\footnotesize (~#3)} (~#2) ;}}
% \end{Verbatim}
%
+% \WithArrowsOptions{TikzCode = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}}
+%
+% $\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} \\
+% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\
+% e.\;& f \text{ is lipschitzian}
+% \end{WithArrows}$
+%
+% \end{scope}
%
% \section{Implementation}
%
@@ -1063,12 +1497,13 @@ version 2005/12/01 or later.
%
% \bigskip
% The package \pkg{xparse} will be used to define the environment |{WithArrows}| and the document-level commands
-% (|\Arrow|, |\WithArrowsOptions| and |\WithArrowsLastEnv|).
+% |\Arrow| and |\WithArrowsOptions|.
% \begin{macrocode}
\RequirePackage{xparse}
% \end{macrocode}
%
-% \subsection{The packages footnote and footnotehyper }
+% \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:
@@ -1138,16 +1573,11 @@ version 2005/12/01 or later.
%
% \medskip
% \begin{macrocode}
-\cs_new_protected:Nn \@@_test_beamer:n
- {\@ifclassloaded {beamer}
+\bool_if:NT \g_@@_footnote_bool
+ {\@ifclassloaded {beamer}
{\msg_fatal:nn {witharrows}
{Option~incompatible~with~Beamer}}
- {} }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\bool_if:NT \g_@@_footnote_bool
- {\@@_test_beamer:n {footnote}
+ {}
\@ifpackageloaded{footnotehyper}
{\msg_fatal:nn {witharrows}
{footnote~with~footnotehyper~package}}
@@ -1157,7 +1587,10 @@ version 2005/12/01 or later.
%
% \begin{macrocode}
\bool_if:NT \g_@@_footnotehyper_bool
- {\@@_test_beamer:n {footnotehyper}
+ {\@ifclassloaded {beamer}
+ {\msg_fatal:nn {witharrows}
+ {Option~incompatible~with~Beamer}}
+ {}
\@ifpackageloaded{footnote}
{\msg_fatal:nn {witharrows}
{footnotehyper~with~footnote~package}}
@@ -1165,33 +1598,53 @@ version 2005/12/01 or later.
\usepackage{footnotehyper}
\bool_gset_true:N \g_@@_footnote_bool}
% \end{macrocode}
-% The flag |\g_@@_footnote_bool| has been set to |true| and so, we will only have to test
-% |\g_@@_footnote_bool| in order to known if we have to insert an environnement |{savenotes}| (see the definition
-% of environnement |{WithArrows}|).
+% 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}| (see the definition of environnement |{WithArrows}|).
%
+% \bigskip
% \subsection{Some technical definitions}
%
% We define a Tikz style |@@_node_style| for the nodes that will be created in the |\halign|. The 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={
+\tikzset{@@_node_style/.style= {
above = \l_@@_ystart_dim,
inner~sep = 0 pt,
minimum~width = 0pt,
minimum~height = \l_@@_ygap_dim,
red,
- \bool_if:NT \l_@@_shownodes_bool {draw}}}
+ \bool_if:NT \l_@@_shownodes_bool {draw} }}
% \end{macrocode}
% The color of the nodes is red, but in fact, the nodes will be drawn only when the option |shownodes| is used
% (this option is useful for debugging).
%
+%
+% \bigskip
+% The style |@@_standard| is load in standard in the |{tikzpicture}| we need. The names of the nodes are prefixed by
+% |wa| (by security) but also by a prefix which is the position-in-the-tree of the nested environments.
+% \begin{macrocode}
+\tikzset{@@_standard/.style= { remember~picture,
+ overlay,
+ name~prefix = wa-\l_@@_prefix_str- }}
+% \end{macrocode}
+%
% \bigskip
% We also define a style for the tips of arrow. The final user of the extension \pkg{witharrows} will use this
% style if he wants to draw an arrow directly with a Tikz command in his document (probably using the Tikz nodes
% created by |{WithArrows}| in the |\halign|).
% \begin{macrocode}
-\tikzset{TipsOfWithArrows/.style= { > = {Straight~Barb[scale=1.2,bend]}} }
+\tikzset{WithArrows/arrow/tips/.style = { > = {Straight~Barb[scale=1.2,bend]} }}
+% \end{macrocode}
+%
+% \bigskip
+% \begin{macrocode}
+\tikzset{WithArrows/arrow/.style = { align = left,
+ auto = left,
+ font = {\small\itshape},
+ WithArrows/arrow/tips,
+ bend~left = 45,
+ -> }}
% \end{macrocode}
%
% \bigskip
@@ -1211,6 +1664,7 @@ version 2005/12/01 or later.
% with nested environments.
%
%
+% \bigskip
% \subsection{Variables}
%
% The following sequence is the position of the last environment |{WithArrows}| in the tree of the nested
@@ -1247,15 +1701,22 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% The integer |\l_@@_pos_arrows_int| indicates the position of the arrows with the following code:
+% \begin{macrocode}
+\dim_new:N \l_@@_xoffset_dim
+\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).
%
% \begin{center}
% \setlength{\extrarowheight}{2pt}
-% \begin{tabular}{|l|c|c|c|c|c|c|c|}
+% \begin{tabular}{|l|c|c|c|c|c|c|c|c|}
% \hline
-% option & |rr| & |ll| & |rl| & |lr| & |i| & |group| & |groups| \\
+% option & |rr| & |ll| & |rl| & |lr| & |v| & |i| & |group| & |groups| \\
% \hline
-% |\l_@@_pos_arrows_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ \\
+% |\l_@@_pos_arrows_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ & $7$ \\
% \hline
% \end{tabular}
% \end{center}
@@ -1274,59 +1735,13 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% The gap between two consecutive arrows.
-% \begin{macrocode}
-\dim_new:N \l_@@_ygap_dim
-\dim_set:Nn \l_@@_ygap_dim {0.4 ex}
-% \end{macrocode}
-%
-% \bigskip
-% The vertical position of the starting point of an arrow.
-% \begin{macrocode}
-\dim_new:N \l_@@_ystart_dim
-\dim_set:Nn \l_@@_ystart_dim {0.4 ex}
-% \end{macrocode}
-%
-%
-% \bigskip
-% The following dimension is the value of the translation of the whole arrow to the right (of course, it's a
-% dimension and not a skip).
-% \begin{macrocode}
-\dim_new:N \l_@@_xoffset_dim
-\dim_set:Nn \l_@@_xoffset_dim {3mm}
-% \end{macrocode}
-%
-% \bigskip
-% If the following flag is raised, the nodes will be drawn in red (useful for debugging).
-% \begin{macrocode}
-\bool_new:N \l_@@_shownodes_bool
-% \end{macrocode}
-%
-% \bigskip
-% If the following flag is raised, the name of the ``right nodes'' will be shown in the document (useful for
-% debugging).
-% \begin{macrocode}
-\bool_new:N \l_@@_shownodenames_bool
-% \end{macrocode}
-%
-% \bigskip
-% If the following flag is raised, the elements of the |\halign| will be composed with |\displaystyle|:
-% \begin{macrocode}
-\bool_new:N \l_@@_displaystyle_bool
-% \end{macrocode}
-%
-% \bigskip
-% The following token list variable will contains the Tikz options used to draw the arrows.
-% \begin{macrocode}
-\tl_clear_new:N \l_@@_options_tikz_tl
-% \end{macrocode}
%
% 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 |\g_@@_x_dim| will be used to compute the $x$-value for some vertical arrows when one of the
-% options |i|, |group| and |groups| (values 4, 5 and 6 of |\l_@@_pos_arrows_int|) is used.
+% options |i|, |group| and |groups| (values 5, 6 and 7 of |\l_@@_pos_arrows_int|) is used.
% \begin{macrocode}
\dim_new:N \g_@@_x_dim
% \end{macrocode}
@@ -1354,13 +1769,15 @@ version 2005/12/01 or later.
\int_new:N \g_@@_line_bis_int
% \end{macrocode}
%
+% \bigskip
% \subsection{The definition of the options}
+%
% There are four levels where options can be set:
% \begin{itemize}
% \item in the options of the |\usepackage|: this level will be called \emph{package} level (number~$0$);
% \item with |\WithArrowsOptions{...}|: this level will be called \emph{global} level (number~$1$);
% \item with |\begin{WithArrows}[...]|: this level will be called \emph{environment} level (number~$2$);
-% \item with |\Arrow[...]|: this level will be called \emph{local} level (number~$3$).
+% \item with |\Arrow[...]| (included in |CodeAfter|): this level will be called \emph{local} level (number~$3$).
% \end{itemize}
%
% \bigskip
@@ -1380,11 +1797,11 @@ version 2005/12/01 or later.
% stored in the variable |\l_@@_pos_env_int|.
% \begin{macrocode}
\keys_define:nn {WithArrows/GlobalOrEnv}
- { t .code:n = {\int_set:Nn \l_@@_pos_env_int 0},
+ { 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 .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 .code:n = \int_set:Nn \l_@@_pos_env_int 2,
b .value_forbidden:n = true,
% \end{macrocode}
%
@@ -1393,13 +1810,15 @@ version 2005/12/01 or later.
% \begin{macrocode}
ygap .dim_set:N = \l_@@_ygap_dim,
ygap .value_required:n = true,
+ ygap .initial:n = 0.4 ex,
% \end{macrocode}
%
% \bigskip
-% The vertical position of the starting point of an arrow.
+% 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
@@ -1414,20 +1833,29 @@ version 2005/12/01 or later.
% If the user wants to give a new name to the |\Arrow| command (and the name |\Arrow| remains free).
% \begin{macrocode}
CommandName .tl_set:N = \l_@@_CommandName_tl,
- CommandName .initial:n = {Arrow},
+ CommandName .initial:n = Arrow ,
CommandName .value_required:n = true,
% \end{macrocode}
%
% \bigskip
+% \begin{macrocode}
+ TikzCode .tl_set:N = \l_@@_tikz_code_tl,
+ TikzCode .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+ TikzCode .value_required:n = true,
+% \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 .bool_set:N = \l_@@_shownodes_bool,
+ shownodes .initial:n = false,
% \end{macrocode}
%
% \bigskip
@@ -1435,6 +1863,7 @@ version 2005/12/01 or later.
% for debugging).
% \begin{macrocode}
shownodenames .bool_set:N = \l_@@_shownodenames_bool,
+ shownodenames .initial:n = false,
% \end{macrocode}
%
% \bigskip
@@ -1444,36 +1873,56 @@ version 2005/12/01 or later.
group .code:n = {\int_compare:nNnT \l_@@_previous_pos_arrows_int > {-1}
{\msg_error:nn {witharrows}
{Two~options~are~incompatible}}
- \int_set:Nn \l_@@_previous_pos_arrows_int 5
- \int_set:Nn \l_@@_pos_arrows_int 5},
+ \int_set:Nn \l_@@_previous_pos_arrows_int 6
+ \int_set:Nn \l_@@_pos_arrows_int 6} ,
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 an other option of position like |ll|, |lr|, etc.
+% the option |group| or |groups| is used, it's not possible to another option of position like |ll|, |lr|, etc.
% for a individual key.
% \begin{macrocode}
groups .code:n = {\int_compare:nNnT \l_@@_previous_pos_arrows_int > {-1}
{\msg_error:nn {witharrows}
{Two~options~are~incompatible}}
- \int_set:Nn \l_@@_previous_pos_arrows_int 6
- \int_set:Nn \l_@@_pos_arrows_int 6},
- groups .value_forbidden:n = true}
+ \int_set:Nn \l_@@_previous_pos_arrows_int 7
+ \int_set:Nn \l_@@_pos_arrows_int 7} ,
+ 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}|).
+% \begin{macrocode}
+ CodeBefore .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
+ {\msg_error:nn {witharrows} {Option~will~be~ignored}}
+ {\tl_put_right:Nn \l_@@_code_before_tl {#1}}} ,
% \end{macrocode}
%
+% \bigskip
+% The option |CodeAfter| gives a code that is executed at the end of the environment |{WithArrows}| (after the
+% eventual |\end{savenotes}|).
+% \begin{macrocode}
+ CodeAfter .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
+ {\msg_error:nn {witharrows} {Option~will~be~ignored}}
+ {\tl_put_right:Nn \l_@@_code_after_tl {#1}}} ,
+ unknown .code:n = \msg_error:nn {witharrows} {Option~unknown}
+ }
+% \end{macrocode}
%
%
% \bigskip
-% Then we define the main module called |WithArrows| which will be loaded at all the levels.
+% 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).
% \begin{macrocode}
-\keys_define:nn {WithArrows}
- {tikz .code:n = {\tl_put_right:Nn \l_@@_options_tikz_tl {,#1}},
+\keys_define:nn {WithArrows/General}
+ {tikz .code:n = \tikzset {WithArrows/arrow/.append~style = {#1}},
+ tikz .initial:n = {},
tikz .value_required:n = true,
% \end{macrocode}
%
@@ -1482,27 +1931,30 @@ version 2005/12/01 or later.
% |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 0 ,
ll .value_forbidden:n = true,
- ll .code:n = {\@@_analyze_option_position:n 1},
+ ll .code:n = \@@_analyze_option_position:n 1 ,
rl .value_forbidden:n = true,
- rl .code:n = {\@@_analyze_option_position:n 2},
+ 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 3 ,
i .value_forbidden:n = true,
- i .code:n = {\@@_analyze_option_position:n 4},
+ 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.
+% 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.
+%
% \begin{macrocode}
xoffset .code:n = {\bool_if:nTF {\int_compare_p:nNn \l_@@_level_int = 3 &&
- \int_compare_p:nNn \l_@@_pos_arrows_int > 4}
+ \int_compare_p:nNn \l_@@_pos_arrows_int > 5}
{\msg_error:nn {witharrows}
{Option~incompatible~with~"group(s)"}}
- {\dim_set:Nn \l_@@_xoffset_dim {#1}}},
+ {\dim_set:Nn \l_@@_xoffset_dim {#1}}} ,
xoffset .value_required:n = true,
% \end{macrocode}
%
@@ -1513,7 +1965,8 @@ version 2005/12/01 or later.
% \begin{macrocode}
jot .code:n = {\int_compare:nNnTF \l_@@_level_int = 2
{\dim_set:Nn \jot {#1}}
- {\msg_error:nn {witharrows} {Option~will~be~ignored} }},
+ {\msg_error:nn {witharrows}
+ {Option~will~be~ignored}}} ,
jot .value_required:n = true,
% \end{macrocode}
%
@@ -1524,15 +1977,16 @@ version 2005/12/01 or later.
% \begin{macrocode}
interline .code:n = {\int_compare:nNnTF \l_@@_level_int = 2
{\skip_set:Nn \l_@@_interline_skip {#1}}
- {\msg_error:nn {witharrows} {Option~will~be~ignored}}},
+ {\msg_error:nn {witharrows}
+ {Option~will~be~ignored}}} ,
interline .value_required:n = true,
% \end{macrocode}
%
% \bigskip
% Eventually, a key |jump| (see below) and a key for unknown keys.
% \begin{macrocode}
- jump .code:n = {\msg_error:nn {witharrows} {Option~will~be~ignored}},
- unknown .code:n = {\msg_error:nn {witharrows} {Option~unknown}}
+ jump .code:n = \msg_error:nn {witharrows} {Option~will~be~ignored} ,
+ unknown .code:n = \msg_error:nn {witharrows} {Option~unknown}
}
% \end{macrocode}
%
@@ -1546,7 +2000,7 @@ version 2005/12/01 or later.
{jump .code:n = {\int_set:Nn \l_@@_jump_int {#1}
\int_compare:nNnF \l_@@_jump_int > 0
{\msg_error:nn {witharrows}
- {The~option~"jump"~must~be~non~negative}}},
+ {The~option~"jump"~must~be~non~negative}}} ,
jump .value_required:n = true}
% \end{macrocode}
%
@@ -1567,7 +2021,7 @@ version 2005/12/01 or later.
% a global level by |\WithArrowsOptions|).
% \begin{macrocode}
\bool_if:nTF { \int_compare_p:nNn \l_@@_level_int = 3 &&
- \int_compare_p:nNn \l_@@_pos_arrows_int > 4}
+ \int_compare_p:nNn \l_@@_pos_arrows_int > 5}
{\msg_error:nn {witharrows}
{Option~incompatible~with~"group(s)"}}
{\int_set:Nn \l_@@_pos_arrows_int {#1}}}
@@ -1579,11 +2033,12 @@ version 2005/12/01 or later.
% \begin{macrocode}
\NewDocumentCommand \WithArrowsOptions {m}
{\int_set:Nn \l_@@_previous_pos_arrows_int {-1}
- \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \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
@@ -1646,9 +2101,9 @@ version 2005/12/01 or later.
%
% \begin{macrocode}
\prop_gclear_new:c
- {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\g_@@_arrow_int _prop}
+ {g_@@_arrow_\l_@@_prefix_str _\int_use:N\g_@@_arrow_int _prop}
\prop_gset_eq:cN
- {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\g_@@_arrow_int _prop}
+ {g_@@_arrow_\l_@@_prefix_str _\int_use:N\g_@@_arrow_int _prop}
\l_tmpa_prop
}
% \end{macrocode}
@@ -1666,7 +2121,8 @@ version 2005/12/01 or later.
% \end{macrocode}
%
%
-% \subsection{The environnement \{WithArrows\}}
+% \bigskip
+% \subsection{The environment \{WithArrows\}}
%
%
% The environment |{WithArrows}| starts with the initialisation of the three counters |\g_@@_arrow_int|,
@@ -1696,24 +2152,19 @@ version 2005/12/01 or later.
% \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
- \tl_clear_new:N \l_@@_prefix_tl
- \tl_set:Nx \l_@@_prefix_tl {\seq_use:Nnnn \l_tmpa_seq {-} {-} {-}}
+ \str_clear_new:N \l_@@_prefix_str
+ \str_set:Nx \l_@@_prefix_str {\seq_use:Nnnn \l_tmpa_seq {-} {-} {-}}
% \end{macrocode}
%
% \bigskip
% The environment |{WithArrows}| must be used in math mode.
% \begin{macrocode}
\reverse_if:N \if_mode_math:
- \msg_error:nn {witharrows} {{WithArrows}~used~outside~math~mode}
- \fi
+ \msg_error:nn {witharrows}
+ {{WithArrows}~used~outside~math~mode}
+ \fi:
% \end{macrocode}
%
-% \bigskip
-% If the option |footnote| or the option |footnotehyper| is used, then we extract the footnotes with an environment
-% |{savenotes}| (of the package \pkg{footnote} or the package \pkg{footnotehyper}).
-% \begin{macrocode}
- \bool_if:NT \g_@@_footnote_bool {\begin{savenotes}}
-% \end{macrocode}
%
% \bigskip
% We define the command |\\| to be the command |\@@_cr:| (defined below).
@@ -1732,22 +2183,47 @@ version 2005/12/01 or later.
%
% \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 \texttt{interline} of a environment doesn't apply
+% environment.\footnote{It's recalled that, by design, the option |interline| of an environment doesn't apply
% in the nested environments.}
% \begin{macrocode}
\skip_zero:N \l_@@_interline_skip
% \end{macrocode}
%
% \bigskip
+% The value corresponding to the key |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
+% \end{macrocode}
+% \bigskip
% We process the options given to the |{WithArrows}| environment. The level of options is set to 1.
% \begin{macrocode}
\int_set:Nn \l_@@_previous_pos_arrows_int {-1}
\int_set:Nn \l_@@_level_int 2
- \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \keys_set_known:nnN {WithArrows/General} {#1} \l_tmpa_tl
\keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl
% \end{macrocode}
%
% \bigskip
+% If the option |footnote| or the option |footnotehyper| is used, then we extract the footnotes with an environment
+% |{savenotes}| (of the package \pkg{footnote} or the package \pkg{footnotehyper}).
+% \begin{macrocode}
+ \bool_if:NT \g_@@_footnote_bool {\begin{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
+% executed in the |CodeAfter|).
+% \begin{macrocode}
+ \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|.
@@ -1757,7 +2233,7 @@ version 2005/12/01 or later.
%
% \bigskip
% The environment begins with a |\vtop|, a |\vcenter| or a |\vbox|\footnote{Notice that the use of
-% \texttt{\string\vtop} seems color-safe here...} depending of the value of |\l_@@_pos_env_int| (fixed by the options
+% |\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}
@@ -1807,9 +2283,7 @@ version 2005/12/01 or later.
% 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).
% \begin{macrocode}
- \tikz[remember~picture,overlay]
- \node[@@_node_style]
- (wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\g_@@_line_int-l) {} ;
+ \tikz [@@_standard] \node [@@_node_style] (\int_use:N\g_@@_line_int-l) {} ;
\hfil
% \end{macrocode}
%
@@ -1817,11 +2291,9 @@ version 2005/12/01 or later.
% 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).
% \begin{macrocode}
- \tikz[remember~picture,overlay]
- \node[@@_node_style]
- (wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\g_@@_line_int-r) {} ;
+ \tikz [@@_standard] \node [@@_node_style] (\int_use:N\g_@@_line_int-r) {} ;
\bool_if:NT \l_@@_shownodenames_bool
- {\hbox_overlap_right:n {\small wa-\tl_use:N\l_@@_prefix_tl
+ {\hbox_overlap_right:n {\small wa-\l_@@_prefix_str
-\int_use:N\g_@@_line_int}}
% \end{macrocode}
%
@@ -1857,18 +2329,39 @@ version 2005/12/01 or later.
% 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| > 4), we have to draw the
+% \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}
%
% \begin{macrocode}
- \int_compare:nNnT \g_@@_arrow_int > 0
- {\int_compare:nNnTF \l_@@_pos_arrows_int > 4
+ \int_compare:nNnT \g_@@_arrow_int > 0
+ {\int_compare:nNnTF \l_@@_pos_arrows_int > 5
\@@_draw_arrows:
{\@@_draw_arrows:nn 1 \g_@@_arrow_int}}
% \end{macrocode}
%
% \bigskip
+% We will execute the code specified in the option |CodeAfter|, after some settings.
+% \begin{macrocode}
+ \group_begin:
+ \tikzset{every~picture/.style = @@_standard}
+% \end{macrocode}
+% The command |\NbLines| is not used by \pkg{witharrows}. It's only a convenience given to the user.
+% \begin{macrocode}
+ \cs_set:Npn \NbLines {\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|.}
+% \begin{macrocode}
+ \cs_set_eq:NN \MultiArrow \@@_MultiArrow:nn
+ \cs_set_eq:cN \l_@@_CommandName_tl \@@_Arrow_code_after
+ \l_@@_code_after_tl
+ \group_end:
+% \end{macrocode}
+%
+% \bigskip
% If the option |footnote| or the option |footnotehyper| is used, then we extract the footnotes with an environment
% |{footnote}| (of the package \pkg{footnote} or the package \pkg{footnotehyper}).
% \begin{macrocode}
@@ -1880,11 +2373,12 @@ version 2005/12/01 or later.
% \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_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}
@@ -1932,6 +2426,7 @@ version 2005/12/01 or later.
% According of the documentation of \pkg{expl3}, the previous addition in ``|#1 + \l_@@_interline_skip|'' is really
% an addition of skips (=glues).
%
+% \bigskip
% \subsection{We draw the arrows}
%
% \bigskip
@@ -1972,10 +2467,10 @@ version 2005/12/01 or later.
% 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_tl _\int_use:N\l_@@_arrow_int _prop}
+ \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_tl _\int_use:N\l_@@_arrow_int _prop}
+ \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}
@@ -1984,9 +2479,10 @@ version 2005/12/01 or later.
% 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 |\g_@@_x_dim|).
% \begin{macrocode}
- \bool_if:nT { \int_compare_p:nNn \l_@@_pos_arrows_int = 6
+ \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}
+ && \int_compare_p:nNn
+ \l_@@_initial_int > \l_@@_last_line_of_group_int}
{\@@_draw_arrows:nn \l_@@_first_arrow_of_group_int {\l_@@_arrow_int - 1}
\bool_set_true:N \l_@@_new_group_bool}
% \end{macrocode}
@@ -2004,9 +2500,9 @@ version 2005/12/01 or later.
\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
- \tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\l_@@_initial_int-l)
- in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\x1}} ;
+ \tikz [@@_standard]
+ \path let \p1=(\int_use:N\l_@@_initial_int-l)
+ in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\x1}} ;
}
% \end{macrocode}
%
@@ -2021,7 +2517,7 @@ version 2005/12/01 or later.
% We actualise the current $x$-value (in |\g_@@_x_dim|) even if we are at the beginning of a group. Indeed, the
% previous initialisation of |\g_@@_x_dim| only considers the initial line of the arrows and now we consider all
% the lines between the initial and the final line. This is done with |\@@_actualise_x_value:nn|. We have written a
-% command for this because it is also used with the option |i| (|\l_@@_pos_arrows_int| = 4).
+% command for this because it is also used with the option |i| (|\l_@@_pos_arrows_int| = 5).
% \begin{macrocode}
\@@_actualise_x_value:nn \l_@@_initial_int \l_@@_final_int
% \end{macrocode}
@@ -2045,7 +2541,7 @@ version 2005/12/01 or later.
% 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_WithArrows: {\keys_set:no {WithArrows}}
+\cs_new_protected:Nn \@@_keys_set: {\keys_set:no {WithArrows/General}}
% \end{macrocode}
%
%
@@ -2077,10 +2573,10 @@ version 2005/12/01 or later.
% of a property list are token lists.
%
% \begin{macrocode}
- \prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\l_@@_arrow_int _prop}
+ \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_tl _\int_use:N\l_@@_arrow_int _prop}
+ \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}
@@ -2088,14 +2584,22 @@ version 2005/12/01 or later.
% \bigskip
% If the arrow ends after the last line of the environment, we raise an error.
% \begin{macrocode}
- \int_compare:nNnT \l_@@_final_int > \g_@@_line_int
- {\msg_fatal:nn {witharrows} {Too~few~lines~for~an~arrow}}
+ \int_compare:nNnTF \l_@@_final_int > \g_@@_line_int
+ {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
+ {\@@_draw_arrows_i:}
+ \int_incr:N \l_@@_arrow_int
+ }
+ \group_end:
+ }
% \end{macrocode}
%
% \bigskip
-% We prepare the process of the options of the current arrow.
+% The macro |\@@_draw_arrows_i:| is only for the lisibility of the code. This macro will draw the current arrow
+% if the arrow is not impossible (that is to say if the Tikz node exists). The first |\group_begin:| is for the
+% options of the arrow.
% \begin{macrocode}
- \group_begin:
+\cs_new:Nn \@@_draw_arrows_i:
+ {\group_begin:
\int_set:Nn \l_@@_previous_pos_arrows_int {-1}
\int_set:Nn \l_@@_level_int 3
% \end{macrocode}
@@ -2105,9 +2609,10 @@ version 2005/12/01 or later.
% 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_tl
+ \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_WithArrows: {\l_tmpa_tl}
+ \exp_args:NNo \exp_args:No
+ \@@_keys_set: {\l_tmpa_tl,tikz={xshift = \l_@@_xoffset_dim}}
% \end{macrocode}
%
%
@@ -2124,12 +2629,27 @@ version 2005/12/01 or later.
% \end{macrocode}
%
% \bigskip
-% In case of option |i| (|\l_@@_pos_arrows_int| = 4), we have to compute the $x$-value of the arrow (which is
+% \begin{center}
+% \begin{tabular}{l}
+% \setlength{\extrarowheight}{2pt}
+% \begin{tabular}{|l|c|c|c|c|c|c|c|c|}
+% \hline
+% option & |rr| & |ll| & |rl| & |lr| & |v| & |i| & |group| & |groups| \\
+% \hline
+% |\l_@@_pos_arrows_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ & $7$ \\
+% \hline
+% \end{tabular} \\
+% \quad \small The option |v| can be used only in |\Arrow| in |CodeAfter| (see below).
+% \end{tabular}
+% \end{center}
+%
+% \bigskip
+% In case of option |i| (|\l_@@_pos_arrows_int| = 5), we have to compute the $x$-value of the arrow (which is
% vertical). The computed $x$-value is stored in |\g_@@_x_dim| (the same variable used when the option |group| or
% the option |groups| is used). This variable is global for technical reasons: we have to do assignments in a Tikz
% node.
% \begin{macrocode}
- \int_compare:nNnT \l_@@_pos_arrows_int = 4
+ \int_compare:nNnT \l_@@_pos_arrows_int = 5
{
% \end{macrocode}
%
@@ -2137,96 +2657,106 @@ version 2005/12/01 or later.
% First, we calculate the initial value for |\g_@@_x_dim|. We use a Tikz command, but, in fact, nothing is drawn.
% We use this Tikz command only to read the abscissa of a Tikz node.
% \begin{macrocode}
- \tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\l_@@_initial_int-l)
+ \tikz [@@_standard]
+ \path let \p1 = (\int_use:N\l_@@_initial_int-l)
in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\x1}} ;
% \end{macrocode}
% A global assignment is necessary because of Tikz.
%
-% Then, we will loop to determine the maximal length of all the lines between the lines |\l_@@_initial_int| and
+% Then, we will loop to determine the maximal length of the lines between the lines |\l_@@_initial_int| and
% |\l_@@_final_int|... but we have written a command dedicated to this work because it will also be used in
% |\@@_draw_arrows:|.
% \begin{macrocode}
\@@_actualise_x_value: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 an other $x$-value --- but always the
-% same |y|-value). Idem for |\l_@@_final_tl|.
+% 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
- {wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\l_@@_initial_int-
- \bool_if:NTF\l_@@_initial_r_bool rl .south}
+ {\int_use:N\l_@@_initial_int-\bool_if:NTF\l_@@_initial_r_bool rl .south}
\tl_set:Nx \l_@@_final_tl
- {wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\l_@@_final_int-
- \bool_if:NTF\l_@@_final_r_bool rl .north}
+ {\int_use:N\l_@@_final_int-\bool_if:NTF\l_@@_final_r_bool rl .north}
% \end{macrocode}
-% We use ``|. 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 |shownodes| to visualize the nodes).
%
% \bigskip
-% We can now draw the arrow in a |{tikzpicture}|:
+% The label of the arrow will is stored in |\l_tmpa_tl|.
% \begin{macrocode}
- \begin{tikzpicture}[remember~picture,
- overlay,
- align=left,
- auto=left,
- font = {\small\itshape},
- TipsOfWithArrows,
- ->,
- looseness=1,
- bend~left=45]
+ \prop_get:cnN {g_@@_arrow_\l_@@_prefix_str _\int_use:N\l_@@_arrow_int _prop}
+ {label}
+ \l_tmpa_tl
% \end{macrocode}
%
-% Of course, the arrow is drawn with the command |\draw| of Tikz. The syntax for this command is:
-%
-% \qquad |\draw| $(x_1,y_1)$ |to node| (\textsl{name}) |{|\textsl{contents}|}| $(x_2,y_2)$
+% \bigskip
+% We have to compute the coordinates of the extremities of the arrow. We use the library |calc| to define two
+% points |\p1| and |\p2| and 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.
+% \begin{macrocode}
+ \int_compare:nNnTF \l_@@_pos_arrows_int < 5
+ {\tikz [@@_standard]
+ \path let \p1 = (\l_@@_initial_tl),
+ \p2 = (\l_@@_final_tl)
+ in \pgfextra { \tl_gset:Nx \g_tmpa_tl {\p1}
+ \tl_gset:Nx \g_tmpb_tl {\p2}} ; }
+% \end{macrocode}
%
-% The surprising aspect of this syntax is the position of \textsl{contents} which is the label of the arrow.
-%
-% |\p1| and |\p2| are the two ends of the arrow (in fact, if the option |i| or the option |group| is used, it's not
-% exactly the two ends of the arrow because, in this case, the abscissa used is the value previously calculated in
-% |g_@@_x_dim|).
-%
-% The ability to define |\p1| and |\p2| is given by the library |calc| of Tikz. When |\p1| and |\p2| are defined,
-% the $x$-value and $y$-value of these two points can be read in |\x1|, |\x2|, |\y1| and |\y2|. This is the way to
-% have the coordinates of a node defined in Tikz.
-% \begin{macrocode}
- \prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\l_@@_arrow_int _prop}
- {label} \l_tmpa_tl
- \draw \exp_after:wN [\l_@@_options_tikz_tl]
- let \p1 = (\tl_use:N \l_@@_initial_tl),
- \p2 = (\tl_use:N \l_@@_final_tl) in
- (\int_compare:nNnTF \l_@@_pos_arrows_int > 3
- {\dim_use:N \g_@@_x_dim + \dim_use:N \l_@@_xoffset_dim, \y1}
- {\x1 + \dim_use:N \l_@@_xoffset_dim, \y1} )
-% \end{macrocode}
-% There are two ways to give the content of the node: the classical way, with curly braces, and the option ``node
-% contents''. However, both are not strictly equivalent: when |\usetikzlibrary{babel}| is used, the tokens of the
-% contents are rescanned in the first way but not in the second. We don't want the tokens to be rescanned (because
-% this would lead to an error due of the characters |_| and |:| of the \pkg{expl3} syntax) and that's why we use
-% the second method. \footnote{cf.:
-% |tex.stackexchange.com/questions/298177/how-to-get-around-a-problem-with-usetikzlibrarybabel|}
-% \begin{macrocode}
- to node [node~contents = {\tl_use:N \l_tmpa_tl}] {}
- (\int_compare:nNnTF \l_@@_pos_arrows_int > 3
- {\dim_use:N \g_@@_x_dim + \dim_use:N \l_@@_xoffset_dim, \y2}
- {\x2 + \dim_use:N \l_@@_xoffset_dim, \y2} ) ;
- \end{tikzpicture}
+% If we use option |i| or |group| or |groups|, we use the abscissa specially computed in |\g_@@_x_dim|.
+% \begin{macrocode}
+ {\tikz [@@_standard]
+ \path let \p1 = (\l_@@_initial_tl),
+ \p2 = (\l_@@_final_tl)
+ in \pgfextra { \tl_gset:Nx \g_tmpa_tl {\dim_use:N \g_@@_x_dim , \y1}
+ \tl_gset:Nx \g_tmpb_tl {\dim_use:N \g_@@_x_dim , \y2}} ; }
+% \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|.
+% \begin{macrocode}
+ \@@_draw_arrow:nnn {\g_tmpa_tl} {\g_tmpb_tl} {\l_tmpa_tl}
% \end{macrocode}
%
% \smallskip
% We close the TeX group opened for the options given to |\Arrow[...]| (local level of the options).
% \begin{macrocode}
- \group_end:
- \int_incr:N \l_@@_arrow_int
- }
- \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|.
+% \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}}}
+% \end{macrocode}
+%
+% \medskip
+% When we draw the arrow (with |\@@_draw_arrow:nnn|), we create first the function |\@@_tmpa:nnn| and, then, we use
+% the function |\@@_tmpa:nnn| :
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_draw_arrow:nnn
+ {\exp_args:No \@@_def_function_tmpa:n \l_@@_tikz_code_tl
+ \@@_tmpa:nnn {#1} {#2} {#3} }
+% \end{macrocode}
+%
+%
% \bigskip
% The command |\@@_actualise_x_value:nn| will analyze the lines between |#1| and |#2| in order to modify
% |\g_@@_x_dim| in consequence. More precisely, |\g_@@_x_dim| is increased if a line longer than the current value
@@ -2234,25 +2764,10 @@ version 2005/12/01 or later.
% |groups|) and in |\@@_draw_arrows:nn| (for option |i|).
% \begin{macrocode}
\cs_new_protected:Nn \@@_actualise_x_value:nn
- {\group_begin:
- \int_set:Nn \l_@@_initial_int {#1}
- \int_set:Nn \l_@@_final_int {#2}
- \int_compare:nNnT \l_@@_final_int > \g_@@_line_int
- {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
-% \end{macrocode}
-%
-% We begin a loop with |\l_tmpa_int| as index. In this loop, we use a Tikz command, but, in fact, nothing is drawn.
-% We use this Tikz command only to read the abscissa of a Tikz node.
-% \begin{macrocode}
- \int_set:Nn \l_tmpa_int \l_@@_initial_int
- \int_until_do:nNnn \l_tmpa_int > \l_@@_final_int
- {\tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l_@@_prefix_tl-\int_use:N\l_tmpa_int-l)
- in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\dim_max:nn \g_@@_x_dim {\x1}}} ;
- \int_incr:N \l_tmpa_int
- }
- \group_end:
- }
+ {\int_step_inline:nnnn {#1} \c_one {#2}
+ {\tikz [@@_standard]
+ \path let \p1 = (##1-l)
+ in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\dim_max:nn \g_@@_x_dim {\x1}}}; }}
% \end{macrocode}
%
%
@@ -2261,10 +2776,149 @@ version 2005/12/01 or later.
% final user. It gives the number of the last environment |{WithArrows}| at level~$0$ (to the sens of the nested
% environments). This macro is fully expandable and, thus, can be used directly in the name of a Tikz node.
% \begin{macrocode}
-\NewDocumentCommand \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|.
+%
+% \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}
% \end{macrocode}
+%
%
+% \bigskip
+% \begin{macrocode}
+\NewDocumentCommand \@@_Arrow_code_after {O{} mmm O{}}
+ {\int_set:Nn \l_@@_pos_arrows_int 1
+ \int_set:Nn \l_@@_previous_pos_arrows_int {-1}
+ \group_begin:
+% \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.
+% \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_arrows_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.
+% \begin{macrocode}
+ \cs_if_free:cTF {pgf@sh@ns@wa-\l_@@_prefix_str-#2-l}
+ {\msg_error:nnn {witharrows} {Wrong~line~specification~in~Arrow} {#2}}
+ {\cs_if_free:cTF {pgf@sh@ns@wa-\l_@@_prefix_str-#3-l}
+ {\msg_error:nnn {witharrows} {Wrong~line~specification~in~Arrow} {#3}}
+ {\int_compare:nNnTF \l_@@_pos_arrows_int = 4
+ {\tikz [@@_standard]
+ \path let \p1 = (#2-l.south),
+ \p2 = (#3-l.north),
+ \p3 = (\dim_max:nn {\x1} {\x2} , \y1),
+ \p4 = (\dim_max:nn {\x1} {\x2} , \y2)
+ in \pgfextra { \tl_gset:Nx \g_tmpa_tl {\p3}
+ \tl_gset:Nx \g_tmpb_tl {\p4}} ; }
+ {\tikz [@@_standard]
+ \path let \p1 = (#2-\bool_if:NTF\l_@@_initial_r_bool rl .south),
+ \p2 = (#3-\bool_if:NTF\l_@@_final_r_bool rl .north)
+ in \pgfextra { \tl_gset:Nx \g_tmpa_tl {\p1}
+ \tl_gset:Nx \g_tmpb_tl {\p2}} ; }
+ \@@_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.
+%
+% \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|.
+% \begin{macrocode}
+ \foreach \x in {#1} {\cs_if_free:cTF {pgf@sh@ns@wa-\l_@@_prefix_str-\x-l}
+ {\msg_error:nnx {witharrows}
+ {Wrong~line~specification~in~MultiArrow} {\x}}
+ {\clist_gput_right:Nx \g_tmpa_clist {\x}}}
+% \end{macrocode}
+% We sort the list |\g_tmpa_clist| because we want to extract the minimum and the maximum.
+% \begin{macrocode}
+ \int_compare:nNnTF {\clist_count:N \g_tmpa_clist} < 2
+ {\msg_error:nn {witharrows} {Too~small~specification~for~MultiArrow}}
+ {\clist_sort:Nn \g_tmpa_clist
+ {\int_compare:nNnTF {##1} > {##2}
+ {\sort_return_swapped:}
+ {\sort_return_same:}}
+% \end{macrocode}
+% We extract the minimum in |\l_tmpa_tl| (it must be a integer but we store it in a token list of \pkg{expl3}).
+% \begin{macrocode}
+ \clist_pop:NN \g_tmpa_clist \l_tmpa_tl
+% \end{macrocode}
+%
+% We extract the maximum in |\l_tmpb_tl|. The remaining list (in |\g_tmpa_clist| will be sorted in decreasing order
+% but never mind...).
+% \begin{macrocode}
+ \clist_reverse:N \g_tmpa_clist
+ \clist_pop:NN \g_tmpa_clist \l_tmpb_tl
+% \end{macrocode}
+%
+% We draw the teeth of the rak (except the first one and the last one) with the auxiliary function
+% |\@@_MultiArrow_i:n|. This auxiliary fonction is necessary to expand the specification of the list in the
+% |\foreach| loop. The first and the last teeth of the rak can't be drawn the same way as the others (think, for
+% example, to the case of the option ``rounded corners'' is used).
+% \begin{macrocode}
+ \exp_args:Nx \@@_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 [<->] ($(\l_tmpa_tl-r.south)+(\l_@@_xoffset_dim,0)$)
+ -- ++(5mm,0)
+ -- node {#2} ($(\l_tmpb_tl-r.south)+(\l_@@_xoffset_dim+5mm,0)$)
+ -- ($(\l_tmpb_tl-r.south)+(\l_@@_xoffset_dim,0)$) ;
+ \end{tikzpicture} } }
+
+\cs_new_protected:Nn \@@_MultiArrow_i:n
+ {\begin{tikzpicture}[@@_standard,every~path/.style={WithArrows/arrow}]
+ \foreach \k in {#1}
+ {\draw[<-] ($(\k-r.south)+(\l_@@_xoffset_dim,0)$) -- ++(5mm,0) ;} ;
+ \end{tikzpicture}}
+% \end{macrocode}
+%
+%
+% \bigskip
% \subsection{The error messages of the package}
% \begin{macrocode}
\msg_new:nnn {witharrows}
@@ -2288,7 +2942,8 @@ version 2005/12/01 or later.
\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.}
+ because~it~arrives~after~the~last~line~of~the~environment.~If~you~go~on,~
+ this~arrow~will~be~ignored.}
% \end{macrocode}
%
% \begin{macrocode}
@@ -2310,7 +2965,8 @@ version 2005/12/01 or later.
3 {lr}
4 {i}
5 {group}
- 6 {groups}}"~
+ 6 {groups}
+ 7 {v}}"~
previously~set~in~the~same~
\int_case:nn\l_@@_level_int
{1 {command~\token_to_str:N\WithArrowsOptions}
@@ -2323,8 +2979,9 @@ version 2005/12/01 or later.
\msg_new:nnnn {witharrows}
{All~lines~must~have~an~ampersand}
{All~lines~of~an~environment~\{WithArrows\}~must~have~an~second~column~
- (because~the~nodes~are~created~in~the~second~column).~You~can~go~on~but~maybe~
- you~will~have~an~pgf~error~for~an~undefined~shape.}
+ (because~the~nodes~are~created~in~the~second~column).~
+ You~can~go~on~but~maybe~you~will~have~an~pgf~error~for~
+ an~undefined~shape.}
{The~ampersand~can~be~implicit~
(e.g.~if~you~use~\token_to_str:N\MoveEqLeft\ of~mathtools).}
% \end{macrocode}
@@ -2352,8 +3009,8 @@ version 2005/12/01 or later.
% \begin{macrocode}
\msg_new:nnn {witharrows}
{Option~unknown}
- {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~meaningless~in~the~context.~
- If~you~go~on,~it~will~be~ignored.}
+ {The~option~"\tl_use:N\l_keys_key_tl"~is~unknown~or~
+ meaningless~in~the~context.~If~you~go~on,~it~will~be~ignored.}
% \end{macrocode}
%
% \begin{macrocode}
@@ -2371,9 +3028,30 @@ version 2005/12/01 or later.
However~you~can~go~on~for~this~time.}
% \end{macrocode}
%
+% \begin{macrocode}
+\msg_new:nnn {witharrows}
+ {Wrong~line~specification~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.}
+% \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.}
+% \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.}
+% \end{macrocode}
+%
% \section{History}
%
% \subsection{Changes between versions 1.0 and 1.1}
@@ -2408,8 +3086,15 @@ version 2005/12/01 or later.
% 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|.
%
+% 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 command |\MultiArrow| is available in |CodeAfter| to draw arrows of other shapes.
% \endinput
%
% Local Variables: