%% %% 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.16} \def\myfiledate{2019/03/11} \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__wa_footnotehyper_bool \bool_new:N \g__wa_footnote_bool \cs_new_protected:Npn \__wa_msg_new:nn { \msg_new:nnn { witharrows } } \cs_new_protected:Npn \__wa_msg_new:nnn { \msg_new:nnnn { witharrows } } \cs_new_protected:Npn \__wa_msg_redirect_name:nn { \msg_redirect_name:nnn { witharrows } } \keys_define:nn { WithArrows / package } { footnote .bool_gset:N = \g__wa_footnote_bool , footnotehyper .bool_gset:N = \g__wa_footnotehyper_bool , unknown .code:n = \msg_fatal:nn { witharrows } { Option~unknown~for~package } } \__wa_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 } \__wa_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. } \__wa_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. } \__wa_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__wa_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__wa_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__wa_footnote_bool } \bool_new:N \c__wa_leqno_bool \DeclareOption { leqno } { \bool_set_true:N \c__wa_leqno_bool } \DeclareOption* { } \ProcessOptions* \cs_new_protected:Npn \__wa_error:n { \msg_error:nn { witharrows } } \cs_new_protected:Npn \__wa_error:nn { \msg_error:nnn { witharrows } } \cs_generate_variant:Nn \__wa_error:nn { n x } \AtBeginDocument { \clist_map_inline:nn { amsmath, amsthm, autonum, cleveref, hyperref, mathtools, showlabels, typedref, varwidth } { \bool_new:c { c__wa_#1_loaded_bool } \@ifpackageloaded { #1 } { \bool_set_true:c { c__wa_#1_loaded_bool } } { } } } \sys_if_engine_luatex:TF { \cs_new_protected:Npn \__wa_strcmp:nn #1 #2 { \lua_now:e { l3kernel.strcmp('#1','#2') } } } { \cs_new_protected:Npn \__wa_strcmp:nn #1 #2 { \pdftex_strcmp:D { #1 } { #2 } } } \cs_new_protected:Npn \__wa_sort_seq:N #1 { \seq_sort:Nn #1 { \int_compare:nNnTF { \__wa_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:Npn \__wa_save:N #1 { \seq_set_split:Nxx \l_tmpa_seq { \char_generate:nn { `_ } { 12 } } { \cs_to_str:N #1 } \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } \use:c { \l_tmpa_str _if_exist:cF } { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } { \use:c { \l_tmpa_str _new:c } { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } } \use:c { \l_tmpa_str _gset_eq:cN } { g _\seq_use:Nnnn \l_tmpa_seq _ _ _ } #1 } \cs_new_protected:Npn \__wa_restore:N #1 { \seq_set_split:Nxx \l_tmpa_seq { \char_generate:nn { `_ } { 12 } } { \cs_to_str:N #1 } \seq_pop_left:NN \l_tmpa_seq \l_tmpa_tl \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { -1 } } \use:c { \l_tmpa_str _set_eq:Nc } #1 { g_\seq_use:Nnnn \l_tmpa_seq _ _ _ } } \tikzset { __wa_node_style / .style = { above = \l__wa_ystart_dim , inner~sep = \c_zero_dim , minimum~width = \c_zero_dim , minimum~height = \l__wa_ygap_dim } } \tikzset { __wa_standard / .style = { remember~picture , overlay , name~prefix = wa - \l__wa_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__wa_amsmath_loaded_bool { \cs_set_protected:Npn \spread@equation { \openup \jot \cs_set_eq:NN \spread@equation \prg_do_nothing: } } } \bool_new:N \l__wa_in_WithArrows_bool \bool_new:N \l__wa_in_DispWithArrows_bool \bool_new:N \l__wa_in_CodeAfter_bool \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 \int_new:N \l__wa_pos_env_int \int_new:N \l__wa_pos_arrow_int \int_set:Nn \l__wa_pos_arrow_int 3 \seq_new:N \g__wa_arrow_int_seq \int_new:N \g__wa_arrow_int \seq_new:N \g__wa_line_int_seq \int_new:N \g__wa_line_int \clist_new:N \l__wa_tags_clist \clist_set:Nn \l__wa_tags_clist { all } \str_set:Nn \l__wa_CommandName_str { Arrow } \str_set:Nx \l__wa_string_Arrow_for_msg_str { \token_to_str:N \Arrow } \seq_new:N \g__wa_names_seq \bool_new:N \l__wa_sbwi_bool \cs_new_protected:Npn \__wa_eval_if_allowed:n #1 { \str_if_empty:NTF \l__wa_previous_key_str { \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl #1 } { \__wa_error:n { Incompatible~options } } } \cs_new_protected:Npn \__wa_fix_pos_option:n #1 { \__wa_eval_if_allowed:n { \int_set:Nn \l__wa_pos_arrow_int { #1 } } } \keys_define:nn { WithArrows / Global } { ygap .dim_set:N = \l__wa_ygap_dim , ygap .value_required:n = true , ygap .initial:n = 0.4 ex , ystart .dim_set:N = \l__wa_ystart_dim , ystart .value_required:n = true , ystart .initial:n = 0.4 ex , more-columns .code:n = \__wa_msg_redirect_name:nn { Third~column~in~WithArrows } { none } , more-columns .value_forbidden:n = true, CommandName .code:n = \str_set:Nn \l__wa_CommandName_str { #1 } \str_set:Nx \l__wa_string_Arrow_for_msg_str { \c_backslash_str Arrow~alias~\c_backslash_str #1 } , CommandName .value_required:n = true , TikzCode .tl_set:N = \l__wa_tikz_code_tl, TikzCode .initial:n = \draw~(#1)~to~node{#3}~(#2)~; , TikzCode .value_required:n = true , displaystyle .bool_set:N = \l__wa_displaystyle_bool , displaystyle .default:n = true , show-nodes .code:n = \tikzset { __wa_node_style / .append~style = { draw , red } } , show-nodes .value_forbidden:n = true, show-node-names .bool_set:N = \l__wa_show_node_names_bool , show-node-names .default:n = true , group .code:n = \str_if_empty:NTF \l__wa_previous_key_str { \str_set:Nn \l__wa_previous_key_str { group } \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset } \int_set:Nn \l__wa_pos_arrow_int 7 } { \__wa_error:n { Incompatible~options } } , group .value_forbidden:n = true , groups .code:n = \str_if_empty:NTF \l__wa_previous_key_str { \str_set:Nn \l__wa_previous_key_str { groups } \seq_if_in:NnF \l__wa_options_Arrow_seq { new-group } { \seq_put_right:Nn \l__wa_options_Arrow_seq { new-group } } \seq_remove_all:Nn \l__wa_options_Arrow_seq { xoffset } \int_set:Nn \l__wa_pos_arrow_int 6 } { \__wa_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 = \__wa_fix_pos_option:n 3 , ll .value_forbidden:n = true , ll .code:n = \__wa_fix_pos_option:n 1 , rl .value_forbidden:n = true , rl .code:n = \__wa_fix_pos_option:n 2 , lr .value_forbidden:n = true , lr .code:n = \__wa_fix_pos_option:n 0 , i .value_forbidden:n = true , i .code:n = \__wa_fix_pos_option:n 5 , xoffset .dim_set:N = \l__wa_xoffset_dim , xoffset .value_required:n = true , xoffset .initial:n = 3 mm , jot .dim_set:N = \jot , jot .value_required:n = true , interline .skip_set:N = \l__wa_interline_skip , interline .value_required:n = true , start-adjust .dim_set:N = \l__wa_start_adjust_dim , start-adjust .value_required:n = true , start-adjust .initial:n = 0.4 ex , end-adjust .dim_set:N = \l__wa_end_adjust_dim , end-adjust .value_required:n = true , end-adjust .initial:n = 0.4 ex , adjust .code:n = \dim_zero_new:N \l__wa_start_adjust_dim \dim_set:Nn \l__wa_start_adjust_dim { #1 } \dim_zero_new:N \l__wa_end_adjust_dim \dim_set:Nn \l__wa_end_adjust_dim { #1 } , adjust .value_required:n = true , no-arrows .code:n = \cs_set_eq:NN \__wa_draw_arrows:nn \use_none:nn \cs_set_eq:NN \__wa_draw_arrow:nnn \use_none:nnn , no-arrows .value_forbidden:n = true , } \keys_define:nn { WithArrows / WithArrowsSpecific } { t .code:n = \int_set:Nn \l__wa_pos_env_int O , t .value_forbidden:n = true , c .code:n = \int_set:Nn \l__wa_pos_env_int 1 , c .value_forbidden:n = true , b .code:n = \int_set:Nn \l__wa_pos_env_int 2 , b .value_forbidden:n = true } \keys_define:nn { WithArrows / DispWithArrowsSpecific } { fleqn .bool_set:N = \l__wa_fleqn_bool , fleqn .default:n = true , mathindent .dim_set:N = \l__wa_mathindent_dim , mathindent .value_required:n = true , mathindent .initial:n = 25 pt , notag .code:n = \str_if_eq:nnTF { #1 } { true } { \clist_clear:N \l__wa_tags_clist } { \clist_set:Nn \l__wa_tags_clist { all } } , notag .default:n = true , nonumber .meta:n = notag , allow-multiple-labels .code:n = \__wa_msg_redirect_name:nn { Multiple~labels } { none } , allow-multiple-labels .value_forbidden:n = true , wrap-lines .bool_set:N = \l__wa_wrap_lines_bool , wrap-lines .default:n = true , tagged-lines .code:n = \clist_set:Nn \l__wa_tags_clist { #1 } \clist_if_in:NnT \l__wa_tags_clist { first } { \clist_remove_all:Nn \l__wa_tags_clist { first } \clist_put_left:Nn \l__wa_tags_clist \c_one_int } , tagged-lines .value_required:n = true , standard-behaviour-with-items .bool_set:N = \l__wa_sbwi_bool , standard-behaviour-with-items .default:n = true } \keys_define:nn { WithArrows / Env } { name .code:n = \seq_if_in:NnTF \g__wa_names_seq { #1 } { \__wa_error:n { Duplicate~name } } { \seq_gput_left:Nn \g__wa_names_seq { #1 } } \str_set:Nn \l__wa_name_str { #1 } , name .value_required:n = true , CodeBefore .code:n = \tl_put_right:Nn \l__wa_code_before_tl { #1 } , CodeBefore .value_required:n = true, CodeAfter .code:n = \tl_put_right:Nn \l__wa_code_after_tl { #1 } , CodeAfter .value_required:n = true } \keys_define:nn { WithArrows } { WithArrows .inherit:n = { WithArrows / Global , WithArrows / WithArrowsSpecific , WithArrows / Env } , DispWithArrows .inherit:n = { WithArrows / DispWithArrowsSpecific , WithArrows / Global , WithArrows / Env , } , WithArrowsOptions .inherit:n = { WithArrows / Global , WithArrows / WithArrowsSpecific , WithArrows / DispWithArrowsSpecific } } \keys_define:nn { WithArrows / WithArrows } { unknown .code:n = \__wa_sort_seq:N \l__wa_options_WithArrows_seq \__wa_error:n { Unknown~option~WithArrows } } \seq_set_from_clist:Nn \l__wa_options_WithArrows_seq { adjust, b, c, CodeAfter, CodeBefore, CommandName, displaystyle, end-adjust, group, groups, i, interline, jot, ll, lr, more-columns, name, no-arrows, rl, rr, show-node-names, show-nodes, start-adjust, t, tikz, TikzCode, xoffset, ygap, ystart } \keys_define:nn { WithArrows / DispWithArrows } { unknown .code:n = \__wa_sort_seq:N \l__wa_options_DispWithArrows_seq \__wa_error:n { Unknown~option~DispWithArrows } } \seq_set_from_clist:Nn \l__wa_options_DispWithArrows_seq { allow-multiple-labels, CodeAfter, CodeBefore, CommandName, TikzCode, adjust, displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr, mathindent, name, no-arrows, nonumber, notag, rl, rr, show-node-names, show-nodes, start-adjust, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart } \keys_define:nn { WithArrows / WithArrowsOptions } { allow-duplicate-names .code:n = \__wa_msg_redirect_name:nn { Duplicate~name } { none } , allow-duplicate-names .value_forbidden:n = true , unknown .code:n = \__wa_sort_seq:N \l__wa_options_WithArrowsOptions_seq \__wa_error:n { Unknown~option~WithArrowsOptions } } \seq_set_from_clist:Nn \l__wa_options_WithArrowsOptions_seq { allow-duplicate-names, allow-multiple-labels, b, c, CommandName, more-columns, TikzCode, adjust, displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr, mathindent, no-arrows, nonumber, notag, rl, rr, show-node-names, show-nodes, standard-behaviour-with-items, start-adjust, t, tagged-lines, tikz, wrap-lines, xoffset, ygap, ystart } \cs_new_protected:Npn \__wa_set_independent: { \str_if_empty:NTF \l__wa_previous_key_str { \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl \str_set:Nn \l__wa_status_arrow_str { independent } \str_if_eq:VnF \l_keys_value_tl { NoValue } { \__wa_error:n { Value~for~a~key } } } { \__wa_error:n { Incompatible~options~in~Arrow } } } \keys_define:nn { WithArrows / Arrow / FirstPass } { jump .code:n = \int_compare:nTF { #1 > 0 } { \int_set:Nn \l__wa_jump_int { #1 } } { \__wa_error:n { Negative~jump } } , jump .value_required:n = true, rr .code:n = \__wa_set_independent: , ll .code:n = \__wa_set_independent: , rl .code:n = \__wa_set_independent: , lr .code:n = \__wa_set_independent: , i .code:n = \__wa_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__wa_pos_arrow_int = 6 } { \str_set:Nn \l__wa_status_arrow_str { new-group } } { \__wa_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__wa_pos_arrow_int > 5 { \__wa_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 = \__wa_sort_seq:N \l__wa_options_Arrow_seq \__wa_error:n { Unknown~option~in~Arrow } } \seq_set_from_clist:Nn \l__wa_options_Arrow_seq { adjust, end-adjust, i, jump, ll, lr, rl, rr, start-adjust, tikz, TikzCode, xoffset } \cs_new_protected:Npn \__wa_fix_pos_arrow:n #1 { \str_if_empty:NT \l__wa_previous_key_str { \str_set_eq:NN \l__wa_previous_key_str \l_keys_key_tl \int_set:Nn \l__wa_pos_arrow_int { #1 } } } \keys_define:nn {WithArrows / Arrow / SecondPass } { TikzCode .tl_set:N = \l__wa_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 = \__wa_fix_pos_arrow:n 3 , ll .code:n = \__wa_fix_pos_arrow:n 1 , rl .code:n = \__wa_fix_pos_arrow:n 2 , lr .code:n = \__wa_fix_pos_arrow:n 0 , i .code:n = \__wa_fix_pos_arrow:n 5 , xoffset .code:n = \int_compare:nNnF \l__wa_pos_arrow_int > 5 { \dim_set:Nn \l__wa_xoffset_dim { #1 } } , start-adjust .dim_set:N = \l__wa_start_adjust_dim, end-adjust .dim_set:N = \l__wa_end_adjust_dim, adjust .code:n = \dim_set:Nn \l__wa_start_adjust_dim { #1 } \dim_set:Nn \l__wa_end_adjust_dim { #1 } , } \NewDocumentCommand \WithArrowsOptions { m } { \str_clear_new:N \l__wa_previous_key_str \keys_set:nn { WithArrows / WithArrowsOptions } { #1 } } \NewDocumentCommand \__wa_Arrow { O { } m ! O { } } { \int_gincr:N \g__wa_arrow_int \str_clear_new:N \l__wa_previous_key_str \keys_set:nn { WithArrows / Arrow / FirstPass } { #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:NnV \l_tmpa_prop { status } \l__wa_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__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop } \prop_gset_eq:cN { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \g__wa_arrow_int _ prop } \l_tmpa_prop } \cs_new_protected:Npn \__wa_Arrow_first_column: { \__wa_error:n { Arrow~in~first~column } \__wa_Arrow } \cs_new_protected:Npn \__wa_pre_environment:n #1 { \str_clear_new:N \l__wa_type_env_str \str_set:NV \l__wa_type_env_str \@currenvir \cs_if_exist:NT \tikz@library@external@loaded { \tikzset { external / export = false } } \str_clear_new:N \l__wa_name_str \str_clear_new:N \l__wa_status_arrow_str \dim_zero_new:N \l__wa_x_dim \str_clear_new:N \l__wa_input_line_str \seq_gput_right:NV \g__wa_arrow_int_seq \g__wa_arrow_int \int_gzero:N \g__wa_arrow_int \seq_gput_right:NV \g__wa_line_int_seq \g__wa_line_int \int_gzero:N \g__wa_line_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 \str_clear_new:N \l__wa_prefix_str \str_set:Nx \l__wa_prefix_str { \seq_use:Nnnn \l_tmpa_seq - - - } \cs_set_eq:NN \\ \__wa_cr: \dim_zero:N \mathsurround \int_zero_new:N \l__wa_initial_int \int_zero_new:N \l__wa_final_int \int_zero_new:N \l__wa_arrow_int \int_zero_new:N \l__wa_pos_of_arrow_int \int_zero_new:N \l__wa_jump_int \int_set:Nn \l__wa_jump_int \c_one_int \bool_set_false:N \l__wa_in_first_column_bool \seq_clear_new:N \l__wa_labels_seq \bool_set_false:N \l__wa_tag_next_line_bool \skip_zero:N \l__wa_interline_skip \tl_clear_new:N \l__wa_code_before_tl \tl_clear_new:N \l__wa_code_after_tl \str_clear_new:N \l__wa_previous_key_str \bool_if:NT \l__wa_in_WithArrows_bool { \keys_set:nn { WithArrows / WithArrows } { #1 } } \bool_if:NT \l__wa_in_DispWithArrows_bool { \keys_set:nn { WithArrows / DispWithArrows } { #1 } } \bool_if:NT \g__wa_footnote_bool { \begin { savenotes } } \l__wa_code_before_tl \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow \cs_set_eq:NN \notag \__wa_notag: \cs_set_eq:NN \nonumber \__wa_notag: \cs_set_eq:NN \tag \__wa_tag \cs_set_eq:NN \__wa_old_label \label \cs_set_eq:NN \label \__wa_label:n \cs_set_eq:NN \tagnextline \__wa_tagnextline: } \NewDocumentEnvironment { WithArrows } { ! O { } } { \bool_set_true:N \l__wa_in_WithArrows_bool \bool_set_false:N \l__wa_in_DispWithArrows_bool \__wa_pre_environment:n { #1 } \if_mode_math: \else: \__wa_error:n { WithArrows~outside~math~mode } \fi: \int_case:nn \l__wa_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox } \bgroup \spread@equation \ialign \bgroup \int_gincr:N \g__wa_line_int \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_first_column: \bool_set_true:N \l__wa_in_first_column_bool \strut \hfil $ \bool_if:NT \l__wa_displaystyle_bool \displaystyle { ## } $ & $ \bool_if:NT \l__wa_displaystyle_bool \displaystyle { { } ## } $ \tikz [ remember~picture , overlay ] \node [ node~contents = { } , __wa_node_style , name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - l , alias = { \str_if_empty:NF \l__wa_name_str { \l__wa_name_str - \int_use:N \g__wa_line_int - l } } ] ; \hfil \tikz [ remember~picture , overlay ] \node [ node~contents = { } , __wa_node_style , name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r , alias = { \str_if_empty:NF \l__wa_name_str { \l__wa_name_str - \int_use:N \g__wa_line_int - r } } ] ; \bool_if:NT \l__wa_show_node_names_bool { \hbox_overlap_right:n { \small wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int } } && \__wa_error:n { Third~column~in~WithArrows } $ \bool_if:NT \l__wa_displaystyle_bool \displaystyle { ## } $ \cr } { \\ \egroup \egroup \__wa_post_environment: \bool_if:NT \g__wa_footnote_bool { \end { savenotes } } } \cs_new_protected:Npn \__wa_post_environment: { \cs_set:Npn \WithArrowsRightX { \g__wa_right_x_dim } \int_compare:nNnT \g__wa_arrow_int > 0 \__wa_scan_arrows: \group_begin: \tikzset { every~picture / .style = __wa_standard } \cs_set:Npn \WithArrowsNbLines { \int_use:N \g__wa_line_int } \cs_set_eq:NN \MultiArrow \__wa_MultiArrow:nn \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_code_after \bool_set_true:N \l__wa_in_CodeAfter_bool \l__wa_code_after_tl \group_end: \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_arrow_int_seq \l_tmpa_tl \int_gset:Nn \g__wa_arrow_int \l_tmpa_tl \seq_gpop_right:NN \g__wa_line_int_seq \l_tmpa_tl \int_gset:Nn \g__wa_line_int \l_tmpa_tl } \cs_new_protected:Npn \__wa_cr: { \scan_stop: \bool_if:NT \l__wa_in_first_column_bool { & { } } \group_align_safe_begin: \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i: } \cs_new_protected:Npn \__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: \bool_if:NT \l__wa_in_DispWithArrows_bool { \clist_if_in:NnTF \l__wa_tags_clist { all } { \tl_if_empty:NT \l__wa_tag_tl { \int_gincr:N \c@equation } \cs_gset:Npx \g_tmpa_tl { \tl_if_empty:NTF \l__wa_tag_tl \theequation \l__wa_tag_tl } \seq_if_empty:NF \l__wa_labels_seq { \cs_set:Npx \@currentlabel { \p@equation \g_tmpa_tl } \bool_if:NT \c__wa_hyperref_loaded_bool { \str_set:Nn \This@name { equation } \hyper@refstepcounter { equation } } \bool_if:NT \c__wa_cleveref_loaded_bool { \cref@constructprefix { equation } \cref@result \protected@edef \cref@currentlabel { [ \cs_if_exist:NTF \cref@equation@alias \cref@equation@alias { equation } ] [ \arabic { equation } ] [ \cref@result ] \p@equation \g_tmpa_tl } } \seq_map_function:NN \l__wa_labels_seq \__wa_old_label } \__wa_save:N \l__wa_tag_star_bool \__wa_save:N \l__wa_qedhere_bool \bool_if:NT \l__wa_tag_next_line_bool { \openup -\jot \bool_set_false:N \l__wa_tag_next_line_bool \notag \\ & } & \__wa_restore:N \l__wa_tag_star_bool \__wa_restore:N \l__wa_qedhere_bool \bool_if:NT \l__wa_qedhere_bool { \hbox_overlap_left:n \__wa_qedhere_i: } \cs_set_eq:NN \theequation \g_tmpa_tl \bool_if:NT \l__wa_tag_star_bool { \cs_set_eq:NN \tagform@ \prg_do_nothing: } \hbox_overlap_left:n { \bool_if:NF \c__wa_leqno_bool { \tikz [ __wa_standard ] \coordinate ( \int_use:N \g__wa_line_int - v ) ; } \quad \@eqnnum } \bool_if:NT \c__wa_leqno_bool { \tikz [ __wa_standard ] \coordinate ( \int_use:N \g__wa_line_int - v ) ; } } { \__wa_save:N \l__wa_qedhere_bool & \__wa_restore:N \l__wa_qedhere_bool \bool_if:NT \l__wa_qedhere_bool { \hbox_overlap_left:n \__wa_qedhere_i: } \tikz [ __wa_standard ] \coordinate ( \int_use:N \g__wa_line_int - v ) ; } } \cr \noalign { \skip_vertical:n { #1 + \l__wa_interline_skip } \scan_stop: } } \cs_new_protected:Npn \__wa_if_in_second_col_of_disp:Nn #1 #2 { \bool_if:NTF \l__wa_in_WithArrows_bool { \__wa_error:nn { Not~allowed~in~WithArrows } { #1 } } { \bool_if:NTF \l__wa_in_first_column_bool { \__wa_error:nn { Not~allowed~in~DispWithArrows } { #1 } } { #2 } } } \cs_new_protected:Npn \__wa_notag: { \__wa_if_in_second_col_of_disp:Nn \notag { \clist_clear:N \l__wa_tags_clist } } \NewDocumentCommand \__wa_tag { s m } { \__wa_if_in_second_col_of_disp:Nn \tag { \tl_if_empty:NF \l__wa_tag_tl { \__wa_error:nn { Multiple~tags } { #2 } } \clist_set:Nn \l__wa_tags_clist { all } \bool_if:nT \c__wa_mathtools_loaded_bool { \MH_if_boolean:nT { show_only_refs } { \MH_if_boolean:nF { show_manual_tags } { \clist_clear:N \l__wa_tags_clist } } } \tl_set:Nn \l__wa_tag_tl { #2 } \bool_set:Nn \l__wa_tag_star_bool { #1 } \bool_if:nT { #1 && ! \bool_if_p:N \c__wa_amsmath_loaded_bool } { \__wa_error:n { tag*~without~amsmath } } } } \cs_new_protected:Npn \__wa_label:n #1 { \__wa_if_in_second_col_of_disp:Nn \label { \seq_if_empty:NF \l__wa_labels_seq { \bool_if:NTF \c__wa_cleveref_loaded_bool { \__wa_error:n { Multiple~labels~with~cleveref } } { \__wa_error:n { Multiple~labels } } } \seq_put_right:Nn \l__wa_labels_seq { #1 } \bool_if:nT \c__wa_mathtools_loaded_bool { \MH_if_boolean:nT { show_only_refs } { \cs_if_exist:cTF { MT_r_#1 } { \clist_set:Nn \l__wa_tags_clist { all } } { \clist_clear:N \l__wa_tags_clist } } } \bool_if:nT \c__wa_autonum_loaded_bool { \cs_if_exist:cTF { autonum@#1Referenced } { \clist_set:Nn \l__wa_tags_clist { all } } { \clist_clear:N \l__wa_tags_clist } } } } \cs_new_protected:Npn \__wa_tagnextline: { \__wa_if_in_second_col_of_disp:Nn \tagnextline { \bool_set_true:N \l__wa_tag_next_line_bool } } \cs_new_protected:Npn \__wa_qedhere: { \bool_set_true:N \l__wa_qedhere_bool } \cs_new_protected:Npn \__wa_qedhere_i: { \group_begin: \cs_set_eq:NN \qed \qedsymbol \cs_set_eq:NN \qed@elt \setQED@elt \QED@stack \relax \relax \group_end: } \bool_new:N \l__wa_inlabel_bool \NewDocumentEnvironment { DispWithArrows } { ! O { } } { \bool_if:nT \c__wa_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__wa_typedref_loaded_bool { \str_set:Nn \sr@name { equation } } \bool_if:NT \c__wa_amsmath_loaded_bool \intertext@ \bool_set_true:N \l__wa_in_DispWithArrows_bool \__wa_pre_environment:n { #1 } \bool_if:NF \l__wa_sbwi_bool { \if@inlabel \bool_set_true:N \l__wa_inlabel_bool \fi } \tl_clear_new:N \l__wa_tag_tl \bool_set_false:N \l__wa_qedhere_bool \bool_set_false:N \l__wa_tag_star_bool \if_mode_math: \__wa_error:n { DispWithArrows~in~math~mode } \fi: \bool_if:NTF \l__wa_inlabel_bool { $ } % $ { \if_mode_vertical: \nointerlineskip \hbox_to_wd:nn { .6 \linewidth } { } \fi: $$ } \bool_if:NTF \l__wa_inlabel_bool \vtop \vcenter \bgroup \spread@equation \bool_if:NTF \l__wa_fleqn_bool { \tabskip = \c_zero_skip } { \tabskip = 0 pt plus 1000 pt minus 1000 pt } \halign to \bool_if:NTF \l__wa_inlabel_bool \linewidth \displaywidth \bgroup \int_gincr:N \g__wa_line_int \cs_set_eq:cN \l__wa_CommandName_str \__wa_Arrow_first_column: \bool_set_true:N \l__wa_in_first_column_bool \strut \bool_if:NT \l__wa_fleqn_bool { \skip_horizontal:n \l__wa_mathindent_dim } \hfil $ \bool_if:NT \l__wa_displaystyle_bool \displaystyle { ## } $ \tabskip = \c_zero_skip & \clist_if_in:NVT \l__wa_tags_clist \g__wa_line_int { \clist_set:Nn \l__wa_tags_clist { all } } \bool_if:NT \c__wa_amsthm_loaded_bool { \cs_set_eq:NN \qedhere \__wa_qedhere: } $ \bool_if:NT \l__wa_displaystyle_bool \displaystyle { { } ## } $ \tabskip = 0 pt plus 1000 pt minus 1000 pt \tikz [ remember~picture , overlay ] \node [ node~contents = { } , __wa_node_style , name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - l , alias = { \str_if_empty:NF \l__wa_name_str { \l__wa_name_str - \int_use:N \g__wa_line_int - l } } ] ; \hfil \tikz [ remember~picture , overlay ] \node [ node~contents = { } , __wa_node_style , name = wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int - r , alias = { \str_if_empty:NF \l__wa_name_str { \l__wa_name_str - \int_use:N \g__wa_line_int - r } } ] ; \bool_if:NT \l__wa_show_node_names_bool { \hbox_overlap_right:n { \small wa - \l__wa_prefix_str - \int_use:N \g__wa_line_int } } & $ ## $ \tabskip = \c_zero_skip && \__wa_error:n { Third~column~in~DispWithArrows } \bool_if:nT \c_false_bool { ## } \cr } { \clist_if_in:NnT \l__wa_tags_clist { last } { \clist_set:Nn \l__wa_tags_clist { all } } \\ \egroup \egroup \bool_if:NT \l__wa_in_DispWithArrows_bool { \dim_gzero_new:N \g__wa_right_x_dim \dim_gset_eq:NN \g__wa_right_x_dim \c_max_dim \begin { tikzpicture } [ __wa_standard ] \int_step_variable:nNn \g__wa_line_int \l_tmpa_int { \cs_if_free:cTF { pgf@sh@ns@wa - \l__wa_prefix_str - \l_tmpa_int - v } { \__wa_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__wa_right_x_dim { \dim_gset:Nn \g__wa_right_x_dim \l_tmpa_dim } } } \end { tikzpicture } } \__wa_post_environment: \bool_if:nT \c__wa_mathtools_loaded_bool { \MH_if_boolean:nT { show_only_refs } \MT_showonlyrefs_true: } \bool_if:NTF \l__wa_inlabel_bool { $ % $ \skip_vertical:N \belowdisplayskip } { $$ } \bool_if:NT \g__wa_footnote_bool { \end {savenotes } } \ignorespacesafterend } \NewDocumentEnvironment { DispWithArrows* } { } { \WithArrowsOptions { notag } \DispWithArrows } \endDispWithArrows \cs_new_protected:Npn \__wa_scan_arrows: { \group_begin: \int_compare:nNnT \l__wa_pos_arrow_int = 7 { \__wa_scan_arrows_i: \int_set:Nn \l__wa_pos_arrow_int 8 } \__wa_scan_arrows_i: \group_end: } \cs_new_protected:Npn \__wa_scan_arrows_i: { \int_zero_new:N \l__wa_first_arrow_of_group_int \int_zero_new:N \l__wa_first_line_of_group_int \int_zero_new:N \l__wa_last_line_of_group_int \seq_clear_new:N \l__wa_first_arrows_seq \seq_clear_new:N \l__wa_last_arrows_seq \bool_set_true:N \l__wa_new_group_bool \int_set:Nn \l__wa_arrow_int \c_one_int \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int { \prop_get:cnN { g__wa_arrow _ \l__wa_prefix_str _ \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_str _ \int_use:N \l__wa_arrow_int _ prop } { final } \l_tmpa_tl \int_set:Nn \l__wa_final_int \l_tmpa_tl \prop_get:cnN { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop } { status } \l__wa_status_arrow_str \prop_get:cnN { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop } { input-line } \l__wa_input_line_str \int_compare:nNnTF \l__wa_final_int > \g__wa_line_int { \int_compare:nNnF \l__wa_pos_arrow_int = 8 { \__wa_error:n { Too~few~lines~for~an~arrow } } } \__wa_code_for_possible_arrow: \int_incr:N \l__wa_arrow_int } \bool_if:nT { \int_compare_p:n { \l__wa_pos_arrow_int != 7 } && \int_compare_p:nNn \l__wa_first_arrow_of_group_int > 0 } { \__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int \g__wa_arrow_int } } \cs_new_protected:Npn \__wa_code_for_possible_arrow: { \bool_if:nT { \int_compare_p:nNn \l__wa_arrow_int > \c_one_int && ( \int_compare_p:n { \l__wa_initial_int > \l__wa_last_line_of_group_int } && \int_compare_p:n { \l__wa_pos_arrow_int != 7 } || \str_if_eq_p:Vn \l__wa_status_arrow_str { new-group } ) } { \int_compare:nNnF \l__wa_first_arrow_of_group_int = \c_zero_int { \__wa_draw_arrows:nn \l__wa_first_arrow_of_group_int { \l__wa_arrow_int - 1 } } \bool_set_true:N \l__wa_new_group_bool } \bool_if:nTF \l__wa_new_group_bool { \bool_set_false:N \l__wa_new_group_bool \int_set_eq:NN \l__wa_first_arrow_of_group_int \l__wa_arrow_int \int_set_eq:NN \l__wa_first_line_of_group_int \l__wa_initial_int \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int \seq_clear:N \l__wa_first_arrows_seq \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int \seq_clear:N \l__wa_last_arrows_seq \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int \int_compare:nT { \l__wa_pos_arrow_int != 8 } { \dim_set:Nn \l__wa_x_dim { - \c_max_dim } } } { \bool_if:nF { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } } { \int_compare:nT { \l__wa_initial_int = \l__wa_first_line_of_group_int } { \seq_put_left:NV \l__wa_first_arrows_seq \l__wa_arrow_int } \int_compare:nNnTF \l__wa_final_int > \l__wa_last_line_of_group_int { \int_set_eq:NN \l__wa_last_line_of_group_int \l__wa_final_int \seq_clear:N \l__wa_last_arrows_seq \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int } { \int_compare:nNnT \l__wa_final_int = \l__wa_last_line_of_group_int { \seq_put_left:NV \l__wa_last_arrows_seq \l__wa_arrow_int } } } } \bool_if:nF { \str_if_eq_p:Vn \l__wa_status_arrow_str { independent } } { \int_compare:nT { \l__wa_pos_arrow_int != 8 } { \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int } } } \cs_generate_variant:Nn \keys_set:nn { n o } \cs_new_protected:Npn \__wa_keys_set: { \keys_set_known:no { WithArrows / Arrow / SecondPass } } \cs_new_protected:Npn \__wa_draw_arrows:nn #1 #2 { \group_begin: \int_zero_new:N \l__wa_first_arrow_int \int_set:Nn \l__wa_first_arrow_int { #1 } \int_zero_new:N \l__wa_last_arrow_int \int_set:Nn \l__wa_last_arrow_int { #2 } \int_set:Nn \l__wa_arrow_int \l__wa_first_arrow_int \int_until_do:nNnn \l__wa_arrow_int > \l__wa_last_arrow_int { \prop_get:cnN { g__wa_arrow _ \l__wa_prefix_str _ \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_str _ \int_use:N \l__wa_arrow_int _ prop } { final } \l_tmpa_tl \int_set:Nn \l__wa_final_int \l_tmpa_tl \int_compare:nT { \l__wa_final_int <= \g__wa_line_int } \__wa_draw_arrows_i: \int_incr:N \l__wa_arrow_int } \group_end: } \cs_new_protected:Npn \__wa_draw_arrows_i: { \group_begin: \prop_get:cnN { g__wa_arrow _\l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop } { options } \l_tmpa_tl \str_clear_new:N \l__wa_previous_key_str \exp_args:NNo \exp_args:No \__wa_keys_set: { \l_tmpa_tl , tikz = { xshift = \l__wa_xoffset_dim } } \bool_set_false:N \l__wa_initial_r_bool \bool_set_false:N \l__wa_final_r_bool \int_case:nn \l__wa_pos_arrow_int { 0 { \bool_set_true:N \l__wa_final_r_bool } 2 { \bool_set_true:N \l__wa_initial_r_bool } 3 { \bool_set_true:N \l__wa_initial_r_bool \bool_set_true:N \l__wa_final_r_bool } } \int_compare:nNnT \l__wa_pos_arrow_int = 5 { \dim_set:Nn \l__wa_x_dim { - \c_max_dim } \__wa_update_x:nn \l__wa_initial_int \l__wa_final_int } \tl_set:Nx \l__wa_initial_tl { \int_use:N \l__wa_initial_int - \bool_if:NTF \l__wa_initial_r_bool rl .south } \tl_set:Nx \l__wa_final_tl { \int_use:N \l__wa_final_int - \bool_if:NTF \l__wa_final_r_bool rl .north } \prop_get:cnN { g__wa_arrow _ \l__wa_prefix_str _ \int_use:N \l__wa_arrow_int _ prop } { label } \l_tmpa_tl \seq_if_in:NxTF \l__wa_first_arrows_seq { \int_use:N \l__wa_arrow_int } { \bool_set_true:N \l_tmpa_bool } { \bool_set_false:N \l_tmpa_bool } \seq_if_in:NxTF \l__wa_last_arrows_seq { \int_use:N \l__wa_arrow_int } { \bool_set_true:N \l_tmpb_bool } { \bool_set_false:N \l_tmpb_bool } \int_compare:nNnT \l__wa_pos_arrow_int = 5 { \bool_set_true:N \l_tmpa_bool \bool_set_true:N \l_tmpb_bool } \begin { tikzpicture } [ __wa_standard ] \tikz@scan@one@point \pgfutil@firstofone ( \l__wa_initial_tl ) \tl_gset:Nx \g_tmpa_tl { \int_compare:nNnTF \l__wa_pos_arrow_int < 5 { \dim_use:N \pgf@x } { \dim_use:N \l__wa_x_dim } , \bool_if:NTF \l_tmpa_bool { \dim_eval:n { \pgf@y + \l__wa_start_adjust_dim } } { \dim_use:N \pgf@y } } \tikz@scan@one@point \pgfutil@firstofone ( \l__wa_final_tl ) \tl_gset:Nx \g_tmpb_tl { \int_compare:nNnTF \l__wa_pos_arrow_int < 5 { \dim_use:N \pgf@x } { \dim_use:N \l__wa_x_dim } , \bool_if:NTF \l_tmpb_bool { \dim_eval:n { \pgf@y - \l__wa_end_adjust_dim } } { \dim_use:N \pgf@y } } \end { tikzpicture } \__wa_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl \group_end: } \cs_new_protected:Npn \__wa_def_function_tmpa:n #1 { \cs_set:Npn \__wa_tmpa:nnn ##1 ##2 ##3 { \begin{tikzpicture} [ __wa_standard , every~path / .style = WithArrows / arrow ] #1 \end{tikzpicture} } } \cs_new_protected:Npn \__wa_draw_arrow:nnn #1 #2 #3 { \bool_if:nT { \l__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool } { \tl_set_eq:NN \l__wa_tikz_code_tl \c__wa_tikz_code_wrap_lines_tl } \exp_args:NV \__wa_def_function_tmpa:n \l__wa_tikz_code_tl \__wa_tmpa:nnn { #1 } { #2 } { #3 } } \cs_generate_variant:Nn \__wa_draw_arrow:nnn { n n o } \tl_const:Nn \c__wa_tikz_code_wrap_lines_tl { \draw ( #1 ) to node ( __wa_label ) { } ( #2 ) ; \tikz@parse@node \pgfutil@firstofone ( __wa_label.west ) \dim_set:Nn \l_tmpa_dim { \g__wa_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 ( __wa_label.west ) node [ anchor = west , text~width = \dim_use:N \l_tmpa_dim ] { #3 } ; } } \cs_new_protected:Npn \__wa_update_x:nn #1 #2 { \int_step_inline:nnn { #1 } { #2 } { \begin { tikzpicture } [ __wa_standard ] \tikz@scan@one@point \pgfutil@firstofone ( ##1 - l ) \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \l__wa_x_dim \pgf@x } \end { tikzpicture } \dim_set_eq:NN \l__wa_x_dim \g_tmpa_dim } } \cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__wa_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 = \__wa_fix_pos_option:n 0 , ll .value_forbidden:n = true, ll .code:n = \__wa_fix_pos_option:n 1 , rl .value_forbidden:n = true , rl .code:n = \__wa_fix_pos_option:n 2 , lr .value_forbidden:n = true , lr .code:n = \__wa_fix_pos_option:n 3 , v .value_forbidden:n = true , v .code:n = \__wa_fix_pos_option:n 4 , TikzCode .tl_set:N = \l__wa_tikz_code_tl , TikzCode .value_required:n = true , xoffset .dim_set:N = \l__wa_xoffset_dim , xoffset .value_required:n = true , unknown .code:n = \__wa_sort_seq:N \l__wa_options_Arrow_CodeAfter_seq \__wa_error:n { Unknown~option~Arrow~in~CodeAfter } } \seq_set_from_clist:Nn \l__wa_options_Arrow_CodeAfter_seq { ll, lr, rl, rr, tikz, TikzCode, v, x, offset } \NewDocumentCommand \__wa_Arrow_code_after { O { } m m m ! O { } } { \int_set:Nn \l__wa_pos_arrow_int 1 \str_clear_new:N \l__wa_previous_key_str \group_begin: \keys_set:nn { WithArrows / Arrow / CodeAfter } { #1, #5, tikz = { xshift = \l__wa_xoffset_dim } } \bool_set_false:N \l__wa_initial_r_bool \bool_set_false:N \l__wa_final_r_bool \int_case:nn \l__wa_pos_arrow_int { 0 { \bool_set_true:N \l__wa_initial_r_bool \bool_set_true:N \l__wa_final_r_bool } 2 { \bool_set_true:N \l__wa_initial_r_bool } 3 { \bool_set_true:N \l__wa_final_r_bool } } \tl_if_eq:nnTF { #2 } { #3 } { \__wa_error:nn { Both~lines~are~equal } { #2 } } { \cs_if_free:cTF { pgf@sh@ns@wa - \l__wa_prefix_str - #2 - l } { \__wa_error:nx { Wrong~line~in~Arrow } { #2 } } { \cs_if_free:cTF { pgf@sh@ns@wa - \l__wa_prefix_str - #3 - l } { \__wa_error:nx { Wrong~line~in~Arrow } { #3 } } { \int_compare:nNnTF \l__wa_pos_arrow_int = 4 { \begin { tikzpicture } [ __wa_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 } [ __wa_standard ] \tikz@scan@one@point \pgfutil@firstofone ( #2-\bool_if:NTF\l__wa_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__wa_final_r_bool rl .north ) \tl_gset:Nx \g_tmpb_tl { \dim_use:N \pgf@x , \dim_use:N \pgf@y } \end { tikzpicture } } \__wa_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 } } } } \group_end: } \cs_new_protected:Npn \__wa_MultiArrow:nn #1 #2 { \foreach \x in { #1 } { \cs_if_free:cTF { pgf@sh@ns@wa - \l__wa_prefix_str - \x - l } { \__wa_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 } { \__wa_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 \__wa_MultiArrow_i:n \g_tmpa_clist \begin { tikzpicture } [ __wa_standard , every~path / .style = { WithArrows / arrow } ] \draw [<->] ([xshift = \l__wa_xoffset_dim]\l_tmpa_tl-r.south) -- ++(5mm,0) -- node (__wa_label) {} ([xshift = \l__wa_xoffset_dim+5mm]\l_tmpb_tl-r.south) -- ([xshift = \l__wa_xoffset_dim]\l_tmpb_tl-r.south) ; \tikz@parse@node \pgfutil@firstofone (__wa_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__wa_wrap_lines_bool && \l__wa_in_DispWithArrows_bool } { \dim_set:Nn \l_tmpb_dim { \g__wa_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 (__wa_label.west) node [ anchor = west, text~width = \dim_use:N \l_tmpa_dim ] { #2 } ; \end{tikzpicture} } } \cs_new_protected:Npn \__wa_MultiArrow_i:n #1 { \begin {tikzpicture } [ __wa_standard , every~path / .style = { WithArrows / arrow } ] \foreach \k in { #1 } { \draw [ <- ] ( [xshift = \l__wa_xoffset_dim]\k-r.south ) -- ++(5mm,0) ; } ; \end { tikzpicture } } \str_const:Nn \c__wa_option_ignored_str { If~you~go~on,~this~option~will~be~ignored. } \__wa_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. } \__wa_msg_new:nnn { Unknown~option~in~Arrow } { The~option~'\l_keys_key_tl'~ is~unknown~for~the~command~\l__wa_string_Arrow_for_msg_str\ in~the~row~\int_use:N \g__wa_line_int\ of~your~environment~\{\l__wa_type_env_str\}. \\ \c__wa_option_ignored_str \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ \seq_use:Nnnn \l__wa_options_Arrow_seq {~and~} {,~} {~and~}. } \__wa_msg_new:nnn { Unknown~option~WithArrows } { The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\ \c__wa_option_ignored_str \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ \seq_use:Nnnn \l__wa_options_WithArrows_seq {~and~} {,~} {~and~}. } \__wa_msg_new:nnn { Unknown~option~DispWithArrows } { The~option~'\l_keys_key_tl'~is~unknown~in~\{\l__wa_type_env_str\}. \\ \c__wa_option_ignored_str \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ \seq_use:Nnnn \l__wa_options_DispWithArrows_seq {~and~} {,~} {~and~}. } \__wa_msg_new:nnn { Unknown~option~WithArrowsOptions } { The~option~'\l_keys_key_tl'~is~unknown~in~ \token_to_str:N \WithArrowsOptions. \\ \c__wa_option_ignored_str \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ \seq_use:Nnnn \l__wa_options_WithArrowsOptions_seq {~and~} {,~} {~and~}. } \__wa_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__wa_option_ignored_str \\ For~a~list~of~the~available~keys,~type~H~. } { The~available~keys~are~(in~alphabetic~order):~ \seq_use:Nnnn \l__wa_options_Arrow_CodeAfter_seq {~and~} {,~} {~and~}. } \__wa_msg_new:nn { Third~column~in~WithArrows } { By~default,~an~environment~\{\l__wa_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. } \__wa_msg_new:nn { Third~column~in~DispWithArrows } { An~environment~\{\l__wa_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__wa_line_int. \\ If~you~go~on,~you~may~have~other~errors. } \__wa_msg_new:nn { Negative~jump } { You~can't~use~a~negative~value~for~the~option~'jump'~of~command~ \l__wa_string_Arrow_for_msg_str\ in~the~row~\int_use:N \g__wa_line_int\ of~your~environment~\{\l__wa_type_env_str\}.~ You~can~create~an~arrow~going~backwards~with~the~option~'<-'~of~Tikz. \\ \c__wa_option_ignored_str } \__wa_msg_new:nn { new-group~without~groups } { You~can't~use~the~option~'new-group'~for~the~command~ \l__wa_string_Arrow_for_msg_str\ because~you~are~not~in~'groups'~mode.~Try~to~use~the~option~ 'groups'~in~your~environment~\{\l__wa_type_env_str\}. \\ \c__wa_option_ignored_str } \__wa_msg_new:nn { Too~few~lines~for~an~arrow } { Line~\l__wa_input_line_str\ :~an~arrow~specified~in~the~row~\int_use:N \l__wa_initial_int\ of~your~environment~\{\l__wa_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. } \__wa_msg_new:nn { WithArrows~outside~math~mode } { The~environment~\{\l__wa_type_env_str\}~should~be~used~only~in~math~mode~ like~the~environment~\{aligned\}~of~amsmath. \\ Nevertheless,~you~can~go~on. } \__wa_msg_new:nn { DispWithArrows~in~math~mode } { The~environment~\{\l__wa_type_env_str\}~should~be~used~only~outside~math~ mode~like~the~environment~\{align\}~of~amsmath. \\ If~you~go~on,~you~will~have~other~errors. } \__wa_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__wa_previous_key_str'~set~in~the~same~command~ \l__wa_string_Arrow_for_msg_str. \\ \c__wa_option_ignored_str } \__wa_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__wa_previous_key_str'~set~in~the~same~command~ \bool_if:NT \l__wa_in_CodeAfter_bool { \l__wa_string_Arrow_for_msg_str\ in~the~CodeAfter~of~your~environment~\{\l__wa_type_env_str\} }. \\ \c__wa_option_ignored_str } \__wa_msg_new:nn { Arrow~in~first~column } { You~should~not~use~the~command~\l__wa_string_Arrow_for_msg_str\ in~the~first~column~of~your~environment~\{\l__wa_type_env_str\}~ but~only~in~the~second~column. \\ However~you~can~go~on~for~this~time. } \__wa_msg_new:nn { Wrong~line~in~Arrow } { The~specification~of~line~'#1'~you~use~in~the~command~ \l__wa_string_Arrow_for_msg_str\ in~the~'CodeAfter'~of~\{\l__wa_type_env_str\}~doesn't~exist. \\ If~you~go~on,~this~command~will~be~ignored. } \__wa_msg_new:nn { Both~lines~are~equal } { In~the~'CodeAfter'~of~\{\l__wa_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. } \__wa_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. } \__wa_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. } \__wa_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. } \__wa_msg_new:nn { Not~allowed~in~DispWithArrows } { The~command~\token_to_str:N #1 is~not~allowed~in~the~first~column~of~\{\l__wa_type_env_str\}~but~ only~in~the~second~column. \\ If~you~go~on,~this~command~will~be~ignored. } \__wa_msg_new:nn { Not~allowed~in~WithArrows } { The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__wa_type_env_str\}~ (it's~allowed~in~the~second~column~of~\{DispWithArrows\}). \\ If~you~go~on,~this~command~will~be~ignored. } \__wa_msg_new:nn { Multiple~tags } { You~can't~use~twice~the~command~\token_to_str:N\tag\ in~a~line~of~the~environment~\{\l__wa_type_env_str\}. \\ If~you~go~on,~the~tag~'#1'~will~be~used. } \__wa_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__wa_type_env_str\}. \\ However,~you~can~go~on.~ \bool_if:NT \c__wa_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. } \__wa_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__wa_type_env_str\}. \\ If~you~go~on,~you~may~have~undefined~references. } \__wa_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__wa_type_env_str\}. \\ If~you~go~on,~you~may~have~an~incorrect~output. } \__wa_msg_new:nn { Option~xoffset~forbidden } { You~can't~use~the~option~'xoffset'~in~the~command~ \l__wa_string_Arrow_for_msg_str\ while~you~are~using~the~option~ ' \int_compare:nNnTF \l__wa_pos_arrow_int = 7 { group } { groups } '. \\ \c__wa_option_ignored_str } \NewDocumentCommand \WithArrowsNewStyle { m m } { \keys_if_exist:nnTF { WithArrows / Global } { #1 } { \__wa_error:nn { Key~already~defined } { #1 } } { \keys_define:nn { WithArrows / Global } { #1 .code:n = { \keys_set_known:nn { WithArrows / WithArrowsOptions } { #2 } } } \seq_put_right:Nn \l__wa_options_WithArrows_seq {#1} \seq_put_right:Nn \l__wa_options_DispWithArrows_seq { #1 } \seq_put_right:Nn \l__wa_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.~You~can~go~on~for~this~time~ but~you~should~suppress~this~key. } \WithArrowsOptions { #2 } \group_end: } } \__wa_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__wa_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__wa_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 = \__wa_set_independent: , down .code:n = \__wa_set_independent: , up .default:n = NoValue , down .default:n = NoValue } \keys_define:nn { WithArrows / Arrow / SecondPass } { up .code:n = \str_if_empty:NT \l__wa_previous_key_str { \str_set:Nn \l__wa_previous_key_str { up } \bool_if:NTF \c__wa_varwidth_loaded_bool { \cs_if_exist:cTF { tikz@library@calc@loaded } { \int_set:Nn \l__wa_pos_arrow_int \c_one_int \bool_set_false:N \l__wa_wrap_lines_bool \tl_set_eq:NN \l__wa_tikz_code_tl \c__wa_tikz_code_up_tl } { \__wa_error:n { calc~not~loaded } } } { \__wa_error:n { varwidth~not~loaded } } } , down .code:n = \str_if_empty:NT \l__wa_previous_key_str { \str_set:Nn \l__wa_previous_key_str { down } \bool_if:NTF \c__wa_varwidth_loaded_bool { \cs_if_exist:cTF { tikz@library@calc@loaded } { \int_set:Nn \l__wa_pos_arrow_int \c_one_int \bool_set_false:N \l__wa_wrap_lines_bool \tl_set_eq:NN \l__wa_tikz_code_tl \c__wa_tikz_code_down_tl } { \__wa_error:n { calc~not~loaded } } } { \__wa_error:n { varwidth~not~loaded } } } } \seq_put_right:Nn \l__wa_options_Arrow_seq { down } \seq_put_right:Nn \l__wa_options_Arrow_seq { up } \__wa_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__wa_option_ignored_str } \__wa_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__wa_option_ignored_str } \__wa_msg_new:nnn { Duplicate~name } { The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~ the~same~environment~name~twice.~You~can~go~on,~but,~ maybe,~you~will~have~incorrect~results. \\ For~a~list~of~the~names~already~used,~type~H~. \\ If~you~don't~want~to~see~this~message~again,~use~the~option~ 'allow-duplicate-names'. } { The~names~already~defined~in~this~document~are:~ \seq_use:Nnnn \g__wa_names_seq { ,~ } { ,~ } { ~and~ }. } \endinput %% %% End of file `witharrows.sty'.