%%
%% This is file `witharrows.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% witharrows.dtx  (with options: `package')
%% 
%% Copyright (C) 2017 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.1}
\def\myfiledate{2017/11/06}
\RequirePackage{l3keys2e}
\ProvidesExplPackage
  {witharrows}
  {\myfiledate}
  {\myfileversion}
  {Draws arrows for explanations on the right}
\RequirePackage{expl3}
\RequirePackage{xparse}
\RequirePackage{tikz}
\usetikzlibrary{calc,arrows.meta,bending}
\RequirePackage{footnote}
\tikzstyle{__wa_node_style}=[rectangle,
                           inner~sep = 0 pt,
                           minimum~height = 3 pt,
                           minimum~width = 0pt,
                           red,
                           \bool_if:NT \l__wa_shownodes_bool {draw}]
\tikzset{TipsOfWithArrows/.style= { > = {Straight~Barb[scale=1.2,bend]}} }
\cs_if_free:NT \spread@equation
    {\cs_set:Npn \spread@equation{\openup\jot
                                  \cs_set_eq:NN \spread@equation \prg_do_nothing}}
\seq_new:N \g__wa_position_in_the_tree_seq
\seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
\int_new:N \g__wa_last_env_int
\skip_new:N \l__wa_interline_skip
\bool_new:N \l__wa_MoreColumns_bool
\int_new:N \l__wa_pos_int
\bool_new:N \l__wa_initial_r_bool
\bool_set_true:N \l__wa_initial_r_bool
\bool_new:N \l__wa_final_r_bool
\bool_set_true:N \l__wa_final_r_bool
\bool_new:N \l__wa_i_bool
\dim_new:N \l__wa_xoffset_dim
\dim_set:Nn \l__wa_xoffset_dim {3mm}
\bool_new:N \l__wa_shownodes_bool
\bool_new:N \l__wa_shownodenames_bool
\bool_new:N \l__wa_displaystyle_bool
\tl_clear_new:N \l__wa_options_tikz_tl
\bool_new:N \l__wa_position_key_already_set_bool
\seq_new:N \g__wa_stack_counter_arrows_seq
\int_new:N \g__wa_arrow_int
\seq_new:N \g__wa_stack_counter_lines_seq
\int_new:N \g__wa_line_int
\seq_new:N \g__wa_stack_counter_lines_bis_seq
\int_new:N \g__wa_line_bis_int

