%% %% This is file `witharrows.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% witharrows.dtx (with options: `package') %% %% Copyright (C) 2017 by F. Pantigny %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either %% version 1.3 of this license or (at your option) any later %% version. The latest version of this license is in: %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.3 or later is part of all distributions of %% LaTeX version 2005/12/01 or later. %% \def\myfileversion{1.1} \def\myfiledate{2017/11/06} \RequirePackage{l3keys2e} \ProvidesExplPackage {witharrows} {\myfiledate} {\myfileversion} {Draws arrows for explanations on the right} \RequirePackage{expl3} \RequirePackage{xparse} \RequirePackage{tikz} \usetikzlibrary{calc,arrows.meta,bending} \RequirePackage{footnote} \tikzstyle{__wa_node_style}=[rectangle, inner~sep = 0 pt, minimum~height = 3 pt, minimum~width = 0pt, red, \bool_if:NT \l__wa_shownodes_bool {draw}] \tikzset{TipsOfWithArrows/.style= { > = {Straight~Barb[scale=1.2,bend]}} } \cs_if_free:NT \spread@equation {\cs_set:Npn \spread@equation{\openup\jot \cs_set_eq:NN \spread@equation \prg_do_nothing}} \seq_new:N \g__wa_position_in_the_tree_seq \seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1 \int_new:N \g__wa_last_env_int \skip_new:N \l__wa_interline_skip \bool_new:N \l__wa_MoreColumns_bool \int_new:N \l__wa_pos_int \bool_new:N \l__wa_initial_r_bool \bool_set_true:N \l__wa_initial_r_bool \bool_new:N \l__wa_final_r_bool \bool_set_true:N \l__wa_final_r_bool \bool_new:N \l__wa_i_bool \dim_new:N \l__wa_xoffset_dim \dim_set:Nn \l__wa_xoffset_dim {3mm} \bool_new:N \l__wa_shownodes_bool \bool_new:N \l__wa_shownodenames_bool \bool_new:N \l__wa_displaystyle_bool \tl_clear_new:N \l__wa_options_tikz_tl \bool_new:N \l__wa_position_key_already_set_bool \seq_new:N \g__wa_stack_counter_arrows_seq \int_new:N \g__wa_arrow_int \seq_new:N \g__wa_stack_counter_lines_seq \int_new:N \g__wa_line_int \seq_new:N \g__wa_stack_counter_lines_bis_seq \int_new:N \g__wa_line_bis_int \keys_define:nn {WithArrows} { jump .groups:n = {jump,secondary}, jump .code:n = {\int_set:Nn \l__wa_jump_int {#1} \int_compare:nNnF \l__wa_jump_int > 0 {\msg_error:nn {witharrows} {The~option~"jump"~must~be~non~negative}}}, jump .value_required:n = true, t .groups:n = {global,env,secondary}, t .code:n = {\int_set:Nn \l__wa_pos_int 0}, t .value_forbidden:n = true, c .groups:n = {global,env,secondary}, c .code:n = {\int_set:Nn \l__wa_pos_int 1}, c .value_forbidden:n = true, b .groups:n = {global,env,secondary}, b .code:n = {\int_set:Nn \l__wa_pos_int 2}, b .value_forbidden:n = true, MoreColumns .groups:n = {global,env,secondary}, MoreColumns .bool_set:N = \l__wa_MoreColumns_bool, MoreColumns .default:n = true, MoreColumns .value_forbidden:n = true, CommandName .groups:n = {global,env,secondary}, CommandName .tl_set:N = \l__wa_CommandName_tl, CommandName .initial:n = {Arrow}, CommandName .value_required:n = true, displaystyle .groups:n = {global,env,secondary}, displaystyle .bool_set:N = \l__wa_displaystyle_bool, % shownodes .groups:n = {global,env,secondary}, shownodes .bool_set:N = \l__wa_shownodes_bool, shownodes .default:n = true, shownodenames .groups:n = {global,env,secondary}, shownodenames .bool_set:N = \l__wa_shownodenames_bool, shownodenames .default:n = true, jot .groups:n = {env,secondary}, jot .dim_set:N = \jot, jot .value_required:n = true, interline .groups:n = {env,secondary}, interline .skip_set:N = \l__wa_interline_skip, interline .initial:n = \c_zero_skip, interline .value_required:n = true, xoffset .groups:n = {global,env,local,secondary}, xoffset .dim_set:N = \l__wa_xoffset_dim, xoffset .value_required:n = true, tikz .groups:n = {global,env,local,secondary}, tikz .code:n = {\tl_put_right:Nn \l__wa_options_tikz_tl {,#1}}, tikz .value_required:n = true, ll .groups:n = {global,env,local,secondary}, ll .value_forbidden:n = true, ll .default:n = true, ll .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool {\msg_error:nn {witharrows} {Two~options~are~incompatible}} \bool_if:NT \l__wa_group_bool {\msg_error:nn {witharrows} {Option~incompatible~with~group}} \bool_set_true:N \l__wa_position_key_already_set_bool \bool_set_false:N \l__wa_initial_r_bool \bool_set_false:N \l__wa_final_r_bool \bool_set_false:N \l__wa_i_bool }, lr .groups:n = {global,env,local,secondary}, lr .value_forbidden:n = true, lr .default:n = true, lr .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool {\msg_error:nn {witharrows} {Two~options~are~incompatible}} \bool_if:NT \l__wa_group_bool {\msg_error:nn {witharrows} {Option~incompatible~with~group}} \bool_set_true:N \l__wa_position_key_already_set_bool \bool_set_false:N \l__wa_initial_r_bool \bool_set_true:N \l__wa_final_r_bool \bool_set_false:N \l__wa_i_bool}, rl .groups:n = {global,env,local,secondary}, rl .value_forbidden:n = true, rl .default:n = true, rl .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool {\msg_error:nn {witharrows} {Two~options~are~incompatible}} \bool_if:NT \l__wa_group_bool {\msg_error:nn {witharrows} {Option~incompatible~with~group}} \bool_set_true:N \l__wa_position_key_already_set_bool \bool_set_true:N \l__wa_initial_r_bool \bool_set_false:N \l__wa_final_r_bool \bool_set_false:N \l__wa_i_bool}, rr .groups:n = {global,env,local,secondary}, rr .value_forbidden:n = true, rr .default:n = true, rr .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool {\msg_error:nn {witharrows} {Two~options~are~incompatible}} \bool_if:NT \l__wa_group_bool {\msg_error:nn {witharrows} {Option~incompatible~with~group}} \bool_set_true:N \l__wa_position_key_already_set_bool \bool_set_true:N \l__wa_initial_r_bool \bool_set_true:N \l__wa_final_r_bool \bool_set_false:N \l__wa_i_bool}, i .groups:n = {global,env,local,secondary}, i .code:n = {\bool_if:NT \l__wa_position_key_already_set_bool {\msg_error:nn {witharrows} {Two~options~are~incompatible}} \bool_if:NT \l__wa_group_bool {\msg_error:nn {witharrows} {Option~incompatible~with~group}} \bool_set_true:N \l__wa_position_key_already_set_bool \bool_set_true:N \l__wa_i_bool}, i .value_forbidden:n = true, i .default:n = true, group .groups:n = {global,env}, group .bool_set:N = \l__wa_group_bool, group .value_forbidden:n = true } \ProcessKeysOptions {WithArrows} \NewDocumentCommand \WithArrowsOptions {m} {\bool_set_false:N \l__wa_position_key_already_set_bool \keys_set_filter:nnn {WithArrows} {secondary} {#1} \keys_set_groups:nnn {WithArrows} {global} {#1}} \NewDocumentCommand \__wa_Arrow {O{} m O{}} {\tl_if_eq:noF {WithArrows} {\@currenvir} {\msg_error:nn {witharrows} {Arrow~used~outside~{WithArrows}~environment}} \int_gincr:N \g__wa_arrow_int \int_zero_new:N \l__wa_jump_int \int_set:Nn \l__wa_jump_int 1 \keys_set_groups:nnn {WithArrows} {jump} {#1,#3} \prop_put:NnV \l_tmpa_prop {initial} \g__wa_line_int \int_set:Nn \l_tmpa_int {\g__wa_line_int + \l__wa_jump_int} \prop_put:NnV \l_tmpa_prop {final} \l_tmpa_int \prop_put:Nnn \l_tmpa_prop {options} {#1,#3} \prop_put:Nnn \l_tmpa_prop {label} {#2} \prop_gclear_new:c {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\g__wa_arrow_int _prop} \prop_gset_eq:cN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\g__wa_arrow_int _prop} \l_tmpa_prop } \NewDocumentEnvironment {WithArrows} {O{}} { \seq_gput_right:NV \g__wa_stack_counter_arrows_seq \g__wa_arrow_int \int_gzero:N \g__wa_arrow_int \seq_gput_right:NV \g__wa_stack_counter_lines_seq \g__wa_line_int \int_gzero:N \g__wa_line_int \seq_gput_right:NV \g__wa_stack_counter_lines_bis_seq \g__wa_line_bis_int \int_gzero:N \g__wa_line_bis_int \seq_gput_right:Nn \g__wa_position_in_the_tree_seq 1 \seq_set_eq:NN \l_tmpa_seq \g__wa_position_in_the_tree_seq \seq_pop_right:NN \l_tmpa_seq \l_tmpa_tl \tl_clear_new:N \l__wa_prefix_tl \tl_set:Nx \l__wa_prefix_tl {\seq_use:Nnnn \l_tmpa_seq {-} {-} {-}} \reverse_if:N \if_mode_math: \msg_error:nn {witharrows} {{WithArrows}~used~outside~math~mode} \fi \savenotes \cs_set_eq:NN \\ \__wa_cr: \mathsurround = \c_zero_dim \int_zero_new:N \l__wa_initial_int \int_zero_new:N \l__wa_final_int \int_zero_new:N \l__wa_arrow_int \bool_set_false:N \l__wa_position_key_already_set_bool \skip_zero:N \l__wa_interline_skip \keys_set_filter:nnn {WithArrows} {secondary} {#1} \keys_set_groups:nnn {WithArrows} {env} {#1} \cs_set_eq:cN \l__wa_CommandName_tl \__wa_Arrow \int_case:nn \l__wa_pos_int {0 {\vtop} 1 {\vcenter} 2 {\vbox}} \bgroup \spread@equation \ialign\bgroup \int_gincr:N \g__wa_line_int \strut\hfil $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$ & \int_gincr:N \g__wa_line_bis_int $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {{}##}$ \tikz[remember~picture] \node [__wa_node_style] (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\g__wa_line_int-l) {} ; \hfil \tikz[remember~picture,label~position=right] \node [__wa_node_style] (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\g__wa_line_int-r) {} ; \bool_if:NT \l__wa_shownodenames_bool {\hbox_overlap_right:n {\small wa-\tl_use:N\l__wa_prefix_tl -\int_use:N\g__wa_line_int}} && \bool_if:NF \l__wa_MoreColumns_bool {\msg_error:nn {witharrows} {Third~column~in~a~{WithArrows}~environment}} $\bool_if:NT \l__wa_displaystyle_bool \displaystyle {##}$ \cr } {\crcr \egroup \egroup \int_compare:nNnT \g__wa_line_bis_int < \g__wa_line_int {\msg_error:nn {witharrows} {All~lines~must~have~an~ampersand}} \int_compare:nNnT \g__wa_arrow_int > 0 \__wa_draw_arrows: \spewnotes \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl \seq_gpop_right:NN \g__wa_position_in_the_tree_seq \l_tmpa_tl \seq_gput_right:Nx \g__wa_position_in_the_tree_seq {\int_eval:n {\l_tmpa_tl + 1}} \int_compare:nNnT {\seq_count:N \g__wa_position_in_the_tree_seq} = 1 {\int_gincr:N \g__wa_last_env_int} \seq_gpop_right:NN \g__wa_stack_counter_arrows_seq {\l_tmpa_tl} \int_gset:Nn \g__wa_arrow_int {\l_tmpa_tl} \seq_gpop_right:NN \g__wa_stack_counter_lines_seq \l_tmpa_tl \int_gset:Nn \g__wa_line_int {\l_tmpa_tl} \seq_gpop_right:NN \g__wa_stack_counter_lines_bis_seq \l_tmpa_tl \int_gset:Nn \g__wa_line_bis_int {\l_tmpa_tl} } \cs_set_protected:Nn \__wa_cr: {\scan_stop: \group_align_safe_begin: \peek_meaning_remove:NTF * \__wa_cr_i: \__wa_cr_i:} \cs_set_protected:Nn \__wa_cr_i: {\peek_meaning:NTF [ {\__wa_cr_ii:} {\__wa_cr_ii:[\c_zero_dim]} } \cs_new_protected:Npn \__wa_cr_ii:[#1] {\group_align_safe_end: \cr\noalign{\skip_vertical:n {#1 + \l__wa_interline_skip} \scan_stop:}} \cs_generate_variant:Nn \keys_set_groups:nnn {nno} \cs_new_protected:Nn \keys_set_groups_WithArrows_local: {\keys_set_groups:nno {WithArrows} {local}} \cs_generate_variant:Nn \keys_set_filter:nnn {nno} \cs_new_protected:Nn \keys_set_filter_WithArrows_secondary: {\keys_set_filter:nno {WithArrows} {secondary}} \cs_new_protected:Nn \__wa_draw_arrows: { \bool_if:NT \l__wa_group_bool \__wa_x_computation_for_option_group: \int_set:Nn \l__wa_arrow_int 1 \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int { \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {initial} \l_tmpa_tl \int_set:Nn \l__wa_initial_int {\l_tmpa_tl} \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {final} \l_tmpa_tl \int_set:Nn \l__wa_final_int {\l_tmpa_tl} \int_compare:nNnT \l__wa_final_int > \g__wa_line_int {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}} \group_begin: \keys_define:nn {WithArrows} {group .undefine:} \bool_set_false:N \l__wa_position_key_already_set_bool \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {options} \l_tmpa_tl \exp_args:NNo \exp_args:No \keys_set_filter_WithArrows_secondary: {\l_tmpa_tl} \exp_args:NNo \exp_args:No \keys_set_groups_WithArrows_local: {\l_tmpa_tl} \bool_if:NT \l__wa_i_bool \__wa_x_computation_for_option_i: \tl_set:Nx \l__wa_initial_tl {wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int- \bool_if:NTF\l__wa_initial_r_bool rl} \tl_set:Nx \l__wa_final_tl {wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_final_int- \bool_if:NTF\l__wa_final_r_bool rl . north} \begin{tikzpicture}[remember~picture, overlay, align=left, auto=left, font = {\small\itshape}, TipsOfWithArrows, ->, looseness=1, bend~left=45] \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {label} \l_tmpa_tl \draw \exp_after:wN [\l__wa_options_tikz_tl] let \p1 = (\tl_use:N \l__wa_initial_tl), \p2 = (\tl_use:N \l__wa_final_tl) in (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool} {\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y1} {\x1 + \dim_use:N \l__wa_xoffset_dim, \y1} ) to node [node~contents = {\tl_use:N \l_tmpa_tl}] {} (\bool_if:nTF {\l__wa_group_bool || \l__wa_i_bool} {\dim_use:N \g__wa_x_dim + \dim_use:N \l__wa_xoffset_dim, \y2} {\x2 + \dim_use:N \l__wa_xoffset_dim, \y2} ) ; \end{tikzpicture} \group_end: \int_incr:N \l__wa_arrow_int } } \cs_new_protected:Nn \__wa_x_computation_for_option_i: {\dim_gzero_new:N \g__wa_x_dim \tikz[remember~picture] \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l__wa_initial_int-l) in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ; \__wa_x_computation_analyze_lines_between: } \cs_new_protected:Nn \__wa_x_computation_analyze_lines_between: {\int_compare:nNnT \l__wa_final_int > \g__wa_line_int {\msg_error:nn {witharrows} {Too~few~lines~for~an~arrow}} \int_set:Nn \l_tmpa_int \l__wa_initial_int \int_until_do:nNnn \l_tmpa_int > \l__wa_final_int {\tikz[remember~picture] \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\int_use:N\l_tmpa_int-l) in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\dim_max:nn \g__wa_x_dim {\x1}}} ; \int_incr:N \l_tmpa_int } } \cs_new_protected:Nn \__wa_x_computation_for_option_group: {\dim_gzero_new:N \g__wa_x_dim \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _1_prop} {initial} \l_tmpa_tl \tikz[remember~picture] \path let \p1 = (wa-\tl_use:N\l__wa_prefix_tl-\tl_use:N\l_tmpa_tl-l) in \pgfextra {\dim_gset:Nn \g__wa_x_dim {\x1}} ; \int_set:Nn \l__wa_arrow_int 1 \int_until_do:nNnn \l__wa_arrow_int > \g__wa_arrow_int { \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {initial} \l_tmpa_tl \int_set:Nn \l__wa_initial_int {\l_tmpa_tl} \prop_get:cnN {g__wa_arrow_\l__wa_prefix_tl _\int_use:N\l__wa_arrow_int _prop} {final} \l_tmpa_tl \int_set:Nn \l__wa_final_int {\l_tmpa_tl} \__wa_x_computation_analyze_lines_between: \int_incr:N \l__wa_arrow_int } } \cs_generate_variant:Nn \int_compare:nNnT {cNnT} \cs_generate_variant:Nn \tl_if_eq:nnF {noF} \bigskip \NewDocumentCommand \WithArrowsLastEnv {} {\int_use:N \g__wa_last_env_int} \msg_new:nnn {witharrows} {Third~column~in~a~{WithArrows}~environment} {By~default,~a~\{WithArrows\}~environment~can~only~have~two~columns.~ Maybe~you~have~forgotten~a~newline~symbol.~If~you~really~want~ more~than~two~columns,~you~should~use~the~option~"MoreColumns"~at~ a~global~level~or~for~an~environment.~However,~you~can~go~one~for~this~time.} \msg_new:nnn {witharrows} {Arrow~used~outside~{WithArrows}~environment} {The~command~\string\Arrow\space~should~be~used~only~directly~ in~\{WithArrows\}~environment~and~not~in~a~subenvironment.~However,~you~ can~go~on.} \msg_new:nnn {witharrows} {The~option~"jump"~must~be~non~negative} {You~can't~use~a~strictly~negative~value~for~the~option~"jump"~of~command~ \string\Arrow.~ You~can~create~an~arrow~going~backwards~with~ the~option~"<-"~of~Tikz.} \msg_new:nnn {witharrows} {Too~few~lines~for~an~arrow} {There~is~at~least~an~arrow~that~can't~be~drawn~because~it~arrives~after~the~ last~line~of~the~environment.} \msg_new:nnn {witharrows} {{WithArrows}~used~outside~math~mode} {The~environment~\{WithArrows\}~should~be~used~only~in~math~mode.~ Nevertheless,~you~can~go~on.} \msg_new:nnn {witharrows} {Option~incompatible~with~group} {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~while~ you~are~using~the~option~"group".~It's~incompatible.~You~can~go~on~ignoring~ this~option~"\tl_use:N\l_keys_key_tl"~and~"group"~will~be~used.} \msg_new:nnn {witharrows} {Two~options~are~incompatible} {You~try~to~use~the~option~"\tl_use:N\l_keys_key_tl"~but~ this~option~is~incompatible~with~an~option~previously~set.~ If~you~go~on,~I~will~overwrite~the~previous~option.} \msg_new:nnnn {witharrows} {All~lines~must~have~an~ampersand} {All~lines~of~an~environment~\{WithArrows\}~must~have~an~second~column~ (because~the~nodes~are~created~in~the~second~column).~You~can~go~on~but~maybe~ you~will~have~an~pgf~error~for~an~undefined~shape.} {The~ampersand~can~be~implicit~ (e.g.~if~you~use~\string\MoveEqLeft\space~of~mathtools).} \endinput %% %% End of file `witharrows.sty'.