texlive[45056] Master: witharrows (17aug17)

commits+karl at tug.org commits+karl at tug.org
Thu Aug 17 23:17:11 CEST 2017


Revision: 45056
          http://tug.org/svn/texlive?view=revision&revision=45056
Author:   karl
Date:     2017-08-17 23:17:10 +0200 (Thu, 17 Aug 2017)
Log Message:
-----------
witharrows (17aug17)

Modified Paths:
--------------
    trunk/Master/tlpkg/bin/tlpkg-ctan-check
    trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/latex/witharrows/
    trunk/Master/texmf-dist/doc/latex/witharrows/README.md
    trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
    trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.tex
    trunk/Master/texmf-dist/tex/latex/witharrows/
    trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
    trunk/Master/tlpkg/tlpsrc/witharrows.tlpsrc

Added: trunk/Master/texmf-dist/doc/latex/witharrows/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/witharrows/README.md	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/witharrows/README.md	2017-08-17 21:17:10 UTC (rev 45056)
@@ -0,0 +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 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.
\ No newline at end of file


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

Index: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf	2017-08-17 21:16:23 UTC (rev 45055)
+++ trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf	2017-08-17 21:17:10 UTC (rev 45056)

Property changes on: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.tex
===================================================================
--- trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.tex	2017-08-17 21:17:10 UTC (rev 45056)
@@ -0,0 +1,785 @@
+% This document is compatible with the following workflows :
+%    pdflatex,
+%    xelatex (with xdvipdfmx),
+%    latex --> dvips --> ps2pdf (or Adobe Distiller).
+\documentclass{article}
+
+\usepackage{ifxetex}
+
+\ifxetex
+  \usepackage{xltxtra}
+\else
+  \usepackage{expl3}
+  \usepackage{xparse}
+  \usepackage[T1]{fontenc}
+\fi
+
+\usepackage{xspace}
+
+
+\usepackage[dvipsnames]{xcolor}
+
+\usepackage{lmodern}
+
+\ifxetex
+   \usepackage[xetex]{geometry}
+\else
+   \usepackage{geometry}
+\fi
+
+\geometry{papersize={16.5cm,24cm},total={12.5cm,21cm},headheight=13.2pt,includeheadfoot,twoside,centering}
+
+
+\usepackage{tikz}
+\usetikzlibrary{calc}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{bending}
+\usetikzlibrary{decorations.pathreplacing}
+
+
+\usepackage{footnote}
+
+\usepackage{witharrows}
+
+\usepackage{fancyvrb}
+\usepackage{mathtools}
+
+
+% this following lines only for this document
+
+\usepackage{amsfonts}
+
+\def\interitem{\vskip 7mm plus 2 mm minus 3mm}          
+\def\emphase#1{{\color{RoyalPurple}#1}}
+\fvset{commandchars=\~\#\@,formatcom={\color{gray}}}
+\DeclareMathOperator{\re}{Re}
+\let\group\begingroup
+
+
+\begin{document}
+
+
+\parindent0pt
+
+\title{Extension witharrows, v. 1.0}
+
+\author{Fran\c cois Pantigny}
+
+\date{2017/08/17}
+
+\maketitle
+
+
+
+\begin{abstract}
+The LaTeX package \verb|witharrows| gives an environment \verb|{WithArrows}| which is similar to environment
+\verb|{aligned}| of \verb|amsmath| (and \verb|mathtools|) but gives the possibility to draw arrows on the right
+side of the alignment. These arrows are usually used to give explanations concerning the mathematical calculus presented.
+\end{abstract}
+
+
+\vskip1cm
+
+This package uses Tikz to draw the arrows. It can be used with \verb|xelatex|, \verb|pdflatex| but also by the
+classical workflow \verb|latex|-\verb|dvips|-\verb|ps2pdf| (or Distiller). Two compilations may be necessary.
+
+\medskip
+This package gives an environment \verb|{WithArrows}| to construct alignments of equations with
+arrows for the explanations on the right side :
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 ~emphase#\Arrow{we expand}@ \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+
+\medskip
+The arrow has been drawn with the command \verb|\Arrow| on the ligne from which it starts. The command \verb|\Arrow|
+can be used anywhere on the line but the best way is to put it at the end.
+
+
+\medskip
+The ends of the lines of the tabular can be coded by \verb|\\| but also by \verb|\cr| (like in the command
+\verb|\halign| of TeX). In fact, in an environment \verb|{WithArrows}|, the command \verb|\\| has no option for the
+spacing between rows like in many environments of LaTeX.
+
+
+
+
+\section{Options for the shape of the arrows}
+
+The commande \verb|\Arrow| has several options. These options can be put between square brackets, before, or after
+the mandatory argument.
+
+The option \verb|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.}
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 \Arrow~emphase#[jump=2]@{we expand} \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 \\
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 \Arrow[jump=2]{we expand} \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 \\
+\end{WithArrows}$
+
+
+
+
+\interitem
+It's possible to put several arrows which start from the same line.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 ~emphase#\Arrow{}\Arrow{}[jump=2]@ \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 \Arrow{}\Arrow{}[jump=2] \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+
+
+\interitem
+The option \verb|xoffset| shift the arrows to the right (we usually don't want the arrows to be stucked
+on the text). The default value of \verb|xoffset| is $3$~mm.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 
+\Arrow[~emphase#xoffset=1cm@]{with \texttt{xoffset=1cm}} \\
+  & = (a+b)^2 + 2(a+b) +1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 
+\Arrow[xoffset=1cm]{with \texttt{xoffset=1cm}} \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+\end{WithArrows}$
+
+
+
+
+\interitem 
+The arrows are drawn with Tikz. That's why the command \verb|\Arrow| has an option
+\verb|tikz| which can be used to give to the arrow (in fact, the command \verb|\path| of Tikz) the options
+proposed by Tikz for such an arrow. The following example gives an blue thick arrow.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[~emphase#tikz={blue,thick}@]{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[tikz={blue,thick}]{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+
+\interitem
+It's also possible to change the arrowheadss. For example, we can draw an arrow which goes backwards 
+with the Tikz option~\verb|<-|.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow~emphase#[tikz=<-]@{we factorize} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[tikz=<-]{we factorize} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+
+\interitem
+It's also possible to suppress both tips of the arrow with the Tikz option \verb|-|.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[~emphase#tikz=-@]{very classical} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[tikz=-]{very classical} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+
+\interitem
+In order to have straight arrows instead of curved ones, we must use the Tikz option ``\verb|bend left = 0|''.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow~emphase#[tikz={bend left=0}]@{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[tikz={bend left=0}]{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+
+\interitem
+One of the most useful options is ``\verb|text width|'' to control the with of the text associated to the arrow. 
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 
+\Arrow[jump=2,~emphase#tikz={text width=5.3cm}@]{We have done...} \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = \bigl((a+b)+1\bigr)^2 
+\Arrow[jump=2,tikz={text width=5.3cm}]{We have done a two-stages expansion but it would have been clever
+to expand with the multinomial theorem.} \\
+  & = (a+b)^2 + 2(a+b) +1 \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+
+
+\interitem
+If we want to change the font of the text associated to the arrow, we can, of course, put a command like
+\verb|\bfseries|, \verb|\large| or \verb|\sffamily| at the beginning of the text. But, by default, the texts
+are composed with a combination of \verb|\small| and \verb|\itshape|. When adding \verb|\bfseries| at the beginning
+of the text, we won't suppress the \verb|\small| and the \verb|\itshape| and we will consequently have a text in a
+bold, italic and small font.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{~emphase#\bfseries@ we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{\bfseries we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+\interitem 
+If we put commands \verb|\\| 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 \verb|\\| (like in a environment \verb|{tabular}|). That's why
+Tikz gives a option \verb|font| to modify the font of the whole text. Nevertheless, if we use the option
+\verb|tikz={font={\bfseries}}|, the default specification of \verb|\small| and \verb|\itshape| will be overwritten.
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[~emphase#tikz={font={\bfseries}}@]{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow[tikz={font={\bfseries}}]{we expand} \\
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+\medskip
+If we want exactly the same result as previously, we have to give to the option \verb|font| the value 
+\verb|{\itshape\small\bfseries}|.
+
+
+
+
+\interitem 
+Almost all the options can be given directly to the environment \verb|WithArrows| (between square brackets).
+In this case, they apply to all the arrows of the environment.
+%
+\begin{Verbatim}
+$\begin{WithArrows}~emphase#[tikz=blue]@
+A & = \bigl((a+b)+1\bigr)^2 \Arrow{First expansion.} \\
+  & = (a+b)^2 + 2(a+b) +1 \Arrow{Second expansion.} \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}[tikz=blue]
+A & = \bigl((a+b)+1\bigr)^2 \Arrow{First expansion.} \\
+  & = (a+b)^2 + 2(a+b) +1 \Arrow{Second expansion.} \\
+  & = a^2 + 2ab + b^2 + 2a + 2b +1 
+\end{WithArrows}$
+
+
+\interitem
+The environment \verb|{WithArrows}| has an option \verb|displaystyle|. With this option, all the elements are
+composed in \verb|\displaystyle| (like in an environment \verb|{aligned}| of \verb|amsmath|). 
+
+\medskip
+Without the option \verb|displaystyle| :
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+\int_0^1 (x+1)^2 dx 
+& = \int_0^1 (x^2+2x+1) dx
+\Arrow{linearity of integration}     \\
+& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
+& = \frac13 + 2\frac12 + 1 \\
+& = \frac73
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+\int_0^1 (x+1)^2 dx 
+& = \int_0^1 (x^2+2x+1) dx
+\Arrow{linearity of integration}     \\
+& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
+& = \frac13 + 2\frac12 + 1 \\
+& = \frac73
+\end{WithArrows}$
+
+
+\medskip
+The same example with the option \verb|displaystyle| :\par\nobreak
+
+$\begin{WithArrows}[displaystyle]
+\int_0^1 (x+1)^2 dx 
+& = \int_0^1 (x^2+2x+1) dx
+\Arrow{linearity of integration}     \\
+& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\
+& = \frac13 + 2\frac12 + 1 \\
+& = \frac73
+\end{WithArrows}$
+
+
+\interitem 
+Almost all the options can also be set at the document level with the command \verb|\WithArrowsOptions|. 
+In this case, the scope of the declarations is the current TeX group (these declarations are ``semi-global'').
+For example, if we want all the environments \verb|{WithArrows}| composed in \verb|\displaystyle| with blue
+arrows, we can write \verb|\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{It's also possible to give the
+  options directly when loading the package, \emph{i.e.} with the command \texttt{\string\usepackage} in the preamble.}
+%
+\begin{Verbatim}
+~emphase#\WithArrowsOptions{displaystyle,tikz=blue}@
+$\begin{WithArrows}
+\sum_{i=1}^n (x_i+1)^2 
+& = \sum_{i=1}^n (x_i^2+2x_i+1) \Arrow{by linearity}\\
+& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n
+\end{WithArrows}$
+\end{Verbatim}
+
+\begin{group}
+\WithArrowsOptions{displaystyle,tikz=blue}
+$\begin{WithArrows}
+\sum_{i=1}^n (x_i+1)^2 
+& = \sum_{i=1}^n (x_i^2+2x_i+1) \Arrow{by linearity}\\
+& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n
+\end{WithArrows}$
+\end{group}
+
+
+\interitem
+The command \verb|\Arrow| is recognized only in the environments \verb|{WithArrows}|. If we have a command 
+\verb|\Arrow| previously defined, it's possible to go on using it outside the environments \verb|{WithArrows}|.
+
+However, a previouly defined command \verb|\Arrow| may still be useful in a environment \verb|{WithArrows}|. If we
+want to use it in such an environment, it's possible to change the name of the command \verb|\Arrow| of the package
+\verb|witharrows| : there is an option \verb|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}
+$\begin{WithArrows}~emphase#[CommandName=Explanation]@
+f & = \bigl(x \Arrow (x+1)^2\bigr)
+~emphase#\Explanation{we work directly on fonctions}@\\
+& = \bigl(x \Arrow x^2+2x+1\bigr)
+\end{WithArrows}$
+\end{Verbatim}
+%
+\begin{group}
+\def\Arrow{\longmapsto}
+$\begin{WithArrows}[CommandName=Explanation]
+f & = \bigl(x \Arrow (x+1)^2\bigr)
+\Explanation{we work directly on fonctions}\\
+& = \bigl(x \Arrow x^2+2x+1\bigr)
+\end{WithArrows}$
+\end{group}
+
+
+\interitem 
+It's possible to use directly the nodes created by \verb|{WithArrows}| (see below) with explicit Tikz instructions
+(in order, for example, to draw something that can't be drawn with the command \verb|\Arrow|). That's why a style
+for the tips of the arrows has be created : \verb|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 \verb|{WithArrows}|, we have to modify the style
+\verb|TipsOfWithArrows|. 
+%
+\begin{Verbatim}
+\tikzset{TipsOfWithArrows/.style= { > = {Latex[scale=1.2,bend]}} }
+\end{Verbatim}
+
+
+
+
+\section{Precise positioning of the arrows}
+
+
+The environment \verb|{WithArrows}| defines, during the composition of the array, two series of nodes materialized in
+red in the following example.\footnote{The option \texttt{shownodes} can be used to materialize the nodes.}
+
+\smallskip
+$\begin{WithArrows}[displaystyle,shownodes]
+I
+& = \int_{\frac{\pi}4}^0 \ln\Bigl(1+\tan\left(\tfrac{\pi}4-u\right)\Bigr)(-d u) \\
+& = \int_0^{\frac{\pi}4} \ln\Bigl(1+\tan\left(\tfrac{\pi}4-u\right)\Bigr)d u \\
+& = \int_0^{\frac{\pi}4}\ln\left(1+\frac{1-\tan u}{1+\tan u}\right)\, d u \\
+& =\int_0^{\frac{\pi}4}\ln\left(\frac{1+\tan u+1-\tan u}{1+\tan u}\right) d u \\
+& =\int_0^{\frac{\pi}4} \ln\left(\frac2{1+\tan u}\right)\, d u\\
+& =\int_0^{\frac{\pi}4}\bigl(\ln2-\ln(1+\tan u)\bigr)\, d u \\
+& =\frac{\pi}4\ln2-\int_0^{\frac{\pi}4}\ln(1+\tan u)\, d u  \\
+& =\frac{\pi}4\ln2-I 
+\end{WithArrows}$
+
+\bigskip
+The nodes of the left are at the end of each line of text. These nodes will be called \emph{left nodes}.
+The nodes of the right side are aligned vertically on the right side of the array. These nodes will be called
+\emph{right nodes}.\footnote{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 \verb|rr| mode ($r$ for \emph{right}).
+These arrows are \verb|vertical| (we will say that an arrow is \emph{vertical} when its two ends have the
+same abscissa).
+
+
+\smallskip
+However, it's possible to use the left nodes, or a combination of left and right nodes, with one of the options
+\verb|lr|, \verb|rl| and \verb|ll| ($l$ for \emph{left}). Those arrows are, usually, not vertical.
+
+
+Therefore
+$\begin{WithArrows}[displaystyle]
+I
+& = \int_{\frac{\pi}4}^0 \ln\Bigl(1+\tan\left(\tfrac{\pi}4-u\right)\Bigr)(-d u) 
+\Arrow[lr]{This arrow uses the \texttt{lr} option.}\\
+& = \int_0^{\frac{\pi}4} \ln\Bigl(1+\tan\left(\tfrac{\pi}4-u\right)\Bigr)d u \\
+& = \int_0^{\frac{\pi}4}\ln\left(1+\frac{1-\tan u}{1+\tan u}\right)\, d u \\
+& =\int_0^{\frac{\pi}4}\ln\left(\frac{1+\tan u+1-\tan u}{1+\tan u}\right) d u 
+\Arrow[ll,jump=2,tikz={text width = 5cm}]{This arrow uses a \texttt{ll} option and a \texttt{jump} equal to $2$}\\
+& =\int_0^{\frac{\pi}4} \ln\left(\frac2{1+\tan u}\right)\, d u\\
+& =\int_0^{\frac{\pi}4}\bigl(\ln2-\ln(1+\tan u)\bigr)\, d u \\
+& =\frac{\pi}4\ln2-\int_0^{\frac{\pi}4}\ln(1+\tan u)\, d u  \\
+& =\frac{\pi}4\ln2-I 
+\end{WithArrows}$
+
+
+
+\interitem
+There is also an option called \texttt{i} ($i$ for \emph{intermediate}). With this option, the arrow is vertical
+and at the leftmost position.
+
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+(a+b)(a+ib)(a-b)(a-ib) 
+& = (a+b)(a-b)\cdot(a+ib)(a-ib) \\
+& = (a^2-b^2)(a^2+b^2) \Arrow~emphase#[i]@{because $(x-y)(x+y)=x^2-y^2$}\\
+& = a^4-b^4 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+(a+b)(a+ib)(a-b)(a-ib) 
+& = (a+b)(a-b)\cdot(a+ib)(a-ib) \\
+& = (a^2-b^2)(a^2+b^2) \Arrow[i]{because $(x-y)(x+y)=x^2-y^2$}\\
+& = a^4-b^4 
+\end{WithArrows}$
+
+
+\interitem 
+The environment \verb|{WithArrows}| gives also a \verb|group| option. With this option, \emph{all} the
+arrows of the environment are grouped on a same vertical line and at a leftmost position.
+%
+\begin{Verbatim}[formatcom=\small\color{gray}]
+$\begin{WithArrows}~emphase#[displaystyle,group]@
+2xy'-3y=\sqrt x
+& \Longleftrightarrow 2x(K'y_0+Ky_0')-3Ky_0 = \sqrt x \\
+& \Longleftrightarrow 2xK'y_0 + K(2xy_0'-3y_0) = \sqrt x \\
+& \Longleftrightarrow 2x K'y_0 = \sqrt x \Arrow{...}\\
+...
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}[displaystyle,group]
+2xy'-3y=\sqrt x
+& \Longleftrightarrow 2x(K'y_0+Ky_0')-3Ky_0 = \sqrt x \\
+& \Longleftrightarrow 2xK'y_0 + K(2xy_0'-3y_0) = \sqrt x \\
+& \Longleftrightarrow 2x K'y_0 = \sqrt x \Arrow{We remplace $y_0$ by its value.}\\
+& \Longleftrightarrow 2xK'x^{\frac32} = x^{\frac12} \Arrow{simplification of the $x$}\\
+& \Longleftrightarrow K' = \tfrac1{2x²} \Arrow{antiderivation}\\
+& \Longleftrightarrow K = -\tfrac1{2x} 
+\end{WithArrows}$
+
+
+\bigskip
+If desired, the option \verb|group| can be given to the command \verb|WithArrowsOptions| so that it will become the
+default value.
+
+
+\section{Comparison with the environment \{aligned\}}
+
+
+
+\verb|{WithArrows}| bears similarities with the environment \verb|{aligned}| of the extension
+\verb|amsmath|. These are only similarities because \verb|{WithArrows}| has not been written upon the environment
+\verb|{aligned}|. 
+
+In paticular, the command \verb|\\| of the end of line has no option to change the row spacings. In fact, this
+command \verb|\\| can be replaced, in a environment \verb|{WithArrows}| by a \verb|\cr| of TeX. That's what we will 
+do in the balance of this document.
+
+
+
+
+\interitem
+If desired, it's possible to change the spacing between two given lines by putting a command
+\verb|\vspace| in a \verb|\noalign| (which is a low level command of TeX to insert extraordinary elements between
+the lines of an array).
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{we expand} \cr
+~emphase#\noalign{\vspace{3mm}}@
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{we expand} \cr
+\noalign{\vspace{3mm}}
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+
+\interitem 
+In the  environments of \verb|amsmath|, the spacing between lines is fixed by a parameter called
+\verb|\jot| and that's also the case for the environment \verb|{WithArrows}|. An option \verb|jot| has been given
+to the environment \verb|{WithArrows}| in order to change the value of this parameter \verb|\jot| for an given environment.
+%
+\begin{Verbatim}
+$\begin{WithArrows}[displaystyle,~emphase#jot=2mm@]
+F & = \frac12G     \Arrow{we expand}\cr
+  & = H + \frac12K \Arrow{we go on}\cr
+  & = K 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}[displaystyle,jot=2mm]
+F & = \frac12G     \Arrow{we expand}\cr
+  & = H + \frac12K \Arrow{we go on}\cr
+  & = K 
+\end{WithArrows}$
+
+
+\interitem
+Like the environment \verb|{aligned}|, \verb|{WithArrows}| has an option of placement which can assume the values
+\verb|t|, \verb|c| or \verb|b|. However, the default value is not \verb|c| but \verb|t|. If desired, it's possible
+to have the \verb|c| value as the default with the command \verb|WithArrowsOptions{c}| at the beginning of the document.
+%
+\begin{Verbatim}
+~emphase#Et donc\enskip@
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{we expand} \cr
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+\end{Verbatim}
+
+Et donc\enskip 
+$\begin{WithArrows}
+A & = (a+1)^2 \Arrow{we expand} \cr
+  & = a^2 + 2a + 1 
+\end{WithArrows}$
+
+\bigskip
+The value \verb|c| may be useful, for example, if we want to add curly braces :
+
+\smallskip
+\begin{Verbatim}
+On pose\enskip $~emphase#\left\{@
+\begin{WithArrows}~emphase#[c]@
+f(x) & = 3x^3+2x^2-x+4 
+\Arrow[tikz=-]{both are polynoms}\cr
+g(x) & = 5x^2-5x+6
+\end{WithArrows}
+~emphase#\right.@$
+\end{Verbatim}
+
+
+
+
+On pose\enskip $\left\{
+\begin{WithArrows}[c]
+f(x) & = 3x^3+2x^2-x+4 
+\Arrow[tikz=-]{both are polynoms}\cr
+g(x) & = 5x^2-5x+6
+\end{WithArrows}
+\right.$
+
+
+\interitem
+Unlike \verb|{aligned}|, the environment \verb|{WithArrows}| uses \verb|\textstyle| by default.
+
+Once again, it's possible to change this behaviour with \verb|WithArrowsOptions| :
+
+\quad \verb|WithArrowsOptions{displaystyle}|.
+
+
+\smallskip
+The following example is composed with \verb|{aligned}| :\par\nobreak
+
+\smallskip
+$\left\{
+\begin{aligned}
+\sum_{i=1}^n (x_i+1)^2  
+& = \sum_{i=1}^n (x_i^2 + 2x_i+1) \\
+& = \sum_{i=1}^n x_i^2 + 2 \sum_{i=1}^nx_i + n 
+\end{aligned}
+\right.$%
+
+
+\medskip
+The following is composed with \verb|{WithArrows}[c,displaystyle]|. The results are stricly identical.\par\nobreak
+
+\smallskip
+$\left\{
+\begin{WithArrows}[c,displaystyle]
+\sum_{i=1}^n (x_i+1)^2 
+& = \sum_{i=1}^n (x_i^2 + 2x_i+1) \\
+& = \sum_{i=1}^n x_i^2 + 2 \sum_{i=1}^nx_i + n 
+\end{WithArrows}
+\right.$%
+
+
+
+
+\section{Examples}
+
+It's possible to use the environment \verb|{WithArrows}| with making use of the left column only, or the right
+column only. 
+%
+\begin{Verbatim}
+$\begin{WithArrows}
+&f(x) \ge g(x) \Arrow{by squaring both sides} \cr
+& f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \cr
+& f(x)^2 - g(x)^2 \ge 0 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}
+&f(x) \ge g(x) \Arrow{by squaring both sides} \cr
+& f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \cr
+& f(x)^2 - g(x)^2 \ge 0 
+\end{WithArrows}$
+
+
+\interitem
+Here is an example with a loop flow.
+%
+\begin{Verbatim}[formatcom=\small\color{gray}]
+$\begin{WithArrows}[tikz={font={\tiny}}]
+a.\;& f \text{ est continuous on } E 
+\Arrow{(1)}\Arrow[tikz=<-,jump=4,xoffset=1cm]{(5)}\cr
+b.\;& f \text{ est continuous in } 0 
+\Arrow{(2)}\cr
+c.\;& f \text{ is bounded on the unit sphere} 
+\Arrow{(3)}\cr
+d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| 
+\Arrow{(4)}\cr
+e.\;& f \text{ is lipschitzian} 
+\end{WithArrows}$
+\end{Verbatim}
+
+$\begin{WithArrows}[tikz={font={\tiny}}]
+a.\;& f \text{ est continuous on } E 
+\Arrow{(1)}\Arrow[tikz=<-,jump=4,xoffset=1cm]{(5)}\cr
+b.\;& f \text{ est continuous in } 0 
+\Arrow{(2)}\cr
+c.\;& f \text{ is bounded on the unit sphere} 
+\Arrow{(3)}\cr
+d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| 
+\Arrow{(4)}\cr
+e.\;& f \text{ is lipschitzian} 
+\end{WithArrows}$
+
+\interitem
+The option \verb|font| of Tikz contains in fact a list of tokens which will be placed at the beginning of the text.
+
+These tokens can be true commands for a changement of font (like \verb|\bfseries| or \verb|\sffamily|) but can also
+be, in fact, any TeX command.
+
+In the following example, the argument of \verb|font| is the token list \verb|\tiny\counter| where
+\verb|\counter| is a command which increment a counter previously defined and display its new value. Thus, the
+arrows are automatically numbered.
+%
+\begin{Verbatim}[formatcom=\small\color{gray}]
+\newcounter{MyCounter}
+\newcommand{\counter}{\stepcounter{MyCounter}\theMyCounter.}
+$\begin{WithArrows}[tikz={~emphase#font={\tiny\counter}@}]
+A(x) 
+& = B(x) \Arrow{} \cr
+& = C(x) \Arrow{} \cr
+& = C(x) \Arrow{} \cr
+& = E(x) \Arrow{} \cr
+& = F(x) \Arrow{} \cr
+& = G(x)   
+\end{WithArrows}$
+\end{Verbatim}
+
+\begin{group}
+\newcounter{MyCounter}
+\newcommand{\counter}{\stepcounter{MyCounter}\theMyCounter.}
+$\begin{WithArrows}[tikz={font={\tiny\counter}}]
+A(x) 
+& = B(x) \Arrow{} \cr
+& = C(x) \Arrow{} \cr
+& = C(x) \Arrow{} \cr
+& = E(x) \Arrow{} \cr
+& = F(x) \Arrow{} \cr
+& = G(x)   
+\end{WithArrows}$
+\end{group}
+
+
+
+\end{document}
+
+
+
+
+


Property changes on: trunk/Master/texmf-dist/doc/latex/witharrows/witharrows.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty	2017-08-17 21:17:10 UTC (rev 45056)
@@ -0,0 +1,505 @@
+% This work may be distributed and modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%   http://mirrors.ctan.org/help/Catalogue/licenses.lppl.html
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+
+
+% The author of this work is F. Pantigny (fpantigny at wanadoo point fr)
+
+\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+
+
+\RequirePackage{l3keys2e}
+
+\ProvidesExplPackage
+  {WithArrows}
+  {2017/08/09}
+  {1.0}
+  {Draws arrows for explanations on the right side of a alignment.} 
+
+
+\RequirePackage{expl3}
+\RequirePackage{xparse}
+
+\RequirePackage{tikz}
+\usetikzlibrary{calc}
+\usetikzlibrary{arrows.meta}
+\usetikzlibrary{bending}
+
+
+
+\RequirePackage{footnote}
+
+
+
+% There is a style for the tips of arrow because someone will use this style
+% if he wants draw an arrow directly with a Tikz command in his document (probably using the Tikz nodes created by
+% {WithArrows} in the \halign.
+\tikzset{TipsOfWithArrows/.style= { > = {Straight~Barb[scale=1.2,bend]}} }
+
+
+% The following variables are for the options ; these options can be set at 3 levels : see the groups of keys defined in
+% the \keys_define:nn comand below.
+
+% if the beginning of the arrow use a "r" option (if not, it's a "l" option)
+\bool_new:N \l_wa_initial_r_bool
+\bool_set_true:N \l_wa_initial_r_bool
+
+% if the end of the arrow use a "r" option (if not, it's à "l" option)
+\bool_new:N \l_wa_final_r_bool
+\bool_set_true:N \l_wa_final_r_bool
+
+% if the arrow use a "i" option (in this case the options "l" and "r" for the ends are meaningless)
+\bool_new:N \l_wa_i_bool
+\bool_set_false:N \l_wa_i_bool
+
+% to translate the whole arrow to the right
+\dim_new:N \l_wa_xoffset_dim 
+\dim_set:Nn \l_wa_xoffset_dim {3mm}
+
+% to indicate if the nodes will be drawn (in red) ; useful only for debugging
+\bool_new:N \l_wa_shownodes_bool
+\bool_set_false:N \l_wa_shownodes_bool
+
+% to indiate if the elements of the \halign will be composed with \displaystyle
+\bool_new:N \l_wa_displaystyle_bool
+\bool_set_false:N \l_wa_displaystyle_bool
+
+% will contains the Tikz options used to draw the arrow
+\tl_clear_new:N \l_wa_options_tikz_tl
+% At each possible level for the options ("global", "env" or "local : see below), the new values will be appended
+% on the right of the token list \l_wa_options_tikz_tl
+
+% will be raised when a key controling position of the arrow has been set in the same list of key
+% useful in order to raise an error if 2 incompatibles keys are specified at the same level
+\bool_new:N \l_wa_position_key_already_set_bool
+\bool_set_false:N \l_wa_position_key_already_set_bool
+
+% This Tikz style is for the nodes created automatically in the \halign.
+\tikzstyle{wa_node_style}=[rectangle,
+                           inner~sep = 0 pt,
+                           minimum~height = 3 pt,
+                           minimum~width = 0pt,
+                           red,  % red... but will be drawn only if shownodes=true
+                           \bool_if:NT \l_wa_shownodes_bool {draw}]
+
+
+
+% There are 3 levels where keys can be set :
+% with \WithArrowsOptions{...} : this level will be called "global" level ;
+% with \begin{WithArrows}[...] : this level will be called "env" level ;
+% with \Arrow[...] : this level will be called "local" level.
+
+% That's why there is 3 groups of keys named "global", "env" and "local".
+
+% 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 "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).
+
+% There is also the group named "jump" (with only one key : "jump") for technical reasons.
+\keys_define:nn {WithArrows} 
+    { % the key named "jump" will be extracted in the \Arrow command 
+      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,
+      %
+      % 0 = t = \vtop , 1 = c = \vcenter, 2 = b = \vbox
+      pos         .groups:n         = {global,env,secondary},
+      pos         .int_set:N        = \l_wa_pos_int,
+      pos         .initial:n        = 0,
+      pos         .value_required:n = true,
+      %
+      t           .groups:n         = {global,env,kown},
+      t           .meta:n           = {pos=0},
+      c           .groups:n         = {global,env,kown},
+      c           .meta:n           = {pos=1},
+      b           .groups:n         = {global,env,kown},
+      b           .meta:n           = {pos=2},
+      %
+      % if the user wants to give a new name to the \Arrow command (and the name \Arrow remains free)
+      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,
+      displaystyle .value_forbidden:n = true,
+      %
+      %
+      shownodes .groups:n          = {global,env,secondary},
+      shownodes .bool_set:N        = \l_wa_shownodes_bool,
+      shownodes .default:n         = true,
+      shownodes .value_forbidden:n = true, 
+      %
+      jot       .groups:n          = {env,secondary},  % don't put "global"
+      jot       .dim_set:N         = \jot, % \jot is a LaTeX parameter for the distance between 2 lines in displaymath
+      jot       .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}},
+      tikz     .value_required:n  = true,
+      %
+      ll       .groups:n          = {global,env,local,secondary},
+      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},
+      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},
+      i        .value_forbidden:n = true,
+      i        .default:n         = true,
+      %
+      % indicate if all the arrows of an environment are grouped
+      % volontary not in "secondary" group : thus, if will be set first during the \keys_set_filter:nnn
+      group        .groups:n          = {global,env},   
+      group        .bool_set:N        = \l_wa_group_bool,
+      group        .value_forbidden:n = true
+}
+
+
+
+
+
+\ProcessKeysOptions {WithArrows}
+
+
+% \WithArrowsOptions is the command of the WithArrows package to fix options at the document level
+\NewDocumentCommand \WithArrowsOptions {m}
+    {\bool_set_false:N \l_wa_position_key_already_set_bool
+     \keys_set_filter:nnn {WithArrows} {secondary} {#1}   % in order to raise an error if a key is unknown
+     \keys_set_groups:nnn {WithArrows} {global} {#1}}
+
+
+
+\NewDocumentEnvironment {WithArrows} {O{}}
+          {\reverse_if:N \if_mode_math:
+                             \msg_error:nn {WithArrows} {WithArrows~used~outside~math~mode}
+                         \fi
+           \savenotes % to extract the footnotes of the environment {WithArrows}
+           \m at th                
+           \def\\{\cr}
+           %
+           \int_gzero_new:N \g_wa_line_int  % to count the lines in the \halign 
+           %
+           % to count the arrows created in the environment
+           \int_gzero_new:N \g_wa_arrow_int 
+           %
+           % these 3 counters will be used later as variables
+           \int_zero_new:N \l_initial_int
+           \int_zero_new:N \l_final_int
+           \int_zero_new:N \l_arrow_int
+           % 
+           \bool_set_false:N \l_wa_position_key_already_set_bool
+           \keys_set_filter:nnn {WithArrows} {secondary} {#1} % in order to raise an error if a key is unknown
+           \keys_set_groups:nnn {WithArrows} {env} {#1}
+           %
+           \cs_set:cpn \l_wa_CommandName_tl {\wa_Arrow} % new name for \Arrow command in {WithArrows} environments
+           %
+           \int_case:nnF \l_wa_pos_int % is fixed via the options t, c or b
+                   {0 {\vtop}
+                    1 {\vcenter}
+                    2 {\vbox}}
+                   {\msg_error:nn {WithArrows} {Bad~value~for~option~pos}}
+           \bgroup
+           \openup\jot
+           \ialign\bgroup
+           \int_gincr:N \g_wa_line_int % will be used for the names of the 2 nodes of the line
+           \strut\hfil
+           $\bool_if:NT \l_wa_displaystyle_bool \displaystyle {##}$
+           & 
+           $\bool_if:NT \l_wa_displaystyle_bool \displaystyle {{}##}$
+           %
+           % we create a first node (the "left node" of the line)
+           \tikz[remember~picture] 
+                  \node [wa_node_style] (wa-\int_use:N\g_wa_line_int-l) {} ;
+           \hfil
+           % we create a second node (the "right node" of the line)
+           \tikz[remember~picture] 
+                  \node [wa_node_style] (wa-\int_use:N\g_wa_line_int-r) {} ;
+           \cr
+          }
+          {\crcr % 
+           \egroup% end of halign
+           \egroup% end of vtop (or \vcenter or \vbox)
+           %
+           \int_compare:nNnT \g_wa_arrow_int > 0   % If there is really arrows...
+                    \wa_draw_arrows:               % ...we draw these arrows.
+           \spewnotes
+           }
+
+
+
+% le following code is necessary because we whill have to expand un argument exactly 3 times
+\cs_generate_variant:Nn \keys_set_groups:nnn {nno}
+\cs_new:Nn \keys_set_groups_WithArrows_local: {\keys_set_groups:nno {WithArrows} {local}}
+
+\cs_generate_variant:Nn \keys_set_filter:nnn {nno}
+\cs_new:Nn \keys_set_filter_WithArrows_secondary: {\keys_set_filter:nno {WithArrows} {secondary}}
+
+\cs_new:Nn \wa_draw_arrows:
+  {%
+   % if the option "group" is used in the current environment
+   \bool_if:NT \l_wa_group_bool
+        \wa_x_computation_for_option_group:   % will compute \g_wa_x_dim which is the abscissa of all the arrows 
+   %
+   % loop over the arrows created in the environment : the arrows will be drawn
+   \int_set:Nn \l_arrow_int 1
+   \int_until_do:nNnn \l_arrow_int > \g_wa_arrow_int   % g_wa_arrow_int is the total number of arrows
+     {
+      % \l_initial_int is the line number from which the arrow starts
+      \int_set:Nn \l_initial_int {\int_use:c {wa_initial\int_use:N\l_arrow_int}}
+      %
+      % \l_final_int is the line number to which the arrow ends
+      \int_set:Nn \l_final_int {\int_use:c {wa_final\int_use:N\l_arrow_int}}
+      %
+      \int_compare:nNnT \l_final_int > \g_wa_line_int
+             {\msg_error:nn {WithArrows} {Too~few~lines~for~an~arrow}}
+      %
+      \group_begin: % for the options given in \Arrow[...] ("local level" of the options)
+           \keys_define:nn {WithArrows} {group .undefine:}
+           \bool_set_false:N \l_wa_position_key_already_set_bool
+           % the third argument de \keys_set_groups:nnn must be expanded exactly three times
+           % a x-expansion is not possible because there can be tokens like \bfseries in the option "font"
+           \exp_args:NNo \exp_args:No \keys_set_filter_WithArrows_secondary: {\use:c {wa_options\int_use:N\l_arrow_int}}
+           \exp_args:NNo \exp_args:No \keys_set_groups_WithArrows_local: {\use:c {wa_options\int_use:N\l_arrow_int}}
+           %
+           % In case of option "i", we have to compute the abscissa of the arrow (which is vertical).
+           \bool_if:NT \l_wa_i_bool
+               \wa_x_computation_for_option_i: % the abscissa is computed in \g_wa_x_dim
+           %
+           % \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
+           % same y-value). 
+           \tl_set:Nx \l_initial_tl {wa-\int_use:N\l_initial_int-\bool_if:NTF\l_wa_initial_r_bool rl} 
+           %
+           % \l_final_tl contains the name of the Tikz node to which the arrow ends (in normal cases : with option
+           % "group" or option "i", the point will perhaps have an other x-value but always the same y-value)
+           \tl_set:Nx \l_final_tl {wa-\int_use:N\l_final_int-\bool_if:NTF\l_wa_final_r_bool rl . north}
+           % ". north" because we want a small gap between two consecutive arrows
+           % 
+           \begin{tikzpicture}[remember~picture,
+                               overlay,
+                               align=left,
+                               auto=left,
+                               font = {\small\itshape},
+                               TipsOfWithArrows,
+                               ->,
+                               looseness=1,
+                               bend~left=45]
+           \draw \exp_after:wN [\l_wa_options_tikz_tl]
+                 % \p1 and \p2 are the two ends of the arrow (in fact, not exactly in case of options "group" or "i")
+                 let \p1 = (\tl_use:N \l_initial_tl),
+                     \p2 = (\tl_use:N \l_final_tl) in 
+                   (\bool_if:nTF {\l_wa_group_bool || \l_wa_i_bool}
+                     {\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 (wa-a-\int_use:N\l_arrow_int) % in fact, this name will not be used by WithArrows
+                           {\tl_use:c {wa_label\int_use:N\l_arrow_int}}
+                   (\bool_if:nTF {\l_wa_group_bool || \l_wa_i_bool}
+                     {\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}
+       \group_end: % for the options given to \Arrow[...] ("local level" of the options)
+       \int_incr:N \l_arrow_int
+      } % end of the loop over the arrows : all arrows are drawn
+     }
+
+
+% 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). This value will be computed in \g_wa_x_dim (which is global for technical reasons :
+% we have to do assignments in a \tikz command).
+\cs_new:Nn \wa_x_computation_for_option_group:
+  {\dim_gzero_new:N \g_wa_x_dim
+   %
+   % first, we calculate the initial value for \g_wa_x_dim
+   % in this \tikz command, nothing is drawn : we only want to read the abscissa of a Tikz node
+   \tikz[remember~picture]
+      \path let \p1 = (wa-\int_use:c{wa_initial1}-l)      % "let" is given by the Tikz library "calc"
+            in \pgfextra {\dim_gset:Nn \g_wa_x_dim {\x1}} ;  % 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.
+   \int_set:Nn \l_arrow_int 1
+   \int_until_do:nNnn \l_arrow_int > \g_wa_arrow_int   % g_wa_arrow_int is the total number of arrows
+      { % \l_initial_int is the line number from which the arrow starts
+        \int_set:Nn \l_initial_int {\int_use:c {wa_initial\int_use:N\l_arrow_int}}
+        %
+        % \l_final_int is the line number to which the arrow ends
+        \int_set:Nn \l_final_int {\int_use:c {wa_final\int_use:N\l_arrow_int}}
+        %
+        \wa_x_computation_analyze_lines_between: %... between lines \l_initial_int and \l_final_int
+        %
+        \int_incr:N \l_arrow_int
+      } % end of the loop over the arrows of the environment
+   }   
+
+
+% 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_wa_x_dim (which is global for technical reasons : we have to do assignments in
+% a \tikz command). 
+\cs_new:Nn \wa_x_computation_for_option_i:
+  {\dim_gzero_new:N \g_wa_x_dim
+   % First, we calculate the initial value for \g_wa_x_dim.
+   % In the next \tikz command, nothing is drawn : we only want to read a abscissa of a Tikz node.
+   \tikz[remember~picture]
+      \path let \p1 = (wa-\int_use:N\l_initial_int-l) % "let" is given by the Tikz library "calc"
+            in \pgfextra {\dim_gset:Nn \g_wa_x_dim {\x1}} ;  % a global assignment is necessary because of \tikz
+   %
+   \wa_x_computation_analyze_lines_between:  %... between lines \l_initial_int and \l_final_int
+   }
+
+
+
+        
+% We analyse lines between \l_initial_int and \l_final_int in order to modify \g_wa_x_dim in consequence.
+% More precisely, we will increase \g_wa_x_dim if we find a line longer than the current value of \g_wa_x_dim.
+\cs_new:Nn \wa_x_computation_analyze_lines_between:
+    {\int_compare:nNnT \l_final_int > \g_wa_line_int
+             {\msg_error:nn {WithArrows} {Too~few~lines~for~an~arrow}}
+     %
+     % \l_tmpa_int will be the index of the loop
+     \int_set:Nn \l_tmpa_int \l_initial_int
+     \int_until_do:nNnn \l_tmpa_int > \l_final_int
+         {% in the next \tikz command, nothing is drawn : we only want to read the abscissa of a Tikz node
+          \tikz[remember~picture]
+             \path let \p1 = (wa-\int_use:N\l_tmpa_int-l) 
+                   in \pgfextra {\dim_gset:Nn \g_wa_x_dim {\dim_max:nn \g_wa_x_dim {\x1}}} ; % \gset because of \tikz
+          \int_incr:N \l_tmpa_int
+         } % loop on the lines between \l_initial_int et \l_final_int
+    }   
+
+
+
+\cs_generate_variant:Nn \int_compare:nNnT {cNnT}
+
+\cs_generate_variant:Nn \tl_if_eq:nnF {onF}
+
+
+% The next command has a strange name, but, in fact, usually, we will have \let\Arrow\wa_Arrow ;
+% The user can use the CommandName option if he wants an other name for the command called \Arrow by default.
+% It's useful if the user already has a command named "\Arrow" he still wants to use.
+\NewDocumentCommand \wa_Arrow {O{} m O{}}
+         {\tl_if_eq:onF {\@currenvir} {WithArrows}
+                  {\msg_fatal:nn {WithArrows} {Arrow~used~outside~{WithArrows}~environment}}
+          %
+          % \g_wa_arrow_int counts the arrows in the environment
+          \int_gincr:N \g_wa_arrow_int
+          %
+          % we decide to extract immediatly the key "jump" in ordre to compute the end line ;
+          \int_zero_new:N \l_jump_int
+          \int_set:Nn \l_jump_int 1
+          \keys_set_groups:nnn {WithArrows} {jump} {#1,#3} % "jump" is the only key of the group "jump"
+          % 
+          % to stock the informations of the considered arrow (in four variables) ;
+          % these informations will be used when the arrow will be really drawn
+          \int_gzero_new:c {wa_initial\int_use:N\g_wa_arrow_int}
+          \int_gset_eq:cN  {wa_initial\int_use:N\g_wa_arrow_int} \g_wa_line_int
+          %
+          \int_gzero_new:c {wa_final\int_use:N\g_wa_arrow_int}
+          \int_gset:cn     {wa_final\int_use:N\g_wa_arrow_int} {\g_wa_line_int + \l_jump_int}
+          %
+          \tl_gclear_new:c {wa_options\int_use:N\g_wa_arrow_int}
+          \tl_gset:cn      {wa_options\int_use:N\g_wa_arrow_int} {#1,#3}
+          %
+          \tl_gclear_new:c {wa_label\int_use:N\g_wa_arrow_int}
+          \tl_gset:cn      {wa_label\int_use:N\g_wa_arrow_int} {#2}
+          %
+          }
+
+
+
+\msg_new:nnn {WithArrows}
+             {Arrow~used~outside~{WithArrows}~environment}
+             {Arrow~command~should~be~used~only~directly~in~\{WithArrows\}~environment\\
+              and~not~in~a~subenvironment.}
+
+\msg_new:nnn {WithArrows}
+             {The~option~"jump"~must~be~non~negative}
+             {You~can't~use~a~stricly~negative~value~for~the~option~"jump"~of~command~Arrow\\
+              You~can~create~an~arrow~going~backwards~with~the~option~"<-"~of~Tikz.}
+
+\msg_new:nnn {WithArrows}          
+             {Too~few~lines~for~an~arrow}
+             {There~is~at~least~an~arrow~that~can't~be~drawn~because~it~arrives~after~the\\
+              last~line~of~the~environment.}
+
+\msg_new:nnn {WithArrows}
+             {Bad~value~for~option~pos}
+             {The~option~"pos"~of~the~environment~\{WithArrows\}~must~be~equal~to\\        
+              0,~1,~or~2.}
+
+\msg_new:nnn {WithArrows}
+             {WithArrows~used~outside~math~mode}
+             {The~environment~WithArrows~must~be~used~only~in~math~mode.}
+
+\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,~it~will~overwrite~the~previous~option.}
+
+
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/latex/witharrows/witharrows.sty
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/bin/tlpkg-ctan-check
===================================================================
--- trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-08-17 21:16:23 UTC (rev 45055)
+++ trunk/Master/tlpkg/bin/tlpkg-ctan-check	2017-08-17 21:17:10 UTC (rev 45056)
@@ -661,7 +661,7 @@
     voss-mathcol
     vpe vruler vwcol
   wadalab wallpaper warning warpcol was wasy wasy2-ps wasysym webguide
-    widetable williams withargs
+    widetable williams withargs witharrows
     wnri wnri-latex wordcount wordlike
     wrapfig wsemclassic wsuipa wtref
   xargs xassoccnt xcharter xcite xcjk2uni xcntperchap

Modified: trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc
===================================================================
--- trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc	2017-08-17 21:16:23 UTC (rev 45055)
+++ trunk/Master/tlpkg/tlpsrc/collection-mathscience.tlpsrc	2017-08-17 21:17:10 UTC (rev 45056)
@@ -158,6 +158,7 @@
 depend ulqda
 depend unitsdef
 depend venn
+depend witharrows
 depend xymtex
 depend yhmath
 depend youngtab

Added: trunk/Master/tlpkg/tlpsrc/witharrows.tlpsrc
===================================================================


More information about the tex-live-commits mailing list