%%
%% 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.15}
\def\myfiledate{2019/02/20}
\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__witharrows_footnotehyper_bool
\bool_new:N \g__witharrows_footnote_bool
\cs_new_protected:Npn \__witharrows_msg_new:nn { \msg_new:nnn { witharrows } }
\cs_new_protected:Npn \__witharrows_msg_new:nnn { \msg_new:nnnn { witharrows } }
\cs_new_protected:Npn \__witharrows_msg_redirect_name:nn
  { \msg_redirect_name:nnn { witharrows } }
\keys_define:nn { WithArrows / package }
  {
    footnote .bool_gset:N = \g__witharrows_footnote_bool ,
    footnotehyper .bool_gset:N = \g__witharrows_footnotehyper_bool ,
    unknown .code:n =
      \msg_fatal:nn { witharrows } { Option~unknown~for~package }
  }
\__witharrows_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 }
\__witharrows_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.
  }
\__witharrows_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.
  }
\__witharrows_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.
  }
\bool_if:NT \g__witharrows_footnote_bool
  {
    \@ifclassloaded { beamer }
      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
      { }
    \@ifpackageloaded { footnotehyper }
      { \msg_fatal:nn { witharrows } { footnote~with~footnotehyper~package } }
      { }
    \usepackage { footnote }
  }
\bool_if:NT \g__witharrows_footnotehyper_bool
  {
    \@ifclassloaded { beamer }
      { \msg_fatal:nn { witharrows } { Option~incompatible~with~Beamer } }
      { }
    \@ifpackageloaded { footnote }
      { \msg_fatal:nn { witharrows } { footnotehyper~with~footnote~package } }
      { }
    \usepackage { footnotehyper }
    \bool_gset_true:N \g__witharrows_footnote_bool
  }
