From 9d52a67c4dd12d828f99b735ed4970f3d338cb24 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 17 Aug 2017 21:17:10 +0000 Subject: witharrows (17aug17) git-svn-id: svn://tug.org/texlive/trunk@45056 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/witharrows/README.md | 9 + .../texmf-dist/doc/latex/witharrows/witharrows.pdf | Bin 0 -> 124003 bytes .../texmf-dist/doc/latex/witharrows/witharrows.tex | 785 +++++++++++++++++++++ .../texmf-dist/tex/latex/witharrows/witharrows.sty | 505 +++++++++++++ 4 files changed, 1299 insertions(+) create mode 100644 Master/texmf-dist/doc/latex/witharrows/README.md create mode 100644 Master/texmf-dist/doc/latex/witharrows/witharrows.pdf create mode 100644 Master/texmf-dist/doc/latex/witharrows/witharrows.tex create mode 100644 Master/texmf-dist/tex/latex/witharrows/witharrows.sty (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/latex/witharrows/README.md b/Master/texmf-dist/doc/latex/witharrows/README.md new file mode 100644 index 00000000000..10ca27cb4f7 --- /dev/null +++ b/Master/texmf-dist/doc/latex/witharrows/README.md @@ -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 diff --git a/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf b/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf new file mode 100644 index 00000000000..fe3b4175df5 Binary files /dev/null and b/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf differ diff --git a/Master/texmf-dist/doc/latex/witharrows/witharrows.tex b/Master/texmf-dist/doc/latex/witharrows/witharrows.tex new file mode 100644 index 00000000000..675da4518ee --- /dev/null +++ b/Master/texmf-dist/doc/latex/witharrows/witharrows.tex @@ -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} + + + + + diff --git a/Master/texmf-dist/tex/latex/witharrows/witharrows.sty b/Master/texmf-dist/tex/latex/witharrows/witharrows.sty new file mode 100644 index 00000000000..c3bd9a31d67 --- /dev/null +++ b/Master/texmf-dist/tex/latex/witharrows/witharrows.sty @@ -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@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 -- cgit v1.2.3