\keys_define:nn {WithArrows}
    { jump  .groups:n   = {jump,secondary},
      jump  .code:n     = {\int_set:Nn \l__wa_jump_int {#1}
                           \int_compare:nNnF \l__wa_jump_int > 0
                               {\msg_error:nn {witharrows}
                                              {The~option~"jump"~must~be~non~negative}}},
      jump  .value_required:n  = true,
      t   .groups:n          = {global,env,secondary},
      t   .code:n            = {\int_set:Nn \l__wa_pos_int 0},
      t   .value_forbidden:n = true,
      c   .groups:n          = {global,env,secondary},
      c   .code:n            = {\int_set:Nn \l__wa_pos_int 1},
      c   .value_forbidden:n = true,
      b   .groups:n          = {global,env,secondary},
      b   .code:n            = {\int_set:Nn \l__wa_pos_int 2},
      b   .value_forbidden:n = true,
      MoreColumns .groups:n          = {global,env,secondary},
      MoreColumns .bool_set:N        = \l__wa_MoreColumns_bool,
      MoreColumns .default:n         = true,
      MoreColumns .value_forbidden:n = true,
      CommandName .groups:n         = {global,env,secondary},
      CommandName .tl_set:N         = \l__wa_CommandName_tl,
      CommandName .initial:n        = {Arrow},
      CommandName .value_required:n = true,
      displaystyle .groups:n          = {global,env,secondary},
      displaystyle .bool_set:N        = \l__wa_displaystyle_bool,
      %
      shownodes .groups:n          = {global,env,secondary},
      shownodes .bool_set:N        = \l__wa_shownodes_bool,
      shownodes .default:n         = true,
      shownodenames .groups:n          = {global,env,secondary},
      shownodenames .bool_set:N        = \l__wa_shownodenames_bool,
      shownodenames .default:n         = true,
      jot       .groups:n          = {env,secondary},
      jot       .dim_set:N         = \jot,
      jot       .value_required:n  = true,
      interline   .groups:n         = {env,secondary},
      interline   .skip_set:N       = \l__wa_interline_skip,
      interline   .initial:n        = \c_zero_skip,
      interline   .value_required:n = true,
      xoffset  .groups:n          = {global,env,local,secondary},
      xoffset  .dim_set:N         = \l__wa_xoffset_dim,
      xoffset  .value_required:n  = true,
      tikz     .groups:n          = {global,env,local,secondary},
      tikz     .code:n            = {\tl_put_right:Nn \l__wa_options_tikz_tl {,#1}},
      tikz     .value_required:n  = true,
      ll       .groups:n          = {global,env,local,secondary},
      ll       .value_forbidden:n = true,
      ll       .default:n         = true,
      ll       .code:n            = {\bool_if:NT \l__wa_position_key_already_set_bool
                                       {\msg_error:nn {witharrows}
                                                      {Two~options~are~incompatible}}
                                     \bool_if:NT \l__wa_group_bool
                                       {\msg_error:nn {witharrows}
                                                      {Option~incompatible~with~group}}
                                     \bool_set_true:N \l__wa_position_key_already_set_bool
                                     \bool_set_false:N \l__wa_initial_r_bool
                                     \bool_set_false:N \l__wa_final_r_bool
                                     \bool_set_false:N \l__wa_i_bool },
      lr       .groups:n          = {global,env,local,secondary},
      lr       .value_forbidden:n = true,
      lr       .default:n         = true,
      lr       .code:n            = {\bool_if:NT \l__wa_position_key_already_set_bool
                                       {\msg_error:nn {witharrows}
                                                      {Two~options~are~incompatible}}
                                     \bool_if:NT \l__wa_group_bool
                                       {\msg_error:nn {witharrows}
                                                      {Option~incompatible~with~group}}
                                     \bool_set_true:N \l__wa_position_key_already_set_bool
                                     \bool_set_false:N \l__wa_initial_r_bool
                                     \bool_set_true:N  \l__wa_final_r_bool
                                     \bool_set_false:N \l__wa_i_bool},
      rl       .groups:n          = {global,env,local,secondary},
      rl       .value_forbidden:n = true,
      rl       .default:n         = true,
      rl       .code:n            = {\bool_if:NT \l__wa_position_key_already_set_bool
                                       {\msg_error:nn {witharrows}
                                                      {Two~options~are~incompatible}}
                                     \bool_if:NT \l__wa_group_bool
                                       {\msg_error:nn {witharrows}
                                                      {Option~incompatible~with~group}}
                                     \bool_set_true:N \l__wa_position_key_already_set_bool
                                     \bool_set_true:N  \l__wa_initial_r_bool
                                     \bool_set_false:N \l__wa_final_r_bool
                                     \bool_set_false:N \l__wa_i_bool},
      rr       .groups:n          = {global,env,local,secondary},
      rr       .value_forbidden:n = true,
      rr       .default:n         = true,
      rr       .code:n            = {\bool_if:NT \l__wa_position_key_already_set_bool
                                       {\msg_error:nn {witharrows}
                                                      {Two~options~are~incompatible}}
                                     \bool_if:NT \l__wa_group_bool
                                       {\msg_error:nn {witharrows}
                                                      {Option~incompatible~with~group}}
                                     \bool_set_true:N \l__wa_position_key_already_set_bool
                                     \bool_set_true:N  \l__wa_initial_r_bool
                                     \bool_set_true:N  \l__wa_final_r_bool
                                     \bool_set_false:N  \l__wa_i_bool},
      i        .groups:n          = {global,env,local,secondary},
      i        .code:n            = {\bool_if:NT \l__wa_position_key_already_set_bool
                                       {\msg_error:nn {witharrows}
                                                      {Two~options~are~incompatible}}
                                     \bool_if:NT \l__wa_group_bool
                                       {\msg_error:nn {witharrows}
                                                      {Option~incompatible~with~group}}
                                     \bool_set_true:N \l__wa_position_key_already_set_bool
                                     \bool_set_true:N \l__wa_i_bool},
      i        .value_forbidden:n = true,
      i        .default:n         = true,
      group        .groups:n          = {global,env},
      group        .bool_set:N        = \l__wa_group_bool,
      group        .value_forbidden:n = true
}
\ProcessKeysOptions {WithArrows}
\NewDocumentCommand \WithArrowsOptions {m}
    {\bool_set_false:N \l__wa_position_key_already_set_bool
     \keys_set_filter:nnn {WithArrows} {secondary} {#1}
     \keys_set_groups:nnn {WithArrows} {global} {#1}}
\NewDocumentCommand \__wa_Arrow {O{} m O{}}
         {\tl_if_eq:noF {WithArrows} {\@currenvir}
                  {\msg_error:nn {witharrows} {Arrow~used~outside~{WithArrows}~environment}}
          \int_gincr:N \g__wa_arrow_int
          \int_zero_new:N \l__wa_jump_int
          \int_set:Nn \l__wa_jump_int 1
          \keys_set_groups:nnn {WithArrows} {jump} {#1,#3}
          \prop_put:NnV \l_tmpa_prop {initial} \g__wa_line_int
          \int_set:Nn \l_tmpa_int {\g__wa_line_int + \l__wa_jump_int}
          \prop_put:NnV \l_tmpa_prop {final} \l_tmpa_int
          \prop_put:Nnn \l_tmpa_prop {options} {#1,#3}
          \prop_put:Nnn \l_tmpa_prop {label} {#2}
          \prop_gclear_new:c
                {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\g__wa_arrow_int _prop}
          \prop_gset_eq:cN
                {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\g__wa_arrow_int _prop}
                \l_tmpa_prop
          }
\NewDocumentEnvironment {WithArrows} {O{}}
         { \seq_gput_right:NV \g__wa_stack_counter_arrows_seq \g__wa_arrow_int
           \int_gzero:N \g__wa_arrow_int
           \seq_gput_right:NV \g__wa_stack_counter_lines_seq \g__wa_line_int
           \int_gzero:N \g__wa_line_int
           \seq_gput_right:NV \g__wa_stack_counter_lines_bis_seq \g__wa_line_bis_int
           \int_gzero:N \g__wa_line_bis_int
           \seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1
           \seq_set_eq:NN \l_tmpa_seq \g__wa_position_in_the_tree_seq
           \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
           \tl_clear_new:N \l__wa_prefix_tl
           \tl_set:Nx \l__wa_prefix_tl {\seq_use:Nnnn \l_tmpa_seq {-} {-} {-}}

           \reverse_if:N \if_mode_math:
                             \msg_error:nn {witharrows} {{WithArrows}~used~outside~math~mode}
                         \fi
           \savenotes
           \cs_set_eq:NN \\ \__wa_cr:
           \mathsurround = \c_zero_dim
           \int_zero_new:N \l__wa_initial_int
           \int_zero_new:N \l__wa_final_int
           \int_zero_new:N \l__wa_arrow_int
           \bool_set_false:N \l__wa_position_key_already_set_bool
           \skip_zero:N \l__wa_interline_skip
           \keys_set_filter:nnn {WithArrows} {secondary} {#1}
           \keys_set_groups:nnn {WithArrows} {env} {#1}
           \cs_set_eq:cN \l__wa_CommandName_tl \__wa_Arrow
           \int_case:nn \l__wa_pos_int
                   {0 {\vtop}
                    1 {\vcenter}
                    2 {\vbox}}
           \bgroup
           \spread@equation
           \ialign\bgroup
           \int_gincr:N \g__wa_line_int
           \strut\hfil
           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
           &
           \int_gincr:N \g__wa_line_bis_int
           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {{}##}$
           \tikz[remember~picture]
                  \node [__wa_node_style]
                  (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\g__wa_line_int-l) {} ;
           \hfil
           \tikz[remember~picture,label~position=right]
                  \node [__wa_node_style]
                  (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\g__wa_line_int-r) {} ;
           \bool_if:NT \l__wa_shownodenames_bool
                {\hbox_overlap_right:n {\small wa-\tl_use:N\l__wa_prefix_tl
                                                 -\int_use:N\g__wa_line_int}}
           && \bool_if:NF \l__wa_MoreColumns_bool
                {\msg_error:nn {witharrows} {Third~column~in~a~{WithArrows}~environment}}
           $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$
           \cr
          }
          {\crcr
           \egroup
           \egroup
           \int_compare:nNnT \g__wa_line_bis_int < \g__wa_line_int
                  {\msg_error:nn {witharrows} {All~lines~must~have~an~ampersand}}
            \int_compare:nNnT \g__wa_arrow_int > 0
                    \__wa_draw_arrows:
           \spewnotes
           \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
           \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl
           \seq_gput_right:Nx \g__wa_position_in_the_tree_seq {\int_eval:n {\l_tmpa_tl + 1}}
           \int_compare:nNnT {\seq_count:N \g__wa_position_in_the_tree_seq} = 1
                      {\int_gincr:N \g__wa_last_env_int}
           \seq_gpop_right:NN \g__wa_stack_counter_arrows_seq {\l_tmpa_tl}
           \int_gset:Nn \g__wa_arrow_int {\l_tmpa_tl}
           \seq_gpop_right:NN \g__wa_stack_counter_lines_seq \l_tmpa_tl
           \int_gset:Nn \g__wa_line_int {\l_tmpa_tl}
           \seq_gpop_right:NN \g__wa_stack_counter_lines_bis_seq \l_tmpa_tl
           \int_gset:Nn \g__wa_line_bis_int {\l_tmpa_tl}
           }
\cs_set_protected:Nn \__wa_cr:
      {\scan_stop:
       \group_align_safe_begin:
       \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i:}
\cs_set_protected:Nn \__wa_cr_i:
      {\peek_meaning:NTF [ {\__wa_cr_ii:} {\__wa_cr_ii:[\c_zero_dim]} }
\cs_new_protected:Npn \__wa_cr_ii:[#1]
      {\group_align_safe_end:
       \cr\noalign{\skip_vertical:n {#1 + \l__wa_interline_skip}
       \scan_stop:}}
\cs_generate_variant:Nn \keys_set_groups:nnn {nno}
\cs_new_protected:Nn \keys_set_groups_WithArrows_local:
                     {\keys_set_groups:nno {WithArrows} {local}}
\cs_generate_variant:Nn \keys_set_filter:nnn {nno}
\cs_new_protected:Nn \keys_set_filter_WithArrows_secondary:
           {\keys_set_filter:nno {WithArrows} {secondary}}
\cs_new_protected:Nn \__wa_draw_arrows:
  {
   \bool_if:NT \l__wa_group_bool
        \__wa_x_computation_for_option_group:
   \int_set:Nn \l__wa_arrow_int 1
   \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
     {
      \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
                    {initial} \l_tmpa_tl
      \int_set:Nn \l__wa_initial_int {\l_tmpa_tl}
      \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
                    {final} \l_tmpa_tl
      \int_set:Nn \l__wa_final_int {\l_tmpa_tl}
      \int_compare:nNnT \l__wa_final_int > \g__wa_line_int
             {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
           \group_begin:
           \keys_define:nn {WithArrows} {group .undefine:}
           \bool_set_false:N \l__wa_position_key_already_set_bool
           \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl
                             _\int_use:N\l__wa_arrow_int _prop} {options} \l_tmpa_tl
           \exp_args:NNo \exp_args:No \keys_set_filter_WithArrows_secondary: {\l_tmpa_tl}
           \exp_args:NNo \exp_args:No \keys_set_groups_WithArrows_local: {\l_tmpa_tl}
           \bool_if:NT \l__wa_i_bool
               \__wa_x_computation_for_option_i:
           \tl_set:Nx \l__wa_initial_tl
                   {wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-
                            \bool_if:NTF\l__wa_initial_r_bool rl}
           \tl_set:Nx \l__wa_final_tl
                   {wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_final_int-
                            \bool_if:NTF\l__wa_final_r_bool rl . north}
           \begin{tikzpicture}[remember~picture,
                               overlay,
                               align=left,
                               auto=left,
                               font = {\small\itshape},
                               TipsOfWithArrows,
                               ->,
                               looseness=1,
                               bend~left=45]
           \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
                         {label} \l_tmpa_tl
           \draw \exp_after:wN [\l__wa_options_tikz_tl]
                 let \p1 = (\tl_use:N \l__wa_initial_tl),
                     \p2 = (\tl_use:N \l__wa_final_tl) in
                   (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool}
                     {\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y1}
                     {\x1 + \dim_use:N \l__wa_xoffset_dim, \y1} )
                   to node [node~contents = {\tl_use:N \l_tmpa_tl}] {}
                   (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool}
                     {\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y2}
                     {\x2 + \dim_use:N \l__wa_xoffset_dim, \y2} ) ;
           \end{tikzpicture}
       \group_end:
       \int_incr:N \l__wa_arrow_int
      }
     }
\cs_new_protected:Nn \__wa_x_computation_for_option_i:
  {\dim_gzero_new:N \g__wa_x_dim
   \tikz[remember~picture]
      \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-l)
            in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
   \__wa_x_computation_analyze_lines_between:
   }
\cs_new_protected:Nn \__wa_x_computation_analyze_lines_between:
    {\int_compare:nNnT \l__wa_final_int > \g__wa_line_int
             {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}}
     \int_set:Nn \l_tmpa_int \l__wa_initial_int
     \int_until_do:nNnn \l_tmpa_int > \l__wa_final_int
         {\tikz[remember~picture]
             \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l_tmpa_int-l)
                   in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\dim_max:nn \g__wa_x_dim {\x1}}} ;
          \int_incr:N \l_tmpa_int
         }
    }
\cs_new_protected:Nn \__wa_x_computation_for_option_group:
  {\dim_gzero_new:N \g__wa_x_dim
   \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _1_prop} {initial} \l_tmpa_tl
   \tikz[remember~picture]
      \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\tl_use:N\l_tmpa_tl-l)
            in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ;
   \int_set:Nn \l__wa_arrow_int 1
   \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int
      {
        \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
                      {initial} \l_tmpa_tl
        \int_set:Nn \l__wa_initial_int {\l_tmpa_tl}
        \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop}
                      {final} \l_tmpa_tl
        \int_set:Nn \l__wa_final_int {\l_tmpa_tl}
        \__wa_x_computation_analyze_lines_between:
        \int_incr:N \l__wa_arrow_int
      }
   }
\cs_generate_variant:Nn \int_compare:nNnT {cNnT}
\cs_generate_variant:Nn \tl_if_eq:nnF {noF}
\bigskip
\NewDocumentCommand \WithArrowsLastEnv {}
     {\int_use:N \g__wa_last_env_int}
\msg_new:nnn {witharrows}
             {Third~column~in~a~{WithArrows}~environment}
             {By~default,~a~\{WithArrows\}~environment~can~only~have~two~columns.~
              Maybe~you~have~forgotten~a~newline~symbol.~If~you~really~want~
              more~than~two~columns,~you~should~use~the~option~"MoreColumns"~at~
              a~global~level~or~for~an~environment.~However,~you~can~go~one~for~this~time.}
\msg_new:nnn {witharrows}
             {Arrow~used~outside~{WithArrows}~environment}
             {The~command~\string\Arrow\space~should~be~used~only~directly~
              in~\{WithArrows\}~environment~and~not~in~a~subenvironment.~However,~you~
              can~go~on.}
\msg_new:nnn {witharrows}
             {The~option~"jump"~must~be~non~negative}
             {You~can't~use~a~strictly~negative~value~for~the~option~"jump"~of~command~
              \string\Arrow.~ You~can~create~an~arrow~going~backwards~with~
              the~option~"<-"~of~Tikz.}
\msg_new:nnn {witharrows}
             {Too~few~lines~for~an~arrow}
             {There~is~at~least~an~arrow~that~can't~be~drawn~because~it~arrives~after~the~
              last~line~of~the~environment.}
\msg_new:nnn {witharrows}
             {{WithArrows}~used~outside~math~mode}
             {The~environment~\{WithArrows\}~should~be~used~only~in~math~mode.~
              Nevertheless,~you~can~go~on.}
\msg_new:nnn {witharrows}
             {Option~incompatible~with~group}
             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~
              you~are~using~the~option~"group".~It's~incompatible.~You~can~go~on~ignoring~
              this~option~"\tl_use:N\l_keys_key_tl"~and~"group"~will~be~used.}
\msg_new:nnn {witharrows}
             {Two~options~are~incompatible}
             {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~
             this~option~is~incompatible~with~an~option~previously~set.~
             If~you~go~on,~I~will~overwrite~the~previous~option.}
\msg_new:nnnn {witharrows}
              {All~lines~must~have~an~ampersand}
              {All~lines~of~an~environment~\{WithArrows\}~must~have~an~second~column~
               (because~the~nodes~are~created~in~the~second~column).~You~can~go~on~but~maybe~
               you~will~have~an~pgf~error~for~an~undefined~shape.}
              {The~ampersand~can~be~implicit~
               (e.g.~if~you~use~\string\MoveEqLeft\space~of~mathtools).}
\endinput
%%
%% End of file `witharrows.sty'.