\bool_new:N \c__witharrows_leqno_bool
\DeclareOption { leqno } { \bool_set_true:N \c__witharrows_leqno_bool }
\DeclareOption* { }
\ProcessOptions*
\cs_new_protected:Npn \__witharrows_error:n { \msg_error:nn { witharrows } }
\cs_new_protected:Npn \__witharrows_error:nn  { \msg_error:nnn { witharrows } }
\cs_generate_variant:Nn \__witharrows_error:nn { n x }
\cs_new_protected:Nn \__witharrows_bool_new:N
  {
    \bool_if_exist:NTF #1
      { \bool_set_false:N #1 }
      { \bool_new:N #1 }
  }
\AtBeginDocument
  {
    \clist_map_inline:nn
      {
        amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels,
        typedref, varwidth
      }
      {
        \bool_new:c { c__witharrows_#1_loaded_bool }
        \@ifpackageloaded { #1 }
          { \bool_set_true:c { c__witharrows_#1_loaded_bool } }
          { }
      }
  }
\sys_if_engine_luatex:TF
  {
    \cs_new_protected:Nn \__witharrows_strcmp:nn
      { \lua_now:e { l3kernel.strcmp('#1','#2') } }
  }
  { \cs_new_protected:Nn \__witharrows_strcmp:nn { \pdftex_strcmp:D { #1 } { #2 } } }
\cs_new_protected:Nn \__witharrows_sort_seq:N
  {
    \seq_sort:Nn #1
    {
      \int_compare:nNnTF
        {
          \__witharrows_strcmp:nn
            { \str_lower_case:n { ##1 } }
            { \str_lower_case:n { ##2 } }
        }
        > 0
        \sort_return_swapped:
        \sort_return_same:
    }
  }
\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
\cs_new_protected:Nn \__witharrows_save:N
  {
    \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:Nn \__witharrows_restore:N
  {
    \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
  {
    __witharrows_node_style / .style =
      {
        above = \l__witharrows_ystart_dim ,
        inner~sep = \c_zero_dim ,
        minimum~width = \c_zero_dim ,
        minimum~height = \l__witharrows_ygap_dim
      }
  }
\tikzset
  {
    __witharrows_standard / .style =
      {
        remember~picture ,
        overlay ,
        name~prefix = wa - \l__witharrows_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:NF \c__witharrows_amsmath_loaded_bool
      {
        \cs_set_protected:Npn \spread@equation
          {
            \openup \jot
            \cs_set_eq:NN \spread@equation \prg_do_nothing:
          }
      }
  }
\bool_new:N \l__witharrows_in_WithArrows_bool
\bool_new:N \l__witharrows_in_DispWithArrows_bool
\bool_new:N \l__witharrows_in_CodeAfter_bool
\seq_new:N \g__witharrows_position_in_the_tree_seq
\seq_gput_right:Nn \g__witharrows_position_in_the_tree_seq 1
\int_new:N \g__witharrows_last_env_int
\skip_new:N \l__witharrows_interline_skip
\int_new:N \l__witharrows_pos_env_int
\dim_new:N \l__witharrows_xoffset_dim
\dim_set:Nn \l__witharrows_xoffset_dim { 3 mm }
\int_new:N \l__witharrows_pos_arrow_int
\int_set:Nn \l__witharrows_pos_arrow_int 3
\str_new:N \l__witharrows_input_line_str
\dim_new:N \l__witharrows_x_dim
\seq_new:N \g__witharrows_arrow_int_seq
\int_new:N \g__witharrows_arrow_int
\seq_new:N \g__witharrows_line_int_seq
\int_new:N \g__witharrows_line_int
\bool_new:N \l__witharrows_fleqn_bool
\dim_new:N \l__witharrows_mathindent_dim
\dim_set:Nn \l__witharrows_mathindent_dim { 25 pt }
\bool_new:N \l__witharrows_wrap_lines_bool
\clist_new:N \l__witharrows_tags_clist
\clist_set:Nn \l__witharrows_tags_clist { all }
\tl_new:N \l__witharrows_tag_tl
\bool_new:N \l__witharrows_tag_star_bool
\bool_new:N \l__witharrows_in_first_column_bool
\bool_new:N \l__witharrows_initial_r_bool
\bool_new:N \l__witharrows_initial_l_bool
\dim_new:N \l__witharrows_start_adjust_dim
\dim_set:Nn \l__witharrows_start_adjust_dim { 0.4 ex }
\dim_new:N \l__witharrows_end_adjust_dim
\dim_set:Nn \l__witharrows_end_adjust_dim { 0.4 ex }
\str_new:N \l__witharrows_status_arrow_str
\str_set:Nn \l__witharrows_CommandName_str { Arrow }
\str_set:Nx \l__witharrows_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
\bool_new:N \l__witharrows_displaystyle_bool
\bool_new:N \l__witharrows_show_node_names_bool
\cs_new_protected:Nn \__witharrows_eval_if_allowed:n
  {
    \str_if_empty:NTF \l__witharrows_previous_key_str
      {
        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
        #1
      }
      { \__witharrows_error:n { Incompatible~options } }
  }
\cs_new_protected:Nn \__witharrows_fix_pos_option:n
  { \__witharrows_eval_if_allowed:n { \int_set:Nn \l__witharrows_pos_arrow_int { #1 } } }
\keys_define:nn { WithArrows / Global }
  {
    ygap .dim_set:N = \l__witharrows_ygap_dim ,
    ygap .value_required:n = true ,
    ygap .initial:n = 0.4 ex ,
    ystart .dim_set:N = \l__witharrows_ystart_dim ,
    ystart .value_required:n = true ,
    ystart .initial:n = 0.4 ex ,
    more-columns .code:n =
      \__witharrows_msg_redirect_name:nn { Third~column~in~WithArrows } { none } ,
    more-columns .value_forbidden:n = true,
    CommandName .code:n =
      \str_set:Nn \l__witharrows_CommandName_str { #1 }
      \str_set:Nx \l__witharrows_string_Arrow_for_msg_str
        { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
    CommandName .value_required:n = true ,
    TikzCode .tl_set:N = \l__witharrows_tikz_code_tl,
    TikzCode .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
    TikzCode .value_required:n = true ,
    displaystyle .bool_set:N = \l__witharrows_displaystyle_bool ,
    displaystyle .default:n = true ,
    show-nodes .code:n =
      \tikzset { __witharrows_node_style / .append~style = { draw , red } } ,
    show-nodes .value_forbidden:n = true,
    show-node-names .bool_set:N = \l__witharrows_show_node_names_bool ,
    show-node-names .default:n = true ,
    group .code:n =
      \str_if_empty:NTF \l__witharrows_previous_key_str
        {
          \str_set:Nn \l__witharrows_previous_key_str { group }
          \seq_remove_all:Nn \l__witharrows_options_Arrow_seq { xoffset }
          \int_set:Nn \l__witharrows_pos_arrow_int 7
        }
        { \__witharrows_error:n { Incompatible~options } } ,
    group .value_forbidden:n = true ,
    groups .code:n =
      \str_if_empty:NTF \l__witharrows_previous_key_str
        {
          \str_set:Nn \l__witharrows_previous_key_str { groups }
          \seq_if_in:NnF \l__witharrows_options_Arrow_seq { new-group }
            { \seq_put_right:Nn \l__witharrows_options_Arrow_seq { new-group } }
          \seq_remove_all:Nn \l__witharrows_options_Arrow_seq { xoffset }
          \int_set:Nn \l__witharrows_pos_arrow_int 6
        }
        { \__witharrows_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            = \__witharrows_fix_pos_option:n 3 ,
    ll     .value_forbidden:n = true ,
    ll     .code:n            = \__witharrows_fix_pos_option:n 1 ,
    rl     .value_forbidden:n = true ,
    rl     .code:n            = \__witharrows_fix_pos_option:n 2 ,
    lr     .value_forbidden:n = true ,
    lr     .code:n            = \__witharrows_fix_pos_option:n 0 ,
    i      .value_forbidden:n = true ,
    i      .code:n            = \__witharrows_fix_pos_option:n 5 ,
    xoffset .dim_set:N  = \l__witharrows_xoffset_dim ,
    xoffset .value_required:n  = true ,
    jot .dim_set:N = \jot ,
    jot .value_required:n = true ,
    interline .skip_set:N = \l__witharrows_interline_skip ,
    interline .value_required:n = true ,
    start-adjust .dim_set:N = \l__witharrows_start_adjust_dim ,
    start-adjust .value_required:n = true ,
    end-adjust .dim_set:N = \l__witharrows_end_adjust_dim ,
    end-adjust .value_required:n = true ,
    adjust .code:n  =
      \dim_set:Nn \l__witharrows_start_adjust_dim { #1 }
      \dim_set:Nn \l__witharrows_end_adjust_dim { #1 } ,
    adjust .value_required:n = true
  }
\keys_define:nn { WithArrows / WithArrowsSpecific }
  {
    t   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 0 ,
    t   .value_forbidden:n = true ,
    c   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 1 ,
    c   .value_forbidden:n = true ,
    b   .code:n            = \int_set:Nn \l__witharrows_pos_env_int 2 ,
    b   .value_forbidden:n = true
  }
\keys_define:nn { WithArrows / DispWithArrowsSpecific }
  {
    fleqn .bool_set:N = \l__witharrows_fleqn_bool ,
    fleqn .default:n = true ,
    mathindent .dim_set:N = \l__witharrows_mathindent_dim ,
    mathindent .value_required:n = true ,
    notag .code:n =
      \str_if_eq:nnTF { #1 } { true }
        { \clist_clear:N \l__witharrows_tags_clist }
        { \clist_set:Nn \l__witharrows_tags_clist { all } } ,
    notag .default:n = true ,
    nonumber .meta:n = notag ,
    allow-multiple-labels .code:n =
      \__witharrows_msg_redirect_name:nn { Multiple~labels } { none } ,
    allow-multiple-labels .value_forbidden:n = true ,
    wrap-lines .bool_set:N = \l__witharrows_wrap_lines_bool ,
    wrap-lines .default:n = true ,
    tagged-lines .code:n =
      \clist_set:Nn \l__witharrows_tags_clist { #1 }
      \clist_if_in:NnT \l__witharrows_tags_clist { first }
        {
          \clist_remove_all:Nn \l__witharrows_tags_clist { first }
          \clist_put_left:Nn \l__witharrows_tags_clist \c_one_int
        } ,
    tagged-lines .value_required:n = true
  }
\keys_define:nn { WithArrows }
  {
    WithArrows .inherit:n =
      {
        WithArrows / Global ,
        WithArrows / WithArrowsSpecific
      }
  }
\keys_define:nn { WithArrows / WithArrows }
 {
   name .tl_set:N = \l__witharrows_name_str ,
   name .value_required:n = true ,
   CodeBefore .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
   CodeBefore .value_required:n = true,
   CodeAfter .code:n = \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
   CodeAfter .value_required:n = true ,
   unknown .code:n  =
     \__witharrows_sort_seq:N \l__witharrows_options_WithArrows_seq
     \__witharrows_error:n { Unknown~option~WithArrows }
 }
\seq_set_from_clist:Nn \l__witharrows_options_WithArrows_seq
  {
    adjust, b, c, CodeAfter, CodeBefore, CommandName, displaystyle, end-adjust,
    group, groups, i, interline, jot, ll, lr, more-columns, name, rl, rr,
    show-node-names, show-nodes, start-adjust, t, tikz, TikzCode, xoffset, ygap,
    ystart
  }
\keys_define:nn { WithArrows }
  {
    DispWithArrows .inherit:n =
     {
       WithArrows / DispWithArrowsSpecific ,
       WithArrows / Global
     }
  }
\keys_define:nn { WithArrows / DispWithArrows }
  {
    name .tl_set:N = \l__witharrows_name_str ,
    name .value_required:n = true ,
    CodeBefore .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
    CodeBefore .value_required:n = true ,
    CodeAfter .code:n  =  \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
    CodeAfter .value_required:n = true ,
    unknown .code:n  =
      \__witharrows_sort_seq:N \l__witharrows_options_DispWithArrows_seq
      \__witharrows_error:n { Unknown~option~DispWithArrows }
  }
\seq_set_from_clist:Nn \l__witharrows_options_DispWithArrows_seq
  {
    allow-multiple-labels, CodeAfter, CodeBefore, CommandName, TikzCode, adjust,
    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
    mathindent, name, nonumber, notag, rl, rr, show-node-names, show-nodes,
    start-adjust, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart
  }
\keys_define:nn { WithArrows }
  {
    WithArrowsOptions .inherit:n =
     {
       WithArrows / Global ,
       WithArrows / WithArrowsSpecific ,
       WithArrows / DispWithArrowsSpecific
     }
  }
\keys_define:nn { WithArrows / WithArrowsOptions }
  {
    unknown .code:n  =
      \__witharrows_sort_seq:N \l__witharrows_options_WithArrowsOptions_seq
      \__witharrows_error:n { Unknown~option~WithArrowsOptions }
  }
\seq_set_from_clist:Nn \l__witharrows_options_WithArrowsOptions_seq
  {
    allow-multiple-labels, b, c, CommandName, more-columns, TikzCode, adjust,
    displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
    mathindent, nonumber, notag, rl, rr, show-node-names, show-nodes,
    start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart
  }
\cs_new_protected:Nn \__witharrows_set_independent:
  {
    \str_if_empty:NTF \l__witharrows_previous_key_str
      {
        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
        \str_set:Nn \l__witharrows_status_arrow_str { independent }
        \str_if_eq:VnF \l_keys_value_tl { NoValue }
          { \__witharrows_error:n { Value~for~a~key } }
      }
      { \__witharrows_error:n { Incompatible~options~in~Arrow } }
  }
\keys_define:nn { WithArrows / Arrow / FirstPass }
  {
    jump .code:n =
      \int_compare:nTF { #1 > 0 }
        { \int_set:Nn \l__witharrows_jump_int { #1 } }
        { \__witharrows_error:n { Negative~jump } } ,
    jump .value_required:n  = true,
    rr .code:n = \__witharrows_set_independent: ,
    ll .code:n = \__witharrows_set_independent: ,
    rl .code:n = \__witharrows_set_independent: ,
    lr .code:n = \__witharrows_set_independent: ,
    i  .code:n = \__witharrows_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__witharrows_pos_arrow_int = 6 }
        { \str_set:Nn \l__witharrows_status_arrow_str { new-group } }
        { \__witharrows_error:n { new-group~without~groups } } ,
    TikzCode .code:n = \prg_do_nothing: ,
    TikzCode .value_required:n = true ,
    tikz .code:n = \prg_do_nothing: ,
    tikz .value_required:n = true ,
    xoffset .code:n =
      \int_compare:nNnT \l__witharrows_pos_arrow_int > 5
        { \__witharrows_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 =
      \__witharrows_sort_seq:N \l__witharrows_options_Arrow_seq
      \__witharrows_error:n { Unknown~option~in~Arrow }
  }
\seq_set_from_clist:Nn \l__witharrows_options_Arrow_seq
  {
    adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, TikzCode,
    xoffset
  }
\cs_new_protected:Nn \__witharrows_fix_pos_arrow:n
  {
    \str_if_empty:NT \l__witharrows_previous_key_str
      {
        \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_tl
        \int_set:Nn \l__witharrows_pos_arrow_int { #1 }
      }
  }
\keys_define:nn {WithArrows / Arrow / SecondPass }
  {
    TikzCode .tl_set:N = \l__witharrows_tikz_code_tl ,
    TikzCode .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 = \__witharrows_fix_pos_arrow:n 3 ,
    ll .code:n = \__witharrows_fix_pos_arrow:n 1 ,
    rl .code:n = \__witharrows_fix_pos_arrow:n 2 ,
    lr .code:n = \__witharrows_fix_pos_arrow:n 0 ,
    i  .code:n = \__witharrows_fix_pos_arrow:n 5 ,
    xoffset .code:n  =
      \int_compare:nNnF \l__witharrows_pos_arrow_int > 5
        { \dim_set:Nn \l__witharrows_xoffset_dim { #1 } } ,
    start-adjust .dim_set:N = \l__witharrows_start_adjust_dim,
    end-adjust .dim_set:N = \l__witharrows_end_adjust_dim,
    adjust .code:n  =
      \dim_set:Nn \l__witharrows_start_adjust_dim { #1 }
      \dim_set:Nn \l__witharrows_end_adjust_dim { #1 } ,
  }
\NewDocumentCommand \WithArrowsOptions { m }
  {
    \str_clear_new:N \l__witharrows_previous_key_str
    \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
  }
\NewDocumentCommand \__witharrows_Arrow { O { } m ! O { } }
  {
    \int_gincr:N \g__witharrows_arrow_int
    \str_clear_new:N \l__witharrows_previous_key_str
    \keys_set:nn { WithArrows / Arrow / FirstPass } { #1 , #3 }
    \prop_put:NnV \l_tmpa_prop { initial } \g__witharrows_line_int
    \int_set:Nn \l_tmpa_int { \g__witharrows_line_int + \l__witharrows_jump_int }
    \prop_put:NnV \l_tmpa_prop { final } \l_tmpa_int
    \prop_put:NnV \l_tmpa_prop { status } \l__witharrows_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__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \g__witharrows_arrow_int _ prop }
    \prop_gset_eq:cN
      { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \g__witharrows_arrow_int _ prop }
      \l_tmpa_prop
  }
\cs_new_protected:Nn \__witharrows_Arrow_first_column:
  { \__witharrows_error:n { Arrow~in~first~column } \__witharrows_Arrow }
\cs_new_protected:Nn \__witharrows_pre_environment:n
  {
    \str_clear_new:N \l__witharrows_type_env_str
    \str_set:NV \l__witharrows_type_env_str \@currenvir
    \cs_if_exist:NT \tikz@library@external@loaded
      { \tikzset { external / export = false } }
    \str_clear_new:N \l__witharrows_name_str
    \seq_gput_right:NV \g__witharrows_arrow_int_seq \g__witharrows_arrow_int
    \int_gzero:N \g__witharrows_arrow_int
    \seq_gput_right:NV \g__witharrows_line_int_seq \g__witharrows_line_int
    \int_gzero:N \g__witharrows_line_int
    \seq_gput_right:Nn \g__witharrows_position_in_the_tree_seq 1
    \seq_set_eq:NN \l_tmpa_seq \g__witharrows_position_in_the_tree_seq
    \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl
    \str_clear_new:N \l__witharrows_prefix_str
    \str_set:Nx \l__witharrows_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - }
    \cs_set_eq:NN \\ \__witharrows_cr:
    \dim_zero:N \mathsurround
    \int_zero_new:N \l__witharrows_initial_int
    \int_zero_new:N \l__witharrows_final_int
    \int_zero_new:N \l__witharrows_arrow_int
    \int_zero_new:N \l__witharrows_pos_of_arrow_int
    \int_zero_new:N \l__witharrows_jump_int
    \int_set:Nn \l__witharrows_jump_int \c_one_int
    \seq_clear_new:N \l__witharrows_labels_seq
    \__witharrows_bool_new:N \l__witharrows_tag_next_line_bool
    \skip_zero:N \l__witharrows_interline_skip
    \tl_clear_new:N \l__witharrows_code_before_tl
    \tl_clear_new:N \l__witharrows_code_after_tl
    \str_clear_new:N \l__witharrows_previous_key_str
    \bool_if:NT \l__witharrows_in_WithArrows_bool
      { \keys_set:nn { WithArrows / WithArrows } { #1 } }
    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
      { \keys_set:nn { WithArrows / DispWithArrows } { #1 } }
    \bool_if:NT \g__witharrows_footnote_bool { \begin { savenotes } }
    \l__witharrows_code_before_tl
    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow
  }
\NewDocumentEnvironment { WithArrows } { ! O { } }
  {
    \bool_set_true:N \l__witharrows_in_WithArrows_bool
    \bool_set_false:N \l__witharrows_in_DispWithArrows_bool
    \__witharrows_pre_environment:n { #1 }
    \if_mode_math: \else:
      \__witharrows_error:n { WithArrows~outside~math~mode }
    \fi:
    \cs_set_eq:NN \notag \__witharrows_notag:
    \cs_set_eq:NN \nonumber \__witharrows_notag:
    \cs_set_eq:NN \tag \__witharrows_tag
    \cs_set_eq:NN \label \__witharrows_label:n
    \cs_set_eq:NN \tagnextline \__witharrows_tagnextline:
    \int_case:nn \l__witharrows_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
    \bgroup
    \spread@equation
    \ialign \bgroup
    \int_gincr:N \g__witharrows_line_int
    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_first_column:
    \bool_set_true:N \l__witharrows_in_first_column_bool
    \strut \hfil
    $
    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
    { ## }
    $
    &
    $
    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
    { { } ## }
    $
    \tikz [ remember~picture , overlay ]
      \node
        [
          node~contents = { } ,
          __witharrows_node_style ,
          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l ,
          alias =
            {
              \str_if_empty:NF \l__witharrows_name_str
                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
            }
        ]
        ;
    \hfil
    \tikz [ remember~picture , overlay ]
      \node
        [
          node~contents = { } ,
          __witharrows_node_style ,
          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r ,
          alias =
            {
              \str_if_empty:NF \l__witharrows_name_str
                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
            }
        ]
        ;
    \bool_if:NT \l__witharrows_show_node_names_bool
      {
        \hbox_overlap_right:n
          { \small wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int }
      }
    &&
    \__witharrows_error:n { Third~column~in~WithArrows }
    $
    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
    { ## }
    $
    \cr
  }
  {
    \\
    \egroup
    \egroup
    \__witharrows_post_environment:
    \bool_if:NT \g__witharrows_footnote_bool { \end { savenotes } }
  }
\cs_new_protected:Nn \__witharrows_post_environment:
  {
    \cs_set:Npn \WithArrowsRightX { \g__witharrows_right_x_dim }
    \int_compare:nNnT \g__witharrows_arrow_int > 0 \__witharrows_scan_arrows:
    \group_begin:
      \tikzset { every~picture / .style = __witharrows_standard }
      \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__witharrows_line_int }
      \cs_set_eq:NN \MultiArrow \__witharrows_MultiArrow:nn
      \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_code_after
      \bool_set_true:N \l__witharrows_in_CodeAfter_bool
      \l__witharrows_code_after_tl
    \group_end:
    \seq_gpop_right:NN \g__witharrows_position_in_the_tree_seq \l_tmpa_tl
    \seq_gpop_right:NN \g__witharrows_position_in_the_tree_seq \l_tmpa_tl
    \seq_gput_right:Nx \g__witharrows_position_in_the_tree_seq
      { \int_eval:n { \l_tmpa_tl + 1 } }
    \int_compare:nNnT { \seq_count:N \g__witharrows_position_in_the_tree_seq } = 1
      { \int_gincr:N \g__witharrows_last_env_int }
    \seq_gpop_right:NN \g__witharrows_arrow_int_seq \l_tmpa_tl
    \int_gset:Nn \g__witharrows_arrow_int \l_tmpa_tl
    \seq_gpop_right:NN \g__witharrows_line_int_seq \l_tmpa_tl
    \int_gset:Nn \g__witharrows_line_int \l_tmpa_tl
  }
\cs_new_protected:Nn \__witharrows_cr:
  {
    \scan_stop:
    \bool_if:NT \l__witharrows_in_first_column_bool { & { } }
    \group_align_safe_begin:
    \peek_meaning_remove:NTF * \__witharrows_cr_i: \__witharrows_cr_i:
  }
\cs_new_protected:Nn \__witharrows_cr_i:
  { \peek_meaning:NTF [ \__witharrows_cr_ii: { \__witharrows_cr_ii: [ \c_zero_dim ] } }
\cs_new_protected:Npn \__witharrows_cr_ii: [ #1 ]
  {
    \group_align_safe_end:
    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
      {
        \clist_if_in:NnTF \l__witharrows_tags_clist { all }
          {
            \tl_if_empty:NT \l__witharrows_tag_tl { \int_gincr:N \c@equation }
            \cs_gset:Npx \g_tmpa_tl
              { \tl_if_empty:NTF \l__witharrows_tag_tl \theequation \l__witharrows_tag_tl }
            \seq_if_empty:NF \l__witharrows_labels_seq
              {
                \cs_set:Npx \@currentlabel { \p@equation \g_tmpa_tl }
                \bool_if:NT \c__witharrows_hyperref_loaded_bool
                   {
                     \cs_set:Npn \This@name { equation }
                     \hyper@refstepcounter { equation }
                   }
                \bool_if:NT \c__witharrows_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
                        }
                   }
                \bool_if:NT \c__witharrows_typedref_loaded_bool
                   { \cs_set:Npn \sr@name { equation } }
                \seq_map_function:NN \l__witharrows_labels_seq \__witharrows_old_label
              }
            \__witharrows_save:N \l__witharrows_tag_star_bool
            \__witharrows_save:N \l__witharrows_qedhere_bool
            \bool_if:NT \l__witharrows_tag_next_line_bool
              {
                \openup -\jot
                \bool_set_false:N \l__witharrows_tag_next_line_bool
                \notag \\ &
              }
            &
            \__witharrows_restore:N \l__witharrows_tag_star_bool
            \__witharrows_restore:N \l__witharrows_qedhere_bool
            \bool_if:NT \l__witharrows_qedhere_bool
               { \hbox_overlap_left:n \__witharrows_qedhere_i: }
            \cs_set_eq:NN \theequation \g_tmpa_tl
            \bool_if:NT \l__witharrows_tag_star_bool
               { \cs_set_eq:NN \tagform@ \prg_do_nothing: }
            \hbox_overlap_left:n
              {
                \bool_if:NF \c__witharrows_leqno_bool
                  {
                    \tikz [ __witharrows_standard ]
                      \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
                  }
                \quad
                \@eqnnum
              }
            \bool_if:NT \c__witharrows_leqno_bool
              {
                \tikz [ __witharrows_standard ]
                  \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
              }
          }
          {
            \__witharrows_save:N \l__witharrows_qedhere_bool
            &
            \__witharrows_restore:N \l__witharrows_qedhere_bool
            \bool_if:NT \l__witharrows_qedhere_bool
               { \hbox_overlap_left:n \__witharrows_qedhere_i: }
            \tikz [ __witharrows_standard ]
               \coordinate ( \int_use:N \g__witharrows_line_int - v ) ;
          }
        }
    \cr \noalign { \skip_vertical:n { #1 + \l__witharrows_interline_skip } \scan_stop: }
  }
\cs_new_protected:Nn \__witharrows_if_in_second_col_of_disp:Nn
  {
    \bool_if:NTF \l__witharrows_in_WithArrows_bool
      { \__witharrows_error:nn { Not~allowed~in~WithArrows } { #1 } }
      {
        \bool_if:NTF \l__witharrows_in_first_column_bool
          { \__witharrows_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
          { #2 }
      }
  }
\cs_new_protected:Nn \__witharrows_notag:
  { \__witharrows_if_in_second_col_of_disp:Nn \notag { \clist_clear:N \l__witharrows_tags_clist } }
\NewDocumentCommand \__witharrows_tag { s m }
  {
    \__witharrows_if_in_second_col_of_disp:Nn \tag
      {
        \tl_if_empty:NF \l__witharrows_tag_tl
           { \__witharrows_error:nn  { Multiple~tags } { #2 } }
        \clist_set:Nn \l__witharrows_tags_clist { all }
        \bool_if:nT \c__witharrows_mathtools_loaded_bool
          {
            \MH_if_boolean:nT { show_only_refs }
              {
                \MH_if_boolean:nF { show_manual_tags }
                  { \clist_clear:N \l__witharrows_tags_clist }
              }
          }
        \tl_set:Nn \l__witharrows_tag_tl { #2 }
        \bool_set:Nn \l__witharrows_tag_star_bool { #1 }
        \bool_if:nT { #1 && ! \bool_if_p:N \c__witharrows_amsmath_loaded_bool }
          { \__witharrows_error:n { tag*~without~amsmath } }
      }
  }
\cs_new_protected:Nn \__witharrows_label:n
  {
    \__witharrows_if_in_second_col_of_disp:Nn \label
      {
        \seq_if_empty:NF \l__witharrows_labels_seq
          {
            \bool_if:NTF \c__witharrows_cleveref_loaded_bool
              { \__witharrows_error:n { Multiple~labels~with~cleveref } }
              { \__witharrows_error:n { Multiple~labels } }
          }
        \seq_put_right:Nn \l__witharrows_labels_seq { #1 }
        \bool_if:nT \c__witharrows_mathtools_loaded_bool
           {
             \MH_if_boolean:nT { show_only_refs }
               {
                 \cs_if_exist:cTF { MT_r_#1 }
                   { \clist_set:Nn \l__witharrows_tags_clist { all } }
                   { \clist_clear:N \l__witharrows_tags_clist }
               }
           }
        \bool_if:nT \c__witharrows_autonum_loaded_bool
          {
            \cs_if_exist:cTF { autonum@#1Referenced }
              { \clist_set:Nn \l__witharrows_tags_clist { all } }
              { \clist_clear:N \l__witharrows_tags_clist }
          }
      }
  }
\cs_new_protected:Nn \__witharrows_tagnextline:
  {
    \__witharrows_if_in_second_col_of_disp:Nn \tagnextline
      { \bool_set_true:N \l__witharrows_tag_next_line_bool }
  }
\bool_new:N \l__witharrows_qedhere_bool
\cs_new_protected:Nn \__witharrows_qedhere: { \bool_set_true:N \l__witharrows_qedhere_bool }
\cs_new_protected:Nn \__witharrows_qedhere_i:
  {
    \group_begin:
      \cs_set_eq:NN \qed \qedsymbol
      \cs_set_eq:NN \qed@elt \setQED@elt
      \QED@stack \relax \relax
    \group_end:
  }
\NewDocumentEnvironment { DispWithArrows } { ! O { } }
  {
    \bool_if:nT \c__witharrows_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__witharrows_amsmath_loaded_bool \intertext@
    \bool_set_true:N \l__witharrows_in_DispWithArrows_bool
    \__witharrows_pre_environment:n { #1 }
    \if_mode_math:
      \__witharrows_error:n { DispWithArrows~in~math~mode }
    \fi:
    \if_mode_vertical:
      \nointerlineskip
      \makebox [ .6 \linewidth ] { }
    \fi:
    $$
    \vcenter \bgroup
    \spread@equation
    \bool_if:NTF \l__witharrows_fleqn_bool
      { \tabskip = \c_zero_skip }
      { \tabskip = 0 pt plus 1000 pt minus 1000 pt }
    \cs_set_eq:NN \__witharrows_old_label \label
    \cs_set_eq:NN \notag \__witharrows_notag:
    \cs_set_eq:NN \nonumber \__witharrows_notag:
    \cs_set_eq:NN \tag \__witharrows_tag
    \cs_set_eq:NN \label \__witharrows_label:n
    \cs_set_eq:NN \tagnextline \__witharrows_tagnextline:
    \halign to \displaywidth
    \bgroup
    \int_gincr:N \g__witharrows_line_int
    \cs_set_eq:cN \l__witharrows_CommandName_str \__witharrows_Arrow_first_column:
    \bool_set_true:N \l__witharrows_in_first_column_bool
    \strut
    \bool_if:NT \l__witharrows_fleqn_bool { \skip_horizontal:n \l__witharrows_mathindent_dim }
    \hfil
    $
    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
    { ## }
    $
    \tabskip = \c_zero_skip
    &
    \clist_if_in:NVT \l__witharrows_tags_clist \g__witharrows_line_int
         { \clist_set:Nn \l__witharrows_tags_clist { all } }
    \bool_if:NT \c__witharrows_amsthm_loaded_bool
      { \cs_set_eq:NN \qedhere \__witharrows_qedhere: }
    $
    \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
    { { } ## }
    $
    \tabskip = 0 pt plus 1000 pt minus 1000 pt
    \tikz [ remember~picture , overlay ]
      \node
        [
          node~contents = { } ,
          __witharrows_node_style ,
          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l ,
          alias =
            {
              \str_if_empty:NF \l__witharrows_name_str
                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
            }
        ]
        ;
    \hfil
    \tikz [ remember~picture , overlay ]
      \node
        [
          node~contents = { } ,
          __witharrows_node_style ,
          name = wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r ,
          alias =
            {
              \str_if_empty:NF \l__witharrows_name_str
                { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
            }
        ]
        ;
    \bool_if:NT \l__witharrows_show_node_names_bool
       {
         \hbox_overlap_right:n
           { \small wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int }
       }
    &
    ##
    \tabskip = \c_zero_skip
    &&
    \__witharrows_error:n { Third~column~in~DispWithArrows }
    \iffalse ## \fi
    \cr
  }
  {
    \clist_if_in:NnT \l__witharrows_tags_clist { last }
      { \clist_set:Nn \l__witharrows_tags_clist { all } }
    \\
    \egroup
    \egroup
    \bool_if:NT \l__witharrows_in_DispWithArrows_bool
      {
        \dim_gzero_new:N \g__witharrows_right_x_dim
        \dim_gset_eq:NN \g__witharrows_right_x_dim \c_max_dim
        \begin { tikzpicture } [ __witharrows_standard ]
          \int_step_variable:nNn \g__witharrows_line_int \l_tmpa_int
             {
               \cs_if_free:cTF
                 { pgf@sh@ns@wa - \l__witharrows_prefix_str - \l_tmpa_int - v }
                 { \__witharrows_error: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__witharrows_right_x_dim
                      { \dim_gset:Nn \g__witharrows_right_x_dim \l_tmpa_dim }
                 }
             }
        \end { tikzpicture }
      }
    \__witharrows_post_environment:
    \bool_if:nT \c__witharrows_mathtools_loaded_bool
      { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: }
    $$
    \bool_if:NT \g__witharrows_footnote_bool { \end {savenotes } }
    \ignorespacesafterend
  }
\NewDocumentEnvironment { DispWithArrows* } {}
   {
     \WithArrowsOptions { notag }
     \DispWithArrows
   }
   { \endDispWithArrows }
\cs_new_protected:Nn \__witharrows_scan_arrows:
 {
   \group_begin:
   \int_compare:nNnT \l__witharrows_pos_arrow_int = 7
      {
        \__witharrows_scan_arrows_i:
        \int_set:Nn \l__witharrows_pos_arrow_int 8
      }
   \__witharrows_scan_arrows_i:
   \group_end:
 }
\cs_new_protected:Nn \__witharrows_scan_arrows_i:
  {
    \int_zero_new:N \l__witharrows_first_arrow_of_group_int
    \int_zero_new:N \l__witharrows_first_line_of_group_int
    \int_zero_new:N \l__witharrows_last_line_of_group_int
    \seq_clear_new:N \l__witharrows_first_arrows_of_group_seq
    \seq_clear_new:N \l__witharrows_last_arrows_of_group_seq
    \bool_set_true:N \l__witharrows_new_group_bool
    \int_set:Nn \l__witharrows_arrow_int \c_one_int
    \int_until_do:nNnn \l__witharrows_arrow_int > \g__witharrows_arrow_int
      {
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { initial } \l_tmpa_tl
        \int_set:Nn \l__witharrows_initial_int \l_tmpa_tl
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { final } \l_tmpa_tl
        \int_set:Nn \l__witharrows_final_int \l_tmpa_tl
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { status } \l__witharrows_status_arrow_str
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { input-line } \l__witharrows_input_line_str
        \int_compare:nNnTF \l__witharrows_final_int > \g__witharrows_line_int
           { \__witharrows_error:n { Too~few~lines~for~an~arrow } }
           {
             \bool_if:nT
               {
                 \int_compare_p:nNn \l__witharrows_arrow_int > 1
                 &&
                ( \int_compare_p:n
                    { \l__witharrows_initial_int > \l__witharrows_last_line_of_group_int }
                 &&
                  \int_compare_p:n { \l__witharrows_pos_arrow_int != 7 }
                 ||
                  \str_if_eq_p:Vn \l__witharrows_status_arrow_str { new-group }
                )
               }
               {
                 \int_compare:nNnF \l__witharrows_first_arrow_of_group_int = 0
                   {
                     \__witharrows_draw_arrows:nn
                       \l__witharrows_first_arrow_of_group_int
                       { \l__witharrows_arrow_int - 1 }
                   }
                 \bool_set_true:N \l__witharrows_new_group_bool
               }
             \bool_if:nTF \l__witharrows_new_group_bool
                {
                  \bool_set_false:N \l__witharrows_new_group_bool
                  \int_set_eq:NN \l__witharrows_first_arrow_of_group_int \l__witharrows_arrow_int
                  \int_set_eq:NN \l__witharrows_first_line_of_group_int \l__witharrows_initial_int
                  \int_set_eq:NN \l__witharrows_last_line_of_group_int \l__witharrows_final_int
                  \seq_clear:N \l__witharrows_first_arrows_of_group_seq
                  \seq_put_left:NV \l__witharrows_first_arrows_of_group_seq
                    \l__witharrows_arrow_int
                  \seq_clear:N \l__witharrows_last_arrows_of_group_seq
                  \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
                    \l__witharrows_arrow_int
                  \int_compare:nT { \l__witharrows_pos_arrow_int != 8 }
                    { \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim } }
                }
                {
                  \bool_if:nF
                     { \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent } }
                     {
                       \int_compare:nT
                         { \l__witharrows_initial_int = \l__witharrows_first_line_of_group_int }
                         {
                           \seq_put_left:NV \l__witharrows_first_arrows_of_group_seq
                             \l__witharrows_arrow_int
                         }
                       \int_compare:nTF
                         { \l__witharrows_final_int > \l__witharrows_last_line_of_group_int }
                         {
                           \int_set_eq:NN \l__witharrows_last_line_of_group_int
                             \l__witharrows_final_int
                           \seq_clear:N \l__witharrows_last_arrows_of_group_seq
                           \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
                             \l__witharrows_arrow_int
                         }
                         {
                           \int_compare:nNnT
                             \l__witharrows_final_int = \l__witharrows_last_line_of_group_int
                             {
                               \seq_put_left:NV \l__witharrows_last_arrows_of_group_seq
                                 \l__witharrows_arrow_int
                             }
                         }
                     }
                }
             \bool_if:nF
                { \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent } }
                {
                  \int_compare:nT { \l__witharrows_pos_arrow_int != 8 }
                    { \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int }
                }
            }
        \int_incr:N \l__witharrows_arrow_int
      }
     \int_compare:nT { \l__witharrows_pos_arrow_int != 7 }
        { \__witharrows_draw_arrows:nn \l__witharrows_first_arrow_of_group_int \g__witharrows_arrow_int }
  }
\cs_generate_variant:Nn \keys_set:nn { n o }
\cs_new_protected:Nn \__witharrows_keys_set:
  { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
\cs_new_protected:Nn \__witharrows_draw_arrows:nn
  {
    \group_begin:
    \int_zero_new:N \l__witharrows_first_arrow_int
    \int_set:Nn \l__witharrows_first_arrow_int { #1 }
    \int_zero_new:N \l__witharrows_last_arrow_int
    \int_set:Nn \l__witharrows_last_arrow_int { #2 }
    \int_set:Nn \l__witharrows_arrow_int \l__witharrows_first_arrow_int
    \int_until_do:nNnn \l__witharrows_arrow_int > \l__witharrows_last_arrow_int
      {
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { initial } \l_tmpa_tl
        \int_set:Nn \l__witharrows_initial_int \l_tmpa_tl
        \prop_get:cnN
          { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
          { final } \l_tmpa_tl
        \int_set:Nn \l__witharrows_final_int \l_tmpa_tl
        \int_compare:nT { \l__witharrows_final_int <= \g__witharrows_line_int } \__witharrows_draw_arrows_i:
        \int_incr:N \l__witharrows_arrow_int
      }
    \group_end:
  }
\cs_new_protected:Nn \__witharrows_draw_arrows_i:
  {
    \group_begin:
    \prop_get:cnN
      { g__witharrows_arrow _\l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
      { options } \l_tmpa_tl
    \str_clear_new:N \l__witharrows_previous_key_str
    \exp_args:NNo \exp_args:No
    \__witharrows_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__witharrows_xoffset_dim } }
    \bool_set_false:N \l__witharrows_initial_r_bool
    \bool_set_false:N \l__witharrows_final_r_bool
    \int_case:nn \l__witharrows_pos_arrow_int
      {
        0 { \bool_set_true:N \l__witharrows_final_r_bool }
        2 { \bool_set_true:N \l__witharrows_initial_r_bool }
        3 {
            \bool_set_true:N \l__witharrows_initial_r_bool
            \bool_set_true:N \l__witharrows_final_r_bool
          }
      }
    \int_compare:nNnT \l__witharrows_pos_arrow_int = 5
       {
         \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim }
         \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int
       }
    \tl_set:Nx \l__witharrows_initial_tl
       { \int_use:N \l__witharrows_initial_int - \bool_if:NTF \l__witharrows_initial_r_bool rl .south }
    \tl_set:Nx \l__witharrows_final_tl
       { \int_use:N \l__witharrows_final_int - \bool_if:NTF \l__witharrows_final_r_bool rl .north }
    \prop_get:cnN
      { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
      { label }
      \l_tmpa_tl
    \seq_if_in:NxTF \l__witharrows_first_arrows_of_group_seq
       { \int_use:N \l__witharrows_arrow_int }
       { \bool_set_true:N \l_tmpa_bool }
       { \bool_set_false:N \l_tmpa_bool }
    \seq_if_in:NxTF \l__witharrows_last_arrows_of_group_seq
       { \int_use:N \l__witharrows_arrow_int }
       { \bool_set_true:N \l_tmpb_bool }
       { \bool_set_false:N \l_tmpb_bool }
    \int_compare:nNnT \l__witharrows_pos_arrow_int = 5
       {
         \bool_set_true:N \l_tmpa_bool
         \bool_set_true:N \l_tmpb_bool
       }
    \begin { tikzpicture } [ __witharrows_standard ]
       \tikz@scan@one@point \pgfutil@firstofone ( \l__witharrows_initial_tl )
       \tl_gset:Nx \g_tmpa_tl
          {
            \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
              { \dim_use:N \pgf@x }
              { \dim_use:N \l__witharrows_x_dim } ,
            \bool_if:NTF \l_tmpa_bool
              { \dim_eval:n { \pgf@y + \l__witharrows_start_adjust_dim } }
              { \dim_use:N \pgf@y }
          }
       \tikz@scan@one@point \pgfutil@firstofone ( \l__witharrows_final_tl )
       \tl_gset:Nx \g_tmpb_tl
          {
            \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
              { \dim_use:N \pgf@x }
              { \dim_use:N \l__witharrows_x_dim } ,
            \bool_if:NTF \l_tmpb_bool
              { \dim_eval:n { \pgf@y - \l__witharrows_end_adjust_dim } }
              { \dim_use:N \pgf@y }
          }
    \end { tikzpicture }
    \__witharrows_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
    \group_end:
  }
\cs_new_protected:Nn \__witharrows_def_function_tmpa:n
  {
    \cs_set:Npn \__witharrows_tmpa:nnn ##1 ##2 ##3
      {
        \begin{tikzpicture}
          [
            __witharrows_standard ,
            every~path / .style = WithArrows / arrow
          ]
          #1
        \end{tikzpicture}
      }
  }
\cs_new_protected:Nn \__witharrows_draw_arrow:nnn
  {
    \bool_if:nT { \l__witharrows_wrap_lines_bool && \l__witharrows_in_DispWithArrows_bool }
       { \tl_set_eq:NN \l__witharrows_tikz_code_tl \c__witharrows_tikz_code_wrap_lines_tl }
    \exp_args:NV \__witharrows_def_function_tmpa:n \l__witharrows_tikz_code_tl
    \__witharrows_tmpa:nnn { #1 } { #2 } { #3 }
  }
\cs_generate_variant:Nn \__witharrows_draw_arrow:nnn { n n o }
\tl_const:Nn \c__witharrows_tikz_code_wrap_lines_tl
  {
    \draw ( #1 ) to node ( __witharrows_label ) { } ( #2 ) ;
    \tikz@parse@node \pgfutil@firstofone ( __witharrows_label.west )
    \dim_set:Nn \l_tmpa_dim { \g__witharrows_right_x_dim - \pgf@x - 0.3333 em }
    \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 ( __witharrows_label.west )
           node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ]
                { #3 } ;
      }
  }
\cs_new_protected:Nn \__witharrows_update_x:nn
  {
    \int_step_inline:nnn { #1 } { #2 }
       {
         \begin { tikzpicture } [ __witharrows_standard ]
           \tikz@scan@one@point \pgfutil@firstofone ( ##1 - l )
           \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__witharrows_x_dim \pgf@x }
         \end { tikzpicture }
         \dim_set_eq:NN \l__witharrows_x_dim \g_tmpa_dim
       }
  }
\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__witharrows_last_env_int }
\keys_define:nn { WithArrows / Arrow / CodeAfter }
  {
    tikz     .code:n =
      \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
    tikz     .value_required:n  = true ,
    rr       .value_forbidden:n = true ,
    rr       .code:n            = \__witharrows_fix_pos_option:n 0 ,
    ll       .value_forbidden:n = true,
    ll       .code:n            = \__witharrows_fix_pos_option:n 1 ,
    rl       .value_forbidden:n = true ,
    rl       .code:n            = \__witharrows_fix_pos_option:n 2 ,
    lr       .value_forbidden:n = true ,
    lr       .code:n            = \__witharrows_fix_pos_option:n 3 ,
    v        .value_forbidden:n = true ,
    v        .code:n            = \__witharrows_fix_pos_option:n 4 ,
    TikzCode .tl_set:N          = \l__witharrows_tikz_code_tl ,
    TikzCode .value_required:n  = true ,
    xoffset  .dim_set:N         = \l__witharrows_xoffset_dim ,
    xoffset  .value_required:n  = true ,
    unknown .code:n  =
      \__witharrows_sort_seq:N \l__witharrows_options_Arrow_CodeAfter_seq
      \__witharrows_error:n { Unknown~option~Arrow~in~CodeAfter }
 }
\seq_set_from_clist:Nn \l__witharrows_options_Arrow_CodeAfter_seq
   { ll, lr, rl, rr, tikz, TikzCode, v, x, offset }
\NewDocumentCommand \__witharrows_Arrow_code_after { O { } m m m ! O { } }
  {
    \int_set:Nn \l__witharrows_pos_arrow_int 1
    \str_clear_new:N \l__witharrows_previous_key_str
    \group_begin:
      \keys_set:nn { WithArrows / Arrow / CodeAfter }
        { #1, #5, tikz = { xshift = \l__witharrows_xoffset_dim } }
      \bool_set_false:N \l__witharrows_initial_r_bool
      \bool_set_false:N \l__witharrows_final_r_bool
      \int_case:nn \l__witharrows_pos_arrow_int
        { 0
            {
              \bool_set_true:N \l__witharrows_initial_r_bool
              \bool_set_true:N \l__witharrows_final_r_bool
            }
          2 { \bool_set_true:N \l__witharrows_initial_r_bool }
          3 { \bool_set_true:N \l__witharrows_final_r_bool }
        }
      \tl_if_eq:nnTF { #2 } { #3 }
        { \__witharrows_error:nn { Both~lines~are~equal } { #2 } }
        {
          \cs_if_free:cTF { pgf@sh@ns@wa - \l__witharrows_prefix_str - #2 - l }
            { \__witharrows_error:nx { Wrong~line~in~Arrow } { #2 } }
            {
              \cs_if_free:cTF { pgf@sh@ns@wa - \l__witharrows_prefix_str - #3 - l }
                { \__witharrows_error:nx { Wrong~line~in~Arrow } { #3 }  }
                {
                  \int_compare:nNnTF \l__witharrows_pos_arrow_int = 4
                    {
                      \begin { tikzpicture } [ __witharrows_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 } [ __witharrows_standard ]
                        \tikz@scan@one@point \pgfutil@firstofone
                           ( #2-\bool_if:NTF\l__witharrows_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__witharrows_final_r_bool rl .north )
                        \tl_gset:Nx \g_tmpb_tl
                           { \dim_use:N \pgf@x , \dim_use:N \pgf@y }
                      \end { tikzpicture }
                    }
                  \__witharrows_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
                }
            }
        }
    \group_end:
  }
\cs_new_protected:Nn \__witharrows_MultiArrow:nn
  {
    \foreach \x in { #1 }
      {
        \cs_if_free:cTF { pgf@sh@ns@wa - \l__witharrows_prefix_str - \x - l }
           { \__witharrows_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 }
       { \__witharrows_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 \__witharrows_MultiArrow_i:n \g_tmpa_clist
         \begin { tikzpicture }
           [
             __witharrows_standard ,
             every~path /.style = { WithArrows / arrow }
           ]
           \draw [<->] ([xshift = \l__witharrows_xoffset_dim]\l_tmpa_tl-r.south)
                       -- ++(5mm,0)
                       -- node (__witharrows_label) {}
                          ([xshift = \l__witharrows_xoffset_dim+5mm]\l_tmpb_tl-r.south)
                       -- ([xshift = \l__witharrows_xoffset_dim]\l_tmpb_tl-r.south)  ;
           \tikz@parse@node \pgfutil@firstofone (__witharrows_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__witharrows_wrap_lines_bool && \l__witharrows_in_DispWithArrows_bool }
             {
               \dim_set:Nn \l_tmpb_dim
                  { \g__witharrows_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 (__witharrows_label.west)
            node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ;
         \end{tikzpicture}
      }
 }
\cs_new_protected:Nn \__witharrows_MultiArrow_i:n
  {
    \begin {tikzpicture }
      [
        __witharrows_standard ,
        every~path / .style = { WithArrows / arrow }
      ]
      \foreach \k in { #1 }
        {
          \draw [ <- ]
            ( [xshift = \l__witharrows_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
        } ;
    \end { tikzpicture }
  }
\str_const:Nn \c__witharrows_option_ignored_str
  { If~you~go~on,~this~option~will~be~ignored. }
\__witharrows_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.
   }
\__witharrows_msg_new:nnn { Unknown~option~in~Arrow }
  {
    The~option~'\l_keys_key_tl'~
    is~unknown~for~the~command~\l__witharrows_string_Arrow_for_msg_str\
    in~the~row~\int_use:N \g__witharrows_line_int\
    of~your~environment~\{\l__witharrows_type_env_str\}. \\
    \c__witharrows_option_ignored_str \\
    For~a~list~of~the~available~keys,~type~H~<return>.
  }
  {
    The~available~keys~are~(in~alphabetic~order):~
    \seq_use:Nnnn \l__witharrows_options_Arrow_seq {~and~} {,~} {~and~}.
  }
\__witharrows_msg_new:nnn { Unknown~option~WithArrows }
  {
    The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
    \c__witharrows_option_ignored_str \\
    For~a~list~of~the~available~keys,~type~H~<return>.
  }
  {
    The~available~keys~are~(in~alphabetic~order):~
    \seq_use:Nnnn \l__witharrows_options_WithArrows_seq {~and~} {,~} {~and~}.
  }
\__witharrows_msg_new:nnn { Unknown~option~DispWithArrows }
  {
    The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
    \c__witharrows_option_ignored_str \\
    For~a~list~of~the~available~keys,~type~H~<return>.
  }
  {
    The~available~keys~are~(in~alphabetic~order):~
    \seq_use:Nnnn \l__witharrows_options_DispWithArrows_seq {~and~} {,~} {~and~}.
  }
\__witharrows_msg_new:nnn { Unknown~option~WithArrowsOptions }
  {
    The~option~'\l_keys_key_tl'~is~unknown~in~
    \token_to_str:N \WithArrowsOptions. \\
    \c__witharrows_option_ignored_str \\
    For~a~list~of~the~available~keys,~type~H~<return>.
  }
  {
    The~available~keys~are~(in~alphabetic~order):~
    \seq_use:Nnnn \l__witharrows_options_WithArrowsOptions_seq {~and~} {,~} {~and~}.
  }
\__witharrows_msg_new:nnn { Unknown~option~Arrow~in~CodeAfter }
  {
    The~option~'\l_keys_key_tl'~is~unknown~in~
    \token_to_str:N \Arrow\
    in~\token_to_str:N \CodeAfter. \\
    \c__witharrows_option_ignored_str \\
    For~a~list~of~the~available~keys,~type~H~<return>.
  }
  {
    The~available~keys~are~(in~alphabetic~order):~
    \seq_use:Nnnn \l__witharrows_options_Arrow_CodeAfter_seq {~and~} {,~} {~and~}.
  }
\__witharrows_msg_new:nn { Third~column~in~WithArrows }
 {
   By~default,~an~environment~\{\l__witharrows_type_env_str\}~can~only~have~
   two~columns.~Maybe~you~have~forgotten~a~
   \c_backslash_str\c_backslash_str.~If~you~really~want~more~than~
   two~columns,~you~should~use~the~option~'more-columns'~at~a~global~
   level~or~for~an~environment. \\
   However,~you~can~go~one~for~this~time.
 }
\__witharrows_msg_new:nn { Third~column~in~DispWithArrows }
  {
    An~environment~\{\l__witharrows_type_env_str\}~can~only~have~two~columns.~
    Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
    at~the~end~of~row~\int_use:N \g__witharrows_line_int. \\
    If~you~go~on,~you~may~have~other~errors.
  }
\__witharrows_msg_new:nn { Negative~jump }
 {
   You~can't~use~a~negative~value~for~the~option~'jump'~of~command~
   \l__witharrows_string_Arrow_for_msg_str\
   in~the~row~\int_use:N \g__witharrows_line_int\
   of~your~environment~\{\l__witharrows_type_env_str\}.~
   You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\
   \c__witharrows_option_ignored_str
 }
\__witharrows_msg_new:nn { new-group~without~groups }
  {
    You~can't~use~the~option~'new-group'~for~the~command~
    \l__witharrows_string_Arrow_for_msg_str\
    because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~
    'groups'~in~your~environment~\{\l__witharrows_type_env_str\}. \\
    \c__witharrows_option_ignored_str
  }
\__witharrows_msg_new:nn
 { Too~few~lines~for~an~arrow }
 { Line~\l__witharrows_input_line_str\
   :~an~arrow~specified~in~the~row~\int_use:N \l__witharrows_initial_int\
   of~your~environment~\{\l__witharrows_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.
 }
\__witharrows_msg_new:nn { WithArrows~outside~math~mode }
 {
   The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~in~math~mode. \\
   Nevertheless,~you~can~go~on.
 }
\__witharrows_msg_new:nn { DispWithArrows~in~math~mode }
  {
    The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~
    outside~math~mode. \\
    If~you~go~on,~you~will~have~other~errors.
  }
\__witharrows_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__witharrows_previous_key_str'~set~in~the~same~command~
    \l__witharrows_string_Arrow_for_msg_str. \\
    \c__witharrows_option_ignored_str
  }
\__witharrows_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__witharrows_previous_key_str'~set~in~the~same~command~
    \bool_if:NT \l__witharrows_in_CodeAfter_bool
      {
        \l__witharrows_string_Arrow_for_msg_str\
        in~the~CodeAfter~of~your~environment~\{\l__witharrows_type_env_str\}
      }. \\
    \c__witharrows_option_ignored_str
  }
\__witharrows_msg_new:nn { Arrow~in~first~column }
  {
    You~should~not~use~the~command~\l__witharrows_string_Arrow_for_msg_str\
    in~the~first~column~of~your~environment~\{\l__witharrows_type_env_str\}~
    but~only~in~the~second~column. \\
    However~you~can~go~on~for~this~time.
  }
\__witharrows_msg_new:nn { Wrong~line~in~Arrow }
  {
    The~specification~of~line~'#1'~you~use~in~the~command~
    \l__witharrows_string_Arrow_for_msg_str\
    in~the~'CodeAfter'~of~\{\l__witharrows_type_env_str\}~doesn't~exist. \\
    If~you~go~on,~this~command~will~be~ignored.
  }
\__witharrows_msg_new:nn { Both~lines~are~equal }
  {
    In~the~'CodeAfter'~of~\{\l__witharrows_type_env_str\}~you~try~to~
    draw~an~arrow~going~to~it~self~from~the~line~'#1'.~This~is~not~possible. \\
    If~you~go~on,~this~command~will~be~ignored.
  }
\__witharrows_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.
  }
\__witharrows_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. \\
    If~you~go~on,~this~command~will~be~ignored.
  }
\__witharrows_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.
  }
\__witharrows_msg_new:nn { Not~allowed~in~DispWithArrows }
  {
    The~command~\token_to_str:N #1
    is~not~allowed~in~the~first~column~of~\{\l__witharrows_type_env_str\}~but~
    only~in~the~second~column. \\
    If~you~go~on,~this~command~will~be~ignored.
  }
\__witharrows_msg_new:nn { Not~allowed~in~WithArrows }
  {
    The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__witharrows_type_env_str\}~
    (it's~allowed~in~the~second~column~of~\{DispWithArrows\}). \\
    If~you~go~on,~this~command~will~be~ignored.
  }
\__witharrows_msg_new:nn { Multiple~tags }
 {
   You~can't~use~twice~the~command~\token_to_str:N\tag\
   in~a~line~of~the~environment~\{\l__witharrows_type_env_str\}. \\
   If~you~go~on,~the~tag~'#1'~will~be~used.
 }
\__witharrows_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__witharrows_type_env_str\}. \\
    However,~you~can~go~on.~
    \bool_if:NT \c__witharrows_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.
  }
\__witharrows_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__witharrows_type_env_str\}. \\
    If~you~go~on,~you~may~have~undefined~references.
  }
\__witharrows_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~\int_use:N \l_tmpa_int\
    of~your~environment~\{\l__witharrows_type_env_str\}. \\
    If~you~go~on,~you~may~have~an~incorrect~output.
  }
\__witharrows_msg_new:nn { Option~xoffset~forbidden }
  { You~can't~use~the~option~'xoffset'~in~the~command~
    \l__witharrows_string_Arrow_for_msg_str\
    while~you~are~using~the~option~
    ' \int_compare:nNnTF \l__witharrows_pos_arrow_int = 7
         { group }
         { groups } '. \\
    \c__witharrows_option_ignored_str
  }
\NewDocumentCommand \WithArrowsNewStyle { m m }
  {
    \keys_if_exist:nnTF { WithArrows / WithArrows } { #1 }
      { \__witharrows_error:nn { Key~already~defined } { #1 } }
      {
        \keys_define:nn { WithArrows / WithArrows }
           {
             #1 .code:n =
                  {
                    \keys_define:nn { WithArrows / WithArrows }
                       { unknown .code:n = \prg_do_nothing: }
                    \keys_set:nn { WithArrows / WithArrows } { #2 }
                    \keys_define:nn { WithArrows / WithArrows }
                       { unknown .code:n =
                          \__witharrows_error:n { Unknown~option~WithArrows }}
                  }
           }
       \seq_put_right:Nn \l__witharrows_options_WithArrows_seq {#1}
       \keys_define:nn { WithArrows / DispWithArrows }
           {
             #1 .code:n =
                  {
                    \keys_define:nn { WithArrows / DispWithArrows }
                       { unknown .code:n = \prg_do_nothing: }
                    \keys_set:nn { WithArrows / DispWithArrows } { #2 }
                    \keys_define:nn {WithArrows / DispWithArrows }
                       { unknown .code:n =
                           \__witharrows_error:n { Unknown~option~DispWithArrows }}
                  }
           }
       \seq_put_right:Nn \l__witharrows_options_DispWithArrows_seq { #1 }
       \keys_define:nn { WithArrows / WithArrowsOptions }
           {
             #1 .code:n =
              { \keys_set:nn { WithArrows / WithArrowsOptions } { #2 } }
           }
       \seq_put_right:Nn \l__witharrows_options_WithArrowsOptions_seq { #1 }
       \group_begin:
           \msg_set:nnn { witharrows } { Unknown~option~WithArrowsOptions }
              {
                The~option~'\l_keys_key_tl'~can't~be~set~in~the~
                definition~of~a~style. \\
                If~you~go~on,~this~key~will~not~be~written~in~the~style~'#1'.
              }
           \WithArrowsOptions { #2 }
       \group_end:
      }
  }
\__witharrows_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__witharrows_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__witharrows_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 = \__witharrows_set_independent: ,
    down .code:n = \__witharrows_set_independent: ,
    up   .default:n = NoValue ,
    down .default:n = NoValue
  }
\keys_define:nn { WithArrows / Arrow / SecondPass }
 {
   up .code:n =  \str_if_empty:NT \l__witharrows_previous_key_str
                   {
                     \str_set:Nn \l__witharrows_previous_key_str { up }
                     \bool_if:NTF \c__witharrows_varwidth_loaded_bool
                       {
                         \cs_if_exist:cTF { tikz@library@calc@loaded }
                           {
                             \int_set:Nn \l__witharrows_pos_arrow_int \c_one_int
                             \bool_set_false:N \l__witharrows_wrap_lines_bool
                             \tl_set_eq:NN \l__witharrows_tikz_code_tl
                               \c__witharrows_tikz_code_up_tl
                           }
                           { \__witharrows_error:n { calc~not~loaded } }
                       }
                       { \__witharrows_error:n { varwidth~not~loaded } }
                   } ,
   down .code:n = \str_if_empty:NT \l__witharrows_previous_key_str
                    {
                      \str_set:Nn \l__witharrows_previous_key_str { down }
                      \bool_if:NTF \c__witharrows_varwidth_loaded_bool
                        {
                          \cs_if_exist:cTF { tikz@library@calc@loaded }
                            {
                              \int_set:Nn \l__witharrows_pos_arrow_int \c_one_int
                              \bool_set_false:N \l__witharrows_wrap_lines_bool
                              \tl_set_eq:NN \l__witharrows_tikz_code_tl
                                \c__witharrows_tikz_code_down_tl
                            }
                            { \__witharrows_error:n { calc~not~loaded } }
                        }
                        { \__witharrows_error:n { varwidth~not~loaded } }
                    }
 }
\seq_put_right:Nn \l__witharrows_options_Arrow_seq { down }
\seq_put_right:Nn \l__witharrows_options_Arrow_seq { up }
\__witharrows_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__witharrows_option_ignored_str
  }
\__witharrows_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~your~preamble. \\
    \c__witharrows_option_ignored_str
  }
\endinput
%%
%% End of file `witharrows.sty'.
