diff options
author | Karl Berry <karl@freefriends.org> | 2019-07-31 21:04:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2019-07-31 21:04:44 +0000 |
commit | 5bd631809868c0cd6a422fb244377a4fa028d4c1 (patch) | |
tree | be03590a3b2b5849d903aad7d43ab64db4a800ac /Master | |
parent | 04bd30e9411ab504dd72f7baac778196bfb3c18c (diff) |
witharrows-in-latex removal
git-svn-id: svn://tug.org/texlive/trunk@51791 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master')
-rw-r--r-- | Master/texmf-dist/doc/latex/witharrows/README.md | 28 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/witharrows/witharrows-french.pdf | bin | 251565 -> 0 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/witharrows/witharrows-french.tex | 2244 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/witharrows/witharrows.pdf | bin | 553254 -> 0 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/witharrows/witharrows.dtx | 6603 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/witharrows/witharrows.ins | 47 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/witharrows/witharrows.sty | 2037 |
7 files changed, 0 insertions, 10959 deletions
diff --git a/Master/texmf-dist/doc/latex/witharrows/README.md b/Master/texmf-dist/doc/latex/witharrows/README.md deleted file mode 100644 index b706fd6ac2e..00000000000 --- a/Master/texmf-dist/doc/latex/witharrows/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# Readme for the package witharrows - -Author : F. Pantigny (`fpantigny@wanadoo.fr`). - -CTAN page : `https://ctan.org/pkg/witharrows` - -## License -The LaTeX extension `witharrows` is distributed under the LPPL 1.3 license. - -## Presentation - -The LaTeX package `witharrows` provides environments `{WithArrows}` and `{DispWithArrows}` -similar to the environments `{aligned}` and `{align}` of `amsmath` but with the possibility to draw arrows on the right side of the alignment. These arrows are usually used to give explanations concerning the mathematical calculus presented. - - - -## Installation - -The package `witharrows` is present in the distributions MiKTeX, TeXLive and MacTeX. - -For a manual installation: - -* put the files `witharrows.ins` dans `witharrows.dtx` in the same directory; -* run `latex witharrows.ins`. - -The file `witharrows.sty` will be generated. - -The file `witharrows.sty` is the only file necessary to use the extension `witharrows`. diff --git a/Master/texmf-dist/doc/latex/witharrows/witharrows-french.pdf b/Master/texmf-dist/doc/latex/witharrows/witharrows-french.pdf Binary files differdeleted file mode 100644 index 642c9f86139..00000000000 --- a/Master/texmf-dist/doc/latex/witharrows/witharrows-french.pdf +++ /dev/null diff --git a/Master/texmf-dist/doc/latex/witharrows/witharrows-french.tex b/Master/texmf-dist/doc/latex/witharrows/witharrows-french.tex deleted file mode 100644 index 65f0355dfb7..00000000000 --- a/Master/texmf-dist/doc/latex/witharrows/witharrows-french.tex +++ /dev/null @@ -1,2244 +0,0 @@ -% -*- coding: utf-8 ; -*- -\documentclass[dvipsnames]{article}% dvipsnames est pour xcolor (chargé par Tikz) -\usepackage{xltxtra} -\usepackage[french]{babel} - -\usepackage[xetex]{geometry} -\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}} - -\usepackage{amsmath} -\usepackage{color} -\usepackage{verbatim} -\usepackage{mathtools} -\usepackage[footnotehyper]{witharrows} -\usepackage{amsfonts} -\usepackage{amssymb} -\usepackage{varwidth} -\usetikzlibrary{calc} -\usepackage[only,llbracket,rrbracket]{stmaryrd} - -\usepackage{fancyvrb} -\fvset{commandchars=\~\#\@,formatcom={\color{gray}}} - -\usepackage{titlesec} -\titlespacing*{\section}{0pt}{6.5ex plus 1ex minus .2ex}{4.3ex plus .2ex} -\titlespacing*{\subsection}{0pt}{4.5ex plus 1ex minus .2ex}{2ex plus .2ex} - - -\def\interitem{\vskip 7mm plus 2 mm minus 3mm} -\def\emphase{\bgroup\color{RoyalPurple}\let\next=} - -\skip \footins = 2 \bigskipamount - -\usepackage[hyperfootnotes = false]{hyperref} - -\hypersetup{ - pdfinfo = { - Title = { L’extension witharrows }, - Subject = { Une extension LaTeX } , - Author = { F. Pantigny } - } -} - -\NewDocumentEnvironment {scope} {} {} {} - -\NewDocumentCommand {\pkg} {m} {\textsf{#1}} -\NewDocumentCommand {\cls} {m} {\textsf{#1}} - -\setlength{\parindent}{0pt} - - -\begin{document} - -\VerbatimFootnotes - -\title{L'extension \pkg{witharrows}\thanks{Ce document correspond à la -version~\myfileversion\space de \pkg{witharrows}, à la date du~\myfiledate.}} \author{F. Pantigny \\ -\texttt{fpantigny@wanadoo.fr}} - -\maketitle - -\begin{abstract} -L'extension LaTeX \pkg{witharrows} fournit des environments \verb|{WithArrows}| et -\verb|{DispWithArrows}| similaires aux environnements \verb|{aligned}| et \verb|{align}| de -l'\pkg{amsmath} mais avec la possibilité de dessiner des flèches sur le côté droit. -Ces flèches sont habituellement utilisées pour donner des explications concernant -le calcul mathématique présenté. -\end{abstract} - - -\vspace{1cm} -Cette extension peut être utilisée avec \verb|xelatex|, \verb|lualatex|, \verb|pdflatex| -mais aussi avec le cheminement classique \verb|latex|-\verb|dvips|-\verb|ps2pdf| (ou Adobe -Distiller). Plusieurs compilations peuvent être nécessaires. Cette extension nécessite les -extensions \pkg{expl3}, \pkg{xparse} et \pkg{tikz}. Les extensions Tikz -\pkg{arrows.meta} et \pkg{bending} sont également requises. Toutes sont chargées par \pkg{witharrows}. - -\bigskip -Cette extension fournit un environnement \verb|{WithArrows}| pour construire des alignements d'équations -avec des flèches pour les explications sur le côté droit. - -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 ~emphase#\Arrow{on développe}@ \\ - & = a^2 + 2a + 1 % ne pas mettre de \\ ici -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - - - -\medskip -La flèche a été tracée avec la commande \verb|\Arrow| dans la rangée dont la flèche part. La commande \verb|\Arrow| -doit être utilisée dans la seconde colonne (le mieux est de la mettre à la fin de la ligne comme dans l'exemple -précédent). - - -\medskip -Comme on le voit, l'environnement \verb|{WithArrows}| est proche de l'environnement -\verb|{aligned}| de l'\pkg{amsmath}. L'extension \pkg{witharrows} -propose aussi un environnement \verb|{DispWithArrows}| qui est similaire à l'environnement \verb|{align}| de -l'\pkg{amsmath}: cf. p. \pageref{DispWithArrows}. - - -\section{Options pour la forme des flèches} - -La commande \verb|\Arrow| a plusieurs options. Ces options peuvent être placées entre crochets, avant, ou après, -l'argument obligatoire. - -L'option \verb|jump| indique le nombre\footnote{Il n'est pas possible de donner une valeur négative à \verb|jump|. -Voir plus loin (p.~\pageref{Backwards}) la manière de tracer une flèche qui remonte.} de rangées que la flèche doit sauter (la valeur par défaut est, bien -entendu,~$1$). - - -\begin{Verbatim} -$\begin{WithArrows} -A & = \bigl((a+b)+1\bigr)^2 \Arrow[~emphase#jump=2@]{on développe} \\ - & = (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=1+1]{on développe} \\ - & = (a+b)^2 + 2(a+b) +1 \\ - & = a^2 + 2ab + b^2 + 2a + 2b +1 -\end{WithArrows}$ - -\interitem -Il est possible de faire partir plusieurs flèches d'une même rangée. -\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 -L'option \verb|xoffset| décale la flèche vers la droite (habituellement, on ne souhaite pas que les flèches soient -collées au texte). La valeur par défaut de \verb|xoffset| est de $3$~mm. -\begin{Verbatim} -$\begin{WithArrows} -A & = \bigl((a+b)+1\bigr)^2 -\Arrow[~emphase#xoffset=1cm@]{avec \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]{avec \texttt{xoffset=1cm}} \\ - & = (a+b)^2 + 2(a+b) +1 -\end{WithArrows}$ - - -\interitem -Les flèches sont tracées avec Tikz. C'est pourquoi la commande \verb|\Arrow| a une option -\verb|tikz| qui peut être utilisée pour donner à la flèche (en fait, à la commande \verb|\path| de -Tikz) les options proposées par Tikz pour une telle flèche. L'exemple suivant fournit une flèche en trait épais. -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[~emphase#tikz=thick@]{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[tikz=thick]{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\interitem -Il est également possible de changer les pointes de flèche. Par exemple, nous pouvons tracer une flèche -qui remonte vers le haut avec l'option Tikz~\verb|<-|.\label{Backwards} - -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow~emphase#[tikz=<-]@{on factorise} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[tikz=<-]{on factorise} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\interitem -Il est aussi possible de supprimer les deux pointes de flèche avec l'option Tikz «\verb|-|». -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[~emphase#tikz=-@]{très classique} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[tikz=-]{très classique} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\interitem -Pour avoir des flèches droites et non incurvées, il convient d'utiliser l'option Tikz -«\verb|bend left = 0|». -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow~emphase#[tikz={bend left=0}]@{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[tikz={bend left=0}]{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\smallskip -En fait, il est possible de modifier de manière plus drastique la forme des flèches avec l'option -\verb|tikz-code| (présentée p.~\pageref{tikz-code}). - -\interitem -Il est possible d'utiliser l'option «\verb|text width|» pour contrôler la largeur du texte associé à la -flèche.\footnote{Il est possible d'éviter les coupures de mots dans ces étiquettes -avec l'option «\verb|align = flush left|» de Tikz.} -% -\begin{Verbatim} -$\begin{WithArrows} -A & = \bigl((a+b)+1\bigr)^2 -\Arrow[jump=2,~emphase#tikz={text width=5.3cm}@]{Nous avons développé...} \\ - & = (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}]{Nous avons développé en deux étapes mais il aurait été plus habile - d'utiliser la formule du multinôme.} \\ -& = (a+b)^2 + 2(a+b) +1 \\ -& = a^2 + 2ab + b^2 + 2a + 2b +1 -\end{WithArrows}$ - - -\bigskip -Dans les environnements \verb|{DispWithArrows}| et \verb|{DispWithArrows*}|, il y a une -option \verb|wrap-lines|. Lorsque cette option est utilisée, les lignes des étiquettes sont -automatiquement coupées sur la marge droite : voir p.~\pageref{wrap-lines}. - -\interitem -Si on veut changer la fonte du texte associé à une flèche, on peut, bien entendu, placer une commande comme -\verb|\bfseries|, \verb|\large| ou \verb|\sffamily| au début du texte. -Mais, par défaut, les étiquettes sont composées avec une combinaison -de \verb|\small| et \verb|\itshape|. En ajoutant \verb|\bfseries| au début du texte, on ne va pas supprimer le -\verb|\small| et le \verb|\itshape| et, par conséquent, on aura un texte en gras, italique et petite taille. -% -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{~emphase#\bfseries@ on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{\bfseries on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\interitem -Il est possible de placer des commandes \verb|\\| dans le texte pour forcer des retours à la ligne\footnote{Par -défaut, ce n'est pas possible dans un nÅ“ud Tikz. Néanmoins, dans \pkg{witharrows}, -les nÅ“uds sont construits avec l'option \verb|align=left|, et, ainsi, cela devient possible.}. Néanmoins, si on utilise des commandes \verb|\\|, une instruction de fonte placée au début -du texte aura un effet seulement jusqu'à la première occurrence de~\verb|\\| (comme -dans un environnement \verb|{tabular}|). C'est pourquoi Tikz fournit une option -\verb|font| pour modifier la fonte de tout le texte de l'étiquette. Cette fois-ci, si on utilise une option -\verb|tikz={font={\bfseries}}|, la spécification par défaut constituée par \verb|\small| et \verb|\itshape| va être -écrasée. -% -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[~emphase#tikz={font={\bfseries}}@]{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow[tikz={font={\bfseries}}]{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\medskip -Si on veut exactement le même résultat que précédemment, on doit donner à l'option \verb|font| la valeur -\verb|\itshape\small\bfseries|. - - -\interitem -Presque toutes les options peuvent être données entre crochets à l'environnement \verb|{WithArrows}|. Il ne doit -pas y avoir d'espace entre le \verb|\begin{WithArrows}| et le crochet ouvrant (\verb|[|) des options de -l'environnement. Ces options s'appliquent à toutes les flèches de l'environnement.\footnote{Elles s'appliquent - aussi aux environnements imbriqués dans un environnement \verb|{WithArrows}| donné (avec des exceptions attendues - pour les options \verb|interline|, \verb|code-before| et \verb|code-after|).} -% -\begin{Verbatim} -$\begin{WithArrows}[~emphase#tikz=blue@] -A & = \bigl((a+b)+1\bigr)^2 \Arrow{premier développement} \\ - & = (a+b)^2 + 2(a+b) +1 \Arrow{second développement} \\ - & = a^2 + 2ab + b^2 + 2a + 2b +1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[tikz=blue] -A & = \bigl((a+b)+1\bigr)^2 \Arrow{premier développement} \\ - & = (a+b)^2 + 2(a+b) +1 \Arrow{second développement} \\ - & = a^2 + 2ab + b^2 + 2a + 2b +1 -\end{WithArrows}$ - - -\interitem -L'environnement \verb|{WithArrows}| a une option \verb|displaystyle|. Avec cette option, -tous les éléments sont composés en \verb|\displaystyle| (comme dans un environnement -\verb|{aligned}| de l'\pkg{amsmath}). - -\medskip -Sans l'option \verb|displaystyle|: -% -\begin{Verbatim} -$\begin{WithArrows} -\int_0^1 (x+1)^2 dx -& = \int_0^1 (x^2+2x+1) dx -\Arrow{linéarité de l'intégration} \\ -& = \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{linéarité de l'intégration} \\ -& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\ -& = \frac13 + 2\frac12 + 1 \\ -& = \frac73 -\end{WithArrows}$ - - -\medskip -Le même exemple avec l'option \verb|displaystyle|:\par\nobreak - -$\begin{WithArrows}[displaystyle] -\int_0^1 (x+1)^2 dx -& = \int_0^1 (x^2+2x+1) dx -\Arrow{linéarité de l'intégration} \\ -& = \int_0^1 x^2 dx + 2 \int_0^1 x dx + \int_0^1 dx \\ -& = \frac13 + 2\frac12 + 1 \\ -& = \frac73 -\end{WithArrows}$ - - - -\interitem -Presque toutes les options peuvent aussi être fixées au niveau du document avec la commande -\verb|\WithArrowsOptions|. Dans ce cas, la portée des déclarations est le groupe TeX courant (de telles -déclarations sont parfois qualifiées de «semi-globales»). Par exemple, si nous voulons que tous les environnements -\verb|{WithArrows}| soient composés en \verb|\displaystyle| avec des flèches bleues, nous pouvons écrire -\verb|\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{Il est aussi possible de configurer \pkg{witharrows} en - modifiant le style Tikz \verb|WithArrows/arrow| qui est le style utilisé par \pkg{witharrows} lors du tracé d'une - flèche. Par exemple, pour avoir les étiquettes en bleu et en caractères droits, on peut utiliser l'instruction - suivante : \verb|\tikzset{WithArrows/arrow/.append style = {blue,font = {}}}|.} - -\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{par linéarité}\\ -& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n -\end{WithArrows}$ -\end{Verbatim} - -\begin{scope} -\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{par linéarité}\\ -& = \sum_{i=1}^n x_i^2 + 2\sum_{i=1}^nx_i+ n -\end{WithArrows}$ -\end{scope} - - -\interitem -La commande \verb|\Arrow| est reconnue seulement dans les environnements \verb|{WithArrows}|. Si on -dispose d'une commande \verb|\Arrow| précédemment définie, il est possible de continuer à l'utiliser à -l'extérieur des environnements \verb|{WithArrows}|. - -Néanmoins, une commande \verb|\Arrow| définie précédemment pourrait encore être utile dans un environnement \verb|{WithArrows}|. -Si vous voulez l'utiliser dans un tel environnement, il est possible de changer le nom de la commande \verb|\Arrow| de -l'extension \pkg{witharrows} grâce à une option \verb|command-name|\footnote{Pour des raisons historiques, il y a - un alias pour cette option : \verb|CommandeName|.} dédiée. Le nouveau nom de la commande doit être fourni à -l'option \emph{sans} la contre-oblique. -% -\begin{Verbatim} -\NewDocumentCommand {\Arrow} {} {\longmapsto} -$\begin{WithArrows}[~emphase#command-name=Explication@] -f & = \bigl(x \Arrow (x+1)^2\bigr) -~emphase#\Explication{on travaille directement sur les fonctions}@\\ -& = \bigl(x \Arrow x^2+2x+1\bigr) -\end{WithArrows}$ -\end{Verbatim} -% -\begin{scope} -\NewDocumentCommand {\Arrow} {} {\longmapsto} -$\begin{WithArrows}[command-name=Explication] -f & = \bigl(x \Arrow (x+1)^2\bigr) -\Explication{on travaille directement sur les fonctions}\\ -& = \bigl(x \Arrow x^2+2x+1\bigr) -\end{WithArrows}$ -\end{scope} - - -\interitem -L'environnement \verb|{WithArrows}| fournit aussi deux options \verb|code-before| et -\verb|code-after|\footnote{Pour des raisons historiques, il y a aussi des alias pour ces options : - \verb|CodeBefore| et \verb|CodeAfter|.} pour du code LaTeX qui sera exécuté au début et à la fin de -l'environnement. Ces options ne sont pas conçues pour être utilisées comme des \emph{hooks} (elles sont disponibles -uniquement au niveau de l'environnement et ne s'appliquent pas aux environnements imbriqués). -% -\begin{Verbatim} -$\begin{WithArrows}[~emphase#code-before = \color{blue}@] -A & = (a+b)^2 \Arrow{on développe} \\ - & = a^2 + 2ab + b^2 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[code-before = \color{blue}] -A & = (a+b)^2 \Arrow{on développe} \\ - & = a^2 + 2ab + b^2 -\end{WithArrows}$ - -\medskip -Des commandes spéciales sont disponibles dans le \verb|code-after| : une commande \verb|\WithArrowsNbLines| qui -indique le nombre de lignes (=rangées) de l'environnement courant (pour TeX, il s'agit d'une commande et non d'un -compteur), une forme spéciale de la commande \verb|\Arrow| et la commande \verb|\MultiArrow| : ces commandes sont -décrites à partir de la page~\pageref{NestedEnv}. - -\section{Nombre et formats des colonnes} - -Jusqu'à présent, nous n'avons utilisé l'environnement \verb|{WithArrows}| qu'avec deux colonnes. Néanmoins, il est -possible de l'utiliser avec un nombre arbitraire de colonnes grâce à l'option \verb|format|. La valeur -donnée à cette option est similaire au préambule d'un environnement \verb|{array}|: il s'agit d'une séquence de -lettres \verb|r|, \verb|c| et \verb|l|. La valeur par défaut de cette option \verb|format| est, en fait, \verb|rl|. - - -\bigskip -Par exemple, si on veut seulement une colonne alignée à gauche, on peut utiliser l'option \verb|format=l|. -\begin{Verbatim} -$\begin{WithArrows}[~emphase#format = l@] -f(x) \ge g(x) \Arrow{on élève les deux membres au carré} \\ -f(x)^2 \ge g(x)^2 \Arrow{on fait tout passer à gauche} \\ -f(x)^2 - g(x)^2 \ge 0 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[format = l] -f(x) \ge g(x) \Arrow{on élève les deux membres au carré} \\ -f(x)^2 \ge g(x)^2 \Arrow{on fait tout passer à gauche} \\ -f(x)^2 - g(x)^2 \ge 0 -\end{WithArrows}$ - -\interitem -Dans l'exemple suivant, on utilise cinq colonnes toutes centrées (l'environnement -\verb|{DispWithArrows*}| utilisé est présenté p.~\pageref{DispWithArrows}). - -\begin{Verbatim} -\begin{DispWithArrows*}[~emphase#format = ccccc@, - wrap-lines, - tikz = {align = flush left}, - interline=1mm] -k & \;\le\; & t & \;\le\; & k+1 \\ -\frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} -\Arrow{nous pouvons intégrer les inégalités puisque $k \leq k+1$ } \\ -\int\limits_k^{k+1} \frac{dt}{k+1} -& \le & \int\limits_k^{k+1} \frac{dt}{t} -& \le & \int\limits_k^{k+1} \frac{dt}{k} \\ -\frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} -\end{DispWithArrows*} -\end{Verbatim} -\begin{DispWithArrows*}[format = ccccc, - wrap-lines, - tikz = {align = flush left}, - interline=1mm] -k & \;\le\; & t & \;\le\; & k+1 \\ -\frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} -\Arrow{nous pouvons intégrer les inégalités puisque $k \leq k+1$} \\ -\int\limits_k^{k+1} \frac{dt}{k+1} -& \le & \int\limits_k^{k+1} \frac{dt}{t} -& \le & \int\limits_k^{k+1} \frac{dt}{k} \\ -\frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} -\end{DispWithArrows*} - - -\section{Positionnement précis des flèches} - -L'environnement \verb|{WithArrows}| construit, lors de la composition du tableau, -deux séries de nÅ“uds représentés en rouge dans l'exemple suivant.\footnote{L'option -\verb|show-nodes| peut être utilisée pour visualiser ces nÅ“uds. Les nÅ“uds sont en fait des nÅ“uds Tikz de forme -rectangulaire et de largeur nulle. Une flèche entre deux nÅ“uds part de l'ancre sud (\emph{south - anchor}) du premier nÅ“ud et arrive à l'ancre nord (\emph{north anchor}) du deuxième nÅ“ud.} - - -\smallskip -$\begin{WithArrows}[displaystyle,show-nodes] -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 -Les nÅ“uds sur la gauche sont à la fin de chaque ligne de texte. Ces nÅ“uds seront appelés \emph{nÅ“uds de gauche}. Les -nÅ“uds du côté droit sont alignés verticalement sur le bord droit de l'alignement d'équations. Ces nÅ“uds seront -appelés \emph{nÅ“uds de droite}. - - -Par défaut, les flèches utilisent les nÅ“uds de droite. Nous dirons que ces flèches sont dans le mode \verb|rr| (\emph{r} -for \emph{right} en anglais). Ces flèches sont verticales (nous dirons qu'une flèche est \emph{verticale} lorsque -ses deux extrémités sont à la même abscisse). - - - -\smallskip -Néanmoins, il est possible d'utiliser les nÅ“uds de gauche, ou une combinaison de nÅ“uds de gauche et de droite avec -l'une des options \verb|lr|, \verb|rl| et \verb|ll| (\emph{l} for \emph{left} en anglais). Ces flèches sont, la -plupart du temps, non verticales. - - -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]{Cette flèche utilise une option \texttt{lr}.}\\ -& = \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}]{Cette flèche utilise une option \texttt{ll} -et une option \texttt{jump} fixée à $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 -Il y a aussi une option nommée \verb|i| (\emph{i} pour \emph{intermédiaire}). Avec cette option, la flèche est -verticale et calée à gauche. - -\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]@{parce que $(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]{parce que $(x-y)(x+y)=x^2-y^2$}\\ -& = a^4-b^4 -\end{WithArrows}$ - - -\interitem -L'environnement \verb|{WithArrows}| propose aussi une option \verb|group|. Avec cette option, -\emph{toutes} les flèches de l'environnement sont regroupées sur une même verticale calée à gauche. -% -\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{on remplace $y_0$ par sa valeur}\\ -& \Longleftrightarrow 2xK'x^{\frac32} = x^{\frac12} \Arrow{simplification par $x$}\\ -& \Longleftrightarrow K' = \tfrac1{2x^2} \Arrow{on primitive}\\ -& \Longleftrightarrow K = -\tfrac1{2x} -\end{WithArrows}$ - - -\bigskip -L'environnement \verb|{WithArrows}| fournit encore une autre option, nommée \verb|groups| (avec un \emph{s} dans le -nom). Avec cette option, les flèches sont divisées en plusieurs «groupes». Chaque groupe est un ensemble de flèches -connectées entre elles\footnote{Plus précisément : pour chaque flèche $a$, notons $i(a)$ le numéro de sa rangée de - départ et - $f(a)$ le numéro de sa rangée d'arrivée ; pour deux flèches $a$ et $b$, nous noterons $a \sim b$ lorsque - $\llbracket i(a),f(a)\rrbracket \cap \llbracket i(b),f(b)\rrbracket \neq \varnothing$ ; les groupes sont les - classes d'équivalence de la clôture transitive de la relation $\sim$.}. Toutes les flèches d'un même groupe sont placées sur -une même verticale qui est calée à gauche. - - -\bigskip -$\begin{WithArrows}[groups] -A & = B \Arrow{one} \\ - & = C+D \Arrow{two} \\ - & = D' \\ - & = E+F+G+H+I \\ - & = K + L + M \Arrow{three}\\ - & = N \Arrow{four}\\ - & = O -\end{WithArrows}$ - -\bigskip -Dans un environnement qui utilise l'option \verb|group| ou l'option \verb|groups|, il est encore possible de donner -une option de position (\verb|ll|, \verb|lr|, \verb|rl|, \verb|rr| ou \verb|i|) à une flèche individuelle. Une -telle flèche sera tracée indépendamment des groupes. Il est aussi possible de commencer un nouveau groupe avec -l'option \verb|new-group| pour une certaine flèche. - - -\bigskip -Si on le souhaite, on peut passer l'option \verb|group| ou \verb|groups| à la commande \verb|WithArrowsOptions| de -telle sorte qu'elle deviendra la valeur par défaut (jusqu'à la fin du groupe TeX). Dans ce cas, il est encore -possible de revenir au comportement par défaut pour un environnement \verb|{WithArrows}| donné avec l'option -\verb|rr|: \verb|\begin{WithArrows}[rr]|. - - -\vspace{1cm} -Dans l'exemple suivant, nous avons utilisé l'option \verb|group| pour l'environnement -et l'option \verb|rr| pour la dernière flèche (c'est pourquoi cette dernière flèche n'est pas alignée avec les -premières). - -$\begin{WithArrows}[interline=1mm,group] -\sum\limits_{k=0}^n\frac{\cos kx}{\cos^k x} -& = \sum\limits_{k=0}^n \frac{\Re (e^{ikx})}{(\cos x)^k} -\Arrow{$(\cos x)^k$ est réel} \\ -& = \sum\limits_{k=0}^n \Re\left(\frac{e^{ikx}}{(\cos x)^k}\right) -\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -& = \Re \left(\sum\limits_{k=0}^n \left(\frac{e^{ix}}{\cos x}\right)^k\right) -\Arrow{somme de termes d'une suite géométrique} \\ -& = \Re \left(\frac{1-\left(\frac{e^{ix}}{\cos x}\right)^{n+1}}{1-\frac{e^{ix}}{\cos x}} \right) -\Arrow{calcul algébrique} \\ -& = \Re \left(\frac{1-\frac{e^{i(n+1)x}}{\cos^{n+1}x}}{1-\frac{e^{ix}}{\cos x}}\right) -\Arrow{réduction au même dénominateur} \\ -& = \Re \left(\frac{\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos^{n+1}x}}{\frac{\cos x-e^{ix}}{\cos x}}\right) -\Arrow{$\Re(kz) = k\cdot\Re(z)$ lorsque $k$ est réel} \\ -& = \frac1{\cos^n x}\Re \left(\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos x-e^{ix}}\right) -\Arrow[rr]{forme algébrique des nombres complexes} \\ -& =\frac1{\cos^n x}\Re\left(\frac{\cos^{n+1}x-(\cos(n+1)x+i\sin(n+1)x)}{\cos x-(\cos x+i\sin x)}\right) \\ -& =\frac1{\cos^n x}\Re\left(\frac{(\cos^{n+1}x-\cos(n+1)x)-i\sin(n+1)x}{-i\sin x}\right) \\ -& = \frac1{\cos^nx}\cdot\frac{\sin(n+1)x}{\sin x} -\end{WithArrows}$ - -\interitem - -\section{Les options «up» et «down» pour des flèches individuelles} - -\label{up-and-down} -Au niveau local, il y a deux options pour les flèches individuelles, nommée «\verb|up|» et «\verb|down|». L'exemple -suivant illustre ces types de flèches: - - -\begin{Verbatim} -\(\begin{WithArrows} -A & = B -\Arrow~emphase#[up]@{une flèche de type \texttt{up}} \\ - & = C + C + C + C + C + C + C + C \\ - & = C + C + C + C + C + C + C + C -\Arrow~emphase#[down]@{une flèche de type \texttt{down}} \\ - & = E + E -\end{WithArrows}\) -\end{Verbatim} - -\vspace{1cm} -\(\begin{WithArrows} -A & = B -\Arrow[up]{une flèche de type \texttt{up}} \\ - & = C + C + C + C + C + C + C + C \\ - & = C + C + C + C + C + C + C + C -\Arrow[down]{une flèche de type \texttt{down}} \\ - & = E + E -\end{WithArrows}\) - - -\vspace{1cm} -Les options \verb|up| et \verb|down| nécessitent l'extension \pkg{varwidth} et l'extension Tikz -\pkg{calc}. Si elles ne sont pas chargées, une erreur sera levée. - - -\interitem - -\section{Comparaison avec l'environnement \{aligned\}} - -L'environnement \verb|{WithArrows}| présente des similitudes avec l'environnement \verb|{aligned}| de l'extension -\pkg{amsmath}. Ce sont seulement des similitudes car \verb|{WithArrows}| n'a pas été écrit en s'appuyant sur -\verb|{aligned}|.\footnote{En fait, il est -possible d'utiliser l'extension \pkg{witharrows} sans l'extension \pkg{amsmath}.} - -\interitem -Comme dans les environnements de l'\pkg{amsmath}, il est possible de changer l'espacement entre deux rangées avec -l'option de la commande \verb|\\| de fin de ligne (il est aussi possible d'utiliser \verb|\\*| mais cela a -exactement le même effet que \verb|\\| puisqu'un environnement \verb|{WithArrows}| est toujours insécable). Cette -option est conçu pour être utilisée avec des valeurs positives uniquement. -% -\begin{Verbatim} -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} ~emphase#\\[2ex]@ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} \\*[2ex] -\noalign{\vspace{3mm}} - & = a^2 + 2a + 1 -\end{WithArrows}$ - - -\interitem -Dans les environnements de l'\pkg{amsmath} (ou de \pkg{mathtools}), l'espace entre deux rangées -est fixé par un paramètre appelé \verb|\jot| (il s'agit d'une dimension et non d'un ressort). C'est aussi le cas -pour l'environnement \verb|{WithArrows}|. Une option \verb|jot| a été ajoutée à l'environnement \verb|{WithArrows}| -dans le but de changer ce paramètre \verb|\jot| pour un environnement donné.\footnote{Il est aussi possible de -changer \verb|\jot| avec l'environnement \verb|{spreadlines}| de \pkg{mathtools}.} -% -\begin{Verbatim} -$\begin{WithArrows}[displaystyle,~emphase#jot=2ex@] -F & = \frac12G \Arrow{on développe}\\ - & = H + \frac12K \Arrow{on continue}\\ - & = K -\end{WithArrows}$ -\end{Verbatim} - - -$\begin{WithArrows}[displaystyle,jot=2ex] -F & = \frac12G \Arrow{on développe}\\ - & = H + \frac12K \Arrow{on continue}\\ - & = K -\end{WithArrows}$ - - -\bigskip -Néanmoins, cette nouvelle valeur de \verb|\jot| sera aussi utilisée dans les nouveaux alignements -inclus dans l'environnement~\verb|{WithArrows}|: -% -\begin{Verbatim} -$\begin{WithArrows}[jot=2ex] -\varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -\Arrow{$x$ et $y$ sont réels}\\ -& \Leftrightarrow \left\{ -\begin{aligned} -x+y & = 0 \\ -x+2y & = 0 -\end{aligned} -\right. -\end{WithArrows}$ -\end{Verbatim} - - -$\begin{WithArrows}[jot=2ex] -\varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -\Arrow{$x$ et $y$ sont réels}\\ -& \Leftrightarrow \left\{ -\begin{aligned} -x+y & = 0 \\ -x+2y & = 0 -\end{aligned} -\right. -\end{WithArrows}$ - -\bigskip -Peut-être que cela ne correspond pas au résultat souhaité. C'est pourquoi une option -\verb|interline| est fournie. Il est possible d'utiliser un ressort (\emph{skip}) pour cette option. -% -\begin{Verbatim} -$\begin{WithArrows}[~emphase#interline=2ex@] -\varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -\Arrow{$x$ et $y$ sont réels}\\ -& \Leftrightarrow \left\{ -\begin{aligned} -x+y & = 0 \\ -x+2y & = 0 \\ -\end{aligned} -\right. -\end{WithArrows}$ -\end{Verbatim} - - -$\begin{WithArrows}[interline=2ex] -\varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -\Arrow{$x$ et $y$ sont réels}\\ -& \Leftrightarrow \left\{ -\begin{aligned} -x+y & = 0 \\ -x+2y & = 0 \\ -\end{aligned} -\right. -\end{WithArrows}$ - - -\interitem -De même que l'environnement \verb|{aligned}|, \verb|{WithArrows}| a une option de placement qui peut prendre les valeurs -\verb|t|, \verb|c| ou \verb|b|. Néanmoins, la valeur par défaut n'est pas \verb|c| mais \verb|t|. -Si on le souhaite, il est possible d'avoir la valeur \verb|c| comme valeur par défaut -en utilisant l'instruction \verb|\WithArrowsOptions{c}| au début du document. -% -\begin{Verbatim} -Ainsi\enskip -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -Ainsi\enskip -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - -\bigskip -La valeur \verb|c| peut être utile, par exemple, si on souhaite mettre une accolade : - -\smallskip -\begin{Verbatim} -On pose\enskip $~emphase#\left\{@ -\begin{WithArrows}[~emphase#c@] -f(x) & = 3x^3+2x^2-x+4 -\Arrow[tikz=-]{les deux sont des polynômes}\\ -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=-]{les deux sont des polynômes}\\ -g(x) & = 5x^2-5x+6 -\end{WithArrows} -\right.$ - - -\interitem -Contrairement à \verb|{aligned}|, l'environnement \verb|{WithArrows}| utilise \verb|\textstyle| par -défaut. - -Là aussi, il est possible de changer ce comportement avec \verb|\WithArrowsOptions|: - -\quad \verb|\WithArrowsOptions{displaystyle}|. - - -\smallskip -L'exemple suivant est composé avec \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 -L'exemple suivant est composé avec \verb|{WithArrows}[c,displaystyle]|. Les résultats -sont parfaitement identiques.\footnote{Dans les versions de l'\pkg{amsmath} antérieures au -5~novembre~2016, un espace fin était ajouté sur la gauche de l'environnement \verb|{aligned}|. -Les versions plus récentes n'ajoutent pas d'espace et \verb|{WithArrows}| non plus.}\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{Les flèches dans les environnements imbriqués} - -\label{NestedEnv} - -Les environnements \verb|{WithArrows}| peuvent être imbriqués. Dans ce cas, les options fournies -à l'environnement englobant s'appliquent aussi aux environnements imbriqués (avec des -exceptions tout à fait attendues pour \verb|interline|, \verb|code-before| et \verb|code-after|). La commande -\verb|Arrow| peut être utilisée dans chaque environnement \verb|{WithArrows}|. - -\begin{Verbatim}[formatcom=\small\color{gray}] -$~emphase#\begin{WithArrows}@ -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{les nombres sont réels}\\ - & \Leftrightarrow - \left\{~emphase#\begin{WithArrows}@[c] - x+2y & = 0 \\ - 2x+4y & = 0 - ~emphase#\end{WithArrows}@\right. \\ - & \Leftrightarrow - \left\{~emphase#\begin{WithArrows}@[c] - x+2y & = 0 \Arrow[tikz=-]{la même équation}\\ - x+2y & = 0 - ~emphase#\end{WithArrows}@\right. \\ - & \Leftrightarrow x+2y=0 -~emphase#\end{WithArrows}@$ -\end{Verbatim} - -$\begin{WithArrows} -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{les nombres sont réels}\\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - 2x+4y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \Arrow[tikz=-]{la même équation}\\ - x+2y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow x+2y=0 -\end{WithArrows}$ - -\bigskip -Néanmoins, on peut souhaiter tracer une flèche entre des rangées qui ne sont pas dans le même -environnement. Par exemple, on pourrait souhaiter tracer la flèche suivante : - -\bigskip -$\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division par $2$} ] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - 2x+4y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - x+2y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow x+2y=0 -\end{WithArrows}$ - - -\bigskip -Une telle construction est possible en utilisant \verb|\Arrow| dans le \verb|code-after| : -dans le \verb|code-after|, une version spéciale de la commande \verb|\Arrow| est disponible -(nous l'appellerons «\verb|\Arrow| dans le \verb|code-after|»). - -\smallskip -Une commande \verb|\Arrow| dans le \verb|code-after| prend trois arguments : -\begin{itemize} -\item une spécification pour la rangée de départ de la flèche ; -\item une spécification pour la rangée d'arrivée ; -\item une étiquette pour la flèche. -\end{itemize} -Comme d'habitude, il est possible de donner des options entre crochets avant ou après les trois arguments -obligatoires. Néanmoins, ces options sont limitées (voir plus bas). - -\interitem -La spécification de rangée est construite avec la position de l'environnement conidéré dans l'arbre des -imbrications, suivie, après un trait d'union, par le numéro de la rangée. - -\bigskip -Dans l'exemple précédent, il y a deux environnements \verb|{WithArrows}| imbriqués dans l'environnement -\verb|{WithArrows}| principal. - -\medskip -$\begin{WithArrows}[tikz-code = {\path (#1) to node {#3} (#2) ; }] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ - & \Leftrightarrow \color{blue} - \left\{\begin{WithArrows}[c] - x+2y & = 0 \Arrow{environnement \no 1}\\ - 2x+4y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow \color{red} - \left\{\begin{WithArrows}[c] - x+2y & = 0 \Arrow{environnement \no 2}\\ - x+2y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow x+2y=0 -\end{WithArrows}$ - -\bigskip -La flèche que nous voulons tracer part de la rangée~$2$ du sous-environnement -\no $1$ (et, par conséquent, la spécification est \verb|1-2|) et arrive à la rangée~$2$ -du sous-environnement \no $2$ (et, par conséquent, la spécification est \verb|2-2|). -Nous pouvons tracer la flèche avec une commande \verb|\Arrow| dans le \verb|code-after| de la manière suivante : -\begin{Verbatim} -$\begin{WithArrows}[~emphase#code-after = \Arrow{1-2}{2-2}{division par $2$}@ ] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -......... -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[code-after = \Arrow{1-2}{2-2}{division par $2$} ] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - 2x+4y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - x+2y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow x+2y=0 -\end{WithArrows}$ - -\bigskip -Les options autorisées pour une commande \verb|\Arrow| dans le \verb|code-after| sont : \verb|ll|, \verb|lr|, -\verb|rl|, \verb|rr|, \verb|v|, \verb|xoffset|, \verb|tikz| et \verb|tikz-code|. Exceptée \verb|v|, qui est -spécifique à \verb|\Arrow| dans le \verb|code-after|, toutes ces options ont leur signification habituelle. - - -Avec l'option \verb|v|, la flèche tracée est verticale à une abscisse calculée avec -la rangée de départ et la rangée d'arrivée uniquement : les lignes intermédiaires ne sont pas prises en compte -contrairement à ce qui se passe avec l'option \verb|i|. Pour le moment, l'option \verb|i| n'est pas disponible -pour la commande~\verb|\Arrow| dans le \verb|code-after|. Néanmoins, il est toujours possible -de déplacer une flèche avec \verb|xoffset| (ou \verb|xshift| de Tikz). -\begin{Verbatim} -$\begin{WithArrows}[code-after=\Arrow~emphase#[v]@{1-2}{2-2}{division by $2$}] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -......... -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division par $2$} ] -\varphi(x,y)=0 - & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - 2x+4y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow - \left\{\begin{WithArrows}[c] - x+2y & = 0 \\ - x+2y & = 0 - \end{WithArrows}\right. \\ - & \Leftrightarrow x+2y=0 -\end{WithArrows}$ - - -\interitem -L'extension \pkg{witharrows} fournit une autre commande disponible dans le \verb|code-after| : la commande -\verb|\MultiArrow|. Cette commande dessine un «rateau». La liste des rangées concernées par ce rateau -est donnée dans le premier argument de la commande \verb|\MultiArrow|. La syntaxe utilisée pour décrire cette liste -est celle de la commande \verb|\foreach| de \pkg{pgffor}. - -\begin{Verbatim} -$\begin{WithArrows}[tikz = rounded corners, - code-after = {~emphase#\MultiArrow{1,...,4}{text}@} ] -A & = B \\ - & = C \\ - & = D \\ - & = E \\ - & = F -\end{WithArrows}$ -\end{Verbatim} - - -$\begin{WithArrows}[tikz = rounded corners, - code-after = {\MultiArrow{1,...,4}{text}}] -A & = B \\ - & = C \\ - & = D \\ - & = E \\ - & = F -\end{WithArrows}$ - -\medskip -Pour le moment, aucune option n'est disponible pour cette commande \verb|\MultiArrow|. - - -\medskip -\section{Dessiner des flèches depuis l'extérieur des environnements \{WithArrows\}} - -Si on désire dessiner des flèches depuis l'extérieur des environnements \verb|{WithArrows}|, il est possible de le -faire en utilisant les nÅ“uds Tikz créés par ces environnements. - -Le nom d'un nÅ“ud Tikz crée par \pkg{witharrows} est préfixé par \verb|wa-|. Ensuite, on trouve une liste de nombres -qui indique quelle est la position de l'environnement dans l'arbre d'imbrication des environnements. À la fin, on a -le suffixe \verb|l| pour un nÅ“ud de gauche et le suffixe \verb|r| pour un nÅ“ud de droite. - -\smallskip -À titre d'illustration, nous donnons un exemple d'environnements \verb|{WithArrows}| imbriqués et, pour chaque nÅ“ud -de droite, le nom de ce nÅ“ud.\footnote{Il existe une option \verb|show-node-names| pour faire afficher les noms de - ces nÅ“uds.} - - -\medskip -\[\begin{WithArrows}[show-nodes,show-node-names] -A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\ -& \vartriangleleft \left\{ -\begin{WithArrows}[c] -C & \vartriangleleft D \\ -E & \vartriangleleft F -\end{WithArrows} -\right. \\ - & \vartriangleleft -\left\{ -\begin{WithArrows}[c] -G & \vartriangleleft H+H+H+H+H+H+H \\ -I & \vartriangleleft -\left\{ -\begin{WithArrows} -J &\vartriangleleft K \\ -L &\vartriangleleft M -\end{WithArrows} -\right. -\end{WithArrows} -\right. \\ - & \vartriangleleft -\left\{ -\begin{WithArrows}[c] -N & \vartriangleleft O \\ -P & \vartriangleleft Q -\end{WithArrows} -\right. -\end{WithArrows}\] - -\medskip -The package \pkg{witharrows} fournit quelques outils pour faciliter l'utilisation de ces nÅ“uds : -\begin{itemize} -\item la commande \verb|\WithArrowsLastEnv| donne le numéro du dernier environnement de niveau~$0$ (c'est-à -dire -non imbriqué dans un autre environnement de \pkg{witharrows}) ; - -\item un nom peut être donné à un environnement avec l'option \verb|name| et, dans ce cas, les nÅ“uds créés dans -l'environnement auront des alias construits en utilisant ce nom ; - -\item le style Tikz \verb|WithArrows/arrow| est le style utilisé par \pkg{witharrows} pour dessiner une -flèche\footnote{Plus précisément, ce style est passé à Tikz via l'option «\verb|every path|» avant le dessin de la - flèche (qui se fait avec l'instruction Tikz stockée dans \verb|tikz-code|). Ce style est modifié par l'option - \verb|tikz| de \pkg{witharrows} (avec une portée correspondant au groupe TeX courant).} ; - -\item le style Tikz \verb|WithArrows/arrow/tips| est le style utilisé pour la pointe de flèche (ce style est -lui-même chargé par le style \verb|WithArrows/arrow|). -\end{itemize} - -Par exemple, nous pouvons tracer une flèche allant de \texttt{wa-\WithArrowsLastEnv-2-1-2-r.south} -à \texttt{wa-\WithArrowsLastEnv-3-2-r.north} avec l'instruction Tikz suivante : - -\begin{Verbatim} -\begin{tikzpicture}[remember picture,overlay] -\draw [WithArrows/arrow] - ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south) - to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ; -\end{tikzpicture} -\end{Verbatim} - -\[\begin{WithArrows} -A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\ -& \vartriangleleft \left\{ -\begin{WithArrows}[c] -C & \vartriangleleft D \\ -E & \vartriangleleft F -\end{WithArrows} -\right. \\ - & \vartriangleleft -\left\{ -\begin{WithArrows}[c] -G & \vartriangleleft H+H+H+H+H+H+H \\ -I & \vartriangleleft -\left\{ -\begin{WithArrows} -J &\vartriangleleft K \\ -L &\vartriangleleft M -\end{WithArrows} -\right. -\end{WithArrows} -\right. \\ - & \vartriangleleft -\left\{ -\begin{WithArrows}[c] -N & \vartriangleleft O \\ -P & \vartriangleleft Q -\end{WithArrows} -\right. -\end{WithArrows}\] - -\begin{tikzpicture}[remember picture,overlay] -\draw [WithArrows/arrow] - ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south) - to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ; -\end{tikzpicture} - -\medskip -Dans le cas présent, il aurait été plus facile d'utiliser une commande \verb|\Arrow| dans le \verb|code-after| mais -c'était seulement un exemple pour expliquer comment les nÅ“uds Tikz créés par \pkg{witharrows} peuvent être utilisés. - -\bigskip -Dans l'exemple suivant, on crée deux environnements \verb|{WithArrows}| nommés -«\verb|premier|» et «\verb|second|» et on dessine une flèche entre un nÅ“ud du premier et un nÅ“ud du second. - -\begin{Verbatim} -$\begin{WithArrows}[~emphase#name=premier@] -A & = B \\ - & = C -\end{WithArrows}$ - -\bigskip -$\begin{WithArrows}[~emphase#name=second@] -A' & = B' \\ - & = C' -\end{WithArrows}$ - -\begin{tikzpicture}[remember picture,overlay] -\draw [WithArrows/arrow] - ([xshift=3mm]~emphase#premier@-1-r.south) - to ([xshift=3mm]~emphase#second@-1-r.north) ; -\end{tikzpicture} -\end{Verbatim} - - -\begin{center} -$\begin{WithArrows}[name=premier] -A & = B \\ - & = C -\end{WithArrows}$ - -\bigskip -$\begin{WithArrows}[name=second] -A' & = B' \\ - & = C' -\end{WithArrows}$ -\end{center} - -\begin{tikzpicture}[remember picture,overlay] -\draw [WithArrows/arrow] - ([xshift=3mm]premier-1-r.south) - to ([xshift=3mm]second-1-r.north) ; -\end{tikzpicture} - -\section{L'environnement \{DispWithArrows\}} -\label{DispWithArrows} - -Comme dit précédemment, l'environnement \verb|{WithArrows}| présente des similitudes avec l'environnement -\verb|{aligned}| de l'\pkg{amsmath} (et de \verb|mathtools|). L'extension \pkg{witharrows} -fournit aussi un environnement \verb|{DispWithArrows}| qui est similaire aux -environnements \verb|{align}| et \verb|{flalign}| de l'\pkg{amsmath}. - -\medskip -L'environnement \verb|{DispWithArrows}| doit être utilisé \emph{hors} du mode mathématique. Comme -\verb|{align}|, il doit être utilisé en mode horizontal. -\begin{Verbatim} -\begin{~emphase#DispWithArrows@} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{~emphase#DispWithArrows@} -\end{Verbatim} -\begin{DispWithArrows} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{DispWithArrows} - -\medskip -Il est possible d'utiliser la commande \verb|\notag| (ou \verb|\nonumber|) pour supprimer un numéro d'équation. - -Il est possible d'utiliser la commande \verb|\tag| pour placer une étiquette spéciale (par ex. $\star$). - -Il est aussi possible de placer un label pour une ligne de l'environnement avec la commande -\verb|\label|. - -Ces commandes doivent être utilisées dans la dernière colonne de l'environnement. -\begin{Verbatim} -\begin{DispWithArrows} -A & = (a+1)^2 \Arrow{on développe} ~emphase#\notag@ \\ - & = a^2 + 2a + 1 ~emphase#\tag{$\star$} \label{mon-équation}@ -\end{DispWithArrows} -\end{Verbatim} -\begin{DispWithArrows} -A & = (a+1)^2 \Arrow{on développe} \notag \\ - & = a^2 + 2a + 1 \tag{$\star$} \label{mon-équation} -\end{DispWithArrows} -Un lien vers l'équation \eqref{mon-équation}. On a obtenu ce lien avec la commande -\verb|\eqref{mon-équation}| (la commande \verb|\eqref| est une commande de l'extension \pkg{amsmath}). - -\medskip -Si \pkg{amsmath} (ou \pkg{mathtools}) est chargée, il est toujours possible d'utiliser -\verb|\tag*| qui, comme dans l'extension\pkg{amsmath}, compose le label sans les parenthèses. -Par exemple, il est possible de l'utiliser pour mettre le symbole \verb|\square| de -\pkg{amssymb}. Ce symbole est souvent utilisé pour marquer la fin d'une démonstration.\footnote{Signalons que l'environnement \verb|{DispWithArrows}| est compatible -avec la commande \verb|\qedhere| de \pkg{amsthm}.} -\begin{Verbatim} -\begin{DispWithArrows} -A & = (a+1)^2 \Arrow{on développe} \notag \\ - & = a^2 + 2a + 1 ~emphase#\tag*{$\square$}@ -\end{DispWithArrows} -\end{Verbatim} -\begin{DispWithArrows} -A & = (a+1)^2 \Arrow{on développe} \notag \\ - & = a^2 + 2a + 1 \tag*{$\square$} -\end{DispWithArrows} - -\medskip -Il est également possible de supprimer tous les numéros d'équations avec l'option booléenne \verb|notag| (ou -\verb|nonumber|), au niveau global ou bien au niveau d'un environnement. - -Enfin, il existe aussi -un environnement \verb|{DispWithArrows*}| qui supprime tous les numéros.\footnote{Même dans ce cas, il est possible -de mettre une étiquette manuellement avec la commande \verb|\tag|.} -\begin{Verbatim} -\begin{~emphase#DispWithArrows*@} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{~emphase#DispWithArrows*@} -\end{Verbatim} -\begin{DispWithArrows*} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{DispWithArrows*} - -\medskip -En fait, il y a une autre option, nommée \verb|tagged-lines|, qui peut être utilisée pour contrôler quelles lignes -seront numérotées. La valeur de cette option est la liste des numéros de lignes (dans l'environnement) qui seront -numérotées (par le système de numérotage des équations). Par exemple, avec l'option -\verb|tagged-lines = {first,3,last}|, seulement la première, la troisième et la dernière lignes seront numérotées. -Il y a aussi une valeur spéciale \verb|all| qui signifie que toutes les lignes doivent être numérotées. -\begin{Verbatim} -\begin{DispWithArrows}[~emphase#tagged-lines = last@] -A & = A_1 \Arrow{première étape} \\ - & = A_2 \Arrow{deuxième étape} \\ - & = A_3 -\end{DispWithArrows} -\end{Verbatim} -\begin{DispWithArrows}[tagged-lines = last] -A & = A_1 \Arrow{première étape} \\ - & = A_2 \Arrow{deuxième étape} \\ - & = A_3 -\end{DispWithArrows} - -\bigskip -Avec l'option \verb|fleqn|, l'environnement est composé calé à gauche (d'une manière similaire -à l'option \verb|fleqn| des classes standard de LaTeX). Dans ce cas, la marge gauche peut être réglée avec -l'option \verb|mathindent| (qui a un nom inspiré du paramètre \verb|\mathindent| de LaTeX). La valeur par défaut -pour cette option est de 25~pt. - -\begin{Verbatim} -\begin{DispWithArrows}[~emphase#fleqn,mathindent = 1cm@] -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{DispWithArrows} -\end{Verbatim} -\begin{DispWithArrows}[fleqn,mathindent = 1cm] -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{DispWithArrows} - -\medskip -\emph{Remarque} : Par conception, l'option \verb|fleqn| de \pkg{witharrows} est -indépendante de l'option de classe \verb|fleqn| de LaTeX. En effet, puisque les environnement de -\pkg{witharrows} sont conçus pour être utilisés avec des flèches sur le côté droit, l'utilisateur -peut souhaiter utiliser \pkg{witharrows} avec l'option \verb|fleqn| (de manière à avoir plus de place sur la droite -des équations pour les flèches) tout en continuant à centrer les équations classiques. - -\medskip -Si l'option \verb|leqno| est utilisée comme option de classe, les labels seront composés -à gauche également pour les environnements \verb|{DispWithArrows}|.\footnote{L'extension \pkg{amsmath} a une option \verb|leqno| -mais \pkg{witharrows}, bien entendu, ne tient pas compte de cette option : \pkg{witharrows} -vérifie seulement l'option \verb|leqno| de la classe du document.} - - -\medskip -Si l'extension \pkg{amsmath} est chargée, il est possible d'utiliser la commande \verb|\intertext| dans les -environnements \verb|{DispWithArrows}|. Il est également possible d'utiliser l'environnement \verb|{subequations}|. -Néanmoins, il existe pour les environnements \verb|{DispWithArrows}| une option \verb|subequations| qui demande -d'encapsuler l'environnement dans un environnement \verb|{subequations}|. - - -\medskip -Dans l'exemple suivant, l'option \verb|subequations| est fixée via la commande \verb|\WithArrowsOptions|. Chacun -des environnements suivants sera alors sous-numéroté (dans la portée de la commande \verb|WithArrowsOptions|). - -\begin{Verbatim} -~emphase#\WithArrowsOptions{subequations}@ -Premier environnement. -\begin{DispWithArrows} -A & = B \\ - & = C -\end{DispWithArrows} -Deuxième environnement. -\begin{DispWithArrows} -D & = E \\ - & = F -\end{DispWithArrows} -\end{Verbatim} -% -\begin{scope} -\WithArrowsOptions{subequations} -Premier environnement. -\begin{DispWithArrows} -A & = B \\ - & = C -\end{DispWithArrows} -Deuxième environnement. -\begin{DispWithArrows} -D & = E \\ - & = F -\end{DispWithArrows} -\end{scope} - -\bigskip -S'il n'y a pas suffisamment de place pour faire appraraître le numéro d'équation à la fin de la ligne, il n'y a pas -de positionnement automatique de ce numéro sur la ligne suivante (comme dans les environnements de -l'\pkg{amsmath}) : il y aura surimpression de texte. Néanmoins, dans \verb|{DispWithArrows}|, l'utilisateur peut -utiliser la commande \verb|\tagnextline| pour demander manuellement la composition du numéro sur la ligne suivante. -\begin{Verbatim} -\begin{DispWithArrows}[displaystyle] -S_{2(p+1)} -& =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\ -& \smash[b]{=\sum_{k=1}^{2p}(-1)^kk² - +(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2} ~emphase#\tagnextline@ \\ -&= S_{2p}-(2p+1)^2+(2p+2)^2\\ -&=p(2p+1)-(2p+1)^2+(2p+2)^2\\ -&= 2p^2+5p+3 -\end{DispWithArrows} -\end{Verbatim} -\begin{center} -\color{gray}\vrule% -\begin{minipage}{275pt}\color{black} -\begin{DispWithArrows}[displaystyle] -S_{2(p+1)} -& =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\ -& \smash[b]{=\sum_{k=1}^{2p}(-1)^kk^2+(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2} -\tagnextline \\ -&= S_{2p}-(2p+1)^2+(2p+2)^2\\ -&= 2p^2+p-4p^2-4p-1+4p^2+8p+4\\ -&= 2p^2+5p+3 -\end{DispWithArrows} -\end{minipage}% -\color{gray}\vrule -\end{center} - - - -\bigskip -Les environnements \verb|{DispWithArrows}| et \verb|{DispWithArrows*}| fournissent également une option -\verb|wrap-lines|. Avec cette option, les lignes de l'étiquette sont automatiquement coupées à droite.\footnote{Il - est possible d'éviter la coupure des mots avec l'option «\verb|align = flush left|» de Tikz.}\label{wrap-lines} - -\begin{Verbatim} -\begin{DispWithArrows*}[displaystyle,~emphase#wrap-lines@] -S_n -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{somme des termes d'une suite géométrique de raison $e^{i\frac{2\pi}n}$}\\ -& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n} - {1-e^{i\frac{\pi}{2n}}}\right) -\Arrow{cette ligne de texte a été coupée automatiquement} \\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows*} -\end{Verbatim} -\begin{DispWithArrows*}[displaystyle,wrap-lines] -S_n -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{somme des termes d'une suite géométrique de raison $e^{i\frac{2\pi}n}$}\\ -& = \frac1n \Re \left( -\frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) -\Arrow{cette ligne de texte a été coupée automatiquement} \\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows*} - -\bigskip -L'option \verb|wrap-lines| ne s'applique pas aux environnements \verb|{WithArrows}| -imbriqués dans un environnement \verb|{DispWithArrows}| ou \verb|{DispWithArrows*}|. Néanmoins, -elle s'applique aux instructions \verb|\Arrow| et \verb|\MultiArrow| du \verb|code-after| -de l'environnement englobant. - -\vspace{1cm} -Nous avons dit que les environnements \verb|{DispWithArrows}| et \verb|{DispWithArrows*}| -devaient être utilisés en mode horizontal et non en mode vertical. Il y a néanmoins -une exception. Ces environnements peuvent être utilisés directement après un \verb|\item| d'une liste -LaTeX. Dans ce cas, aucun espace vertical n'est ajouté avant l'environnement.\footnote{Il est possible de désactiver - cette fonctionnalité avec l'option \verb|standard-behaviour-with-items|.} - -\medskip -Voici un exemple où, avec \verb|{DispWithArrows}|, on peut insérer l'équation dans un environnement -\verb|{enumerate}| tout en utilisant l'option \verb|wrap-lines|. - -\begin{Verbatim} -~emphase#\begin{enumerate}@ -~emphase#\item @ -\begin{DispWithArrows}% - [displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt] -S_n -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{on utilise la formule pour la somme de termes d'une suite géométrique de raison -$e^{i\frac{2\pi}n}$} \\ -& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n} - {1-e^{i\frac{\pi}{2n}}}\right) -\Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}2}=i$} \\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows} -~emphase#\end{enumerate}@ -\end{Verbatim} -\begin{enumerate} -\item -\begin{DispWithArrows}[displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt] -S_n -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{on utilise la formule pour la somme de termes d'une suite géométrique de raison -$e^{i\frac{2\pi}n}$}\\ -& = \frac1n \Re \left( -\frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) -\Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}2}=i$} \\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows} -\end{enumerate} - -\vspace{1cm} -L'environnement \verb|{DispWithArrows}| est similaire à l'environnement \verb|{align}| de -l'\pkg{amsmath}. Néanmoins, \verb|{DispWithArrows}| n'est pas construit en utilisant \verb|{align}| -(en fait, il est possible d'utiliser \pkg{witharrows} sans \pkg{amsmath}). - -Il y a quelques différences entre \verb|{DispWithArrows}| et \verb|{align}|. -\begin{itemize} -\item L'environnement \verb|{DispWithArrows}| ne peut pas être inséré dans un environment -\verb|{gather}| de l'\pkg{amsmath}. -\item Un environment \verb|{DispWithArrows}| est toujours insécable (même avec -\verb|\allowdisplaybreaks| de l'\pkg{amsmath}). -\item Les commandes \verb|\label|, \verb|\tag|, \verb|\notag| et \verb|\nonumber| ne sont autorisées -que dans la dernière colonne. -\item Après un \verb|\item| d'une liste LaTeX, aucun espace vertical n'est ajouté (cela peut être -modifié avec l'option \verb|standard-behaviour-with-items|). -\item -\begin{bfseries} -Enfin, par défaut, les éléments d'un environnement \verb|\{DispWithArrows\}| -sont composés en \verb|textstyle| et non en \verb|displaystyle| (il est possible de modifier -ce point avec l'option \verb|displaystyle|). -\end{bfseries} -\end{itemize} - -\bigskip -En ce qui concerne les références, l'extension \pkg{witharrows} est compatible avec les -extensions \pkg{autonum}, \pkg{cleveref}, \pkg{fancyref}, \pkg{fncylab}, -\pkg{hyperref}, \pkg{listlbls}, \pkg{prettyref}, \pkg{refcheck}, -\pkg{refstyle}, \pkg{showlabels}, \pkg{smartref}, \pkg{typedref} et -\pkg{varioref} et avec les options \verb|showonlyrefs| et \verb|showmanualtags| de -\pkg{mathtools}.\footnote{Rappelons que \pkg{varioref}, \pkg{hyperref}, -\pkg{cleveref} et \pkg{autonum} doivent être chargés dans cet ordre. L'extension -\pkg{witharrows} peut être chargée n'importe où.} - -Elle n'est pas compatible avec \pkg{showkeys} (certains labels ne sont pas affichés). - - - - -\subsection*{L'option <...> de DispWithArrows} - -L'environnement \verb|{DispWithArrows}| propose une option \verb|left-brace|. Si cette option est présente, son -contenu est composé à gauche, suivi d'une accolade (d'où le nom) puis du corps de -l'environnement.\footnote{L'option \verb|left-brace| peut aussi être utilisée sans valeur: dans ce cas, seule - l'accolade est tracée.} - -Pour la lisibilité, cette option \verb|left-brace| est aussi disponible avec une syntaxe spéciale : on peut la -rentrer en la mettant entre chevrons (\verb|<| et \verb|>|) juste après le \verb|{DispWithArrows}| (et donc avant -les éventuels arguments optionnels entre crochets). - -\bigskip -On peut alors faire des constructions avec distinctions de cas, comme dans l'exemple -suivant.\footnote{L'environnement \verb|{cases}| de l'\pkg{amsmath} permet de réaliser de telles distinctions de - cas mais on ne peut pas utiliser la numérotation automatique des équations. L'environnement \verb|{numcases}| de - l'extension \pkg{cases} (de Donald Arseneau) permet d'utiliser ces numéros d'équations, mais, bien entendu, il - n'y a pas de composition de flèches.} - - - -\medskip - -\begin{BVerbatim} -\begin{DispWithArrows}~emphase#< \binom{n}{p} = >@[format = ll,fleqn,displaystyle] -0 & \quad \text{si } p > n -\Arrow{ce cas peut en fait rentrer\\ dans le suivant} \\ -\frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{si } 0 \leq p \leq n \\ -0 & \quad \text{si } p < 0 -\end{DispWithArrows} -\end{BVerbatim} -% -\begin{DispWithArrows}< \binom{n}{p} = >[format = ll,fleqn,displaystyle] -0 & \quad \text{si } p > n -\Arrow{ce cas peut en fait rentrer\\ dans le suivant} \\ -\frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{si } 0 \leq p \leq n \\ -0 & \quad \text{si } p < 0 -\end{DispWithArrows} - -\interitem -Dans l'exemple suivant, on sous-numérote les équations d'un système avec l'option \verb|subnumerate| (disponible -quand l'\verb|amsmath| est chargé). - -\begin{Verbatim} -\begin{DispWithArrows}~emphase#< \label{système} (\ref*{système}) \Leftrightarrow >@% - [format = l, subequations] -x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\ -xy+xz+yz=-2 \\ -xyz = -15 \label{dernière-équation} -\end{DispWithArrows} -\end{Verbatim} -% -\begin{DispWithArrows}< \label{système} (\ref*{système}) \Leftrightarrow >% - [format = l, subequations] -x+y+z = -3 \Arrow[tikz=-,jump=2]{3 équations} \\ -xy+xz+yz=-2 \\ -xyz = -15 \label{dernière-équation} -\end{DispWithArrows} - -\bigskip -Le système complet est l'équation \eqref{système} (cette référence a été obtenue avec -\verb|\eqref{système}|) et la dernière équation est l'équation \eqref{dernière-équation} (référence obtenue -avec \verb|\eqref{dernière-équation}|). Notons que \verb|\ref*|, utilisé dans le code ci-dessus, est une variante -de \verb|ref| proposée par \pkg{hyperref} pour composer une référence sans créer de lien. - -\bigskip -On peut souhaiter remplacer l'accolade gauche par un autre délimiteur extensible (gauche). On peut le faire -avec l'option \verb|replace-curly-brace-by|. - -\bigskip -\section{Fonctionnalités avancées} - -\subsection{L'option tikz-code : comment changer la forme des flèches} - -\label{tikz-code} - -L'option \verb|tikz-code|\footnote{Pour des raisons historiques, l'option \verb|tikz-code| a un alias : - \verb|TikzCode|.} permet à l'utilisateur de changer la forme des flèches.\footnote{Si l'option \verb|wrap-lines| - est utilisée dans un environnement \verb|{DispWithArrows}| ou \verb|{DispWithArrows*}|, l'option \verb|tikz-code| - n'aura pas d'effet sur les flèches de cet environnement mais uniquement sur les flèches des environnements - \verb|{WithArrows}| imbriqués.} - -\smallskip -Par exemple, les options «\verb|up|» et «\verb|down|» décrites précédemment (cf. -p.~\pageref{up-and-down}) sont programmées en interne avec \verb|tikz-code|. - -\smallskip -La valeur de cette option doit être une instruction de tracé Tikz valide (avec le point-virgule final) où les trois -marqueurs \verb|#1|, \verb|#2| et \verb|#3| représentent le point de départ, le point d'arrivée et l'étiquette de -la flèche. - - -\bigskip -Par défaut, la valeur de \verb|tikz-code| est la suivante : - -\smallskip -\qquad \verb|\draw (#1) to node {#3} (#2) ;| - - -\bigskip -Dans l'exemple suivant, nous remplaçons le chemin par défaut par un chemin avec trois segments (et un -nÅ“ud recouvrant le deuxième segment). -\begin{Verbatim} -\begin{WithArrows}[format=c,ygap=5pt,interline=4mm, - ~emphase#tikz-code = {\draw[rounded corners]@ - ~emphase# (~#1) -- ([xshift=5mm]~#1)@ - ~emphase# -- node[circle,@ - ~emphase# draw,@ - ~emphase# auto = false,@ - ~emphase# fill = gray!50,@ - ~emphase# inner sep = 1pt] {\tiny ~#3}@ - ~emphase# ([xshift=5mm]~#2)@ - ~emphase# -- (~#2) ; }@] -3 (2x+4) = 6 \Arrow{$\div 3$} \\ -2x+4 = 2 \Arrow{$-4$} \\ -2x = -2 \Arrow{$\div 2$} \\ - x = -1 -\end{WithArrows} -\end{Verbatim} - - -\[\begin{WithArrows}[format=c, - ygap=5pt, - interline=4mm, - tikz-code = {\draw[rounded corners] - (#1) - -- - ([xshift=5mm]#1) - -- node[circle, - draw, - auto=false, - fill=gray!50, - inner sep = 1pt] {\tiny #3} - ([xshift=5mm]#2) - -- - (#2) ; }] -3 (2x+4) = 6 \Arrow{$\div 3$} \\ -2x+4 = 2 \Arrow{$-4$} \\ -2x = -2 \Arrow{$\div 2$} \\ - x = -1 -\end{WithArrows}\] - -\bigskip -L'environnement \verb|{DispWithArrows}| et sa version étoilée \verb|{DispWithArrows*}| fournissent une commande -\verb|\WithArrowsRightX| qui peut être utilisée dans l'option \verb|tikz-code|. Cette commande fournit -l'abscisse de la marge droite de la boîte de composition courante (en prenant en compte les éventuels numéros des -équations). Pour un exemple d'utilisation, voir p.~\pageref{example-WithArrowsRightX}. - - -\bigskip -\subsection{La commande \textbackslash WithArrowsNewStyle} - -L'extension \pkg{witharrows} fournit une commande \verb|\WithArrowsNewStyle| pour définir -des styles d'une manière similaire aux «styles» de Tikz. - -La commande \verb|\WithArrowsNewStyle| prend deux arguments obligatoires. Le premier est -le nom du style et le second est une liste de couples clé-valeur. La portée -de la definition ainsi faite par \verb|\WithArrowsNewStyle| est le groupe TeX courant. - -Le style peut être utilisé comme une clé au niveau du document (avec \verb|\WithArrowsOptions|), au niveau d'un -environnement (via les arguments optionnels) ou bien encore dans une autre commande \verb|\WithArrowsNewStyle|. - -Pour un exemple d'utilisation, voir p.~\pageref{example-WithArrowsRightX}. - - -\bigskip -\subsection{Postionnement vertical des flèches} - -Il y a quatre paramètres pour ajuster finement la position verticale des flèches : -\verb|ygap|, \verb|ystart|, \verb|start-adjust| et \verb|end-adjust|. - -\medskip -Nous expliquons d'abord le comportement quand les paramètres \verb|start-adjust| et \verb|end-adjust| sont égaux à -zéro: -\begin{itemize} -\item l'option \verb|ystart| représente la distance verticale entre la ligne de base du -texte et le début de la flèche (valeur par défaut : $0.4$~ex); -\item l'option \verb|ygap| représente la distance verticale entre deux flèches consécutives -(valeur par défaut : $0.4$~ex). -\end{itemize} - - -\bigskip -$\begin{WithArrows}[interline=1mm, adjust = 0pt] - (\cos x + \sin x)^2 & = \cos^2 x +2 \cos x \sin x + \sin^2 x\Arrow{}\tikz[remember picture] \coordinate (A) ; \\ - & = \cos^2x + \sin^2x + 2\sin x\cos x \Arrow{} \\ - & = 1 + \sin(2x) -\end{WithArrows}$ - -\begin{tikzpicture}[remember picture,overlay,blue] -\draw (wa-\WithArrowsLastEnv-1-r.south) to ++(1,0) coordinate (B) to ++(0.1,0) ;; -\draw (A) to ++(1,0) coordinate (C) to ++(0.1,0) ;; -\draw (B) -- (C) ; -\draw[<-] (B) to ++(0,0.2) ; -\draw[<-] (C) to ++(0,-0.2) ; -\path (C) node[right=1mm] {\texttt{ystart}} ; -\draw (wa-\WithArrowsLastEnv-2-r.north) to ++(3,0) coordinate (E) to ++(0.1,0); -\draw (wa-\WithArrowsLastEnv-2-r.south) to ++(3,0) coordinate (F) to ++(0.1,0); -\draw (E) -- (F) ; -\draw[<-] (E) to ++(0,0.2) ; -\draw[<-] (F) to ++(0,-0.2) ; -\path (F) node[right=1mm] {\texttt{ygap}} ; -\end{tikzpicture} - -\interitem -Néanmoins, pour des raisons esthétiques, quand il est possible, \pkg{witharrows} commence -la flèche un peu plus haut (d'une quantité \verb|start-adjust|) et termine la flèche un peu plus -bas (par une quantité \verb|end-adjust|). Par défaut, ces deux paramètres \verb|start-adjust| -est \verb|end-adjust| sont égaux à $0.4$~ex. - -\bigskip -Voici par exemple le comportement sans le mécanisme de \verb|start-adjust| et -\verb|end-adjust| (c'était le comportement par défaut dans les version antérieures à la version 1.13). -\begin{Verbatim} -$\begin{WithArrows}~emphase#[start-adjust=0pt, end-adjust=0pt]@ -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ -\end{Verbatim} - -$\begin{WithArrows}[start-adjust=0pt, end-adjust=0pt] -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - - -\bigskip -Voici le comportement par défaut depuis la version 1.13 (les paramètres -\verb|start-adjust| et \verb|end-ajust| sont utilisés avec la valeur par défaut $0.4$~ex). La flèche -est plus longue et le résultat est plus esthétique. - -\medskip -$\begin{WithArrows} -A & = (a+1)^2 \Arrow{on développe} \\ - & = a^2 + 2a + 1 -\end{WithArrows}$ - - -\bigskip -Il est possible d'utiliser l'option \verb|adjust| qui fixe à la fois \verb|start-adjust| et \verb|end-ajust|. - -\bigskip -Puisque le mécanisme de \verb|start-adjust| et \verb|end-ajust| a été ajouté dans la -version 1.13 of \pkg{witharrows}, cette version n'est pas strictement compatible avec -les versions précédentes. Néanmoins, il est possible de retrouver le comportement précédent -en fixant simplement \verb|start-adjust| et \verb|end-adjust| à $0$~pt: -\begin{Verbatim} -\WithArrowsOptions{adjust = 0pt} -\end{Verbatim} - -\bigskip -\subsection{Notes de pied de page dans les environnements de witharrows} - -Si vous voulez mettre des notes de pied de page dans un environnement de \pkg{witharrows}, -vous pouvez utiliser une paire \verb|\footnotemark|--\verb|\footnotetext|. - -\smallskip -Il est aussi possible d'extraire les notes de pieds de page avec l'extension \pkg{footnote} ou bien l'extension -\pkg{footnotehyper}. - -\smallskip -Si \pkg{witharrows} est chargée avec l'option \verb|footnote| (avec \verb|\usepackage[footnote]{witharrows}| ou -avec \verb|\PassOptionsToPackage|), l'extension \pkg{footnote} est chargée (si elle ne l'est pas déjà ) et elle est -utilisée pour extraire les notes de pied de page. - -\smallskip -Si \pkg{witharrows} est chargée avec l'option \verb|footnotehyper|, l'extension \pkg{footnotehyper} est chargée (si -elle ne l'est pas déjà ) et elle est utilisée pour extraire les notes de pied de page. - -\smallskip -Attention : Les extensions \pkg{footnote} et \pkg{footnotehyper} sont incompatibles. -L'extension \pkg{footnotehyper} est le successeur de l'extension \pkg{footnote} -et devrait être utilisée préférentiellement. L'extension \pkg{footnote} a quelques défauts ; -en particulier, elle doit être chargée après l'extension \pkg{xcolor} et elle n'est pas parfaitement -compatible avec \pkg{hyperref}. - -\medskip -Dans ce document, l'extension \pkg{witharrows} a été chargée avec l'option \verb|footnotehyper| et nous donnons un -exemple avec une note de pied de page dans l'étiquette d'une flèche : - - -\smallskip -$\begin{WithArrows} -A & = (a+b)^2 -\Arrow{on développe\,\footnote{Une note de pied de page.}} \\ - & = a^2+b^2+2ab -\end{WithArrows}$ - -\bigskip -\subsection{L'option no-arrows} - -L'option \verb|no-arrows| est une facilité donnée à l'utilisateur. Avec cette option, -les flèches ne sont pas tracées. Néanmoins, une analyse des flèches est effectuée et certains erreurs sont -détectées (par exemple, si une flèche arrive après la dernière ligne de l'environnement). - - -\bigskip -\subsection{Note pour les développeurs} - -Si vous définissez un environnement s'appuyant sur un environnement de -\pkg{witharrows}, nous recommandons de faire appel à l'environnement de \pkg{witharrows} avec -\verb|\WithArrows|--\verb|\endWithArrows| ou \verb|\DispWithArrows|--\verb|\endDispWithArrows| (et -non \verb|\begin{WithArrows}|--\verb|\end{WithArrows}|, etc.). - -\smallskip -En faisant ainsi, les messages d'erreur affichés par \pkg{witharrows} mentionneront (le cas échéant) le nom de -votre environnement et seront plus faciles à comprendre pour l'utilisateur final. - -\smallskip -Par exemple, vous pouvez définir un environnement \verb|{DWA}| qui va être un alias de \verb|{DispWithArrows}|: -\begin{BVerbatim} -\NewDocumentEnvironment {DWA} {} {\DispWithArrows}{\endDispWithArrows} -\end{BVerbatim} - -\smallskip -Si vous utilisez cet environnement \verb|{DWA}| en mode mathématique, vous aurez le message d'erreur suivant : - -\begin{BVerbatim} -L'environnement {DWA} should be used only outside math mode. -\end{BVerbatim} - -\interitem -Une autre exemple est donné en interne par la définition de l'environnement \verb|{DispWithArrows*}| -dans l'extension \pkg{witharrows} avec le code suivant: -\begin{Verbatim} -\NewDocumentEnvironment {DispWithArrows*} {} - {\WithArrowsOptions{notag}% - \DispWithArrows} - {\endDispWithArrows} -\end{Verbatim} - - - -\section{Examples} - -\subsection{\textbackslash MoveEqLeft} - -Il est possible d'utiliser \verb|\MoveEqLeft| de \pkg{mathtools}. Dans ce cas, on doit se souvenir que la commande -\verb|\MoveEqLeft| a aussi la valeur d'une esperluette (\verb|&|). Il faut en tenir compte pour le positionnement -d'une éventuelle commande \verb|\Arrow|. - - -% -\begin{Verbatim}[formatcom=\small\color{gray}] -$\begin{WithArrows}[interline=0.5ex] -~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} -\Arrow{parce que les deux sont dans $[-\frac{\pi}2,\frac{\pi}2]$} \\ -& \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\ -& \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 -\Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\ -& \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2} -+ \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} -\end{WithArrows}$ -\end{Verbatim} - - -\medskip -$\begin{WithArrows}[interline=0.5ex] -\MoveEqLeft \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} -\Arrow{parce que les deux sont dans $[-\frac{\pi}2,\frac{\pi}2]$} \\ -& \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\ -& \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 -\Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\ -& \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2} -+ \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} -\end{WithArrows}$ - - -\bigskip -\subsection{Modifier la forme des nÅ“uds} - -Il est possible de changer la forme des étiquettes, qui sont des nÅ“uds Tikz, en -modifiant la clé «\verb|every node|» de Tikz. - -\begin{Verbatim} -\begin{WithArrows}% - [format = c, - interline = 4mm, - tikz = {~emphase#every node/.style = {circle,@ - ~emphase# draw,@ - ~emphase# auto = false,@ - ~emphase# fill = gray!50,@ - ~emphase# inner sep = 1pt,@ - ~emphase# font = \tiny}@}] - 3 (2x+4) = 6 \Arrow{$\div 3$} \\ - 2x+4 = 2 \Arrow{$-4$} \\ - 2x = -2 \Arrow{$\div 2$} \\ - 2x = -1 -\end{WithArrows} -\end{Verbatim} - -\[\begin{WithArrows}[% - format = c, - interline = 4mm, - tikz = {every node/.style = {circle, - draw, - auto = false, - fill = gray!50, - inner sep = 1pt, - font = \tiny}}] - 3 (2x+4) = 6 \Arrow{$\div 3$} \\ - 2x+4 = 2 \Arrow{$-4$} \\ - 2x = -2 \Arrow{$\div 2$} \\ - 2x = -1 -\end{WithArrows}\] - - -\bigskip -\subsection{Exemples avec l'option tikz-code} - -Rappelons que l'option \verb|tikz-code| est le code Tikz utilisé par \pkg{witharrows} -pour tracer les flèches.\footnote{Si un environnement \verb|{DispWithArrows}| ou -\verb|{DispWithArrows*}| est utilisé avec l'option \verb|wrap-lines|, la valeur de l'option -\verb|tikz-code| n'est pas utilisée pour cet environnement (mais est utilisée pour les -environnements imbriqués à l'intérieur).} - -\smallskip -La valeur par défaut de \verb|tikz-code| est \verb|\draw (#1) to node {#3} (#2) ;| -où les trois marqueurs \verb|#1|, \verb|#2| et \verb|#3| représentent le point de départ, le point d'arrivée -et l'étiquette de la flèche. - - -\bigskip -\subsubsection{Exemple 1} -Dans l'exemple suivant, nous définissons la valeur de \verb|tikz-code| avec deux -instructions \verb|\path| : la première instruction trace la flèche elle-même et la seconde -place l'étiquette dans un nÅ“ud Tikz dans le rectangle délimité par la flèche. - -\begin{Verbatim} -\begin{DispWithArrows*}% - [displaystyle, - ygap = 2mm, - ystart = 0mm, - ~emphase#tikz-code = {\draw (~#1) -- ++(4.5cm,0) \verb|- (~#2) ;@ - ~emphase# \path (~#1) -- (~#2) @ - ~emphase# node[text width = 4.2cm, right, midway] {~#3} ;}@] -S_n -& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -........... -\end{Verbatim} - - -\bigskip -\begin{DispWithArrows*}[ - displaystyle, - ygap = 2mm, - ystart = 0mm, - tikz-code = {\draw (#1) -- ++(4.5cm,0) |- (#2) ; - \path (#1) -- (#2) - node[text width = 4.2cm, right, midway] {#3} ;}] -S_n -& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -\Arrow{$\cos x = \Re(e^{ix})$}\\ -& = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right) -\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -& = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right) -\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\ -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{somme de termes d'une suite géométrique de raison $e^{i\frac{2\pi}n}$}\\ -& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows*} - -\bigskip -\subsubsection{Exemple 2} - -\label{example-WithArrowsRightX} -Il est possible de modifier l'exemple précédent pour avoir «\verb|text width|» calculé automatiquement en fonction -de la marge droite (d'une manière similaire à l'option \verb|wrap-lines|) dans les environnements -\verb|{DispWithArrows}| et \verb|{DispWithArrows*}|. Dans la définition de \verb|tikz-code|, nous utilisons la commande -\verb|\WithArrowsRightX| qui donne l'abscisse de la marge droite de la boîte de composition (pour TeX, il s'agit d'une commande -et non d'une dimension). Pour la lisibilité, nous avons utilisé un style de \pkg{witharrows}. Cet exemple nécessite -l'extension Tikz \pkg{calc}. - -\begin{Verbatim} -\WithArrowsNewStyle{MonStyle} - {displaystyle, - ygap = 2mm, - xoffset = 0pt, - ystart = 0mm, - tikz-code = {\path let \p1 = (~#~#1) - in (~#~#1) - -- node [anchor = west, - text width = {~emphase#\WithArrowsRightX@ - \x1 - 0.5 em}] - {~#~#3} - (~#~#2) ; - \draw let \p1 = (~#~#1) - in (~#~#1) -- ++(~emphase#\WithArrowsRightX@ - \x1,0) |- (~#~#2) ; }} -\end{Verbatim} - -\begin{Verbatim} -\begin{DispWithArrows}[MonStyle] - S_n - & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) - \Arrow{$\cos x = \Re(e^{ix})$}\\ -........... -\end{Verbatim} - -\WithArrowsNewStyle{MonStyle} -{displaystyle, - ygap = 2mm, - xoffset = 0pt, - ystart = 0mm, - tikz-code = {\path let \p1 = (##1) - in (##1) - -- node [anchor = west, - text width = {\WithArrowsRightX - \x1 - 0.5 em}] {##3} - (##2) ; - \draw let \p1 = (##1) - in (##1) -- ++(\WithArrowsRightX - \x1,0) |- (##2) ; }} - -\begin{DispWithArrows}[MonStyle] -S_n -& = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -\Arrow{$\cos x = \Re(e^{ix})$}\\ -& = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right) -\Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -& = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right) -\Arrow{$\exp$ est un morphisme pour $\times$ et $+$} \\ -& = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -\Arrow{somme de termes d'une suite géométrique $e^{i\frac{2\pi}n}$}\\ -& = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\ -& = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -\end{DispWithArrows} - - - -\bigskip -\subsubsection{Exemple 3} - -Dans l'exemple suivant, nous changeons la forme de la flèche selon que la rangée de départ est plus longue ou -plus courte que la rangée d'arrivée. Cet exemple nécessite l'extension \pkg{calc} de Tikz. - - -\begin{Verbatim} -\begin{WithArrows}[ll,interline=5mm,xoffset=5mm, - ~emphase#tikz-code = {\draw[rounded corners,@ - ~emphase# every node/.style = {circle,@ - ~emphase# draw,@ - ~emphase# auto = false,@ - ~emphase# inner sep = 1pt,@ - ~emphase# fill = gray!50,@ - ~emphase# font = \tiny }]@ - ~emphase# let \p1 = (~#1),@ - ~emphase# \p2 = (~#2)@ - ~emphase# dans \ifdim \x1 > \x2@ - ~emphase# (\p1) -- node {~#3} (\x1,\y2) -- (\p2)@ - ~emphase# \else@ - ~emphase# (\p1) -- (\x2,\y1) -- node {~#3} (\p2)@ - ~emphase# \fi ;}@] -E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7 -\Arrow{$\times 15$}\\ - & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\ - & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\ - & \Longleftrightarrow 20x+29 = 105 -\Arrow{$-29$}\\ - & \Longleftrightarrow 20x = 76 -\Arrow{$\div 20$}\\ - & \Longleftrightarrow x = \frac{38}{10} -\end{WithArrows} -\end{Verbatim} - - -\[\begin{WithArrows}[ll,interline=5mm,xoffset=5mm, - tikz-code = {\draw[rounded corners, - every node/.style = {circle, - draw, - auto = false, - inner sep = 1pt, - fill = gray!50, - font = \tiny}] - let \p1 = (#1), - \p2 = (#2) - in \ifdim \x1 > \x2 - (\p1) -- node {#3} (\x1,\y2) -- (\p2) - \else - (\p1) -- (\x2,\y1) -- node {#3} (\p2) - \fi ;}] -E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7 -\Arrow{$\times 15$}\\ - & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\ - & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\ - & \Longleftrightarrow 20x+29 = 105 -\Arrow{$-29$}\\ - & \Longleftrightarrow 20x = 76 -\Arrow{$\div 20$}\\ - & \Longleftrightarrow x = \frac{38}{10} -\end{WithArrows}\] - - - -\subsection{Boucle numérotée automatique} - -Supposons que nous voulions tracer une boucle avec des flèches numérotées. Dans ce but, il est -possible d'écrire une commande dédiée \verb|\BoucleNumérotée| qui fera le travail quand elle -sera utilisée dans le \verb|code-after|. Dans l'exemple suivant, nous avons écrit cette commande avec -\verb|\NewDocumentCommand| de \pkg{xparse} et \verb|\foreach| de \pkg{pgffor} (ces deux -extensions sont chargées quand \pkg{witharrows} est chargé.). - -\begin{Verbatim} -\NewDocumentCommande \NombreedLoop {} - {\foreach \j dans {2,...,\WithArrowsNbLines} - { \pgfmathtruncatemacro{\i}{\j-1} - \Arrow[rr]{\i}{\j}{\i} } - \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}} -\end{Verbatim} - -La commande \verb|\WithArrowsNbLines| est une commande disponible dans le \verb|code-after| qui donne -le nombre total de lignes (=rangées) dans l'environnement courant (pour TeX, il s'agit d'une commande et non d'un -compteur). - - -\bigskip -\begin{Verbatim} -$\begin{WithArrows}[~emphase#code-after = \BoucleNumérotée@] -a.\;& f \text{ est continue sur } E \\ -b.\;& f \text{ est continue en } 0 \\ -c.\;& f \text{ est bornée sur la sphère unité} \\ -d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -e.\;& f \text{ est lipschitzienne} -\end{WithArrows}$ -\end{Verbatim} - -\bigskip -\begin{scope} -\NewDocumentCommand \BoucleNumérotée {} - {\foreach \j in {2,...,\WithArrowsNbLines} - { \pgfmathtruncatemacro{\i}{\j-1} - \Arrow[rr]{\i}{\j}{\i} } - \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}} - - -$\begin{WithArrows}[code-after = \BoucleNumérotée] -a.\;& f \text{ est continue sur } E \\ -b.\;& f \text{ est continue en } 0 \\ -c.\;& f \text{ est bornée sur la sphère unité} \\ -d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -e.\;& f \text{ est lipschitzienne} -\end{WithArrows}$ - - -\bigskip -Comme d'habitude, il est possible changer les caractéristiques des flèches et des nÅ“uds -avec l'option \verb|tikz|. Néanmoins, si nous voulons changer le style pour avoir, par -exemple, les numéros entre parenthèses, le moyen le plus rapide est de changer la valeur de -\verb|tikz-code|: - -\begin{Verbatim} -tikz-code = {\draw (~#1) to node {\footnotesize (~#3)} (~#2) ;} -\end{Verbatim} - -\WithArrowsOptions{tikz-code = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}} - -$\begin{WithArrows}[code-after = \BoucleNumérotée] -a.\;& f \text{ est continue on } E \\ -b.\;& f \text{ est continue dans } 0 \\ -c.\;& f \text{ est bornée sur la sphère unité} \\ -d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -e.\;& f \text{ est lipschitzienne} -\end{WithArrows}$ - -\end{scope} - - - - - -\end{document} diff --git a/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf b/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf Binary files differdeleted file mode 100644 index a93bca1ae42..00000000000 --- a/Master/texmf-dist/doc/latex/witharrows/witharrows.pdf +++ /dev/null diff --git a/Master/texmf-dist/source/latex/witharrows/witharrows.dtx b/Master/texmf-dist/source/latex/witharrows/witharrows.dtx deleted file mode 100644 index f814d93b32b..00000000000 --- a/Master/texmf-dist/source/latex/witharrows/witharrows.dtx +++ /dev/null @@ -1,6603 +0,0 @@ -% \iffalse meta-comment -% -% Copyright (C) 2017-2019 by F. Pantigny -% ----------------------------------- -% -% This file may be distributed and/or 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://www.latex-project.org/lppl.txt -% -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% -% \fi -% \iffalse -\def\myfileversion{1.18} -\def\myfiledate{2019/07/24} -% -% -%<*batchfile> -\begingroup -\input l3docstrip.tex -\keepsilent -\usedir{tex/latex/witharrows} -\preamble - -Copyright (C) 2017-2019 by F. Pantigny ------------------------------------ - -This file may be distributed and/or 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://www.latex-project.org/lppl.txt - -and version 1.3 or later is part of all distributions of LaTeX -version 2005/12/01 or later. - -\endpreamble -\askforoverwritefalse -\endgroup -%</batchfile> -% -%<@@=wi> -%<*driver> -\documentclass[dvipsnames]{l3doc}% dvipsnames is for xcolor (loaded by Tikz, loaded by witharrows) -\usepackage{xltxtra} -\usepackage[xetex]{geometry} -\geometry{left=2.8cm,right=2.8cm,top=2.5cm,bottom=2.5cm,papersize={21cm,29.7cm}} -\usepackage[footnotehyper]{witharrows} -\usetikzlibrary{calc} -\usepackage{mathtools} -\usepackage{amssymb} -\usepackage[only,llbracket,rrbracket]{stmaryrd} -\usepackage{varwidth} -\NewDocumentEnvironment {scope} {} {} {} -\def\interitem{\vskip 7mm plus 2 mm minus 3mm} -\def\emphase{\bgroup\color{RoyalPurple}\let\next=} -\fvset{commandchars=\~\#\@,formatcom={\color{gray}}} -\DeclareMathOperator{\re}{Re} -\skip \footins = 2 \bigskipamount -\parindent 0pt -\DisableCrossrefs -\begin{document} -\DocInput{witharrows.dtx} -\end{document} -%</driver> -% \fi -% \VerbatimFootnotes -% \title{The package \pkg{witharrows}\thanks{This document corresponds to the -% version~\myfileversion\space of \pkg{witharrows}, at the date -% of~\myfiledate.}} \author{F. Pantigny \\ \texttt{fpantigny@wanadoo.fr}} -% -% \maketitle -% -% \hypersetup{ -% pdfinfo = { -% Title = { The extension 'witharrows' }, -% Subject = { A LaTeX extension } , -% Author = { F. Pantigny } -% } -% } -% -% -% \begin{abstract} -% The LaTeX package \pkg{witharrows} provides environments |{WithArrows}| and -% |{DispWithArrows}| similar to the environments |{aligned}| and |{align}| of -% \pkg{amsmath} but with the possibility to draw arrows on the right side of the -% alignment. These arrows are usually used to give explanations concerning the -% mathematical calculus presented. -% \end{abstract} -% -% -% \vspace{1cm} -% This package can be used with |xelatex|, |lualatex|, |pdflatex| -% but also by the classical workflow |latex|-|dvips|-|ps2pdf| (or Adobe -% Distiller). Several compilations may be necessary. This package requires the -% packages \pkg{expl3}, \pkg{xparse} and \pkg{tikz}. The Tikz libraries -% \pkg{arrows.meta} and \pkg{bending} are also required. -% -% \bigskip -% This package provides an environment |{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 % don't put \\ here -% \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 |\Arrow| on the row from which it -% starts. The command |\Arrow| must be used in the second column (the best way -% is to put it at the end of the second cell of the row as in the previous -% example). -% -% \medskip -% The environment |{WithArrows}| bears similarities with the environment -% |{aligned}| of \pkg{amsmath} (and |mathtools|). The extension \pkg{witharrows} -% also provides an environment |{DispWithArrows}| which is similar to the -% environment |{align}| of \pkg{amsmath}: cf. p. \pageref{DispWithArrows}. -% -% -% \section{Options for the shape of the arrows} -% -% The command |\Arrow| has several options. These options can be put between -% square brackets, before, or after the mandatory argument. -% -% The option |jump| gives the number\footnote{It's not possible to give a -% non-positive value to |jump|. See below (p.~\pageref{Backwards}) the way to -% draw an arrow which goes backwards.} of rows the arrow must jump (the default -% value is, of course,~$1$). -% -% -% \begin{Verbatim} -% $\begin{WithArrows} -% A & = \bigl((a+b)+1\bigr)^2 \Arrow[~emphase#jump=2@]{we expand} \\ -% & = (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=1+1]{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 row. -% \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 |xoffset| shifts the arrow to the right (we usually don't want the -% arrows to be stucked on the text). The default value of |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 |\Arrow| has an option -% |tikz| which can be used to give to the arrow (in fact, the command |\path| of -% Tikz) the options proposed by Tikz for such an arrow. The following example -% gives an thick arrow. -% \begin{Verbatim} -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow[~emphase#tikz=thick@]{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow[tikz=thick]{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% -% \interitem -% It's also possible to change the arrowheads. For example, we can draw an arrow -% which goes backwards with the Tikz option~|<-|. -% \label{Backwards} -% -% \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 -% ``|-|''. -% \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 ``|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}$ -% -% \smallskip -% In fact, it's possible to change more drastically the shape or the arrows with -% the option |tikz-code| (presented p.~\pageref{tikz-code}). -% -% \interitem -% It's possible to use the Tikz option ``|text width|'' to control the width of -% the text associated to the arrow.\footnote{It's possible to avoid the -% hyphenations of the words with the option ``|align = flush left|'' of Tikz.} -% % -% \begin{Verbatim} -% $\begin{WithArrows} -% 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}$ -% -% -% \bigskip -% In the environments |{DispWithArrows}| and |{DispWithArrows*}|, there is an -% option |wrap-lines|. With this option, the lines of the labels are -% automatically wrapped on the right: see p.~\pageref{wrap-lines}. -% -% \interitem -% If we want to change the font of the text associated to the arrow, we can, of -% course, put a command like |\bfseries|, |\large| or |\sffamily| at the -% beginning of the text. But, by default, the texts are composed with a -% combination of |\small| and |\itshape|. When adding |\bfseries| at the -% beginning of the text, we won't suppress the |\small| and the |\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 -% It's possible to put commands |\\| in the text to force new lines\footnote{By -% default, this is not possible in a Tikz node. However, in \pkg{witharrows}, -% the nodes are created with the option |align=left|, and, thus, it becomes -% possible.}. However, if we put a |\\| , a command of font placed in the -% beginning of the text will have effect only until the first command |\\| (like -% in an environment |{tabular}|). That's why Tikz gives an option |font| to -% modify the font of the whole text. Nevertheless, if we use the option -% |tikz={font={\bfseries}}|, the default specification of |\small| and -% |\itshape| will be overwritten. -% % -% \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 |font| the value |\itshape\small\bfseries|. -% -% -% \interitem -% The options can be given directly between square brackets to the environment -% |{WithArrows}|. There must be no space between the |\begin{WithArrows}| and -% the opening bracket (|[|) of the options of the environment. Such options -% apply to all the arrows of the environment.\footnote{They also apply to the -% nested environments |{WithArrows}| (with the logical exceptions of -% |interline|, |code-before| and |code-after|).} -% % -% \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 |{WithArrows}| has an option |displaystyle|. With this option, -% all the elements are composed in |\displaystyle| (like in an environment -% |{aligned}| of \pkg{amsmath}). -% -% \medskip -% Without the option |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 |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 -% |\WithArrowsOptions|. In this case, the scope of the declarations is the -% current TeX group (these declarations are ``semi-global''). For example, if we -% want all the environments |{WithArrows}| composed in |\displaystyle| with blue -% arrows, we can write -% |\WithArrowsOptions{displaystyle,tikz=blue}|.\footnote{It's also possible to -% configure \pkg{witharrows} by modifying the Tikz style |WithArrows/arrow| -% which is the style used by \pkg{witharrows} when drawing an arrow. For -% example, to have the labels in blue with roman (upright) types, one can use -% the following instruction: -% |\tikzset{WithArrows/arrow/.append style = {blue,font = {}}}|.} -% -% \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{scope} -% \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{scope} -% -% -% \interitem -% The command |\Arrow| is recognized only in the environments |{WithArrows}|. If -% we have a command |\Arrow| previously defined, it's possible to go on using it -% outside the environments |{WithArrows}|. -% -% However, a previouly defined command |\Arrow| may still be useful in an -% environment |{WithArrows}|. If we want to use it in such an environment, it's -% possible to change the name of the command |\Arrow| of the package -% \pkg{witharrows}: there is an option |command-name|\footnote{For historical -% reasons, there is an alias for this option: |CommandName|.} for this purpose. -% The new name of the command must be given to the option \emph{without} the -% leading backslash. -% % -% \begin{Verbatim} -% \NewDocumentCommand {\Arrow} {} {\longmapsto} -% $\begin{WithArrows}[~emphase#command-name=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{scope} -% \NewDocumentCommand {\Arrow} {} {\longmapsto} -% $\begin{WithArrows}[command-name=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{scope} -% -% -% \interitem -% The environment |{WithArrows}| provides also two options |code-before| and -% |code-after|\footnote{For historical reasons, there are aliases for these -% options: |CodeBefore| and |CodeAfter|.} for LaTeX code that will be executed -% at the beginning and at the end of the environment. These options are not -% designed to be hooks (they are available only at the environment level and -% they do not apply to the nested environments). -% % -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#code-before = \color{blue}@] -% A & = (a+b)^2 \Arrow{we expand} \\ -% & = a^2 + 2ab + b^2 -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows}[code-before = \color{blue}] -% A & = (a+b)^2 \Arrow{we expand} \\ -% & = a^2 + 2ab + b^2 -% \end{WithArrows}$ -% -% \medskip -% Special commands are available in |code-after|: a command |\WithArrowsNbLines| -% which gives the number of lines (=rows) of the current environment (this is a -% command and not a counter), a special form of the command |\Arrow| and the -% command |\MultiArrow|: these commands are described in the section concerning -% the nested environments, p.~\pageref{NestedEnv}. -% -% \section{Numbers of columns} -% -% So far, we have used the environment |{WithArrows}| with two columns. However, -% it's possible to use the environment with an arbitrary number of columns with -% the option |format|. The value given to this option is like the preamble of an -% environment |{array}|, that is to say a sequence of letters |r|, |c| and |l|. -% The default value of the option |format| is, in fact, |rl|. -% -% \bigskip -% For exemple, if we want only one column left-aligned, we use the option |format=l|. -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#format = l@] -% f(x) \ge g(x) \Arrow{by squaring both sides} \\ -% f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\ -% f(x)^2 - g(x)^2 \ge 0 -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows}[format = l] -% f(x) \ge g(x) \Arrow{by squaring both sides} \\ -% f(x)^2 \ge g(x)^2 \Arrow{by moving to left side} \\ -% f(x)^2 - g(x)^2 \ge 0 -% \end{WithArrows}$ -% -% \interitem -% In the following example, we use five columns all centered (the environment -% |{DispWithArrows*}| is presented p.~\pageref{DispWithArrows}). -% -% \begin{Verbatim} -% \begin{DispWithArrows*}[~emphase#format = ccccc@, -% wrap-lines, -% tikz = {align = flush left}, -% interline=1mm] -% k & \;\le\; & t & \;\le\; & k+1 \\ -% \frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} -% \Arrow{we can integrate the inequalities since $k \leq k+1$ } \\ -% \int\limits_k^{k+1} \frac{d t}{k+1} -% & \le & \int\limits_k^{k+1} \frac{dt}{t} -% & \le & \int\limits_k^{k+1} \frac{dt}{k} \\ -% \frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} -% \end{DispWithArrows*} -% \end{Verbatim} -% \begin{DispWithArrows*}[format = ccccc, -% wrap-lines, -% tikz = {align = flush left}, -% interline=1mm] -% k & \;\le\; & t & \;\le\; & k+1 \\ -% \frac{1}{k+1} & \le & \frac{1}{t} & \le & \frac{1}{k} -% \Arrow{we can integrate the inequalities since $k \leq k+1$ } \\ -% \int\limits_k^{k+1} \frac{d t}{k+1} -% & \le & \int\limits_k^{k+1} \frac{dt}{t} -% & \le & \int\limits_k^{k+1} \frac{dt}{k} \\ -% \frac{1}{k+1} & \le & \ln(k+1)-\ln(k) & \le & \frac{1}{k} -% \end{DispWithArrows*} -% -% -% \section{Precise positioning of the arrows} -% -% -% The environment |{WithArrows}| defines, during the composition of the array, -% two series of nodes materialized in red in the following example.\footnote{The -% option |show-nodes| can be used to materialize the nodes. The nodes are in -% fact Tikz nodes of shape ``rectangle'', but with zero width. An arrow between -% two nodes starts at the \emph{south} anchor of the first node and arrives at -% the \emph{north} anchor of the second node.} -% -% \smallskip -% $\begin{WithArrows}[displaystyle,show-nodes] -% 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}. -% -% By default, the arrows use the right nodes. We will say that they are in |rr| -% mode ($r$ for \emph{right}). These arrows are vertical (we will say that an -% arrow is \emph{vertical} when its two ends have the same abscissa). -% -% -% \smallskip -% However, it's possible to use the left nodes, or a combination of left and -% right nodes, with one of the options |lr|, |rl| and |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 |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 |ll| option -% and a |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 |i| (\emph{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 |{WithArrows}| gives also a |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 replace $y_0$ by its value}\\ -% & \Longleftrightarrow 2xK'x^{\frac32} = x^{\frac12} \Arrow{simplification of the $x$}\\ -% & \Longleftrightarrow K' = \tfrac1{2x^2} \Arrow{antiderivation}\\ -% & \Longleftrightarrow K = -\tfrac1{2x} -% \end{WithArrows}$ -% -% -% \bigskip -% The environment |{WithArrows}| gives also a |groups| option (with a \emph{s} -% in the name). With this option, the arrows are divided into several -% ``groups''. Each group is a set of connected\footnote{More precisely: for each -% arrow $a$, we note $i(a)$ the number of its initial row and $f(a)$ the number -% of its final row; for two arrows $a$ and $b$, we say that $a \sim b$ when -% $\llbracket i(a),f(a)\rrbracket \cap \llbracket i(b),f(b)\rrbracket \neq -% \varnothing$; the groups are the equivalence classes of the transitive closure -% of $\sim$.} arrows. All the arrows of a given group are grouped on a same -% vertical line and at a leftmost position. -% -% \bigskip -% $\begin{WithArrows}[groups] -% A & = B \Arrow{one} \\ -% & = C+D \Arrow{two} \\ -% & = D' \\ -% & = E+F+G+H+I \\ -% & = K + L + M \Arrow{three}\\ -% & = N \Arrow{four}\\ -% & = O -% \end{WithArrows}$ -% -% \bigskip -% In an environment which uses the option |group| or the option |groups|, it's -% still possible to give an option of position (|ll|, |lr|, |rl|, |rr| or |i|) -% to an individual arrow. Such arrow will be drawn irrespective of the groups. -% It's also possible to start a new group by applying the option |new-group| to -% an given arrow. -% -% \bigskip -% If desired, the option |group| or the option |groups| can be given to the -% command |\WithArrowsOptions| so that it will become the default value. In this -% case, it's still possible to come back to the default behaviour for a given -% environment |{WithArrows}| with the option |rr|: |\begin{WithArrows}[rr]| -% -% -% \vspace{1cm} -% In the following example, we have used the option |group| for the environment -% and the option |rr| for the last arrow (that's why the last arrow is not -% aligned with the others). -% -% $\begin{WithArrows}[interline=1mm,group] -% \sum\limits_{k=0}^n\frac{\cos kx}{\cos^k x} -% & = \sum\limits_{k=0}^n \frac{\Re (e^{ikx})}{(\cos x)^k} -% \Arrow{$(\cos x)^k$ is real} \\ -% & = \sum\limits_{k=0}^n \Re\left(\frac{e^{ikx}}{(\cos x)^k}\right) -% \Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -% & = \Re \left(\sum\limits_{k=0}^n \left(\frac{e^{ix}}{\cos x}\right)^k\right) -% \Arrow{sum of terms of a geometric progression} \\ -% & = \Re \left(\frac{1-\left(\frac{e^{ix}}{\cos x}\right)^{n+1}}{1-\frac{e^{ix}}{\cos x}} \right) -% \Arrow{algebraic calculation} \\ -% & = \Re \left(\frac{1-\frac{e^{i(n+1)x}}{\cos^{n+1}x}}{1-\frac{e^{ix}}{\cos x}}\right) -% \Arrow{reduction to common denominator} \\ -% & = \Re \left(\frac{\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos^{n+1}x}}{\frac{\cos x-e^{ix}}{\cos x}}\right) -% \Arrow{$\Re(kz) = k\cdot\Re(z)$ if $k$ is real} \\ -% & = \frac1{\cos^n x}\Re \left(\frac{\cos^{n+1}x-e^{i(n+1)x}}{\cos x-e^{ix}}\right) -% \Arrow[rr]{algebraic form of the complexes} \\ -% & =\frac1{\cos^n x}\Re\left(\frac{\cos^{n+1}x-(\cos(n+1)x+i\sin(n+1)x)}{\cos x-(\cos x+i\sin x)}\right) \\ -% & =\frac1{\cos^n x}\Re\left(\frac{(\cos^{n+1}x-\cos(n+1)x)-i\sin(n+1)x}{-i\sin x}\right) \\ -% & = \frac1{\cos^nx}\cdot\frac{\sin(n+1)x}{\sin x} -% \end{WithArrows}$ -% -% \interitem -% -% \section[The options 'up' and 'down' for individual arrows]% -% {The options ``up'' and ``down'' for individual arrows} -% -% \label{up-and-down} -% At the local level, there are also two options for individuals arrows, called -% ``|up|'' and ``|down|''. The following example illustrates these types of -% arrows: -% -% \begin{Verbatim} -% \(\begin{WithArrows} -% A & = B -% \Arrow~emphase#[up]@{an arrow of type \texttt{up}} \\ -% & = C + C + C + C + C + C + C + C \\ -% & = C + C + C + C + C + C + C + C -% \Arrow~emphase#[down]@{an arrow of type \texttt{down}} \\ -% & = E + E -% \end{WithArrows}\) -% \end{Verbatim} -% -% \vspace{1cm} -% \(\begin{WithArrows} -% A & = B -% \Arrow[up]{an arrow of type \texttt{up}} \\ -% & = C + C + C + C + C + C + C + C \\ -% & = C + C + C + C + C + C + C + C -% \Arrow[down]{an arrow of type \texttt{down}} \\ -% & = E + E -% \end{WithArrows}\) -% -% -% \vspace{1cm} -% The options |up| and |down| require the package \pkg{varwidth} and the Tikz -% library \pkg{calc}. It they are not loaded, an error will be raised. -% -% -% \interitem -% -% \section{Comparison with the environment \{aligned\}} -% -% |{WithArrows}| bears similarities with the environment |{aligned}| of the -% extension \pkg{amsmath}. These are only similarities because |{WithArrows}| -% has not been written upon the environment |{aligned}|.\footnote{In fact, it's -% possible to use the package \pkg{witharrows} without the package -% \pkg{amsmath}.} -% -% \interitem -% As in the environments of \pkg{amsmath}, it's possible to change the spacing -% between two given rows with the option of the command |\\| of end of line -% (it's also possible to use |\\*| but it has exactly the same effect as |\\| -% since an environment |{WithArrows}| is always unbreakable). This option is -% designed to be used with positive values only. -% % -% \begin{Verbatim} -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow{we expand} ~emphase#\\[2ex]@ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow{we expand} \\*[2ex] -% \noalign{\vspace{3mm}} -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% -% -% \interitem -% In the environments of \pkg{amsmath} (or \pkg{mathtools}), the spacing between -% rows is fixed by a parameter called |\jot| (it's a dimension and not a skip). -% That's also the case for the environment |{WithArrows}|. An option |jot| has -% been given to the environment |{WithArrows}| in order to change the value of -% this parameter |\jot| for a given environment.\footnote{It's also possible to -% change |\jot| with the environment |{spreadlines}| of \pkg{mathtools}.} -% % -% \begin{Verbatim} -% $\begin{WithArrows}[displaystyle,~emphase#jot=2ex@] -% F & = \frac12G \Arrow{we expand}\\ -% & = H + \frac12K \Arrow{we go on}\\ -% & = K -% \end{WithArrows}$ -% \end{Verbatim} -% -% -% $\begin{WithArrows}[displaystyle,jot=2ex] -% F & = \frac12G \Arrow{we expand}\\ -% & = H + \frac12K \Arrow{we go on}\\ -% & = K -% \end{WithArrows}$ -% -% -% \bigskip -% However, this new value of |\jot| will also be used in other alignments -% included in the environment~|{WithArrows}|: -% % -% \begin{Verbatim} -% $\begin{WithArrows}[jot=2ex] -% \varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -% \Arrow{$x$ and $y$ are real}\\ -% & \Leftrightarrow \left\{ -% \begin{aligned} -% x+y & = 0 \\ -% x+2y & = 0 -% \end{aligned} -% \right. -% \end{WithArrows}$ -% \end{Verbatim} -% -% -% $\begin{WithArrows}[jot=2ex] -% \varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -% \Arrow{$x$ and $y$ are real}\\ -% & \Leftrightarrow \left\{ -% \begin{aligned} -% x+y & = 0 \\ -% x+2y & = 0 -% \end{aligned} -% \right. -% \end{WithArrows}$ -% -% \bigskip -% Maybe this doesn't correspond to the desired outcome. That's why an option -% |interline| is proposed. It's possible to use a skip (=glue) for this option. -% % -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#interline=2ex@] -% \varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -% \Arrow{$x$ and $y$ are real}\\ -% & \Leftrightarrow \left\{ -% \begin{aligned} -% x+y & = 0 \\ -% x+2y & = 0 \\ -% \end{aligned} -% \right. -% \end{WithArrows}$ -% \end{Verbatim} -% -% -% $\begin{WithArrows}[interline=2ex] -% \varphi(x,y) = 0 & \Leftrightarrow (x+y)^2 + (x+2y)^2 = 0 -% \Arrow{$x$ and $y$ are real}\\ -% & \Leftrightarrow \left\{ -% \begin{aligned} -% x+y & = 0 \\ -% x+2y & = 0 \\ -% \end{aligned} -% \right. -% \end{WithArrows}$ -% -% -% \interitem -% Like the environment |{aligned}|, |{WithArrows}| has an option of placement -% which can assume the values |t|, |c| or |b|. However, the default value is not -% |c| but |t|. If desired, it's possible to have the |c| value as the default -% with the command |\WithArrowsOptions{c}| at the beginning of the document. -% % -% \begin{Verbatim} -% So\enskip -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% \end{Verbatim} -% -% So\enskip -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% -% \bigskip -% The value |c| may be useful, for example, if we want to add curly braces: -% -% \smallskip -% \begin{Verbatim} -% Let's set\enskip $~emphase#\left\{@ -% \begin{WithArrows}[~emphase#c@] -% f(x) & = 3x^3+2x^2-x+4 -% \Arrow[tikz=-]{both are polynoms}\\ -% g(x) & = 5x^2-5x+6 -% \end{WithArrows} -% ~emphase#\right.@$ -% \end{Verbatim} -% -% -% Let's set\enskip $\left\{ -% \begin{WithArrows}[c] -% f(x) & = 3x^3+2x^2-x+4 -% \Arrow[tikz=-]{both are polynoms}\\ -% g(x) & = 5x^2-5x+6 -% \end{WithArrows} -% \right.$ -% -% -% \interitem -% Unlike |{aligned}|, the environment |{WithArrows}| uses |\textstyle| by -% default. -% -% Once again, it's possible to change this behaviour with |\WithArrowsOptions|: -% -% \quad |\WithArrowsOptions{displaystyle}|. -% -% -% \smallskip -% The following example is composed with |{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 |{WithArrows}[c,displaystyle]|. The results are -% strictly identical.\footnote{In versions of \pkg{amsmath} older than the -% 5~nov.~2016, a thin space was added on the left of an environment |{aligned}|. -% The new versions do not add this space and neither do -% |{WithArrows}|.}\par\nobreak -% -% \smallskip -% $\left\{ -% \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{Arrows in nested environments} -% -% \label{NestedEnv} -% -% The environments |{WithArrows}| can be nested. In this case, the options given -% to the encompassing environment applies also to the inner ones (with logical -% exceptions for |interline|, |code-before| and |code-after|). The command |Arrow| -% can be used as usual in each environment |{WithArrows}|. -% -% \begin{Verbatim}[formatcom=\small\color{gray}] -% $~emphase#\begin{WithArrows}@ -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\ -% & \Leftrightarrow -% \left\{~emphase#\begin{WithArrows}@[c] -% x+2y & = 0 \\ -% 2x+4y & = 0 -% ~emphase#\end{WithArrows}@\right. \\ -% & \Leftrightarrow -% \left\{~emphase#\begin{WithArrows}@[c] -% x+2y & = 0 \Arrow[tikz=-]{the same equation}\\ -% x+2y & = 0 -% ~emphase#\end{WithArrows}@\right. \\ -% & \Leftrightarrow x+2y=0 -% ~emphase#\end{WithArrows}@$ -% \end{Verbatim} -% -% $\begin{WithArrows} -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \Arrow{the numbers are real}\\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% 2x+4y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \Arrow[tikz=-]{the same equation}\\ -% x+2y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow x+2y=0 -% \end{WithArrows}$ -% -% \bigskip -% However, one may want to draw an arrow between rows that are not in the same -% environment. For example, one may want to draw the following arrow : -% -% \bigskip -% $\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division by $2$} ] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% 2x+4y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% x+2y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow x+2y=0 -% \end{WithArrows}$ -% -% -% \bigskip -% Such a construction is possible by using |\Arrow| in the |code-after| option. -% Indeed, in |code-after|, a special version of |\Arrow| is available (we will -% call it ``|\Arrow| in |code-after|''). -% -% \smallskip -% A command |\Arrow| in |code-after| takes three arguments : -% \begin{itemize} -% \item a specification of the start row of the arrow ; -% \item a specification of the end row of the arrow ; -% \item the label of the arrow. -% \end{itemize} -% As usual, it's also possible to give options within square brackets before or -% after the three arguments. However, these options are limited (see below). -% -% \bigskip -% The specification of the row is constructed with the position of the concerned -% environment in the nesting tree, followed (after an hyphen) by the number of -% the row. -% -% \bigskip -% In the previous example, there are two environments |{WithArrows}| nested in -% the main environment |{WithArrows}|. -% -% $\begin{WithArrows}[tikz-code = {\path (#1) to node {#3} (#2) ; }] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% & \Leftrightarrow \color{blue} -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \Arrow{environment number 1}\\ -% 2x+4y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow \color{red} -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \Arrow{environment number 2}\\ -% x+2y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow x+2y=0 -% \end{WithArrows}$ -% -% \bigskip -% The arrow we want to draw starts in the row~$2$ of the sub-environment -% number~$1$ (and therefore, the specification is |1-2|) and ends in the row~$2$ -% of the sub-environment number~$2$ (and therefore, the specification is |2-2|). -% We can draw the arrow with the following command |\Arrow| in |code-after| : -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#code-after = \Arrow{1-2}{2-2}{division by $2$}@ ] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% ......... -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows}[code-after = \Arrow{1-2}{2-2}{division by $2$} ] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% 2x+4y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% x+2y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow x+2y=0 -% \end{WithArrows}$ -% -% \bigskip -% The options allowed for a command |\Arrow| in |code-after| are : |ll|, |lr|, -% |rl|, |rr|, |v|, |xoffset|, |tikz| and |tikz-code|. Except |v|, which is -% specific to |\Arrow| in |code-after|, all these options have their usual -% meaning. -% -% With the option |v|, the arrow drawn is vertical to an abscissa computed with -% the start row and the end row only : the intermediate lines are not taken into -% account unlike with the option |i|. Currently, the option |i| is not available -% for the command~|\Arrow| in |code-after|. However, it's always possible to -% translate an arrow with |xoffset| (or |xshift| of Tikz). -% \begin{Verbatim} -% $\begin{WithArrows}[code-after=\Arrow~emphase#[v]@{1-2}{2-2}{division by $2$}] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% ......... -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows}[code-after = \Arrow[v]{1-2}{2-2}{division by $2$} ] -% \varphi(x,y)=0 -% & \Leftrightarrow (x+2y)^2+(2x+4y)^2 = 0 \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% 2x+4y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow -% \left\{\begin{WithArrows}[c] -% x+2y & = 0 \\ -% x+2y & = 0 -% \end{WithArrows}\right. \\ -% & \Leftrightarrow x+2y=0 -% \end{WithArrows}$ -% -% -% \interitem -% The package \pkg{witharrows} gives also another command available only in -% |code-after|: the command |\MultiArrow|. This command draws a ``rak''. The list -% of the rows of the environment concerned by this rak are given in the first -% argument of the command |\MultiArrow|. This list is given with the syntax of -% the list in a |\foreach| command of \pkg{pgffor}. -% -% -% \begin{Verbatim} -% $\begin{WithArrows}[tikz = rounded corners, -% code-after = {~emphase#\MultiArrow{1,...,4}{text}@} ] -% A & = B \\ -% & = C \\ -% & = D \\ -% & = E \\ -% & = F -% \end{WithArrows}$ -% \end{Verbatim} -% -% -% $\begin{WithArrows}[tikz = rounded corners, -% code-after = {\MultiArrow{1,...,4}{text}}] -% A & = B \\ -% & = C \\ -% & = D \\ -% & = E \\ -% & = F -% \end{WithArrows}$ -% -% \medskip -% As of now, there is no option available for the command |\MultiArrow| (maybe -% in a future release). -% -% -% \bigskip -% \section{Arrows from outside environments \{WithArrows\}} -% -% If someone wants to draw arrows from outside the environments |{WithArrows}|, -% he can use the Tikz nodes created in the environments. -% -% The Tikz name of a node created by \pkg{witharrows} is prefixed by |wa-|. -% Then, we have a list of numbers which give the position in the nesting tree -% and the row number in the environment. At the end, we have the suffixe |l| for -% a ``left node'' and |r| for a ``right node''. -% -% \smallskip -% For illustrative purposes, we give an example of nested environments -% |{WithArrows}|, and, for each ``right node'', the name of that -% node.\footnote{There is an option |show-node-names| to show the names of these -% nodes.} -% -% \medskip -% \[\begin{WithArrows}[show-nodes,show-node-names] -% A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\ -% & \vartriangleleft \left\{ -% \begin{WithArrows}[c] -% C & \vartriangleleft D \\ -% E & \vartriangleleft F -% \end{WithArrows} -% \right. \\ -% & \vartriangleleft -% \left\{ -% \begin{WithArrows}[c] -% G & \vartriangleleft H+H+H+H+H+H+H \\ -% I & \vartriangleleft -% \left\{ -% \begin{WithArrows} -% J &\vartriangleleft K \\ -% L &\vartriangleleft M -% \end{WithArrows} -% \right. -% \end{WithArrows} -% \right. \\ -% & \vartriangleleft -% \left\{ -% \begin{WithArrows}[c] -% N & \vartriangleleft O \\ -% P & \vartriangleleft Q -% \end{WithArrows} -% \right. -% \end{WithArrows}\] -% -% \medskip -% The package \pkg{witharrows} provides some tools facilitating the use of these -% nodes: -% \begin{itemize} -% \item the command |\WithArrowsLastEnv| gives the number of the last -% environment of level~$0$ (\emph{i.e.} which is not included in another -% environnment of the package \pkg{witharrows}); -% -% \item a name can be given to a given environment with the option |name| and, -% in this case, the nodes created in the environment will have aliases -% constructed with this name; -% -% \item the Tikz style |WithArrows/arrow| is the style used by \pkg{witharrows} -% when drawing an arrow\footnote{More precisely, this style is given to the Tikz -% option ``|every path|'' before drawing the arrow with the code of the option -% |tikz-code|. This style is modified (in TeX scopes) by the option |tikz| of -% \pkg{witharrows}.}; -% -% \item the Tikz style |WithArrows/arrow/tips| is the style for the tip of the -% arrow (loaded by |WithArrows/arrow|). -% \end{itemize} -% -% For example, we can draw an arrow from \texttt{wa-\WithArrowsLastEnv-2-1-2-r.south} -% to \texttt{wa-\WithArrowsLastEnv-3-2-r.north} with the following Tikz command. -% -% \begin{Verbatim} -% \begin{tikzpicture}[remember picture,overlay] -% \draw [WithArrows/arrow] -% ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south) -% to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ; -% \end{tikzpicture} -% \end{Verbatim} -% -% \[\begin{WithArrows} -% A & \vartriangleleft B+B+B+B+B+B+B+B+B+B+B+B+B \\ -% & \vartriangleleft \left\{ -% \begin{WithArrows}[c] -% C & \vartriangleleft D \\ -% E & \vartriangleleft F -% \end{WithArrows} -% \right. \\ -% & \vartriangleleft -% \left\{ -% \begin{WithArrows}[c] -% G & \vartriangleleft H+H+H+H+H+H+H \\ -% I & \vartriangleleft -% \left\{ -% \begin{WithArrows} -% J &\vartriangleleft K \\ -% L &\vartriangleleft M -% \end{WithArrows} -% \right. -% \end{WithArrows} -% \right. \\ -% & \vartriangleleft -% \left\{ -% \begin{WithArrows}[c] -% N & \vartriangleleft O \\ -% P & \vartriangleleft Q -% \end{WithArrows} -% \right. -% \end{WithArrows}\] -% -% \begin{tikzpicture}[remember picture,overlay] -% \draw [WithArrows/arrow] -% ([xshift=3mm]wa-\WithArrowsLastEnv-2-1-2-r.south) -% to ([xshift=3mm]wa-\WithArrowsLastEnv-3-2-r.north) ; -% \end{tikzpicture} -% -% \medskip -% In this case, it would be easier to use a command |\Arrow| in |code-after| but -% this is an example to explain how the Tikz nodes created by \pkg{witharrows} -% can be used. -% -% \bigskip -% In the following example, we create two environments |{WithArrows}| named -% ``|first|'' and ``|second|'' and we draw a line between a node of the first -% and a node of the second. -% -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#name=first@] -% A & = B \\ -% & = C -% \end{WithArrows}$ -% -% \bigskip -% $\begin{WithArrows}[~emphase#name=second@] -% A' & = B' \\ -% & = C' -% \end{WithArrows}$ -% -% \begin{tikzpicture}[remember picture,overlay] -% \draw [WithArrows/arrow] -% ([xshift=3mm]~emphase#first@-1-r.south) -% to ([xshift=3mm]~emphase#second@-1-r.north) ; -% \end{tikzpicture} -% \end{Verbatim} -% -% -% \begin{center} -% $\begin{WithArrows}[name=first] -% A & = B \\ -% & = C -% \end{WithArrows}$ -% -% \bigskip -% $\begin{WithArrows}[name=second] -% A' & = B' \\ -% & = C' -% \end{WithArrows}$ -% \end{center} -% -% \begin{tikzpicture}[remember picture,overlay] -% \draw [WithArrows/arrow] -% ([xshift=3mm]first-1-r.south) -% to ([xshift=3mm]second-1-r.north) ; -% \end{tikzpicture} -% -% \section{The environment \{DispWithArrows\}} -% \label{DispWithArrows} -% -% As previously said, the environment |{WithArrows}| bears similarities with the -% environment |{aligned}| of \pkg{amsmath} (and |mathtools|). This extension also -% provides an environment |{DispWithArrows}| which is similar to the -% environments |{align}| and |{flalign}| of \pkg{amsmath}. -% -% \medskip -% The environment |{DispWithArrows}| must be used \emph{outside} math mode. Like -% |{align}|, it should be used in horizontal mode. -% \begin{Verbatim} -% \begin{~emphase#DispWithArrows@} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{~emphase#DispWithArrows@} -% \end{Verbatim} -% \begin{DispWithArrows} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{DispWithArrows} -% -% \medskip -% It's possible to use the command |\notag| (or |\nonumber|) to suppress a tag. -% -% It's possible to use the command |\tag| to put a special tag (e.g. $\star$). -% -% It's also possible to put a label to the line of an equation with the command -% |\label|. -% -% These commands must be in the second column of the environment. -% \begin{Verbatim} -% \begin{DispWithArrows} -% A & = (a+1)^2 \Arrow{we expand} ~emphase#\notag@ \\ -% & = a^2 + 2a + 1 ~emphase#\tag{$\star$} \label{my-equation}@ -% \end{DispWithArrows} -% \end{Verbatim} -% \begin{DispWithArrows} -% A & = (a+1)^2 \Arrow{we expand} \notag \\ -% & = a^2 + 2a + 1 \tag{$\star$} \label{my-equation} -% \end{DispWithArrows} -% A link to the equation \eqref{my-equation}. This link has been composed with -% |\eqref{my-equation}| (the command |\eqref| is a command of \pkg{amsmath}). -% -% \medskip -% If \pkg{amsmath} (or \pkg{mathtools}) is loaded, it's also possible to use -% |\tag*| which, as in \pkg{amsmath}, typesets the tag without the parenthesis. -% For example, it's possible to use it to put the symbol |\square| of -% \pkg{amssymb}. This symbol is often used to mark the end of a -% proof.\footnote{Notice that the environment |{DispWithArrows}| is compatible -% with the command |\qedhere| of \pkg{amsthm}.} -% \begin{Verbatim} -% \begin{DispWithArrows} -% A & = (a+1)^2 \Arrow{we expand} \notag \\ -% & = a^2 + 2a + 1 ~emphase#\tag*{$\square$}@ -% \end{DispWithArrows} -% \end{Verbatim} -% \begin{DispWithArrows} -% A & = (a+1)^2 \Arrow{we expand} \notag \\ -% & = a^2 + 2a + 1 \tag*{$\square$} -% \end{DispWithArrows} -% -% \medskip -% It's also possible to suppress all the autogenerated numbers with the boolean -% option |notag| (or |nonumber|), at the global or environment level. There is -% also an environment |{DispWithArrows*}| which suppresses all these -% numbers.\footnote{Even in this case, it's possible to put a ``manual tag'' -% with the command |\tag|.} -% \begin{Verbatim} -% \begin{~emphase#DispWithArrows*@} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{~emphase#DispWithArrows*@} -% \end{Verbatim} -% \begin{DispWithArrows*} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{DispWithArrows*} -% -% \medskip -% In fact, there is also another option |tagged-lines| which can be used to -% control the lines that will be tagged. The value of this option is a list of -% the numbers of the lines that must to be tagged. For example, with the option -% |tagged-lines = {first,3,last}|, only the first, the third and the last line -% of the environment will be tagged. There is also the special value |all| which -% means that all the lines will be tagged. -% \begin{Verbatim} -% \begin{DispWithArrows}[~emphase#tagged-lines = last@] -% A & = A_1 \Arrow{first stage} \\ -% & = A_2 \Arrow{second stage} \\ -% & = A_3 -% \end{DispWithArrows} -% \end{Verbatim} -% \begin{DispWithArrows}[tagged-lines = last] -% A & = A_1 \Arrow{first stage} \\ -% & = A_2 \Arrow{second stage} \\ -% & = A_3 -% \end{DispWithArrows} -% -% \bigskip -% With the option |fleqn|, the environment is composed flush left (in a way -% similar to the option |fleqn| of the standard classes of LaTeX). In this case, -% the left margin can be controlled with the option |mathindent| (with a name -% inspired by the parameter |\mathindent| of standard LaTeX). The default value -% of this parameter is 25~pt. -% -% \begin{Verbatim} -% \begin{DispWithArrows}[~emphase#fleqn,mathindent = 1cm@] -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{DispWithArrows} -% \end{Verbatim} -% \begin{DispWithArrows}[fleqn,mathindent = 1cm] -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{DispWithArrows} -% -% \medskip -% \emph{Remark} : By design, the option |fleqn| of \pkg{witharrows} is -% independent of the option |fleqn| of LaTeX. Indeed, since the environments of -% \pkg{witharrows} are meant to be used with arrows on the right side, the user -% may want to use \pkg{witharrows} with the option |fleqn| (in order to have -% more space on the right of the equations for the arrows) while still centering -% the classical equations. -% -% \medskip -% If the option |leqno| is used as a class option, the labels will be composed -% on the left also for the environments |{DispWithArrows}| and -% |{DispWithArrows*}|.\footnote{The package \pkg{amsmath} has an option |leqno| -% but \pkg{witharrows}, of course, is not aware of that option: \pkg{witharrows} -% only checks the option |leqno| of the document class.} -% -% \medskip -% If the package \pkg{amsmath} is loaded, it's possible to use the command -% |\intertext| in the environments |{DispWithArrows}|. It's also possible to use -% the environment |{subequations}|. However, there is, for the environments -% |{DispWithArrows}| an option |subequations| to encapsulate the environment in -% an environment |{subequations}|. -% -% \medskip -% In the following example, the key |{subequations}| is fixed by the command -% |\WithArrowsOptions|. Each environment |{DispWithArrows}| will subnumerated -% (in the scope of the |\WithArrowsOptions|) -% \begin{Verbatim} -% ~emphase#\WithArrowsOptions{subequations}@ -% First environment. -% \begin{DispWithArrows} -% A & = B \\ -% & = C -% \end{DispWithArrows} -% Second environment. -% \begin{DispWithArrows} -% D & = E \\ -% & = F -% \end{DispWithArrows} -% \end{Verbatim} -% % -% \begin{scope} -% \WithArrowsOptions{subequations} -% First environment. -% \begin{DispWithArrows} -% A & = B \\ -% & = C -% \end{DispWithArrows} -% Second environment. -% \begin{DispWithArrows} -% D & = E \\ -% & = F -% \end{DispWithArrows} -% \end{scope} -% -% \bigskip -% If there is not enough space to put the tag at the end of a line, there is no -% automatic positioning of the label on the next line (as in the environments of -% \pkg{amsmath}). However, in |{DispWithArrows}|, the user can use the command -% |\tagnextline| to manually require the composition of the tag on the following -% line. -% \begin{Verbatim} -% \begin{DispWithArrows}[displaystyle] -% S_{2(p+1)} -% & =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\ -% & \smash[b]{=\sum_{k=1}^{2p}(-1)^kk² -% +(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2} ~emphase#\tagnextline@ \\ -% &= S_{2p}-(2p+1)^2+(2p+2)^2\\ -% &=p(2p+1)-(2p+1)^2+(2p+2)^2\\ -% &= 2p^2+5p+3 -% \end{DispWithArrows} -% \end{Verbatim} -% \begin{center} -% \color{gray}\vrule% -% \begin{minipage}{275pt}\color{black} -% \begin{DispWithArrows}[displaystyle] -% S_{2(p+1)} -% & =\sum_{k=1}^{2(p+1)} (-1)^k k^2 \\ -% & \smash[b]{=\sum_{k=1}^{2p}(-1)^kk^2+(-1)^{2p+1}(2p+1)^2+(-1)^{2p+2}(2p+2)^2} -% \tagnextline \\ -% &= S_{2p}-(2p+1)^2+(2p+2)^2\\ -% &= 2p^2+p-4p^2-4p-1+4p^2+8p+4\\ -% &= 2p^2+5p+3 -% \end{DispWithArrows} -% \end{minipage}% -% \color{gray}\vrule -% \end{center} -% -% -% -% \bigskip -% The environments |{DispWithArrows}| and |{DispWithArrows*}| provide an option -% |wrap-lines|. With this option, the lines of the label are automatically -% wrapped on the right.\footnote{It's possible to avoid the hyphenations of the -% words with the option ``|align = flush left|'' of Tikz.}\label{wrap-lines} -% -% \begin{Verbatim} -% \begin{DispWithArrows*}[displaystyle,~emphase#wrap-lines@] -% S_n -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{sum of terms of a geometric progression of ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n} -% {1-e^{i\frac{\pi}{2n}}}\right) -% \Arrow{This line has been wrapped automatically.} \\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows*} -% \end{Verbatim} -% \begin{DispWithArrows*}[displaystyle,wrap-lines] -% S_n -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{sum of terms of a geometric progression of ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( -% \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) -% \Arrow{This line has been wrapped automatically.} \\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows*} -% -% \bigskip -% The option |wrap-lines| doesn't apply to the environments |{WithArrows}| -% nested in an environment |{DispWithArrows}| or |{DispWithArrows*}|. However, -% it applies to the instructions |\Arrow| and |\MultiArrow| of the |code-after| -% of the environments |{DispWithArrows}| or |{DispWithArrows*}|. -% -% \vspace{1cm} -% We have said that the environments |{DispWithArrows}| and |{DispWithArrows*}| -% should be used in horizontal mode and not in vertical mode. However, there is -% an exception. These environments can be used directly after a |\item| of a -% LaTeX list. In this case, no vertical space is added before the -% environment.\footnote{It's possible to disable this feature with the option |standard-behaviour-with-items|.} -% -% \medskip -% Here is an example. The use of |{DispWithArrows}| gives the ability to tag an -% equation (and also to use |wrap-lines|). -% -% \begin{Verbatim} -% ~emphase#\begin{enumerate}@ -% ~emphase#\item @ -% \begin{DispWithArrows}% -% [displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt] -% S_n -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{we use the formula for a sum of terms of a geometric progression of -% ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n} -% {1-e^{i\frac{\pi}{2n}}}\right) -% \Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}2}=i$} \\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows} -% ~emphase#\end{enumerate}@ -% \end{Verbatim} -% \begin{enumerate} -% \item -% \begin{DispWithArrows}[displaystyle, wrap-lines, tagged-lines = last, fleqn, mathindent = 0 pt] -% S_n -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{we use the formula for a sum of terms of a geometric progression of -% ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( -% \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}} \right) -% \Arrow{$\bigl(e^{i\frac{\pi}{2n}}\bigr)^n = e^{i\frac{\pi}2}=i$} \\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows} -% \end{enumerate} -% -% \vspace{1cm} -% The environment |{DispWithArrows}| is similar to the environment |{align}| of -% \pkg{amsmath}. However, |{DispWithArrows}| is not constructed upon |{align}| -% (in fact, it's possible to use \pkg{witharrows} without \pkg{amsmath}). -% -% There are differences between |{DispWithArrows}| and |{align}|. -% \begin{itemize} -% \item The environment |{DispWithArrows}| cannot be inserted in an environment -% |{gather}| of \pkg{amsmath}. -% \item An environment |{DispWithArrows}| is always unbreakable (even with -% |\allowdisplaybreaks| of \pkg{amsmath}). -% \item The commands |\label|, |\tag|, |\notag| and |\nonumber| are allowed only -% in the last column. -% \item After an |\item| of a LaTeX list, no vertical space is added (this can -% be changed with the option |standard-behaviour-with-items|). -% \item -% \begin{bfseries} -% Last but not least, by default, the elements of a |\{DispWithArrows\}| -% are composed in |textstyle| and not in |displaystyle| (it's possible to change -% this point with the option |displaystyle|). -% \end{bfseries} -% \end{itemize} -% -% \bigskip -% Concerning the references, the package \pkg{witharrows} is compatible with the -% extensions \pkg{autonum}, \pkg{cleveref}, \pkg{fancyref}, \pkg{fncylab}, -% \pkg{hyperref}, \pkg{listlbls}, \pkg{prettyref}, \pkg{refcheck}, -% \pkg{refstyle}, \pkg{showlabels}, \pkg{smartref}, \pkg{typedref} and -% \pkg{varioref}, and with the options |showonlyrefs| and |showmanualtags| of -% \pkg{mathtools}.\footnote{We recall that \pkg{varioref}, \pkg{hyperref}, -% \pkg{cleveref} and \pkg{autonum} must be loaded in this order. The package -% \pkg{witharrows} can be loaded anywhere.} -% -% It is not compatible with \pkg{showkeys} (not all the labels are shown). -% -% -% -% -% \subsection{The option <...> of DispWithArrows} -% -% The environment |{DispWithArrows}| provides an option |left-brace|. When present, -% the value of this option is composed on the left, followed by a curly brace -% (hence the name) and the body of the environment.\footnote{The option -% |left-brace| can also be used without value: in this case, only the brace is drawn...} -% -% For lisibility, this option |left-brace| is also available with a special -% syntax: it's possible to give this option between angle brackets -% (\verb|<| and \verb|>|) just after \verb|{DispWithArrows}| (before the optional -% arguments between square brackets). -% -% \bigskip -% The following code is an example of multi-case equations.\footnote{The -% environment |{cases}| of \pkg{amsmath} is a way to compose such multi-cases -% equations. However, it's not possible to use the automatic numbering of -% equations with this environment. The environment |{numcases}| of the extension -% \pkg{cases} (written by Donald Arseneau) provides this possibility but, of -% course, it's not possible to draw arrows with this extension.} -% -% \medskip -% -% \begin{BVerbatim} -% \begin{DispWithArrows}~emphase#< \binom{n}{p} = >@[format = ll,fleqn,displaystyle] -% 0 & \quad \text{if } p > n -% \Arrow{if fact, it's a special case\\ of the following one} \\ -% \frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{if } 0 \leq p \leq n \\ -% 0 & \quad \text{if } p < 0 -% \end{DispWithArrows} -% \end{BVerbatim} -% % -% \begin{DispWithArrows}< \binom{n}{p} = >[format = ll,fleqn,displaystyle] -% 0 & \quad \text{if } p > n -% \Arrow{if fact, it's a special case\\ of the following one} \\ -% \frac{n(n-1)\cdots(n-p+1)}{p!} & \quad \text{if } 0 \leq p \leq n \\ -% 0 & \quad \text{if } p < 0 -% \end{DispWithArrows} -% -% \interitem -% It's possible to use the environment |{subequations}| of \pkg{amsmath}. -% -% \begin{Verbatim} -% \begin{subequations} -% \label{system} -% \begin{DispWithArrows}< (\ref*{system}) \Leftrightarrow >[format = l] -% x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\ -% xy+xz+yz=-2 \\ -% xyz = -15 \label{last-equation} -% \end{DispWithArrows} -% \end{subequations} -% \end{Verbatim} -% % -% \begin{subequations} -% \label{system} -% \begin{DispWithArrows}< (\ref*{system}) \Leftrightarrow >[format = l] -% x+y+z = -3 \Arrow[tikz=-,jump=2]{3 equations} \\ -% xy+xz+yz=-2 \\ -% xyz = -15 \label{last-equation} -% \end{DispWithArrows} -% \end{subequations} -% -% \bigskip -% The whole system is the equation \eqref{system} (this reference has been coded -% by |\eqref{system}|) whereas the last equation is the equation -% \eqref{last-equation} (this reference has been coded by -% |\eqref{last-equation}|). The command |\ref*| used in the code above is -% provided by \pkg{hyperref}. It's a variant of |\ref| which doesn't create -% interactive link. -% -% \bigskip -% With the option \verb|replace-curly-brace-by|, it's possible to replace the -% left curly brace can be replaced by another extensible delimiter. -% -% \bigskip -% \section{Advanced features} -% -% \subsection{The option tikz-code : how to change the shape of the arrows} -% -% \label{tikz-code} -% -% The option |tikz-code|\footnote{For historical reasons, the option |tikz-code| -% has an alias: |TikzCode|.} allows the user to change the shape of the -% arrows.\footnote{If the option |wrap-lines| is used in an environment -% |{DispWithArrows}| or |{DispWithArrows*}|, the option |tikz-code| will have no -% effect for the arrows of this environment but only for the arrows in the -% nested environments |{WithArrows}|.} -% -% \smallskip -% For example, the options ``|up|'' and ``|down|'' described previously (cf. -% p.~\pageref{up-and-down}) are programmed internally with |tikz-code|. -% -% \smallskip -% The value of this option must be a valid Tikz drawing instruction (with the -% final semicolon) with three markers |#1|, |#2| and |#3| for the start point, -% the end point and the label of the arrow. -% -% \bigskip -% By default, the value is the following: -% -% \smallskip -% \qquad \verb|\draw (#1) to node {#3} (#2) ;| -% -% -% \bigskip -% In the following example, we replace this default path by a path with three -% segments (and the node overwriting the second segment). -% \begin{Verbatim} -% \begin{WithArrows}[format=c,ygap=5pt,interline=4mm, -% ~emphase#tikz-code = {\draw[rounded corners]@ -% ~emphase# (~#1) -- ([xshift=5mm]~#1)@ -% ~emphase# -- node[circle,@ -% ~emphase# draw,@ -% ~emphase# auto = false,@ -% ~emphase# fill = gray!50,@ -% ~emphase# inner sep = 1pt] {\tiny ~#3}@ -% ~emphase# ([xshift=5mm]~#2)@ -% ~emphase# -- (~#2) ; }@] -% 3 (2x+4) = 6 \Arrow{$\div 3$} \\ -% 2x+4 = 2 \Arrow{$-4$} \\ -% 2x = -2 \Arrow{$\div 2$} \\ -% x = -1 -% \end{WithArrows} -% \end{Verbatim} -% -% -% \[\begin{WithArrows}[format=c, -% ygap=5pt, -% interline=4mm, -% tikz-code = {\draw[rounded corners] -% (#1) -% -- -% ([xshift=5mm]#1) -% -- node[circle, -% draw, -% auto=false, -% fill=gray!50, -% inner sep = 1pt] {\tiny #3} -% ([xshift=5mm]#2) -% -- -% (#2) ; }] -% 3 (2x+4) = 6 \Arrow{$\div 3$} \\ -% 2x+4 = 2 \Arrow{$-4$} \\ -% 2x = -2 \Arrow{$\div 2$} \\ -% x = -1 -% \end{WithArrows}\] -% -% \bigskip -% The environments |{DispWithArrows}| and its starred version -% |{DispWithArrows*}| provide a command |\WithArrowsRightX| which can be used in -% a definition of |tikz-code|. This command gives the $x$-value of the right side -% of the composition box (taking into account the eventual tags of the -% equations). For an example of use, see p.~\pageref{example-WithArrowsRightX}. -% -% -% \bigskip -% \subsection{The command \textbackslash WithArrowsNewStyle} -% -% The extension \pkg{witharrows} provides a command |\WithArrowsNewStyle| to -% define styles in a way similar to the ``styles'' of Tikz. -% -% The command |\WithArrowsNewStyle| takes two mandatory arguments. The first is -% the name of the style and the second is a list of key-value pairs. The scope -% of the definition done by |\WithArrowsNewStyle| is the current TeX scope. -% -% The style can be used as a key at the document level (with -% |\WithArrowsOptions|) or at the environment level (in the optional arguments -% of |{WithArrows}| and |{DispWithArrows}|). The style can also be used in -% another command |\WithArrowsNewStyle|. -% -% For an example of use, see p.~\pageref{example-WithArrowsRightX}. -% -% -% \bigskip -% \subsection{Vertical positioning of the arrows} -% -% There are four parameters for fine tuning of the vertical positioning of the -% arrows : |ygap|, |ystart|, |start-adjust| and |end-adjust|. -% -% \medskip -% We first explain the behaviour when the parameters |start-adjust| and -% |end-adjust| are equal to zero: -% \begin{itemize} -% \item the option |ystart| sets the vertical distance between the base line of -% the text and the start of the arrow (default value: 0.4 ex); -% \item the option |ygap| sets the vertical distance between two consecutive -% arrows (default value: 0.4~ex). -% \end{itemize} -% -% -% \bigskip -% $\begin{WithArrows}[interline=1mm, adjust = 0pt] -% (\cos x + \sin x)^2 & = \cos^2 x +2 \cos x \sin x + \sin^2 x\Arrow{}\tikz[remember picture] \coordinate (A) ; \\ -% & = \cos^2x + \sin^2x + 2\sin x\cos x \Arrow{} \\ -% & = 1 + \sin(2x) -% \end{WithArrows}$ -% -% \begin{tikzpicture}[remember picture,overlay,blue] -% \draw (wa-\WithArrowsLastEnv-1-r.south) to ++(1,0) coordinate (B) to ++(0.1,0) ;; -% \draw (A) to ++(1,0) coordinate (C) to ++(0.1,0) ;; -% \draw (B) -- (C) ; -% \draw[<-] (B) to ++(0,0.2) ; -% \draw[<-] (C) to ++(0,-0.2) ; -% \path (C) node[right=1mm] {|ystart|} ; -% \draw (wa-\WithArrowsLastEnv-2-r.north) to ++(3,0) coordinate (E) to ++(0.1,0); -% \draw (wa-\WithArrowsLastEnv-2-r.south) to ++(3,0) coordinate (F) to ++(0.1,0); -% \draw (E) -- (F) ; -% \draw[<-] (E) to ++(0,0.2) ; -% \draw[<-] (F) to ++(0,-0.2) ; -% \path (F) node[right=1mm] {|ygap|} ; -% \end{tikzpicture} -% -% \interitem -% However, for aesthetic reasons, when it's possible, \pkg{witharrows} starts -% the arrow a bit higher (by an amount |start-adjust|) and ends the arrow a bit -% lower (by an amount |end-adjust|). By default, both parameters |start-adjust| -% and |end-adjust| are equal to $0.4$~ex. -% -% \bigskip -% Here is for example the behaviour without the mechanism of |start-adjust| and -% |end-adjust| (this was the standard behaviour for versions prior to 1.13). -% % \begin{Verbatim} -% $\begin{WithArrows}~emphase#[start-adjust=0pt, end-adjust=0pt]@ -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% \end{Verbatim} -% -% $\begin{WithArrows}[start-adjust=0pt, end-adjust=0pt] -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% -% -% \bigskip -% Here is the standard behaviour since version 1.13 (the parameters -% |start-adjust| and |end-ajust| are used with the default value $0.4$~ex). The -% arrow is longer and the result is more aesthetic. -% -% \medskip -% $\begin{WithArrows} -% A & = (a+1)^2 \Arrow{we expand} \\ -% & = a^2 + 2a + 1 -% \end{WithArrows}$ -% -% -% \bigskip -% It's also possible to use the option |adjust| which sets both |start-adjust| -% and |end-ajust|. -% -% \bigskip -% Since the mechanism of |start-adjust| and |end-ajust| has been added in -% version 1.13 of \pkg{witharrows}, that version is not stricty compatible with -% older versions. However, it's possible to restore the previous behaviour -% simply by setting |start-adjust| and |end-adjust| to $0$~pt: -% \begin{Verbatim} -% \WithArrowsOptions{adjust = 0pt} -% \end{Verbatim} -% -% \bigskip -% \subsection{Footnotes in the environments of witharrows} -% -% If you want to put footnotes in an environment |{WithArrows}| or -% |{DispWithArrows}|, you can use a pair |\footnotemark|--|\footnotetext|. -% -% \smallskip -% It's also possible to extract the footnotes with the help of the package -% \pkg{footnote} or the package \pkg{footnotehyper}. -% -% \smallskip -% If \pkg{witharrows} is loaded with the option |footnote| (with -% |\usepackage[footnote]{witharrows}| or with |\PassOptionsToPackage|), the -% package \pkg{footnote} is loaded (if it is not yet loaded) and it is used to -% extract the footnotes. -% -% \smallskip -% If \pkg{witharrows} is loaded with the option |footnotehyper|, the package -% \pkg{footnotehyper} is loaded (if it is not yet loaded) ant it is used to -% extract footnotes. -% -% \smallskip -% Caution: The packages \pkg{footnote} and \pkg{footnotehyper} are incompatible. -% The package \pkg{footnotehyper} is the successor of the package \pkg{footnote} -% and should be used preferently. The package \pkg{footnote} has some drawbacks, -% in particular: it must be loaded after the package \pkg{xcolor} and it is not -% perfectly compatible with \pkg{hyperref}. -% -% \medskip -% In this document, the package \pkg{witharrows} has been loaded with the option -% |footnotehyper| and we give an example with a footnote in the label of an -% arrow: -% -% \smallskip -% $\begin{WithArrows} -% A & = (a+b)^2 -% \Arrow{We expand\,\footnote{A footnote.}} \\ -% & = a^2+b^2+2ab -% \end{WithArrows}$ -% -% \bigskip -% \subsection{Option no-arrows} -% -% The option |no-arrows| is a convenience given to the user. With this option -% the arrows are not drawn. However, an analyse of the arrows is done and some -% errors can be raised, for example if an arrow would arrive after the last row -% of the environment. -% -% -% \bigskip -% \subsection{Note for developpers} -% -% If you want to construct an environment upon an environment of -% \pkg{witharrows}, we recommand to call the environment with the construction -% |\WithArrows|-|\endWithArrows| or |\DispWithArrows|-|\endDispWithArrows| (and -% not |\begin{WithArrows}|-|\end{WithArrows}|, etc.). -% -% \smallskip -% By doing so, the error messages generated by \pkg{witharrows} will (usually) -% mention the name of your environment and they will be easier to understand by -% the final user. -% -% \smallskip -% By example, you can define an environment |{DWA}| which is an alias of -% |{DispWithArrows}|: -% \begin{BVerbatim} -% \NewDocumentEnvironment {DWA} {} {\DispWithArrows}{\endDispWithArrows} -% \end{BVerbatim} -% -% \smallskip -% If you use this environment |{DWA}| in math mode, you will have the following -% error message: -% -% \begin{BVerbatim} -% The environment {DWA} should be used only outside math mode. -% \end{BVerbatim} -% -% \interitem -% Another example is the definition of the environment |{DispWithArrows*}| -% internally in the package \pkg{witharrows} by the following code: -% \begin{Verbatim} -% \NewDocumentEnvironment {DispWithArrows*} {} -% {\WithArrowsOptions{notag}% -% \DispWithArrows} -% {\endDispWithArrows} -% \end{Verbatim} -% -% -% -% \section{Examples} -% -% \subsection{\textbackslash MoveEqLeft} -% -% It's possible to use |\MoveEqLeft| of \pkg{mathtools}. Don't forget that -% |\MoveEqLeft| has also the value of an ampersand (|&|). That's important for the -% placement of an eventual command |\Arrow|. -% -% -% -% \begin{Verbatim}[formatcom=\small\color{gray}] -% $\begin{WithArrows}[interline=0.5ex] -% ~emphase#\MoveEqLeft@ \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} -% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\ -% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\ -% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 -% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\ -% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2} -% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} -% \end{WithArrows}$ -% \end{Verbatim} -% -% -% \medskip -% $\begin{WithArrows}[interline=0.5ex] -% \MoveEqLeft \arccos(x) = \arcsin \frac45 + \arcsin \frac5{13} -% \Arrow{because both are in $[-\frac{\pi}2,\frac{\pi}2]$} \\ -% & \Leftrightarrow x = \sin\left(\arcsin\frac45 + \arcsin\frac5{13}\right) \\ -% & \Leftrightarrow x = \frac45\cos\arcsin\frac5{13} + \frac5{13} \cos\arcsin\frac45 -% \Arrow{$\forall x \in [-1,1], \cos(\arcsin x) = \sqrt{1-x^2}$} \\ -% & \Leftrightarrow x = \frac45\sqrt{1-\bigl(\frac5{13}\bigr)^2} -% + \frac5{13}\sqrt{1-\bigl(\frac45\bigr)^2} -% \end{WithArrows}$ -% -% -% \bigskip -% \subsection{Modifying the shape of the nodes} -% -% It's possible to change the shape of the labels, which are Tikz nodes, by -% modifying the key ``|every node|'' of Tikz. -% -% \begin{Verbatim} -% \begin{WithArrows}% -% [format = c, -% interline = 4mm, -% tikz = {~emphase#every node/.style = {circle,@ -% ~emphase# draw,@ -% ~emphase# auto = false,@ -% ~emphase# fill = gray!50,@ -% ~emphase# inner sep = 1pt,@ -% ~emphase# font = \tiny}@}] -% 3 (2x+4) = 6 \Arrow{$\div 3$} \\ -% 2x+4 = 2 \Arrow{$-4$} \\ -% 2x = -2 \Arrow{$\div 2$} \\ -% 2x = -1 -% \end{WithArrows} -% \end{Verbatim} -% -% \[\begin{WithArrows}[% -% format = c, -% interline = 4mm, -% tikz = {every node/.style = {circle, -% draw, -% auto = false, -% fill = gray!50, -% inner sep = 1pt, -% font = \tiny}}] -% 3 (2x+4) = 6 \Arrow{$\div 3$} \\ -% 2x+4 = 2 \Arrow{$-4$} \\ -% 2x = -2 \Arrow{$\div 2$} \\ -% 2x = -1 -% \end{WithArrows}\] -% -% -% \bigskip -% \subsection{Examples with the option tikz-code} -% -% We recall that the option |tikz-code| is the Tikz code used by \pkg{witharrows} -% to draw the arrows.\footnote{If an environment |{DispWithArrows}| or -% |{DispWithArrows*}| is used with the option |wrap-lines|, the value of the -% option |tikz-code| is not used for this environment (but is used for the -% environments nested inside).} -% -% \smallskip -% The value by defaut of |tikz-code| is \verb|\draw (#1) to node {#3} (#2) ;| -% where the three markers |#1|, |#2| and |#3| represent the start row, the end -% row and the label of the arrow. -% -% -% \bigskip -% \subsubsection{Example 1} -% In the following example, we define the value of |tikz-code| with two -% instructions |\path| : the first instruction draws the arrow itself and the -% second puts the label in a Tikz node in the rectangle delimited by the arrow. -% -% \begin{Verbatim} -% \begin{DispWithArrows*}% -% [displaystyle, -% ygap = 2mm, -% ystart = 0mm, -% ~emphase#tikz-code = {\draw (~#1) -- ++(4.5cm,0) |- (~#2) ;@ -% ~emphase# \path (~#1) -- (~#2) @ -% ~emphase# node[text width = 4.2cm, right, midway] {~#3} ;}@] -% S_n -% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -% ........... -% \end{Verbatim} -% -% -% \bigskip -% \begin{DispWithArrows*}[ -% displaystyle, -% ygap = 2mm, -% ystart = 0mm, -% tikz-code = {\draw (#1) -- ++(4.5cm,0) |- (#2) ; -% \path (#1) -- (#2) -% node[text width = 4.2cm, right, midway] {#3} ;}] -% S_n -% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -% \Arrow{$\cos x = \Re(e^{ix})$}\\ -% & = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right) -% \Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -% & = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right) -% \Arrow{$\exp$ is a morphism for $\times$ et $+$} \\ -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{sum of terms of a geometric progression of ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows*} -% -% \bigskip -% \subsubsection{Example 2} -% -% \label{example-WithArrowsRightX} -% It's possible to modify the previous example to have the ``|text width|'' -% automatically computed with the right margin (in a way similar as the -% |wrap-lines| option) in the environments |{DispWithArrows}| and -% |{DispWithArrows*}|. In the definition of |tikz-code|, we use the command -% |\WithArrowsRightX| which is the $x$-value of the right margin of the current -% composition box (it's a TeX command and not a dimension). For lisibility, we -% use a style. This example requires the Tikz library \pkg{calc}. -% -% \begin{Verbatim} -% \WithArrowsNewStyle{MyStyle} -% {displaystyle, -% ygap = 2mm, -% xoffset = 0pt, -% ystart = 0mm, -% tikz-code = {\path let \p1 = (~#~#1) -% in (~#~#1) -% -- node [anchor = west, -% text width = {~emphase#\WithArrowsRightX@ - \x1 - 0.5 em}] -% {~#~#3} -% (~#~#2) ; -% \draw let \p1 = (~#~#1) -% in (~#~#1) -- ++(~emphase#\WithArrowsRightX@ - \x1,0) |- (~#~#2) ; }} -% \end{Verbatim} -% -% \begin{Verbatim} -%\begin{DispWithArrows}[MyStyle] -% S_n -% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -% \Arrow{$\cos x = \Re(e^{ix})$}\\ -% ........... -% \end{Verbatim} -% -% \WithArrowsNewStyle{MyStyle} -% {displaystyle, -% ygap = 2mm, -% xoffset = 0pt, -% ystart = 0mm, -% tikz-code = {\path let \p1 = (##1) -% in (##1) -% -- node [anchor = west, -% text width = {\WithArrowsRightX - \x1 - 0.5 em}] {##3} -% (##2) ; -% \draw let \p1 = (##1) -% in (##1) -- ++(\WithArrowsRightX - \x1,0) |- (##2) ; }} -% -%\begin{DispWithArrows}[MyStyle] -% S_n -% & = \frac1n \sum_{k=0}^{n-1}\cos\bigl(\tfrac{\pi}2\cdot\tfrac kn\bigr) -% \Arrow{$\cos x = \Re(e^{ix})$}\\ -% & = \frac1n\sum_{k=0}^{n-1} \Re\left(e^{i\frac{k\pi}{2n}}\right) -% \Arrow{$\Re(z+z')=\Re(z)+\Re(z')$}\\ -% & = \frac1n \Re\left(\sum_{k=0}^{n-1} e^{i\frac{k\pi}{2n}}\right) -% \Arrow{$\exp$ is a morphism for $\times$ et $+$} \\ -% & = \frac1n \Re \left(\sum_{k=0}^{n-1}\bigl(e^{i\frac{\pi}{2n}}\bigr)^k\right) -% \Arrow{sum of terms of a geometric progression of ratio $e^{i\frac{2\pi}n}$}\\ -% & = \frac1n \Re \left( \frac{1-\bigl(e^{i\frac{\pi}{2n}}\bigr)^n}{1-e^{i\frac{\pi}{2n}}}\right)\\ -% & = \frac1n \Re \left(\frac{1-i}{1-e^{i\frac{\pi}{2n}}}\right) -% \end{DispWithArrows} -% -% -% -% \bigskip -% \subsubsection{Example 3} -% -% In the following example, we change the shape of the arrow depending on whether -% the start row is longer than the end row or not. This example requires the -% Tikz library \pkg{calc}. -% -% \begin{Verbatim} -% \begin{WithArrows}[ll,interline=5mm,xoffset=5mm, -% ~emphase#tikz-code = {\draw[rounded corners,@ -% ~emphase# every node/.style = {circle,@ -% ~emphase# draw,@ -% ~emphase# auto = false,@ -% ~emphase# inner sep = 1pt,@ -% ~emphase# fill = gray!50,@ -% ~emphase# font = \tiny }]@ -% ~emphase# let \p1 = (~#1),@ -% ~emphase# \p2 = (~#2)@ -% ~emphase# in \ifdim \x1 > \x2@ -% ~emphase# (\p1) -- node {~#3} (\x1,\y2) -- (\p2)@ -% ~emphase# \else@ -% ~emphase# (\p1) -- (\x2,\y1) -- node {~#3} (\p2)@ -% ~emphase# \fi ;}@] -% E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7 -% \Arrow{$\times 15$}\\ -% & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\ -% & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\ -% & \Longleftrightarrow 20x+29 = 105 -% \Arrow{$-29$}\\ -% & \Longleftrightarrow 20x = 76 -% \Arrow{$\div 20$}\\ -% & \Longleftrightarrow x = \frac{38}{10} -% \end{WithArrows} -% \end{Verbatim} -% -% -% \[\begin{WithArrows}[ll,interline=5mm,xoffset=5mm, -% tikz-code = {\draw[rounded corners, -% every node/.style = {circle, -% draw, -% auto = false, -% inner sep = 1pt, -% fill = gray!50, -% font = \tiny}] -% let \p1 = (#1), -% \p2 = (#2) -% in \ifdim \x1 > \x2 -% (\p1) -- node {#3} (\x1,\y2) -- (\p2) -% \else -% (\p1) -- (\x2,\y1) -- node {#3} (\p2) -% \fi ;}] -% E & \Longleftrightarrow \frac{(x+4)}3 + \frac{5x+3}5 = 7 -% \Arrow{$\times 15$}\\ -% & \Longleftrightarrow 5(x+4) + 3(5x+3) = 105 \\ -% & \Longleftrightarrow 5x+20 + 15x+9 = 105 \\ -% & \Longleftrightarrow 20x+29 = 105 -% \Arrow{$-29$}\\ -% & \Longleftrightarrow 20x = 76 -% \Arrow{$\div 20$}\\ -% & \Longleftrightarrow x = \frac{38}{10} -% \end{WithArrows}\] -% -% -% -% \subsection{Automatic numbered loop} -% -% Assume we want to draw a loop of numbered arrows. In this purpose, it's -% possible to write a dedicated command |\NumberedLoop| which will do the job -% when used in |code-after|. In the following example, we write this command with -% |\NewDocumentCommand| of \pkg{xparse} and |\foreach| of \pkg{pgffor} (both -% packages are loaded when \pkg{witharrows} is loaded). -% -% \begin{Verbatim} -% \NewDocumentCommand \NumberedLoop {} -% {\foreach \j in {2,...,\WithArrowsNbLines} -% { \pgfmathtruncatemacro{\i}{\j-1} -% \Arrow[rr]{\i}{\j}{\i} } -% \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}} -% \end{Verbatim} -% -% The command |\WithArrowsNbLines| is a command available in |code-after| which -% gives the total number of lines (=rows) of the current environment (it's a -% command and not a counter). -% -% -% \bigskip -% \begin{Verbatim} -% $\begin{WithArrows}[~emphase#code-after = \NumberedLoop@] -% a.\;& f \text{ est continuous on } E \\ -% b.\;& f \text{ est continuous in } 0 \\ -% c.\;& f \text{ is bounded on the unit sphere} \\ -% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -% e.\;& f \text{ is lipschitzian} -% \end{WithArrows}$ -% \end{Verbatim} -% -% \bigskip -% \begin{scope} -% \NewDocumentCommand \NumberedLoop {} -% {\foreach \j in {2,...,\WithArrowsNbLines} -% { \pgfmathtruncatemacro{\i}{\j-1} -% \Arrow[rr]{\i}{\j}{\i} } -% \Arrow[rr,xoffset=1cm,tikz=<-]{1}{\WithArrowsNbLines}{\WithArrowsNbLines}} -% -% -% $\begin{WithArrows}[code-after = \NumberedLoop] -% a.\;& f \text{ est continuous on } E \\ -% b.\;& f \text{ est continuous in } 0 \\ -% c.\;& f \text{ is bounded on the unit sphere} \\ -% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -% e.\;& f \text{ is lipschitzian} -% \end{WithArrows}$ -% -% -% \bigskip -% As usual, it's possible to change the characteristic of both arrows and nodes -% with the option |tikz|. However, if we want to change the style to have, for -% example, numbers in parenthesis, the best way is to change the value of -% |tikz-code|: -% -% \begin{Verbatim} -% tikz-code = {\draw (~#1) to node {\footnotesize (~#3)} (~#2) ;} -% \end{Verbatim} -% -% \WithArrowsOptions{tikz-code = {\draw (#1) to node {\footnotesize (#3)} (#2) ;}} -% -% $\begin{WithArrows}[code-after = \NumberedLoop] -% a.\;& f \text{ est continuous on } E \\ -% b.\;& f \text{ est continuous in } 0 \\ -% c.\;& f \text{ is bounded on the unit sphere} \\ -% d.\;& \exists K > 0\quad \forall x \in E\quad \|f(x)\| \le K \|x\| \\ -% e.\;& f \text{ is lipschitzian} -% \end{WithArrows}$ -% -% \end{scope} -% -% \vspace{2cm} -% -% \section{Implementation} -% -% \subsection{Declaration of the package and extensions loaded} -% -% -% First, \pkg{tikz} and some Tikz libraries are loaded before the -% |\ProvidesExplPackage|. They are loaded this way because |\usetikzlibrary| in -% |expl3| code fails.\footnote{cf. -% |tex.stackexchange.com/questions/57424/using-of-usetikzlibrary-in-an-expl3-package-fails|} -% -% \begin{macrocode} -\RequirePackage{tikz} -\usetikzlibrary{arrows.meta,bending} -\RequirePackage{expl3}[2019/02/15] -% \end{macrocode} -% -% \bigskip -% Then, we can give the traditional declaration of a package written with -% |expl3|: -% \begin{macrocode} -\RequirePackage{l3keys2e} -\ProvidesExplPackage - {witharrows} - {\myfiledate} - {\myfileversion} - {Draws arrows for explanations on the right} -% \end{macrocode} -% -% \bigskip -% The package \pkg{xparse} will be used to define the environments -% |{WithArrows}|, |{DispWithArrows}|, |{DispWithArrows*}| and the commands -% |\Arrow|, |\WithArrowsOptions| and |\WithArrowsNewStyle|. -% \begin{macrocode} -\RequirePackage { xparse } [ 2018-10-17 ] -% \end{macrocode} -% -% \bigskip -% \subsection{The packages footnote and footnotehyper} -% -% A few options can be given to the package \pkg{witharrows} when it is loaded -% (with |\usepackage|, |\RequirePackage| or |\PassOptionsToPackage|). Currently -% (version \myfileversion), there are two such options: |footnote| and -% |footnotehyper|. With the option |footnote|, \pkg{witharrows} loads -% \pkg{footnote} and uses it to extract the footnotes from the environments -% |{WithArrows}|. Idem for the option |footnotehyper|. -% -% \medskip -% The boolean |\g_@@_footnotehyper_bool| will indicate if the option -% |footnotehyper| is used. -% \begin{macrocode} -\bool_new:N \g_@@_footnotehyper_bool -% \end{macrocode} -% -% \medskip -% The boolean |\g_@@_footnote_bool| will indicate if the option |footnote| is -% used, but quicky, it will also be set to |true| if the option |footnotehyper| -% is used. -% \begin{macrocode} -\bool_new:N \g_@@_footnote_bool -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\cs_new_protected:Npn \@@_msg_new:nn { \msg_new:nnn { witharrows } } -\cs_new_protected:Npn \@@_msg_new:nnn { \msg_new:nnnn { witharrows } } -\cs_new_protected:Npn \@@_msg_redirect_name:nn - { \msg_redirect_name:nnn { witharrows } } -\cs_new_protected:Npn \@@_error:n { \msg_error:nn { witharrows } } -\cs_new_protected:Npn \@@_warning:n { \msg_error:nn { witharrows } } -\cs_new_protected:Npn \@@_fatal:n { \msg_fatal:nn { witharrows } } -\cs_new_protected:Npn \@@_error:nn { \msg_error:nnn { witharrows } } -\cs_generate_variant:Nn \@@_error:nn { n x } -% \end{macrocode} -% -% \medskip -% We define a set of keys |WithArrows/package| for these options. -% \begin{macrocode} -\keys_define:nn { WithArrows / package } - { - footnote .bool_gset:N = \g_@@_footnote_bool , - footnotehyper .bool_gset:N = \g_@@_footnotehyper_bool , - unknown .code:n = - \@@_fatal:n { Option~unknown~for~package } - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Option~unknown~for~package } - { - You~can't~use~the~option~'\l_keys_key_tl'~when~loading~the~ - package~witharrows.~Try~to~use~the~command~ - \token_to_str:N\WithArrowsOptions. - } -% \end{macrocode} -% -% -% \bigskip -% We process the options when the package is loaded (with |\usepackage|). -% \begin{macrocode} -\ProcessKeysOptions { WithArrows / package } -% \end{macrocode} -% -% -% \medskip -% \begin{macrocode} -\@@_msg_new:nn { Option~incompatible~with~Beamer } - { - The~option~'\l_keys_key_tl'\ is~incompatible~ - with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { footnote~with~footnotehyper~package } - { - You~can't~use~the~option~'footnote'~because~the~package~ - footnotehyper~has~already~been~loaded.~ - If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~ - within~the~environments~of~witharrows~will~be~extracted~with~the~tools~ - of~the~package~footnotehyper.\\ - If~you~go~on,~the~package~footnote~won't~be~loaded. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { footnotehyper~with~footnote~package } - { - You~can't~use~the~option~'footnotehyper'~because~the~package~ - footnote~has~already~been~loaded.~ - If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~ - within~the~environments~of~witharrows~will~be~extracted~with~the~tools~ - of~the~package~footnote.\\ - If~you~go~on,~the~package~footnotehyper~won't~be~loaded. - } -% \end{macrocode} -% -% \medskip -% \begin{macrocode} -\bool_if:NT \g_@@_footnote_bool - { - \@ifclassloaded { beamer } - { \msg_info:nn { witharrows } { Option~incompatible~with~Beamer } } - { - \@ifpackageloaded { footnotehyper } - { \@@_error:n { footnote~with~footnotehyper~package } } - { \usepackage { footnote } } - } - } -% \end{macrocode} -% -% \begin{macrocode} -\bool_if:NT \g_@@_footnotehyper_bool - { - \@ifclassloaded { beamer } - { \@@_info:n { Option~incompatible~with~Beamer } } - { - \@ifpackageloaded { footnote } - { \@@_error:n { footnotehyper~with~footnote~package } } - { \usepackage { footnotehyper } } - } - \bool_gset_true:N \g_@@_footnote_bool - } -% \end{macrocode} -% The flag |\g_@@_footnote_bool| is raised and so, we will only have to test -% |\g_@@_footnote_bool| in order to know if we have to insert an environnement -% |{savenotes}| (the |\begin{savenotes}| is in |\@@_pre_halign:n| and -% |\end{savenotes}| at the end of the environments |{WithArrows}| and -% |{DispWithArrows}|). -% -% \bigskip -% \subsection{The class option leqno} -% -% The boolean |\c_@@_leqno_bool| will indicate if the class option |leqno| is -% used. When this option is used in LaTeX, the command |\@eqnnum| is redefined -% (as one can see in the file |leqno.clo|). That's enough to put the labels on -% the left in our environments |{DispWithArrows}| and |{DispWithArrows*}|. -% However, that's not enough when our option |wrap-lines| is used. That's why we -% have to know if this option is used as a class option. With the following -% programmation, |leqno| \emph{can't} be given as an option of \pkg{witharrows} -% (by design). -% \begin{macrocode} -\bool_new:N \c_@@_leqno_bool -\DeclareOption { leqno } { \bool_set_true:N \c_@@_leqno_bool } -\DeclareOption* { } -\ProcessOptions* -% \end{macrocode} -% -% -% -% \bigskip -% \subsection{Some technical definitions} -% -% -% \begin{macrocode} -\cs_generate_variant:Nn \tl_put_right:Nn { N v } -\cs_generate_variant:Nn \seq_set_split:Nnn { N x x } -% \end{macrocode} -% -% \medskip -% We create booleans in order to know if some packages are loaded. For example, -% for the package \pkg{amsmath}, the boolean is called -% |\c_@@_amsmath_loaded_bool|.\footnote{It's not possible to use -% |\@ifpackageloaded| in the core of the functions because |\@ifpackageloaded| -% is available only in the preamble.} -% \begin{macrocode} -\AtBeginDocument - { - \clist_map_inline:nn - { - amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels, - typedref, unicode-math, varwidth - } - { - \bool_new:c { c_@@_#1_loaded_bool } - \@ifpackageloaded { #1 } - { \bool_set_true:c { c_@@_#1_loaded_bool } } - { } - } - } -% \end{macrocode} -% -% \bigskip -% We define a command |\@@_strcmp:nn| to compare two token lists. It will be -% available whether the engine is pdfTeX, XeTeX or LuaTeX. -% \begin{macrocode} -\sys_if_engine_luatex:TF - { - \cs_new_protected:Npn \@@_strcmp:nn #1 #2 - { \lua_now:e { l3kernel.strcmp('#1','#2') } } - } - { - \cs_new_protected:Npn \@@_strcmp:nn #1 #2 - { \pdftex_strcmp:D { #1 } { #2 } } - } -% \end{macrocode} -% -% \bigskip -% We can now define a command |\@@_sort_seq:N| which will sort a sequence. -% \begin{macrocode} -\cs_new_protected:Npn \@@_sort_seq:N #1 - { - \seq_sort:Nn #1 - { - \int_compare:nNnTF - { - \@@_strcmp:nn - { \str_lower_case:n { ##1 } } - { \str_lower_case:n { ##2 } } - } - > 0 - \sort_return_swapped: - \sort_return_same: - } - } -% \end{macrocode} -% -% \bigskip -% The following command converts each item of a sequence from |tl| to |str|. It -% will be used when creating list of keys (a key name is always a |str|). -% \begin{macrocode} -\cs_new_protected:Npn \@@_convert_to_str_seq:N #1 - { - \seq_clear:N \l_tmpa_seq - \seq_map_inline:Nn #1 - { - \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } } - } - \seq_set_eq:NN #1 \l_tmpa_seq - } -\cs_new_protected:Npn \@@_set_seq_of_str_from_clist:Nn #1 #2 - { - \seq_set_from_clist:Nn #1 { #2 } - \@@_convert_to_str_seq:N #1 - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_save:N| saves a \pkg{expl3} variable by creating a global -% version of the variable. For a variable named |\l_|\texttt{\slshape -% name}|_|\texttt{\slshape type}, the corresponding global variable will be -% named |\g_|\texttt{\slshape name}|_|\texttt{\slshape type}. The type of the -% variable is determinated by the suffix \texttt{\slshape type} and is used to -% apply the corresponding \pkg{expl3} commands. -% \begin{macrocode} -\cs_new_protected:Npn \@@_save:N #1 - { - \seq_set_split:Nxx \l_tmpa_seq - { \char_generate:nn { `_ } { 12 } } - { \cs_to_str:N #1 } - \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl -% \end{macrocode} -% The string |\l_tmpa_str| will contains the \emph{type} of the variable. -% \begin{macrocode} - \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } - \use:c { \l_tmpa_str _if_exist:cF } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } - { - \use:c { \l_tmpa_str _new:c } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } - } - \use:c { \l_tmpa_str _gset_eq:cN } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1 - } -% \end{macrocode} -% -% \medskip -% The command |\@@_restore:N| affects to the \pkg{expl3} variable the value of -% the (previously) set value of the corresponding \emph{global} variable. -% \begin{macrocode} -\cs_new_protected:Npn \@@_restore:N #1 - { - \seq_set_split:Nxx \l_tmpa_seq - { \char_generate:nn { `_ } { 12 } } - { \cs_to_str:N #1 } - \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl - \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } - \use:c { \l_tmpa_str _set_eq:Nc } - #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ } - } -% \end{macrocode} -% -% -% \bigskip -% We define a Tikz style |@@_node_style| for the |l|-nodes and |r|-nodes that -% will be created in the |\halign|. These nodes are Tikz nodes of shape -% ``rectangle'' but with zero width. An arrow between two nodes starts from the -% \emph{south} anchor of the first node and arrives at the \emph{north} anchor -% of the second node. -% \begin{macrocode} -\tikzset - { - @@_node_style / .style = - { - above = \l_@@_ystart_dim , - inner~sep = \c_zero_dim , - minimum~width = \c_zero_dim , - minimum~height = \l_@@_ygap_dim - } - } -% \end{macrocode} -% If the user uses the option |show-nodes| (it's a \pkg{l3keys} option), the -% Tikz options |draw| and |red| will be appended to this style. This feature may -% be useful for debugging.\footnote{The |v|-nodes, created near the end of line -% in |{DispWithArrows}| and |{DispWithArrows*}| are not shown with the option -% |show-nodes|.} -% -% -% \bigskip -% The style |@@_standard| is loaded in standard in the |{tikzpicture}| we need. -% The names of the nodes are prefixed by |wa| (by security) but also by a prefix -% which is the position-in-the-tree of the nested environments. -% \begin{macrocode} -\tikzset - { - @@_standard / .style = - { - remember~picture , - overlay , - name~prefix = wa - \l_@@_prefix_str - - } - } -% \end{macrocode} -% -% \bigskip -% We also define a style for the tips of arrow. The final user of the extension -% \pkg{witharrows} will use this style if he wants to draw an arrow directly -% with a Tikz command in his document (probably using the Tikz nodes created by -% |{WithArrows}| in the |\halign|). -% \begin{macrocode} -\tikzset - { - WithArrows / arrow / tips / .style = - { > = { Straight~Barb [ scale = 1.2 , bend ] } } - } -% \end{macrocode} -% -% \bigskip -% The style |WithArrows/arrow| will be used to draw the arrows (more precisely, -% it will be passed to |every~path|). -% \begin{macrocode} -\tikzset - { - WithArrows / arrow / .style = - { - align = left , -% \end{macrocode} -% -% We have put the option |align = left| because we want to give the user the -% possibility of using |\\| in the labels. -% \begin{macrocode} - auto = left , - font = \small \itshape , - WithArrows / arrow / tips , - bend~left = 45 , - -> - } - } -% \end{macrocode} -% -% \bigskip -% The option |subequations| is an option which uses the environment -% |{subequations}| of \pkg{amsmath}. That's why, if \pkg{amsmath} is loaded, we -% add the key |subequations| to the list of the keys available in -% |\WithArrowsOptions| and |{DispWithArrows}|. -% \begin{macrocode} -\AtBeginDocument - { - \bool_if:NTF \c_@@_amsmath_loaded_bool - { - \seq_put_right:Nn \l_@@_options_WithArrowsOptions_seq { subequations } - \seq_put_right:Nn \l_@@_options_DispWithArrows_seq { subequations } - } -% \end{macrocode} -% -% \bigskip -% In order to increase the interline in the environments |{WithArrows}|, -% |{DispWithArrows}|, etc., we will use the command |\spread@equation| of -% \pkg{amsmath}. When used, this command becomes no-op (in the current TeX -% group). Therefore, it will be possible to use the environments of -% \pkg{amsmath} (e.g. |{aligned}|) in an environment |{WithArrows}|. -% -% Nevertheless, we want the extension \pkg{witharrows} available without -% \pkg{amsmath}. That's why we give a definition of |\spread@equation| if -% \pkg{amsmath} is not loaded (we put the code in a |\AtBeginDocument| because -% the flag |\c_@@_amsmath_loaded_bool| is itself set in a |\AtBeginDocument|). -% \begin{macrocode} - { - \cs_new_protected:Npn \spread@equation - { - \openup \jot - \cs_set_eq:NN \spread@equation \prg_do_nothing: - } - } - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\tl_new:N \l_@@_left_brace_tl -\tl_set_eq:NN \l_@@_left_brace_tl \c_novalue_tl -% \end{macrocode} -% -% \bigskip -% \subsection{Variables} -% -% The boolean |\l_@@_in_WithArrows_bool| will be raised in an environment -% |{WithArrows}| and the boolean |\l_@@_in_dispwitharrows_bool| will be raised -% in an environment |{DispWithArrows}| or |{DispWithArrows*}|. The boolean -% |\l_@@_in_code_after_bool| will be raised during the execution of the -% |code-after| (option |code-after|). -% \begin{macrocode} -\bool_new:N \l_@@_in_WithArrows_bool -\bool_new:N \l_@@_in_DispWithArrows_bool -\bool_new:N \l_@@_in_code_after_bool -% \end{macrocode} -% -% \bigskip -% The following sequence is the position of the last environment |{WithArrows}| -% in the tree of the nested environments |{WithArrows}|. -% \begin{macrocode} -\seq_new:N \g_@@_position_in_the_tree_seq -\seq_gput_right:Nn \g_@@_position_in_the_tree_seq 1 -% \end{macrocode} -% -% \bigskip -% The following counter will give the number of the last environment -% |{WithArrows}| of level~$0$. This counter will be used only in the definition -% of |\WithArrowsLastEnv|. -% \begin{macrocode} -\int_new:N \g_@@_last_env_int -% \end{macrocode} -% -% \bigskip -% The following integer indicates the position of the box that will be created -% for an environment |{WithArrows}| (not an environment |{DispWithArrows}|) : -% 0 (=|t|=|\vtop|), 1~(=|c|=|\vcenter|) or 2 (=|b|=|\vbox|). -% \begin{macrocode} -\int_new:N \l_@@_pos_env_int -% \end{macrocode} -% -% \bigskip -% The integer |\l_@@_pos_arrow_int| indicates the position of the arrow with the -% following code (the option |v| is accessible only for the arrows in -% |code-after| where the options |i|, |group| et |groups| are not available). -% -% \begin{center} -% \begin{tabular}{l} -% \begin{tabular}{@{}l*8c@{}} -% \toprule -% option & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\ -% \midrule -% |\l_@@_pos_arrow_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ & $7$ \\ -% \bottomrule -% \end{tabular} \\ -% \footnotesize The option |v| can be used only in |\Arrow| in |code-after| (see -% below). -% \end{tabular} -% \end{center} -% -% \begin{macrocode} -\int_new:N \l_@@_pos_arrow_int -\int_set:Nn \l_@@_pos_arrow_int 3 -% \end{macrocode} -% -% -% \bigskip -% In the |\halign| of an environment |{WithArrows}| or |{DispWithArrows}|, we -% will have to use four counters: -% \begin{itemize} -% \item |\g_@@_arrow_int| to count the arrows created in the environment ; -% \item |\g_@@_line_int| to count the lines of the |\halign| ; -% \item |\g_@@_col_int| to count the column of the |\halign|. -% \end{itemize} -% -% -% These counters will be incremented in a cell of the |\halign| and, therefore, -% the incrementation must be global. However, we want to be able to include a -% |{WithArrows}| in another |{WithArrows}|. To do so, we must restore the -% previous value of these counters at the end of an environment |{WithArrows}| -% and we decide to manage a stack for each of these counters. -% \begin{macrocode} -\seq_new:N \g_@@_arrow_int_seq -\int_new:N \g_@@_arrow_int -\seq_new:N \g_@@_line_int_seq -\int_new:N \g_@@_line_int -\seq_new:N \g_@@_col_int_seq -\int_new:N \g_@@_col_int -% \end{macrocode} -% -% -% \bigskip -% For the environment |{DispWithArrows}|, the comma list |\l_@@_tags_clist| will -% be the list of the numbers of lines to be tagged (with the counter |equation| -% of LaTeX). In fact, |\l_@@_tags_clist| may contain non negative integers but -% also three special values, |first|, |last| and |all|. -% \begin{macrocode} -\clist_new:N \l_@@_tags_clist -\clist_set:Nn \l_@@_tags_clist { all } -% \end{macrocode} -% -% \bigskip -% During the execution of an environment |{DispWithArrows}|, if a row must be -% tagged, the (local) value of |\l_@@_tags_clist| will be put (by convention) to -% |all|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_test_if_to_tag: - { - \clist_if_in:NVT \l_@@_tags_clist \g_@@_line_int - { \clist_set:Nn \l_@@_tags_clist { all } } - } -% \end{macrocode} -% -% -% \bigskip -% If the user has given a value for the option |command-name| (at the global or -% at the \emph{environment} level), a command with this name is defined locally -% in the environment with meaning |\@@_Arrow|. The default value of the option -% |command-name| is ``|Arrow|'' and thus, by default, the name of the command -% will be |\Arrow|. -% \begin{macrocode} -\str_new:N \l_@@_command_name_str -\str_set:Nn \l_@@_command_name_str { Arrow } -% \end{macrocode} -% -% \bigskip -% The string |\l_@@_string_Arrow_for_msg_str| is only a string that will be -% displayed in some error messages. For example, if |command-name| is defined to -% be |Explanation|, this string will contain ``|\Arrow alias \Explanation|''. -% \begin{macrocode} -\str_new:N \l_@@_string_Arrow_for_msg_str -\str_set:Nx \l_@@_string_Arrow_for_msg_str { \token_to_str:N \Arrow } -% \end{macrocode} -% -% \bigskip -% The sequence |\g_@@_names_seq| will be the list of all the names of -% environments used (via the option |name|) in the document: two environments -% must not have the same name. However, it's possible to use the option -% |allow-duplicate-names|. -% \begin{macrocode} -\seq_new:N \g_@@_names_seq -% \end{macrocode} -% -% \bigskip -% The boolean |\l_@@_sbwi_bool| corresponds to the option -% |standard-behaviour-with-items|. Since the version 1.16 of \pkg{witharrows}, -% no vertical space is added between an |\item| of a LaTeX list and an -% environment |{DispWithArrows}|. With the option -% |standard-behaviour-with-items|, it's possible to restore the previous -% behaviour (which corresponds to the standard behaviour of |{align}| of -% \pkg{amsmath}). |\l_@@_sbwi_bool| is the boolean corresponding to this option. -% \begin{macrocode} -\bool_new:N \l_@@_sbwi_bool -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\bool_new:N \l_@@_in_first_columns_bool -\bool_new:N \l_@@_tag_star_bool -\bool_new:N \l_@@_tag_next_line_bool -\bool_new:N \l_@@_qedhere_bool -\bool_new:N \l_@@_new_group_bool -\bool_new:N \l_@@_initial_r_bool -\bool_new:N \l_@@_final_r_bool -\tl_new:N \l_@@_initial_tl -\tl_new:N \l_@@_final_tl -\int_new:N \l_@@_nb_cols_int -% \end{macrocode} -% -% \bigskip -% The string |\l_@@_format_str| will contain the \emph{format} of the array -% which is a succession of letters |r|, |c| and |l| specifying the type of the -% columns of the |\halign| (except the column for the labels of the equations -% in the environment |{DispWithArrows}|). -% \begin{macrocode} -\str_new:N \l_@@_format_str -% \end{macrocode} -% -% \bigskip -% The option boolean corresponds to the option |subequations|. -% \begin{macrocode} -\bool_new:N \l_@@_subequations_bool -% \end{macrocode} -% -% \bigskip -% \subsection{The definition of the options} -% -% There are four levels where options can be set: -% \begin{itemize} -% \item with |\usepackage[...]{witharrows}|: this level will be called -% \emph{package} level; -% \item with |\WithArrowsOptions{...}|: this level will be called \emph{global} -% level\footnote{This level is called \emph{global level} but the settings done -% by |\WithArrowsOptions| are local in the TeX sense: their scope corresponds to -% the current TeX group.}; -% \item with |\begin{WithArrows}[...]|: this level will be called -% \emph{environment} level; -% \item with |\Arrow[...]| (included in |code-after|): this level will be called -% \emph{local} level. -% \end{itemize} -% -% -% \bigskip -% When we scan a list of options, we want to be able to raise an error if two -% options of position (|ll|, |rl|, |i|, etc.) of the arrows are present. That's -% why we keep the first option of position in a variable called -% |\l_@@_previous_key_str|. The following function |\@@_eval_if_allowed:n| will -% execute its argument only if a first key of position has not been set (and -% raise an error elsewhere). -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_eval_if_allowed:n #1 - { - \str_if_empty:NTF \l_@@_previous_key_str - { - \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl - #1 - } - { \@@_error:n { Incompatible~options } } - } -% \end{macrocode} -% -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_fix_pos_option:n #1 - { \@@_eval_if_allowed:n { \int_set:Nn \l_@@_pos_arrow_int { #1 } } } -% \end{macrocode} -% -% \bigskip -% First a set of keys that will be used at the global or environment level of -% options. -% \begin{macrocode} -\keys_define:nn { WithArrows / Global } - { - ygap .dim_set:N = \l_@@_ygap_dim , - ygap .value_required:n = true , - ygap .initial:n = 0.4 ex , - ystart .dim_set:N = \l_@@_ystart_dim , - ystart .value_required:n = true , - ystart .initial:n = 0.4 ex , - more-columns .code:n = - \@@_msg_redirect_name:nn { Too~much~columns~in~WithArrows } { none } , - more-columns .value_forbidden:n = true, - command-name .code:n = - \str_set:Nn \l_@@_command_name_str { #1 } - \str_set:Nx \l_@@_string_Arrow_for_msg_str - { \c_backslash_str Arrow~alias~\c_backslash_str #1 } , - command-name .value_required:n = true , - tikz-code .tl_set:N = \l_@@_tikz_code_tl, - tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; , - tikz-code .value_required:n = true , - TikzCode .meta:n = { tikz-code = #1 } , - displaystyle .bool_set:N = \l_@@_displaystyle_bool , - displaystyle .default:n = true , - show-nodes .code:n = - \tikzset { @@_node_style / .append~style = { draw , red } } , - show-nodes .value_forbidden:n = true, - show-node-names .bool_set:N = \l_@@_show_node_names_bool , - show-node-names .default:n = true , - group .code:n = - \str_if_empty:NTF \l_@@_previous_key_str - { - \str_set:Nn \l_@@_previous_key_str { group } - \seq_remove_all:Nn \l_@@_options_Arrow_seq { xoffset } - \int_set:Nn \l_@@_pos_arrow_int 7 - } - { \@@_error:n { Incompatible~options } } , - group .value_forbidden:n = true , - groups .code:n = - \str_if_empty:NTF \l_@@_previous_key_str - { - \str_set:Nn \l_@@_previous_key_str { groups } - \seq_if_in:NnF \l_@@_options_Arrow_seq { new-group } - { \seq_put_right:Nn \l_@@_options_Arrow_seq { new-group } } - \seq_remove_all:Nn \l_@@_options_Arrow_seq { xoffset } - \int_set:Nn \l_@@_pos_arrow_int 6 - } - { \@@_error:n { Incompatible~options } } , - groups .value_forbidden:n = true , - tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .initial:n = \c_empty_tl , - tikz .value_required:n = true , - rr .value_forbidden:n = true , - rr .code:n = \@@_fix_pos_option:n 3 , - ll .value_forbidden:n = true , - ll .code:n = \@@_fix_pos_option:n 1 , - rl .value_forbidden:n = true , - rl .code:n = \@@_fix_pos_option:n 2 , - lr .value_forbidden:n = true , - lr .code:n = \@@_fix_pos_option:n 0 , - i .value_forbidden:n = true , - i .code:n = \@@_fix_pos_option:n 5 , - xoffset .dim_set:N = \l_@@_xoffset_dim , - xoffset .value_required:n = true , - xoffset .initial:n = 3 mm , - jot .dim_set:N = \jot , - jot .value_required:n = true , - interline .skip_set:N = \l_@@_interline_skip , - interline .value_required:n = true , - start-adjust .dim_set:N = \l_@@_start_adjust_dim , - start-adjust .value_required:n = true , - start-adjust .initial:n = 0.4 ex , - end-adjust .dim_set:N = \l_@@_end_adjust_dim , - end-adjust .value_required:n = true , - end-adjust .initial:n = 0.4 ex , - adjust .meta:n = { start-adjust = #1 , end-adjust = #1 } , - adjust .value_required:n = true , -% \end{macrocode} -% -% \medskip -% With the option |no-arrows|, the arrows won't be drawn. However, the ``first -% pass'' of the arrows is done and some errors may be detected. The -% nullification of |\@@_draw_arrows:nn| is for the standard arrows and the -% nullification of |\@@_draw_arrow:nnn| is for ``Arrow in |code-after|''. -% \begin{macrocode} - no-arrows .code:n = - \cs_set_eq:NN \@@_draw_arrows:nn \use_none:nn - \cs_set_eq:NN \@@_draw_arrow:nnn \use_none:nnn , - no-arrows .value_forbidden:n = true , - } -% \end{macrocode} -% -% \bigskip -% Now a set of keys specific to the environments |{WithArrows}| (and not -% |{DispWithArrow}}|). Despite its name, this set of keys will also be used in -% |\WithArrowsOptions|. -% \begin{macrocode} -\keys_define:nn { WithArrows / WithArrowsSpecific } - { - t .code:n = \int_set:Nn \l_@@_pos_env_int O , - t .value_forbidden:n = true , - c .code:n = \int_set:Nn \l_@@_pos_env_int 1 , - c .value_forbidden:n = true , - b .code:n = \int_set:Nn \l_@@_pos_env_int 2 , - b .value_forbidden:n = true - } -% \end{macrocode} -% -% \bigskip -% The following list of the (left) extensible delimiters of LaTeX is only for -% the validation of the key |replace-left-brace-by|. -% \begin{macrocode} -\clist_new:N \c_@@_extensible_delimiters_clist -\clist_set:Nn \c_@@_extensible_delimiters_clist - { - \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor - } -\AtBeginDocument - { - \bool_if:nT - { \c_@@_amsmath_loaded_bool || \use:c { c_@@_unicode-math_loaded_bool } } - { - \clist_put_right:Nn \c_@@_extensible_delimiters_clist { \lvert, \lVert } - } - } -% \end{macrocode} -% -% -% \bigskip -% Now a set of keys specific to the environments |{DispWithArrows}| and -% |{DispWithArrows*}| (and not |{WithArrows}|). Despite its name, this set of -% keys will also be used in |\WithArrowsOptions|. -% \begin{macrocode} -\keys_define:nn { WithArrows / DispWithArrowsSpecific } - { - fleqn .bool_set:N = \l_@@_fleqn_bool , - fleqn .default:n = true , - mathindent .dim_set:N = \l_@@_mathindent_dim , - mathindent .value_required:n = true , - mathindent .initial:n = 25 pt , - notag .code:n = - \str_if_eq:nnTF { #1 } { true } - { \clist_clear:N \l_@@_tags_clist } - { \clist_set:Nn \l_@@_tags_clist { all } } , - notag .default:n = true , -% \end{macrocode} -% Since the option |subequations| is an option which insert the environment -% |{DispWithArrows}| in an environment |{subequations}| of \pkg{amsmath}, we -% must test whether the package \pkg{amsmath} is loaded. -% \begin{macrocode} - subequations .code:n = - \bool_if:NTF \c_@@_amsmath_loaded_bool - { \bool_set_true:N \l_@@_subequations_bool } - { - \@@_error:n { amsmath~not~loaded } - \group_begin: - \globaldefs = 1 - \@@_msg_redirect_name:nn { amsmath~not~loaded } { info } - \group_end: - } , - subequations .default:n = true , - subequations .value_forbidden:n = true , - nonumber .meta:n = notag , - allow-multiple-labels .code:n = - \@@_msg_redirect_name:nn { Multiple~labels } { none } , - allow-multiple-labels .value_forbidden:n = true , - wrap-lines .bool_set:N = \l_@@_wrap_lines_bool , - wrap-lines .default:n = true , - tagged-lines .code:n = - \clist_set:Nn \l_@@_tags_clist { #1 } - \clist_if_in:NnT \l_@@_tags_clist { first } - { - \clist_remove_all:Nn \l_@@_tags_clist { first } - \clist_put_left:Nn \l_@@_tags_clist \c_one_int - } , - tagged-lines .value_required:n = true , - replace-left-brace-by .code:n = - { - \clist_if_in:NnTF - \c_@@_extensible_delimiters_clist - { #1 } - { \tl_set:Nn \l_@@_replace_left_brace_by_tl { #1 } } - { \@@_error:n { Bad~value~for~replace~brace~by } } - } , - replace-left-brace-by .initial:n = \lbrace , -% \end{macrocode} -% -% Since the version 1.16 of \pkg{witharrows}, no vertical space is added between -% an |\item| of a LaTeX list and an environment |{DispWithArrows}|. With the -% option |standard-behaviour-with-items|, it's possible to restore the previous -% behaviour (which corresponds to the standard behaviour of |{align}| of -% \pkg{amsmath}). -% \begin{macrocode} - standard-behaviour-with-items .bool_set:N = \l_@@_sbwi_bool , - standard-behaviour-with-items .default:n = true - } -% \end{macrocode} -% -% -% \bigskip -% Now a set of keys which will be used in all the environments (but not in -% |\WithArrowsOptions}|). -% -% \begin{macrocode} -\keys_define:nn { WithArrows / Env } - { - name .code:n = -% \end{macrocode} -% First, we convert the value in a |str| because the list of the names will be a -% list of |str|. -% \begin{macrocode} - \str_set:Nn \l_tmpa_str { #1 } - \seq_if_in:NVTF \g_@@_names_seq \l_tmpa_str - { \@@_error:n { Duplicate~name } } - { \seq_gput_left:NV \g_@@_names_seq \l_tmpa_str } - \str_set_eq:NN \l_@@_name_str \l_tmpa_str , - name .value_required:n = true , - code-before .code:n = \tl_put_right:Nn \l_@@_code_before_tl { #1 } , - code-before .value_required:n = true, - CodeBefore .meta:n = { code-before = #1 } , - code-after .code:n = \tl_put_right:Nn \l_@@_code_after_tl { #1 } , - code-after .value_required:n = true , - CodeAfter .meta:n = { code-after = #1 } , - format .code:n = - \tl_if_empty:nTF { #1 } - { \@@_error:n { Invalid~option~format } } - { - \regex_match:nnTF { \A[rcl]*\Z } { #1 } - { \tl_set:Nn \l_@@_format_str { #1 } } - { \@@_error:n { Invalid~option~format } } - } , - format .value_required:n = true , - } -% \end{macrocode} -% -% -% \bigskip -% Now, we begin the construction of the major sets of keys, named -% ``|WithArrows / WithArrows|'', ``|WithArrows / DispWithArrows|'' and -% ``|WithArrows / WithArrowsOptions|''. Each of these sets of keys will be -% completed after. -% \begin{macrocode} -\keys_define:nn { WithArrows } - { - WithArrows .inherit:n = - { - WithArrows / Global , - WithArrows / WithArrowsSpecific , - WithArrows / Env - } , - DispWithArrows .inherit:n = - { - WithArrows / DispWithArrowsSpecific , - WithArrows / Global , - WithArrows / Env , - } , - WithArrowsOptions .inherit:n = - { - WithArrows / Global , - WithArrows / WithArrowsSpecific , - WithArrows / DispWithArrowsSpecific - } - } -% \end{macrocode} -% -% -% \bigskip -% A sequence of |str| for the options available in |{WithArrows}|. This sequence -% will be used in the error messages and can be modified dynamically. -% \begin{macrocode} -\seq_new:N \l_@@_options_WithArrows_seq -\@@_set_seq_of_str_from_clist:Nn \l_@@_options_WithArrows_seq - { - adjust, b, c, code-after, code-before, command-name, - displaystyle, end-adjust, - format, group, groups, i, - interline, jot, ll, - lr, more-columns, name, - no-arrows, rl, rr, - show-node-names, show-nodes, start-adjust, - t, tikz, tikz-code, - xoffset, ygap, ystart - } -\@@_convert_to_str_seq:N \l_@@_options_WithArrows_seq -% \end{macrocode} -% -% \medskip -% \begin{macrocode} -\keys_define:nn { WithArrows / WithArrows } - { - unknown .code:n = - \@@_sort_seq:N \l_@@_options_WithArrows_seq - \@@_error:n { Unknown~option~WithArrows } - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\keys_define:nn { WithArrows / DispWithArrows } - { - left-brace .tl_set:N = \l_@@_left_brace_tl , - unknown .code:n = - \@@_sort_seq:N \l_@@_options_DispWithArrows_seq - \@@_error:n { Unknown~option~DispWithArrows } - } -% \end{macrocode} -% -% \bigskip -% A sequence of the options available in |{DispWithArrows}|. This sequence will -% be used in the error messages and can be modified dynamically. -% \begin{macrocode} -\seq_new:N \l_@@_options_DispWithArrows_seq -\@@_set_seq_of_str_from_clist:Nn \l_@@_options_DispWithArrows_seq - { - allow-multiple-labels, code-after, code-before, command-name, tikz-code, adjust, - displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot, - left-brace, ll, lr, mathindent, name, no-arrows, nonumber, notag, - replace-left-brace-by, rl, rr, show-node-names, show-nodes, start-adjust, - tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart - } -% \end{macrocode} -% -% -% \begin{macrocode} -\keys_define:nn { WithArrows / WithArrowsOptions } - { - allow-duplicate-names .code:n = - \@@_msg_redirect_name:nn { Duplicate~name } { none } , - allow-duplicate-names .value_forbidden:n = true , - unknown .code:n = - \@@_sort_seq:N \l_@@_options_WithArrowsOptions_seq - \@@_error:n { Unknown~option~WithArrowsOptions } - } -% \end{macrocode} -% -% -% \bigskip -% A sequence of the options available in |\WithArrowsOptions|. This sequence -% will be used in the error messages and can be modified dynamically. -% \begin{macrocode} -\seq_new:N \l_@@_options_WithArrowsOptions_seq -\@@_set_seq_of_str_from_clist:Nn \l_@@_options_WithArrowsOptions_seq - { - allow-duplicate-names, allow-multiple-labels, b, c, command-name, - more-columns, tikz-code, adjust, displaystyle, end-adjust, fleqn, group, - groups, i, interline, jot, ll, lr, mathindent, no-arrows, nonumber, notag, - rl, rr, show-node-names, show-nodes, standard-behaviour-with-items, - start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_set_independent:| is a command without argument that will be -% used to specify that the arrow will be ``independent'' (of the potential -% groups of the option |group| or |groups|). This information will be stored in -% the field ``status'' of the arrow. Another value of the field ``status'' is -% ``new-group''. -% \begin{macrocode} -\cs_new_protected:Npn \@@_set_independent: - { - \str_if_empty:NTF \l_@@_previous_key_str - { - \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl - \str_set:Nn \l_@@_status_arrow_str { independent } - \str_if_eq:VnF \l_keys_value_tl { NoValue } - { \@@_error:n { Value~for~a~key } } - } - { \@@_error:n { Incompatible~options~in~Arrow } } - } -% \end{macrocode} -% -% \bigskip -% The options of an individual arrow are parsed twice. The first pass is when -% the command |\Arrow| is read. The second pass is when the arrows are drawn -% (after the end of the environment |{WithArrows}| or |{DispWithArrows}|). Now, -% we present the keys set for the first pass. The main goal is to extract -% informations which will be necessary during the scan of the arrows. For -% instance, we have to know if some arrows are ``independent'' or use the -% option ``new-group''. -% \begin{macrocode} -\keys_define:nn { WithArrows / Arrow / FirstPass } - { - jump .code:n = - \int_compare:nTF { #1 > 0 } - { \int_set:Nn \l_@@_jump_int { #1 } } - { \@@_error:n { Negative~jump } } , - jump .value_required:n = true, - rr .code:n = \@@_set_independent: , - ll .code:n = \@@_set_independent: , - rl .code:n = \@@_set_independent: , - lr .code:n = \@@_set_independent: , - i .code:n = \@@_set_independent: , - rr .default:n = NoValue , - ll .default:n = NoValue , - rl .default:n = NoValue , - lr .default:n = NoValue , - i .default:n = NoValue , - new-group .value_forbidden:n = true, - new-group .code:n = - \int_compare:nTF { \l_@@_pos_arrow_int = 6 } - { \str_set:Nn \l_@@_status_arrow_str { new-group } } - { \@@_error:n { new-group~without~groups } } , -% \end{macrocode} -% -% \medskip -% The other keys don't give any information necessary during the scan of the -% arrows. However, you try to detect errors and that's why all the keys are -% listed in this keys set. An unknown key will be detected at the point of the -% command |\Arrow| and not at the end of the environment. -% \begin{macrocode} - tikz-code .code:n = \prg_do_nothing: , - tikz-code .value_required:n = true , - tikz .code:n = \prg_do_nothing: , - tikz .value_required:n = true , -% \end{macrocode} -% -% \medskip -% The option |xoffset| is not allowed when the option |group| or the option -% |groups| is used (since it would be meaningless). -% \begin{macrocode} - xoffset .code:n = - \int_compare:nNnT \l_@@_pos_arrow_int > 5 - { \@@_error:n { Option~xoffset~forbidden } } , - xoffset .value_required:n = true , - start-adjust .code:n = \prg_do_nothing: , - start-adjust .value_required:n = true , - end-adjust .code:n = \prg_do_nothing: , - end-adjust .value_required:n = true , - adjust .code:n = \prg_do_nothing: , - adjust .value_required:n = true , - unknown .code:n = - \@@_sort_seq:N \l_@@_options_Arrow_seq - \seq_if_in:NVTF \l_@@_options_WithArrows_seq \l_keys_key_tl - { - \str_set:Nn \l_tmpa_str - { ~However,~this~key~can~be~used~in~the~options~of~\{WithArrows\}. } - } - { \str_clear:N \l_tmpa_str } - \@@_error:n { Unknown~option~in~Arrow } - } -% \end{macrocode} -% -% -% \bigskip -% A sequence of the options available in |\Arrow|. This sequence will be used in -% the error messages and can be modified dynamically. -% \begin{macrocode} -\seq_new:N \l_@@_options_Arrow_seq -\@@_set_seq_of_str_from_clist:Nn \l_@@_options_Arrow_seq - { - adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, tikz-code, - xoffset - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\cs_new_protected:Npn \@@_fix_pos_arrow:n #1 - { - \str_if_empty:NT \l_@@_previous_key_str - { - \str_set_eq:NN \l_@@_previous_key_str \l_keys_key_tl - \int_set:Nn \l_@@_pos_arrow_int { #1 } - } - } -% \end{macrocode} -% -% \bigskip -% The options of the individual commands |\Arrows| are scanned twice. The second -% pass is just before the drawing of the arrow. In this set of keys, we don't -% put an item for the unknown keys because an unknown key would have been -% already detected during the first pass. -% -% \begin{macrocode} -\keys_define:nn {WithArrows / Arrow / SecondPass } - { - tikz-code .tl_set:N = \l_@@_tikz_code_tl , - tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; , - tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .initial:n = \c_empty_tl , - rr .code:n = \@@_fix_pos_arrow:n 3 , - ll .code:n = \@@_fix_pos_arrow:n 1 , - rl .code:n = \@@_fix_pos_arrow:n 2 , - lr .code:n = \@@_fix_pos_arrow:n 0 , - i .code:n = \@@_fix_pos_arrow:n 5 , -% \end{macrocode} -% -% \medskip -% The option |xoffset| is not allowed when the option |group| or the option -% |groups| is used (since it would be meaningless). An error has been raised -% during the first pass. Here, we manage to avoid a second error which -% would be redundant. -% \begin{macrocode} - xoffset .code:n = - \int_compare:nNnF \l_@@_pos_arrow_int > 5 - { \dim_set:Nn \l_@@_xoffset_dim { #1 } } , - start-adjust .dim_set:N = \l_@@_start_adjust_dim, - end-adjust .dim_set:N = \l_@@_end_adjust_dim, - adjust .code:n = - \dim_set:Nn \l_@@_start_adjust_dim { #1 } - \dim_set:Nn \l_@@_end_adjust_dim { #1 } , - } -% \end{macrocode} -% -% \bigskip -% |\WithArrowsOptions| is the command of the \pkg{witharrows} package to fix -% options at the document level. It's possible to fix in |\WithArrowsOptions| -% some options specific to |{WithArrows}| (in contrast with |{DispWithArrows}|) -% or specific to |{DispWithArrows}| (in contrast with |{WithArrows}|). That's -% why we have constructed a set of keys specific to |\WithArrowsOptions|. -% \begin{macrocode} -\NewDocumentCommand \WithArrowsOptions { m } - { - \str_clear_new:N \l_@@_previous_key_str - \keys_set:nn { WithArrows / WithArrowsOptions } { #1 } - } -% \end{macrocode} -% -% -% \bigskip -% \subsection{The command \textbackslash Arrow} -% -% In fact, the internal command is not named |\Arrow| but |\@@_Arrow|. Usually, -% at the beginning of an environment |{WithArrows}|, |\Arrow| is set to be -% equivalent to |\@@_Arrow|. However, the user can change the name with the -% option |command-name| and the user command for |\@@_Arrow| will be different. -% This mechanism can be useful when the user has already a command named -% |\Arrow| he still wants to use in the environments |{WithArrows}| or -% |{DispWithArrows}|. -% -% \medskip -% \begin{macrocode} -\NewDocumentCommand \@@_Arrow { O { } m ! O { } } - { -% \end{macrocode} -% -% The counter |\g_@@_arrow_int| counts the arrows in the environment. The -% incrementation must be global (|gincr|) because the command |\Arrow| will be -% used in the cell of a |\halign|. It's recalled that we manage a stack for this -% counter. -% \begin{macrocode} - \int_gincr:N \g_@@_arrow_int -% \end{macrocode} -% -% \medskip -% We will construct a global property list to store the informations of the -% considered arrow. The six fields of this property list are ``initial'', -% ``final'', ``status'', ``options'', ``label'' and ``input-line''. In order to -% compute the value of ``final'' (the destination row of the arrow), we have to -% take into account a potential option |jump|. In order to compute the value of -% the field ``status'', we have to take into account options as |ll|, |rl|, -% |rr|, |lr|, etc. or |new-group|. -% -% We will do that job with a first analyze of the options of the command -% |\Arrow| with a dedicated set of keys called |WithArrows/Arrow/FirstPass|. -% -% \begin{macrocode} - \str_clear_new:N \l_@@_previous_key_str - \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 } -% \end{macrocode} -% -% \medskip -% We construct now a global property list to store the informations of the -% considered arrow with the six fields ``initial'', ``final'', ``status'', -% ``options'', ``label'' and ``input-line''. -% -% \smallskip -% \begin{enumerate} -% \item First, the row from which the arrow starts: -% \begin{macrocode} - \prop_put:NnV \l_tmpa_prop { initial } \g_@@_line_int -% \end{macrocode} -% -% \item The row where the arrow ends (that's why it was necessary to analyze the -% key |jump|): -% \begin{macrocode} - \int_set:Nn \l_tmpa_int { \g_@@_line_int + \l_@@_jump_int } - \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int -% \end{macrocode} -% -% \item The ``status'' of the arrow, with 3 possible values: empty, -% |independent|, or |new-group|. -% \begin{macrocode} - \prop_put:NnV \l_tmpa_prop { status } \l_@@_status_arrow_str -% \end{macrocode} -% -% \item The options of the arrow (it's a token list): -% \begin{macrocode} - \prop_put:Nnn \l_tmpa_prop { options } { #1 , #3 } -% \end{macrocode} -% -% \item The label of the arrow (it's also a token list): -% \begin{macrocode} - \prop_put:Nnn \l_tmpa_prop { label } { #2 } -% \end{macrocode} -% -% \item The number of the line where the command |\Arrow| is issued in the TeX -% source (as of now, this is only useful for an error message). -% \begin{macrocode} - \prop_put:Nnx \l_tmpa_prop { input-line } \msg_line_number: -% \end{macrocode} -% \end{enumerate} -% -% The property list has been created in a local variable for convenience. Now, -% it will be stored in a global variable indicating both the -% position-in-the-tree and the number of the arrow. -% -% \begin{macrocode} - \prop_gclear_new:c - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \g_@@_arrow_int _ prop } - \prop_gset_eq:cN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \g_@@_arrow_int _ prop } - \l_tmpa_prop - } -% \end{macrocode} -% -% \medskip -% The command |\Arrow| (or the corresponding command with a name given by the -% user with the option |command-name|) will be available only in the last column of -% the environments |{WithArrows}| and |{DispWithArrows}|. In the other columns, -% the command will be linked to the following command |\@@_Arrow_first_columns:| -% which will raise an error. -% \begin{macrocode} -\cs_new_protected:Npn \@@_Arrow_first_columns: - { \@@_error:n { Arrow~not~in~last~column } \@@_Arrow } -% \end{macrocode} -% -% -% \bigskip -% \subsection{The environments \{WithArrows\} and \{DispWithArrows\}} -% -% \subsubsection{Code before the \textbackslash halign} -% -% The command |\@@_pre_halign:n| is a code common to the environments -% |{WithArrows}| and |{DispWithArrows}|. The argument is the list of options -% given to the environment. -% \begin{macrocode} -\cs_new_protected:Npn \@@_pre_halign:n #1 -% \end{macrocode} -% -% First, the initialisation of |\l_@@_type_env_str| which is the name of the -% encompassing environment. In fact, this token list is used only in the error -% messages. -% \begin{macrocode} - { - \str_clear_new:N \l_@@_type_env_str - \str_set:NV \l_@@_type_env_str \@currenvir -% \end{macrocode} -% -% \bigskip -% We deactivate the potential externalization of Tikz. The Tikz elements created -% by \pkg{witharrows} can't be externalized since they are created in Tikz -% pictures with |overlay| and |remember picture|. -% \begin{macrocode} - \cs_if_exist:NT \tikz@library@external@loaded - { \tikzset { external / export = false } } -% \end{macrocode} -% -% \bigskip -% The token list |\l_@@_name_str| will contain the potential name of the -% environment (given with the option |name|). This name will be used to create -% aliases for the names of the nodes. -% \begin{macrocode} - \str_clear_new:N \l_@@_name_str -% \end{macrocode} -% -% \bigskip -% The parameter |\l_@@_status_arrow_str| will be used to store the ``status'' of -% an individual arrow. It will be used to fill the field ``status'' in the -% property list describing an arrow. -% \begin{macrocode} - \str_clear_new:N \l_@@_status_arrow_str -% \end{macrocode} -% -% \bigskip -% The dimension |\l_@@_x_dim| will be used to compute the $x$-value for some -% vertical arrows when one of the options |i|, |group| and |groups| (values 5, 6 -% and 7 of |\l_@@_pos_arrow_int|) is used. -% \begin{macrocode} - \dim_zero_new:N \l_@@_x_dim -% \end{macrocode} -% -% \medskip -% The variable |\l_@@_input_line_str| will be used only to store, for each -% command |\Arrow| the line (in the TeX file) where the command is issued. This -% information will be stored in the field ``input-line'' of the arrow. As of -% now, this information is used only in the error message of a arrow impossible -% to draw (because it arrives after the last row of the environment). -% \begin{macrocode} - \str_clear_new:N \l_@@_input_line_str -% \end{macrocode} -% -% -% The initialisation of the counters |\g_@@_arrow_int|, |\g_@@_line_int| and -% |\g_@@_col_int|. However, we have to save their previous values with the -% stacks created for this end. -% \begin{macrocode} - \seq_gput_right:NV \g_@@_arrow_int_seq \g_@@_arrow_int - \int_gzero:N \g_@@_arrow_int - \seq_gput_right:NV \g_@@_line_int_seq \g_@@_line_int - \int_gzero:N \g_@@_line_int - \seq_gput_right:NV \g_@@_col_int_seq \g_@@_col_int - \int_gzero:N \g_@@_col_int -% \end{macrocode} -% -% In the preamble of the |\halign|, there will be \emph{two} counters of the -% columns. The aim of this programmation is to detect the utilisation of a -% command |\omit| in a cell of the |\halign| (it should be forbidden). -% For example, in the part of the preamble concerning the third column (if there -% is a third column in the environment), we will have the following instructions : -% \begin{Verbatim} -% \int_gincr:N \g_~@~@_col_int -% \int_gset:Nn \g_~@~@_static_col_int 3 -% \end{Verbatim} -% The counter |\g_@@_col_int| is incremented dynamically and the second is -% static. If the user has used a command |\omit|, the dynamic incrementation is -% not done in the cell and, at this end of the row, the difference between the -% counters may infer the presence of |\omit| at least once. -% \begin{macrocode} - \int_gzero_new:N \g_@@_static_col_int -% \end{macrocode} -% -% \bigskip -% We also have to update the position on the nesting tree. -% \begin{macrocode} - \seq_gput_right:Nn \g_@@_position_in_the_tree_seq 1 -% \end{macrocode} -% -% The nesting tree is used to create a prefix which will be used in the names of -% the Tikz nodes and in the names of the arrows (each arrow is a property list -% of six fields). If we are in the second environment |{WithArrows}| nested in -% the third environment |{WithArrows}| of the document, the prefix will be |3-2| -% (although the position in the tree is $[3,2,1]$ since such a position always -% ends with a~$1$). First, we do a copy of the position-in-the-tree and then we -% pop the last element of this copy (in order to drop the last~$1$). -% \begin{macrocode} - \seq_set_eq:NN \l_tmpa_seq \g_@@_position_in_the_tree_seq - \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl - \str_clear_new:N \l_@@_prefix_str - \str_set:Nx \l_@@_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - } -% \end{macrocode} -% -% \bigskip -% We define the command |\\| to be the command |\@@_cr:| (defined below). -% \begin{macrocode} - \cs_set_eq:NN \\ \@@_cr: - \dim_zero:N \mathsurround -% \end{macrocode} -% -% \bigskip -% These counters will be used later as variables. -% \begin{macrocode} - \int_zero_new:N \l_@@_initial_int - \int_zero_new:N \l_@@_final_int - \int_zero_new:N \l_@@_arrow_int - \int_zero_new:N \l_@@_pos_of_arrow_int - \int_zero_new:N \l_@@_jump_int -% \end{macrocode} -% -% \medskip -% The counter |\l_@@_jump_int| corresponds to the option |jump|. Now, we set the -% default value for this option. -% \begin{macrocode} - \int_set:Nn \l_@@_jump_int \c_one_int -% \end{macrocode} -% -% \medskip -% The string |\l_@@_format_str| corresponds to the option |format|. Now, we set -% the default value for this option. -% \begin{macrocode} - \str_set:Nn \l_@@_format_str { rl } -% \end{macrocode} -% -% -% -% \bigskip -% In (the last column of) |{DispWithArrows}|, it's possible to put several -% labels (for the same number of equation). That's why these labels will be -% stored in a sequence |\l_@@_labels_seq|. -% \begin{macrocode} - \seq_clear_new:N \l_@@_labels_seq -% \end{macrocode} -% -% \begin{macrocode} - \bool_set_false:N \l_@@_tag_next_line_bool -% \end{macrocode} -% -% \bigskip -% The value corresponding to the key |interline| is put to zero before the -% treatment of the options of the environment.\footnote{It's recalled that, by -% design, the option |interline| of an environment doesn't apply in the nested -% environments.} -% \begin{macrocode} - \skip_zero:N \l_@@_interline_skip -% \end{macrocode} -% -% \bigskip -% The value corresponding to the key |code-before| is put to nil before the -% treatment of the options of the environment, because, of course, we don't want -% the code executed at the beginning of all the nested -% environments~|{WithArrows}|. Idem for |code-after|. -% \begin{macrocode} - \tl_clear_new:N \l_@@_code_before_tl - \tl_clear_new:N \l_@@_code_after_tl -% \end{macrocode} -% -% \bigskip -% We process the options given to the environment |{WithArrows}| or -% |{DispWithArrows}|. -% \begin{macrocode} - \str_clear_new:N \l_@@_previous_key_str - \bool_if:NT \l_@@_in_WithArrows_bool - { \keys_set:nn { WithArrows / WithArrows } { #1 } } - \bool_if:NT \l_@@_in_DispWithArrows_bool - { \keys_set:nn { WithArrows / DispWithArrows } { #1 } } -% \end{macrocode} -% -% \medskip -% Now we link the command |\Arrow| (or the corresponding command with a name -% given by the user with the option |command-name|: that's why the following line -% must be after the loading of the options) to the command -% |\@@_Arrow_first_columns:| which will raise an error. -% \begin{macrocode} - \cs_set_eq:cN \l_@@_command_name_str \@@_Arrow_first_columns: -% \end{macrocode} -% It's only in the last column of the environment that it will be linked to the -% command |\@@_Arrow:|. -% -% \medskip -% The counter |\l_@@_nb_cols_int| is the number of columns in the -% |\halign| (excepted the column for the labels of equations in -% |{DispWithArrows}| and excepted eventuals other columns in |{WithArrows}| allowed -% by the option |more-columns|). -% \begin{macrocode} - \int_set:Nn \l_@@_nb_cols_int { \str_count:N \l_@@_format_str } -% \end{macrocode} -% -% \medskip -% Be careful! The following counter |\g_@@_col_int| will be used for two usages: -% \begin{itemize} -% \item during, the construction of the preamble of the |\halign|, it will be -% used as counter for the number of the column under construction in the -% preamble (since the preamble is constructed backwards, |\g_@@_col_int| will go -% decreasing from |\l_@@_nb_cols_int| to $1$) ; -% \item once the preamble constructed, the primitive |\halign| is executed, and, -% in each row of the |\halign|, the counter |\g_@@_col_int| will be increased -% from column to column. -% \end{itemize} -% -% \begin{macrocode} - \int_gset_eq:NN \g_@@_col_int \l_@@_nb_cols_int -% \end{macrocode} -% -% \medskip -% We convert the format in a sequence because we use it as a stack (with the top -% of the stack at the end of the sequence) in the construction of the preamble. -% \begin{macrocode} - \seq_clear_new:N \l_@@_format_seq - \seq_set_split:NnV \l_@@_format_seq { } \l_@@_format_str -% \end{macrocode} -% -% \bigskip -% If the option |footnote| or the option |footnotehyper| is used, then we -% extract the footnotes with an environment |{savenotes}| (of the package -% \pkg{footnote} or the package \pkg{footnotehyper}). -% \begin{macrocode} - \bool_if:NT \g_@@_footnote_bool { \begin { savenotes } } -% \end{macrocode} -% -% \bigskip -% We execute the code |\l_@@_code_before_tl| of the option |code-before| of the -% environment after the eventual |\begin{savenotes}| and, symetrically, we will -% execute the |\l_@@_code_after_tl| before the eventual |\end{savenotes}| (we -% have a good reason for the last point: we want to extract the footnotes of the -% arrows executed in the |code-after|). -% \begin{macrocode} - \l_@@_code_before_tl -% \end{macrocode} -% -% \bigskip -% The command |\spread@equation| is the command used by \pkg{amsmath} in the -% beginning of an alignment to fix the interline. When used, it becomes no-op. -% However, it's possible to use \pkg{witharrows} without \pkg{amsmath} since we -% have redefined |\spread@equation| (if it is not defined yet). -% \begin{macrocode} - \spread@equation -% \end{macrocode} -% -% -% \begin{macrocode} - \cs_set_eq:NN \notag \@@_notag: - \cs_set_eq:NN \nonumber \@@_nonumber: - \cs_set_eq:NN \tag \@@_tag - \cs_set_eq:NN \@@_old_label \label - \cs_set_eq:NN \label \@@_label:n - \cs_set_eq:NN \tagnextline \@@_tagnextline: - } -% \end{macrocode} -% This is the end of |\@@_pre_halign:n|. -% -% \bigskip -% \subsubsection{The construction of the preamble of the \textbackslash halign} -% -% The control sequence |\@@_construct_halign:| will ``start'' the |\halign| and -% the preamble. In fact, it constructs all the preamble excepted the end of -% the last column (more precisely: except the part concerning the construction -% of the left node and the right node). -% -% The same function |\@@_construct_halign:| will be used both for the -% environment |{WithArrows}| and the environment |{DispWithArrows}|. -% -% Several important points must be noted concerning that construction of the -% preamble. -% \begin{itemize} -% \item The construction of the preamble is done by reading backwards the -% format |\l_@@_format_str| and adding the corresponding tokens in the input -% stream of TeX. That means that the part of the preamble concerning the last -% cell will be constructed first. -% \item The function |\@@_construct_halign:| is recursive in order to treat -% succesively all the letters of the preamble. -% \item Each part of the preamble is created with a |\use:x| function. This -% expansion of the preamble gives the ability of controlling which parts of the -% code will be expanded during the construction of the preamble (other parts -% will be expanded and executed only during the execution of the |\halign|). -% \item The counter |\g_@@_col_int| is used during the loop of the construction -% of the preamble but, it will also appears in the preamble (we could have -% chosen two differents counters but this way saves a counter). -% \end{itemize} -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_construct_halign: - { - \seq_pop_right:NNTF \l_@@_format_seq \l_@@_type_col_str - { -% \end{macrocode} -% Here is the |\use:x| which is fundamental: it will really construct the part -% of the preamble corresponding to a column by expanding only some parts of the -% following code. -% \begin{macrocode} - \use:x - { -% \end{macrocode} -% Before the recursive call of |\@@_construct_halign:|, we decrease the integer -% |\g_@@_col_bool|. But, during the construction of the column which is -% constructed first (that is to say which is the last column of the |\halign|), -% it is \emph{not} lowered because |\int_decr:N|, which is protected, won't be -% expanded by the |\use:x|. -% -% We begin the construction of a generic column. -% \begin{macrocode} - \int_gdecr:N \g_@@_col_int - \@@_construct_halign: - \int_compare:nNnT \g_@@_col_int = \l_@@_nb_cols_int - { -% \end{macrocode} -% We redefine the command |\Arrow| (or the name given to the corresponding -% command by the option |command-name|) in each cell of the last column. -% The braces around |\l_@@_command_name_str| are mandatory because -% |\l_@@_command_name_str| will be expanded by the |\use:x| and the command -% |\cs_set_eq:cN| must still be efficient during the execution of the |\halign|. -% \begin{macrocode} - \cs_set_eq:cN { \l_@@_command_name_str } \@@_Arrow - \bool_if:NT \l_@@_in_DispWithArrows_bool - { -% \end{macrocode} -% The command |\@@_test_if_to_tag:| (which is protected and, thus, will not be -% expanded during the construction of the preamble) will test, at each row, -% whether the current row must be tagged (and the tag will be put in the very -% last column). -% \begin{macrocode} - \@@_test_if_to_tag: -% \end{macrocode} -% The command |\@@_set_qedhere:| will do a redefinition of |\qedhere| in each -% cell of the last column. -% \begin{macrocode} - \bool_if:NT \c_@@_amsthm_loaded_bool \@@_set_qedhere: - } - } - \str_if_eq:VnT \l_@@_type_col_str { c } \hfil - \str_if_eq:VnT \l_@@_type_col_str { r } \hfill - \int_gincr:N \g_@@_col_int - \int_gset:Nn \g_@@_static_col_int { \int_use:N \g_@@_col_int } - \c_math_toggle_token - { - { } - \bool_if:NT \l_@@_displaystyle_bool \displaystyle - #### - } - \c_math_toggle_token - \int_compare:nNnTF \g_@@_col_int = \l_@@_nb_cols_int - { \@@_construct_nodes: } - { -% \end{macrocode} -% The following glue (|\hfil|) will be added only if we are not in the last cell -% because, in the last cell, a glue (=skip) is added between the nodes (in -% |\@@_construct_nodes:|). -% \begin{macrocode} - \str_if_eq:VnT \l_@@_type_col_str { l } \hfil - \str_if_eq:VnT \l_@@_type_col_str { c } \hfil - \bool_if:NT \l_@@_in_DispWithArrows_bool { \tabskip = \c_zero_skip } - & - } - } - } -% \end{macrocode} -% Now the tokens that will be inserted after the analyze of all the tokens of -% the format: here is the token |\halign|. -% \begin{macrocode} - { - \bool_if:NTF \l_@@_in_WithArrows_bool - { - \ialign - \bgroup - } - { - \halign to \l_@@_linewidth_dim - \bgroup - \bool_if:NT \l_@@_fleqn_bool - { \skip_horizontal:N \l_@@_mathindent_dim } - } - \int_gincr:N \g_@@_line_int - \int_gzero:N \g_@@_col_int - \tl_if_eq:NNF \l_@@_left_brace_tl \c_novalue_tl - { - \skip_horizontal:n - { \box_wd:N \l_@@_left_brace_box + \l_@@_delim_wd_dim } - } - \strut - } - } -% \end{macrocode} -% -% -% \bigskip -% The command |\@@_construct_nodes:| is only for the lisibility of the code -% because, in fact, it is used only once. It constructs the ``left node'' and -% the ``right node'' at the end of each row of the arrow. -% \begin{macrocode} -\cs_new_protected:Npn \@@_construct_nodes: - { -% \end{macrocode} -% We create the ``left node'' of the line (when using macros in Tikz node names, -% the macros have to be fully expandable: here, |\int_use:N| is fully -% expandable). -% \begin{macrocode} - \tikz [ remember~picture , overlay ] - \node - [ - node~contents = { } , - @@_node_style , - name = wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - l , - alias = - { - \str_if_empty:NF \l_@@_name_str - { \l_@@_name_str - \int_use:N \g_@@_line_int - l } - } - ] - ; - \hfil -% \end{macrocode} -% -% \bigskip -% Now, after the |\hfil|, we create the ``right node'' and, if the option -% |show-node-names| is raised, the name of the node is written in the document -% (useful for debugging). -% \begin{macrocode} - \tikz [ remember~picture , overlay ] - \node - [ - node~contents = { } , - @@_node_style , - name = wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - r , - alias = - { - \str_if_empty:NF \l_@@_name_str - { \l_@@_name_str - \int_use:N \g_@@_line_int - r } - } - ] - ; - \bool_if:NT \l_@@_show_node_names_bool - { - \hbox_overlap_right:n - { \small wa - \l_@@_prefix_str - \int_use:N \g_@@_line_int - r } - } - } -% \end{macrocode} -% -% -% -% \bigskip -% \subsubsection{The environment \{WithArrows\}} -% -% -% \begin{macrocode} -\NewDocumentEnvironment { WithArrows } { ! O { } } - { - \bool_set_true:N \l_@@_in_WithArrows_bool - \bool_set_false:N \l_@@_in_DispWithArrows_bool - \@@_pre_halign:n { #1 } - \if_mode_math: \else: - \@@_error:n { WithArrows~outside~math~mode } - \fi: -% \end{macrocode} -% -% \bigskip -% The environment begins with a |\vtop|, a |\vcenter| or a -% |\vbox|\footnote{Notice that the use of |\vtop| seems color-safe here...} -% depending of the value of |\l_@@_pos_env_int| (fixed by the options |t|, |c| -% or |b|). The environment |{WithArrows}| must be used in math mode\footnote{An -% error is raised if the environment is used outside math mode.} and therefore, -% we can use |\vcenter|. -% \begin{macrocode} - \int_case:nn \l_@@_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox } - \bgroup -% \end{macrocode} -% -% \bigskip -% We begin the |\halign| and the preamble. During the construction of the -% preamble, |\l_tmpa_int| will be incremented during each column constructed. -% \begin{macrocode} - \@@_construct_halign: -% \end{macrocode} -% -% -% \medskip -% In fact, the construction of the preamble is not finished. We add a little more. -% -% \medskip -% An environmemnt |{WithArrows}| should have a number of columns equal to the -% length of its format (by default, 2 since the default format is |rl|). -% Nevertheless, if the user wants to use more columns (without arrows) -% it's possible with the option |more-columns|. -% \begin{macrocode} - && - \@@_error:n { Too~much~columns~in~WithArrows } - \c_math_toggle_token - \bool_if:NT \l_@@_displaystyle_bool \displaystyle - { ## } - \c_math_toggle_token - \cr - } -% \end{macrocode} -% -% -% \bigskip -% We begin the second part of the environment |{WithArrows}|. We have two -% |\egroup|\,: one for the |\halign| and one for the |\vtop| (or |\vcenter| or -% |\vbox|). -% \begin{macrocode} - { - \\ - \egroup - \egroup - \@@_post_halign: -% \end{macrocode} -% -% \bigskip -% If the option |footnote| or the option |footnotehyper| is used, then we -% extract the footnotes with an environment |{footnote}| (of the package -% \pkg{footnote} or the package \pkg{footnotehyper}). -% \begin{macrocode} - \bool_if:NT \g_@@_footnote_bool { \end { savenotes } } - } -% \end{macrocode} -% This is the end of the environment |{WithArrows}|. -% -% -% \bigskip -% \subsubsection{After the construction of the \textbackslash halign} -% -% The command |\@@_post_halign:| is a code common to the second part of the -% environment |{WithArrows}| and the environment |{DispWithArrows}|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_post_halign: -% \end{macrocode} -% -% \bigskip -% The command |\WithArrowsRightX| is not used by \pkg{witharrows}. It's only a -% convenience given to the user. -% \begin{macrocode} - { - \cs_set:Npn \WithArrowsRightX { \g_@@_right_x_dim } -% \end{macrocode} -% -% \bigskip -% It there is really arrows in the environment, we draw the arrows. -% \begin{macrocode} - \int_compare:nNnT \g_@@_arrow_int > 0 \@@_scan_arrows: -% \end{macrocode} -% -% \bigskip -% We will execute the code specified in the option |code-after|, after some -% settings. -% \begin{macrocode} - \group_begin: - \tikzset { every~picture / .style = @@_standard } -% \end{macrocode} -% The command |\WithArrowsNbLines| is not used by \pkg{witharrows}. It's only a -% convenience given to the user. -% \begin{macrocode} - \cs_set:Npn \WithArrowsNbLines { \int_use:N \g_@@_line_int } -% \end{macrocode} -% The command |\MultiArrow| is available in |code-after|, and we have a special -% version of |\Arrow|, called ``|\Arrow| in |code-after|'' in the -% documentation.\footnote{As for now, |\MultiArrow| has no option, and that's -% why its internal name is a name of \pkg{expl3} with the signature |:nn| -% whereas |\Arrow| in |code-after| provides options and has the name of a -% function defined with |\NewDocumentCommand|.} -% \begin{macrocode} - \cs_set_eq:NN \MultiArrow \@@_MultiArrow:nn - \cs_set_eq:cN \l_@@_command_name_str \@@_Arrow_code_after - \bool_set_true:N \l_@@_in_code_after_bool - \l_@@_code_after_tl - \group_end: -% \end{macrocode} -% -% \bigskip -% We update the position-in-the-tree. First, we drop the last component and then -% we increment the last element. -% \begin{macrocode} - \seq_gpop_right:NN \g_@@_position_in_the_tree_seq \l_tmpa_tl - \seq_gpop_right:NN \g_@@_position_in_the_tree_seq \l_tmpa_tl - \seq_gput_right:Nx \g_@@_position_in_the_tree_seq - { \int_eval:n { \l_tmpa_tl + 1 } } -% \end{macrocode} -% -% \bigskip -% We update the value of the counter |\g_@@_last_env_int|. This counter is used -% only by the user function |\WithArrowsLastEnv|. -% \begin{macrocode} - \int_compare:nNnT { \seq_count:N \g_@@_position_in_the_tree_seq } = 1 - { \int_gincr:N \g_@@_last_env_int } -% \end{macrocode} -% -% \bigskip -% Finally, we restore the previous values of the counters |\g_@@_arrow_int|, -% |\g_@@_line_int| and |\g_@@_col_int|. It is recalled that we manage three -% stacks in order to be able to do such a restoration. -% \begin{macrocode} - \seq_gpop_right:NN \g_@@_arrow_int_seq \l_tmpa_tl - \int_gset:Nn \g_@@_arrow_int \l_tmpa_tl - \seq_gpop_right:NN \g_@@_line_int_seq \l_tmpa_tl - \int_gset:Nn \g_@@_line_int \l_tmpa_tl - \seq_gpop_right:NN \g_@@_col_int_seq \l_tmpa_tl - \int_gset:Nn \g_@@_col_int \l_tmpa_tl - } -% \end{macrocode} -% That's the end of the command |\@@_post_halign:|. -% -% \bigskip -% \subsubsection{The command of end of row} -% -% We give now the definition of |\@@_cr:| which is the definition of |\\| in an -% environment |{WithArrows}|. The two \pkg{expl3} commands -% |\group_align_safe_begin:| and |\group_align_safe_end:| are specifically -% designed for this purpose: test the token that follows in an |\halign| -% structure. -% -% First, we remove an eventual token |*| (just after the |\\|: there should not -% be space between the two) since the commands |\\| and |\\*| are equivalent in -% an environment |{WithArrows}| (an environment |{WithArrows}|, like an -% environment |{aligned}| of \pkg{amsmath}, is always unbreakable). -% \begin{macrocode} -\cs_new_protected:Npn \@@_cr: - { - \scan_stop: -% \end{macrocode} -% We try to detect some |\omit| (as of now, an |\omit| in the last column is -% not detected). -% \begin{macrocode} - \int_compare:nNnF \g_@@_col_int = \g_@@_static_col_int - { \@@_error:n { omit~probably~used } } - \prg_replicate:nn { \l_@@_nb_cols_int - \g_@@_static_col_int } { & { } } - \group_align_safe_begin: - \peek_meaning_remove:NTF * \@@_cr_i: \@@_cr_i: - } -% \end{macrocode} -% -% \medskip -% Then, we peek the next token to see if it's a |[|. In this case, the command -% |\\| has an optional argument which is the vertical skip (=glue) to put. -% \begin{macrocode} -\cs_new_protected:Npn \@@_cr_i: - { \peek_meaning:NTF [ \@@_cr_ii: { \@@_cr_ii: [ \c_zero_dim ] } } -% \end{macrocode} -% -% \bigskip -% Now, we test if the next token is the token |\end|. Indeed, we want to test if -% the following tokens are |\end{WithArrows}| (or |\end{DispWithArrows}|, etc). -% In this case, we raise an error because the user must not put "\\" at the end -% of its alignment. -% \begin{macrocode} -\cs_new_protected:Npn \@@_cr_ii: [ #1 ] - { - \peek_meaning_ignore_spaces:NTF \end - { - \@@_cr_iii:n { #1 } -% \end{macrocode} -% The analyse of the argument of the token |\end| must be after the -% |\group_align_safe_end:| which is the beginning of |\@@_cr_iii:n|. -% \begin{macrocode} - \@@_analyze_end:Nn - } - { \@@_cr_iii:n { #1 } } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_cr_iii:n #1 - { - \group_align_safe_end: -% \end{macrocode} -% For the environment |{DispWithArrows}|, the behaviour of |\\| is different -% because we add the last column which is the column for the tag (number of the -% equation). Even if there is no tag, this column is used for the -% |v|-nodes.\footnote{The |v|-nodes are used to compute the abscissa of the -% right margin, used by the option |wrap-lines|.} -% \begin{macrocode} - \bool_if:NT \l_@@_in_DispWithArrows_bool -% \end{macrocode} -% At this stage, we know that we have a tag to put if (and only if) the value of -% |\l_@@_tags_clist| is the comma list |all| (only one element). Maybe, -% previously, the value of |\l_@@_tags_clist| was, for example, |1,last| (which -% means that only the first line and the last line must be tagged). However, in -% this case, the comparison with the number of line has be done before and, now, -% if we are in a line to tag, the value of |\l_@@_tags_clist| is |all|. -% \begin{macrocode} - { - \clist_if_in:NnTF \l_@@_tags_clist { all } - { -% \end{macrocode} -% Here, we can't use |\refstepcounter{equation}| because if the user has issued -% a |\tag| command, we have to use |\l_@@_tag_tl| and not |\theequation|. That's -% why we have to do the job done by |\refstepcounter| manually. -% -% First, the incrementation of the counter (potentially). -% \begin{macrocode} - \tl_if_empty:NT \l_@@_tag_tl { \int_gincr:N \c@equation } -% \end{macrocode} -% -% We store in |\g_tmpa_tl| the tag we will have to compose at the end of the -% line. We use a global variable because we will use it in the \emph{next} cell -% (after the |&|). -% \begin{macrocode} - \cs_gset:Npx \g_tmpa_tl - { \tl_if_empty:NTF \l_@@_tag_tl \theequation \l_@@_tag_tl } -% \end{macrocode} -% It's possible to put several labels for the same line (it's not possible in -% the environments of \pkg{amsmath}). That's why the differents labels of a same -% line are stored in a sequence |\l_@@_labels_seq|. -% \begin{macrocode} - \seq_if_empty:NF \l_@@_labels_seq - { -% \end{macrocode} -% Now, we do the job done by |\refstepcounter| and by the redefinitions of -% |\refstepcounter| done by some packages (the incrementation of the counter has -% been done yet). -% -% First an action which is in the definition of |\refstepcounter|. The command -% |\p@equation| is redefined by some extensions like \pkg{fncylab}. -% \begin{macrocode} - \cs_set:Npx \@currentlabel { \p@equation \g_tmpa_tl } -% \end{macrocode} -% Then, an action done by \pkg{hyperref} in its redefinition of -% |\refstepcounter|. -% \begin{macrocode} - \bool_if:NT \c_@@_hyperref_loaded_bool - { - \str_set:Nn \This@name { equation } - \hyper@refstepcounter { equation } - } -% \end{macrocode} -% Then, an action done by \pkg{cleveref} in its redefinition of -% |\refstepcounter|. The package \pkg{cleveref} creates in the |aux| file a -% command |\cref@currentlabel| similar to |\@currentlabel| but with more -% informations. -% \begin{macrocode} - \bool_if:NT \c_@@_cleveref_loaded_bool - { - \cref@constructprefix { equation } \cref@result - \protected@edef \cref@currentlabel - { - [ - \cs_if_exist:NTF \cref@equation@alias - \cref@equation@alias - { equation } - ] - [ \arabic { equation } ] [ \cref@result ] - \p@equation \g_tmpa_tl - } - } -% \end{macrocode} -% Now, we can issue the command |\label| (some packages may have redefined -% |\label|, for example \pkg{typedref}) for each item in the sequence of the -% labels (it's possible with \pkg{witharrows} to put several labels to the same -% line and that's why the labels are in the sequence |\l_@@_labels_seq|). -% \begin{macrocode} - \seq_map_function:NN \l_@@_labels_seq \@@_old_label - } -% \end{macrocode} -% We save the booleans |\l_@@_tag_star_bool| and |\l_@@_qedhere_bool| because -% they will be used in the \emph{next} cell (after the |&|). We recall that the -% cells of a |\halign| are TeX groups. -% \begin{macrocode} - \@@_save:N \l_@@_tag_star_bool - \@@_save:N \l_@@_qedhere_bool - \bool_if:NT \l_@@_tag_next_line_bool - { - \openup -\jot - \bool_set_false:N \l_@@_tag_next_line_bool - \notag \\ & - } - & - \@@_restore:N \l_@@_tag_star_bool - \@@_restore:N \l_@@_qedhere_bool - \bool_if:NT \l_@@_qedhere_bool - { \hbox_overlap_left:n \@@_qedhere_i: } - \cs_set_eq:NN \theequation \g_tmpa_tl - \bool_if:NT \l_@@_tag_star_bool - { \cs_set_eq:NN \tagform@ \prg_do_nothing: } -% \end{macrocode} -% We use |\@eqnnum| (we recall that there are two definitions of |\@eqnnum|, a -% standard definition and another, loaded if the class option |leqno| is used). -% However, of course, the position of the |v|-node is not the same whether the -% option |leqno| is used or not. That's here that we use the flag -% |\c_@@_leqno_bool|. -% \begin{macrocode} - \hbox_overlap_left:n - { - \bool_if:NF \c_@@_leqno_bool - { - \tikz [ @@_standard ] - \coordinate ( \int_use:N \g_@@_line_int - v ) ; - } - \quad - \@eqnnum - } - \bool_if:NT \c_@@_leqno_bool - { - \tikz [ @@_standard ] - \coordinate ( \int_use:N \g_@@_line_int - v ) ; - } - } - { - \@@_save:N \l_@@_qedhere_bool - & - \@@_restore:N \l_@@_qedhere_bool - \bool_if:NT \l_@@_qedhere_bool - { \hbox_overlap_left:n \@@_qedhere_i: } - \tikz [ @@_standard ] - \coordinate ( \int_use:N \g_@@_line_int - v ) ; - } - } - \dim_compare:nNnT { #1 } < \c_zero_dim - { \@@_error:n { option~of~cr~negative } } - \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim } - \cr - \noalign - { - \skip_vertical:n { \l_tmpa_dim + \l_@@_interline_skip } - \scan_stop: - } - } -% \end{macrocode} -% According to the documentation of \pkg{expl3}, the previous addition in -% ``|#1 + \l_@@_interline_skip|'' is really an addition of skips (=glues). -% -% -% The following command will be used when, after a |\\| (and its optional -% arguments) there is a |\end|. You want to known if this is the end of the -% environment |{WithArrows}| (or |{DispWithArrows}|, etc.) because, in this -% case, we will explain that the environment must not be ended by |\\|. If it is -% not the case, that means it's a classical situation of LaTeX environments not -% correctly imbricated and there will be a LaTeX error. -% \begin{macrocode} -\cs_new_protected:Npn \@@_analyze_end:Nn #1 #2 - { - \exp_args:NV \str_if_eq:nnT \l_@@_type_env_str { #2 } - { \@@_warning:n { newline~at~the~end~of~env } } -% \end{macrocode} -% We reput in the stream the |\end{...}| we have extracted. -% \begin{macrocode} - \end { #2 } - } -% \end{macrocode} -% -% \bigskip -% \subsubsection{The environment \{DispWithArrows\}} -% -% For the environment |{DispWithArrows}|, the general form of the construction -% is of the type: -% -% |\[\vtop{\halign to \displaywidth {...}}\]| -% -% The purpose of the |\vtop| is to have an environment unbreakable. -% -% However, if we are juste after an item of a LaTeX list or at the beginning of -% a |{minipage}|, the construction is slightly different: -% -% |\[\vtop{\halign to \linewidth {...}}\]| -% -% -% \bigskip -% The boolean |\l_@@_in_label_or_minipage_bool| will be raised if we are just after a |\item| -% of a list of LaTeX or at the beginning of a |{minipage}|. -% \begin{macrocode} -\bool_new:N \l_@@_in_label_or_minipage_bool -% \end{macrocode} -% -% -% \begin{macrocode} -\NewDocumentEnvironment { DispWithArrows } { ! d < > ! O { } } - { - \bool_set_true:N \l_@@_in_DispWithArrows_bool -% \end{macrocode} -% If \pkg{mathtools} has been loaded with the option |showonlyrefs|, we disable -% the code of \pkg{mathtools} for the option |showonlyrefs| with the command -% |\MT_showonlyrefs_false:| (it will be reactivated at the end of the -% environment). -% \begin{macrocode} - \bool_if:nT \c_@@_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \MT_showonlyrefs_false: -% \end{macrocode} -% However, we have to re-raise the flag |{show_only_refs}| of \pkg{mhsetup} -% because it has been switched off by |\MT_showonlyrefs_false:| and we will use -% it in the code of the new version of |\label|. -% \begin{macrocode} - \MH_set_boolean_T:n { show_only_refs } - } - } -% \end{macrocode} -% -% An action done by \pkg{typedref} in its redefinition of |\refstepcounter|. The -% command |\sr@name| is a prefix added to the name of the label by the -% redefinition of |\label| done by \pkg{typedref}. -% \begin{macrocode} - \bool_if:NT \c_@@_typedref_loaded_bool { \str_set:Nn \sr@name { equation } } -% \end{macrocode} -% -% The command |\intertext@| is a command of \pkg{amsmath} which loads the -% definition of |\intertext|. -% \begin{macrocode} - \bool_if:NT \c_@@_amsmath_loaded_bool \intertext@ - \IfValueT { #1 } { \tl_set:Nn \l_@@_left_brace_tl { #1 } } - \@@_pre_halign:n { #2 } -% \end{macrocode} -% -% If |subequations| is used, we encapsulate the environment in an -% environment |{subequations}| of \pkg{amsmath}. -% \begin{macrocode} - \bool_if:NT \l_@@_subequations_bool { \begin { subequations } } -% \end{macrocode} -% Since the version 1.16 of \pkg{witharrows}, no space is added between an -% |\item| of a LaTeX list and an environment |{DispWithArrows}| except with the -% option |standard-behaviour-with-items| stored in the boolean -% |\l_@@_sbwi_bool|. We have to know if we are just after an |\item| and this -% information will be stored in |\l_@@_in_label_or_minipage_bool|. -% \begin{macrocode} - \bool_if:NF \l_@@_sbwi_bool - { - \if@inlabel - \bool_set_true:N \l_@@_in_label_or_minipage_bool - \fi - \if@minipage - \bool_set_true:N \l_@@_in_label_or_minipage_bool - \fi - } -% \end{macrocode} -% -% -% \begin{macrocode} - \tl_if_eq:NNF \l_@@_left_brace_tl \c_novalue_tl - { - \hbox_set:Nn \l_tmpa_box - { - \c_math_toggle_token - \left \l_@@_replace_left_brace_by_tl \vcenter to 1 cm { } \right. - \c_math_toggle_token - } - \dim_zero_new:N \l_@@_delim_wd_dim - \dim_set:Nn \l_@@_delim_wd_dim { \box_wd:N \l_tmpa_box } - \box_clear_new:N \l_@@_left_brace_box - \hbox_set:Nn \l_@@_left_brace_box - { - \group_begin: - \cs_set_eq:NN \label \@@_old_label - \c_math_toggle_token - \bool_if:NT \l_@@_displaystyle_bool \displaystyle - \l_@@_left_brace_tl - { } - \c_math_toggle_token - \group_end: - } - } -% \end{macrocode} -% -% \bigskip -% The token list |\l_@@_tag_tl| will contain the argument of the command |\tag|. -% \begin{macrocode} - \tl_clear_new:N \l_@@_tag_tl -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} - \bool_set_false:N \l_@@_qedhere_bool -% \end{macrocode} -% -% \bigskip -% The boolean |\l_@@_tag_star_bool| will be raised if the user uses the command -% |\tag| with a star. -% \begin{macrocode} - \bool_set_false:N \l_@@_tag_star_bool -% \end{macrocode} -% -% \begin{macrocode} - \if_mode_math: - \@@_fatal:n { DispWithArrows~in~math~mode } - \fi: -% \end{macrocode} -% -% \bigskip -% The construction is not exactly the same whether we are just after an |\item| -% of a LaTeX list or not. We know if we are after an |\item| thanks to the -% boolean |\l_@@_in_label_or_minipage_bool|. -% \begin{macrocode} - \bool_if:NTF \l_@@_in_label_or_minipage_bool - { \c_math_toggle_token } - { -% \end{macrocode} -% We don't use |\[| of LaTeX because some extensions, like \pkg{autonum}, do a -% redefinition of |\[|. However, we put the following lines which are in the -% definition of |\[| even though they are in case of misuse. -% \begin{macrocode} - \if_mode_vertical: - \nointerlineskip - \hbox_to_wd:nn { .6 \linewidth } { } - \fi: - \c_math_toggle_token \c_math_toggle_token - } -% \end{macrocode} -% -% \begin{macrocode} - \dim_zero_new:N \l_@@_linewidth_dim - \bool_if:NTF \l_@@_in_label_or_minipage_bool - { \dim_set_eq:NN \l_@@_linewidth_dim \linewidth } - { \dim_set_eq:NN \l_@@_linewidth_dim \displaywidth } -% \end{macrocode} -% -% -% \begin{macrocode} - \box_clear_new:N \l_@@_halign_box - \setbox \l_@@_halign_box \vtop \bgroup - \tabskip = - \bool_if:NTF \l_@@_fleqn_bool - \c_zero_skip - { 0 pt plus 1000 pt minus 1000 pt } -% \end{macrocode} -% -% -% \begin{macrocode} - \@@_construct_halign: - \tabskip = 0 pt plus 1000 pt minus 1000 pt - & -% \end{macrocode} -% -% If the user tries to use more columns than the length of the format, we have to -% raise an error. However, the error won't be in the next column which is the -% columns for the labels of the equations. The error will be after... and it -% must be after. That means that we must not have an error in the next column -% simply because we are not in math mode. That's why this column, even if it is -% for the labels, is in math mode. -% \begin{macrocode} - $ ## $ - \tabskip = \c_zero_skip - && - \@@_fatal:n { Too~much~columns~in~DispWithArrows } - \bool_if:nT \c_false_bool { ## } - \cr - } -% \end{macrocode} -% -% \bigskip -% We begin the second part of the environment |{DispWithArrows}|. -% \begin{macrocode} - { - \clist_if_in:NnT \l_@@_tags_clist { last } - { \clist_set:Nn \l_@@_tags_clist { all } } - \\ -% \end{macrocode} -% The following |\egroup| is for the |\halign|. -% \begin{macrocode} - \egroup - \unskip \unpenalty \unskip \unpenalty - \box_set_to_last:N \l_tmpa_box - \nointerlineskip - \box_use:N \l_tmpa_box - \dim_gzero_new:N \g_@@_alignment_dim - \dim_gset:Nn \g_@@_alignment_dim { \box_wd:N \l_tmpa_box } - \box_clear_new:N \l_@@_new_box - \hbox_set:Nn \l_@@_new_box { \hbox_unpack_clear:N \l_tmpa_box } - \dim_compare:nNnT - { \box_wd:N \l_@@_new_box } < \g_@@_alignment_dim - { \dim_gset:Nn \g_@@_alignment_dim { \box_wd:N \l_@@_new_box } } -% \end{macrocode} -% The |\egroup| is for the box |\l_@@_halign_box|. -% \begin{macrocode} - \egroup -% \end{macrocode} -% -% \begin{macrocode} - \tl_if_eq:NNTF \l_@@_left_brace_tl \c_novalue_tl - { \box_use_drop:N \l_@@_halign_box } - { - \hbox_to_wd:nn \l_@@_linewidth_dim - { - \bool_if:NTF \l_@@_fleqn_bool - { \skip_horizontal:n \l_@@_mathindent_dim } - \hfil - \hbox_to_wd:nn \g_@@_alignment_dim - { - \box_use_drop:N \l_@@_left_brace_box - \dim_set:Nn \l_tmpa_dim - { - \box_ht:N \l_@@_halign_box - + \box_dp:N \l_@@_halign_box - } - \c_math_toggle_token - \left \l_@@_replace_left_brace_by_tl - \vcenter to \l_tmpa_dim { \vfil } - \right. - \c_math_toggle_token - \hfil - } - \hfil - } - \skip_horizontal:n { - \l_@@_linewidth_dim } - \vcenter { \box_use_drop:N \l_@@_halign_box } - } -% \end{macrocode} -% -% We compute the dimension |\g_@@_right_x_dim|. As a first approximation, -% |\g_@@_right_x_dim| is the $x$-value of the right side of the current -% composition box. In fact, we must take into account the potential labels of -% the equations. That's why we compute |\g_@@_right_x_dim| with the |v|-nodes of -% each row specifically built in this goal. |\g_@@_right_x_dim| is the minimal -% value of the $x$-value of these nodes. -% \begin{macrocode} - \dim_gzero_new:N \g_@@_right_x_dim - \dim_gset_eq:NN \g_@@_right_x_dim \c_max_dim - \begin { tikzpicture } [ @@_standard ] - \int_step_variable:nNn \g_@@_line_int \l_tmpa_int - { - \cs_if_free:cTF - { pgf@sh@ns@wa - \l_@@_prefix_str - \l_tmpa_int - v } - { \@@_fatal:n { Inexistent~v-node } } - { - \tikz@parse@node\pgfutil@firstofone ( \l_tmpa_int - v ) - \dim_set:Nn \l_tmpa_dim \pgf@x - \dim_compare:nNnT \l_tmpa_dim < \g_@@_right_x_dim - { \dim_gset:Nn \g_@@_right_x_dim \l_tmpa_dim } - } - } - \end { tikzpicture } -% \end{macrocode} -% -% -% \bigskip -% The code in |\@@_post_halign:| is common to |{WithArrows}| and -% |{DispWithArrows}|. -% \begin{macrocode} - \@@_post_halign: -% \end{macrocode} -% If \pkg{mathtools} has been loaded with the option |showonlyrefs|, we -% reactivate the code of \pkg{mathtools} for the option |showonlyrefs| with the -% command |\MT_showonlyrefs_true:| (it has been deactivated in the beginning of -% the environment). -% \begin{macrocode} - \bool_if:nT \c_@@_mathtools_loaded_bool - { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: } - \bool_if:NTF \l_@@_in_label_or_minipage_bool - { - \c_math_toggle_token - \skip_vertical:N \belowdisplayskip - } - { \c_math_toggle_token \c_math_toggle_token } -% \end{macrocode} -% -% \begin{macrocode} - \bool_if:NT \l_@@_subequations_bool { \end { subequations } } -% \end{macrocode} -% -% \bigskip -% If the option |footnote| or the option |footnotehyper| is used, then we -% extract the footnotes with an environment |{savenotes}| (of the package -% \pkg{footnote} or the package \pkg{footnotehyper}). -% \begin{macrocode} - \bool_if:NT \g_@@_footnote_bool { \end { savenotes } } - \ignorespacesafterend - } -% \end{macrocode} -% -% \bigskip -% With the environment |{DispWithArrows*}|, the equations are not numbered. We -% don't put |\begin{DispWithArrows}| and |\end{DispWithArrows}| because there is -% a |\@currenvir| in some error messages. -% \begin{macrocode} -\NewDocumentEnvironment { DispWithArrows* } { } - { - \WithArrowsOptions { notag } - \DispWithArrows - } - \endDispWithArrows -% \end{macrocode} -% -% -% \bigskip -% \subsection{The commands \textbackslash tag, \textbackslash notag, -% \textbackslash label, \textbackslash tagnextline and \textbackslash qedhere for -% \{DispWithArrows\}} -% -% Some commands are allowed only in the last column of the environment -% |{DispWithArrows}|. We write a command |\@@_if_in_last_col_of_disp:Nn| to -% execute this command only if we are in the last column. If we are in -% another column, an error is raised. The first argument of -% |\@@_if_in_last_col_of_disp:Nn| is the name of the command used in the error -% message and the second is the code to execute. -% \begin{macrocode} -\cs_new_protected:Npn \@@_if_in_last_col_of_disp:Nn #1 #2 - { - \bool_if:NTF \l_@@_in_WithArrows_bool - { \@@_error:nn { Not~allowed~in~WithArrows } { #1 } } - { - \int_compare:nNnTF \g_@@_col_int < \l_@@_nb_cols_int - { \@@_error:nn { Not~allowed~in~DispWithArrows } { #1 } } - { #2 } - } - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_notag:| will be linked to the command |\notag| and also to -% in the environments |{WithArrows}| and |{DispWithArrows}|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_notag: - { \@@_if_in_last_col_of_disp:Nn \notag { \clist_clear:N \l_@@_tags_clist } } -% \end{macrocode} -% -% \bigskip -% The command |\@@_nonumber:| will be linked to the command |\nonumber| and also to -% in the environments |{WithArrows}| and |{DispWithArrows}|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_nonumber: - { \@@_if_in_last_col_of_disp:Nn \nonumber { \clist_clear:N \l_@@_tags_clist } } -% \end{macrocode} -% -% \bigskip -% The command |\@@_tag| will be linked to |\tag| in |{WithArrows}| and -% |{DispWithArrows}|. We do the definition with |\NewDocumentCommand| because this -% command has a starred version. -% \begin{macrocode} -\NewDocumentCommand \@@_tag { s m } - { - \@@_if_in_last_col_of_disp:Nn \tag - { - \tl_if_empty:NF \l_@@_tag_tl - { \@@_error:nn { Multiple~tags } { #2 } } - \clist_set:Nn \l_@@_tags_clist { all } - \bool_if:nT \c_@@_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \MH_if_boolean:nF { show_manual_tags } - { \clist_clear:N \l_@@_tags_clist } - } - } - \tl_set:Nn \l_@@_tag_tl { #2 } - \bool_set:Nn \l_@@_tag_star_bool { #1 } -% \end{macrocode} -% The starred version |\tag*| can't be used if \pkg{amsmath} has not been loaded -% because this version does the job by deactivating the command |\tagform@| -% inserted by \pkg{amsmath} in the (two versions of the) command -% |\@eqnnum|.\footnote{There are two versions of |@eqnnum|, a standard version -% and a version for the option |leqno|.} -% \begin{macrocode} - \bool_if:nT { #1 && ! \bool_if_p:N \c_@@_amsmath_loaded_bool } - { \@@_error:n { tag*~without~amsmath } } - } - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_label:n| will be linked to |\label| in the environments -% |{WithArrows}| and |{DispWithArrows}|. In these environments, it's possible to -% put several labels for the same line (it's not possible in the environments of -% \pkg{amsmath}). That's why we store the differents labels of a same line in a -% sequence |\l_@@_labels_seq|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_label:n #1 - { - \@@_if_in_last_col_of_disp:Nn \label - { - \seq_if_empty:NF \l_@@_labels_seq - { - \bool_if:NTF \c_@@_cleveref_loaded_bool - { \@@_error:n { Multiple~labels~with~cleveref } } - { \@@_error:n { Multiple~labels } } - } - \seq_put_right:Nn \l_@@_labels_seq { #1 } - \bool_if:nT \c_@@_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \cs_if_exist:cTF { MT_r_#1 } - { \clist_set:Nn \l_@@_tags_clist { all } } - { \clist_clear:N \l_@@_tags_clist } - } - } - \bool_if:nT \c_@@_autonum_loaded_bool - { - \cs_if_exist:cTF { autonum@#1Referenced } - { \clist_set:Nn \l_@@_tags_clist { all } } - { \clist_clear:N \l_@@_tags_clist } - } - } - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_tagnextline:| will be linked to |\tagnextline| in -% |{DispWithArrows}|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_tagnextline: - { - \@@_if_in_last_col_of_disp:Nn \tagnextline - { \bool_set_true:N \l_@@_tag_next_line_bool } - } -% \end{macrocode} -% -% -% \bigskip -% The environments |{DispWithArrows}| and |{DispWithArrows*}| are compliant with -% the command |\qedhere| of \pkg{amsthm}. However, this compatibility requires a -% special version of |\qedhere|. -% -% This special version is called |\@@_qedhere:| and will be linked with -% |\qedhere| in the last column of the environment |{DispWithArrows}| (only if -% the package \pkg{amsthm} has been loaded). |\@@_qedhere:| raises the boolean -% |\l_@@_qedhere_bool|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_qedhere: { \bool_set_true:N \l_@@_qedhere_bool } -\cs_new_protected:Npn \@@_set_qedhere: { \cs_set_eq:NN \qedhere \@@_qedhere: } -% \end{macrocode} -% -% In the last column of the |\halign| of |{DispWithArrows}| (column of the -% labels, that is to say the numbers of the equations), a command -% |\@@_qedhere_i:| will be issued if the flag |\l_@@_qedhere_bool| has been -% raised. The code of this command is an adaptation of the code of |\qedhere| in -% \pkg{amsthm}. -% \begin{macrocode} -\cs_new_protected:Npn \@@_qedhere_i: - { - \group_begin: - \cs_set_eq:NN \qed \qedsymbol -% \end{macrocode} -% The line |\cs_set_eq:NN \qed@elt \setQED@elt| is a preparation for an action -% on the \textsc{qed} stack. Despite its form, the instruction |\QED@stack| -% executes an operation on the stack. This operation prints the \textsc{qed} -% symbol and nullify the top of the stack. -% \begin{macrocode} - \cs_set_eq:NN \qed@elt \setQED@elt - \QED@stack \relax \relax - \group_end: - } -% \end{macrocode} -% -% -% -% -% \subsection{We draw the arrows} -% -% \bigskip -% The arrows are divided in groups. There is two reasons for this division. -% \begin{itemize} -% \item If the option |group| or the option |groups| is used, all the arrows of -% a group are drawn on a same vertical at an abscissa of |\l_@@_x_dim|. -% \item For aesthetic reasons, the starting point of all the starting arrows of -% a group is raised upwards by the value |\l_@@_start_adjust_dim|. Idem for the -% ending arrows. -% \end{itemize} -% -% \medskip -% If the option |group| is used (|\l_@@_pos_arrow_int| = 7), we scan the arrows -% twice: in the first step we only compute the value of |\l_@@_x_dim| for the -% whole group, and, in the second step (|\l_@@_pos_arrow_int| is set to 8), we -% divide the arrows in groups (for the vertical adjustement) and we actually -% draw the arrows. -% \begin{macrocode} -\cs_new_protected:Npn \@@_scan_arrows: - { - \group_begin: - \int_compare:nNnT \l_@@_pos_arrow_int = 7 - { - \@@_scan_arrows_i: - \int_set:Nn \l_@@_pos_arrow_int 8 - } - \@@_scan_arrows_i: - \group_end: - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\cs_new_protected:Npn \@@_scan_arrows_i: - { -% \end{macrocode} -% -% \bigskip -% |\l_@@_first_arrow_of_group_int| will be the first arrow of the current group. -% -% |\l_@@_first_line_of_group_int| will be the first line involved in the group -% of arrows (equal to the initial line of the first arrow of the group because -% the option |jump| is always positive). -% -% |\l_@@_first_arrows_seq| will be the list the arrows of the group starting at -% the first line of the group (we may have several arrows starting from the same -% line). We have to know all these arrows because of the adjustement by -% |\l_@@_start_adjust_dim|. -% -% |\l_@@_last_line_of_group_int| will be the last line involved in the group -% (impossible to guess in advance). -% -% |\l_@@_last_arrows_seq| will be the list of all the arrows of the group -% ending at the last line of the group (impossible to guess in advance). -% \begin{macrocode} - \int_zero_new:N \l_@@_first_arrow_of_group_int - \int_zero_new:N \l_@@_first_line_of_group_int - \int_zero_new:N \l_@@_last_line_of_group_int - \seq_clear_new:N \l_@@_first_arrows_seq - \seq_clear_new:N \l_@@_last_arrows_seq -% \end{macrocode} -% -% \medskip -% The boolean |\l_@@_new_group_bool| is a switch that we will use the indicate -% that a group is finished (and the lines of that group have to be drawn). This -% boolean is not directed connected to the option |new-group| of an individual -% arrow. -% \begin{macrocode} - \bool_set_true:N \l_@@_new_group_bool -% \end{macrocode} -% -% \bigskip -% We begin a loop over all the arrows of the environment. Inside this loop, if a -% group is finished, we will draw the arrows of that group. -% \begin{macrocode} - \int_set:Nn \l_@@_arrow_int \c_one_int - \int_until_do:nNnn \l_@@_arrow_int > \g_@@_arrow_int - { -% \end{macrocode} -% -% \bigskip -% We extract from the property list of the current arrow the fields ``initial'', -% ``final'', ``status'' and ``input-line''. For the two former, we have to do -% conversions to integers. -% \begin{macrocode} - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { initial } \l_tmpa_tl - \int_set:Nn \l_@@_initial_int \l_tmpa_tl - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { final } \l_tmpa_tl - \int_set:Nn \l_@@_final_int \l_tmpa_tl - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { status } \l_@@_status_arrow_str - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { input-line } \l_@@_input_line_str -% \end{macrocode} -% -% \bigskip -% We recall that, after the construction of the |\halign|, |\g_@@_line_int| is -% the total number of lines of the environment. Therefore, the conditionnal -% |\l_@@_final_int > \g_@@_line_int| tests whether an arrow arrives after the -% last line of the environment. In this case, we raise an error (except in the -% second step of treatment for the option |group|). The arrow will be completely -% ignored, even for the computation of |\l_@@_x_dim|. -% \begin{macrocode} - \int_compare:nNnTF \l_@@_final_int > \g_@@_line_int - { - \int_compare:nNnF \l_@@_pos_arrow_int = 8 - { \@@_error:n { Too~few~lines~for~an~arrow } } - } - \@@_code_for_possible_arrow: -% \end{macrocode} -% -% \bigskip -% Incrementation of the index of the loop (and end of the loop). -% \begin{macrocode} - \int_incr:N \l_@@_arrow_int - } -% \end{macrocode} -% -% \bigskip -% After the last arrow of the environment, we have to draw the last group of -% arrows. If we are in option |group| and in the first step of treatment -% (|\l_@@_pos_arrow_int| = 7), we don't draw because, in the first step, we -% don't draw anything. If there is no arrow in the group, we don't draw (this -% situation occurs when all the arrows of the potential group arrive after the -% last line of the environment). -% \begin{macrocode} - \bool_if:nT - { - \int_compare_p:n { \l_@@_pos_arrow_int != 7 } - && - \int_compare_p:nNn \l_@@_first_arrow_of_group_int > 0 - } - { \@@_draw_arrows:nn \l_@@_first_arrow_of_group_int \g_@@_arrow_int } - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\cs_new_protected:Npn \@@_code_for_possible_arrow: - { -% \end{macrocode} -% We test whether the previous arrow was in fact the last arrow of a group. In -% this case, we have to draw all the arrows of that group, except if we are with -% the option |group| and in the first step of treatment (|\l_@@_pos_arrow_int| = -% 7). -% \begin{macrocode} - \bool_if:nT - { - \int_compare_p:nNn \l_@@_arrow_int > \c_one_int - && - ( \int_compare_p:n { \l_@@_initial_int > \l_@@_last_line_of_group_int } - && - \int_compare_p:n { \l_@@_pos_arrow_int != 7 } - || - \str_if_eq_p:Vn \l_@@_status_arrow_str { new-group } - ) - } - { - \int_compare:nNnF \l_@@_first_arrow_of_group_int = \c_zero_int - { - \@@_draw_arrows:nn - \l_@@_first_arrow_of_group_int - { \l_@@_arrow_int - 1 } - } - \bool_set_true:N \l_@@_new_group_bool - } -% \end{macrocode} -% -% \bigskip -% The flag |\l_@@_new_group_bool| indicates if we have to begin a new group of -% arrows. In fact, we have to begin a new group in three circonstancies: if we -% are at the first arrow of the environment (that's why the flag is raised -% before the beginning of the loop), if we have just finished a group (that's -% why the flag is raised in the previous conditionnal, for topological reasons -% or if the previous arrows had the status ``new-group''). At the beginning of a -% group, we have to initialize the following variables: |\l_@@_first_arrow_int|, -% |\l_@@_first_line_of_group_int|, |\l_@@_last_line_of_group|, -% |\l_@@_first_arrows_seq|, |\l_@@_last_arrows_seq|. -% -% \begin{macrocode} - \bool_if:nTF \l_@@_new_group_bool - { - \bool_set_false:N \l_@@_new_group_bool - \int_set_eq:NN \l_@@_first_arrow_of_group_int \l_@@_arrow_int - \int_set_eq:NN \l_@@_first_line_of_group_int \l_@@_initial_int - \int_set_eq:NN \l_@@_last_line_of_group_int \l_@@_final_int - \seq_clear:N \l_@@_first_arrows_seq - \seq_put_left:NV \l_@@_first_arrows_seq \l_@@_arrow_int - \seq_clear:N \l_@@_last_arrows_seq - \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int -% \end{macrocode} -% -% If we are in option |group| and in the second step of treatment -% (|\l_@@_pos_arrow_int| = 8), we don't initialize |\l_@@_x_dim| because we want -% to use the same value of |\l_@@_x_dim| (computed during the first step) for -% all the groups. -% \begin{macrocode} - \int_compare:nT { \l_@@_pos_arrow_int != 8 } - { \dim_set:Nn \l_@@_x_dim { - \c_max_dim } } - } -% \end{macrocode} -% -% \bigskip -% If we are not at the beginning of a new group. -% \begin{macrocode} - { -% \end{macrocode} -% -% If the arrow is independent, we don't take into account this arrow for the -% detection of the end of the group. -% \begin{macrocode} - \bool_if:nF - { \str_if_eq_p:Vn \l_@@_status_arrow_str { independent } } - { -% \end{macrocode} -% If the arrow is not independant, the arrow belongs to the current group and we -% have to take it into account in some variables. -% \begin{macrocode} - \int_compare:nT - { \l_@@_initial_int = \l_@@_first_line_of_group_int } - { \seq_put_left:NV \l_@@_first_arrows_seq \l_@@_arrow_int } - \int_compare:nNnTF \l_@@_final_int > \l_@@_last_line_of_group_int - { - \int_set_eq:NN \l_@@_last_line_of_group_int \l_@@_final_int - \seq_clear:N \l_@@_last_arrows_seq - \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int - } - { - \int_compare:nNnT \l_@@_final_int = \l_@@_last_line_of_group_int - { \seq_put_left:NV \l_@@_last_arrows_seq \l_@@_arrow_int } - } - } - } -% \end{macrocode} -% -% \bigskip -% If the arrow is not independent, we update the current $x$-value (in -% |\l_@@_x_dim|) with the dedicated command |\@@_update_x:nn|. If we are -% in option |group| and in the second step of treatment (|\l_@@_pos_arrow_int| = -% 8), we don't initialize |\l_@@_x_dim| because we want to use the same value of -% |\l_@@_x_dim| (computed during the first step) for all the groups. -% \begin{macrocode} - \bool_if:nF { \str_if_eq_p:Vn \l_@@_status_arrow_str { independent } } - { - \int_compare:nT { \l_@@_pos_arrow_int != 8 } - { \@@_update_x:nn \l_@@_initial_int \l_@@_final_int } - } - } -% \end{macrocode} -% -% -% \bigskip -% The following code is necessary because we will have to expand an argument -% exactly 3 times. -% \begin{macrocode} -\cs_generate_variant:Nn \keys_set:nn { n o } -\cs_new_protected:Npn \@@_keys_set: - { \keys_set_known:no { WithArrows / Arrow / SecondPass } } -% \end{macrocode} -% -% \bigskip -% The macro |\@@_draw_arrows:nn| draws all the arrows whose numbers are between -% |#1| and |#2|. |#1| and |#2| must be expressions that expands to an integer -% (they are expanded in the beginning of the macro). This macro is nullified by -% the option |no-arrows|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_draw_arrows:nn #1 #2 - { - \group_begin: - \int_zero_new:N \l_@@_first_arrow_int - \int_set:Nn \l_@@_first_arrow_int { #1 } - \int_zero_new:N \l_@@_last_arrow_int - \int_set:Nn \l_@@_last_arrow_int { #2 } -% \end{macrocode} -% -% \bigskip -% We begin a loop over the arrows we have to draw. The variable -% |\l_@@_arrow_int| (local in the environment |{WithArrows}|) will be used as -% index for the loop. -% \begin{macrocode} - \int_set:Nn \l_@@_arrow_int \l_@@_first_arrow_int - \int_until_do:nNnn \l_@@_arrow_int > \l_@@_last_arrow_int - { -% \end{macrocode} -% -% \bigskip -% We extract from the property list of the current arrow the fields ``initial'' -% and ``final'' and we store these values in |\l_@@_initial_int| and -% |\l_@@_final_int|. However, we have to do a conversion because the components -% of a property list are token lists. -% \begin{macrocode} - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { initial } \l_tmpa_tl - \int_set:Nn \l_@@_initial_int \l_tmpa_tl - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { final } \l_tmpa_tl - \int_set:Nn \l_@@_final_int \l_tmpa_tl -% \end{macrocode} -% -% \bigskip -% If the arrow ends after the last line of the environment, we don't draw the -% arrow (an error has already been raised in |\@@_scan_arrows:|). We recall -% that, after the construction of the |\halign|, |\g_@@_line_int| is the total -% number of lines of the environment). -% \begin{macrocode} - \int_compare:nT { \l_@@_final_int <= \g_@@_line_int } \@@_draw_arrows_i: - \int_incr:N \l_@@_arrow_int - } - \group_end: - } -% \end{macrocode} -% -% \bigskip -% The macro |\@@_draw_arrows_i:| is only for the lisibility of the code. The -% first |\group_begin:| is for the options of the arrows (but we remind that the -% options |ll|, |rr|, |rl|, |lr|, |i| and |jump| have already been extracted and -% are not present in the field |options| of the property list of the arrow). -% \begin{macrocode} -\cs_new_protected:Npn \@@_draw_arrows_i: - { - \group_begin: -% \end{macrocode} -% -% \bigskip -% We process the options of the current arrow. The second argument of -% |\keys_set:nn| must be expanded exactly three times. An x-expansion is not -% possible because there can be tokens like |\bfseries| in the option |font| of -% the option |tikz|. This expansion is a bit tricky. -% \begin{macrocode} - \prop_get:cnN - { g_@@_arrow _\l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { options } \l_tmpa_tl - \str_clear_new:N \l_@@_previous_key_str - \exp_args:NNo \exp_args:No - \@@_keys_set: { \l_tmpa_tl , tikz = { xshift = \l_@@_xoffset_dim } } -% \end{macrocode} -% -% We create two booleans to indicate the position of the initial node and final -% node of the arrow in cases of options |rr|, |rl|, |lr| or |ll|: -% \begin{macrocode} - \bool_set_false:N \l_@@_initial_r_bool - \bool_set_false:N \l_@@_final_r_bool - \int_case:nn \l_@@_pos_arrow_int - { - 0 { \bool_set_true:N \l_@@_final_r_bool } - 2 { \bool_set_true:N \l_@@_initial_r_bool } - 3 - { - \bool_set_true:N \l_@@_initial_r_bool - \bool_set_true:N \l_@@_final_r_bool - } - } -% \end{macrocode} -% -% \bigskip -% \begin{center} -% \begin{tabular}{l} -% \begin{tabular}{@{}l*8c@{}} -% \toprule -% option & |lr| & |ll| & |rl| & |rr| & |v| & |i| & |groups| & |group| \\ -% \midrule -% |\l_@@_pos_arrow_int| & $0$ & $1$ & $2$ & $3$ & $4$ & $5$ & $6$ & $7$ \\ -% \bottomrule -% \end{tabular} \\ -% \footnotesize The option |v| can be used only in |\Arrow| in |code-after| (see -% below). -% \end{tabular} -% \end{center} -% -% \bigskip -% In case of option |i| at a local or global level (|\l_@@_pos_arrow_int| = 5), -% we have to compute the $x$-value of the arrow (which is vertical). The -% computed $x$-value is stored in |\l_@@_x_dim| (the same variable used when the -% option |group| or the option |groups| is used). -% \begin{macrocode} - \int_compare:nNnT \l_@@_pos_arrow_int = 5 - { - \dim_set:Nn \l_@@_x_dim { - \c_max_dim } - \@@_update_x:nn \l_@@_initial_int \l_@@_final_int - } -% \end{macrocode} -% -% \bigskip -% |\l_@@_initial_tl| contains the name of the Tikz node from which the arrow -% starts (in normal cases... because with the option |i|, |group| and |groups|, -% the point will perhaps have another -% $x$-value --- but always the same $y$-value). Idem for |\l_@@_final_tl|. -% \begin{macrocode} - \tl_set:Nx \l_@@_initial_tl - { - \int_use:N \l_@@_initial_int - \bool_if:NTF \l_@@_initial_r_bool rl - .south - } - \tl_set:Nx \l_@@_final_tl - { \int_use:N \l_@@_final_int - \bool_if:NTF \l_@@_final_r_bool rl .north } -% \end{macrocode} -% We use ``|.south|'' and ``|.north|'' because we want a small gap between two -% consecutive arrows (and the Tikz nodes created have the shape of small -% vertical segments: use option |show-nodes| to visualize the nodes). -% -% \bigskip -% The label of the arrow will be stored in |\l_tmpa_tl|. -% \begin{macrocode} - \prop_get:cnN - { g_@@_arrow _ \l_@@_prefix_str _ \int_use:N \l_@@_arrow_int _ prop } - { label } - \l_tmpa_tl -% \end{macrocode} -% -% \bigskip -% Now, we have to know if the arrow starts at the first line of the group and/or -% ends at the last line of the group. That's the reason why we have stored in -% |\l_@@_first_arrows_seq| the list of all the arrows starting at the -% first line of the group and in |\l_@@_last_arrows_seq| the list of -% all the arrows ending at the last line of the group. We compute these values -% in the booleans |\l_tmpa_bool| and |\l_tmpb_bool|. These computations can't be -% done in the following |{tikzpicture}| because the command |\seq_if_in:NnTF| -% which is \emph{not} expandable. -% \begin{macrocode} - \seq_if_in:NxTF \l_@@_first_arrows_seq - { \int_use:N \l_@@_arrow_int } - { \bool_set_true:N \l_tmpa_bool } - { \bool_set_false:N \l_tmpa_bool } - \seq_if_in:NxTF \l_@@_last_arrows_seq - { \int_use:N \l_@@_arrow_int } - { \bool_set_true:N \l_tmpb_bool } - { \bool_set_false:N \l_tmpb_bool } - \int_compare:nNnT \l_@@_pos_arrow_int = 5 - { - \bool_set_true:N \l_tmpa_bool - \bool_set_true:N \l_tmpb_bool - } -% \end{macrocode} -% -% \bigskip -% We compute and store in |\g_tmpa_tl| and |\g_tmpb_tl| the exact coordinates of -% the extremities of the arrow. -% \begin{itemize} -% \item Concerning the -% $x$-values, the abscissa computed in |\l_@@_x_dim| will be used if the option -% of position is |i|, |group| or |groups|. -% \item Concerning the -% $y$-values, an adjustement is done for each arrow starting at the first line -% of the group and each arrow ending at the last line of the group (with the -% values of |\l_@@_start_adjust_dim| and |\l_@@_end_adjust_dim|). -% \end{itemize} -% -% \begin{macrocode} - \begin { tikzpicture } [ @@_standard ] - \tikz@scan@one@point \pgfutil@firstofone ( \l_@@_initial_tl ) - \tl_gset:Nx \g_tmpa_tl - { - \int_compare:nNnTF \l_@@_pos_arrow_int < 5 - { \dim_use:N \pgf@x } - { \dim_use:N \l_@@_x_dim } , - \bool_if:NTF \l_tmpa_bool - { \dim_eval:n { \pgf@y + \l_@@_start_adjust_dim } } - { \dim_use:N \pgf@y } - } - \tikz@scan@one@point \pgfutil@firstofone ( \l_@@_final_tl ) - \tl_gset:Nx \g_tmpb_tl - { - \int_compare:nNnTF \l_@@_pos_arrow_int < 5 - { \dim_use:N \pgf@x } - { \dim_use:N \l_@@_x_dim } , - \bool_if:NTF \l_tmpb_bool - { \dim_eval:n { \pgf@y - \l_@@_end_adjust_dim } } - { \dim_use:N \pgf@y } - } - \end { tikzpicture } -% \end{macrocode} -% -% \bigskip -% Eventually, we can draw the arrow with the code in |\l_@@_tikz_code_tl|. We -% recall that the value by default for this token list is :\enskip -% ``\verb|\draw (#1) to node {#3} (#2) ;|''. This value can be modified with the -% option |tikz-code|. We use the variant |\@@_draw_arrow:nno| of the macro -% |\@@_draw_arrow:nnn| because of the characters \emph{underscore} in the name -% |\l_tmpa_tl|: if the user uses the Tikz library |babel|, the third argument of -% the command |\@@_draw_arrow:nno| will be rescanned because this third argument -% will be in the argument of a command |node| of an instruction |\draw| of -% Tikz... and we will have an error because of the characters -% \emph{underscore}.\footnote{There were other solutions: use another name -% without \emph{underscore} (like \Verb|\ltmpatl|) or use the package -% \pkg{underscore} (with this package, the characters \emph{underscore} will be -% rescanned without errors, even in text mode).} -% \begin{macrocode} - \@@_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl -% \end{macrocode} -% -% \smallskip -% We close the TeX group opened for the options given to |\Arrow[...]| (local -% level of the options). -% \begin{macrocode} - \group_end: - } -% \end{macrocode} -% -% -% \bigskip -% The function |@@_tmpa:nnn| will draw the arrow. It's merely an environment -% |{tikzpicture}|. However, the Tikz instruction in this environment must be -% inserted from |\l_@@_tikz_code_tl| with the markers |#1|, |#2| and |#3|. -% That's why we create a function |\@@_def_function_tmpa:n| which will create -% the function |\@@_tmpa:nnn|. -% \begin{macrocode} -\cs_new_protected:Npn \@@_def_function_tmpa:n #1 - { - \cs_set:Npn \@@_tmpa:nnn ##1 ##2 ##3 - { - \begin{tikzpicture} - [ - @@_standard , - every~path / .style = WithArrows / arrow - ] - #1 - \end{tikzpicture} - } - } -% \end{macrocode} -% -% \medskip -% When we draw the arrow (with |\@@_draw_arrow:nnn|), we first create the -% function |\@@_tmpa:nnn| and, then, we use the function |\@@_tmpa:nnn| : -% \begin{macrocode} -\cs_new_protected:Npn \@@_draw_arrow:nnn #1 #2 #3 - { -% \end{macrocode} -% -% \medskip -% If the option |wrap-lines| is used, we have to use a special version of -% |\l_@@_tikz_code_tl| (which corresponds to the option |tikz-code|). -% \begin{macrocode} - \bool_if:nT { \l_@@_wrap_lines_bool && \l_@@_in_DispWithArrows_bool } - { \tl_set_eq:NN \l_@@_tikz_code_tl \c_@@_tikz_code_wrap_lines_tl } -% \end{macrocode} -% -% \medskip -% Now, the main lines of this function |\@@_draw_arrow:nnn|. -% \begin{macrocode} - \exp_args:NV \@@_def_function_tmpa:n \l_@@_tikz_code_tl - \@@_tmpa:nnn { #1 } { #2 } { #3 } - } -\cs_generate_variant:Nn \@@_draw_arrow:nnn { n n o } -% \end{macrocode} -% -% \bigskip -% If the option |wrap-lines| is used, we have to use a special version of -% |\l_@@_tikz_code_tl| (which corresponds to the option |tikz-code|). -% \begin{macrocode} -\tl_const:Nn \c_@@_tikz_code_wrap_lines_tl - { -% \end{macrocode} -% First, we draw the arrow without the label. -% \begin{macrocode} - \draw ( #1 ) to node ( @@_label ) { } ( #2 ) ; -% \end{macrocode} -% We retrieve in |\pgf@x| the abscissa of the left-side of the label we will -% put. -% \begin{macrocode} - \tikz@parse@node \pgfutil@firstofone ( @@_label.west ) -% \end{macrocode} -% We compute in |\l_tmpa_dim| the maximal width possible for the label. -% Here is the use of |\g_@@_right_x_dim| which has been computed previously with -% the |v|-nodes. -% \begin{macrocode} - \dim_set:Nn \l_tmpa_dim - { \g_@@_right_x_dim - \pgf@x - \pgfkeysvalueof { / pgf / inner~xsep } } -% \end{macrocode} -% We retrieve in |\g_tmpa_tl| the current value of the Tikz parameter -% ``|text width|''.\footnote{In fact, it's not the current value of -% ``|text width|'': it's the value of ``|text width|'' set in the option |tikz| -% provided by \pkg{witharrows}. These options are given to Tikz in a -% ``|every path|''. That's why we have to retrieve it in a path.} -% \begin{macrocode} - \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz@text@width } ; -% \end{macrocode} -% Maybe the current value of the parameter ``|text width|'' is shorter than -% |\l_tmpa_dim|. In this case, we must use ``|text width|'' (we update -% |\l_tmpa_dim|). -% \begin{macrocode} - \tl_if_empty:NF \g_tmpa_tl - { - \dim_set:Nn \l_tmpb_dim \g_tmpa_tl - \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim - { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } - } -% \end{macrocode} -% Now, we can put the label with the right value for ``|text width|''. -% \begin{macrocode} - \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim - { - \path ( @@_label.west ) - node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ] - { #3 } ; - } - } -% \end{macrocode} -% -% \bigskip -% The command |\@@_update_x:nn| will analyze the lines between |#1| and -% |#2| in order to modify |\l_@@_x_dim| in consequence. More precisely, -% |\l_@@_x_dim| is increased if a line longer than the current value of -% |\l_@@_x_dim| is found. |\@@_update_x:nn| is used in |\@@_scan_arrows:| -% (for options |group| and |groups|) and in |\@@_draw_arrows:nn| (for option -% |i|). -% \begin{macrocode} -\cs_new_protected:Npn \@@_update_x:nn #1 #2 - { - \int_step_inline:nnn { #1 } { #2 } - { - \begin { tikzpicture } [ @@_standard ] - \tikz@scan@one@point \pgfutil@firstofone ( ##1 - l ) - \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l_@@_x_dim \pgf@x } - \end { tikzpicture } - \dim_set_eq:NN \l_@@_x_dim \g_tmpa_dim - } - } -% \end{macrocode} -% -% -% \bigskip -% The command |\WithArrowsLastEnv| is not used by the package \pkg{witharrows}. -% It's only a facility given to the final user. It gives the number of the last -% environment |{WithArrows}| at -% level~$0$ (to the sense of the nested environments). This macro is fully -% expandable and, thus, can be used directly in the name of a Tikz node. -% \begin{macrocode} -\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g_@@_last_env_int } -% \end{macrocode} -% -% \bigskip -% \subsection{The command \textbackslash Arrow in code-after} -% -% The option |code-after| is an option of the environment |{WithArrows}| (this -% option is only available at the environment level). In the option |code-after|, -% one can use the command |Arrow| but it's a special version of the command -% |Arrow|. For this special version (internally called |\@@_Arrow_code_after|), -% we define a special set of keys called |WithArrows/Arrow/code-after|. -% -% \begin{macrocode} -\keys_define:nn { WithArrows / Arrow / code-after } - { - tikz .code:n = - \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .value_required:n = true , - rr .value_forbidden:n = true , - rr .code:n = \@@_fix_pos_option:n 0 , - ll .value_forbidden:n = true, - ll .code:n = \@@_fix_pos_option:n 1 , - rl .value_forbidden:n = true , - rl .code:n = \@@_fix_pos_option:n 2 , - lr .value_forbidden:n = true , - lr .code:n = \@@_fix_pos_option:n 3 , - v .value_forbidden:n = true , - v .code:n = \@@_fix_pos_option:n 4 , - tikz-code .tl_set:N = \l_@@_tikz_code_tl , - tikz-code .value_required:n = true , - xoffset .dim_set:N = \l_@@_xoffset_dim , - xoffset .value_required:n = true , - unknown .code:n = - \@@_sort_seq:N \l_@@_options_Arrow_code_after_seq - \@@_error:n { Unknown~option~Arrow~in~code-after } - } -% \end{macrocode} -% -% \bigskip -% A sequence of the options available in |\Arrow| in |code-after|. This sequence -% will be used in the error messages and can be modified dynamically. -% \begin{macrocode} -\seq_new:N \l_@@_options_Arrow_code_after_seq -\@@_set_seq_of_str_from_clist:Nn \l_@@_options_Arrow_code_after_seq - { ll, lr, rl, rr, tikz, tikz-code, v, x, offset } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\NewDocumentCommand \@@_Arrow_code_after { O { } m m m ! O { } } - { - \int_set:Nn \l_@@_pos_arrow_int 1 - \str_clear_new:N \l_@@_previous_key_str - \group_begin: - \keys_set:nn { WithArrows / Arrow / code-after } - { #1, #5, tikz = { xshift = \l_@@_xoffset_dim } } - \bool_set_false:N \l_@@_initial_r_bool - \bool_set_false:N \l_@@_final_r_bool - \int_case:nn \l_@@_pos_arrow_int - { - 0 - { - \bool_set_true:N \l_@@_initial_r_bool - \bool_set_true:N \l_@@_final_r_bool - } - 2 { \bool_set_true:N \l_@@_initial_r_bool } - 3 { \bool_set_true:N \l_@@_final_r_bool } - } -% \end{macrocode} -% We prevent drawing a arrow from a line to itself. -% \begin{macrocode} - \tl_if_eq:nnTF { #2 } { #3 } - { \@@_error:nn { Both~lines~are~equal } { #2 } } -% \end{macrocode} -% We test whether the two Tikz nodes |(#2-l)| and |(#3-l)| really exist. If not, -% the arrow won't be drawn. -% \begin{macrocode} - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l_@@_prefix_str - #2 - l } - { \@@_error:nx { Wrong~line~in~Arrow } { #2 } } - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l_@@_prefix_str - #3 - l } - { \@@_error:nx { Wrong~line~in~Arrow } { #3 } } - { - \int_compare:nNnTF \l_@@_pos_arrow_int = 4 - { - \begin { tikzpicture } [ @@_standard ] - \tikz@scan@one@point \pgfutil@firstofone (#2-l.south) - \dim_set_eq:NN \l_tmpa_dim \pgf@x - \dim_set_eq:NN \l_tmpb_dim \pgf@y - \tikz@scan@one@point \pgfutil@firstofone (#3-l.north) - \dim_set:Nn \l_tmpa_dim - { \dim_max:nn \l_tmpa_dim \pgf@x } - \tl_gset:Nx \g_tmpa_tl - { \dim_use:N \l_tmpa_dim , \dim_use:N \l_tmpb_dim } - \tl_gset:Nx \g_tmpb_tl - { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf@y } - \end { tikzpicture } - } - { - \begin { tikzpicture } [ @@_standard ] - \tikz@scan@one@point \pgfutil@firstofone - ( #2-\bool_if:NTF\l_@@_initial_r_bool rl .south ) - \tl_gset:Nx \g_tmpa_tl - { \dim_use:N \pgf@x , \dim_use:N \pgf@y } - \tikz@scan@one@point \pgfutil@firstofone - ( #3-\bool_if:NTF\l_@@_final_r_bool rl .north ) - \tl_gset:Nx \g_tmpb_tl - { \dim_use:N \pgf@x , \dim_use:N \pgf@y } - \end { tikzpicture } - } - \@@_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 } - } - } - } - \group_end: - } -% \end{macrocode} -% -% -% \bigskip -% \subsection{The command \textbackslash MultiArrow in code-after} -% The command |\@@_MultiArrow:nn| will be linked to |\MultiArrow| when the -% |code-after| is executed. -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_MultiArrow:nn #1 #2 - { -% \end{macrocode} -% The user of the command |\MultiArrow| (in |code-after|) will be able to specify -% the list of lines with the same syntax as the loop |\foreach| of \pkg{pgffor}. -% That's why we construct a ``clist'' of \pkg{expl3} from the specification of -% list given by the user. The construction of the ``clist'' must be global in -% order to exit the |\foreach| and that's why we construct the list in -% |\g_tmpa_clist|. -% \begin{macrocode} - \foreach \x in { #1 } - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l_@@_prefix_str - \x - l } - { \@@_error:nx { Wrong~line~specification~in~MultiArrow } \x } - { \clist_gput_right:Nx \g_tmpa_clist \x } - } -% \end{macrocode} -% We sort the list |\g_tmpa_clist| because we want to extract the minimum and -% the maximum. -% \begin{macrocode} - \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 } - { \@@_error:n { Too~small~specification~for~MultiArrow } } - { - \clist_sort:Nn \g_tmpa_clist - { - \int_compare:nTF { ##1 > ##2 } - \sort_return_swapped: - \sort_return_same: - } -% \end{macrocode} -% We extract the minimum in |\l_tmpa_tl| (it must be an integer but we store it -% in a token list of \pkg{expl3}). -% \begin{macrocode} - \clist_pop:NN \g_tmpa_clist \l_tmpa_tl -% \end{macrocode} -% -% We extract the maximum in |\l_tmpb_tl|. The remaining list (in -% |\g_tmpa_clist|) will be sorted in decreasing order but never mind... -% \begin{macrocode} - \clist_reverse:N \g_tmpa_clist - \clist_pop:NN \g_tmpa_clist \l_tmpb_tl -% \end{macrocode} -% -% We draw the teeth of the rak (except the first one and the last one) with the -% auxiliary function |\@@_MultiArrow_i:n|. This auxiliary fonction is necessary -% to expand the specification of the list in the |\foreach| loop. The first and -% the last teeth of the rak can't be drawn the same way as the others (think, -% for example, to the case of the option ``|rounded corners|'' is used). -% \begin{macrocode} - \exp_args:NV \@@_MultiArrow_i:n \g_tmpa_clist -% \end{macrocode} -% -% Now, we draw the rest of the structure. -% \begin{macrocode} - \begin { tikzpicture } - [ - @@_standard , - every~path / .style = { WithArrows / arrow } - ] - \draw [<->] ([xshift = \l_@@_xoffset_dim]\l_tmpa_tl-r.south) - -- ++(5mm,0) - -- node (@@_label) {} - ([xshift = \l_@@_xoffset_dim+5mm]\l_tmpb_tl-r.south) - -- ([xshift = \l_@@_xoffset_dim]\l_tmpb_tl-r.south) ; - \tikz@parse@node \pgfutil@firstofone (@@_label.west) - \dim_set:Nn \l_tmpa_dim { 20 cm } - \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz@text@width } ; - \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl } - \bool_if:nT { \l_@@_wrap_lines_bool && \l_@@_in_DispWithArrows_bool } - { - \dim_set:Nn \l_tmpb_dim - { \g_@@_right_x_dim - \pgf@x - 0.3333 em } - \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim - { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } - } - \path (@@_label.west) - node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ; - \end{tikzpicture} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new_protected:Npn \@@_MultiArrow_i:n #1 - { - \begin {tikzpicture } - [ - @@_standard , - every~path / .style = { WithArrows / arrow } - ] - \foreach \k in { #1 } - { - \draw [ <- ] - ( [xshift = \l_@@_xoffset_dim]\k-r.south ) -- ++(5mm,0) ; - } ; - \end { tikzpicture } - } -% \end{macrocode} -% -% -% \bigskip -% \subsection{The error messages of the package} -% -% \begin{macrocode} -\str_const:Nn \c_@@_option_ignored_str - { If~you~go~on,~this~option~will~be~ignored. } -\str_const:Nn \c_@@_command_ignored_str - { If~you~go~on,~this~command~will~be~ignored. } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { amsmath~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~the~ - package~'amsmath'~has~not~been~loaded.\\ - If~you~go~on,~this~option~will~be~ignored~in~the~rest~ - of~the~document. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Bad~value~for~replace~brace~by } - { - Bad~value~for~the~option~'\l_keys_key_tl'.~The~value~must~be~ - an~extensible~left~delimiter.~The~possible~values~are:~ - \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~ - \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~ - \token_to_str:N \langle,~\token_to_str:N \lmoustache,~ - \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\ - (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\ - if~amsmath~or~unicode-math~is~loaded).\\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { option~of~cr~negative } - { - The~argument~of~the~command~\token_to_str:N\\~ - should~be~positive~in~the~row~\int_use:N \g_@@_line_int\ - of~your~environment~\{\l_@@_type_env_str\}.\\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { omit~probably~used } - { - There~is~a~problem.~Maybe~you~have~used~a~command~ - \token_to_str:N\omit\ in~the~line~\int_use:N \g_@@_line_int\ - (or~another~line)~of~your~environment~\{\l_@@_type_env_str\}.\\ - You~can~go~on~but~you~may~have~others~errors. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { newline~at~the~end~of~env } - { - Your~environment~\{\l_@@_type_env_str\}~should~not~end~with~ - a~\token_to_str:N \\.\\ - This~warning~might~become~an~error~in~a~future~version. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Invalid~option~format } - { - The~key~'format'~should~contain~only~letters~r,~c~and~l~and~ - must~not~be~empty.\\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Value~for~a~key } - { - The~key~'\l_keys_key_tl'~should~be~used~without~value. \\ - However,~you~can~go~on~for~this~time. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nnn { Unknown~option~in~Arrow } - { - The~key~'\l_keys_key_tl'~is~unknown~for~the~command~ - \l_@@_string_Arrow_for_msg_str\ in~the~row~ - \int_use:N \g_@@_line_int\ of~your~environment~ - \{\l_@@_type_env_str\}. \l_tmpa_str \\ - \c_@@_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l_@@_options_Arrow_seq {~and~} {,~} {~and~}. - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nnn { Unknown~option~WithArrows } - { - The~key~'\l_keys_key_tl'~is~unknown~in~\{\l_@@_type_env_str\}. \\ - \c_@@_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l_@@_options_WithArrows_seq {~and~} {,~} {~and~}. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nnn { Unknown~option~DispWithArrows } - { - The~key~'\l_keys_key_tl'~is~unknown~in~\{\l_@@_type_env_str\}. \\ - \c_@@_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l_@@_options_DispWithArrows_seq {~and~} {,~} {~and~}. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nnn { Unknown~option~WithArrowsOptions } - { - The~key~'\l_keys_key_tl'~is~unknown~in~ - \token_to_str:N \WithArrowsOptions. \\ - \c_@@_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l_@@_options_WithArrowsOptions_seq {~and~} {,~} {~and~}. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nnn { Unknown~option~Arrow~in~code-after } - { - The~key~'\l_keys_key_tl'~is~unknown~in~ - \token_to_str:N \Arrow\ in~code-after. \\ - \c_@@_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l_@@_options_Arrow_code_after_seq {~and~} {,~} {~and~}. - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn { Too~much~columns~in~WithArrows } - { - Your~environment~\{\l_@@_type_env_str\}~has~\int_use:N - \l_@@_nb_cols_int\ columns~and~you~try~to~use~one~more.~ - Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~ - If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~ - the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\ - However,~you~can~go~one~for~this~time. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Too~much~columns~in~DispWithArrows } - { - Your~environment~\{\l_@@_type_env_str\}~has~\int_use:N - \l_@@_nb_cols_int\ columns~and~you~try~to~use~one~more.~ - Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ - at~the~end~of~row~\int_use:N \g_@@_line_int. \\ - This~error~is~fatal. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Negative~jump } - { - You~can't~use~a~negative~value~for~the~option~'jump'~of~command~ - \l_@@_string_Arrow_for_msg_str\ - in~the~row~\int_use:N \g_@@_line_int\ - of~your~environment~\{\l_@@_type_env_str\}.~ - You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { new-group~without~groups } - { - You~can't~use~the~option~'new-group'~for~the~command~ - \l_@@_string_Arrow_for_msg_str\ - because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~ - 'groups'~in~your~environment~\{\l_@@_type_env_str\}. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn - { Too~few~lines~for~an~arrow } - { - Line~\l_@@_input_line_str\ - :~an~arrow~specified~in~the~row~\int_use:N \l_@@_initial_int\ - of~your~environment~\{\l_@@_type_env_str\}~can't~be~drawn~ - because~it~arrives~after~the~last~row~of~the~environment. \\ - If~you~go~on,~this~arrow~will~be~ignored. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { WithArrows~outside~math~mode } - { - The~environment~\{\l_@@_type_env_str\}~should~be~used~only~in~math~mode~ - like~the~environment~\{aligned\}~of~amsmath. \\ - Nevertheless,~you~can~go~on. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { DispWithArrows~in~math~mode } - { - The~environment~\{\l_@@_type_env_str\}~should~be~used~only~outside~math~ - mode~like~the~environment~\{align\}~of~amsmath. \\ - This~error~is~fatal. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Incompatible~options~in~Arrow } - { - You~try~to~use~the~option~'\l_keys_key_tl'~but~ - this~option~is~incompatible~or~redundant~with~the~option~ - '\l_@@_previous_key_str'~set~in~the~same~command~ - \l_@@_string_Arrow_for_msg_str. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn { Incompatible~options } - { You~try~to~use~the~option~'\l_keys_key_tl'~but~ - this~option~is~incompatible~or~redundant~with~the~option~ - '\l_@@_previous_key_str'~set~in~the~same~command~ - \bool_if:NT \l_@@_in_code_after_bool - { - \l_@@_string_Arrow_for_msg_str\ - in~the~code-after~of~your~environment~\{\l_@@_type_env_str\} - }. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Arrow~not~in~last~column } - { - You~should~use~the~command~\l_@@_string_Arrow_for_msg_str\ - only~in~the~last~column~(column~\int_use:N\l_@@_nb_cols_int)~ - of~your~environment~\{\l_@@_type_env_str\}.\\ - However~you~can~go~on~for~this~time. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Wrong~line~in~Arrow } - { - The~specification~of~line~'#1'~you~use~in~the~command~ - \l_@@_string_Arrow_for_msg_str\ - in~the~'code-after'~of~\{\l_@@_type_env_str\}~doesn't~exist. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Both~lines~are~equal } - { - In~the~'code-after'~of~\{\l_@@_type_env_str\}~you~try~to~ - draw~an~arrow~going~to~it~self~from~the~line~'#1'.~This~is~not~possible. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Wrong~line~specification~in~MultiArrow } - { - The~specification~of~line~'#1'~doesn't~exist. \\ - If~you~go~on,~it~will~be~ignored~for~\token_to_str:N \MultiArrow. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Too~small~specification~for~MultiArrow } - { - The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\ - is~too~small:~you~need~at~least~two~lines. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { tag*~without~amsmath } - { - We~can't~use~\token_to_str:N\tag*~because~you~haven't~loaded~amsmath~ - (or~mathtools). \\ - If~you~go~on,~the~command~\token_to_str:N\tag\ - will~be~used~instead. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Not~allowed~in~DispWithArrows } - { - The~command~\token_to_str:N #1 - is~allowed~only~in~the~last~column~ - (column~\int_use:N\l_@@_nb_cols_int)~of~\{\l_@@_type_env_str\}. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Not~allowed~in~WithArrows } - { - The~command~\token_to_str:N #1 is~not~allowed~in~\{\l_@@_type_env_str\}~ - (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Multiple~tags } - { - You~can't~use~twice~the~command~\token_to_str:N\tag\ - in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\ - If~you~go~on,~the~tag~'#1'~will~be~used. - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn { Multiple~labels } - { - Normally,~we~can't~use~the~command~\token_to_str:N\label\ - twice~in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\ - However,~you~can~go~on.~ - \bool_if:NT \c_@@_showlabels_loaded_bool - { However,~only~the~last~label~will~be~shown~by~showlabels.~ } - If~you~don't~want~to~see~this~message~again,~you~can~use~the~option~ - 'allow-multiple-labels'~at~the~global~or~environment~level. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Multiple~labels~with~cleveref } - { - Since~you~use~cleveref,~you~can't~use~the~command~\token_to_str:N\label\ - twice~in~a~line~of~the~environment~\{\l_@@_type_env_str\}. \\ - If~you~go~on,~you~may~have~undefined~references. - } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn { Inexistent~v-node } - { - There~is~a~problem.~Maybe~you~have~put~a~command~\token_to_str:N\cr\ - instead~of~a~command~\token_to_str:N\\~at~the~end~of~ - the~row~\l_tmpa_int\ - of~your~environment~\{\l_@@_type_env_str\}. \\ - This~error~is~fatal. - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Option~xoffset~forbidden } - { - You~can't~use~the~option~'xoffset'~in~the~command~ - \l_@@_string_Arrow_for_msg_str\ - while~you~are~using~the~option~ - ' \int_compare:nNnTF \l_@@_pos_arrow_int = 7 - { group } - { groups } '. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nnn { Duplicate~name } - { - The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~ - the~same~environment~name~twice.~You~can~go~on,~but,~ - maybe,~you~will~have~incorrect~results. \\ - For~a~list~of~the~names~already~used,~type~H~<return>. \\ - If~you~don't~want~to~see~this~message~again,~use~the~option~ - 'allow-duplicate-names'. - } - { - The~names~already~defined~in~this~document~are:~ - \seq_use:Nnnn \g_@@_names_seq { ,~ } { ,~ } { ~and~ }. - } -% \end{macrocode} -% -% -% -% \subsection{The command \textbackslash WithArrowsNewStyle} -% -% A new key defined with |\WithArrowsNewStyle| will not be available at the -% local level. -% \begin{macrocode} -\NewDocumentCommand \WithArrowsNewStyle { m m } - { - \keys_if_exist:nnTF { WithArrows / Global } { #1 } - { \@@_error:nn { Key~already~defined } { #1 } } - { - \keys_define:nn { WithArrows / Global } - { - #1 .code:n = - { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } } - } - \seq_put_right:Nx \l_@@_options_WithArrows_seq { \tl_to_str:n { #1 } } - \seq_put_right:Nx \l_@@_options_DispWithArrows_seq - { \tl_to_str:n { #1 } } - \seq_put_right:Nx \l_@@_options_WithArrowsOptions_seq - { \tl_to_str:N { #1 } } -% \end{macrocode} -% We now set the options in a TeX group in order to detect if some keys in |#2| -% are unknown. If a key is unknown, an error will be raised. However, the key -% will, even so, be stored in the definition of key~|#1|. -% \begin{macrocode} - \group_begin: - \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions } - { - The~key~'\l_keys_key_tl'~can't~be~set~in~the~ - definition~of~a~style.~You~can~go~on~for~this~time~ - but~you~should~suppress~this~key. - } - \WithArrowsOptions { #2 } - \group_end: - } - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { Key~already~defined } - { - The~key~'#1'~is~already~defined. \\ - If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\ - will~be~ignored. - } -% \end{macrocode} -% -% -% \subsection{The options up and down} -% -% The options |up| and |down| are available for individual arrows. The -% corresponding code is given here. It is independent of the main code of the -% extension \pkg{witharrows}. -% -% This code is the only part of the code of \pkg{witharrows} which uses the -% package \pkg{varwidth} and also the Tikz library |calc|. That's why we have -% decided not to load this package and this library. If they are not loaded, the -% user will have an error only when using the option |up| or the option |down|. -% -% \medskip -% The token list |\c_@@_tikz_code_up_tl| is the value of |tikz-code| which will -% be used for an option |up|. -% \begin{macrocode} -\tl_const:Nn \c_@@_tikz_code_up_tl - { - \draw [ rounded~corners ] - let \p1 = (#1) , - \p2 = (#2) - in (\p1) -- node { - \dim_set:Nn \l_tmpa_dim { \x2 - \x1 } - \begin { varwidth } \l_tmpa_dim - \raggedright - #3 - \end { varwidth } - } - (\x2,\y1) -- (\p2) ; - } -% \end{macrocode} -% -% \medskip -% Idem for the option |down|. -% \begin{macrocode} -\tl_const:Nn \c_@@_tikz_code_down_tl - { - \draw [ rounded~corners ] - let \p1 = (#1) , - \p2 = (#2) - in (\p1) -- (\x1,\y2) -- - node { - \dim_set:Nn \l_tmpa_dim { \x1 - \x2 } - \begin { varwidth } \l_tmpa_dim - \raggedright - #3 - \end { varwidth } - } - (\p2) ; - } -% \end{macrocode} -% -% \begin{macrocode} -\keys_define:nn { WithArrows / Arrow / FirstPass } - { - up .code:n = \@@_set_independent: , - down .code:n = \@@_set_independent: , - up .default:n = NoValue , - down .default:n = NoValue - } -% \end{macrocode} -% -% \bigskip -% \begin{macrocode} -\keys_define:nn { WithArrows / Arrow / SecondPass } - { - up .code:n = - \str_if_empty:NT \l_@@_previous_key_str - { - \str_set:Nn \l_@@_previous_key_str { up } - \bool_if:NTF \c_@@_varwidth_loaded_bool - { - \cs_if_exist:cTF { tikz@library@calc@loaded } - { - \int_set:Nn \l_@@_pos_arrow_int \c_one_int -% \end{macrocode} -% We have to set |\l_@@_wrap_lines_bool| to |false| because, otherwise, if the -% option |wrap_lines| is used at a higher level (global or environment), we will -% have a special affectation to |tikz-code| that will overwrite our affectation. -% \begin{macrocode} - \bool_set_false:N \l_@@_wrap_lines_bool - \tl_set_eq:NN \l_@@_tikz_code_tl - \c_@@_tikz_code_up_tl - } - { \@@_error:n { calc~not~loaded } } - } - { \@@_error:n { varwidth~not~loaded } } - } , - down .code:n = - \str_if_empty:NT \l_@@_previous_key_str - { - \str_set:Nn \l_@@_previous_key_str { down } - \bool_if:NTF \c_@@_varwidth_loaded_bool - { - \cs_if_exist:cTF { tikz@library@calc@loaded } - { - \int_set:Nn \l_@@_pos_arrow_int \c_one_int - \bool_set_false:N \l_@@_wrap_lines_bool - \tl_set_eq:NN \l_@@_tikz_code_tl - \c_@@_tikz_code_down_tl - } - { \@@_error:n { calc~not~loaded } } - } - { \@@_error:n { varwidth~not~loaded } } - } - } -% \end{macrocode} -% -% -% -% \begin{macrocode} -\seq_put_right:Nn \l_@@_options_Arrow_seq { down } -\seq_put_right:Nn \l_@@_options_Arrow_seq { up } -% \end{macrocode} -% -% -% \begin{macrocode} -\@@_msg_new:nn { varwidth~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~ - you~don't~have~loaded~the~package~'varwidth'. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% \begin{macrocode} -\@@_msg_new:nn { calc~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~you~don't~have~loaded~the~ - Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}' - ~in~the~preamble~of~your~document. \\ - \c_@@_option_ignored_str - } -% \end{macrocode} -% -% -% \section{History} -% -% \subsection*{Changes between versions 1.0 and 1.1} -% -% Option for the command |\\| and option |interline| -% -% Compatibility with |\usetikzlibrary{babel}| -% -% Possibility of nested environments |{WithArrows}| -% -% -% \subsection*{Changes between versions 1.1 and 1.2} -% -% The package \pkg{witharrows} can now be loaded without having loaded -% previously \pkg{tikz} and the libraries |arrow.meta| and |bending| (this -% extension and these libraries are loaded silently by \pkg{witharrows}). -% -% New option |groups| (with a \emph{s}) -% -% -% \subsection*{Changes between versions 1.2 and 1.3} -% -% New options |ygap| and |ystart| for fine tuning. -% -% \subsection*{Changes between versions 1.3 and 1.4} -% -% The package \pkg{footnote} is no longer loaded by default. Instead, two -% options |footnote| and |footnotehyper| have been added. In particular, -% \pkg{witharrows} becomes compatible with \cls{beamer}. -% -% \subsection*{Changes between versions 1.4 and 1.5} -% -% The Tikz code used to draw the arrows can be changed with the option -% |tikz-code|. -% -% Two new options |code-before| and |code-after| have been added at the -% environment level. -% -% A special version of |\Arrow| is available in |code-after| in order to draw -% arrows in nested environments. -% -% A command |\MultiArrow| is available in |code-after| to draw arrows of other -% shapes. -% -% \subsection*{Changes between versions 1.5 and 1.6} -% -% The code has been improved to be faster and the Tikz library |calc| is no -% longer required. -% -% A new option |name| is available for the environments |{WithArrows}|. -% -% \subsection*{Changes between 1.6 and 1.7} -% -% New environments |{DispWithArrows}| and |{DispWithArrows*}|. -% -% \subsection*{Changes between 1.7 and 1.8} -% -% The numbers and tags of the environment |{DispWithArrows}| are now compatible -% with all the major LaTeX packages concerning references (\pkg{autonum}, -% \pkg{cleveref}, \pkg{fancyref}, \pkg{hyperref}, \pkg{prettyref}, -% \pkg{refstyle}, \pkg{typedref} and \pkg{varioref}) and with the options -% |showonlyrefs| and |showmanualtags| of \pkg{mathtools}. -% -% \subsection*{Changes between 1.8 and 1.9} -% -% New option |wrap-lines| for the environments |{DispWithArrows}| and -% |{DispWithArrows*}|. -% -% \subsection*{Changes between 1.9 and 1.10} -% -% If the option |wrap-lines| is used, the option ``|text width|'' of Tikz is -% still active: if the value given to ``|text width|'' is lower than the width -% computed by |wrap-lines|, this value is used to wrap the lines. -% -% The option |wrap-lines| is now fully compatible with the class option |leqno|. -% -% Correction of a bug: |\nointerlineskip| and |\makebox[.6\linewidth]{}| should -% be inserted in |{DispWithArrows}| only in vertical mode. -% -% \subsection*{Changes between 1.10 and 1.11} -% -% New commands |\WithArrowsNewStyle| and |\WithArrowsRightX|. -% -% \subsection*{Changes between 1.11 and 1.12} -% -% New command |\tagnextline|. -% -% New option |tagged-lines|. -% -% An option of position (|ll|, |lr|, |rl|, |rr| or |i|) is now allowed at the -% local level even if the option |group| or the option |groups| is used at the -% global or environment level. -% -% Compatibility of |{DispWithArrows}| with |\qedhere| of \pkg{amsthm}. -% -% Compatibility with the packages \pkg{refcheck}, \pkg{showlabels} and -% \pkg{listlbls}. -% -% The option |\AllowLineWithoutAmpersand| is deprecated because lines without -% ampersands are now always allowed. -% -% \subsection*{Changes between 1.12 and 1.13} -% -% Options |start-adjust|, |end-adjust| and |adjust|. -% -% This version is not stricty compatible with previous ones. To restore the -% behaviour of the previous versions, one has to use the option |adjust| with -% the value $0$~pt: -% -% \begin{Verbatim} -% \WithArrowsOptions{adjust = 0pt} -% \end{Verbatim} -% -% \subsection*{Changes between 1.13 and 1.14} -% -% New options |up| and |down| for the arrows. -% -% \smallskip -% Replacement of some options |O { }| in commands and environments defined with -% \pkg{xparse} by |! O { }| (a recent version of \pkg{xparse} introduced -% the specifier |!| and modified the default behaviour of the last optional -% arguments: -% |//www.texdev.net/2018/04/21/xparse-optional-arguments-at-the-end|). -% -% \smallskip -% Modification of the code of |\WithArrowsNewStyle| following a correction of a -% bug in \pkg{l3keys} in the version of \pkg{l3kernel} of 2019/01/28. -% -% New error message |Inexistent~v-node| to avoid a \pkg{pgf} error. -% -% The error |Option incompatible with 'group(s)'| was suppressed in the version -% 1.12 but this was a mistake since this error is used with the option |xoffset| -% at the local level. The error is put back. -% -% \subsection*{Changes between 1.14 and 1.15} -% -% Option |new-group| to start a new group of arrows (only available when the -% environment is composed with the option |groups|). -% -% Tikz externalization is now deactivated in the environments of the -% extension \pkg{witharrows}.\footnote{Before this version, there was an error -% when using \pkg{witharrows} with Tikz externalization. In any case, it's not -% possible to externalize the Tikz elements constructed by \pkg{witharrows} -% because they use the options |overlay| and |remember picture|.} -% -% \subsection*{Changes between 1.15 and 1.16} -% -% Option |no-arrows| -% -% The behaviour of |{DispWithArrows}| after an |\item| of a LaTeX list has been -% changed : no vertical is added. The previous behaviour can be restored with -% the option |standard-behaviour-with-items|. -% -% A given name can no longer be used for two distinct environments. However, -% it's possible to deactivate this control with the option -% |allow-duplicate-names|. -% -% -% \subsection*{Changes between 1.16 and 1.17} -% -% Option |format| -% -% \subsection*{Changes between 1.17 and 1.18} -% -% New option |<...>| for |{DispWithArrows}|. -% -% Option |subequations|. -% -% Warning when |{WithArrows}| or |{DispWithArrows}| ends by "\\". -% -% No space before an environnement |{DispWithArrows}| if we are at the beginning -% of a |{minipage}|. -% \PrintIndex -% -% \tableofcontents -% -% \endinput -% Local Variables: -% TeX-fold-mode: nil -% fill-column: 80 -% End: diff --git a/Master/texmf-dist/source/latex/witharrows/witharrows.ins b/Master/texmf-dist/source/latex/witharrows/witharrows.ins deleted file mode 100644 index 6aad8b87f3e..00000000000 --- a/Master/texmf-dist/source/latex/witharrows/witharrows.ins +++ /dev/null @@ -1,47 +0,0 @@ -%% -%% Copyright (C) 2017-2019 by F. Pantigny -%% -%% -%% This file may be distributed and/or 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://www.latex-project.org/lppl.txt -%% -%% and version 1.3 or later is part of all distributions of -%% LaTeX version 2005/12/01 or later. -%% -\input l3docstrip.tex -\keepsilent -\usedir{tex/latex/witharrows} -\preamble - -Copyright (C) 2017-2019 by F. Pantigny - -This file may be distributed and/or 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://www.latex-project.org/lppl.txt - -and version 1.3 or later is part of all distributions of -LaTeX version 2005/12/01 or later. - -\endpreamble -\generate{\file{witharrows.sty}{\from{witharrows.dtx}{package}}} -\Msg{*********************************************************} -\Msg{*} -\Msg{* To finish the installation you have to move the} -\Msg{* following file into a directory searched by TeX:} -\Msg{*} -\Msg{* \space\space witharrows.sty} -\Msg{*} -\Msg{* To produce the documentation run the file witharrows.dtx} -\Msg{* through XeLaTeX.} -\Msg{*} -\Msg{* Happy TeXing!} -\Msg{*********************************************************} -\endbatchfile - diff --git a/Master/texmf-dist/tex/latex/witharrows/witharrows.sty b/Master/texmf-dist/tex/latex/witharrows/witharrows.sty deleted file mode 100644 index 563c6e8b260..00000000000 --- a/Master/texmf-dist/tex/latex/witharrows/witharrows.sty +++ /dev/null @@ -1,2037 +0,0 @@ -%% -%% This is file `witharrows.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% witharrows.dtx (with options: `package') -%% -%% Copyright (C) 2017-2019 by F. Pantigny -%% -%% This file may be distributed and/or 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://www.latex-project.org/lppl.txt -%% -%% and version 1.3 or later is part of all distributions of -%% LaTeX version 2005/12/01 or later. -%% -\def\myfileversion{1.18} -\def\myfiledate{2019/07/24} -\RequirePackage{tikz} -\usetikzlibrary{arrows.meta,bending} -\RequirePackage{expl3}[2019/02/15] -\RequirePackage{l3keys2e} -\ProvidesExplPackage - {witharrows} - {\myfiledate} - {\myfileversion} - {Draws arrows for explanations on the right} -\RequirePackage { xparse } [ 2018-10-17 ] -\bool_new:N \g__wi_footnotehyper_bool -\bool_new:N \g__wi_footnote_bool -\cs_new_protected:Npn \__wi_msg_new:nn { \msg_new:nnn { witharrows } } -\cs_new_protected:Npn \__wi_msg_new:nnn { \msg_new:nnnn { witharrows } } -\cs_new_protected:Npn \__wi_msg_redirect_name:nn - { \msg_redirect_name:nnn { witharrows } } -\cs_new_protected:Npn \__wi_error:n { \msg_error:nn { witharrows } } -\cs_new_protected:Npn \__wi_warning:n { \msg_error:nn { witharrows } } -\cs_new_protected:Npn \__wi_fatal:n { \msg_fatal:nn { witharrows } } -\cs_new_protected:Npn \__wi_error:nn { \msg_error:nnn { witharrows } } -\cs_generate_variant:Nn \__wi_error:nn { n x } -\keys_define:nn { WithArrows / package } - { - footnote .bool_gset:N = \g__wi_footnote_bool , - footnotehyper .bool_gset:N = \g__wi_footnotehyper_bool , - unknown .code:n = - \__wi_fatal:n { Option~unknown~for~package } - } -\__wi_msg_new:nn { Option~unknown~for~package } - { - You~can't~use~the~option~'\l_keys_key_tl'~when~loading~the~ - package~witharrows.~Try~to~use~the~command~ - \token_to_str:N\WithArrowsOptions. - } -\ProcessKeysOptions { WithArrows / package } -\__wi_msg_new:nn { Option~incompatible~with~Beamer } - { - The~option~'\l_keys_key_tl'\ is~incompatible~ - with~Beamer~because~Beamer~has~its~own~system~to~extract~footnotes. - } -\__wi_msg_new:nn { footnote~with~footnotehyper~package } - { - You~can't~use~the~option~'footnote'~because~the~package~ - footnotehyper~has~already~been~loaded.~ - If~you~want,~you~can~use~the~option~'footnotehyper'~and~the~footnotes~ - within~the~environments~of~witharrows~will~be~extracted~with~the~tools~ - of~the~package~footnotehyper.\\ - If~you~go~on,~the~package~footnote~won't~be~loaded. - } -\__wi_msg_new:nn { footnotehyper~with~footnote~package } - { - You~can't~use~the~option~'footnotehyper'~because~the~package~ - footnote~has~already~been~loaded.~ - If~you~want,~you~can~use~the~option~'footnote'~and~the~footnotes~ - within~the~environments~of~witharrows~will~be~extracted~with~the~tools~ - of~the~package~footnote.\\ - If~you~go~on,~the~package~footnotehyper~won't~be~loaded. - } -\bool_if:NT \g__wi_footnote_bool - { - \@ifclassloaded { beamer } - { \msg_info:nn { witharrows } { Option~incompatible~with~Beamer } } - { - \@ifpackageloaded { footnotehyper } - { \__wi_error:n { footnote~with~footnotehyper~package } } - { \usepackage { footnote } } - } - } -\bool_if:NT \g__wi_footnotehyper_bool - { - \@ifclassloaded { beamer } - { \__wi_info:n { Option~incompatible~with~Beamer } } - { - \@ifpackageloaded { footnote } - { \__wi_error:n { footnotehyper~with~footnote~package } } - { \usepackage { footnotehyper } } - } - \bool_gset_true:N \g__wi_footnote_bool - } -\bool_new:N \c__wi_leqno_bool -\DeclareOption { leqno } { \bool_set_true:N \c__wi_leqno_bool } -\DeclareOption* { } -\ProcessOptions* -\cs_generate_variant:Nn \tl_put_right:Nn { N v } -\cs_generate_variant:Nn \seq_set_split:Nnn { N x x } -\AtBeginDocument - { - \clist_map_inline:nn - { - amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels, - typedref, unicode-math, varwidth - } - { - \bool_new:c { c__wi_#1_loaded_bool } - \@ifpackageloaded { #1 } - { \bool_set_true:c { c__wi_#1_loaded_bool } } - { } - } - } -\sys_if_engine_luatex:TF - { - \cs_new_protected:Npn \__wi_strcmp:nn #1 #2 - { \lua_now:e { l3kernel.strcmp('#1','#2') } } - } - { - \cs_new_protected:Npn \__wi_strcmp:nn #1 #2 - { \pdftex_strcmp:D { #1 } { #2 } } - } -\cs_new_protected:Npn \__wi_sort_seq:N #1 - { - \seq_sort:Nn #1 - { - \int_compare:nNnTF - { - \__wi_strcmp:nn - { \str_lower_case:n { ##1 } } - { \str_lower_case:n { ##2 } } - } - > 0 - \sort_return_swapped: - \sort_return_same: - } - } -\cs_new_protected:Npn \__wi_convert_to_str_seq:N #1 - { - \seq_clear:N \l_tmpa_seq - \seq_map_inline:Nn #1 - { - \seq_put_left:Nx \l_tmpa_seq { \tl_to_str:n { ##1 } } - } - \seq_set_eq:NN #1 \l_tmpa_seq - } -\cs_new_protected:Npn \__wi_set_seq_of_str_from_clist:Nn #1 #2 - { - \seq_set_from_clist:Nn #1 { #2 } - \__wi_convert_to_str_seq:N #1 - } -\cs_new_protected:Npn \__wi_save:N #1 - { - \seq_set_split:Nxx \l_tmpa_seq - { \char_generate:nn { `_ } { 12 } } - { \cs_to_str:N #1 } - \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl - \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } - \use:c { \l_tmpa_str _if_exist:cF } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } - { - \use:c { \l_tmpa_str _new:c } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } - } - \use:c { \l_tmpa_str _gset_eq:cN } - { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1 - } -\cs_new_protected:Npn \__wi_restore:N #1 - { - \seq_set_split:Nxx \l_tmpa_seq - { \char_generate:nn { `_ } { 12 } } - { \cs_to_str:N #1 } - \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl - \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } - \use:c { \l_tmpa_str _set_eq:Nc } - #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ } - } -\tikzset - { - __wi_node_style / .style = - { - above = \l__wi_ystart_dim , - inner~sep = \c_zero_dim , - minimum~width = \c_zero_dim , - minimum~height = \l__wi_ygap_dim - } - } -\tikzset - { - __wi_standard / .style = - { - remember~picture , - overlay , - name~prefix = wa - \l__wi_prefix_str - - } - } -\tikzset - { - WithArrows / arrow / tips / .style = - { > = { Straight~Barb [ scale = 1.2 , bend ] } } - } -\tikzset - { - WithArrows / arrow / .style = - { - align = left , - auto = left , - font = \small \itshape , - WithArrows / arrow / tips , - bend~left = 45 , - -> - } - } -\AtBeginDocument - { - \bool_if:NTF \c__wi_amsmath_loaded_bool - { - \seq_put_right:Nn \l__wi_options_WithArrowsOptions_seq { subequations } - \seq_put_right:Nn \l__wi_options_DispWithArrows_seq { subequations } - } - { - \cs_new_protected:Npn \spread@equation - { - \openup \jot - \cs_set_eq:NN \spread@equation \prg_do_nothing: - } - } - } -\tl_new:N \l__wi_left_brace_tl -\tl_set_eq:NN \l__wi_left_brace_tl \c_novalue_tl -\bool_new:N \l__wi_in_WithArrows_bool -\bool_new:N \l__wi_in_DispWithArrows_bool -\bool_new:N \l__wi_in_code_after_bool -\seq_new:N \g__wi_position_in_the_tree_seq -\seq_gput_right:Nn \g__wi_position_in_the_tree_seq 1 -\int_new:N \g__wi_last_env_int -\int_new:N \l__wi_pos_env_int -\int_new:N \l__wi_pos_arrow_int -\int_set:Nn \l__wi_pos_arrow_int 3 -\seq_new:N \g__wi_arrow_int_seq -\int_new:N \g__wi_arrow_int -\seq_new:N \g__wi_line_int_seq -\int_new:N \g__wi_line_int -\seq_new:N \g__wi_col_int_seq -\int_new:N \g__wi_col_int -\clist_new:N \l__wi_tags_clist -\clist_set:Nn \l__wi_tags_clist { all } -\cs_new_protected:Npn \__wi_test_if_to_tag: - { - \clist_if_in:NVT \l__wi_tags_clist \g__wi_line_int - { \clist_set:Nn \l__wi_tags_clist { all } } - } -\str_new:N \l__wi_command_name_str -\str_set:Nn \l__wi_command_name_str { Arrow } -\str_new:N \l__wi_string_Arrow_for_msg_str -\str_set:Nx \l__wi_string_Arrow_for_msg_str { \token_to_str:N \Arrow } -\seq_new:N \g__wi_names_seq -\bool_new:N \l__wi_sbwi_bool -\bool_new:N \l__wi_in_first_columns_bool -\bool_new:N \l__wi_tag_star_bool -\bool_new:N \l__wi_tag_next_line_bool -\bool_new:N \l__wi_qedhere_bool -\bool_new:N \l__wi_new_group_bool -\bool_new:N \l__wi_initial_r_bool -\bool_new:N \l__wi_final_r_bool -\tl_new:N \l__wi_initial_tl -\tl_new:N \l__wi_final_tl -\int_new:N \l__wi_nb_cols_int -\str_new:N \l__wi_format_str -\bool_new:N \l__wi_subequations_bool -\cs_new_protected:Npn \__wi_eval_if_allowed:n #1 - { - \str_if_empty:NTF \l__wi_previous_key_str - { - \str_set_eq:NN \l__wi_previous_key_str \l_keys_key_tl - #1 - } - { \__wi_error:n { Incompatible~options } } - } -\cs_new_protected:Npn \__wi_fix_pos_option:n #1 - { \__wi_eval_if_allowed:n { \int_set:Nn \l__wi_pos_arrow_int { #1 } } } -\keys_define:nn { WithArrows / Global } - { - ygap .dim_set:N = \l__wi_ygap_dim , - ygap .value_required:n = true , - ygap .initial:n = 0.4 ex , - ystart .dim_set:N = \l__wi_ystart_dim , - ystart .value_required:n = true , - ystart .initial:n = 0.4 ex , - more-columns .code:n = - \__wi_msg_redirect_name:nn { Too~much~columns~in~WithArrows } { none } , - more-columns .value_forbidden:n = true, - command-name .code:n = - \str_set:Nn \l__wi_command_name_str { #1 } - \str_set:Nx \l__wi_string_Arrow_for_msg_str - { \c_backslash_str Arrow~alias~\c_backslash_str #1 } , - command-name .value_required:n = true , - tikz-code .tl_set:N = \l__wi_tikz_code_tl, - tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; , - tikz-code .value_required:n = true , - TikzCode .meta:n = { tikz-code = #1 } , - displaystyle .bool_set:N = \l__wi_displaystyle_bool , - displaystyle .default:n = true , - show-nodes .code:n = - \tikzset { __wi_node_style / .append~style = { draw , red } } , - show-nodes .value_forbidden:n = true, - show-node-names .bool_set:N = \l__wi_show_node_names_bool , - show-node-names .default:n = true , - group .code:n = - \str_if_empty:NTF \l__wi_previous_key_str - { - \str_set:Nn \l__wi_previous_key_str { group } - \seq_remove_all:Nn \l__wi_options_Arrow_seq { xoffset } - \int_set:Nn \l__wi_pos_arrow_int 7 - } - { \__wi_error:n { Incompatible~options } } , - group .value_forbidden:n = true , - groups .code:n = - \str_if_empty:NTF \l__wi_previous_key_str - { - \str_set:Nn \l__wi_previous_key_str { groups } - \seq_if_in:NnF \l__wi_options_Arrow_seq { new-group } - { \seq_put_right:Nn \l__wi_options_Arrow_seq { new-group } } - \seq_remove_all:Nn \l__wi_options_Arrow_seq { xoffset } - \int_set:Nn \l__wi_pos_arrow_int 6 - } - { \__wi_error:n { Incompatible~options } } , - groups .value_forbidden:n = true , - tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .initial:n = \c_empty_tl , - tikz .value_required:n = true , - rr .value_forbidden:n = true , - rr .code:n = \__wi_fix_pos_option:n 3 , - ll .value_forbidden:n = true , - ll .code:n = \__wi_fix_pos_option:n 1 , - rl .value_forbidden:n = true , - rl .code:n = \__wi_fix_pos_option:n 2 , - lr .value_forbidden:n = true , - lr .code:n = \__wi_fix_pos_option:n 0 , - i .value_forbidden:n = true , - i .code:n = \__wi_fix_pos_option:n 5 , - xoffset .dim_set:N = \l__wi_xoffset_dim , - xoffset .value_required:n = true , - xoffset .initial:n = 3 mm , - jot .dim_set:N = \jot , - jot .value_required:n = true , - interline .skip_set:N = \l__wi_interline_skip , - interline .value_required:n = true , - start-adjust .dim_set:N = \l__wi_start_adjust_dim , - start-adjust .value_required:n = true , - start-adjust .initial:n = 0.4 ex , - end-adjust .dim_set:N = \l__wi_end_adjust_dim , - end-adjust .value_required:n = true , - end-adjust .initial:n = 0.4 ex , - adjust .meta:n = { start-adjust = #1 , end-adjust = #1 } , - adjust .value_required:n = true , - no-arrows .code:n = - \cs_set_eq:NN \__wi_draw_arrows:nn \use_none:nn - \cs_set_eq:NN \__wi_draw_arrow:nnn \use_none:nnn , - no-arrows .value_forbidden:n = true , - } -\keys_define:nn { WithArrows / WithArrowsSpecific } - { - t .code:n = \int_set:Nn \l__wi_pos_env_int O , - t .value_forbidden:n = true , - c .code:n = \int_set:Nn \l__wi_pos_env_int 1 , - c .value_forbidden:n = true , - b .code:n = \int_set:Nn \l__wi_pos_env_int 2 , - b .value_forbidden:n = true - } -\clist_new:N \c__wi_extensible_delimiters_clist -\clist_set:Nn \c__wi_extensible_delimiters_clist - { - \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor - } -\AtBeginDocument - { - \bool_if:nT - { \c__wi_amsmath_loaded_bool || \use:c { c__wi_unicode-math_loaded_bool } } - { - \clist_put_right:Nn \c__wi_extensible_delimiters_clist { \lvert, \lVert } - } - } -\keys_define:nn { WithArrows / DispWithArrowsSpecific } - { - fleqn .bool_set:N = \l__wi_fleqn_bool , - fleqn .default:n = true , - mathindent .dim_set:N = \l__wi_mathindent_dim , - mathindent .value_required:n = true , - mathindent .initial:n = 25 pt , - notag .code:n = - \str_if_eq:nnTF { #1 } { true } - { \clist_clear:N \l__wi_tags_clist } - { \clist_set:Nn \l__wi_tags_clist { all } } , - notag .default:n = true , - subequations .code:n = - \bool_if:NTF \c__wi_amsmath_loaded_bool - { \bool_set_true:N \l__wi_subequations_bool } - { - \__wi_error:n { amsmath~not~loaded } - \group_begin: - \globaldefs = 1 - \__wi_msg_redirect_name:nn { amsmath~not~loaded } { info } - \group_end: - } , - subequations .default:n = true , - subequations .value_forbidden:n = true , - nonumber .meta:n = notag , - allow-multiple-labels .code:n = - \__wi_msg_redirect_name:nn { Multiple~labels } { none } , - allow-multiple-labels .value_forbidden:n = true , - wrap-lines .bool_set:N = \l__wi_wrap_lines_bool , - wrap-lines .default:n = true , - tagged-lines .code:n = - \clist_set:Nn \l__wi_tags_clist { #1 } - \clist_if_in:NnT \l__wi_tags_clist { first } - { - \clist_remove_all:Nn \l__wi_tags_clist { first } - \clist_put_left:Nn \l__wi_tags_clist \c_one_int - } , - tagged-lines .value_required:n = true , - replace-left-brace-by .code:n = - { - \clist_if_in:NnTF - \c__wi_extensible_delimiters_clist - { #1 } - { \tl_set:Nn \l__wi_replace_left_brace_by_tl { #1 } } - { \__wi_error:n { Bad~value~for~replace~brace~by } } - } , - replace-left-brace-by .initial:n = \lbrace , - standard-behaviour-with-items .bool_set:N = \l__wi_sbwi_bool , - standard-behaviour-with-items .default:n = true - } -\keys_define:nn { WithArrows / Env } - { - name .code:n = - \str_set:Nn \l_tmpa_str { #1 } - \seq_if_in:NVTF \g__wi_names_seq \l_tmpa_str - { \__wi_error:n { Duplicate~name } } - { \seq_gput_left:NV \g__wi_names_seq \l_tmpa_str } - \str_set_eq:NN \l__wi_name_str \l_tmpa_str , - name .value_required:n = true , - code-before .code:n = \tl_put_right:Nn \l__wi_code_before_tl { #1 } , - code-before .value_required:n = true, - CodeBefore .meta:n = { code-before = #1 } , - code-after .code:n = \tl_put_right:Nn \l__wi_code_after_tl { #1 } , - code-after .value_required:n = true , - CodeAfter .meta:n = { code-after = #1 } , - format .code:n = - \tl_if_empty:nTF { #1 } - { \__wi_error:n { Invalid~option~format } } - { - \regex_match:nnTF { \A[rcl]*\Z } { #1 } - { \tl_set:Nn \l__wi_format_str { #1 } } - { \__wi_error:n { Invalid~option~format } } - } , - format .value_required:n = true , - } -\keys_define:nn { WithArrows } - { - WithArrows .inherit:n = - { - WithArrows / Global , - WithArrows / WithArrowsSpecific , - WithArrows / Env - } , - DispWithArrows .inherit:n = - { - WithArrows / DispWithArrowsSpecific , - WithArrows / Global , - WithArrows / Env , - } , - WithArrowsOptions .inherit:n = - { - WithArrows / Global , - WithArrows / WithArrowsSpecific , - WithArrows / DispWithArrowsSpecific - } - } -\seq_new:N \l__wi_options_WithArrows_seq -\__wi_set_seq_of_str_from_clist:Nn \l__wi_options_WithArrows_seq - { - adjust, b, c, code-after, code-before, command-name, - displaystyle, end-adjust, - format, group, groups, i, - interline, jot, ll, - lr, more-columns, name, - no-arrows, rl, rr, - show-node-names, show-nodes, start-adjust, - t, tikz, tikz-code, - xoffset, ygap, ystart - } -\__wi_convert_to_str_seq:N \l__wi_options_WithArrows_seq -\keys_define:nn { WithArrows / WithArrows } - { - unknown .code:n = - \__wi_sort_seq:N \l__wi_options_WithArrows_seq - \__wi_error:n { Unknown~option~WithArrows } - } -\keys_define:nn { WithArrows / DispWithArrows } - { - left-brace .tl_set:N = \l__wi_left_brace_tl , - unknown .code:n = - \__wi_sort_seq:N \l__wi_options_DispWithArrows_seq - \__wi_error:n { Unknown~option~DispWithArrows } - } -\seq_new:N \l__wi_options_DispWithArrows_seq -\__wi_set_seq_of_str_from_clist:Nn \l__wi_options_DispWithArrows_seq - { - allow-multiple-labels, code-after, code-before, command-name, tikz-code, adjust, - displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot, - left-brace, ll, lr, mathindent, name, no-arrows, nonumber, notag, - replace-left-brace-by, rl, rr, show-node-names, show-nodes, start-adjust, - tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart - } -\keys_define:nn { WithArrows / WithArrowsOptions } - { - allow-duplicate-names .code:n = - \__wi_msg_redirect_name:nn { Duplicate~name } { none } , - allow-duplicate-names .value_forbidden:n = true , - unknown .code:n = - \__wi_sort_seq:N \l__wi_options_WithArrowsOptions_seq - \__wi_error:n { Unknown~option~WithArrowsOptions } - } -\seq_new:N \l__wi_options_WithArrowsOptions_seq -\__wi_set_seq_of_str_from_clist:Nn \l__wi_options_WithArrowsOptions_seq - { - allow-duplicate-names, allow-multiple-labels, b, c, command-name, - more-columns, tikz-code, adjust, displaystyle, end-adjust, fleqn, group, - groups, i, interline, jot, ll, lr, mathindent, no-arrows, nonumber, notag, - rl, rr, show-node-names, show-nodes, standard-behaviour-with-items, - start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart - } -\cs_new_protected:Npn \__wi_set_independent: - { - \str_if_empty:NTF \l__wi_previous_key_str - { - \str_set_eq:NN \l__wi_previous_key_str \l_keys_key_tl - \str_set:Nn \l__wi_status_arrow_str { independent } - \str_if_eq:VnF \l_keys_value_tl { NoValue } - { \__wi_error:n { Value~for~a~key } } - } - { \__wi_error:n { Incompatible~options~in~Arrow } } - } -\keys_define:nn { WithArrows / Arrow / FirstPass } - { - jump .code:n = - \int_compare:nTF { #1 > 0 } - { \int_set:Nn \l__wi_jump_int { #1 } } - { \__wi_error:n { Negative~jump } } , - jump .value_required:n = true, - rr .code:n = \__wi_set_independent: , - ll .code:n = \__wi_set_independent: , - rl .code:n = \__wi_set_independent: , - lr .code:n = \__wi_set_independent: , - i .code:n = \__wi_set_independent: , - rr .default:n = NoValue , - ll .default:n = NoValue , - rl .default:n = NoValue , - lr .default:n = NoValue , - i .default:n = NoValue , - new-group .value_forbidden:n = true, - new-group .code:n = - \int_compare:nTF { \l__wi_pos_arrow_int = 6 } - { \str_set:Nn \l__wi_status_arrow_str { new-group } } - { \__wi_error:n { new-group~without~groups } } , - tikz-code .code:n = \prg_do_nothing: , - tikz-code .value_required:n = true , - tikz .code:n = \prg_do_nothing: , - tikz .value_required:n = true , - xoffset .code:n = - \int_compare:nNnT \l__wi_pos_arrow_int > 5 - { \__wi_error:n { Option~xoffset~forbidden } } , - xoffset .value_required:n = true , - start-adjust .code:n = \prg_do_nothing: , - start-adjust .value_required:n = true , - end-adjust .code:n = \prg_do_nothing: , - end-adjust .value_required:n = true , - adjust .code:n = \prg_do_nothing: , - adjust .value_required:n = true , - unknown .code:n = - \__wi_sort_seq:N \l__wi_options_Arrow_seq - \seq_if_in:NVTF \l__wi_options_WithArrows_seq \l_keys_key_tl - { - \str_set:Nn \l_tmpa_str - { ~However,~this~key~can~be~used~in~the~options~of~\{WithArrows\}. } - } - { \str_clear:N \l_tmpa_str } - \__wi_error:n { Unknown~option~in~Arrow } - } -\seq_new:N \l__wi_options_Arrow_seq -\__wi_set_seq_of_str_from_clist:Nn \l__wi_options_Arrow_seq - { - adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, tikz-code, - xoffset - } -\cs_new_protected:Npn \__wi_fix_pos_arrow:n #1 - { - \str_if_empty:NT \l__wi_previous_key_str - { - \str_set_eq:NN \l__wi_previous_key_str \l_keys_key_tl - \int_set:Nn \l__wi_pos_arrow_int { #1 } - } - } -\keys_define:nn {WithArrows / Arrow / SecondPass } - { - tikz-code .tl_set:N = \l__wi_tikz_code_tl , - tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; , - tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .initial:n = \c_empty_tl , - rr .code:n = \__wi_fix_pos_arrow:n 3 , - ll .code:n = \__wi_fix_pos_arrow:n 1 , - rl .code:n = \__wi_fix_pos_arrow:n 2 , - lr .code:n = \__wi_fix_pos_arrow:n 0 , - i .code:n = \__wi_fix_pos_arrow:n 5 , - xoffset .code:n = - \int_compare:nNnF \l__wi_pos_arrow_int > 5 - { \dim_set:Nn \l__wi_xoffset_dim { #1 } } , - start-adjust .dim_set:N = \l__wi_start_adjust_dim, - end-adjust .dim_set:N = \l__wi_end_adjust_dim, - adjust .code:n = - \dim_set:Nn \l__wi_start_adjust_dim { #1 } - \dim_set:Nn \l__wi_end_adjust_dim { #1 } , - } -\NewDocumentCommand \WithArrowsOptions { m } - { - \str_clear_new:N \l__wi_previous_key_str - \keys_set:nn { WithArrows / WithArrowsOptions } { #1 } - } -\NewDocumentCommand \__wi_Arrow { O { } m ! O { } } - { - \int_gincr:N \g__wi_arrow_int - \str_clear_new:N \l__wi_previous_key_str - \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 } - \prop_put:NnV \l_tmpa_prop { initial } \g__wi_line_int - \int_set:Nn \l_tmpa_int { \g__wi_line_int + \l__wi_jump_int } - \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int - \prop_put:NnV \l_tmpa_prop { status } \l__wi_status_arrow_str - \prop_put:Nnn \l_tmpa_prop { options } { #1 , #3 } - \prop_put:Nnn \l_tmpa_prop { label } { #2 } - \prop_put:Nnx \l_tmpa_prop { input-line } \msg_line_number: - \prop_gclear_new:c - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \g__wi_arrow_int _ prop } - \prop_gset_eq:cN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \g__wi_arrow_int _ prop } - \l_tmpa_prop - } -\cs_new_protected:Npn \__wi_Arrow_first_columns: - { \__wi_error:n { Arrow~not~in~last~column } \__wi_Arrow } -\cs_new_protected:Npn \__wi_pre_halign:n #1 - { - \str_clear_new:N \l__wi_type_env_str - \str_set:NV \l__wi_type_env_str \@currenvir - \cs_if_exist:NT \tikz@library@external@loaded - { \tikzset { external / export = false } } - \str_clear_new:N \l__wi_name_str - \str_clear_new:N \l__wi_status_arrow_str - \dim_zero_new:N \l__wi_x_dim - \str_clear_new:N \l__wi_input_line_str - \seq_gput_right:NV \g__wi_arrow_int_seq \g__wi_arrow_int - \int_gzero:N \g__wi_arrow_int - \seq_gput_right:NV \g__wi_line_int_seq \g__wi_line_int - \int_gzero:N \g__wi_line_int - \seq_gput_right:NV \g__wi_col_int_seq \g__wi_col_int - \int_gzero:N \g__wi_col_int - \int_gzero_new:N \g__wi_static_col_int - \seq_gput_right:Nn \g__wi_position_in_the_tree_seq 1 - \seq_set_eq:NN \l_tmpa_seq \g__wi_position_in_the_tree_seq - \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl - \str_clear_new:N \l__wi_prefix_str - \str_set:Nx \l__wi_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - } - \cs_set_eq:NN \\ \__wi_cr: - \dim_zero:N \mathsurround - \int_zero_new:N \l__wi_initial_int - \int_zero_new:N \l__wi_final_int - \int_zero_new:N \l__wi_arrow_int - \int_zero_new:N \l__wi_pos_of_arrow_int - \int_zero_new:N \l__wi_jump_int - \int_set:Nn \l__wi_jump_int \c_one_int - \str_set:Nn \l__wi_format_str { rl } - \seq_clear_new:N \l__wi_labels_seq - \bool_set_false:N \l__wi_tag_next_line_bool - \skip_zero:N \l__wi_interline_skip - \tl_clear_new:N \l__wi_code_before_tl - \tl_clear_new:N \l__wi_code_after_tl - \str_clear_new:N \l__wi_previous_key_str - \bool_if:NT \l__wi_in_WithArrows_bool - { \keys_set:nn { WithArrows / WithArrows } { #1 } } - \bool_if:NT \l__wi_in_DispWithArrows_bool - { \keys_set:nn { WithArrows / DispWithArrows } { #1 } } - \cs_set_eq:cN \l__wi_command_name_str \__wi_Arrow_first_columns: - \int_set:Nn \l__wi_nb_cols_int { \str_count:N \l__wi_format_str } - \int_gset_eq:NN \g__wi_col_int \l__wi_nb_cols_int - \seq_clear_new:N \l__wi_format_seq - \seq_set_split:NnV \l__wi_format_seq { } \l__wi_format_str - \bool_if:NT \g__wi_footnote_bool { \begin { savenotes } } - \l__wi_code_before_tl - \spread@equation - \cs_set_eq:NN \notag \__wi_notag: - \cs_set_eq:NN \nonumber \__wi_nonumber: - \cs_set_eq:NN \tag \__wi_tag - \cs_set_eq:NN \__wi_old_label \label - \cs_set_eq:NN \label \__wi_label:n - \cs_set_eq:NN \tagnextline \__wi_tagnextline: - } -\cs_new_protected:Npn \__wi_construct_halign: - { - \seq_pop_right:NNTF \l__wi_format_seq \l__wi_type_col_str - { - \use:x - { - \int_gdecr:N \g__wi_col_int - \__wi_construct_halign: - \int_compare:nNnT \g__wi_col_int = \l__wi_nb_cols_int - { - \cs_set_eq:cN { \l__wi_command_name_str } \__wi_Arrow - \bool_if:NT \l__wi_in_DispWithArrows_bool - { - \__wi_test_if_to_tag: - \bool_if:NT \c__wi_amsthm_loaded_bool \__wi_set_qedhere: - } - } - \str_if_eq:VnT \l__wi_type_col_str { c } \hfil - \str_if_eq:VnT \l__wi_type_col_str { r } \hfill - \int_gincr:N \g__wi_col_int - \int_gset:Nn \g__wi_static_col_int { \int_use:N \g__wi_col_int } - \c_math_toggle_token - { - { } - \bool_if:NT \l__wi_displaystyle_bool \displaystyle - #### - } - \c_math_toggle_token - \int_compare:nNnTF \g__wi_col_int = \l__wi_nb_cols_int - { \__wi_construct_nodes: } - { - \str_if_eq:VnT \l__wi_type_col_str { l } \hfil - \str_if_eq:VnT \l__wi_type_col_str { c } \hfil - \bool_if:NT \l__wi_in_DispWithArrows_bool { \tabskip = \c_zero_skip } - & - } - } - } - { - \bool_if:NTF \l__wi_in_WithArrows_bool - { - \ialign - \bgroup - } - { - \halign to \l__wi_linewidth_dim - \bgroup - \bool_if:NT \l__wi_fleqn_bool - { \skip_horizontal:N \l__wi_mathindent_dim } - } - \int_gincr:N \g__wi_line_int - \int_gzero:N \g__wi_col_int - \tl_if_eq:NNF \l__wi_left_brace_tl \c_novalue_tl - { - \skip_horizontal:n - { \box_wd:N \l__wi_left_brace_box + \l__wi_delim_wd_dim } - } - \strut - } - } -\cs_new_protected:Npn \__wi_construct_nodes: - { - \tikz [ remember~picture , overlay ] - \node - [ - node~contents = { } , - __wi_node_style , - name = wa - \l__wi_prefix_str - \int_use:N \g__wi_line_int - l , - alias = - { - \str_if_empty:NF \l__wi_name_str - { \l__wi_name_str - \int_use:N \g__wi_line_int - l } - } - ] - ; - \hfil - \tikz [ remember~picture , overlay ] - \node - [ - node~contents = { } , - __wi_node_style , - name = wa - \l__wi_prefix_str - \int_use:N \g__wi_line_int - r , - alias = - { - \str_if_empty:NF \l__wi_name_str - { \l__wi_name_str - \int_use:N \g__wi_line_int - r } - } - ] - ; - \bool_if:NT \l__wi_show_node_names_bool - { - \hbox_overlap_right:n - { \small wa - \l__wi_prefix_str - \int_use:N \g__wi_line_int - r } - } - } -\NewDocumentEnvironment { WithArrows } { ! O { } } - { - \bool_set_true:N \l__wi_in_WithArrows_bool - \bool_set_false:N \l__wi_in_DispWithArrows_bool - \__wi_pre_halign:n { #1 } - \if_mode_math: \else: - \__wi_error:n { WithArrows~outside~math~mode } - \fi: - \int_case:nn \l__wi_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox } - \bgroup - \__wi_construct_halign: - && - \__wi_error:n { Too~much~columns~in~WithArrows } - \c_math_toggle_token - \bool_if:NT \l__wi_displaystyle_bool \displaystyle - { ## } - \c_math_toggle_token - \cr - } - { - \\ - \egroup - \egroup - \__wi_post_halign: - \bool_if:NT \g__wi_footnote_bool { \end { savenotes } } - } -\cs_new_protected:Npn \__wi_post_halign: - { - \cs_set:Npn \WithArrowsRightX { \g__wi_right_x_dim } - \int_compare:nNnT \g__wi_arrow_int > 0 \__wi_scan_arrows: - \group_begin: - \tikzset { every~picture / .style = __wi_standard } - \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__wi_line_int } - \cs_set_eq:NN \MultiArrow \__wi_MultiArrow:nn - \cs_set_eq:cN \l__wi_command_name_str \__wi_Arrow_code_after - \bool_set_true:N \l__wi_in_code_after_bool - \l__wi_code_after_tl - \group_end: - \seq_gpop_right:NN \g__wi_position_in_the_tree_seq \l_tmpa_tl - \seq_gpop_right:NN \g__wi_position_in_the_tree_seq \l_tmpa_tl - \seq_gput_right:Nx \g__wi_position_in_the_tree_seq - { \int_eval:n { \l_tmpa_tl + 1 } } - \int_compare:nNnT { \seq_count:N \g__wi_position_in_the_tree_seq } = 1 - { \int_gincr:N \g__wi_last_env_int } - \seq_gpop_right:NN \g__wi_arrow_int_seq \l_tmpa_tl - \int_gset:Nn \g__wi_arrow_int \l_tmpa_tl - \seq_gpop_right:NN \g__wi_line_int_seq \l_tmpa_tl - \int_gset:Nn \g__wi_line_int \l_tmpa_tl - \seq_gpop_right:NN \g__wi_col_int_seq \l_tmpa_tl - \int_gset:Nn \g__wi_col_int \l_tmpa_tl - } -\cs_new_protected:Npn \__wi_cr: - { - \scan_stop: - \int_compare:nNnF \g__wi_col_int = \g__wi_static_col_int - { \__wi_error:n { omit~probably~used } } - \prg_replicate:nn { \l__wi_nb_cols_int - \g__wi_static_col_int } { & { } } - \group_align_safe_begin: - \peek_meaning_remove:NTF * \__wi_cr_i: \__wi_cr_i: - } -\cs_new_protected:Npn \__wi_cr_i: - { \peek_meaning:NTF [ \__wi_cr_ii: { \__wi_cr_ii: [ \c_zero_dim ] } } -\cs_new_protected:Npn \__wi_cr_ii: [ #1 ] - { - \peek_meaning_ignore_spaces:NTF \end - { - \__wi_cr_iii:n { #1 } - \__wi_analyze_end:Nn - } - { \__wi_cr_iii:n { #1 } } - } -\cs_new_protected:Npn \__wi_cr_iii:n #1 - { - \group_align_safe_end: - \bool_if:NT \l__wi_in_DispWithArrows_bool - { - \clist_if_in:NnTF \l__wi_tags_clist { all } - { - \tl_if_empty:NT \l__wi_tag_tl { \int_gincr:N \c@equation } - \cs_gset:Npx \g_tmpa_tl - { \tl_if_empty:NTF \l__wi_tag_tl \theequation \l__wi_tag_tl } - \seq_if_empty:NF \l__wi_labels_seq - { - \cs_set:Npx \@currentlabel { \p@equation \g_tmpa_tl } - \bool_if:NT \c__wi_hyperref_loaded_bool - { - \str_set:Nn \This@name { equation } - \hyper@refstepcounter { equation } - } - \bool_if:NT \c__wi_cleveref_loaded_bool - { - \cref@constructprefix { equation } \cref@result - \protected@edef \cref@currentlabel - { - [ - \cs_if_exist:NTF \cref@equation@alias - \cref@equation@alias - { equation } - ] - [ \arabic { equation } ] [ \cref@result ] - \p@equation \g_tmpa_tl - } - } - \seq_map_function:NN \l__wi_labels_seq \__wi_old_label - } - \__wi_save:N \l__wi_tag_star_bool - \__wi_save:N \l__wi_qedhere_bool - \bool_if:NT \l__wi_tag_next_line_bool - { - \openup -\jot - \bool_set_false:N \l__wi_tag_next_line_bool - \notag \\ & - } - & - \__wi_restore:N \l__wi_tag_star_bool - \__wi_restore:N \l__wi_qedhere_bool - \bool_if:NT \l__wi_qedhere_bool - { \hbox_overlap_left:n \__wi_qedhere_i: } - \cs_set_eq:NN \theequation \g_tmpa_tl - \bool_if:NT \l__wi_tag_star_bool - { \cs_set_eq:NN \tagform@ \prg_do_nothing: } - \hbox_overlap_left:n - { - \bool_if:NF \c__wi_leqno_bool - { - \tikz [ __wi_standard ] - \coordinate ( \int_use:N \g__wi_line_int - v ) ; - } - \quad - \@eqnnum - } - \bool_if:NT \c__wi_leqno_bool - { - \tikz [ __wi_standard ] - \coordinate ( \int_use:N \g__wi_line_int - v ) ; - } - } - { - \__wi_save:N \l__wi_qedhere_bool - & - \__wi_restore:N \l__wi_qedhere_bool - \bool_if:NT \l__wi_qedhere_bool - { \hbox_overlap_left:n \__wi_qedhere_i: } - \tikz [ __wi_standard ] - \coordinate ( \int_use:N \g__wi_line_int - v ) ; - } - } - \dim_compare:nNnT { #1 } < \c_zero_dim - { \__wi_error:n { option~of~cr~negative } } - \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim } - \cr - \noalign - { - \skip_vertical:n { \l_tmpa_dim + \l__wi_interline_skip } - \scan_stop: - } - } -\cs_new_protected:Npn \__wi_analyze_end:Nn #1 #2 - { - \exp_args:NV \str_if_eq:nnT \l__wi_type_env_str { #2 } - { \__wi_warning:n { newline~at~the~end~of~env } } - \end { #2 } - } -\bool_new:N \l__wi_in_label_or_minipage_bool -\NewDocumentEnvironment { DispWithArrows } { ! d < > ! O { } } - { - \bool_set_true:N \l__wi_in_DispWithArrows_bool - \bool_if:nT \c__wi_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \MT_showonlyrefs_false: - \MH_set_boolean_T:n { show_only_refs } - } - } - \bool_if:NT \c__wi_typedref_loaded_bool { \str_set:Nn \sr@name { equation } } - \bool_if:NT \c__wi_amsmath_loaded_bool \intertext@ - \IfValueT { #1 } { \tl_set:Nn \l__wi_left_brace_tl { #1 } } - \__wi_pre_halign:n { #2 } - \bool_if:NT \l__wi_subequations_bool { \begin { subequations } } - \bool_if:NF \l__wi_sbwi_bool - { - \if@inlabel - \bool_set_true:N \l__wi_in_label_or_minipage_bool - \fi - \if@minipage - \bool_set_true:N \l__wi_in_label_or_minipage_bool - \fi - } - \tl_if_eq:NNF \l__wi_left_brace_tl \c_novalue_tl - { - \hbox_set:Nn \l_tmpa_box - { - \c_math_toggle_token - \left \l__wi_replace_left_brace_by_tl \vcenter to 1 cm { } \right. - \c_math_toggle_token - } - \dim_zero_new:N \l__wi_delim_wd_dim - \dim_set:Nn \l__wi_delim_wd_dim { \box_wd:N \l_tmpa_box } - \box_clear_new:N \l__wi_left_brace_box - \hbox_set:Nn \l__wi_left_brace_box - { - \group_begin: - \cs_set_eq:NN \label \__wi_old_label - \c_math_toggle_token - \bool_if:NT \l__wi_displaystyle_bool \displaystyle - \l__wi_left_brace_tl - { } - \c_math_toggle_token - \group_end: - } - } - \tl_clear_new:N \l__wi_tag_tl - \bool_set_false:N \l__wi_qedhere_bool - \bool_set_false:N \l__wi_tag_star_bool - \if_mode_math: - \__wi_fatal:n { DispWithArrows~in~math~mode } - \fi: - \bool_if:NTF \l__wi_in_label_or_minipage_bool - { \c_math_toggle_token } - { - \if_mode_vertical: - \nointerlineskip - \hbox_to_wd:nn { .6 \linewidth } { } - \fi: - \c_math_toggle_token \c_math_toggle_token - } - \dim_zero_new:N \l__wi_linewidth_dim - \bool_if:NTF \l__wi_in_label_or_minipage_bool - { \dim_set_eq:NN \l__wi_linewidth_dim \linewidth } - { \dim_set_eq:NN \l__wi_linewidth_dim \displaywidth } - \box_clear_new:N \l__wi_halign_box - \setbox \l__wi_halign_box \vtop \bgroup - \tabskip = - \bool_if:NTF \l__wi_fleqn_bool - \c_zero_skip - { 0 pt plus 1000 pt minus 1000 pt } - \__wi_construct_halign: - \tabskip = 0 pt plus 1000 pt minus 1000 pt - & - $ ## $ - \tabskip = \c_zero_skip - && - \__wi_fatal:n { Too~much~columns~in~DispWithArrows } - \bool_if:nT \c_false_bool { ## } - \cr - } - { - \clist_if_in:NnT \l__wi_tags_clist { last } - { \clist_set:Nn \l__wi_tags_clist { all } } - \\ - \egroup - \unskip \unpenalty \unskip \unpenalty - \box_set_to_last:N \l_tmpa_box - \nointerlineskip - \box_use:N \l_tmpa_box - \dim_gzero_new:N \g__wi_alignment_dim - \dim_gset:Nn \g__wi_alignment_dim { \box_wd:N \l_tmpa_box } - \box_clear_new:N \l__wi_new_box - \hbox_set:Nn \l__wi_new_box { \hbox_unpack_clear:N \l_tmpa_box } - \dim_compare:nNnT - { \box_wd:N \l__wi_new_box } < \g__wi_alignment_dim - { \dim_gset:Nn \g__wi_alignment_dim { \box_wd:N \l__wi_new_box } } - \egroup - \tl_if_eq:NNTF \l__wi_left_brace_tl \c_novalue_tl - { \box_use_drop:N \l__wi_halign_box } - { - \hbox_to_wd:nn \l__wi_linewidth_dim - { - \bool_if:NTF \l__wi_fleqn_bool - { \skip_horizontal:n \l__wi_mathindent_dim } - \hfil - \hbox_to_wd:nn \g__wi_alignment_dim - { - \box_use_drop:N \l__wi_left_brace_box - \dim_set:Nn \l_tmpa_dim - { - \box_ht:N \l__wi_halign_box - + \box_dp:N \l__wi_halign_box - } - \c_math_toggle_token - \left \l__wi_replace_left_brace_by_tl - \vcenter to \l_tmpa_dim { \vfil } - \right. - \c_math_toggle_token - \hfil - } - \hfil - } - \skip_horizontal:n { - \l__wi_linewidth_dim } - \vcenter { \box_use_drop:N \l__wi_halign_box } - } - \dim_gzero_new:N \g__wi_right_x_dim - \dim_gset_eq:NN \g__wi_right_x_dim \c_max_dim - \begin { tikzpicture } [ __wi_standard ] - \int_step_variable:nNn \g__wi_line_int \l_tmpa_int - { - \cs_if_free:cTF - { pgf@sh@ns@wa - \l__wi_prefix_str - \l_tmpa_int - v } - { \__wi_fatal:n { Inexistent~v-node } } - { - \tikz@parse@node\pgfutil@firstofone ( \l_tmpa_int - v ) - \dim_set:Nn \l_tmpa_dim \pgf@x - \dim_compare:nNnT \l_tmpa_dim < \g__wi_right_x_dim - { \dim_gset:Nn \g__wi_right_x_dim \l_tmpa_dim } - } - } - \end { tikzpicture } - \__wi_post_halign: - \bool_if:nT \c__wi_mathtools_loaded_bool - { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: } - \bool_if:NTF \l__wi_in_label_or_minipage_bool - { - \c_math_toggle_token - \skip_vertical:N \belowdisplayskip - } - { \c_math_toggle_token \c_math_toggle_token } - \bool_if:NT \l__wi_subequations_bool { \end { subequations } } - \bool_if:NT \g__wi_footnote_bool { \end { savenotes } } - \ignorespacesafterend - } -\NewDocumentEnvironment { DispWithArrows* } { } - { - \WithArrowsOptions { notag } - \DispWithArrows - } - \endDispWithArrows -\cs_new_protected:Npn \__wi_if_in_last_col_of_disp:Nn #1 #2 - { - \bool_if:NTF \l__wi_in_WithArrows_bool - { \__wi_error:nn { Not~allowed~in~WithArrows } { #1 } } - { - \int_compare:nNnTF \g__wi_col_int < \l__wi_nb_cols_int - { \__wi_error:nn { Not~allowed~in~DispWithArrows } { #1 } } - { #2 } - } - } -\cs_new_protected:Npn \__wi_notag: - { \__wi_if_in_last_col_of_disp:Nn \notag { \clist_clear:N \l__wi_tags_clist } } -\cs_new_protected:Npn \__wi_nonumber: - { \__wi_if_in_last_col_of_disp:Nn \nonumber { \clist_clear:N \l__wi_tags_clist } } -\NewDocumentCommand \__wi_tag { s m } - { - \__wi_if_in_last_col_of_disp:Nn \tag - { - \tl_if_empty:NF \l__wi_tag_tl - { \__wi_error:nn { Multiple~tags } { #2 } } - \clist_set:Nn \l__wi_tags_clist { all } - \bool_if:nT \c__wi_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \MH_if_boolean:nF { show_manual_tags } - { \clist_clear:N \l__wi_tags_clist } - } - } - \tl_set:Nn \l__wi_tag_tl { #2 } - \bool_set:Nn \l__wi_tag_star_bool { #1 } - \bool_if:nT { #1 && ! \bool_if_p:N \c__wi_amsmath_loaded_bool } - { \__wi_error:n { tag*~without~amsmath } } - } - } -\cs_new_protected:Npn \__wi_label:n #1 - { - \__wi_if_in_last_col_of_disp:Nn \label - { - \seq_if_empty:NF \l__wi_labels_seq - { - \bool_if:NTF \c__wi_cleveref_loaded_bool - { \__wi_error:n { Multiple~labels~with~cleveref } } - { \__wi_error:n { Multiple~labels } } - } - \seq_put_right:Nn \l__wi_labels_seq { #1 } - \bool_if:nT \c__wi_mathtools_loaded_bool - { - \MH_if_boolean:nT { show_only_refs } - { - \cs_if_exist:cTF { MT_r_#1 } - { \clist_set:Nn \l__wi_tags_clist { all } } - { \clist_clear:N \l__wi_tags_clist } - } - } - \bool_if:nT \c__wi_autonum_loaded_bool - { - \cs_if_exist:cTF { autonum@#1Referenced } - { \clist_set:Nn \l__wi_tags_clist { all } } - { \clist_clear:N \l__wi_tags_clist } - } - } - } -\cs_new_protected:Npn \__wi_tagnextline: - { - \__wi_if_in_last_col_of_disp:Nn \tagnextline - { \bool_set_true:N \l__wi_tag_next_line_bool } - } -\cs_new_protected:Npn \__wi_qedhere: { \bool_set_true:N \l__wi_qedhere_bool } -\cs_new_protected:Npn \__wi_set_qedhere: { \cs_set_eq:NN \qedhere \__wi_qedhere: } -\cs_new_protected:Npn \__wi_qedhere_i: - { - \group_begin: - \cs_set_eq:NN \qed \qedsymbol - \cs_set_eq:NN \qed@elt \setQED@elt - \QED@stack \relax \relax - \group_end: - } -\cs_new_protected:Npn \__wi_scan_arrows: - { - \group_begin: - \int_compare:nNnT \l__wi_pos_arrow_int = 7 - { - \__wi_scan_arrows_i: - \int_set:Nn \l__wi_pos_arrow_int 8 - } - \__wi_scan_arrows_i: - \group_end: - } -\cs_new_protected:Npn \__wi_scan_arrows_i: - { - \int_zero_new:N \l__wi_first_arrow_of_group_int - \int_zero_new:N \l__wi_first_line_of_group_int - \int_zero_new:N \l__wi_last_line_of_group_int - \seq_clear_new:N \l__wi_first_arrows_seq - \seq_clear_new:N \l__wi_last_arrows_seq - \bool_set_true:N \l__wi_new_group_bool - \int_set:Nn \l__wi_arrow_int \c_one_int - \int_until_do:nNnn \l__wi_arrow_int > \g__wi_arrow_int - { - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { initial } \l_tmpa_tl - \int_set:Nn \l__wi_initial_int \l_tmpa_tl - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { final } \l_tmpa_tl - \int_set:Nn \l__wi_final_int \l_tmpa_tl - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { status } \l__wi_status_arrow_str - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { input-line } \l__wi_input_line_str - \int_compare:nNnTF \l__wi_final_int > \g__wi_line_int - { - \int_compare:nNnF \l__wi_pos_arrow_int = 8 - { \__wi_error:n { Too~few~lines~for~an~arrow } } - } - \__wi_code_for_possible_arrow: - \int_incr:N \l__wi_arrow_int - } - \bool_if:nT - { - \int_compare_p:n { \l__wi_pos_arrow_int != 7 } - && - \int_compare_p:nNn \l__wi_first_arrow_of_group_int > 0 - } - { \__wi_draw_arrows:nn \l__wi_first_arrow_of_group_int \g__wi_arrow_int } - } -\cs_new_protected:Npn \__wi_code_for_possible_arrow: - { - \bool_if:nT - { - \int_compare_p:nNn \l__wi_arrow_int > \c_one_int - && - ( \int_compare_p:n { \l__wi_initial_int > \l__wi_last_line_of_group_int } - && - \int_compare_p:n { \l__wi_pos_arrow_int != 7 } - || - \str_if_eq_p:Vn \l__wi_status_arrow_str { new-group } - ) - } - { - \int_compare:nNnF \l__wi_first_arrow_of_group_int = \c_zero_int - { - \__wi_draw_arrows:nn - \l__wi_first_arrow_of_group_int - { \l__wi_arrow_int - 1 } - } - \bool_set_true:N \l__wi_new_group_bool - } - \bool_if:nTF \l__wi_new_group_bool - { - \bool_set_false:N \l__wi_new_group_bool - \int_set_eq:NN \l__wi_first_arrow_of_group_int \l__wi_arrow_int - \int_set_eq:NN \l__wi_first_line_of_group_int \l__wi_initial_int - \int_set_eq:NN \l__wi_last_line_of_group_int \l__wi_final_int - \seq_clear:N \l__wi_first_arrows_seq - \seq_put_left:NV \l__wi_first_arrows_seq \l__wi_arrow_int - \seq_clear:N \l__wi_last_arrows_seq - \seq_put_left:NV \l__wi_last_arrows_seq \l__wi_arrow_int - \int_compare:nT { \l__wi_pos_arrow_int != 8 } - { \dim_set:Nn \l__wi_x_dim { - \c_max_dim } } - } - { - \bool_if:nF - { \str_if_eq_p:Vn \l__wi_status_arrow_str { independent } } - { - \int_compare:nT - { \l__wi_initial_int = \l__wi_first_line_of_group_int } - { \seq_put_left:NV \l__wi_first_arrows_seq \l__wi_arrow_int } - \int_compare:nNnTF \l__wi_final_int > \l__wi_last_line_of_group_int - { - \int_set_eq:NN \l__wi_last_line_of_group_int \l__wi_final_int - \seq_clear:N \l__wi_last_arrows_seq - \seq_put_left:NV \l__wi_last_arrows_seq \l__wi_arrow_int - } - { - \int_compare:nNnT \l__wi_final_int = \l__wi_last_line_of_group_int - { \seq_put_left:NV \l__wi_last_arrows_seq \l__wi_arrow_int } - } - } - } - \bool_if:nF { \str_if_eq_p:Vn \l__wi_status_arrow_str { independent } } - { - \int_compare:nT { \l__wi_pos_arrow_int != 8 } - { \__wi_update_x:nn \l__wi_initial_int \l__wi_final_int } - } - } -\cs_generate_variant:Nn \keys_set:nn { n o } -\cs_new_protected:Npn \__wi_keys_set: - { \keys_set_known:no { WithArrows / Arrow / SecondPass } } -\cs_new_protected:Npn \__wi_draw_arrows:nn #1 #2 - { - \group_begin: - \int_zero_new:N \l__wi_first_arrow_int - \int_set:Nn \l__wi_first_arrow_int { #1 } - \int_zero_new:N \l__wi_last_arrow_int - \int_set:Nn \l__wi_last_arrow_int { #2 } - \int_set:Nn \l__wi_arrow_int \l__wi_first_arrow_int - \int_until_do:nNnn \l__wi_arrow_int > \l__wi_last_arrow_int - { - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { initial } \l_tmpa_tl - \int_set:Nn \l__wi_initial_int \l_tmpa_tl - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { final } \l_tmpa_tl - \int_set:Nn \l__wi_final_int \l_tmpa_tl - \int_compare:nT { \l__wi_final_int <= \g__wi_line_int } \__wi_draw_arrows_i: - \int_incr:N \l__wi_arrow_int - } - \group_end: - } -\cs_new_protected:Npn \__wi_draw_arrows_i: - { - \group_begin: - \prop_get:cnN - { g__wi_arrow _\l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { options } \l_tmpa_tl - \str_clear_new:N \l__wi_previous_key_str - \exp_args:NNo \exp_args:No - \__wi_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__wi_xoffset_dim } } - \bool_set_false:N \l__wi_initial_r_bool - \bool_set_false:N \l__wi_final_r_bool - \int_case:nn \l__wi_pos_arrow_int - { - 0 { \bool_set_true:N \l__wi_final_r_bool } - 2 { \bool_set_true:N \l__wi_initial_r_bool } - 3 - { - \bool_set_true:N \l__wi_initial_r_bool - \bool_set_true:N \l__wi_final_r_bool - } - } - \int_compare:nNnT \l__wi_pos_arrow_int = 5 - { - \dim_set:Nn \l__wi_x_dim { - \c_max_dim } - \__wi_update_x:nn \l__wi_initial_int \l__wi_final_int - } - \tl_set:Nx \l__wi_initial_tl - { - \int_use:N \l__wi_initial_int - \bool_if:NTF \l__wi_initial_r_bool rl - .south - } - \tl_set:Nx \l__wi_final_tl - { \int_use:N \l__wi_final_int - \bool_if:NTF \l__wi_final_r_bool rl .north } - \prop_get:cnN - { g__wi_arrow _ \l__wi_prefix_str _ \int_use:N \l__wi_arrow_int _ prop } - { label } - \l_tmpa_tl - \seq_if_in:NxTF \l__wi_first_arrows_seq - { \int_use:N \l__wi_arrow_int } - { \bool_set_true:N \l_tmpa_bool } - { \bool_set_false:N \l_tmpa_bool } - \seq_if_in:NxTF \l__wi_last_arrows_seq - { \int_use:N \l__wi_arrow_int } - { \bool_set_true:N \l_tmpb_bool } - { \bool_set_false:N \l_tmpb_bool } - \int_compare:nNnT \l__wi_pos_arrow_int = 5 - { - \bool_set_true:N \l_tmpa_bool - \bool_set_true:N \l_tmpb_bool - } - \begin { tikzpicture } [ __wi_standard ] - \tikz@scan@one@point \pgfutil@firstofone ( \l__wi_initial_tl ) - \tl_gset:Nx \g_tmpa_tl - { - \int_compare:nNnTF \l__wi_pos_arrow_int < 5 - { \dim_use:N \pgf@x } - { \dim_use:N \l__wi_x_dim } , - \bool_if:NTF \l_tmpa_bool - { \dim_eval:n { \pgf@y + \l__wi_start_adjust_dim } } - { \dim_use:N \pgf@y } - } - \tikz@scan@one@point \pgfutil@firstofone ( \l__wi_final_tl ) - \tl_gset:Nx \g_tmpb_tl - { - \int_compare:nNnTF \l__wi_pos_arrow_int < 5 - { \dim_use:N \pgf@x } - { \dim_use:N \l__wi_x_dim } , - \bool_if:NTF \l_tmpb_bool - { \dim_eval:n { \pgf@y - \l__wi_end_adjust_dim } } - { \dim_use:N \pgf@y } - } - \end { tikzpicture } - \__wi_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl - \group_end: - } -\cs_new_protected:Npn \__wi_def_function_tmpa:n #1 - { - \cs_set:Npn \__wi_tmpa:nnn ##1 ##2 ##3 - { - \begin{tikzpicture} - [ - __wi_standard , - every~path / .style = WithArrows / arrow - ] - #1 - \end{tikzpicture} - } - } -\cs_new_protected:Npn \__wi_draw_arrow:nnn #1 #2 #3 - { - \bool_if:nT { \l__wi_wrap_lines_bool && \l__wi_in_DispWithArrows_bool } - { \tl_set_eq:NN \l__wi_tikz_code_tl \c__wi_tikz_code_wrap_lines_tl } - \exp_args:NV \__wi_def_function_tmpa:n \l__wi_tikz_code_tl - \__wi_tmpa:nnn { #1 } { #2 } { #3 } - } -\cs_generate_variant:Nn \__wi_draw_arrow:nnn { n n o } -\tl_const:Nn \c__wi_tikz_code_wrap_lines_tl - { - \draw ( #1 ) to node ( __wi_label ) { } ( #2 ) ; - \tikz@parse@node \pgfutil@firstofone ( __wi_label.west ) - \dim_set:Nn \l_tmpa_dim - { \g__wi_right_x_dim - \pgf@x - \pgfkeysvalueof { / pgf / inner~xsep } } - \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz@text@width } ; - \tl_if_empty:NF \g_tmpa_tl - { - \dim_set:Nn \l_tmpb_dim \g_tmpa_tl - \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim - { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } - } - \dim_compare:nNnT \l_tmpa_dim > \c_zero_dim - { - \path ( __wi_label.west ) - node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ] - { #3 } ; - } - } -\cs_new_protected:Npn \__wi_update_x:nn #1 #2 - { - \int_step_inline:nnn { #1 } { #2 } - { - \begin { tikzpicture } [ __wi_standard ] - \tikz@scan@one@point \pgfutil@firstofone ( ##1 - l ) - \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__wi_x_dim \pgf@x } - \end { tikzpicture } - \dim_set_eq:NN \l__wi_x_dim \g_tmpa_dim - } - } -\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__wi_last_env_int } -\keys_define:nn { WithArrows / Arrow / code-after } - { - tikz .code:n = - \tikzset { WithArrows / arrow / .append~style = { #1 } } , - tikz .value_required:n = true , - rr .value_forbidden:n = true , - rr .code:n = \__wi_fix_pos_option:n 0 , - ll .value_forbidden:n = true, - ll .code:n = \__wi_fix_pos_option:n 1 , - rl .value_forbidden:n = true , - rl .code:n = \__wi_fix_pos_option:n 2 , - lr .value_forbidden:n = true , - lr .code:n = \__wi_fix_pos_option:n 3 , - v .value_forbidden:n = true , - v .code:n = \__wi_fix_pos_option:n 4 , - tikz-code .tl_set:N = \l__wi_tikz_code_tl , - tikz-code .value_required:n = true , - xoffset .dim_set:N = \l__wi_xoffset_dim , - xoffset .value_required:n = true , - unknown .code:n = - \__wi_sort_seq:N \l__wi_options_Arrow_code_after_seq - \__wi_error:n { Unknown~option~Arrow~in~code-after } - } -\seq_new:N \l__wi_options_Arrow_code_after_seq -\__wi_set_seq_of_str_from_clist:Nn \l__wi_options_Arrow_code_after_seq - { ll, lr, rl, rr, tikz, tikz-code, v, x, offset } -\NewDocumentCommand \__wi_Arrow_code_after { O { } m m m ! O { } } - { - \int_set:Nn \l__wi_pos_arrow_int 1 - \str_clear_new:N \l__wi_previous_key_str - \group_begin: - \keys_set:nn { WithArrows / Arrow / code-after } - { #1, #5, tikz = { xshift = \l__wi_xoffset_dim } } - \bool_set_false:N \l__wi_initial_r_bool - \bool_set_false:N \l__wi_final_r_bool - \int_case:nn \l__wi_pos_arrow_int - { - 0 - { - \bool_set_true:N \l__wi_initial_r_bool - \bool_set_true:N \l__wi_final_r_bool - } - 2 { \bool_set_true:N \l__wi_initial_r_bool } - 3 { \bool_set_true:N \l__wi_final_r_bool } - } - \tl_if_eq:nnTF { #2 } { #3 } - { \__wi_error:nn { Both~lines~are~equal } { #2 } } - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l__wi_prefix_str - #2 - l } - { \__wi_error:nx { Wrong~line~in~Arrow } { #2 } } - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l__wi_prefix_str - #3 - l } - { \__wi_error:nx { Wrong~line~in~Arrow } { #3 } } - { - \int_compare:nNnTF \l__wi_pos_arrow_int = 4 - { - \begin { tikzpicture } [ __wi_standard ] - \tikz@scan@one@point \pgfutil@firstofone (#2-l.south) - \dim_set_eq:NN \l_tmpa_dim \pgf@x - \dim_set_eq:NN \l_tmpb_dim \pgf@y - \tikz@scan@one@point \pgfutil@firstofone (#3-l.north) - \dim_set:Nn \l_tmpa_dim - { \dim_max:nn \l_tmpa_dim \pgf@x } - \tl_gset:Nx \g_tmpa_tl - { \dim_use:N \l_tmpa_dim , \dim_use:N \l_tmpb_dim } - \tl_gset:Nx \g_tmpb_tl - { \dim_use:N \l_tmpa_dim , \dim_use:N \pgf@y } - \end { tikzpicture } - } - { - \begin { tikzpicture } [ __wi_standard ] - \tikz@scan@one@point \pgfutil@firstofone - ( #2-\bool_if:NTF\l__wi_initial_r_bool rl .south ) - \tl_gset:Nx \g_tmpa_tl - { \dim_use:N \pgf@x , \dim_use:N \pgf@y } - \tikz@scan@one@point \pgfutil@firstofone - ( #3-\bool_if:NTF\l__wi_final_r_bool rl .north ) - \tl_gset:Nx \g_tmpb_tl - { \dim_use:N \pgf@x , \dim_use:N \pgf@y } - \end { tikzpicture } - } - \__wi_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 } - } - } - } - \group_end: - } -\cs_new_protected:Npn \__wi_MultiArrow:nn #1 #2 - { - \foreach \x in { #1 } - { - \cs_if_free:cTF { pgf@sh@ns@wa - \l__wi_prefix_str - \x - l } - { \__wi_error:nx { Wrong~line~specification~in~MultiArrow } \x } - { \clist_gput_right:Nx \g_tmpa_clist \x } - } - \int_compare:nTF { \clist_count:N \g_tmpa_clist < 2 } - { \__wi_error:n { Too~small~specification~for~MultiArrow } } - { - \clist_sort:Nn \g_tmpa_clist - { - \int_compare:nTF { ##1 > ##2 } - \sort_return_swapped: - \sort_return_same: - } - \clist_pop:NN \g_tmpa_clist \l_tmpa_tl - \clist_reverse:N \g_tmpa_clist - \clist_pop:NN \g_tmpa_clist \l_tmpb_tl - \exp_args:NV \__wi_MultiArrow_i:n \g_tmpa_clist - \begin { tikzpicture } - [ - __wi_standard , - every~path / .style = { WithArrows / arrow } - ] - \draw [<->] ([xshift = \l__wi_xoffset_dim]\l_tmpa_tl-r.south) - -- ++(5mm,0) - -- node (__wi_label) {} - ([xshift = \l__wi_xoffset_dim+5mm]\l_tmpb_tl-r.south) - -- ([xshift = \l__wi_xoffset_dim]\l_tmpb_tl-r.south) ; - \tikz@parse@node \pgfutil@firstofone (__wi_label.west) - \dim_set:Nn \l_tmpa_dim { 20 cm } - \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz@text@width } ; - \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl } - \bool_if:nT { \l__wi_wrap_lines_bool && \l__wi_in_DispWithArrows_bool } - { - \dim_set:Nn \l_tmpb_dim - { \g__wi_right_x_dim - \pgf@x - 0.3333 em } - \dim_compare:nNnT \l_tmpb_dim < \l_tmpa_dim - { \dim_set_eq:NN \l_tmpa_dim \l_tmpb_dim } - } - \path (__wi_label.west) - node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ; - \end{tikzpicture} - } - } -\cs_new_protected:Npn \__wi_MultiArrow_i:n #1 - { - \begin {tikzpicture } - [ - __wi_standard , - every~path / .style = { WithArrows / arrow } - ] - \foreach \k in { #1 } - { - \draw [ <- ] - ( [xshift = \l__wi_xoffset_dim]\k-r.south ) -- ++(5mm,0) ; - } ; - \end { tikzpicture } - } -\str_const:Nn \c__wi_option_ignored_str - { If~you~go~on,~this~option~will~be~ignored. } -\str_const:Nn \c__wi_command_ignored_str - { If~you~go~on,~this~command~will~be~ignored. } -\__wi_msg_new:nn { amsmath~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~the~ - package~'amsmath'~has~not~been~loaded.\\ - If~you~go~on,~this~option~will~be~ignored~in~the~rest~ - of~the~document. - } -\__wi_msg_new:nn { Bad~value~for~replace~brace~by } - { - Bad~value~for~the~option~'\l_keys_key_tl'.~The~value~must~be~ - an~extensible~left~delimiter.~The~possible~values~are:~ - \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~ - \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~ - \token_to_str:N \langle,~\token_to_str:N \lmoustache,~ - \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\ - (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\ - if~amsmath~or~unicode-math~is~loaded).\\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { option~of~cr~negative } - { - The~argument~of~the~command~\token_to_str:N\\~ - should~be~positive~in~the~row~\int_use:N \g__wi_line_int\ - of~your~environment~\{\l__wi_type_env_str\}.\\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { omit~probably~used } - { - There~is~a~problem.~Maybe~you~have~used~a~command~ - \token_to_str:N\omit\ in~the~line~\int_use:N \g__wi_line_int\ - (or~another~line)~of~your~environment~\{\l__wi_type_env_str\}.\\ - You~can~go~on~but~you~may~have~others~errors. - } -\__wi_msg_new:nn { newline~at~the~end~of~env } - { - Your~environment~\{\l__wi_type_env_str\}~should~not~end~with~ - a~\token_to_str:N \\.\\ - This~warning~might~become~an~error~in~a~future~version. - } -\__wi_msg_new:nn { Invalid~option~format } - { - The~key~'format'~should~contain~only~letters~r,~c~and~l~and~ - must~not~be~empty.\\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Value~for~a~key } - { - The~key~'\l_keys_key_tl'~should~be~used~without~value. \\ - However,~you~can~go~on~for~this~time. - } -\__wi_msg_new:nnn { Unknown~option~in~Arrow } - { - The~key~'\l_keys_key_tl'~is~unknown~for~the~command~ - \l__wi_string_Arrow_for_msg_str\ in~the~row~ - \int_use:N \g__wi_line_int\ of~your~environment~ - \{\l__wi_type_env_str\}. \l_tmpa_str \\ - \c__wi_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l__wi_options_Arrow_seq {~and~} {,~} {~and~}. - } -\__wi_msg_new:nnn { Unknown~option~WithArrows } - { - The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wi_type_env_str\}. \\ - \c__wi_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l__wi_options_WithArrows_seq {~and~} {,~} {~and~}. - } -\__wi_msg_new:nnn { Unknown~option~DispWithArrows } - { - The~key~'\l_keys_key_tl'~is~unknown~in~\{\l__wi_type_env_str\}. \\ - \c__wi_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l__wi_options_DispWithArrows_seq {~and~} {,~} {~and~}. - } -\__wi_msg_new:nnn { Unknown~option~WithArrowsOptions } - { - The~key~'\l_keys_key_tl'~is~unknown~in~ - \token_to_str:N \WithArrowsOptions. \\ - \c__wi_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l__wi_options_WithArrowsOptions_seq {~and~} {,~} {~and~}. - } -\__wi_msg_new:nnn { Unknown~option~Arrow~in~code-after } - { - The~key~'\l_keys_key_tl'~is~unknown~in~ - \token_to_str:N \Arrow\ in~code-after. \\ - \c__wi_option_ignored_str \\ - For~a~list~of~the~available~keys,~type~H~<return>. - } - { - The~available~keys~are~(in~alphabetic~order):~ - \seq_use:Nnnn \l__wi_options_Arrow_code_after_seq {~and~} {,~} {~and~}. - } -\__wi_msg_new:nn { Too~much~columns~in~WithArrows } - { - Your~environment~\{\l__wi_type_env_str\}~has~\int_use:N - \l__wi_nb_cols_int\ columns~and~you~try~to~use~one~more.~ - Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~ - If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~ - the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\ - However,~you~can~go~one~for~this~time. - } -\__wi_msg_new:nn { Too~much~columns~in~DispWithArrows } - { - Your~environment~\{\l__wi_type_env_str\}~has~\int_use:N - \l__wi_nb_cols_int\ columns~and~you~try~to~use~one~more.~ - Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\ - at~the~end~of~row~\int_use:N \g__wi_line_int. \\ - This~error~is~fatal. - } -\__wi_msg_new:nn { Negative~jump } - { - You~can't~use~a~negative~value~for~the~option~'jump'~of~command~ - \l__wi_string_Arrow_for_msg_str\ - in~the~row~\int_use:N \g__wi_line_int\ - of~your~environment~\{\l__wi_type_env_str\}.~ - You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { new-group~without~groups } - { - You~can't~use~the~option~'new-group'~for~the~command~ - \l__wi_string_Arrow_for_msg_str\ - because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~ - 'groups'~in~your~environment~\{\l__wi_type_env_str\}. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn - { Too~few~lines~for~an~arrow } - { - Line~\l__wi_input_line_str\ - :~an~arrow~specified~in~the~row~\int_use:N \l__wi_initial_int\ - of~your~environment~\{\l__wi_type_env_str\}~can't~be~drawn~ - because~it~arrives~after~the~last~row~of~the~environment. \\ - If~you~go~on,~this~arrow~will~be~ignored. - } -\__wi_msg_new:nn { WithArrows~outside~math~mode } - { - The~environment~\{\l__wi_type_env_str\}~should~be~used~only~in~math~mode~ - like~the~environment~\{aligned\}~of~amsmath. \\ - Nevertheless,~you~can~go~on. - } -\__wi_msg_new:nn { DispWithArrows~in~math~mode } - { - The~environment~\{\l__wi_type_env_str\}~should~be~used~only~outside~math~ - mode~like~the~environment~\{align\}~of~amsmath. \\ - This~error~is~fatal. - } -\__wi_msg_new:nn { Incompatible~options~in~Arrow } - { - You~try~to~use~the~option~'\l_keys_key_tl'~but~ - this~option~is~incompatible~or~redundant~with~the~option~ - '\l__wi_previous_key_str'~set~in~the~same~command~ - \l__wi_string_Arrow_for_msg_str. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Incompatible~options } - { You~try~to~use~the~option~'\l_keys_key_tl'~but~ - this~option~is~incompatible~or~redundant~with~the~option~ - '\l__wi_previous_key_str'~set~in~the~same~command~ - \bool_if:NT \l__wi_in_code_after_bool - { - \l__wi_string_Arrow_for_msg_str\ - in~the~code-after~of~your~environment~\{\l__wi_type_env_str\} - }. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Arrow~not~in~last~column } - { - You~should~use~the~command~\l__wi_string_Arrow_for_msg_str\ - only~in~the~last~column~(column~\int_use:N\l__wi_nb_cols_int)~ - of~your~environment~\{\l__wi_type_env_str\}.\\ - However~you~can~go~on~for~this~time. - } -\__wi_msg_new:nn { Wrong~line~in~Arrow } - { - The~specification~of~line~'#1'~you~use~in~the~command~ - \l__wi_string_Arrow_for_msg_str\ - in~the~'code-after'~of~\{\l__wi_type_env_str\}~doesn't~exist. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Both~lines~are~equal } - { - In~the~'code-after'~of~\{\l__wi_type_env_str\}~you~try~to~ - draw~an~arrow~going~to~it~self~from~the~line~'#1'.~This~is~not~possible. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Wrong~line~specification~in~MultiArrow } - { - The~specification~of~line~'#1'~doesn't~exist. \\ - If~you~go~on,~it~will~be~ignored~for~\token_to_str:N \MultiArrow. - } -\__wi_msg_new:nn { Too~small~specification~for~MultiArrow } - { - The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\ - is~too~small:~you~need~at~least~two~lines. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { tag*~without~amsmath } - { - We~can't~use~\token_to_str:N\tag*~because~you~haven't~loaded~amsmath~ - (or~mathtools). \\ - If~you~go~on,~the~command~\token_to_str:N\tag\ - will~be~used~instead. - } -\__wi_msg_new:nn { Not~allowed~in~DispWithArrows } - { - The~command~\token_to_str:N #1 - is~allowed~only~in~the~last~column~ - (column~\int_use:N\l__wi_nb_cols_int)~of~\{\l__wi_type_env_str\}. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Not~allowed~in~WithArrows } - { - The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__wi_type_env_str\}~ - (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { Multiple~tags } - { - You~can't~use~twice~the~command~\token_to_str:N\tag\ - in~a~line~of~the~environment~\{\l__wi_type_env_str\}. \\ - If~you~go~on,~the~tag~'#1'~will~be~used. - } -\__wi_msg_new:nn { Multiple~labels } - { - Normally,~we~can't~use~the~command~\token_to_str:N\label\ - twice~in~a~line~of~the~environment~\{\l__wi_type_env_str\}. \\ - However,~you~can~go~on.~ - \bool_if:NT \c__wi_showlabels_loaded_bool - { However,~only~the~last~label~will~be~shown~by~showlabels.~ } - If~you~don't~want~to~see~this~message~again,~you~can~use~the~option~ - 'allow-multiple-labels'~at~the~global~or~environment~level. - } -\__wi_msg_new:nn { Multiple~labels~with~cleveref } - { - Since~you~use~cleveref,~you~can't~use~the~command~\token_to_str:N\label\ - twice~in~a~line~of~the~environment~\{\l__wi_type_env_str\}. \\ - If~you~go~on,~you~may~have~undefined~references. - } -\__wi_msg_new:nn { Inexistent~v-node } - { - There~is~a~problem.~Maybe~you~have~put~a~command~\token_to_str:N\cr\ - instead~of~a~command~\token_to_str:N\\~at~the~end~of~ - the~row~\l_tmpa_int\ - of~your~environment~\{\l__wi_type_env_str\}. \\ - This~error~is~fatal. - } -\__wi_msg_new:nn { Option~xoffset~forbidden } - { - You~can't~use~the~option~'xoffset'~in~the~command~ - \l__wi_string_Arrow_for_msg_str\ - while~you~are~using~the~option~ - ' \int_compare:nNnTF \l__wi_pos_arrow_int = 7 - { group } - { groups } '. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nnn { Duplicate~name } - { - The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~ - the~same~environment~name~twice.~You~can~go~on,~but,~ - maybe,~you~will~have~incorrect~results. \\ - For~a~list~of~the~names~already~used,~type~H~<return>. \\ - If~you~don't~want~to~see~this~message~again,~use~the~option~ - 'allow-duplicate-names'. - } - { - The~names~already~defined~in~this~document~are:~ - \seq_use:Nnnn \g__wi_names_seq { ,~ } { ,~ } { ~and~ }. - } -\NewDocumentCommand \WithArrowsNewStyle { m m } - { - \keys_if_exist:nnTF { WithArrows / Global } { #1 } - { \__wi_error:nn { Key~already~defined } { #1 } } - { - \keys_define:nn { WithArrows / Global } - { - #1 .code:n = - { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } } - } - \seq_put_right:Nx \l__wi_options_WithArrows_seq { \tl_to_str:n { #1 } } - \seq_put_right:Nx \l__wi_options_DispWithArrows_seq - { \tl_to_str:n { #1 } } - \seq_put_right:Nx \l__wi_options_WithArrowsOptions_seq - { \tl_to_str:N { #1 } } - \group_begin: - \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions } - { - The~key~'\l_keys_key_tl'~can't~be~set~in~the~ - definition~of~a~style.~You~can~go~on~for~this~time~ - but~you~should~suppress~this~key. - } - \WithArrowsOptions { #2 } - \group_end: - } - } -\__wi_msg_new:nn { Key~already~defined } - { - The~key~'#1'~is~already~defined. \\ - If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\ - will~be~ignored. - } -\tl_const:Nn \c__wi_tikz_code_up_tl - { - \draw [ rounded~corners ] - let \p1 = (#1) , - \p2 = (#2) - in (\p1) -- node { - \dim_set:Nn \l_tmpa_dim { \x2 - \x1 } - \begin { varwidth } \l_tmpa_dim - \raggedright - #3 - \end { varwidth } - } - (\x2,\y1) -- (\p2) ; - } -\tl_const:Nn \c__wi_tikz_code_down_tl - { - \draw [ rounded~corners ] - let \p1 = (#1) , - \p2 = (#2) - in (\p1) -- (\x1,\y2) -- - node { - \dim_set:Nn \l_tmpa_dim { \x1 - \x2 } - \begin { varwidth } \l_tmpa_dim - \raggedright - #3 - \end { varwidth } - } - (\p2) ; - } -\keys_define:nn { WithArrows / Arrow / FirstPass } - { - up .code:n = \__wi_set_independent: , - down .code:n = \__wi_set_independent: , - up .default:n = NoValue , - down .default:n = NoValue - } -\keys_define:nn { WithArrows / Arrow / SecondPass } - { - up .code:n = - \str_if_empty:NT \l__wi_previous_key_str - { - \str_set:Nn \l__wi_previous_key_str { up } - \bool_if:NTF \c__wi_varwidth_loaded_bool - { - \cs_if_exist:cTF { tikz@library@calc@loaded } - { - \int_set:Nn \l__wi_pos_arrow_int \c_one_int - \bool_set_false:N \l__wi_wrap_lines_bool - \tl_set_eq:NN \l__wi_tikz_code_tl - \c__wi_tikz_code_up_tl - } - { \__wi_error:n { calc~not~loaded } } - } - { \__wi_error:n { varwidth~not~loaded } } - } , - down .code:n = - \str_if_empty:NT \l__wi_previous_key_str - { - \str_set:Nn \l__wi_previous_key_str { down } - \bool_if:NTF \c__wi_varwidth_loaded_bool - { - \cs_if_exist:cTF { tikz@library@calc@loaded } - { - \int_set:Nn \l__wi_pos_arrow_int \c_one_int - \bool_set_false:N \l__wi_wrap_lines_bool - \tl_set_eq:NN \l__wi_tikz_code_tl - \c__wi_tikz_code_down_tl - } - { \__wi_error:n { calc~not~loaded } } - } - { \__wi_error:n { varwidth~not~loaded } } - } - } -\seq_put_right:Nn \l__wi_options_Arrow_seq { down } -\seq_put_right:Nn \l__wi_options_Arrow_seq { up } -\__wi_msg_new:nn { varwidth~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~ - you~don't~have~loaded~the~package~'varwidth'. \\ - \c__wi_option_ignored_str - } -\__wi_msg_new:nn { calc~not~loaded } - { - You~can't~use~the~option~'\l_keys_key_tl'~because~you~don't~have~loaded~the~ - Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}' - ~in~the~preamble~of~your~document. \\ - \c__wi_option_ignored_str - } -\endinput -%% -%% End of file `witharrows.sty'. |