texlive[45946] Master/texmf-dist: witharrows (29nov17)
commits+karl at tug.org
commits+karl at tug.org
Wed Nov 29 23:08:39 CET 2017
Revision: 45946
http://tug.org/svn/texlive?view=revision&revision=45946
Author: karl
Date: 2017-11-29 23:08:38 +0100 (Wed, 29 Nov 2017)
Log Message:
-----------
witharrows (29nov17)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/latex/witharrows/README.md
trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
Modified: trunk/Master/texmf-dist/doc/latex/witharrows/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/witharrows/README.md 2017-11-29 22:08:27 UTC (rev 45945)
+++ trunk/Master/texmf-dist/doc/latex/witharrows/README.md 2017-11-29 22:08:38 UTC (rev 45946)
@@ -1,9 +1,9 @@
The LaTeX extension witharrows is distributed under the LPPL 1.3 license.
-This extension has been written by F. Pantigny (fpantigny at wanadoo point fr).
+This extension has been written by F. Pantigny (fpantigny at wanadoo.fr).
This extension is entirely contained in a single file : witharrows.sty
The extension witharrows gives a LaTeX environment {WithArrows} which is similar
to the environment {aligned} of amsmath but which gives the possibility to draw arrows
-on the right side of the equations for explanations.
+on the right side of the equations for explanations.
\ No newline at end of file
Modified: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx 2017-11-29 22:08:27 UTC (rev 45945)
+++ trunk/Master/texmf-dist/source/latex/witharrows/witharrows.dtx 2017-11-29 22:08:38 UTC (rev 45946)
@@ -15,14 +15,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{1.1}
-\def\myfiledate{2017/11/06}
-%<package>\RequirePackage{l3keys2e}
-%<package>\ProvidesExplPackage
-%<package> {witharrows}
-%<package> {\myfiledate}
-%<package> {\myfileversion}
-%<package> {Draws arrows for explanations on the right}
+\def\myfileversion{1.2}
+\def\myfiledate{2017/11/29}
%
%
%<*batchfile>
@@ -58,12 +52,10 @@
\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{tikz}
-\usetikzlibrary{calc,arrows.meta,bending}
-\usepackage{footnote}
\usepackage{witharrows}
\usepackage{mathtools}
\usepackage{amsfonts}
+\usepackage{stmaryrd}
\NewDocumentEnvironment {scope} {} {} {}
\def\interitem{\vskip 7mm plus 2 mm minus 3mm}
\def\emphase#1{{\color{RoyalPurple}#1}}
@@ -92,12 +84,12 @@
% This package can be used with |xelatex|, |lualatex|, |pdflatex| but also by the classical workflow
% |latex|-|dvips|-|ps2pdf| (or Adobe Distiller). Two compilations may be necessary. This package requires the
% packages \pkg{expl3}, \pkg{xparse}, \pkg{footnote}\footnote{The package footnote is used to extract the notes
-% from the environments \texttt{\{WithArrows\}}.} and \pkg{tikz}. The following Tikz libraries are also required :
+% from the environments \texttt{\{WithArrows\}}.} and \pkg{tikz}. The following Tikz libraries are also required:
% \pkg{calc}, \pkg{arrows.meta} and \pkg{bending}.
%
% \bigskip
% This package gives an environment |{WithArrows}| to construct alignments of equations with arrows for the
-% explanations on the right side :
+% explanations on the right side:
% %
% \begin{Verbatim}
% $\begin{WithArrows}
@@ -113,7 +105,7 @@
%
%
% \medskip
-% The arrow has been drawn with the command |\Arrow| on the ligne from which it starts. The command |\Arrow| can be
+% The arrow has been drawn with the command |\Arrow| on the line from which it starts. The command |\Arrow| can be
% used anywhere on the line but the best way is to put it at the end.
%
%
@@ -122,10 +114,11 @@
% 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 of lines the arrow must jump (the default value is, of course,~$1$)
-% \footnote{It's not possible to give a non-positive value to \texttt{jump}. See below the way to draw an arrow
-% which goes backwards.}
-% %
+% The option |jump| gives the number\footnote{It's not possible to give a non-positive value to \texttt{jump}. See
+% below the way to draw an arrow which goes backwards.} of lines the arrow must jump (the default value is, of
+% course,~$1$).
+%
+%
% \begin{Verbatim}
% $\begin{WithArrows}
% A & = \bigl((a+b)+1\bigr)^2 \Arrow[~emphase#jump=2@]{we expand} \\
@@ -243,7 +236,7 @@
% \end{WithArrows}$
%
% \interitem
-% One of the most useful options is ``|text width|'' to control the with of the text associated to the arrow.
+% One of the most useful options is ``|text width|'' to control the width of the text associated to the arrow.
% %
% \begin{Verbatim}
% $\begin{WithArrows}
@@ -282,7 +275,7 @@
%
% \interitem
% If we put commands |\\| in the text to force newlines, a command of font placed in the beginning of the text will
-% have effect only until the first command |\\| (like in a environment |{tabular}|). That's why Tikz gives a option
+% have effect only until the first command |\\| (like in an environment |{tabular}|). That's why Tikz gives a option
% |font| to modify the font of the whole text. Nevertheless, if we use the option |tikz={font={\bfseries}}|, the
% default specification of |\small| and |\itshape| will be overwritten.
% %
@@ -305,7 +298,7 @@
%
% \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 applies also to the nested environments
+% 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}.}
% %
% \begin{Verbatim}
@@ -328,7 +321,7 @@
% |\displaystyle| (like in an environment |{aligned}| of \pkg{amsmath}).
%
% \medskip
-% Without the option |displaystyle| :
+% Without the option |displaystyle|:
% %
% \begin{Verbatim}
% $\begin{WithArrows}
@@ -352,7 +345,7 @@
%
%
% \medskip
-% The same example with the option |displaystyle| :\par\nobreak
+% The same example with the option |displaystyle|:\par\nobreak
%
% $\begin{WithArrows}[displaystyle]
% \int_0^1 (x+1)^2 dx
@@ -396,11 +389,11 @@
%
% However, a previouly defined command |\Arrow| may still be useful in an environment |{WithArrows}|. If we want to
% use it in such an environment, it's possible to change the name of the command |\Arrow| of the package
-% \pkg{witharrows} : there is an option |CommandName| for this purpose. The new name of the command must be given to
+% \pkg{witharrows}: there is an option |CommandName| for this purpose. The new name of the command must be given to
% the option \emph{without} the leading backslash.
% %
% \begin{Verbatim}
-% \def\Arrow{\longmapsto}
+% \newcommand{\Arrow}{\longmapsto}
% $\begin{WithArrows}[~emphase#CommandName=Explanation@]
% f & = \bigl(x \Arrow (x+1)^2\bigr)
% ~emphase#\Explanation{we work directly on fonctions}@\\
@@ -409,7 +402,7 @@
% \end{Verbatim}
% %
% \begin{scope}
-% \def\Arrow{\longmapsto}
+% \newcommand{\Arrow}{\longmapsto}
% $\begin{WithArrows}[CommandName=Explanation]
% f & = \bigl(x \Arrow (x+1)^2\bigr)
% \Explanation{we work directly on fonctions}\\
@@ -421,7 +414,7 @@
% \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
+% 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
@@ -458,11 +451,6 @@
% nodes of the right side are aligned vertically on the right side of the array. These nodes will be called
% \emph{right nodes}.
%
-% % The names of the Tikz nodes created by \texttt{\{WithArrows\}} are \texttt{wa-}$n$\texttt{-l} and
-% % \texttt{wa-}$n$\texttt{-r} where $n$~is the number of the line. It's possible to refer to these Tikz nodes after
-% % the environment (one should use the options \texttt{remember picture} and \texttt{overlay} and also
-% % \texttt{TipsOfWithArrows} and \texttt{->} in order to have the same arrowheads).
-%
% By default, the arrows use the right nodes. We will say that they are in |rr| mode ($r$ for \emph{right}). These
% arrows are |vertical| (we will say that an arrow is \emph{vertical} when its two ends have the same abscissa).
%
@@ -524,6 +512,7 @@
% \end{WithArrows}$
% \end{Verbatim}
%
+%
% $\begin{WithArrows}[displaystyle,group]
% 2xy'-3y=\sqrt x
% & \Longleftrightarrow 2x(K'y_0+Ky_0')-3Ky_0 = \sqrt x \\
@@ -536,10 +525,30 @@
%
%
% \bigskip
-% If desired, the option |group| can be given to the command |\WithArrowsOptions| so that it will become the default
-% value.
+% The environment |{WithArrows}| gives also a |groups| option (with a \emph{s} in the name). With this option, the
+% arrows are divided into several ``groups''. Each group is a set of connected\footnote{More precisely : for each
+% arrow $a$, we note $i(a)$ the number of its initial line and $f(a)$ the number of its final line ; for two arrows
+% $a$ and $b$, we say that $a \sim b$ when
+% $\llbracket i(a),f(a)\rrbracket \cap \llbracket i(b),f(b)\rrbracket \neq \emptyset$ ; the groups are the
+% equivalence classes of the transitive closure of $\sim$.} arrows. All the arrows of a given group are grouped on
+% a same vertical line and at a leftmost position.
%
+% \bigskip
+% $\begin{WithArrows}[groups]
+% A & = B \Arrow{one} \\
+% & = C+D \Arrow{two} \\
+% & = D' \\
+% & = E+F+G+H+I \\
+% & = K + L + M \Arrow{three}\\
+% & = N \Arrow{four}\\
+% & = O
+% \end{WithArrows}$
%
+% \bigskip
+% If desired, the option |group| or the option |groups| can be given to the command |\WithArrowsOptions| so that it will become
+% the default value. In this case, it's still possible to come back to the default behaviour for a given
+% environment |{WithArrows}| with the option |rr|: |\begin{WithArrows}{rr}|
+%
% \section{Comparison with the environment \{aligned\}}
%
%
@@ -546,7 +555,7 @@
%
% |{WithArrows}| bears similarities with the environment |{aligned}| of the extension \pkg{amsmath}. These are only
% similarities because |{WithArrows}| has not been written upon the environment |{aligned}|.\footnote{In fact, it's
-% possible to use the package \pkg{witharrows} without the environment \pkg{amsmath}.}
+% possible to use the package \pkg{witharrows} without the package \pkg{amsmath}.}
%
% \interitem
% As in the environments of \pkg{amsmath}, it's possible to change the spacing between two given lines with the
@@ -590,7 +599,7 @@
%
% \bigskip
% However, this new value of |\jot| will also be used in other alignments included in the
-% environment~|{WithArrows}| :
+% environment~|{WithArrows}|:
% %
% \begin{Verbatim}
% $\begin{WithArrows}[jot=2ex]
@@ -667,7 +676,7 @@
% \end{WithArrows}$
%
% \bigskip
-% The value |c| may be useful, for example, if we want to add curly braces :
+% The value |c| may be useful, for example, if we want to add curly braces:
%
% \smallskip
% \begin{Verbatim}
@@ -693,13 +702,13 @@
% \interitem
% Unlike |{aligned}|, the environment |{WithArrows}| uses |\textstyle| by default.
%
-% Once again, it's possible to change this behaviour with |\WithArrowsOptions| :
+% Once again, it's possible to change this behaviour with |\WithArrowsOptions|:
%
% \quad |\WithArrowsOptions{displaystyle}|.
%
%
% \smallskip
-% The following example is composed with |{aligned}| :\par\nobreak
+% The following example is composed with |{aligned}|:\par\nobreak
%
% \smallskip
% $\left\{
@@ -752,7 +761,7 @@
%
% \subsection{MoveEqLeft}
%
-% It's possible to use |\MoveEqLeft| of \pkg{mathtools} (if we don't want ampersand on the firt line) :
+% It's possible to use |\MoveEqLeft| of \pkg{mathtools} (if we don't want ampersand on the firt line):
% %
% \begin{Verbatim}[formatcom=\small\color{gray}]
% $\begin{WithArrows}[jot=2mm]
@@ -861,7 +870,7 @@
% fact, any TeX command.
%
% In the following example, the argument of |font| is the token list |\tiny\counter| where |\counter| is a command
-% which increment a counter previously defined and display its new value. Thus, the arrows are automatically
+% which increments a counter previously defined and displays its new value. Thus, the arrows are automatically
% numbered.
% %
% \begin{Verbatim}[formatcom=\small\color{gray}]
@@ -900,7 +909,7 @@
% document.
%
% \smallskip
-% The Tikz name of a node created by \pkg{witharrows} is prefixed by |wa-|. Then, we have a list of numbers with
+% 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''.
%
@@ -953,29 +962,39 @@
%
% \section{Implementation}
%
-% \subsection{Some extensions are loaded}
+% \subsection{Declaration of the package and extensions loaded}
%
-% This package is written in \pkg{expl3}.
+%
+% First, \pkg{tikz} and some Tikz libraries are loaded before the |\ProvidesExplPackage|.
+% They are loaded this way because |\usetikzlibrary| in |expl3| code fails.\footnote{cf.
+% |tex.stackexchange.com/questions/57424/using-of-usetikzlibrary-in-an-expl3-package-fails|}
+%
% \begin{macrocode}
-\RequirePackage{expl3}
+\RequirePackage{tikz}
+\usetikzlibrary{calc,arrows.meta,bending}
% \end{macrocode}
%
% \bigskip
-% The package \pkg{xparse} will be used to define the environment |{WithArrows}| and the document-level commands
-% (|\Arrow|, |\WithArrowsOptions| ans |\WithArrowsLastEnv|).
+% Then, we can give the traditionnal declaration of a package written with |expl3|:
% \begin{macrocode}
-\RequirePackage{xparse}
+\RequirePackage{l3keys2e}
+\ProvidesExplPackage
+ {witharrows}
+ {\myfiledate}
+ {\myfileversion}
+ {Draws arrows for explanations on the right}
% \end{macrocode}
%
% \bigskip
-% The arrows are drawn with Tikz and that's why \pkg{tikz} is required with some libraries.
+% The package \pkg{xparse} will be used to define the environment |{WithArrows}| and the document-level commands
+% (|\Arrow|, |\WithArrowsOptions| ans |\WithArrowsLastEnv|).
% \begin{macrocode}
-\RequirePackage{tikz}
-\usetikzlibrary{calc,arrows.meta,bending}
+\RequirePackage{xparse}
% \end{macrocode}
%
% \bigskip
-% The package \pkg{footnote} will be used to extract footnotes.
+% The package \pkg{footnote} will be used to extract footnotes of the environments |{WithArrows}| via the pair
+% |\savenotes|-|\spewnotes|.
% \begin{macrocode}
\RequirePackage{footnote}
% \end{macrocode}
@@ -982,7 +1001,7 @@
%
% \subsection{Some technical definitions}
%
-% We define a Tikz style |wa_node_style| for the nodes that will be created in the |\halign|.
+% We define a Tikz style |@@_node_style| for the nodes that will be created in the |\halign|.
% \begin{macrocode}
\tikzstyle{@@_node_style}=[rectangle,
inner~sep = 0 pt,
@@ -995,7 +1014,7 @@
% (this option is useful for debugging).
%
% \bigskip
-% We also define a style for the tips of arrow. The final user of the extension \pkg{WithArrows} will use this
+% 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}
@@ -1005,7 +1024,7 @@
% \bigskip
% In order to increase the interline in the environments |{WithArrows}|, we will use the command |\spread at equation|
% of \pkg{amsmath}. When used, this command becomes no-op (in the current TeX group). Therefore, it will be
-% possible to use the environments of \pkg{amsmath} (\emph{e.g.} |{aligned}|) in an environment |{WithArrows}|.
+% possible to use the environments of \pkg{amsmath} (e.g. |{aligned}|) in an environment |{WithArrows}|.
%
% Nevertheless, we want the extension \pkg{witharrows} available without \pkg{amsmath}. That's why we give a
% definition of |\spread at equation| (this definition will be loaded only if \pkg{amsmath} --- or \pkg{mathtools} --- has
@@ -1020,7 +1039,7 @@
% \subsection{Variables}
%
% \bigskip
-% The following sequence is the position of the last environment |{WithArrows}| in the tree of the imbricated
+% The following sequence is the position of the last environment |{WithArrows}| in the tree of the nested
% environments |{WithArrows}|.
% \begin{macrocode}
\seq_new:N \g_@@_position_in_the_tree_seq
@@ -1035,6 +1054,13 @@
% \end{macrocode}
%
% \bigskip
+% The following counter will be use to specify the level when we set keys: $0$~(global level as with
+% |\WithArrowsOptions|), $1$~(environment level with the |\begin{WithArrows}|) or $2$~(local level with the
+% |\Arrow| command).
+% \begin{macrocode}
+\int_new:N \l_@@_level_int
+% \end{macrocode}
+% \bigskip
% The following skip (=glue) is the vertical space inserted between two lines of the |\halign|.
% \begin{macrocode}
\skip_new:N \l_@@_interline_skip
@@ -1047,29 +1073,35 @@
% \end{macrocode}
%
% \bigskip
-% The following integer indicates the position of the box that will be created : 0 (=|t|=|\vtop|), 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|).
+% The following integer indicates the position of the box that will be created: 0 (=|t|=|\vtop|), 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|).
% \begin{macrocode}
-\int_new:N \l_@@_pos_int
+\int_new:N \l_@@_pos_env_int
% \end{macrocode}
+%
% \bigskip
-% The following flag indicates if the beginning of the arrow use a |r| option (if not, it's a |l| option).
-% \begin{macrocode}
-\bool_new:N \l_@@_initial_r_bool
-\bool_set_true:N \l_@@_initial_r_bool
-% \end{macrocode}
+% The integer |\l_@@_pos_arrows_int| indicates the position of the arrows with the following code:
%
-% \bigskip
-% The following flag indicates if the end of the arrow use a |r| option (if not, it's a |l| option).
+% \begin{center}
+% \begin{tabular}{|l|c|c|c|c|c|c|c|}
+% \hline
+% option & |rr| & |ll| & |rl| & |lr| & |i| & |group| & |groups| \\
+% \hline
+% |\l_@@_pos_arrows_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ \\
+% \hline
+% \end{tabular}
+% \end{center}
+%
% \begin{macrocode}
-\bool_new:N \l_@@_final_r_bool
-\bool_set_true:N \l_@@_final_r_bool
+\int_new:N \l_@@_pos_arrows_int
% \end{macrocode}
%
-% \bigskip
-% The following flag indicates if the arrow use a |i| option (in this case, the options |l| and |r| for the
-% ends are meaningless).
+% \medskip
+% When we scan a list of options, we want to be able to raise an error if two options of position of the arrows
+% are present. That's why we keep the code of the first option of position in a variable called
+% |\l_@@_previous_pos_arrows_int|. This variable will be set to $-1$ each time we start the scanning of a list of options.
+%
% \begin{macrocode}
-\bool_new:N \l_@@_i_bool
+\int_new:N \l_@@_previous_pos_arrows_int
% \end{macrocode}
%
% \bigskip
@@ -1094,30 +1126,29 @@
% \end{macrocode}
%
% \bigskip
-% If the following flag is raised, the elements of the |\halign| will be composed with |\displaystyle| :
+% 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 \pkg{Tikz} options used to draw the arrows.
+% 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{env} or \emph{local} : see below), the new values
-% will be appended on the right of this token list.
+% 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 following flag will be raised when a key controling position of the arrow has been set in the same list of
-% keys (this is useful in order to raise an error if two incompatibles keys are specified at the same level).
+% The dimension |\g_@@_x_dim| will be used to compute the $x$-value for some verticals arrows when one of the
+% options |i|, |group| and |groups| (values 4, 5 and 6 of |\l_@@_pos_arrows_int|) is used.
% \begin{macrocode}
-\bool_new:N \l_@@_position_key_already_set_bool
+\dim_new:N \g_@@_x_dim
% \end{macrocode}
-% This flag is set to |false| each time we have to process a list of options.
%
% \bigskip
-% In the |\halign| of an environment |{WithArrows}|, we will have to use three counters :
+% In the |\halign| of an environment |{WithArrows}|, we will have to use three counters:
% \begin{itemize}
% \item |\g_@@_arrow_int| to count the arrows created in the environment ;
% \item |\g_@@_line_int| to count the lines of the |\halign| ;
@@ -1131,61 +1162,39 @@
% restore the previous value of these counters at the end of an environment |{WithArrows}| and we decide to manage
% a stack for each of these counters.
% \begin{macrocode}
-\seq_new:N \g_@@_stack_counter_arrows_seq
+\seq_new:N \g_@@_arrow_int_seq
\int_new:N \g_@@_arrow_int
-\seq_new:N \g_@@_stack_counter_lines_seq
+\seq_new:N \g_@@_line_int_seq
\int_new:N \g_@@_line_int
-\seq_new:N \g_@@_stack_counter_lines_bis_seq
+\seq_new:N \g_@@_line_bis_int_seq
\int_new:N \g_@@_line_bis_int
% \end{macrocode}
%
% \subsection{The definition of the options}
-% There are three levels where options can be set :
+% There are three levels where options can be set:
% \begin{itemize}
-% \item with |\WithArrowsOptions{...}| : this level will be called \emph{global} level;
-% \item with |\begin{WithArrows}[...]| : this level will be called \emph{env} level;
-% \item with |\Arrow[...]| : this level will be called \emph{local} level.
+% \item with |\WithArrowsOptions{...}|: this level will be called \emph{global} level (number~0);
+% \item with |\begin{WithArrows}[...]|: this level will be called \emph{environment} level (number~1);
+% \item with |\Arrow[...]|: this level will be called \emph{local} level (number~2).
% \end{itemize}
%
-% That's why there is three groups of keys named |global|, |env| and |local|.
+% The level is specified in the variable |\l_@@_level_int| and the code attached to the options can use this
+% information to alter their actions.
%
-% \bigskip
-% Before each |\keys_set_groups:nnn|, we execute a |\keys_set_filter:nnn| with group |secondary|. Thus, an
-% unknown key will raise an error. Furthermore, the \emph{primary} keys (those which are not in the group
-% |secondary|) will be set first : it's useful to raise an error if, for example, keys |i| and
-% |group| are set at the same level (which is incoherent).
-%
% \bigskip
-% \begin{macrocode}
-\keys_define:nn {WithArrows}
-% \end{macrocode}
+% We begin with a first submodule which will be loaded only at the global or the environment level.
%
% \medskip
-% The key |jump| indicates the number of lines jumped by the arrow (1 by default). This key will be extracted
-% when the command |\Arrow| will be executed. That's why this key is the only key of a dedicated group also named
-% |jump|.
-% \begin{macrocode}
- { jump .groups:n = {jump,secondary},
- 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}}},
- jump .value_required:n = true,
-% \end{macrocode}
-%
-% \bigskip
% The options |t|, |c| and |b| indicate if we will create a |\vtop|, a |\vcenter| of a |\vbox|. This information is
-% stored in the variable |\l_@@_pos_int|.
+% stored in the variable |\l_@@_pos_env_int|.
% \begin{macrocode}
- t .groups:n = {global,env,secondary},
- t .code:n = {\int_set:Nn \l_@@_pos_int 0},
+\keys_define:nn {WithArrows/GlobalOrEnv}
+ { t .code:n = {\int_set:Nn \l_@@_pos_env_int 0},
t .value_forbidden:n = true,
- c .groups:n = {global,env,secondary},
- c .code:n = {\int_set:Nn \l_@@_pos_int 1},
+ c .code:n = {\int_set:Nn \l_@@_pos_env_int 1},
c .value_forbidden:n = true,
- b .groups:n = {global,env,secondary},
- b .code:n = {\int_set:Nn \l_@@_pos_int 2},
+ b .code:n = {\int_set:Nn \l_@@_pos_env_int 2},
b .value_forbidden:n = true,
% \end{macrocode}
%
@@ -1193,9 +1202,7 @@
% Usually, the number of columns in a |{WithArrows}| environment is limited to 2. Nevertheless, it's possible to
% have more columns with the option |MoreColumns|.
% \begin{macrocode}
- MoreColumns .groups:n = {global,env,secondary},
MoreColumns .bool_set:N = \l_@@_MoreColumns_bool,
- MoreColumns .default:n = true,
MoreColumns .value_forbidden:n = true,
% \end{macrocode}
%
@@ -1202,7 +1209,6 @@
% \bigskip
% If the user wants to give a new name to the |\Arrow| command (and the name |\Arrow| remains free).
% \begin{macrocode}
- CommandName .groups:n = {global,env,secondary},
CommandName .tl_set:N = \l_@@_CommandName_tl,
CommandName .initial:n = {Arrow},
CommandName .value_required:n = true,
@@ -1209,18 +1215,15 @@
% \end{macrocode}
%
% \bigskip
-% With the option |displaystyle|, all the elements of the environment will be composed in |\displaystyle|.
+% With the option |displaystyle|, the environments will be composed in |\displaystyle|.
% \begin{macrocode}
- displaystyle .groups:n = {global,env,secondary},
- displaystyle .bool_set:N = \l_@@_displaystyle_bool,
+ displaystyle .bool_set:N = \l_@@_displaystyle_bool,
% \end{macrocode}
- %
+%
% \bigskip
% With the option |shownodes|, the nodes will be drawn in red (useful only for debugging).
% \begin{macrocode}
- shownodes .groups:n = {global,env,secondary},
shownodes .bool_set:N = \l_@@_shownodes_bool,
- shownodes .default:n = true,
% \end{macrocode}
%
% \bigskip
@@ -1227,153 +1230,148 @@
% With the option |shownodenames|, the name of the ``right nodes'' will be written in the document (useful only
% for debugging).
% \begin{macrocode}
- shownodenames .groups:n = {global,env,secondary},
- shownodenames .bool_set:N = \l_@@_shownodenames_bool,
- shownodenames .default:n = true,
+ shownodenames .bool_set:N = \l_@@_shownodenames_bool,
% \end{macrocode}
%
% \bigskip
-% The option |jot| can be used to change the value of the LaTeX parameter |\jot|. If we put this option in the
-% |global| group, the use of this option in |\WithArrowsOptions| will change |\jot| for the whole document (at
-% least the current TeX group) and not only for the |{WithArrows}| environments. This is certainly not what the
-% user wants. That's why the option |jot| is not in the group |global|. It's interesting to note that |\jot| is a
-% dimension and not a skip (=glue).
-%
+% With the option |group|, \emph{all} the arrows of the environment are vertical with the same abscissa and at a
+% leftmost position.
% \begin{macrocode}
- jot .groups:n = {env,secondary},
- jot .dim_set:N = \jot,
- jot .value_required:n = true,
+ 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},
+ group .value_forbidden:n = true,
% \end{macrocode}
%
% \bigskip
-% The option |interline| gives the vertical skip (=glue) inserted between two lines (independently of |\jot|). By
-% design, this option has a particular behaviour : it applies only to an environment and doesn't apply to the
-% nested environments.
+% 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.
+% for a individual key.
% \begin{macrocode}
- interline .groups:n = {env,secondary},
- interline .skip_set:N = \l_@@_interline_skip,
- interline .initial:n = \c_zero_skip,
- interline .value_required:n = true,
+ 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}
% \end{macrocode}
%
+%
+%
% \bigskip
-% The option |xoffset| change the $x$-offset of the arrows (towards the right). It's a dimension and not a skip.
-% \begin{macrocode}
- xoffset .groups:n = {global,env,local,secondary},
- xoffset .dim_set:N = \l_@@_xoffset_dim,
- xoffset .value_required:n = true,
-% \end{macrocode}
+% Then we define the main module called |WithArrows| which will be loaded at all the levels.
%
-% \bigskip
+% \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}
- tikz .groups:n = {global,env,local,secondary},
- tikz .code:n = {\tl_put_right:Nn \l_@@_options_tikz_tl {,#1}},
+\keys_define:nn {WithArrows}
+ {tikz .code:n = {\tl_put_right:Nn \l_@@_options_tikz_tl {,#1}},
tikz .value_required:n = true,
% \end{macrocode}
%
% \bigskip
-% The following options can be used to specify the position of the arrows. We control that a previous specification
-% of position has not been set at the same level of option. This is done with the help of the flag
-% |\l_@@_position_key_already_set_bool|.
+% The other options are for the position of the arrows. The treatment is the same for the options |ll|, |rr|, |lr|,
+% |lr| and |i| and that's why a dedicated fonction |\@@_analyze_option_position:n| has been written (see below).
% \begin{macrocode}
- ll .groups:n = {global,env,local,secondary},
- ll .value_forbidden:n = true,
- ll .default:n = true,
- ll .code:n = {\bool_if:NT \l_@@_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l_@@_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l_@@_position_key_already_set_bool
- \bool_set_false:N \l_@@_initial_r_bool
- \bool_set_false:N \l_@@_final_r_bool
- \bool_set_false:N \l_@@_i_bool },
+ 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},
+ i .value_forbidden:n = true,
+ i .code:n = {\@@_analyze_option_position:n 4},
% \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.
% \begin{macrocode}
- lr .groups:n = {global,env,local,secondary},
- lr .value_forbidden:n = true,
- lr .default:n = true,
- lr .code:n = {\bool_if:NT \l_@@_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l_@@_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l_@@_position_key_already_set_bool
- \bool_set_false:N \l_@@_initial_r_bool
- \bool_set_true:N \l_@@_final_r_bool
- \bool_set_false:N \l_@@_i_bool},
+ xoffset .code:n = {\bool_if:nTF {\int_compare_p:nNn \l_@@_level_int = 2 &&
+ \int_compare_p:nNn \l_@@_pos_arrows_int > 4}
+ {\msg_error:nn {witharrows}
+ {Option~incompatible~with~"group(s)"}}
+ {\dim_set:Nn \l_@@_xoffset_dim {#1}}},
+ xoffset .value_required:n = true,
% \end{macrocode}
%
+% \bigskip
+% The option |jot| exists for compatibility. It changes directly the value of the parameter |\jot|, which is a
+% LaTeX parameter and not a parameter specific to \pkg{witharrows}. It's allowed only at the level of the
+% environment (maybe we should suppress completely this option in the future).
% \begin{macrocode}
- rl .groups:n = {global,env,local,secondary},
- rl .value_forbidden:n = true,
- rl .default:n = true,
- rl .code:n = {\bool_if:NT \l_@@_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l_@@_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l_@@_position_key_already_set_bool
- \bool_set_true:N \l_@@_initial_r_bool
- \bool_set_false:N \l_@@_final_r_bool
- \bool_set_false:N \l_@@_i_bool},
+ jot .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
+ {\dim_set:Nn \jot {#1}}
+ {\msg_error:nn {witharrows} {Option~will~be~ignored} }},
+ jot .value_required:n = true,
% \end{macrocode}
%
+% \bigskip
+% The option |interline| gives the vertical skip (=glue) inserted between two lines (independently of |\jot|). It's
+% accepted only at the level of the environment (this last point is a kind of security). Futhermore, this option has a
+% particular behaviour: it applies only to the current environment and doesn't apply to the nested environments.
% \begin{macrocode}
- rr .groups:n = {global,env,local,secondary},
- rr .value_forbidden:n = true,
- rr .default:n = true,
- rr .code:n = {\bool_if:NT \l_@@_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l_@@_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l_@@_position_key_already_set_bool
- \bool_set_true:N \l_@@_initial_r_bool
- \bool_set_true:N \l_@@_final_r_bool
- \bool_set_false:N \l_@@_i_bool},
+ interline .code:n = {\int_compare:nNnTF \l_@@_level_int = 1
+ {\skip_set:Nn \l_@@_interline_skip {#1}}
+ {\msg_error:nn {witharrows} {Option~will~be~ignored}}},
+ interline .value_required:n = true,
% \end{macrocode}
%
% \bigskip
-% With option |i| (for \emph{intermediate}), the arrow will be drawn on the leftmost position compatible with all
-% the lines between the starting line and the final line of the arrow.
+% Eventually, a key |jump| (see below) and a key for unknown keys.
% \begin{macrocode}
- i .groups:n = {global,env,local,secondary},
- i .code:n = {\bool_if:NT \l_@@_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l_@@_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l_@@_position_key_already_set_bool
- \bool_set_true:N \l_@@_i_bool},
- i .value_forbidden:n = true,
- i .default:n = true,
+ jump .code:n = {\msg_error:nn {witharrows} {Option~will~be~ignored}},
+ unknown .code:n = {\msg_error:nn {witharrows} {Option~unknown}}
+}
% \end{macrocode}
%
-% \bigskip
-% With the option |group|, \emph{all} the arrows of the environment are grouped on a same vertical line and at a
-% leftmost position. Of course, this option is not available at the local level.
-%
-% This key is not in the |secondary| group. Thus, it will be set first during the |\keys_set_filter:nnn| and an
-% incompatibility like, for example, |[i,group]| will be detected (with a non fatal error).
+% \bigskip
+% The key |jump| indicates the number of lines jumped by the arrow (1 by default). This key will be extracted when
+% the command |\Arrow| will be executed. That's why there is a special module for this key. The key |jump| is
+% extracted in the command |\Arrow| because we want to compute right away the final line of the arrow (this will be
+% useful for the options |group| and |groups|).
% \begin{macrocode}
- group .groups:n = {global,env},
- group .bool_set:N = \l_@@_group_bool,
- group .value_forbidden:n = true
-}
+\keys_define:nn {WithArrows/jump}
+ {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}}},
+ jump .value_required:n = true}
% \end{macrocode}
%
% \bigskip
-% We process the options when the package is loaded (with |\usepackage|) but we recommend to use |\WithArrowOptions| instead.
+% The following command is for technical reasons. It's used for the following options of position: |ll|,
+% |lr|, |rl|, |rr| and |i|. The argument is the corresponding code for the position of the arrows.
% \begin{macrocode}
+\cs_new_protected:Nn \@@_analyze_option_position: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 {#1}
+% \end{macrocode}
+%
+% It's not possible to use one of the considered options at the level of an arrow (level~2) when the option |group|
+% or the option |groups| is used. However, if we are at the level of an environment, it's possible to override a
+% previous option |group| or |groups| (this previous option |group| or |groups| would necessarily have been set at
+% a global level by |\WithArrowsOptions|).
+% \begin{macrocode}
+ \bool_if:nTF { \int_compare_p:nNn \l_@@_level_int = 2 &&
+ \int_compare_p:nNn \l_@@_pos_arrows_int > 4}
+ {\msg_error:nn {witharrows}
+ {Option~incompatible~with~"group(s)"}}
+ {\int_set:Nn \l_@@_pos_arrows_int {#1}}}
+% \end{macrocode}
+%
+% \bigskip
+% We process the options when the package is loaded (with |\usepackage|) but we recommend to use |\WithArrowsOptions| instead.
+% \begin{macrocode}
\ProcessKeysOptions {WithArrows}
% \end{macrocode}
%
@@ -1381,9 +1379,9 @@
% |\WithArrowsOptions| is the command of the \pkg{witharrows} package to fix options at the document level.
% \begin{macrocode}
\NewDocumentCommand \WithArrowsOptions {m}
- {\bool_set_false:N \l_@@_position_key_already_set_bool
- \keys_set_filter:nnn {WithArrows} {secondary} {#1}
- \keys_set_groups:nnn {WithArrows} {global} {#1}}
+ {\int_set:Nn \l_@@_previous_pos_arrows_int {-1}
+ \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl}
% \end{macrocode}
%
%
@@ -1409,11 +1407,12 @@
% \end{macrocode}
%
% We decide to extract immediatly the key |jump| in order to compute the end line. That's the reason why there is a
-% group |jump| with only one key (the key |jump|).
+% module |WithArrows/jump| with this sole key. The remainded key-value pairs are stored in |\l_tmpa_tl| and will be
+% stored further in the properly list of the arrow.
% \begin{macrocode}
\int_zero_new:N \l_@@_jump_int
\int_set:Nn \l_@@_jump_int 1
- \keys_set_groups:nnn {WithArrows} {jump} {#1,#3}
+ \keys_set_known:nnN {WithArrows/jump} {#1,#3} \l_tmpa_tl
% \end{macrocode}
%
% \medskip
@@ -1422,23 +1421,23 @@
%
% \smallskip
% \begin{enumerate}
-% \item First, the line from which the arrow starts :
+% \item First, the line from which the arrow starts:
% \begin{macrocode}
\prop_put:NnV \l_tmpa_prop {initial} \g_@@_line_int
% \end{macrocode}
%
-% \item The line where the arrow ends (that's why it was necessary to extract the key |jump|) :
+% \item The line where the arrow ends (that's why it was necessary to extract the key |jump|):
% \begin{macrocode}
\int_set:Nn \l_tmpa_int {\g_@@_line_int + \l_@@_jump_int}
\prop_put:NnV \l_tmpa_prop {final} \l_tmpa_int
% \end{macrocode}
%
-% \item All the options of the arrow (it's a token list) :
+% \item All the options of the arrow (it's a token list):
% \begin{macrocode}
- \prop_put:Nnn \l_tmpa_prop {options} {#1,#3}
+ \prop_put:NnV \l_tmpa_prop {options} \l_tmpa_tl
% \end{macrocode}
%
-% \item The label of the arrow (it's also a token list) :
+% \item The label of the arrow (it's also a token list):
% \begin{macrocode}
\prop_put:Nnn \l_tmpa_prop {label} {#2}
% \end{macrocode}
@@ -1465,11 +1464,11 @@
% created for this end.
% \begin{macrocode}
\NewDocumentEnvironment {WithArrows} {O{}}
- { \seq_gput_right:NV \g_@@_stack_counter_arrows_seq \g_@@_arrow_int
+ { \seq_gput_right:NV \g_@@_arrow_int_seq \g_@@_arrow_int
\int_gzero:N \g_@@_arrow_int
- \seq_gput_right:NV \g_@@_stack_counter_lines_seq \g_@@_line_int
+ \seq_gput_right:NV \g_@@_line_int_seq \g_@@_line_int
\int_gzero:N \g_@@_line_int
- \seq_gput_right:NV \g_@@_stack_counter_lines_bis_seq \g_@@_line_bis_int
+ \seq_gput_right:NV \g_@@_line_bis_int_seq \g_@@_line_bis_int
\int_gzero:N \g_@@_line_bis_int
% \end{macrocode}
%
@@ -1517,7 +1516,7 @@
% \end{macrocode}
%
% \bigskip
-% These three counters will be used later as variables.
+% These counters will be used later as variables.
% \begin{macrocode}
\int_zero_new:N \l_@@_initial_int
\int_zero_new:N \l_@@_final_int
@@ -1525,14 +1524,6 @@
% \end{macrocode}
%
% \bigskip
-% The flag |\l_@@_position_key_already_set_bool| is set to false before the treatment of the options of the
-% environment. It will be raised if a key indicating the position of the arrows is found. Thus, we can detect
-% incompatible keys.
-% \begin{macrocode}
- \bool_set_false:N \l_@@_position_key_already_set_bool
-% \end{macrocode}
-%
-% \bigskip
% The value corresponding to the key |interline| is put to zero before the treatment of the options of the
% environment.\footnote{It's recalled that, by design, the option \texttt{interline} of a environment doesn't apply
% in the nested environments.}
@@ -1541,32 +1532,29 @@
% \end{macrocode}
%
% \bigskip
-% The following code in order to raise an error if a key is unknown.
+% We process the options given to the |{WithArrows}| environment. The level of options is set to 1.
% \begin{macrocode}
- \keys_set_filter:nnn {WithArrows} {secondary} {#1}
+ \int_set:Nn \l_@@_previous_pos_arrows_int {-1}
+ \int_set:Nn \l_@@_level_int 1
+ \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl
% \end{macrocode}
%
% \bigskip
-% We process the options given at the \emph{env} level, that is to say in the option of the |{WithArrows}| environment.
+% If the user has given a value for the option |CommandName| (at the global or at the \emph{environment} level), a
+% command with this name is defined locally in the environment with meaning |\@@_Arrow|. The default value of the
+% option |CommandName| is ``|Arrow|'' and thus, by default, the name of the command will be |\Arrow|.
% \begin{macrocode}
- \keys_set_groups:nnn {WithArrows} {env} {#1}
-% \end{macrocode}
-%
-% \bigskip
-% If the user has given a value for the option |CommandName| (at the global or at the \emph{env} level), a command
-% with this name is defined locally in the environment with meaning |\@@_Arrow|. The default value of the option
-% |CommandName| is ``|Arrow|'' and thus, by default, the name of the command will be |\Arrow|.
-% \begin{macrocode}
\cs_set_eq:cN \l_@@_CommandName_tl \@@_Arrow
% \end{macrocode}
%
% \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_int| (usually 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|.
+% \texttt{\string\vtop} seems color-safe here...} depending of the value of |\l_@@_pos_env_int| (fixed by the options
+% |t|, |c| or |b|). The environment |{WithArrows}| must be used in math mode\footnote{An error is raised if the
+% environment is used outside math mode.} and therefore, we can use |\vcenter|.
% \begin{macrocode}
- \int_case:nn \l_@@_pos_int
+ \int_case:nn \l_@@_pos_env_int
{0 {\vtop}
1 {\vcenter}
2 {\vbox}}
@@ -1609,7 +1597,7 @@
%
% \bigskip
% We create the ``left node'' of the line (when using macros in Tikz node names, the macros have to be fully
-% expandable : here, |\tl_use:N| and |\int_use:N| are fully expandable).
+% expandable: here, |\tl_use:N| and |\int_use:N| are fully expandable).
% \begin{macrocode}
\tikz[remember~picture]
\node [@@_node_style]
@@ -1641,7 +1629,7 @@
% \end{macrocode}
%
% \bigskip
-% We begin the second part of the environment |{WithArrows}|. We have two |\egroup| : one for the |\halign| and
+% We begin the second part of the environment |{WithArrows}|. We have two |\egroup|: one for the |\halign| and
% one for the |\vtop| (or |\vcenter| or |\vbox|).
% \begin{macrocode}
{\crcr
@@ -1658,11 +1646,18 @@
% \end{macrocode}
%
% \bigskip
-% It there is really arrows in the environment, we draw the arrows with |\@@_draw_arrows:| (a special macro has
-% been written for lisibility of the code).
+% 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
+% arrows group by group ; the macro |\@@_draw_arrows:| does the work.
+% \end{itemize}
+%
% \begin{macrocode}
\int_compare:nNnT \g_@@_arrow_int > 0
- \@@_draw_arrows:
+ {\int_compare:nNnTF \l_@@_pos_arrows_int > 4
+ \@@_draw_arrows:
+ {\@@_draw_arrows:nn 1 \g_@@_arrow_int}}
% \end{macrocode}
%
% \bigskip
@@ -1681,7 +1676,7 @@
% \end{macrocode}
%
% \bigskip
-% We update the value of the counter |\g_@@_last_env_int|. This counter is used only by the fonction |\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}
@@ -1691,11 +1686,11 @@
% Finally, we restore the previous values of the three counters |\g_@@_arrow_int|, |\g_@@_line_int| and
% |\g_@@_line_bis_int|. It is recalled that we manage three stacks in order to be able to do such a restoration.
% \begin{macrocode}
- \seq_gpop_right:NN \g_@@_stack_counter_arrows_seq {\l_tmpa_tl}
+ \seq_gpop_right:NN \g_@@_arrow_int_seq {\l_tmpa_tl}
\int_gset:Nn \g_@@_arrow_int {\l_tmpa_tl}
- \seq_gpop_right:NN \g_@@_stack_counter_lines_seq \l_tmpa_tl
+ \seq_gpop_right:NN \g_@@_line_int_seq \l_tmpa_tl
\int_gset:Nn \g_@@_line_int {\l_tmpa_tl}
- \seq_gpop_right:NN \g_@@_stack_counter_lines_bis_seq \l_tmpa_tl
+ \seq_gpop_right:NN \g_@@_line_bis_int_seq \l_tmpa_tl
\int_gset:Nn \g_@@_line_bis_int {\l_tmpa_tl}
}
% \end{macrocode}
@@ -1704,7 +1699,7 @@
% \bigskip
% We give now the definition of |\@@_cr:| which is the definition of |\\| in an environment |{WithArrows}|. The two
% \pkg{expl3} commands |\group_align_safe_begin:| and |\group_align_safe_end:| are specifically designed for this
-% purpose : test the token that follows in a |\halign| structure.
+% purpose: test the token that follows in a |\halign| structure.
%
% First, we remove an eventual token |*| since the commands |\\| and |\\*| are equivalent in an environment
% |{WithArrows}| (an environment |{WithArrows}|, like an environment |{aligned}| of \pkg{amsmath} is always unbreakable).
@@ -1731,44 +1726,140 @@
%
% \subsection{We draw the arrows}
%
-% The following code is necessary because we will have to expand an argument exactly 3 times.
+% \bigskip
+% |\@@_draw_arrows:| draws the arrows when the option |group| or the option |groups| is used. In both cases, we have
+% to compute the $x$-value of a group of arrows before actually drawing the arrows of that group. The arrows will
+% actually be drawn by the macro |\@@_draw_arrows:nn|.
+%
% \begin{macrocode}
-\cs_generate_variant:Nn \keys_set_groups:nnn {nno}
-\cs_new_protected:Nn \keys_set_groups_WithArrows_local:
- {\keys_set_groups:nno {WithArrows} {local}}
+\cs_new_protected:Nn \@@_draw_arrows:
+ { \group_begin:
% \end{macrocode}
%
% \bigskip
+% |\l_@@_first_arrow_of_group_int| will be the first arrow of the current group.
+%
+% |\l_@@_first_line_of_group_int| will be the first line involved in the group of arrows (equal to the initial line
+% of the first arrow of the group because the option |jump| is always positive).
+%
+% |\l_@@_last_line_of_group_int| will be the last line involved in the group (impossible to guess in advance).
% \begin{macrocode}
-\cs_generate_variant:Nn \keys_set_filter:nnn {nno}
-\cs_new_protected:Nn \keys_set_filter_WithArrows_secondary:
- {\keys_set_filter:nno {WithArrows} {secondary}}
+ \int_zero_new:N \l_@@_first_arrow_of_group_int
+ \int_zero_new:N \l_@@_first_line_of_group_int
+ \int_zero_new:N \l_@@_last_line_of_group_int
+ \bool_set_true:N \l_@@_new_group_bool
% \end{macrocode}
%
% \bigskip
+% We begin a loop over all the arrows of the environment. Inside this loop, if a group is finished, we will draw
+% the lines of that group.
% \begin{macrocode}
-\cs_new_protected:Nn \@@_draw_arrows:
- {
+ \int_set:Nn \l_@@_arrow_int 1
+ \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int
+ {
% \end{macrocode}
%
-% \medskip
-% If the option |group| is used (for the whole document --- with |\WithArrowsOptions| --- or for the current environment),
-% we have to compute the $x$-value common to all the arrows. This work is done by the command
-% |\@@_x_computation_for_option_group:| and the computed $x$-value is store in |\g_@@_x_dim| (we use a global
-% variable for technical reasons).
+% \bigskip
+% We extract from the property list of the current arrow the fields ``initial'' and ``final'' and we store these
+% values in |\l_@@_initial_int| and |\l_@@_final_int|. However, we have to do a conversion because the components
+% of a property list are token lists.
% \begin{macrocode}
- \bool_if:NT \l_@@_group_bool
- \@@_x_computation_for_option_group:
+ \prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\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}
+ {final} \l_tmpa_tl
+ \int_set:Nn \l_@@_final_int {\l_tmpa_tl}
% \end{macrocode}
%
% \bigskip
+% We test if the previous arrow was in fact the last arrow of a group. In this case, we have to draw all the arrows
+% of that group (with the $x$-value computed in |\g_@@_x_dim|).
+% \begin{macrocode}
+ \bool_if:nT { \int_compare_p:nNn \l_@@_pos_arrows_int = 6
+ && \int_compare_p:nNn \l_@@_arrow_int > 1
+ && \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}
+%
+% \bigskip
+% The flag |\l_@@_new_group_bool| indicates if we have to begin a new group of arrows. In fact, We have to begin a
+% new group in two circonstancies : if we are at the first arrow of the environment (that's why the flag is raised
+% before the beginning of the loop) an if we have just finished a group (that's why the flag is raised in the
+% previous conditionnal). At the beginning of a group, we have to initialize four variables:
+% |\l_@@_first_arrow_int|, |\l_@@_first_line_of_group_int|, |\l_@@_last_line_of_group| dans |\g_@@_x_dim| (global
+% for technical reasons). The last two will evolve during the construction of the group.
+% \begin{macrocode}
+ \bool_if:nTF \l_@@_new_group_bool
+ {\bool_set_false:N \l_@@_new_group_bool
+ \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}} ;
+ }
+% \end{macrocode}
+%
+% \bigskip
+% If we are not at the beginning of a new group, we actualize |\l_@@_last_line_of_group_int|.
+% \begin{macrocode}
+ {\int_set:Nn \l_@@_last_line_of_group_int
+ {\int_max:nn \l_@@_last_line_of_group_int \l_@@_final_int}}
+% \end{macrocode}
+%
+% \bigskip
+% 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).
+% \begin{macrocode}
+ \@@_actualise_x_value:nn \l_@@_initial_int \l_@@_final_int
+% \end{macrocode}
+%
+% \bigskip
+% Incrementation of the index of the loop (and end of the loop).
+% \begin{macrocode}
+ \int_incr:N \l_@@_arrow_int
+ }
+% \end{macrocode}
+%
+% \bigskip
+% After the last arrow of the environment, you have to draw the last group of arrows.
+% \begin{macrocode}
+ \@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int
+ \group_end:
+ }
+% \end{macrocode}
+%
+% \bigskip
+% The following code is necessary because we will have to expand an argument exactly 3 times.
+% \begin{macrocode}
+\cs_generate_variant:Nn \keys_set:nn {no}
+\cs_new_protected:Nn \keys_set_WithArrows: {\keys_set:no {WithArrows}}
+% \end{macrocode}
+%
+%
+% \bigskip
+% The macro |\@@_draw_arrows:nn| draws all the arrows whose numbers are between |#1| and |#2|. |#1| and |#2|
+% must be expressions that expands to an integer (they are expanded in the beginning of the macro).
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_draw_arrows:nn
+ {\group_begin:
+ \int_zero_new:N \l_@@_first_arrow_int
+ \int_set:Nn \l_@@_first_arrow_int {#1}
+ \int_zero_new:N \l_@@_last_arrow_int
+ \int_set:Nn \l_@@_last_arrow_int {#2}
+% \end{macrocode}
+%
+%
+% \bigskip
% We begin a loop over the arrows of the environment. The variable |\l_@@_arrow_int| (local in the environment
-% |{WithArrows}|) will be used as index for the loop. The number of arrows in the environment is |\g_@@_arrow_int|.
-% This variable was a counter incremented when an arrows is encountered during the construction of the |\halign|.
-% After the end of the |\halign|, |g_@@_arrow_int| is the number of arrows in the environment.
+% |{WithArrows}|) will be used as index for the loop.
% \begin{macrocode}
- \int_set:Nn \l_@@_arrow_int 1
- \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int
+ \int_set:Nn \l_@@_arrow_int \l_@@_first_arrow_int
+ \int_until_do:nNnn \l_@@_arrow_int > \l_@@_last_arrow_int
{
% \end{macrocode}
%
@@ -1777,8 +1868,6 @@
% 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.
%
-% \smallskip
-% If the arrow ends after the last line of the environment, we raise an error.
% \begin{macrocode}
\prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\l_@@_arrow_int _prop}
{initial} \l_tmpa_tl
@@ -1786,39 +1875,74 @@
\prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\int_use:N\l_@@_arrow_int _prop}
{final} \l_tmpa_tl
\int_set:Nn \l_@@_final_int {\l_tmpa_tl}
+% \end{macrocode}
+%
+% \bigskip
+% If the arrow ends after the last line of the environment, we raise an error.
+% \begin{macrocode}
\int_compare:nNnT \l_@@_final_int > \g_@@_line_int
{\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
% \end{macrocode}
%
% \bigskip
-% We begin an TeX group which will contains the options local to the current arrow. We declare ``undefined'' the
-% key |group| because it's not possible to have a |group| key for an individual arrow.
+% We prepare the process of the options of the current arrow.
% \begin{macrocode}
\group_begin:
- \keys_define:nn {WithArrows} {group .undefine:}
- \bool_set_false:N \l_@@_position_key_already_set_bool
+ \int_set:Nn \l_@@_previous_pos_arrows_int {-1}
+ \int_set:Nn \l_@@_level_int 2
% \end{macrocode}
%
% \bigskip
-% We process the options of the current arrow. The third argument de |\keys_set_groups:nnn| must be expanded exactly
+% We process the options of the current arrow. The second argument of |\keys_set:nn| must be expanded exactly
% three times. An x-expansion is not possible because there can be tokens like |\bfseries| in the option |font| of
% the option |tikz|. This expansion is a bit tricky.
% \begin{macrocode}
\prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl
_\int_use:N\l_@@_arrow_int _prop} {options} \l_tmpa_tl
- \exp_args:NNo \exp_args:No \keys_set_filter_WithArrows_secondary: {\l_tmpa_tl}
- \exp_args:NNo \exp_args:No \keys_set_groups_WithArrows_local: {\l_tmpa_tl}
+ \exp_args:NNo \exp_args:No \keys_set_WithArrows: {\l_tmpa_tl}
% \end{macrocode}
%
+%
+% We create two booleans to indicate the position of the initial node and final node of the arrow in cases of
+% options |rr|, |rl|, |lr| or |ll|:
+% \begin{macrocode}
+\bool_set_false:N \l_@@_initial_r_bool
+\bool_set_false:N \l_@@_final_r_bool
+\int_case:nn \l_@@_pos_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}
+%
% \bigskip
-% In case of option |i|, we have to compute the $x$-value of the arrow (which is vertical). This work is done by
-% the command |\@@_x_computation_for_option_i:| and the computed $x$-value is stored in |g_@@_x_dim| (the same
-% variable used when the option |group| is used).
+% In case of option |i| (|\l_@@_pos_arrows_int| = 4), 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}
- \bool_if:NT \l_@@_i_bool
- \@@_x_computation_for_option_i:
+ \int_compare:nNnT \l_@@_pos_arrows_int = 4
+ {
% \end{macrocode}
+%
+% \medskip
+% 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)
+ 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
+% |\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 option |group| or option |i|, the point will perhaps have an other $x$-value --- but always the
@@ -1832,10 +1956,10 @@
\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).
+% the shape of small vertical segments: use option |shownodes| to visualize the nodes).
%
% \bigskip
-% We can now draw the arrow in a |{tikzpicture}| :
+% We can now draw the arrow in a |{tikzpicture}|:
% \begin{macrocode}
\begin{tikzpicture}[remember~picture,
overlay,
@@ -1848,17 +1972,14 @@
bend~left=45]
% \end{macrocode}
%
-% Of course, the arrow is drawn with the command |\draw| of Tikz. The syntax for this command is :
+% 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)$
%
% The surprising aspect of this syntax is the position of \textsl{contents} which is the label of the arrow.
%
-% We give a name to the node (\textsl{name} in the previous syntax) but, in fact, we don't use it in the extension
-% |witharrows|.
-%
% |\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, this abscissa used is the value previously calculated in
+% 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,
@@ -1870,19 +1991,19 @@
\draw \exp_after:wN [\l_@@_options_tikz_tl]
let \p1 = (\tl_use:N \l_@@_initial_tl),
\p2 = (\tl_use:N \l_@@_final_tl) in
- (\bool_if:nTF {\l_@@_group_bool || \l_@@_i_bool}
+ (\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
+% 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. :
+% 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}] {}
- (\bool_if:nTF {\l_@@_group_bool || \l_@@_i_bool}
+ (\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}
@@ -1894,44 +2015,21 @@
\group_end:
\int_incr:N \l_@@_arrow_int
}
+ \group_end:
}
% \end{macrocode}
%
% \bigskip
-% We want to compute the $x$-value for the current arrow which has option |i| (and therefore is vertical).
-% This value will be computed in |\g_@@_x_dim| (which is global for technical reasons : we have to do assignments in
-% a Tikz command).
+% 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
+% of |\g_@@_x_dim| is found. |\@@_actualise_x_value:nn| is used in |\@@_draw_arrows:| (for options |group| and
+% |groups|) and in |\@@_draw_arrows:nn| (for option |i|).
% \begin{macrocode}
-\cs_new_protected:Nn \@@_x_computation_for_option_i:
- {\dim_gzero_new:N \g_@@_x_dim
-% \end{macrocode}
-%
-% \medskip
-% First, we calculate the initial value for |\g_@@_x_dim|. 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}
- \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}} ;
-% \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
-% |\l_@@_final_int|... but we have written a command dedicated to this work because it will also be used in
-% |\@@_x_computation_for_option_group:|
-% \begin{macrocode}
- \@@_x_computation_analyze_lines_between:
- }
-% \end{macrocode}
-%
-%
-% \bigskip
-% The command |\@@_x_computation_analyze_lines_between:| will analyse the lines between between |\l_@@_initial_int|
-% and |\l_@@_final_int| in order to modify |\g_@@_x_dim| in consequence. More precisely, we will increase
-% |\g_@@_x_dim| if we find a line longer than the current value of |\g_@@_x_dim|.
-% \begin{macrocode}
-\cs_new_protected:Nn \@@_x_computation_analyze_lines_between:
- {\int_compare:nNnT \l_@@_final_int > \g_@@_line_int
+\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}
%
@@ -1945,67 +2043,19 @@
in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\dim_max:nn \g_@@_x_dim {\x1}}} ;
\int_incr:N \l_tmpa_int
}
+ \group_end:
}
% \end{macrocode}
%
-%
-% \bigskip
-% We want to compute the $x$-value for the current environment which has option |group| (and therefore all arrows are
-% vertical at the same abscissa). Once again, the value will be computed in |\g_@@_x_dim|.
-%
% \begin{macrocode}
-\cs_new_protected:Nn \@@_x_computation_for_option_group:
- {\dim_gzero_new:N \g_@@_x_dim
-% \end{macrocode}
-%
-% \medskip
-% First, we calculate the initial value for |\g_@@_x_dim|. In this loop, we use a Tikz command, but, once again,
-% nothing is drawn. We use this Tikz command only to read the abscissa of a Tikz node.
-% \begin{macrocode}
- \prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _1_prop} {initial} \l_tmpa_tl
- \tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l_@@_prefix_tl-\tl_use:N\l_tmpa_tl-l)
- in \pgfextra {\dim_gset:Nn \g_@@_x_dim {\x1}} ;
-% \end{macrocode}
-% A global assignment is necessary because of Tikz.
-%
-% Then, we loop to determine the maximal length of all the lines concerned by the arrows of the environment.
-% \begin{macrocode}
- \int_set:Nn \l_@@_arrow_int 1
- \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int
- {
-% \end{macrocode}
-% \smallskip
-% |\l_@@_initial_int| is the line number from which the arrow starts and |\l_@@_final_int| is the line number to which
-% the arrow ends.
-% \begin{macrocode}
- \prop_get:cnN {g_@@_arrow_\l_@@_prefix_tl _\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}
- {final} \l_tmpa_tl
- \int_set:Nn \l_@@_final_int {\l_tmpa_tl}
-% \end{macrocode}
-%
-% \smallskip
-% |\@@_x_computation_analyze_lines_between:| will compute between lines |\l_@@_initial_int| and |\l_@@_final_int|.
-% \begin{macrocode}
- \@@_x_computation_analyze_lines_between:
- \int_incr:N \l_@@_arrow_int
- }
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-\cs_generate_variant:Nn \int_compare:nNnT {cNnT}
\cs_generate_variant:Nn \tl_if_eq:nnF {noF}
% \end{macrocode}
%
%
-\bigskip
+% \bigskip
% The command |\WithArrowsLastEnv| is not used by the package \pkg{witharrows}. It's only a facility given to the
-% final user. It gives the number of the last environment |{WithArrows}| at level~$0$. This macro is fully
-% expandable and, thus, can be used directly in the name of a Tikz node.
+% 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}
@@ -2052,22 +2102,27 @@
% \end{macrocode}
%
% \begin{macrocode}
-\msg_new:nnn {witharrows}
- {Option~incompatible~with~group}
- {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
- you~are~using~the~option~"group".~It's~incompatible.~You~can~go~on~ignoring~
- this~option~"\tl_use:N\l_keys_key_tl"~and~"group"~will~be~used.}
+\msg_new:nnn {witharrows}
+ {Two~options~are~incompatible}
+ {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
+ this~option~is~incompatible~or~redundant~with~the~option~"
+ \int_case:nn\l_@@_previous_pos_arrows_int
+ {0 {rr}
+ 1 {ll}
+ 2 {rl}
+ 3 {lr}
+ 4 {i}
+ 5 {group}
+ 6 {groups}}"~
+ previously~set~in~the~same~
+ \int_case:nn\l_@@_level_int
+ {0 {command~\string\WithArrowsOptions}
+ 1 {declaration~of~options~of~the~environment~\{WithArrows\}}
+ 2 {command~\string\Arrow}}.~
+ If~you~go~on,~I~will~overwrite~the~first~option.}
% \end{macrocode}
%
% \begin{macrocode}
-\msg_new:nnn {witharrows}
- {Two~options~are~incompatible}
- {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
- this~option~is~incompatible~with~an~option~previously~set.~
- If~you~go~on,~I~will~overwrite~the~previous~option.}
-% \end{macrocode}
-%
-% \begin{macrocode}
\msg_new:nnnn {witharrows}
{All~lines~must~have~an~ampersand}
{All~lines~of~an~environment~\{WithArrows\}~must~have~an~second~column~
@@ -2077,7 +2132,36 @@
(e.g.~if~you~use~\string\MoveEqLeft\space~of~mathtools).}
% \end{macrocode}
%
+% \begin{macrocode}
+\msg_new:nnn {witharrows}
+ {Option~incompatible~with~"group(s)"}
+ {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
+ you~are~using~the~option~"
+ \int_compare:nNnTF \l_@@_pos_arrows_int = 5
+ {group}
+ {groups}".~
+ It's~incompatible.~You~can~go~on~ignoring~this~option~
+ "\tl_use:N\l_keys_key_tl"~but~you~should~correct~your~code.}
+% \end{macrocode}
%
+% \begin{macrocode}
+\msg_new:nnn {witharrows}
+ {Option~will~be~ignored}
+ {The~option~"\tl_use:N\l_keys_key_tl"~can't~be~used~here.~
+ If~you~go~on,~it~will~be~ignored.}
+% \end{macrocode}
+%
+%
+% \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.}
+% \end{macrocode}
+%
+%
+%
+%
% \section{History}
%
% \subsection{Changes between versions 1.0 and 1.1}
@@ -2091,6 +2175,15 @@
% Better error messages
%
% Creation of a \textsc{dtx} file
+%
+% \subsection{Changes between versions 1.1 and 1.2}
+%
+% The package \pkg{witharrows} can now be loaded without having loaded previously \pkg{tikz} and the Tikz libraries |calc|,
+% |arrow.meta| and |bending|.
+%
+% New option |groups| (with a \emph{s})
+%
+% Better error messages
% \endinput
%
% Local Variables:
Modified: trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty 2017-11-29 22:08:27 UTC (rev 45945)
+++ trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty 2017-11-29 22:08:38 UTC (rev 45946)
@@ -18,8 +18,10 @@
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%%
-\def\myfileversion{1.1}
-\def\myfiledate{2017/11/06}
+\def\myfileversion{1.2}
+\def\myfiledate{2017/11/29}
+\RequirePackage{tikz}
+\usetikzlibrary{calc,arrows.meta,bending}
\RequirePackage{l3keys2e}
\ProvidesExplPackage
{witharrows}
@@ -26,10 +28,7 @@
{\myfiledate}
{\myfileversion}
{Draws arrows for explanations on the right}
-\RequirePackage{expl3}
\RequirePackage{xparse}
-\RequirePackage{tikz}
-\usetikzlibrary{calc,arrows.meta,bending}
\RequirePackage{footnote}
\tikzstyle{__wa_node_style}=[rectangle,
inner~sep = 0 pt,
@@ -44,14 +43,12 @@
\seq_new:N \g__wa_position_in_the_tree_seq
\seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
\int_new:N \g__wa_last_env_int
+\int_new:N \l__wa_level_int
\skip_new:N \l__wa_interline_skip
\bool_new:N \l__wa_MoreColumns_bool
-\int_new:N \l__wa_pos_int
-\bool_new:N \l__wa_initial_r_bool
-\bool_set_true:N \l__wa_initial_r_bool
-\bool_new:N \l__wa_final_r_bool
-\bool_set_true:N \l__wa_final_r_bool
-\bool_new:N \l__wa_i_bool
+\int_new:N \l__wa_pos_env_int
+\int_new:N \l__wa_pos_arrows_int
+\int_new:N \l__wa_previous_pos_arrows_int
\dim_new:N \l__wa_xoffset_dim
\dim_set:Nn \l__wa_xoffset_dim {3mm}
\bool_new:N \l__wa_shownodes_bool
@@ -58,132 +55,92 @@
\bool_new:N \l__wa_shownodenames_bool
\bool_new:N \l__wa_displaystyle_bool
\tl_clear_new:N \l__wa_options_tikz_tl
-\bool_new:N \l__wa_position_key_already_set_bool
-\seq_new:N \g__wa_stack_counter_arrows_seq
+\dim_new:N \g__wa_x_dim
+\seq_new:N \g__wa_arrow_int_seq
\int_new:N \g__wa_arrow_int
-\seq_new:N \g__wa_stack_counter_lines_seq
+\seq_new:N \g__wa_line_int_seq
\int_new:N \g__wa_line_int
-\seq_new:N \g__wa_stack_counter_lines_bis_seq
+\seq_new:N \g__wa_line_bis_int_seq
\int_new:N \g__wa_line_bis_int
-\keys_define:nn {WithArrows}
- { jump .groups:n = {jump,secondary},
- jump .code:n = {\int_set:Nn \l__wa_jump_int {#1}
- \int_compare:nNnF \l__wa_jump_int > 0
- {\msg_error:nn {witharrows}
- {The~option~"jump"~must~be~non~negative}}},
- jump .value_required:n = true,
- t .groups:n = {global,env,secondary},
- t .code:n = {\int_set:Nn \l__wa_pos_int 0},
+\keys_define:nn {WithArrows/GlobalOrEnv}
+ { t .code:n = {\int_set:Nn \l__wa_pos_env_int 0},
t .value_forbidden:n = true,
- c .groups:n = {global,env,secondary},
- c .code:n = {\int_set:Nn \l__wa_pos_int 1},
+ c .code:n = {\int_set:Nn \l__wa_pos_env_int 1},
c .value_forbidden:n = true,
- b .groups:n = {global,env,secondary},
- b .code:n = {\int_set:Nn \l__wa_pos_int 2},
+ b .code:n = {\int_set:Nn \l__wa_pos_env_int 2},
b .value_forbidden:n = true,
- MoreColumns .groups:n = {global,env,secondary},
MoreColumns .bool_set:N = \l__wa_MoreColumns_bool,
- MoreColumns .default:n = true,
MoreColumns .value_forbidden:n = true,
- CommandName .groups:n = {global,env,secondary},
CommandName .tl_set:N = \l__wa_CommandName_tl,
CommandName .initial:n = {Arrow},
CommandName .value_required:n = true,
- displaystyle .groups:n = {global,env,secondary},
- displaystyle .bool_set:N = \l__wa_displaystyle_bool,
- %
- shownodes .groups:n = {global,env,secondary},
+ displaystyle .bool_set:N = \l__wa_displaystyle_bool,
shownodes .bool_set:N = \l__wa_shownodes_bool,
- shownodes .default:n = true,
- shownodenames .groups:n = {global,env,secondary},
- shownodenames .bool_set:N = \l__wa_shownodenames_bool,
- shownodenames .default:n = true,
- jot .groups:n = {env,secondary},
- jot .dim_set:N = \jot,
- jot .value_required:n = true,
- interline .groups:n = {env,secondary},
- interline .skip_set:N = \l__wa_interline_skip,
- interline .initial:n = \c_zero_skip,
- interline .value_required:n = true,
- xoffset .groups:n = {global,env,local,secondary},
- xoffset .dim_set:N = \l__wa_xoffset_dim,
- xoffset .value_required:n = true,
- tikz .groups:n = {global,env,local,secondary},
- tikz .code:n = {\tl_put_right:Nn \l__wa_options_tikz_tl {,#1}},
+ shownodenames .bool_set:N = \l__wa_shownodenames_bool,
+ group .code:n = {\int_compare:nNnT \l__wa_previous_pos_arrows_int > {-1}
+ {\msg_error:nn {witharrows}
+ {Two~options~are~incompatible}}
+ \int_set:Nn \l__wa_previous_pos_arrows_int 5
+ \int_set:Nn \l__wa_pos_arrows_int 5},
+ group .value_forbidden:n = true,
+ groups .code:n = {\int_compare:nNnT \l__wa_previous_pos_arrows_int > {-1}
+ {\msg_error:nn {witharrows}
+ {Two~options~are~incompatible}}
+ \int_set:Nn \l__wa_previous_pos_arrows_int 6
+ \int_set:Nn \l__wa_pos_arrows_int 6},
+ groups .value_forbidden:n = true}
+\keys_define:nn {WithArrows}
+ {tikz .code:n = {\tl_put_right:Nn \l__wa_options_tikz_tl {,#1}},
tikz .value_required:n = true,
- ll .groups:n = {global,env,local,secondary},
+ rr .value_forbidden:n = true,
+ rr .code:n = {\__wa_analyze_option_position:n 0},
ll .value_forbidden:n = true,
- ll .default:n = true,
- ll .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l__wa_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l__wa_position_key_already_set_bool
- \bool_set_false:N \l__wa_initial_r_bool
- \bool_set_false:N \l__wa_final_r_bool
- \bool_set_false:N \l__wa_i_bool },
- lr .groups:n = {global,env,local,secondary},
+ ll .code:n = {\__wa_analyze_option_position:n 1},
+ rl .value_forbidden:n = true,
+ rl .code:n = {\__wa_analyze_option_position:n 2},
lr .value_forbidden:n = true,
- lr .default:n = true,
- lr .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l__wa_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l__wa_position_key_already_set_bool
- \bool_set_false:N \l__wa_initial_r_bool
- \bool_set_true:N \l__wa_final_r_bool
- \bool_set_false:N \l__wa_i_bool},
- rl .groups:n = {global,env,local,secondary},
- rl .value_forbidden:n = true,
- rl .default:n = true,
- rl .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l__wa_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l__wa_position_key_already_set_bool
- \bool_set_true:N \l__wa_initial_r_bool
- \bool_set_false:N \l__wa_final_r_bool
- \bool_set_false:N \l__wa_i_bool},
- rr .groups:n = {global,env,local,secondary},
- rr .value_forbidden:n = true,
- rr .default:n = true,
- rr .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l__wa_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l__wa_position_key_already_set_bool
- \bool_set_true:N \l__wa_initial_r_bool
- \bool_set_true:N \l__wa_final_r_bool
- \bool_set_false:N \l__wa_i_bool},
- i .groups:n = {global,env,local,secondary},
- i .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool
- {\msg_error:nn {witharrows}
- {Two~options~are~incompatible}}
- \bool_if:NT \l__wa_group_bool
- {\msg_error:nn {witharrows}
- {Option~incompatible~with~group}}
- \bool_set_true:N \l__wa_position_key_already_set_bool
- \bool_set_true:N \l__wa_i_bool},
+ lr .code:n = {\__wa_analyze_option_position:n 3},
i .value_forbidden:n = true,
- i .default:n = true,
- group .groups:n = {global,env},
- group .bool_set:N = \l__wa_group_bool,
- group .value_forbidden:n = true
+ i .code:n = {\__wa_analyze_option_position:n 4},
+ xoffset .code:n = {\bool_if:nTF {\int_compare_p:nNn \l__wa_level_int = 2 &&
+ \int_compare_p:nNn \l__wa_pos_arrows_int > 4}
+ {\msg_error:nn {witharrows}
+ {Option~incompatible~with~"group(s)"}}
+ {\dim_set:Nn \l__wa_xoffset_dim {#1}}},
+ xoffset .value_required:n = true,
+ jot .code:n = {\int_compare:nNnTF \l__wa_level_int = 1
+ {\dim_set:Nn \jot {#1}}
+ {\msg_error:nn {witharrows} {Option~will~be~ignored} }},
+ jot .value_required:n = true,
+ interline .code:n = {\int_compare:nNnTF \l__wa_level_int = 1
+ {\skip_set:Nn \l__wa_interline_skip {#1}}
+ {\msg_error:nn {witharrows} {Option~will~be~ignored}}},
+ interline .value_required:n = true,
+ jump .code:n = {\msg_error:nn {witharrows} {Option~will~be~ignored}},
+ unknown .code:n = {\msg_error:nn {witharrows} {Option~unknown}}
}
+\keys_define:nn {WithArrows/jump}
+ {jump .code:n = {\int_set:Nn \l__wa_jump_int {#1}
+ \int_compare:nNnF \l__wa_jump_int > 0
+ {\msg_error:nn {witharrows}
+ {The~option~"jump"~must~be~non~negative}}},
+ jump .value_required:n = true}
+\cs_new_protected:Nn \__wa_analyze_option_position:n
+ {\int_compare:nNnT \l__wa_previous_pos_arrows_int > {-1}
+ {\msg_error:nn {witharrows}
+ {Two~options~are~incompatible}}
+ \int_set:Nn \l__wa_previous_pos_arrows_int {#1}
+ \bool_if:nTF { \int_compare_p:nNn \l__wa_level_int = 2 &&
+ \int_compare_p:nNn \l__wa_pos_arrows_int > 4}
+ {\msg_error:nn {witharrows}
+ {Option~incompatible~with~"group(s)"}}
+ {\int_set:Nn \l__wa_pos_arrows_int {#1}}}
\ProcessKeysOptions {WithArrows}
\NewDocumentCommand \WithArrowsOptions {m}
- {\bool_set_false:N \l__wa_position_key_already_set_bool
- \keys_set_filter:nnn {WithArrows} {secondary} {#1}
- \keys_set_groups:nnn {WithArrows} {global} {#1}}
+ {\int_set:Nn \l__wa_previous_pos_arrows_int {-1}
+ \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl}
\NewDocumentCommand \__wa_Arrow {O{} m O{}}
{\tl_if_eq:noF {WithArrows} {\@currenvir}
{\msg_error:nn {witharrows} {Arrow~used~outside~{WithArrows}~environment}}
@@ -190,11 +147,11 @@
\int_gincr:N \g__wa_arrow_int
\int_zero_new:N \l__wa_jump_int
\int_set:Nn \l__wa_jump_int 1
- \keys_set_groups:nnn {WithArrows} {jump} {#1,#3}
+ \keys_set_known:nnN {WithArrows/jump} {#1,#3} \l_tmpa_tl
\prop_put:NnV \l_tmpa_prop {initial} \g__wa_line_int
\int_set:Nn \l_tmpa_int {\g__wa_line_int + \l__wa_jump_int}
\prop_put:NnV \l_tmpa_prop {final} \l_tmpa_int
- \prop_put:Nnn \l_tmpa_prop {options} {#1,#3}
+ \prop_put:NnV \l_tmpa_prop {options} \l_tmpa_tl
\prop_put:Nnn \l_tmpa_prop {label} {#2}
\prop_gclear_new:c
{g__wa_arrow_\l__wa_prefix_tl _\int_use:N\g__wa_arrow_int _prop}
@@ -203,11 +160,11 @@
\l_tmpa_prop
}
\NewDocumentEnvironment {WithArrows} {O{}}
- { \seq_gput_right:NV \g__wa_stack_counter_arrows_seq \g__wa_arrow_int
+ { \seq_gput_right:NV \g__wa_arrow_int_seq \g__wa_arrow_int
\int_gzero:N \g__wa_arrow_int
- \seq_gput_right:NV \g__wa_stack_counter_lines_seq \g__wa_line_int
+ \seq_gput_right:NV \g__wa_line_int_seq \g__wa_line_int
\int_gzero:N \g__wa_line_int
- \seq_gput_right:NV \g__wa_stack_counter_lines_bis_seq \g__wa_line_bis_int
+ \seq_gput_right:NV \g__wa_line_bis_int_seq \g__wa_line_bis_int
\int_gzero:N \g__wa_line_bis_int
\seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
\seq_set_eq:NN \l_tmpa_seq \g__wa_position_in_the_tree_seq
@@ -224,12 +181,13 @@
\int_zero_new:N \l__wa_initial_int
\int_zero_new:N \l__wa_final_int
\int_zero_new:N \l__wa_arrow_int
- \bool_set_false:N \l__wa_position_key_already_set_bool
\skip_zero:N \l__wa_interline_skip
- \keys_set_filter:nnn {WithArrows} {secondary} {#1}
- \keys_set_groups:nnn {WithArrows} {env} {#1}
+ \int_set:Nn \l__wa_previous_pos_arrows_int {-1}
+ \int_set:Nn \l__wa_level_int 1
+ \keys_set_known:nnN {WithArrows} {#1} \l_tmpa_tl
+ \keys_set:nV {WithArrows/GlobalOrEnv} \l_tmpa_tl
\cs_set_eq:cN \l__wa_CommandName_tl \__wa_Arrow
- \int_case:nn \l__wa_pos_int
+ \int_case:nn \l__wa_pos_env_int
{0 {\vtop}
1 {\vcenter}
2 {\vbox}}
@@ -263,7 +221,9 @@
\int_compare:nNnT \g__wa_line_bis_int < \g__wa_line_int
{\msg_error:nn {witharrows} {All~lines~must~have~an~ampersand}}
\int_compare:nNnT \g__wa_arrow_int > 0
+ {\int_compare:nNnTF \l__wa_pos_arrows_int > 4
\__wa_draw_arrows:
+ {\__wa_draw_arrows:nn 1 \g__wa_arrow_int}}
\spewnotes
\seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
\seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
@@ -270,11 +230,11 @@
\seq_gput_right:Nx \g__wa_position_in_the_tree_seq {\int_eval:n {\l_tmpa_tl + 1}}
\int_compare:nNnT {\seq_count:N \g__wa_position_in_the_tree_seq} = 1
{\int_gincr:N \g__wa_last_env_int}
- \seq_gpop_right:NN \g__wa_stack_counter_arrows_seq {\l_tmpa_tl}
+ \seq_gpop_right:NN \g__wa_arrow_int_seq {\l_tmpa_tl}
\int_gset:Nn \g__wa_arrow_int {\l_tmpa_tl}
- \seq_gpop_right:NN \g__wa_stack_counter_lines_seq \l_tmpa_tl
+ \seq_gpop_right:NN \g__wa_line_int_seq \l_tmpa_tl
\int_gset:Nn \g__wa_line_int {\l_tmpa_tl}
- \seq_gpop_right:NN \g__wa_stack_counter_lines_bis_seq \l_tmpa_tl
+ \seq_gpop_right:NN \g__wa_line_bis_int_seq \l_tmpa_tl
\int_gset:Nn \g__wa_line_bis_int {\l_tmpa_tl}
}
\cs_set_protected:Nn \__wa_cr:
@@ -287,19 +247,54 @@
{\group_align_safe_end:
\cr\noalign{\skip_vertical:n {#1 + \l__wa_interline_skip}
\scan_stop:}}
-\cs_generate_variant:Nn \keys_set_groups:nnn {nno}
-\cs_new_protected:Nn \keys_set_groups_WithArrows_local:
- {\keys_set_groups:nno {WithArrows} {local}}
-\cs_generate_variant:Nn \keys_set_filter:nnn {nno}
-\cs_new_protected:Nn \keys_set_filter_WithArrows_secondary:
- {\keys_set_filter:nno {WithArrows} {secondary}}
\cs_new_protected:Nn \__wa_draw_arrows:
- {
- \bool_if:NT \l__wa_group_bool
- \__wa_x_computation_for_option_group:
- \int_set:Nn \l__wa_arrow_int 1
- \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
+ { \group_begin:
+ \int_zero_new:N \l__wa_first_arrow_of_group_int
+ \int_zero_new:N \l__wa_first_line_of_group_int
+ \int_zero_new:N \l__wa_last_line_of_group_int
+ \bool_set_true:N \l__wa_new_group_bool
+ \int_set:Nn \l__wa_arrow_int 1
+ \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
{
+ \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
+ {initial} \l_tmpa_tl
+ \int_set:Nn \l__wa_initial_int {\l_tmpa_tl}
+ \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
+ {final} \l_tmpa_tl
+ \int_set:Nn \l__wa_final_int {\l_tmpa_tl}
+ \bool_if:nT { \int_compare_p:nNn \l__wa_pos_arrows_int = 6
+ && \int_compare_p:nNn \l__wa_arrow_int > 1
+ && \int_compare_p:nNn \l__wa_initial_int > \l__wa_last_line_of_group_int}
+ {\__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int {\l__wa_arrow_int - 1}
+ \bool_set_true:N \l__wa_new_group_bool}
+ \bool_if:nTF \l__wa_new_group_bool
+ {\bool_set_false:N \l__wa_new_group_bool
+ \int_set:Nn \l__wa_first_arrow_of_group_int \l__wa_arrow_int
+ \int_set:Nn \l__wa_first_line_of_group_int \l__wa_initial_int
+ \int_set:Nn \l__wa_last_line_of_group_int \l__wa_final_int
+ \tikz[remember~picture]
+ \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-l)
+ in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
+ }
+ {\int_set:Nn \l__wa_last_line_of_group_int
+ {\int_max:nn \l__wa_last_line_of_group_int \l__wa_final_int}}
+ \__wa_actualise_x_value:nn \l__wa_initial_int \l__wa_final_int
+ \int_incr:N \l__wa_arrow_int
+ }
+ \__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int \g__wa_arrow_int
+ \group_end:
+ }
+\cs_generate_variant:Nn \keys_set:nn {no}
+\cs_new_protected:Nn \keys_set_WithArrows: {\keys_set:no {WithArrows}}
+\cs_new_protected:Nn \__wa_draw_arrows:nn
+ {\group_begin:
+ \int_zero_new:N \l__wa_first_arrow_int
+ \int_set:Nn \l__wa_first_arrow_int {#1}
+ \int_zero_new:N \l__wa_last_arrow_int
+ \int_set:Nn \l__wa_last_arrow_int {#2}
+ \int_set:Nn \l__wa_arrow_int \l__wa_first_arrow_int
+ \int_until_do:nNnn \l__wa_arrow_int > \l__wa_last_arrow_int
+ {
\prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
{initial} \l_tmpa_tl
\int_set:Nn \l__wa_initial_int {\l_tmpa_tl}
@@ -309,14 +304,25 @@
\int_compare:nNnT \l__wa_final_int > \g__wa_line_int
{\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
\group_begin:
- \keys_define:nn {WithArrows} {group .undefine:}
- \bool_set_false:N \l__wa_position_key_already_set_bool
+ \int_set:Nn \l__wa_previous_pos_arrows_int {-1}
+ \int_set:Nn \l__wa_level_int 2
\prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl
_\int_use:N\l__wa_arrow_int _prop} {options} \l_tmpa_tl
- \exp_args:NNo \exp_args:No \keys_set_filter_WithArrows_secondary: {\l_tmpa_tl}
- \exp_args:NNo \exp_args:No \keys_set_groups_WithArrows_local: {\l_tmpa_tl}
- \bool_if:NT \l__wa_i_bool
- \__wa_x_computation_for_option_i:
+ \exp_args:NNo \exp_args:No \keys_set_WithArrows: {\l_tmpa_tl}
+\bool_set_false:N \l__wa_initial_r_bool
+\bool_set_false:N \l__wa_final_r_bool
+\int_case:nn \l__wa_pos_arrows_int
+ {0 {\bool_set_true:N \l__wa_initial_r_bool
+ \bool_set_true:N \l__wa_final_r_bool}
+ 2 {\bool_set_true:N \l__wa_initial_r_bool}
+ 3 {\bool_set_true:N \l__wa_final_r_bool}}
+ \int_compare:nNnT \l__wa_pos_arrows_int = 4
+ {
+ \tikz[remember~picture]
+ \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-l)
+ in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
+ \__wa_actualise_x_value:nn \l__wa_initial_int \l__wa_final_int
+ }
\tl_set:Nx \l__wa_initial_tl
{wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-
\bool_if:NTF\l__wa_initial_r_bool rl}
@@ -337,11 +343,11 @@
\draw \exp_after:wN [\l__wa_options_tikz_tl]
let \p1 = (\tl_use:N \l__wa_initial_tl),
\p2 = (\tl_use:N \l__wa_final_tl) in
- (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool}
+ (\int_compare:nNnTF \l__wa_pos_arrows_int > 3
{\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y1}
{\x1 + \dim_use:N \l__wa_xoffset_dim, \y1} )
to node [node~contents = {\tl_use:N \l_tmpa_tl}] {}
- (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool}
+ (\int_compare:nNnTF \l__wa_pos_arrows_int > 3
{\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y2}
{\x2 + \dim_use:N \l__wa_xoffset_dim, \y2} ) ;
\end{tikzpicture}
@@ -348,16 +354,13 @@
\group_end:
\int_incr:N \l__wa_arrow_int
}
+ \group_end:
}
-\cs_new_protected:Nn \__wa_x_computation_for_option_i:
- {\dim_gzero_new:N \g__wa_x_dim
- \tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-l)
- in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
- \__wa_x_computation_analyze_lines_between:
- }
-\cs_new_protected:Nn \__wa_x_computation_analyze_lines_between:
- {\int_compare:nNnT \l__wa_final_int > \g__wa_line_int
+\cs_new_protected:Nn \__wa_actualise_x_value:nn
+ {\group_begin:
+ \int_set:Nn \l__wa_initial_int {#1}
+ \int_set:Nn \l__wa_final_int {#2}
+ \int_compare:nNnT \l__wa_final_int > \g__wa_line_int
{\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
\int_set:Nn \l_tmpa_int \l__wa_initial_int
\int_until_do:nNnn \l_tmpa_int > \l__wa_final_int
@@ -366,29 +369,9 @@
in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\dim_max:nn \g__wa_x_dim {\x1}}} ;
\int_incr:N \l_tmpa_int
}
+ \group_end:
}
-\cs_new_protected:Nn \__wa_x_computation_for_option_group:
- {\dim_gzero_new:N \g__wa_x_dim
- \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _1_prop} {initial} \l_tmpa_tl
- \tikz[remember~picture]
- \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\tl_use:N\l_tmpa_tl-l)
- in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
- \int_set:Nn \l__wa_arrow_int 1
- \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
- {
- \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
- {initial} \l_tmpa_tl
- \int_set:Nn \l__wa_initial_int {\l_tmpa_tl}
- \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
- {final} \l_tmpa_tl
- \int_set:Nn \l__wa_final_int {\l_tmpa_tl}
- \__wa_x_computation_analyze_lines_between:
- \int_incr:N \l__wa_arrow_int
- }
- }
-\cs_generate_variant:Nn \int_compare:nNnT {cNnT}
\cs_generate_variant:Nn \tl_if_eq:nnF {noF}
-\bigskip
\NewDocumentCommand \WithArrowsLastEnv {}
{\int_use:N \g__wa_last_env_int}
\msg_new:nnn {witharrows}
@@ -415,16 +398,24 @@
{{WithArrows}~used~outside~math~mode}
{The~environment~\{WithArrows\}~should~be~used~only~in~math~mode.~
Nevertheless,~you~can~go~on.}
-\msg_new:nnn {witharrows}
- {Option~incompatible~with~group}
- {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
- you~are~using~the~option~"group".~It's~incompatible.~You~can~go~on~ignoring~
- this~option~"\tl_use:N\l_keys_key_tl"~and~"group"~will~be~used.}
-\msg_new:nnn {witharrows}
- {Two~options~are~incompatible}
- {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
- this~option~is~incompatible~with~an~option~previously~set.~
- If~you~go~on,~I~will~overwrite~the~previous~option.}
+\msg_new:nnn {witharrows}
+ {Two~options~are~incompatible}
+ {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
+ this~option~is~incompatible~or~redundant~with~the~option~"
+ \int_case:nn\l__wa_previous_pos_arrows_int
+ {0 {rr}
+ 1 {ll}
+ 2 {rl}
+ 3 {lr}
+ 4 {i}
+ 5 {group}
+ 6 {groups}}"~
+ previously~set~in~the~same~
+ \int_case:nn\l__wa_level_int
+ {0 {command~\string\WithArrowsOptions}
+ 1 {declaration~of~options~of~the~environment~\{WithArrows\}}
+ 2 {command~\string\Arrow}}.~
+ If~you~go~on,~I~will~overwrite~the~first~option.}
\msg_new:nnnn {witharrows}
{All~lines~must~have~an~ampersand}
{All~lines~of~an~environment~\{WithArrows\}~must~have~an~second~column~
@@ -432,6 +423,23 @@
you~will~have~an~pgf~error~for~an~undefined~shape.}
{The~ampersand~can~be~implicit~
(e.g.~if~you~use~\string\MoveEqLeft\space~of~mathtools).}
+\msg_new:nnn {witharrows}
+ {Option~incompatible~with~"group(s)"}
+ {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
+ you~are~using~the~option~"
+ \int_compare:nNnTF \l__wa_pos_arrows_int = 5
+ {group}
+ {groups}".~
+ It's~incompatible.~You~can~go~on~ignoring~this~option~
+ "\tl_use:N\l_keys_key_tl"~but~you~should~correct~your~code.}
+\msg_new:nnn {witharrows}
+ {Option~will~be~ignored}
+ {The~option~"\tl_use:N\l_keys_key_tl"~can't~be~used~here.~
+ If~you~go~on,~it~will~be~ignored.}
+\msg_new:nnn {witharrows}
+ {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.}
\endinput
%%
%% End of file `witharrows.sty'.
More information about the tex-live-commits
mailing list