texlive[69995] Master: witharrows.tex in runtime, Pablo L report, 19
commits+karl at tug.org
commits+karl at tug.org
Mon Feb 19 22:38:09 CET 2024
Revision: 69995
https://tug.org/svn/texlive?view=revision&revision=69995
Author: karl
Date: 2024-02-19 22:38:09 +0100 (Mon, 19 Feb 2024)
Log Message:
-----------
witharrows.tex in runtime, Pablo L report, 19 Feb 2024 13:03:16
Modified Paths:
--------------
trunk/Master/tlpkg/libexec/ctan2tds
Added Paths:
-----------
trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.tex
Removed Paths:
-------------
trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex
Deleted: trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex
===================================================================
--- trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex 2024-02-19 21:35:59 UTC (rev 69994)
+++ trunk/Master/texmf-dist/doc/generic/witharrows/witharrows.tex 2024-02-19 21:38:09 UTC (rev 69995)
@@ -1,2156 +0,0 @@
-%%
-%% This is file `witharrows.tex',
-%% generated with the docstrip utility.
-%%
-%% The original source files were:
-%%
-%% witharrows.dtx (with options: `plain-TeX')
-%%
-%% Copyright (C) 2017-2023 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{2.8b}
-\def\myfiledate{2023/08/24}
-\input tikz.tex
-\input expl3-generic.tex
-\usetikzlibrary{arrows.meta}
-\usepgfmodule{bending} % https://texnique.fr/osqa/questions/12199
-\ExplSyntaxOn
-\catcode `\@ = 11
-\cs_new_protected:Npn \__witharrows_msg_new:nn { \msg_new:nnn { witharrows } }
-\cs_new_protected:Npn \__witharrows_msg_new:nnn #1 #2 #3
- {
- \bool_if:NTF \c__witharrows_messages_for_Overleaf_bool
- { \msg_new:nnn { witharrows } { #1 } { #2 \\ #3 } }
- { \msg_new:nnnn { witharrows } { #1 } { #2 } { #3 } }
- }
-\cs_new_protected:Npn \__witharrows_msg_redirect_name:nn
- { \msg_redirect_name:nnn { witharrows } }
-\cs_new_protected:Npn \__witharrows_error:n { \msg_error:nn { witharrows } }
-\cs_new_protected:Npn \__witharrows_warning:n { \msg_warning:nn { witharrows } }
-\cs_new_protected:Npn \__witharrows_fatal:n { \msg_fatal: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:Npn \__witharrows_error_or_warning:n
- { \bool_if:NTF \c__witharrows_messages_for_Overleaf_bool \__witharrows_warning:n \__witharrows_error:n }
-\bool_set:Nn \c__witharrows_messages_for_Overleaf_bool
- {
- \str_if_eq_p:Vn \c_sys_jobname_str { _region_ } % for Emacs
- || \str_if_eq_p:Vn \c_sys_jobname_str { output } % for Overleaf
- }
-\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
-\cs_new_protected:Npn \__witharrows_sort_seq:N #1
- {
- \seq_sort:Nn #1
- {
- \str_compare:eNeTF
- { \str_lowercase:n { ##1 } } < { \str_lowercase:n { ##2 } }
- \sort_return_same:
- \sort_return_swapped:
- }
- }
-\cs_new_protected:Npn \__witharrows_set_seq_of_str_from_clist:Nn #1 #2
- {
- \seq_set_from_clist:Nn #1 { #2 }
- \seq_set_map_x:NNn #1 #1 { \tl_to_str:n { ##1 } }
- }
-\cs_new_protected:Npn \__witharrows_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 \__witharrows_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
- {
- __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 -
- } ,
- __witharrows_standard_arrow / .style =
- {
- __witharrows_standard ,
- every~path / .style = WithArrows / arrow
- }
- }
-\sys_if_engine_xetex:T
- {
- \tikzset
- {
- __witharrows_standard_arrow / .append~style =
- { every~node / .append~style = { text = . } }
- }
- }
-\tikzset
- {
- WithArrows / arrow / tips / .style =
- { > = { Straight~Barb [ scale = 1.2 , bend ] } }
- }
-\tikzset
- {
- WithArrows / arrow / .style =
- {
- align = flush~left ,
- auto = left ,
- WithArrows / arrow / tips ,
- bend~left = 45 ,
- ->
- }
- }
- \cs_new_protected:Npn \spread at equation
- {
- \openup \jot
- \cs_set_eq:NN \spread at equation \prg_do_nothing:
- }
-\tl_new:N \l__witharrows_left_brace_tl
-\tl_set_eq:NN \l__witharrows_left_brace_tl \c_novalue_tl
-\bool_new:N \l__witharrows_in_WithArrows_bool
-\bool_new:N \l__witharrows_in_DispWithArrows_bool
-\bool_new:N \l__witharrows_in_code_after_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
-\int_new:N \l__witharrows_pos_env_int
-\int_new:N \l__witharrows_pos_arrow_int
-\int_set:Nn \l__witharrows_pos_arrow_int 3
-\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
-\seq_new:N \g__witharrows_col_int_seq
-\int_new:N \g__witharrows_col_int
-\seq_new:N \g__witharrows_static_col_int_seq
-\int_new:N \g__witharrows_static_col_int
-\str_new:N \l__witharrows_command_name_str
-\str_set:Nn \l__witharrows_command_name_str { Arrow }
-\str_new:N \l__witharrows_string_Arrow_for_msg_str
-\str_set:Nx \l__witharrows_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
-\seq_new:N \g__witharrows_names_seq
-\bool_new:N \l__witharrows_in_first_columns_bool
-\bool_new:N \l__witharrows_new_group_bool
-\bool_new:N \l__witharrows_initial_r_bool
-\bool_new:N \l__witharrows_final_r_bool
-\tl_new:N \l__witharrows_initial_tl
-\tl_new:N \l__witharrows_final_tl
-\int_new:N \l__witharrows_nb_cols_int
-\str_new:N \l__witharrows_format_str
-\dim_new:N \l__witharrows_arrow_width_dim
-\dim_set_eq:NN \l__witharrows_arrow_width_dim \c_max_dim
-\dim_new:N \l__witharrows_up_and_down_radius_dim
-\dim_set:Nn \l__witharrows_up_and_down_radius_dim { 4 pt }
-\seq_new:N \l__witharrows_o_arrows_seq
-\dim_new:N \l__witharrows_xoffset_for_o_arrows_dim
-\dim_set:Nn \l__witharrows_xoffset_for_o_arrows_dim { 2 mm }
-\bool_new:N \l__witharrows_right_overlap_bool
-\bool_set_true:N \l__witharrows_right_overlap_bool
-\cs_new_protected:Npn \__witharrows_eval_if_allowed:n #1
- {
- \str_if_empty:NTF \l__witharrows_previous_key_str
- {
- \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
- #1
- }
- { \__witharrows_error:n { Incompatible~options } }
- }
-\cs_new_protected:Npn \__witharrows_fix_pos_option:n #1
- { \__witharrows_eval_if_allowed:n { \int_set:Nn \l__witharrows_pos_arrow_int { #1 } } }
-\keys_define:nn { WithArrows / Global }
- {
- max-length-of-arrow .dim_set:N = \l__witharrows_max_length_of_arrow_dim ,
- max-length-of-arrow .value_required:n = true ,
- max-length-of-arrow .initial:n = 2 cm ,
- ygap .dim_set:N = \l__witharrows_ygap_dim ,
- ygap .initial:n = 0.4 ex ,
- ygap .value_required:n = true ,
- 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 { Too~much~columns~in~WithArrows } { none } ,
- more-columns .value_forbidden:n = true ,
- command-name .code:n =
- \str_set:Nn \l__witharrows_command_name_str { #1 }
- \str_set:Nx \l__witharrows_string_Arrow_for_msg_str
- { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
- command-name .value_required:n = true ,
- tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
- tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
- tikz-code .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-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 .code:n = \__witharrows_fix_pos_option:n 3 ,
- rr .value_forbidden:n = true ,
- ll .code:n = \__witharrows_fix_pos_option:n 1 ,
- ll .value_forbidden:n = true ,
- rl .code:n = \__witharrows_fix_pos_option:n 2 ,
- rl .value_forbidden:n = true ,
- lr .code:n = \__witharrows_fix_pos_option:n 0 ,
- lr .value_forbidden:n = true ,
- i .code:n = \__witharrows_fix_pos_option:n 5 ,
- i .value_forbidden:n = true ,
- xoffset .dim_set:N = \l__witharrows_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__witharrows_interline_skip ,
- start-adjust .dim_set:N = \l__witharrows_start_adjust_dim ,
- start-adjust .initial:n = 0.4 ex ,
- start-adjust .value_required:n = true ,
- end-adjust .dim_set:N = \l__witharrows_end_adjust_dim ,
- end-adjust .initial:n = 0.4 ex ,
- end-adjust .value_required:n = true ,
- adjust .meta:n = { start-adjust = #1 , end-adjust = #1 } ,
- adjust .value_required:n = true ,
- up-and-down .code:n = \keys_set:nn { WithArrows / up-and-down } { #1 } ,
- up-and-down .value_required:n = true ,
- no-arrows .code:n =
- \cs_set_eq:NN \__witharrows_draw_arrows:nn \use_none:nn
- \cs_set_eq:NN \__witharrows_draw_arrow:nnn \use_none:nnn ,
- no-arrows .value_forbidden:n = true
- }
-\keys_define:nn { WithArrows / WithArrowsSpecific }
- {
- t .code:n = \int_set:Nn \l__witharrows_pos_env_int O ,
- 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 ,
- right-overlap .bool_set:N = \l__witharrows_right_overlap_bool ,
- right-overlap .value_required:n = true
- }
-\clist_new:N \c__witharrows_ext_delimiters_clist
-\clist_set:Nn \c__witharrows_ext_delimiters_clist
- {
- ., \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor
- }
-\keys_define:nn { WithArrows / DispWithArrowsSpecific }
- {
- fleqn .bool_set:N = \l__witharrows_fleqn_bool ,
- fleqn .default:n = true ,
- mathindent .skip_set:N = \l__witharrows_mathindent_skip ,
- mathindent .initial:n = 25 pt ,
- mathindent .value_required:n = true ,
- wrap-lines .bool_set:N = \l__witharrows_wrap_lines_bool ,
- wrap-lines .default:n = true ,
- replace-left-brace-by .code:n =
- {
- \tl_set:Nx \l_tmpa_tl { \tl_head:n { #1 } }
- \clist_if_in:NVTF
- \c__witharrows_ext_delimiters_clist
- \l_tmpa_tl
- { \tl_set:Nn \l__witharrows_replace_left_brace_by_tl { #1 } }
- { \__witharrows_error:n { Bad~value~for~replace~brace~by } }
- } ,
- replace-left-brace-by .initial:n = \lbrace ,
- }
-\keys_define:nn { WithArrows / Env }
- {
- name .code:n =
- \str_set:Nn \l_tmpa_str { #1 }
- \seq_if_in:NVTF \g__witharrows_names_seq \l_tmpa_str
- { \__witharrows_error:n { Duplicate~name } }
- { \seq_gput_left:NV \g__witharrows_names_seq \l_tmpa_str }
- \str_set_eq:NN \l__witharrows_name_str \l_tmpa_str ,
- name .value_required:n = true ,
- code-before .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
- code-before .value_required:n = true,
- CodeBefore .meta:n = { code-before = #1 } ,
- code-after .code:n = \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
- code-after .value_required:n = true ,
- CodeAfter .meta:n = { code-after = #1 } ,
- format .code:n =
- \tl_if_empty:nTF { #1 }
- { \__witharrows_error:n { Invalid~option~format } }
- {
- \regex_match:nnTF { \A[rclRCL]*\Z } { #1 }
- { \tl_set:Nn \l__witharrows_format_str { #1 } }
- { \__witharrows_error:n { Invalid~option~format } }
- } ,
- format .value_required:n = true
- }
-\keys_define:nn { WithArrows }
- {
- WithArrows .inherit:n =
- {
- WithArrows / Global ,
- WithArrows / WithArrowsSpecific ,
- WithArrows / Env
- } ,
- WithArrows / up-and-down .inherit:n = WithArrows / up-and-down ,
- DispWithArrows .inherit:n =
- {
- WithArrows / DispWithArrowsSpecific ,
- WithArrows / Global ,
- WithArrows / Env ,
- } ,
- DispWithArrows / up-and-down .inherit:n = WithArrows / up-and-down ,
- WithArrowsOptions .inherit:n =
- {
- WithArrows / Global ,
- WithArrows / WithArrowsSpecific ,
- WithArrows / DispWithArrowsSpecific ,
- } ,
- WithArrowsOptions / up-and-down .inherit:n = WithArrows / up-and-down
- }
-\seq_new:N \l__witharrows_options_WithArrows_seq
-\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_WithArrows_seq
- {
- adjust, b, c, code-after, code-before, command-name,
- right-overlap, displaystyle, end-adjust,
- format, group, groups, i,
- interline, jot, ll,
- lr, max-length-of-arrow, more-columns, name,
- no-arrows, rl, rr, up-and-down,
- show-node-names, show-nodes, start-adjust,
- t, tikz, tikz-code,
- xoffset, ygap, ystart
- }
-\keys_define:nn { WithArrows / WithArrows }
- {
- unknown .code:n =
- \__witharrows_sort_seq:N \l__witharrows_options_WithArrows_seq
- \__witharrows_error:n { Unknown~option~WithArrows }
- }
-\keys_define:nn { WithArrows / DispWithArrows }
- {
- left-brace .tl_set:N = \l__witharrows_left_brace_tl ,
- unknown .code:n =
- \__witharrows_sort_seq:N \l__witharrows_options_DispWithArrows_seq
- \__witharrows_error:n { Unknown~option~DispWithArrows } ,
- }
-\seq_new:N \l__witharrows_options_DispWithArrows_seq
-\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_DispWithArrows_seq
- {
- code-after, code-before, command-name, tikz-code, adjust,
- displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot,
- left-brace, ll, lr, max-length-of-arrow, mathindent, name, no-arrows,
- up-and-down, replace-left-brace-by, rl, rr, show-node-names,
- show-nodes, start-adjust, tikz, wrap-lines, xoffset, ygap, ystart,
- }
-\keys_define:nn { WithArrows / WithArrowsOptions }
- {
- allow-duplicate-names .code:n =
- \__witharrows_msg_redirect_name:nn { Duplicate~name } { none } ,
- allow-duplicate-names .value_forbidden:n = true ,
- xoffset-for-o-arrows .dim_set:N = \l__witharrows_xoffset_for_o_arrows_dim ,
- xoffset-for-o-arrows .value_required:n = true ,
- unknown .code:n =
- \__witharrows_sort_seq:N \l__witharrows_options_WithArrowsOptions_seq
- \__witharrows_error:n { Unknown~option~WithArrowsOptions }
- }
-\seq_new:N \l__witharrows_options_WithArrowsOptions_seq
-\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_WithArrowsOptions_seq
- {
- allow-duplicate-names, b, c, command-name, right_overlap,
- more-columns, tikz-code, adjust,
- displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
- mathindent, max-length-of-arrow, no-arrows, up-and-down, rl, rr,
- show-node-names, show-nodes, start-adjust, t, tikz, wrap-lines, xoffset,
- xoffset-for-o-arrows, ygap, ystart,
- }
-\cs_new_protected:Npn \__witharrows_set_independent:
- {
- \str_if_eq:VnF \l_keys_value_tl { NoValue }
- { \__witharrows_error:n { Value~for~a~key } }
- \__witharrows_set_independent_bis:
- }
-\cs_new_protected:Npn \__witharrows_set_independent_bis:
- {
- \str_if_empty:NTF \l__witharrows_previous_key_str
- {
- \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
- \str_set:Nn \l__witharrows_status_arrow_str { independent }
- }
- { \__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 } } ,
- o .code:n =
- \str_if_empty:NTF \l__witharrows_previous_key_str
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 6
- { \__witharrows_error:n { invalid~key~o } }
- {
- \str_set:Nn \l__witharrows_status_arrow_str { over }
- \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
- }
- }
- { \__witharrows_error:n { Incompatible~options~in~Arrow } } ,
- tikz-code .code:n = \prg_do_nothing: ,
- tikz-code .value_required:n = true ,
- tikz .code:n = \prg_do_nothing: ,
- tikz .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 ,
- xoffset .code:n = ,
- unknown .code:n =
- \__witharrows_sort_seq:N \l__witharrows_options_Arrow_seq
- \seq_if_in:NVTF \l__witharrows_options_WithArrows_seq \l_keys_key_str
- {
- \str_set:Nn \l_tmpa_str
- { ~However,~this~key~can~be~used~in~the~options~of~{WithArrows}. }
- }
- { \str_clear:N \l_tmpa_str }
- \__witharrows_error:n { Unknown~option~in~Arrow }
- }
-\seq_new:N \l__witharrows_options_Arrow_seq
-\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_Arrow_seq
- {
- adjust, end-adjust, i, jump, ll, lr, o , rl, rr, start-adjust, tikz,
- tikz-code, xoffset
- }
-\cs_new_protected:Npn \__witharrows_fix_pos_arrow:n #1
- {
- \str_if_empty:NT \l__witharrows_previous_key_str
- {
- \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
- \int_set:Nn \l__witharrows_pos_arrow_int { #1 }
- }
- }
-\keys_define:nn {WithArrows / Arrow / SecondPass }
- {
- tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
- tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
- tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
- tikz .initial:n = \c_empty_tl ,
- rr .code:n = \__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 ,
- o .code:n = \str_set:Nn \l__witharrows_previous_key_str { o } ,
- xoffset .code:n =
- \bool_if:nTF
- {
- \int_compare_p:nNn \g__witharrows_arrow_int > 1
- &&
- \int_compare_p:nNn \l__witharrows_pos_arrow_int > 5
- &&
- ! \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent }
- }
- { \__witharrows_error:n { Option~xoffset~forbidden } }
- { \dim_set:Nn \l__witharrows_xoffset_dim { #1 } } ,
- xoffset .value_required:n = true ,
- 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 } ,
- }
-\cs_set_protected:Npn \WithArrowsOptions #1
- {
- \str_clear_new:N \l__witharrows_previous_key_str
- \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
- }
-\cs_new_protected:Npn \__witharrows_Arrow
- {
- \peek_meaning:NTF [
- { \__witharrows_Arrow_i }
- { \__witharrows_Arrow_i [ ] }
- }
-\cs_new_protected:Npn \__witharrows_Arrow_i [ #1 ] #2
- {
- \peek_meaning:NTF [
- { \__witharrows_Arrow_ii [ #1 ] { #2 } }
- { \__witharrows_Arrow_ii [ #1 ] { #2 } [ ] }
- }
-\cs_new_protected:Npn \__witharrows_Arrow_ii [ #1 ] #2 [ #3 ]
- {
- \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_put:Nnn \l_tmpa_prop { width } { 0 pt }
- \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:Npn \__witharrows_Arrow_first_columns:
- { \__witharrows_error:n { Arrow~not~in~last~column } \__witharrows_Arrow }
-\cs_new_protected:Npn \__witharrows_pre_halign:n #1
- {
- \cs_if_exist:NT \tikz at library@external at loaded
- { \tikzset { external / export = false } }
- \tikzset { arrows = [ flex ] } % https://texnique.fr/osqa/questions/12199
- \str_clear_new:N \l__witharrows_name_str
- \str_clear_new:N \l__witharrows_status_arrow_str
- \dim_zero_new:N \l__witharrows_x_dim
- \str_clear_new:N \l__witharrows_input_line_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:NV \g__witharrows_col_int_seq \g__witharrows_col_int
- \int_gzero:N \g__witharrows_col_int
- \seq_gput_right:NV \g__witharrows_static_col_int_seq \g__witharrows_static_col_int
- \int_gzero:N \g__witharrows_static_col_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 1
- \str_set:Nn \l__witharrows_format_str { rL }
- \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:NF \l__witharrows_right_overlap_bool
- {
- \bool_if:NT \l__witharrows_in_WithArrows_bool
- {
- \dim_gzero_new:N \g__witharrows_overlap_x_dim
- \dim_zero_new:N \l__witharrows_delta_x_dim
- }
- }
- \cs_set_eq:cN \l__witharrows_command_name_str \__witharrows_Arrow_first_columns:
- \int_set:Nn \l__witharrows_nb_cols_int { \str_count:N \l__witharrows_format_str }
- \int_gset_eq:NN \g__witharrows_col_int \l__witharrows_nb_cols_int
- \seq_clear_new:N \l__witharrows_format_seq
- \seq_set_split:NnV \l__witharrows_format_seq { } \l__witharrows_format_str
- \l__witharrows_code_before_tl
- }
-\cs_new_protected:Npn \__witharrows_construct_halign:
- {
- \seq_pop_right:NNTF \l__witharrows_format_seq \l__witharrows_type_col_str
- {
- \use:e
- {
- \int_gdecr:N \g__witharrows_col_int
- \__witharrows_construct_halign:
- \int_compare:nNnT \g__witharrows_col_int = \l__witharrows_nb_cols_int
- {
- \cs_set_eq:cN { \l__witharrows_command_name_str } \__witharrows_Arrow
- }
- \str_if_eq:VnT \l__witharrows_type_col_str { c } \hfil
- \str_if_eq:VnT \l__witharrows_type_col_str { C } \hfil
- \str_if_eq:VnT \l__witharrows_type_col_str { r } \hfill
- \str_if_eq:VnT \l__witharrows_type_col_str { R } \hfill
- \int_gincr:N \g__witharrows_col_int
- \int_gset:Nn \g__witharrows_static_col_int { \int_use:N \g__witharrows_col_int }
- \c_math_toggle_token
- \str_if_eq:VnT \l__witharrows_type_col_str { C } { { } }
- \str_if_eq:VnT \l__witharrows_type_col_str { L } { { } }
- \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
- ##
- \str_if_eq:VnT \l__witharrows_type_col_str { C } { { } }
- \str_if_eq:VnT \l__witharrows_type_col_str { R } { { } }
- \c_math_toggle_token
- \int_compare:nNnTF \g__witharrows_col_int = \l__witharrows_nb_cols_int
- \__witharrows_construct_nodes:
- {
- \str_if_eq:VnT \l__witharrows_type_col_str { l } \hfil
- \str_if_eq:VnT \l__witharrows_type_col_str { L } \hfil
- \str_if_eq:VnT \l__witharrows_type_col_str { c } \hfil
- \str_if_eq:VnT \l__witharrows_type_col_str { C } \hfil
- \bool_if:NT \l__witharrows_in_DispWithArrows_bool { \tabskip = \c_zero_skip }
- &
- }
- }
- }
- {
- \bool_if:NTF \l__witharrows_in_WithArrows_bool
- {
- \ialign
- \bgroup
- }
- {
- \halign to \l__witharrows_linewidth_dim
- \bgroup
- \bool_if:NT \l__witharrows_fleqn_bool
- { \skip_horizontal:N \l__witharrows_mathindent_skip }
- }
- \int_gincr:N \g__witharrows_line_int
- \int_gzero:N \g__witharrows_col_int
- \tl_if_eq:NNF \l__witharrows_left_brace_tl \c_novalue_tl
- {
- \skip_horizontal:n
- { \box_wd:N \l__witharrows_left_brace_box + \l__witharrows_delim_wd_dim }
- }
- \strut
- }
- }
-\cs_new_protected:Npn \__witharrows_construct_nodes:
- {
- \tikz [ remember~picture , overlay ]
- \node
- [
- node~contents = { } ,
- __witharrows_node_style ,
- name = wa - \l__witharrows_prefix_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 ,
- ]
- ;
- \str_if_empty:NF \l__witharrows_name_str
- {
- \pgfpicture
- \pgfnodealias
- { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
- { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l }
- \pgfnodealias
- { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
- { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r }
- \endpgfpicture
- }
- \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 - r }
- }
- }
-\cs_new_protected:Npn \WithArrows
- {
- \group_begin:
- \peek_meaning:NTF [
- { \WithArrows_i }
- { \WithArrows_i [ ] }
- }
-\cs_new_protected:Npn \WithArrows_i [ #1 ]
- {
- \bool_set_true:N \l__witharrows_in_WithArrows_bool
- \bool_set_false:N \l__witharrows_in_DispWithArrows_bool
- \str_clear_new:N \l__witharrows_type_env_str
- \str_set:Nn \l__witharrows_type_env_str { WithArrows }
- \__witharrows_pre_halign:n { #1 }
- \if_mode_math: \else:
- \__witharrows_error:n { WithArrows~outside~math~mode }
- \fi:
- \box_clear_new:N \l__witharrows_env_box
- \hbox_set:Nw \l__witharrows_env_box
- \int_compare:nNnT \l__witharrows_pos_env_int = 1 \c_math_toggle_token
- \int_case:nn \l__witharrows_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
- \bgroup
- \spread at equation
- \__witharrows_construct_halign:
- &&
- \__witharrows_error:n { Too~much~columns~in~WithArrows }
- \c_math_toggle_token
- \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
- { ## }
- \c_math_toggle_token
- \cr
- }
-\cs_new_protected:Npn \endWithArrows
- {
- \\
- \egroup
- \egroup
- \int_compare:nNnT \l__witharrows_pos_env_int = 1 \c_math_toggle_token
- \hbox_set_end:
- \__witharrows_post_halign:
- \bool_if:NF \l__witharrows_right_overlap_bool
- {
- \box_set_wd:Nn \l__witharrows_env_box
- { \g__witharrows_overlap_x_dim + \box_wd:N \l__witharrows_env_box }
- }
- \box_use_drop:N \l__witharrows_env_box
- \group_end:
- }
-\cs_new_protected:Npn \__witharrows_post_halign:
- {
- \cs_set:Npn \WithArrowsRightX { \g__witharrows_right_x_dim }
- \normalbaselines
- \int_compare:nNnT \g__witharrows_arrow_int > 0
- {
- \int_compare:nNnT \g__witharrows_arrow_int = 1
- {
- \int_compare:nNnT \l__witharrows_pos_arrow_int > 5
- { \int_set:Nn \l__witharrows_pos_arrow_int 5 }
- }
- \__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_command_name_str \__witharrows_Arrow_code_after
- \bool_set_true:N \l__witharrows_in_code_after_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
- \seq_gpop_right:NN \g__witharrows_col_int_seq \l_tmpa_tl
- \int_gset:Nn \g__witharrows_col_int \l_tmpa_tl
- \seq_gpop_right:NN \g__witharrows_static_col_int_seq \l_tmpa_tl
- \int_gset:Nn \g__witharrows_static_col_int \l_tmpa_tl
- }
-\cs_new_protected:Npn \__witharrows_cr:
- {
- \scan_stop:
- \int_compare:nNnF \g__witharrows_col_int = \g__witharrows_static_col_int
- { \__witharrows_error:n { omit~probably~used } }
- \prg_replicate:nn { \l__witharrows_nb_cols_int - \g__witharrows_static_col_int } { & { } }
- \group_align_safe_begin:
- \peek_meaning_remove:NTF * \__witharrows_cr_i: \__witharrows_cr_i:
- }
-\cs_new_protected:Npn \__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
- {
- &
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfcoordinate
- { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - v }
- \pgfpointorigin
- \endpgfpicture
- }
- \dim_compare:nNnT { #1 } < \c_zero_dim
- { \__witharrows_error:n { option~of~cr~negative } }
-
- \cr
- \noalign
- {
- \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim }
- \skip_vertical:N \l_tmpa_dim
- \skip_vertical:N \l__witharrows_interline_skip
- \scan_stop:
- }
- }
-\cs_new_protected:Npn \DispWithArrows
- {
- \group_begin:
- \peek_meaning:NTF <
- { \DispWithArrows_i }
- { \DispWithArrows_i < \c_novalue_tl > }
- }
-\cs_new_protected:Npn \DispWithArrows_i < #1 >
- {
- \peek_meaning:NTF [
- { \DispWithArrows_ii < #1 > }
- { \DispWithArrows_ii < #1 > [ ] }
- }
-\cs_new_protected:Npn \DispWithArrows_ii < #1 > [ #2 ]
- {
- \bool_set_true:N \l__witharrows_in_DispWithArrows_bool
- \str_clear_new:N \l__witharrows_type_env_str
- \str_set:Nn \l__witharrows_type_env_str { DispWithArrows }
- \exp_args:No \tl_if_novalue:nF { #1 } { \tl_set:Nn \l__witharrows_left_brace_tl { #1 } }
- \__witharrows_pre_halign:n { #2 }
- \tl_if_eq:NNF \l__witharrows_left_brace_tl \c_novalue_tl
- {
- \hbox_set:Nn \l_tmpa_box
- {
- \group_begin:
- \dim_zero:N \nulldelimiterspace
- \c_math_toggle_token
- \left \l__witharrows_replace_left_brace_by_tl \vcenter to 1 cm { } \right.
- \c_math_toggle_token
- \group_end:
- }
- \dim_zero_new:N \l__witharrows_delim_wd_dim
- \dim_set:Nn \l__witharrows_delim_wd_dim { \box_wd:N \l_tmpa_box }
- \box_clear_new:N \l__witharrows_left_brace_box
- \hbox_set:Nn \l__witharrows_left_brace_box
- {
- \group_begin:
- \cs_set_eq:NN \label \__witharrows_old_label
- \c_math_toggle_token
- \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
- \l__witharrows_left_brace_tl
- { }
- \c_math_toggle_token
- \group_end:
- }
- }
- \if_mode_math:
- \__witharrows_fatal:n { DispWithArrows~in~math~mode }
- \fi:
- \dim_zero_new:N \linewidth
- \dim_set_eq:NN \linewidth \displaywidth
- \if_mode_vertical:
- \nointerlineskip
- \hbox_to_wd:nn { .6 \linewidth } { }
- \fi:
- \c_math_toggle_token \c_math_toggle_token
- \dim_zero_new:N \l__witharrows_linewidth_dim
- \dim_set_eq:NN \l__witharrows_linewidth_dim \displaywidth
- \box_clear_new:N \l__witharrows_halign_box
- \setbox \l__witharrows_halign_box \vtop \bgroup
- \tabskip =
- \bool_if:NTF \l__witharrows_fleqn_bool
- \c_zero_skip
- { 0 pt plus 1000 pt minus 1000 pt }
- \spread at equation
- \__witharrows_construct_halign:
- \tabskip = 0 pt plus 1000 pt minus 1000 pt
- &
- $ ## $
- \tabskip = \c_zero_skip
- &&
- \__witharrows_fatal:n { Too~much~columns~in~DispWithArrows }
- \bool_if:nT \c_false_bool { ## }
- \cr
- }
-\cs_new_protected:Npn \endDispWithArrows
- {
- \\
- \egroup
- \unskip \unpenalty \unskip \unpenalty
- \box_set_to_last:N \l_tmpa_box
- \nointerlineskip
- \box_use:N \l_tmpa_box
- \dim_gzero_new:N \g__witharrows_alignment_dim
- \dim_gset:Nn \g__witharrows_alignment_dim { \box_wd:N \l_tmpa_box }
- \box_clear_new:N \l__witharrows_new_box
- \hbox_set:Nn \l__witharrows_new_box { \hbox_unpack_drop:N \l_tmpa_box }
- \dim_compare:nNnT
- { \box_wd:N \l__witharrows_new_box } < \g__witharrows_alignment_dim
- { \dim_gset:Nn \g__witharrows_alignment_dim { \box_wd:N \l__witharrows_new_box } }
- \egroup
- \tl_if_eq:NNTF \l__witharrows_left_brace_tl \c_novalue_tl
- { \box_use_drop:N \l__witharrows_halign_box }
- {
- \hbox_to_wd:nn \l__witharrows_linewidth_dim
- {
- \bool_if:NTF \l__witharrows_fleqn_bool
- { \skip_horizontal:N \l__witharrows_mathindent_skip }
- \hfil
- \hbox_to_wd:nn \g__witharrows_alignment_dim
- {
- \box_use_drop:N \l__witharrows_left_brace_box
- \dim_set:Nn \l_tmpa_dim
- {
- \box_ht:N \l__witharrows_halign_box
- + \box_dp:N \l__witharrows_halign_box
- }
- \group_begin:
- \dim_zero:N \nulldelimiterspace
- \c_math_toggle_token
- \left \l__witharrows_replace_left_brace_by_tl
- \vcenter to \l_tmpa_dim { \vfil }
- \right.
- \c_math_toggle_token
- \group_end:
- \hfil
- }
- \hfil
- }
- \skip_horizontal:N -\l__witharrows_linewidth_dim
- \vcenter { \box_use_drop:N \l__witharrows_halign_box }
- }
- \dim_gzero_new:N \g__witharrows_right_x_dim
- \dim_gset_eq:NN \g__witharrows_right_x_dim \c_max_dim
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \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_fatal:n { Inexistent~v-node } }
- {
- \pgfpointanchor
- { wa - \l__witharrows_prefix_str - \l_tmpa_int - v }
- { center }
- \dim_compare:nNnT \pgf at x < \g__witharrows_right_x_dim
- { \dim_gset_eq:NN \g__witharrows_right_x_dim \pgf at x }
- }
- }
- \endpgfpicture
- \__witharrows_post_halign:
- \c_math_toggle_token \c_math_toggle_token
- \group_end:
- }
-\cs_new_protected:Npn \__witharrows_if_in_last_col_of_disp:Nn #1 #2
- {
- \bool_if:NTF \l__witharrows_in_WithArrows_bool
- { \__witharrows_error:nn { Not~allowed~in~WithArrows } { #1 } }
- {
- \int_compare:nNnTF \g__witharrows_col_int < \l__witharrows_nb_cols_int
- { \__witharrows_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
- { #2 }
- }
- }
-\cs_new_protected:Npn \__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:Npn \__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_seq
- \seq_clear_new:N \l__witharrows_last_arrows_seq
- \bool_set_true:N \l__witharrows_new_group_bool
- \int_set:Nn \l__witharrows_arrow_int 1
- \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
- {
- \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
- { \__witharrows_error:n { Too~few~lines~for~an~arrow } }
- }
- \__witharrows_treat_an_arrow_in_scan:
- \int_incr:N \l__witharrows_arrow_int
- }
- \bool_if:nT
- {
- ! \int_compare_p:nNn \l__witharrows_pos_arrow_int = 7
- &&
- \int_compare_p:nNn \l__witharrows_first_arrow_of_group_int > 0
- }
- { \__witharrows_draw_arrows:nn \l__witharrows_first_arrow_of_group_int \g__witharrows_arrow_int }
- }
-\cs_new_protected:Npn \__witharrows_treat_an_arrow_in_scan:
- {
- \bool_lazy_and:nnT
- { \int_compare_p:nNn \l__witharrows_arrow_int > 1 }
- {
- \bool_lazy_or_p:nn
- {
- \bool_lazy_and_p:nn
- {
- \int_compare_p:nNn
- \l__witharrows_initial_int > \l__witharrows_last_line_of_group_int
- }
- { \bool_not_p:n { \int_compare_p:nNn \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 = \c_zero_int
- {
- \__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_seq
- \seq_put_left:NV \l__witharrows_first_arrows_seq \l__witharrows_arrow_int
- \seq_clear:N \l__witharrows_last_arrows_seq
- \seq_put_left:NV \l__witharrows_last_arrows_seq \l__witharrows_arrow_int
- \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
- { \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim } }
- }
- {
- \str_if_eq:VnF \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_seq \l__witharrows_arrow_int }
- \int_compare:nNnTF \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_seq
- \seq_put_left:NV \l__witharrows_last_arrows_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_seq \l__witharrows_arrow_int }
- }
- }
- }
- \str_if_eq:VnF \l__witharrows_status_arrow_str { independent }
- {
- \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
- { \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int }
- }
- }
-\cs_generate_variant:Nn \keys_set:nn { n o }
-\cs_new_protected:Npn \__witharrows_keys_set:
- { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
-\cs_new_protected:Npn \__witharrows_draw_arrows:nn #1 #2
- {
- \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
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
- { status } \l__witharrows_status_arrow_str
- \int_compare:nNnF \l__witharrows_final_int > \g__witharrows_line_int
- {
- \str_if_eq:VnTF \l__witharrows_status_arrow_str { over }
- { \seq_put_right:NV \l__witharrows_o_arrows_seq \l__witharrows_arrow_int }
- \__witharrows_draw_arrow:
- }
- \int_incr:N \l__witharrows_arrow_int
- }
- \__witharrows_draw_o_arrows_of_the_group:
- \group_end:
- }
-\cs_new_protected:Npn \__witharrows_draw_arrow:
- {
- \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 }
- \tl_set:Nx \l__witharrows_final_tl
- { \int_use:N \l__witharrows_final_int - \bool_if:NTF \l__witharrows_final_r_bool rl }
- \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_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_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
- }
- \dim_gzero_new:N \g__witharrows_x_initial_dim
- \dim_gzero_new:N \g__witharrows_x_final_dim
- \dim_gzero_new:N \g__witharrows_y_initial_dim
- \dim_gzero_new:N \g__witharrows_y_final_dim
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfpointanchor { wa - \l__witharrows_prefix_str - \l__witharrows_initial_tl } { south }
- \dim_gset:Nn \g__witharrows_x_initial_dim \pgf at x
- \dim_gset:Nn \g__witharrows_y_initial_dim \pgf at y
- \pgfpointanchor { wa - \l__witharrows_prefix_str - \l__witharrows_final_tl } { north }
- \dim_gset:Nn \g__witharrows_x_final_dim \pgf at x
- \dim_gset:Nn \g__witharrows_y_final_dim \pgf at y
- \endpgfpicture
- \bool_lazy_and:nnTF
- {
- \dim_compare_p:nNn { \g__witharrows_y_initial_dim - \g__witharrows_y_final_dim }
- > \l__witharrows_max_length_of_arrow_dim
- }
- { \int_compare_p:nNn { \l__witharrows_final_int - \l__witharrows_initial_int } = 1 }
- {
- \tl_gset:Nx \g_tmpa_tl
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
- { \dim_use:N \g__witharrows_x_initial_dim }
- { \dim_use:N \l__witharrows_x_dim } ,
- \dim_eval:n
- {
- ( \g__witharrows_y_initial_dim + \g__witharrows_y_final_dim ) / 2
- + 0.5 \l__witharrows_max_length_of_arrow_dim
- }
- }
- \tl_gset:Nx \g_tmpb_tl
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
- { \dim_use:N \g__witharrows_x_final_dim }
- { \dim_use:N \l__witharrows_x_dim } ,
- \dim_eval:n
- {
- ( \g__witharrows_y_initial_dim + \g__witharrows_y_final_dim ) / 2
- - 0.5 \l__witharrows_max_length_of_arrow_dim
- }
- }
- }
- {
- \tl_gset:Nx \g_tmpa_tl
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
- { \dim_use:N \g__witharrows_x_initial_dim }
- { \dim_use:N \l__witharrows_x_dim } ,
- \bool_if:NTF \l_tmpa_bool
- { \dim_eval:n { \g__witharrows_y_initial_dim + \l__witharrows_start_adjust_dim } }
- { \dim_use:N \g__witharrows_y_initial_dim }
- }
- \tl_gset:Nx \g_tmpb_tl
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
- { \dim_use:N \g__witharrows_x_final_dim }
- { \dim_use:N \l__witharrows_x_dim } ,
- \bool_if:NTF \l_tmpb_bool
- { \dim_eval:n { \g__witharrows_y_final_dim - \l__witharrows_end_adjust_dim } }
- { \dim_use:N \g__witharrows_y_final_dim }
- }
- }
- \bool_if:NF \l__witharrows_right_overlap_bool
- {
- \bool_if:NT \l__witharrows_in_WithArrows_bool
- {
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfpointanchor { wa - \l__witharrows_prefix_str - 1 - r } { south }
- \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
- {
- \dim_set:Nn \l__witharrows_delta_x_dim
- {
- \pgf at x -
- ( \dim_min:nn \g__witharrows_x_initial_dim \g__witharrows_x_final_dim )
- }
- }
- { \dim_set:Nn \l__witharrows_delta_x_dim { \pgf at x - \l__witharrows_x_dim } }
- \endpgfpicture
- }
- }
- \__witharrows_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
- \group_end:
- }
-\cs_new_protected:Npn \__witharrows_def_function_tmpa:n #1
- {
- \cs_set:Npn \__witharrows_tmpa:nnn ##1 ##2 ##3
- {
- \tikzpicture
- [ __witharrows_standard_arrow ]
- \pgf at relevantforpicturesizetrue
- #1
- \dim_compare:nNnTF \pgf at picminx = { 16000 pt }
- { \dim_zero:N \l_tmpa_dim }
- { \dim_set:Nn \l_tmpa_dim { \pgf at picmaxx - \pgf at picminx } }
- \dim_add:Nn \l_tmpa_dim \l__witharrows_xoffset_dim
- \prop_gput:cnV
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
- { width }
- \l_tmpa_dim
- \bool_if:NF \l__witharrows_right_overlap_bool
- {
- \bool_if:NT \l__witharrows_in_WithArrows_bool
- {
- \dim_gset:Nn \g__witharrows_overlap_x_dim
- {
- \dim_max:nn
- \g__witharrows_overlap_x_dim
- { \l_tmpa_dim - \l__witharrows_delta_x_dim }
- }
- }
- }
- \pgfresetboundingbox
- \endtikzpicture
- }
- }
-\cs_new_protected:Npn \__witharrows_draw_arrow:nnn #1 #2 #3
- {
- \bool_lazy_and:nnT \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
- {
- \pgfset { inner~sep = 0pt}
- \draw ( #1 ) to node ( __witharrows_label ) { } ( #2 ) ;
- \pgfpointanchor { wa - \l__witharrows_prefix_str - __witharrows_label } { west }
- \dim_set:Nn \l_tmpa_dim { \g__witharrows_right_x_dim - \pgf at x - 0.3333 ex }
- \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at 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:Npn \__witharrows_update_x:nn #1 #2
- {
- \dim_gset_eq:NN \g_tmpa_dim \l__witharrows_x_dim
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \int_step_inline:nnn { #1 } { #2 }
- {
- \pgfpointanchor { wa - \l__witharrows_prefix_str - ##1 - l } { center }
- \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \g_tmpa_dim \pgf at x }
- }
- \endpgfpicture
- \dim_set_eq:NN \l__witharrows_x_dim \g_tmpa_dim
- }
-\cs_new_protected:Npn \__witharrows_draw_o_arrows_of_the_group:
- {
- \seq_sort:Nn \l__witharrows_o_arrows_seq
- {
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ prop }
- { final } \l_tmpa_tl
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##2 _ prop }
- { final } \l_tmpb_tl
- \int_compare:nNnTF \l_tmpa_tl < \l_tmpb_tl
- \sort_return_same:
- {
- \int_compare:nNnTF \l_tmpa_tl > \l_tmpb_tl
- \sort_return_swapped:
- {
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ prop }
- { initial } \l_tmpa_tl
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##2 _ prop }
- { initial } \l_tmpb_tl
- \int_compare:nNnTF \l_tmpa_tl < \l_tmpb_tl
- \sort_return_swapped:
- \sort_return_same:
- }
- }
- }
- \seq_map_inline:Nn \l__witharrows_o_arrows_seq
- {
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ 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 _ ##1 _ 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 _ ##1 _ prop }
- { input-line } \l__witharrows_input_line_str
- \dim_gzero:N \g_tmpa_dim
- \bool_set_false:N \g_tmpa_bool
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \int_step_inline:nnn \l__witharrows_first_arrow_int \l__witharrows_last_arrow_int
- {
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
- { initial } \l_tmpa_tl
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
- { final } \l_tmpb_tl
- \prop_get:cnN
- { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
- { status } \l__witharrows_status_arrow_str
- \bool_if:nT
- {
- ! \int_compare_p:n { ##1 = ####1 }
- && \int_compare_p:n { \l__witharrows_initial_int <= \l_tmpa_tl }
- && \int_compare_p:n { \l_tmpb_tl <= \l__witharrows_final_int }
- && ! \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent }
- }
- {
- \bool_gset_true:N \g_tmpa_bool
- \prop_get:cnN
- { g__witharrows _ arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
- { width }
- \l_tmpa_tl
- \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \g_tmpa_dim \l_tmpa_tl }
- }
- }
- \endpgfpicture
- \bool_if:NTF \g_tmpa_bool
- {
- \int_set:Nn \l__witharrows_arrow_int { ##1 }
- \dim_set_eq:NN \l__witharrows_xoffset_dim \g_tmpa_dim
- \dim_add:Nn \l__witharrows_xoffset_dim \l__witharrows_xoffset_for_o_arrows_dim
- \__witharrows_draw_arrow:
- }
- { \__witharrows_error:n { o~arrow~with~no~arrow~under } }
- }
- }
-\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__witharrows_last_env_int }
-\keys_define:nn { WithArrows / Arrow / code-after }
- {
- tikz .code:n =
- \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
- tikz .value_required:n = true ,
- rr .value_forbidden:n = true ,
- rr .code:n = \__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 ,
- tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
- tikz-code .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_code_after_seq
- \__witharrows_error:n { Unknown~option~Arrow~in~code-after }
- }
-\seq_new:N \l__witharrows_options_Arrow_code_after_seq
-\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_Arrow_code_after_seq
- { ll, lr, rl, rr, tikz, tikz-code, v, x, offset }
-\cs_new_protected:Npn \__witharrows_Arrow_code_after
- {
- \peek_meaning:NTF [
- { \__witharrows_Arrow_code_after_i }
- { \__witharrows_Arrow_code_after_i [ ] }
- }
-\cs_new_protected:Npn \__witharrows_Arrow_code_after_i [ #1 ] #2 #3 #4
- {
- \peek_meaning:NTF [
- { \__witharrows_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } }
- { \__witharrows_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } [ ] }
- }
-\cs_new_protected:Npn \__witharrows_Arrow_code_after_ii [ #1 ] #2 #3 #4 [ #5 ]
- {
- \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 / code-after }
- { #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 at sh@ns at wa - \l__witharrows_prefix_str - #2 - l }
- { \__witharrows_error:nx { Wrong~line~in~Arrow } { #2 } }
- {
- \cs_if_free:cTF { pgf at sh@ns at wa - \l__witharrows_prefix_str - #3 - l }
- { \__witharrows_error:nx { Wrong~line~in~Arrow } { #3 } }
- {
- \int_compare:nNnTF \l__witharrows_pos_arrow_int = 4
- {
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfpointanchor { wa - \l__witharrows_prefix_str - #2 - l }
- { south }
- \dim_set_eq:NN \l_tmpa_dim \pgf at x
- \dim_set_eq:NN \l_tmpb_dim \pgf at y
- \pgfpointanchor { wa - \l__witharrows_prefix_str - #3 - l }
- { north }
- \dim_set:Nn \l_tmpa_dim
- { \dim_max:nn \l_tmpa_dim \pgf at 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 at y }
- \endpgfpicture
- }
- {
- \pgfpicture
- \pgfrememberpicturepositiononpagetrue
- \pgfpointanchor
- {
- wa - \l__witharrows_prefix_str -
- #2 - \bool_if:NTF \l__witharrows_initial_r_bool r l
- }
- { south }
- \tl_gset:Nx \g_tmpa_tl
- { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
- \pgfpointanchor
- {
- wa - \l__witharrows_prefix_str -
- #3 - \bool_if:NTF \l__witharrows_final_r_bool r l
- }
- { north }
- \tl_gset:Nx \g_tmpb_tl
- { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
- \endpgfpicture
- }
- \__witharrows_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
- }
- }
- }
- \group_end:
- }
-\cs_new_protected:Npn \__witharrows_MultiArrow:nn #1 #2
- {
- \exp_args:Nnx
- \regex_match:nnTF
- { \A \d+ (\,\d+)* ( \, \.\.\. (\,\d+)+ )* \Z }
- { #1 }
- { \__witharrows_MultiArrow_i:nn { #1 } { #2 } }
- { \__witharrows_error:nx { Invalid~specification~for~MultiArrow } { #1 } }
- }
-\cs_new_protected:Npn \__witharrows_MultiArrow_i:nn #1 #2
- {
- \foreach \x in { #1 }
- {
- \cs_if_free:cTF { pgf at sh@ns at 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
- \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) ;
- \pgfpointanchor { wa - \l__witharrows_prefix_str - __witharrows_label } { west }
- \dim_set:Nn \l_tmpa_dim { 20 cm }
- \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
- \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl }
- \bool_lazy_and:nnT \l__witharrows_wrap_lines_bool \l__witharrows_in_DispWithArrows_bool
- {
- \dim_set:Nn \l_tmpb_dim
- { \g__witharrows_right_x_dim - \pgf at 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 } ;
- \endtikzpicture
- }
- }
-\cs_new_protected:Npn \__witharrows_MultiArrow_i:n #1
- {
- \tikzpicture
- [
- __witharrows_standard ,
- every~path / .style = { WithArrows / arrow }
- ]
- \foreach \k in { #1 }
- {
- \draw [ <- ]
- ( [xshift = \l__witharrows_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
- } % ;
- \endtikzpicture
- }
-\bool_if:NTF \c__witharrows_messages_for_Overleaf_bool
- { \str_const:Nn \c__witharrows_available_keys_str { } }
- {
- \str_const:Nn \c__witharrows_available_keys_str
- { For~a~list~of~the~available~keys,~type~H~<return>. }
- }
-\str_new:N \l_witharrows_body_str
-\cs_new:Npn \__witharrows_potential_body_i:
- {
- \str_if_empty:NF \l_witharrows_body_str
- { \\ If~you~want~to~see~the~body~of~the~environment,~type~H~<return>. }
- }
-\cs_new:Npn \__witharrows_potential_body_ii:
- {
- \str_if_empty:NTF \l_witharrows_body_str
- { No~further~help~available }
- {
- The~body~of~your~environment~was:\\
- \l_witharrows_body_str
- }
- }
-\str_const:Nn \c__witharrows_option_ignored_str
- { If~you~go~on,~this~option~will~be~ignored. }
-\str_const:Nn \c__witharrows_command_ignored_str
- { If~you~go~on,~this~command~will~be~ignored. }
-\__witharrows_msg_new:nn { Bad~value~for~replace~brace~by }
- {
- Incorrect~value.\\
- Bad~value~for~the~option~'\l_keys_key_str'.~The~value~must~begin~
- with~an~extensible~left~delimiter.~The~possible~values~are:~.,
- \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~
- \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~
- \token_to_str:N \langle,~\token_to_str:N \lmoustache,~
- \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\
- (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\
- if~amsmath~or~unicode-math~is~loaded~in~LaTeX).\\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nn { option~of~cr~negative }
- {
- Bad~value.\\
- The~argument~of~the~command~\token_to_str:N\\~
- should~be~positive~in~the~row~\int_use:N \g__witharrows_line_int\
- of~your~environment~\{\l__witharrows_type_env_str\}.\\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nn { omit~probably~used }
- {
- Strange~problem.\\
- Maybe~you~have~used~a~command~
- \token_to_str:N\omit\ in~the~line~\int_use:N \g__witharrows_line_int\
- (or~another~line)~of~your~environment~\{\l__witharrows_type_env_str\}.\\
- You~can~go~on~but~you~may~have~others~errors.
- }
-\__witharrows_msg_new:nnn { Invalid~option~format }
- {
- Invalide~value.\\
- The~key~'format'~should~contain~only~letters~r,~c~and~l~and~
- must~not~be~empty.\\
- \c__witharrows_option_ignored_str
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nnn { invalid~key~o }
- {
- Invalid~use~of~a~key.\\
- The~key~'o'~for~individual~arrows~can~be~used~only~in~mode~
- 'group'~or~in~mode~'groups'.\\
- \c__witharrows_option_ignored_str
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nnn { Value~for~a~key }
- {
- Misuse~of~a~key.\\
- The~key~'\l_keys_key_str'~should~be~used~without~value. \\
- However,~you~can~go~on~for~this~time.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nnn { Unknown~option~in~Arrow }
- {
- Unknown~option.\\
- The~key~'\l_keys_key_str'~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\}. \l_tmpa_str \\
- \c__witharrows_option_ignored_str \\
- \c__witharrows_available_keys_str
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- \seq_use:Nnnn \l__witharrows_options_Arrow_seq {~and~} {,~} {~and~}.
- }
-\__witharrows_msg_new:nnn { Unknown~option~WithArrows }
- {
- Unknown~option.\\
- The~key~'\l_keys_key_str'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
- \c__witharrows_option_ignored_str \\
- \c__witharrows_available_keys_str
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- \seq_use:Nnnn \l__witharrows_options_WithArrows_seq {~and~} {,~} {~and~}.
- }
-\__witharrows_msg_new:nnn { Unknown~option~DispWithArrows }
- {
- Unknown~option.\\
- The~key~'\l_keys_key_str'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
- \c__witharrows_option_ignored_str \\
- \c__witharrows_available_keys_str
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- \seq_use:Nnnn \l__witharrows_options_DispWithArrows_seq {~and~} {,~} {~and~}.
- }
-\__witharrows_msg_new:nnn { Unknown~option~WithArrowsOptions }
- {
- Unknown~option.\\
- The~key~'\l_keys_key_str'~is~unknown~in~
- \token_to_str:N \WithArrowsOptions. \\
- \c__witharrows_option_ignored_str \\
- \c__witharrows_available_keys_str
- }
- {
- 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~code-after }
- {
- Unknown~option.\\
- The~key~'\l_keys_key_str'~is~unknown~in~
- \token_to_str:N \Arrow\ in~code-after. \\
- \c__witharrows_option_ignored_str \\
- \c__witharrows_available_keys_str
- }
- {
- The~available~keys~are~(in~alphabetic~order):~
- \seq_use:Nnnn \l__witharrows_options_Arrow_code_after_seq {~and~} {,~} {~and~}.
- }
-\__witharrows_msg_new:nnn { Too~much~columns~in~WithArrows }
- {
- Too~much~columns.\\
- Your~environment~\{\l__witharrows_type_env_str\}~has~\int_use:N
- \l__witharrows_nb_cols_int\ columns~and~you~try~to~use~one~more.~
- Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~
- If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~
- the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\
- However,~you~can~go~one~for~this~time.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nnn { Too~much~columns~in~DispWithArrows }
- {
- Too~much~columns.\\
- Your~environment~\{\l__witharrows_type_env_str\}~has~\int_use:N
- \l__witharrows_nb_cols_int\ columns~and~you~try~to~use~one~more.~
- Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
- at~the~end~of~row~\int_use:N \g__witharrows_line_int. \\
- This~error~is~fatal.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nn { Negative~jump }
- {
- Incorrect~value.\\
- 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 }
- {
- Misuse~of~a~key.\\
- 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:nnn
- { Too~few~lines~for~an~arrow }
- {
- Impossible~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_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nn { o~arrow~with~no~arrow~under }
- {
- Problem~with~the~key~'o'.\\
- Line~\l__witharrows_input_line_str\
- :~there~is~no~arrow~'under'~your~arrow~of~type~'o'.\\
- If~you~go~on,~this~arrow~won't~be~drawn.
- }
-\__witharrows_msg_new:nnn { WithArrows~outside~math~mode }
- {
- You~are~outside~math~mode.\\
- The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~in~math~mode~
- like~the~environment~\{aligned\}~of~amsmath. \\
- Nevertheless,~you~can~go~on.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nnn { DispWithArrows~in~math~mode }
- {
- You~are~in~math~mode.\\
- The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~outside~math~
- mode~like~the~environments~\{align\}~and~\{align*\}~of~amsmath. \\
- This~error~is~fatal.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nn { Incompatible~options~in~Arrow }
- {
- Incompatible~options.\\
- You~try~to~use~the~option~'\l_keys_key_str'~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 a}
- {
- Incompatible~options.\\
- You~try~to~use~the~option~'\l_keys_key_str'~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_code_after_bool
- {
- \l__witharrows_string_Arrow_for_msg_str\
- in~the~code-after~of~your~environment~\{\l__witharrows_type_env_str\}
- }. \\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nnn { Arrow~not~in~last~column }
- {
- Bad~use~of~\l__witharrows_string_Arrow_for_msg_str.\\
- You~should~use~the~command~\l__witharrows_string_Arrow_for_msg_str\
- only~in~the~last~column~(column~\int_use:N\l__witharrows_nb_cols_int)~
- in~the~row~\int_use:N \g__witharrows_line_int\
- of~your~environment~\{\l__witharrows_type_env_str\}.\\
- However~you~can~go~on~for~this~time.
- \__witharrows_potential_body_i:
- }
- { \__witharrows_potential_body_ii: }
-\__witharrows_msg_new:nn { Wrong~line~in~Arrow }
- {
- Wrong~line.\\
- The~specification~of~line~'#1'~you~use~in~the~command~
- \l__witharrows_string_Arrow_for_msg_str\
- in~the~'code-after'~of~\{\l__witharrows_type_env_str\}~doesn't~exist. \\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nn { Both~lines~are~equal }
- {
- Both~lines~are~equal.\\
- In~the~'code-after'~of~\{\l__witharrows_type_env_str\}~you~try~to~
- draw~an~arrow~going~to~itself~from~the~line~'#1'.~This~is~not~possible. \\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nn { Wrong~line~specification~in~MultiArrow }
- {
- Wrong~line~specification.\\
- 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 }
- {
- Too~small~specification.\\
- The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\
- is~too~small:~you~need~at~least~two~lines. \\
- \c__witharrows_command_ignored_str
- }
-\__witharrows_msg_new:nn { Not~allowed~in~DispWithArrows }
- {
- Forbidden~command.\\
- The~command~\token_to_str:N #1
- is~allowed~only~in~the~last~column~
- (column~\int_use:N\l__witharrows_nb_cols_int)~of~\{\l__witharrows_type_env_str\}. \\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nn { Not~allowed~in~WithArrows }
- {
- Forbidden~command.\\
- The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__witharrows_type_env_str\}~
- (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\
- \c__witharrows_option_ignored_str
- }
-\__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~\l_tmpa_int\
- of~your~environment~\{\l__witharrows_type_env_str\}. \\
- This~error~is~fatal.
- }
-\__witharrows_msg_new:nn { Option~xoffset~forbidden }
- {
- Incorrect~key.\\
- You~can't~use~the~option~'xoffset'~in~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\}~
- because~you~are~using~the~option~
- ' \int_compare:nNnTF \l__witharrows_pos_arrow_int = 7
- { group }
- { groups } '.~It's~possible~for~an~independent~arrow~or~if~there~is~
- only~one~arrow. \\
- \c__witharrows_option_ignored_str
- }
-\__witharrows_msg_new:nnn { Duplicate~name }
- {
- Duplicate~name.\\
- The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
- the~same~environment~name~twice.~You~can~go~on,~but,~
- maybe,~you~will~have~incorrect~results. \\
- For~a~list~of~the~names~already~used,~type~H~<return>. \\
- If~you~don't~want~to~see~this~message~again,~use~the~option~
- 'allow-duplicate-names'.
- }
- {
- The~names~already~defined~in~this~document~are:~
- \seq_use:Nnnn \g__witharrows_names_seq { ,~ } { ,~ } { ~and~ }.
- }
-\__witharrows_msg_new:nn { Invalid~specification~for~MultiArrow }
- {
- Invalid~specification.\\
- The~specification~of~rows~for~\token_to_str:N\MultiArrow\
- (i.e.~#1)~is~invalid. \\
- \c__witharrows_command_ignored_str
- }
-\cs_new_protected:Npn \WithArrowsNewStyle #1 #2
- {
- \keys_if_exist:nnTF { WithArrows / Global } { #1 }
- { \__witharrows_error:nn { Key~already~defined } { #1 } }
- {
- \seq_clear:N \l_tmpa_seq
- \keyval_parse:NNn \__witharrows_valid_key:n \__witharrows_valid_key:nn { #2 }
- \seq_if_empty:NTF \l_tmpa_seq
- {
- \seq_put_right:Nx \l__witharrows_options_WithArrows_seq
- { \tl_to_str:n { #1 } }
- \seq_put_right:Nx \l__witharrows_options_DispWithArrows_seq
- { \tl_to_str:n { #1 } }
- \seq_put_right:Nx \l__witharrows_options_WithArrowsOptions_seq
- { \tl_to_str:N { #1 } }
- \cs_if_exist:NTF \keys_precompile:nnN
- {
- \keys_precompile:nnN
- { WithArrows / WithArrowsOptions }
- { #2 }
- \l_tmpa_tl
- \__witharrows_key_define:nV { #1 } \l_tmpa_tl
- }
- {
- \keys_define:nn { WithArrows / Global }
- {
- #1 .code:n =
- { \keys_set:nn { WithArrows / WithArrowsOptions } { #2 } }
- }
- }
- }
- { \__witharrows_error:nn { Impossible~style } { #1 } }
- }
- }
-\__witharrows_msg_new:nn { Impossible~style }
- {
- Impossible~style.\\
- It's~impossible~to~define~the~style~'#1'~
- because~it~contains~unknown~keys:~'
- \seq_use:Nnnn \l_tmpa_seq { '~and~' } { ',~'} { ',~and~}'.
- }
-\cs_new_protected:Npn \__witharrows_valid_key:n #1
- {
- \keys_if_exist:nnF { WithArrows / Global } { #1 }
- { \seq_put_right:Nn \l_tmpa_seq { #1 } }
- }
-\cs_new_protected:Npn \__witharrows_valid_key:nn #1 #2
- {
- \keys_if_exist:nnF { WithArrows / Global } { #1 }
- { \seq_put_right:Nn \l_tmpa_seq { #1 } }
- }
-\cs_new_protected:Npn \__witharrows_key_define:nn #1 #2
- { \keys_define:nn { WithArrows / Global } { #1 .code:n = #2 } }
-\cs_generate_variant:Nn \__witharrows_key_define:nn { n V }
-\__witharrows_msg_new:nn { Key~already~defined }
- {
- Key~already~define.\\
- The~key~'#1'~is~already~defined. \\
- If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\
- will~be~ignored.
- }
-\keys_define:nn { WithArrows / up-and-down }
- {
- radius .dim_set:N = \l__witharrows_up_and_down_radius_dim ,
- radius .value_required:n = true ,
- width .code:n =
- \str_case:nnF { #1 }
- {
- { min } { \dim_zero:N \l__witharrows_arrow_width_dim }
- { max } { \dim_set_eq:NN \l__witharrows_arrow_width_dim \c_max_dim }
- }
- { \dim_set:Nn \l__witharrows_arrow_width_dim { #1 } } ,
- width .value_required:n = true ,
- unknown .code:n = \__witharrows_error:n { Option~unknown~for~up-and-down }
- }
-\__witharrows_msg_new:nn { Option~unknown~for~up-and-down }
- {
- Unknown~option.\\
- The~option~'\l_keys_key_str'~is~unknown.~\c__witharrows_option_ignored_str
- }
-\tl_const:Nn \c__witharrows_tikz_code_up_tl
- {
- \dim_case:nnF \l__witharrows_arrow_width_dim
- {
- \c_max_dim
- {
- \draw [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\p1) -- node { #3 } (\x2,\y1) -- (\p2) ;
- }
- \c_zero_dim
- {
- \path node
- {
- \hbox_gset:Nn \g_tmpa_box { #3 }
- \dim_gset:Nn \g_tmpa_dim
- { \box_wd:N \g_tmpa_box + \l__witharrows_up_and_down_radius_dim }
- } ;
- \draw
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\x2-\g_tmpa_dim,\y1)
- -- node { \box_use:N \g_tmpa_box }
- (\x2-\l__witharrows_up_and_down_radius_dim,\y1)
- [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
- -| (\p2) ;
- }
- }
- {
- \draw
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\x2 - \l__witharrows_arrow_width_dim - \l__witharrows_up_and_down_radius_dim,\y1)
- -- node { #3 } (\x2-\l__witharrows_up_and_down_radius_dim,\y1)
- [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
- -| (\p2) ;
- }
- }
-\tl_const:Nn \c__witharrows_tikz_code_down_tl
- {
- \dim_case:nnF \l__witharrows_arrow_width_dim
- {
- \c_max_dim
- {
- \draw [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\p1) -- (\x1,\y2) -- node { #3 } (\p2) ;
- }
- \c_zero_dim
- {
- \path node
- {
- \hbox_gset:Nn \g_tmpa_box { #3 }
- \dim_gset:Nn \g_tmpa_dim
- { \box_wd:N \g_tmpa_box + \l__witharrows_up_and_down_radius_dim }
- } ;
- \draw
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\p1)
- { [ rounded~corners = \l__witharrows_up_and_down_radius_dim ] -- (\x1,\y2) }
- -- (\x1-\l__witharrows_up_and_down_radius_dim,\y2)
- -- node { \box_use:N \g_tmpa_box } (\x1-\g_tmpa_dim,\y2)
- -- ++ (-2mm,0) ;
- }
- }
- {
- \draw
- let \p1 = ( #1 ) , \p2 = ( #2 )
- in (\p1)
- { [ rounded~corners = \l__witharrows_up_and_down_radius_dim ] -- (\x1,\y2) }
- -- (\x1-\l__witharrows_up_and_down_radius_dim,\y2)
- -- node { #3 }
- (\x1 - \l__witharrows_arrow_width_dim - \l__witharrows_up_and_down_radius_dim,\y2)
- -- ++ (-2mm,0) ;
- }
- }
-\keys_define:nn { WithArrows / Arrow / FirstPass }
- {
- up .code:n = \__witharrows_set_independent_bis: ,
- down .code:n = \__witharrows_set_independent_bis: ,
- 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 }
- \cs_if_exist:cTF { tikz at library@calc at loaded }
- {
- \keys_set:nV { WithArrows / up-and-down } \l_keys_value_tl
- \int_set:Nn \l__witharrows_pos_arrow_int 1
- \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 } }
- } ,
- down .code:n =
- \str_if_empty:NT \l__witharrows_previous_key_str
- {
- \str_set:Nn \l__witharrows_previous_key_str { down }
- \cs_if_exist:cTF { tikz at library@calc at loaded }
- {
- \keys_set:nV { WithArrows / up-and-down } \l_keys_value_tl
- \int_set:Nn \l__witharrows_pos_arrow_int 1
- \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 } }
- }
- }
-\seq_put_right:Nn \l__witharrows_options_Arrow_seq { down }
-\seq_put_right:Nn \l__witharrows_options_Arrow_seq { up }
-\__witharrows_msg_new:nn { calc~not~loaded }
- {
- calc~not~loaded.\\
- You~can't~use~the~option~'\l_keys_key_str'~because~you~don't~have~loaded~the~
- Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}'~
- ~in~the~preamble~of~your~document. \\
- \c__witharrows_option_ignored_str
- }
-\catcode `\@ = 12
-\ExplSyntaxOff
-\endinput
-%%
-%% End of file `witharrows.tex'.
Added: trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.tex (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.tex 2024-02-19 21:38:09 UTC (rev 69995)
@@ -0,0 +1,2156 @@
+%%
+%% This is file `witharrows.tex',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% witharrows.dtx (with options: `plain-TeX')
+%%
+%% Copyright (C) 2017-2023 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{2.8b}
+\def\myfiledate{2023/08/24}
+\input tikz.tex
+\input expl3-generic.tex
+\usetikzlibrary{arrows.meta}
+\usepgfmodule{bending} % https://texnique.fr/osqa/questions/12199
+\ExplSyntaxOn
+\catcode `\@ = 11
+\cs_new_protected:Npn \__witharrows_msg_new:nn { \msg_new:nnn { witharrows } }
+\cs_new_protected:Npn \__witharrows_msg_new:nnn #1 #2 #3
+ {
+ \bool_if:NTF \c__witharrows_messages_for_Overleaf_bool
+ { \msg_new:nnn { witharrows } { #1 } { #2 \\ #3 } }
+ { \msg_new:nnnn { witharrows } { #1 } { #2 } { #3 } }
+ }
+\cs_new_protected:Npn \__witharrows_msg_redirect_name:nn
+ { \msg_redirect_name:nnn { witharrows } }
+\cs_new_protected:Npn \__witharrows_error:n { \msg_error:nn { witharrows } }
+\cs_new_protected:Npn \__witharrows_warning:n { \msg_warning:nn { witharrows } }
+\cs_new_protected:Npn \__witharrows_fatal:n { \msg_fatal: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:Npn \__witharrows_error_or_warning:n
+ { \bool_if:NTF \c__witharrows_messages_for_Overleaf_bool \__witharrows_warning:n \__witharrows_error:n }
+\bool_set:Nn \c__witharrows_messages_for_Overleaf_bool
+ {
+ \str_if_eq_p:Vn \c_sys_jobname_str { _region_ } % for Emacs
+ || \str_if_eq_p:Vn \c_sys_jobname_str { output } % for Overleaf
+ }
+\cs_generate_variant:Nn \seq_set_split:Nnn { N x x }
+\cs_new_protected:Npn \__witharrows_sort_seq:N #1
+ {
+ \seq_sort:Nn #1
+ {
+ \str_compare:eNeTF
+ { \str_lowercase:n { ##1 } } < { \str_lowercase:n { ##2 } }
+ \sort_return_same:
+ \sort_return_swapped:
+ }
+ }
+\cs_new_protected:Npn \__witharrows_set_seq_of_str_from_clist:Nn #1 #2
+ {
+ \seq_set_from_clist:Nn #1 { #2 }
+ \seq_set_map_x:NNn #1 #1 { \tl_to_str:n { ##1 } }
+ }
+\cs_new_protected:Npn \__witharrows_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 \__witharrows_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
+ {
+ __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 -
+ } ,
+ __witharrows_standard_arrow / .style =
+ {
+ __witharrows_standard ,
+ every~path / .style = WithArrows / arrow
+ }
+ }
+\sys_if_engine_xetex:T
+ {
+ \tikzset
+ {
+ __witharrows_standard_arrow / .append~style =
+ { every~node / .append~style = { text = . } }
+ }
+ }
+\tikzset
+ {
+ WithArrows / arrow / tips / .style =
+ { > = { Straight~Barb [ scale = 1.2 , bend ] } }
+ }
+\tikzset
+ {
+ WithArrows / arrow / .style =
+ {
+ align = flush~left ,
+ auto = left ,
+ WithArrows / arrow / tips ,
+ bend~left = 45 ,
+ ->
+ }
+ }
+ \cs_new_protected:Npn \spread at equation
+ {
+ \openup \jot
+ \cs_set_eq:NN \spread at equation \prg_do_nothing:
+ }
+\tl_new:N \l__witharrows_left_brace_tl
+\tl_set_eq:NN \l__witharrows_left_brace_tl \c_novalue_tl
+\bool_new:N \l__witharrows_in_WithArrows_bool
+\bool_new:N \l__witharrows_in_DispWithArrows_bool
+\bool_new:N \l__witharrows_in_code_after_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
+\int_new:N \l__witharrows_pos_env_int
+\int_new:N \l__witharrows_pos_arrow_int
+\int_set:Nn \l__witharrows_pos_arrow_int 3
+\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
+\seq_new:N \g__witharrows_col_int_seq
+\int_new:N \g__witharrows_col_int
+\seq_new:N \g__witharrows_static_col_int_seq
+\int_new:N \g__witharrows_static_col_int
+\str_new:N \l__witharrows_command_name_str
+\str_set:Nn \l__witharrows_command_name_str { Arrow }
+\str_new:N \l__witharrows_string_Arrow_for_msg_str
+\str_set:Nx \l__witharrows_string_Arrow_for_msg_str { \token_to_str:N \Arrow }
+\seq_new:N \g__witharrows_names_seq
+\bool_new:N \l__witharrows_in_first_columns_bool
+\bool_new:N \l__witharrows_new_group_bool
+\bool_new:N \l__witharrows_initial_r_bool
+\bool_new:N \l__witharrows_final_r_bool
+\tl_new:N \l__witharrows_initial_tl
+\tl_new:N \l__witharrows_final_tl
+\int_new:N \l__witharrows_nb_cols_int
+\str_new:N \l__witharrows_format_str
+\dim_new:N \l__witharrows_arrow_width_dim
+\dim_set_eq:NN \l__witharrows_arrow_width_dim \c_max_dim
+\dim_new:N \l__witharrows_up_and_down_radius_dim
+\dim_set:Nn \l__witharrows_up_and_down_radius_dim { 4 pt }
+\seq_new:N \l__witharrows_o_arrows_seq
+\dim_new:N \l__witharrows_xoffset_for_o_arrows_dim
+\dim_set:Nn \l__witharrows_xoffset_for_o_arrows_dim { 2 mm }
+\bool_new:N \l__witharrows_right_overlap_bool
+\bool_set_true:N \l__witharrows_right_overlap_bool
+\cs_new_protected:Npn \__witharrows_eval_if_allowed:n #1
+ {
+ \str_if_empty:NTF \l__witharrows_previous_key_str
+ {
+ \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
+ #1
+ }
+ { \__witharrows_error:n { Incompatible~options } }
+ }
+\cs_new_protected:Npn \__witharrows_fix_pos_option:n #1
+ { \__witharrows_eval_if_allowed:n { \int_set:Nn \l__witharrows_pos_arrow_int { #1 } } }
+\keys_define:nn { WithArrows / Global }
+ {
+ max-length-of-arrow .dim_set:N = \l__witharrows_max_length_of_arrow_dim ,
+ max-length-of-arrow .value_required:n = true ,
+ max-length-of-arrow .initial:n = 2 cm ,
+ ygap .dim_set:N = \l__witharrows_ygap_dim ,
+ ygap .initial:n = 0.4 ex ,
+ ygap .value_required:n = true ,
+ 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 { Too~much~columns~in~WithArrows } { none } ,
+ more-columns .value_forbidden:n = true ,
+ command-name .code:n =
+ \str_set:Nn \l__witharrows_command_name_str { #1 }
+ \str_set:Nx \l__witharrows_string_Arrow_for_msg_str
+ { \c_backslash_str Arrow~alias~\c_backslash_str #1 } ,
+ command-name .value_required:n = true ,
+ tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
+ tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+ tikz-code .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-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 .code:n = \__witharrows_fix_pos_option:n 3 ,
+ rr .value_forbidden:n = true ,
+ ll .code:n = \__witharrows_fix_pos_option:n 1 ,
+ ll .value_forbidden:n = true ,
+ rl .code:n = \__witharrows_fix_pos_option:n 2 ,
+ rl .value_forbidden:n = true ,
+ lr .code:n = \__witharrows_fix_pos_option:n 0 ,
+ lr .value_forbidden:n = true ,
+ i .code:n = \__witharrows_fix_pos_option:n 5 ,
+ i .value_forbidden:n = true ,
+ xoffset .dim_set:N = \l__witharrows_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__witharrows_interline_skip ,
+ start-adjust .dim_set:N = \l__witharrows_start_adjust_dim ,
+ start-adjust .initial:n = 0.4 ex ,
+ start-adjust .value_required:n = true ,
+ end-adjust .dim_set:N = \l__witharrows_end_adjust_dim ,
+ end-adjust .initial:n = 0.4 ex ,
+ end-adjust .value_required:n = true ,
+ adjust .meta:n = { start-adjust = #1 , end-adjust = #1 } ,
+ adjust .value_required:n = true ,
+ up-and-down .code:n = \keys_set:nn { WithArrows / up-and-down } { #1 } ,
+ up-and-down .value_required:n = true ,
+ no-arrows .code:n =
+ \cs_set_eq:NN \__witharrows_draw_arrows:nn \use_none:nn
+ \cs_set_eq:NN \__witharrows_draw_arrow:nnn \use_none:nnn ,
+ no-arrows .value_forbidden:n = true
+ }
+\keys_define:nn { WithArrows / WithArrowsSpecific }
+ {
+ t .code:n = \int_set:Nn \l__witharrows_pos_env_int O ,
+ 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 ,
+ right-overlap .bool_set:N = \l__witharrows_right_overlap_bool ,
+ right-overlap .value_required:n = true
+ }
+\clist_new:N \c__witharrows_ext_delimiters_clist
+\clist_set:Nn \c__witharrows_ext_delimiters_clist
+ {
+ ., \{, (, [, \lbrace, \lbrack, \lgroup, \langle, \lmoustache, \lceil, \lfloor
+ }
+\keys_define:nn { WithArrows / DispWithArrowsSpecific }
+ {
+ fleqn .bool_set:N = \l__witharrows_fleqn_bool ,
+ fleqn .default:n = true ,
+ mathindent .skip_set:N = \l__witharrows_mathindent_skip ,
+ mathindent .initial:n = 25 pt ,
+ mathindent .value_required:n = true ,
+ wrap-lines .bool_set:N = \l__witharrows_wrap_lines_bool ,
+ wrap-lines .default:n = true ,
+ replace-left-brace-by .code:n =
+ {
+ \tl_set:Nx \l_tmpa_tl { \tl_head:n { #1 } }
+ \clist_if_in:NVTF
+ \c__witharrows_ext_delimiters_clist
+ \l_tmpa_tl
+ { \tl_set:Nn \l__witharrows_replace_left_brace_by_tl { #1 } }
+ { \__witharrows_error:n { Bad~value~for~replace~brace~by } }
+ } ,
+ replace-left-brace-by .initial:n = \lbrace ,
+ }
+\keys_define:nn { WithArrows / Env }
+ {
+ name .code:n =
+ \str_set:Nn \l_tmpa_str { #1 }
+ \seq_if_in:NVTF \g__witharrows_names_seq \l_tmpa_str
+ { \__witharrows_error:n { Duplicate~name } }
+ { \seq_gput_left:NV \g__witharrows_names_seq \l_tmpa_str }
+ \str_set_eq:NN \l__witharrows_name_str \l_tmpa_str ,
+ name .value_required:n = true ,
+ code-before .code:n = \tl_put_right:Nn \l__witharrows_code_before_tl { #1 } ,
+ code-before .value_required:n = true,
+ CodeBefore .meta:n = { code-before = #1 } ,
+ code-after .code:n = \tl_put_right:Nn \l__witharrows_code_after_tl { #1 } ,
+ code-after .value_required:n = true ,
+ CodeAfter .meta:n = { code-after = #1 } ,
+ format .code:n =
+ \tl_if_empty:nTF { #1 }
+ { \__witharrows_error:n { Invalid~option~format } }
+ {
+ \regex_match:nnTF { \A[rclRCL]*\Z } { #1 }
+ { \tl_set:Nn \l__witharrows_format_str { #1 } }
+ { \__witharrows_error:n { Invalid~option~format } }
+ } ,
+ format .value_required:n = true
+ }
+\keys_define:nn { WithArrows }
+ {
+ WithArrows .inherit:n =
+ {
+ WithArrows / Global ,
+ WithArrows / WithArrowsSpecific ,
+ WithArrows / Env
+ } ,
+ WithArrows / up-and-down .inherit:n = WithArrows / up-and-down ,
+ DispWithArrows .inherit:n =
+ {
+ WithArrows / DispWithArrowsSpecific ,
+ WithArrows / Global ,
+ WithArrows / Env ,
+ } ,
+ DispWithArrows / up-and-down .inherit:n = WithArrows / up-and-down ,
+ WithArrowsOptions .inherit:n =
+ {
+ WithArrows / Global ,
+ WithArrows / WithArrowsSpecific ,
+ WithArrows / DispWithArrowsSpecific ,
+ } ,
+ WithArrowsOptions / up-and-down .inherit:n = WithArrows / up-and-down
+ }
+\seq_new:N \l__witharrows_options_WithArrows_seq
+\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_WithArrows_seq
+ {
+ adjust, b, c, code-after, code-before, command-name,
+ right-overlap, displaystyle, end-adjust,
+ format, group, groups, i,
+ interline, jot, ll,
+ lr, max-length-of-arrow, more-columns, name,
+ no-arrows, rl, rr, up-and-down,
+ show-node-names, show-nodes, start-adjust,
+ t, tikz, tikz-code,
+ xoffset, ygap, ystart
+ }
+\keys_define:nn { WithArrows / WithArrows }
+ {
+ unknown .code:n =
+ \__witharrows_sort_seq:N \l__witharrows_options_WithArrows_seq
+ \__witharrows_error:n { Unknown~option~WithArrows }
+ }
+\keys_define:nn { WithArrows / DispWithArrows }
+ {
+ left-brace .tl_set:N = \l__witharrows_left_brace_tl ,
+ unknown .code:n =
+ \__witharrows_sort_seq:N \l__witharrows_options_DispWithArrows_seq
+ \__witharrows_error:n { Unknown~option~DispWithArrows } ,
+ }
+\seq_new:N \l__witharrows_options_DispWithArrows_seq
+\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_DispWithArrows_seq
+ {
+ code-after, code-before, command-name, tikz-code, adjust,
+ displaystyle, end-adjust, fleqn, group, format, groups, i, interline, jot,
+ left-brace, ll, lr, max-length-of-arrow, mathindent, name, no-arrows,
+ up-and-down, replace-left-brace-by, rl, rr, show-node-names,
+ show-nodes, start-adjust, tikz, wrap-lines, xoffset, ygap, ystart,
+ }
+\keys_define:nn { WithArrows / WithArrowsOptions }
+ {
+ allow-duplicate-names .code:n =
+ \__witharrows_msg_redirect_name:nn { Duplicate~name } { none } ,
+ allow-duplicate-names .value_forbidden:n = true ,
+ xoffset-for-o-arrows .dim_set:N = \l__witharrows_xoffset_for_o_arrows_dim ,
+ xoffset-for-o-arrows .value_required:n = true ,
+ unknown .code:n =
+ \__witharrows_sort_seq:N \l__witharrows_options_WithArrowsOptions_seq
+ \__witharrows_error:n { Unknown~option~WithArrowsOptions }
+ }
+\seq_new:N \l__witharrows_options_WithArrowsOptions_seq
+\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_WithArrowsOptions_seq
+ {
+ allow-duplicate-names, b, c, command-name, right_overlap,
+ more-columns, tikz-code, adjust,
+ displaystyle, end-adjust, fleqn, group, groups, i, interline, jot, ll, lr,
+ mathindent, max-length-of-arrow, no-arrows, up-and-down, rl, rr,
+ show-node-names, show-nodes, start-adjust, t, tikz, wrap-lines, xoffset,
+ xoffset-for-o-arrows, ygap, ystart,
+ }
+\cs_new_protected:Npn \__witharrows_set_independent:
+ {
+ \str_if_eq:VnF \l_keys_value_tl { NoValue }
+ { \__witharrows_error:n { Value~for~a~key } }
+ \__witharrows_set_independent_bis:
+ }
+\cs_new_protected:Npn \__witharrows_set_independent_bis:
+ {
+ \str_if_empty:NTF \l__witharrows_previous_key_str
+ {
+ \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
+ \str_set:Nn \l__witharrows_status_arrow_str { independent }
+ }
+ { \__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 } } ,
+ o .code:n =
+ \str_if_empty:NTF \l__witharrows_previous_key_str
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 6
+ { \__witharrows_error:n { invalid~key~o } }
+ {
+ \str_set:Nn \l__witharrows_status_arrow_str { over }
+ \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
+ }
+ }
+ { \__witharrows_error:n { Incompatible~options~in~Arrow } } ,
+ tikz-code .code:n = \prg_do_nothing: ,
+ tikz-code .value_required:n = true ,
+ tikz .code:n = \prg_do_nothing: ,
+ tikz .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 ,
+ xoffset .code:n = ,
+ unknown .code:n =
+ \__witharrows_sort_seq:N \l__witharrows_options_Arrow_seq
+ \seq_if_in:NVTF \l__witharrows_options_WithArrows_seq \l_keys_key_str
+ {
+ \str_set:Nn \l_tmpa_str
+ { ~However,~this~key~can~be~used~in~the~options~of~{WithArrows}. }
+ }
+ { \str_clear:N \l_tmpa_str }
+ \__witharrows_error:n { Unknown~option~in~Arrow }
+ }
+\seq_new:N \l__witharrows_options_Arrow_seq
+\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_Arrow_seq
+ {
+ adjust, end-adjust, i, jump, ll, lr, o , rl, rr, start-adjust, tikz,
+ tikz-code, xoffset
+ }
+\cs_new_protected:Npn \__witharrows_fix_pos_arrow:n #1
+ {
+ \str_if_empty:NT \l__witharrows_previous_key_str
+ {
+ \str_set_eq:NN \l__witharrows_previous_key_str \l_keys_key_str
+ \int_set:Nn \l__witharrows_pos_arrow_int { #1 }
+ }
+ }
+\keys_define:nn {WithArrows / Arrow / SecondPass }
+ {
+ tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
+ tikz-code .initial:n = \draw~(#1)~to~node{#3}~(#2)~; ,
+ tikz .code:n = \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+ tikz .initial:n = \c_empty_tl ,
+ rr .code:n = \__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 ,
+ o .code:n = \str_set:Nn \l__witharrows_previous_key_str { o } ,
+ xoffset .code:n =
+ \bool_if:nTF
+ {
+ \int_compare_p:nNn \g__witharrows_arrow_int > 1
+ &&
+ \int_compare_p:nNn \l__witharrows_pos_arrow_int > 5
+ &&
+ ! \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent }
+ }
+ { \__witharrows_error:n { Option~xoffset~forbidden } }
+ { \dim_set:Nn \l__witharrows_xoffset_dim { #1 } } ,
+ xoffset .value_required:n = true ,
+ 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 } ,
+ }
+\cs_set_protected:Npn \WithArrowsOptions #1
+ {
+ \str_clear_new:N \l__witharrows_previous_key_str
+ \keys_set:nn { WithArrows / WithArrowsOptions } { #1 }
+ }
+\cs_new_protected:Npn \__witharrows_Arrow
+ {
+ \peek_meaning:NTF [
+ { \__witharrows_Arrow_i }
+ { \__witharrows_Arrow_i [ ] }
+ }
+\cs_new_protected:Npn \__witharrows_Arrow_i [ #1 ] #2
+ {
+ \peek_meaning:NTF [
+ { \__witharrows_Arrow_ii [ #1 ] { #2 } }
+ { \__witharrows_Arrow_ii [ #1 ] { #2 } [ ] }
+ }
+\cs_new_protected:Npn \__witharrows_Arrow_ii [ #1 ] #2 [ #3 ]
+ {
+ \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_put:Nnn \l_tmpa_prop { width } { 0 pt }
+ \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:Npn \__witharrows_Arrow_first_columns:
+ { \__witharrows_error:n { Arrow~not~in~last~column } \__witharrows_Arrow }
+\cs_new_protected:Npn \__witharrows_pre_halign:n #1
+ {
+ \cs_if_exist:NT \tikz at library@external at loaded
+ { \tikzset { external / export = false } }
+ \tikzset { arrows = [ flex ] } % https://texnique.fr/osqa/questions/12199
+ \str_clear_new:N \l__witharrows_name_str
+ \str_clear_new:N \l__witharrows_status_arrow_str
+ \dim_zero_new:N \l__witharrows_x_dim
+ \str_clear_new:N \l__witharrows_input_line_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:NV \g__witharrows_col_int_seq \g__witharrows_col_int
+ \int_gzero:N \g__witharrows_col_int
+ \seq_gput_right:NV \g__witharrows_static_col_int_seq \g__witharrows_static_col_int
+ \int_gzero:N \g__witharrows_static_col_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 1
+ \str_set:Nn \l__witharrows_format_str { rL }
+ \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:NF \l__witharrows_right_overlap_bool
+ {
+ \bool_if:NT \l__witharrows_in_WithArrows_bool
+ {
+ \dim_gzero_new:N \g__witharrows_overlap_x_dim
+ \dim_zero_new:N \l__witharrows_delta_x_dim
+ }
+ }
+ \cs_set_eq:cN \l__witharrows_command_name_str \__witharrows_Arrow_first_columns:
+ \int_set:Nn \l__witharrows_nb_cols_int { \str_count:N \l__witharrows_format_str }
+ \int_gset_eq:NN \g__witharrows_col_int \l__witharrows_nb_cols_int
+ \seq_clear_new:N \l__witharrows_format_seq
+ \seq_set_split:NnV \l__witharrows_format_seq { } \l__witharrows_format_str
+ \l__witharrows_code_before_tl
+ }
+\cs_new_protected:Npn \__witharrows_construct_halign:
+ {
+ \seq_pop_right:NNTF \l__witharrows_format_seq \l__witharrows_type_col_str
+ {
+ \use:e
+ {
+ \int_gdecr:N \g__witharrows_col_int
+ \__witharrows_construct_halign:
+ \int_compare:nNnT \g__witharrows_col_int = \l__witharrows_nb_cols_int
+ {
+ \cs_set_eq:cN { \l__witharrows_command_name_str } \__witharrows_Arrow
+ }
+ \str_if_eq:VnT \l__witharrows_type_col_str { c } \hfil
+ \str_if_eq:VnT \l__witharrows_type_col_str { C } \hfil
+ \str_if_eq:VnT \l__witharrows_type_col_str { r } \hfill
+ \str_if_eq:VnT \l__witharrows_type_col_str { R } \hfill
+ \int_gincr:N \g__witharrows_col_int
+ \int_gset:Nn \g__witharrows_static_col_int { \int_use:N \g__witharrows_col_int }
+ \c_math_toggle_token
+ \str_if_eq:VnT \l__witharrows_type_col_str { C } { { } }
+ \str_if_eq:VnT \l__witharrows_type_col_str { L } { { } }
+ \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+ ##
+ \str_if_eq:VnT \l__witharrows_type_col_str { C } { { } }
+ \str_if_eq:VnT \l__witharrows_type_col_str { R } { { } }
+ \c_math_toggle_token
+ \int_compare:nNnTF \g__witharrows_col_int = \l__witharrows_nb_cols_int
+ \__witharrows_construct_nodes:
+ {
+ \str_if_eq:VnT \l__witharrows_type_col_str { l } \hfil
+ \str_if_eq:VnT \l__witharrows_type_col_str { L } \hfil
+ \str_if_eq:VnT \l__witharrows_type_col_str { c } \hfil
+ \str_if_eq:VnT \l__witharrows_type_col_str { C } \hfil
+ \bool_if:NT \l__witharrows_in_DispWithArrows_bool { \tabskip = \c_zero_skip }
+ &
+ }
+ }
+ }
+ {
+ \bool_if:NTF \l__witharrows_in_WithArrows_bool
+ {
+ \ialign
+ \bgroup
+ }
+ {
+ \halign to \l__witharrows_linewidth_dim
+ \bgroup
+ \bool_if:NT \l__witharrows_fleqn_bool
+ { \skip_horizontal:N \l__witharrows_mathindent_skip }
+ }
+ \int_gincr:N \g__witharrows_line_int
+ \int_gzero:N \g__witharrows_col_int
+ \tl_if_eq:NNF \l__witharrows_left_brace_tl \c_novalue_tl
+ {
+ \skip_horizontal:n
+ { \box_wd:N \l__witharrows_left_brace_box + \l__witharrows_delim_wd_dim }
+ }
+ \strut
+ }
+ }
+\cs_new_protected:Npn \__witharrows_construct_nodes:
+ {
+ \tikz [ remember~picture , overlay ]
+ \node
+ [
+ node~contents = { } ,
+ __witharrows_node_style ,
+ name = wa - \l__witharrows_prefix_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 ,
+ ]
+ ;
+ \str_if_empty:NF \l__witharrows_name_str
+ {
+ \pgfpicture
+ \pgfnodealias
+ { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - l }
+ { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - l }
+ \pgfnodealias
+ { \l__witharrows_name_str - \int_use:N \g__witharrows_line_int - r }
+ { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - r }
+ \endpgfpicture
+ }
+ \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 - r }
+ }
+ }
+\cs_new_protected:Npn \WithArrows
+ {
+ \group_begin:
+ \peek_meaning:NTF [
+ { \WithArrows_i }
+ { \WithArrows_i [ ] }
+ }
+\cs_new_protected:Npn \WithArrows_i [ #1 ]
+ {
+ \bool_set_true:N \l__witharrows_in_WithArrows_bool
+ \bool_set_false:N \l__witharrows_in_DispWithArrows_bool
+ \str_clear_new:N \l__witharrows_type_env_str
+ \str_set:Nn \l__witharrows_type_env_str { WithArrows }
+ \__witharrows_pre_halign:n { #1 }
+ \if_mode_math: \else:
+ \__witharrows_error:n { WithArrows~outside~math~mode }
+ \fi:
+ \box_clear_new:N \l__witharrows_env_box
+ \hbox_set:Nw \l__witharrows_env_box
+ \int_compare:nNnT \l__witharrows_pos_env_int = 1 \c_math_toggle_token
+ \int_case:nn \l__witharrows_pos_env_int { 0 \vtop 1 \vcenter 2 \vbox }
+ \bgroup
+ \spread at equation
+ \__witharrows_construct_halign:
+ &&
+ \__witharrows_error:n { Too~much~columns~in~WithArrows }
+ \c_math_toggle_token
+ \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+ { ## }
+ \c_math_toggle_token
+ \cr
+ }
+\cs_new_protected:Npn \endWithArrows
+ {
+ \\
+ \egroup
+ \egroup
+ \int_compare:nNnT \l__witharrows_pos_env_int = 1 \c_math_toggle_token
+ \hbox_set_end:
+ \__witharrows_post_halign:
+ \bool_if:NF \l__witharrows_right_overlap_bool
+ {
+ \box_set_wd:Nn \l__witharrows_env_box
+ { \g__witharrows_overlap_x_dim + \box_wd:N \l__witharrows_env_box }
+ }
+ \box_use_drop:N \l__witharrows_env_box
+ \group_end:
+ }
+\cs_new_protected:Npn \__witharrows_post_halign:
+ {
+ \cs_set:Npn \WithArrowsRightX { \g__witharrows_right_x_dim }
+ \normalbaselines
+ \int_compare:nNnT \g__witharrows_arrow_int > 0
+ {
+ \int_compare:nNnT \g__witharrows_arrow_int = 1
+ {
+ \int_compare:nNnT \l__witharrows_pos_arrow_int > 5
+ { \int_set:Nn \l__witharrows_pos_arrow_int 5 }
+ }
+ \__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_command_name_str \__witharrows_Arrow_code_after
+ \bool_set_true:N \l__witharrows_in_code_after_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
+ \seq_gpop_right:NN \g__witharrows_col_int_seq \l_tmpa_tl
+ \int_gset:Nn \g__witharrows_col_int \l_tmpa_tl
+ \seq_gpop_right:NN \g__witharrows_static_col_int_seq \l_tmpa_tl
+ \int_gset:Nn \g__witharrows_static_col_int \l_tmpa_tl
+ }
+\cs_new_protected:Npn \__witharrows_cr:
+ {
+ \scan_stop:
+ \int_compare:nNnF \g__witharrows_col_int = \g__witharrows_static_col_int
+ { \__witharrows_error:n { omit~probably~used } }
+ \prg_replicate:nn { \l__witharrows_nb_cols_int - \g__witharrows_static_col_int } { & { } }
+ \group_align_safe_begin:
+ \peek_meaning_remove:NTF * \__witharrows_cr_i: \__witharrows_cr_i:
+ }
+\cs_new_protected:Npn \__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
+ {
+ &
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfcoordinate
+ { wa - \l__witharrows_prefix_str - \int_use:N \g__witharrows_line_int - v }
+ \pgfpointorigin
+ \endpgfpicture
+ }
+ \dim_compare:nNnT { #1 } < \c_zero_dim
+ { \__witharrows_error:n { option~of~cr~negative } }
+
+ \cr
+ \noalign
+ {
+ \dim_set:Nn \l_tmpa_dim { \dim_max:nn { #1 } \c_zero_dim }
+ \skip_vertical:N \l_tmpa_dim
+ \skip_vertical:N \l__witharrows_interline_skip
+ \scan_stop:
+ }
+ }
+\cs_new_protected:Npn \DispWithArrows
+ {
+ \group_begin:
+ \peek_meaning:NTF <
+ { \DispWithArrows_i }
+ { \DispWithArrows_i < \c_novalue_tl > }
+ }
+\cs_new_protected:Npn \DispWithArrows_i < #1 >
+ {
+ \peek_meaning:NTF [
+ { \DispWithArrows_ii < #1 > }
+ { \DispWithArrows_ii < #1 > [ ] }
+ }
+\cs_new_protected:Npn \DispWithArrows_ii < #1 > [ #2 ]
+ {
+ \bool_set_true:N \l__witharrows_in_DispWithArrows_bool
+ \str_clear_new:N \l__witharrows_type_env_str
+ \str_set:Nn \l__witharrows_type_env_str { DispWithArrows }
+ \exp_args:No \tl_if_novalue:nF { #1 } { \tl_set:Nn \l__witharrows_left_brace_tl { #1 } }
+ \__witharrows_pre_halign:n { #2 }
+ \tl_if_eq:NNF \l__witharrows_left_brace_tl \c_novalue_tl
+ {
+ \hbox_set:Nn \l_tmpa_box
+ {
+ \group_begin:
+ \dim_zero:N \nulldelimiterspace
+ \c_math_toggle_token
+ \left \l__witharrows_replace_left_brace_by_tl \vcenter to 1 cm { } \right.
+ \c_math_toggle_token
+ \group_end:
+ }
+ \dim_zero_new:N \l__witharrows_delim_wd_dim
+ \dim_set:Nn \l__witharrows_delim_wd_dim { \box_wd:N \l_tmpa_box }
+ \box_clear_new:N \l__witharrows_left_brace_box
+ \hbox_set:Nn \l__witharrows_left_brace_box
+ {
+ \group_begin:
+ \cs_set_eq:NN \label \__witharrows_old_label
+ \c_math_toggle_token
+ \bool_if:NT \l__witharrows_displaystyle_bool \displaystyle
+ \l__witharrows_left_brace_tl
+ { }
+ \c_math_toggle_token
+ \group_end:
+ }
+ }
+ \if_mode_math:
+ \__witharrows_fatal:n { DispWithArrows~in~math~mode }
+ \fi:
+ \dim_zero_new:N \linewidth
+ \dim_set_eq:NN \linewidth \displaywidth
+ \if_mode_vertical:
+ \nointerlineskip
+ \hbox_to_wd:nn { .6 \linewidth } { }
+ \fi:
+ \c_math_toggle_token \c_math_toggle_token
+ \dim_zero_new:N \l__witharrows_linewidth_dim
+ \dim_set_eq:NN \l__witharrows_linewidth_dim \displaywidth
+ \box_clear_new:N \l__witharrows_halign_box
+ \setbox \l__witharrows_halign_box \vtop \bgroup
+ \tabskip =
+ \bool_if:NTF \l__witharrows_fleqn_bool
+ \c_zero_skip
+ { 0 pt plus 1000 pt minus 1000 pt }
+ \spread at equation
+ \__witharrows_construct_halign:
+ \tabskip = 0 pt plus 1000 pt minus 1000 pt
+ &
+ $ ## $
+ \tabskip = \c_zero_skip
+ &&
+ \__witharrows_fatal:n { Too~much~columns~in~DispWithArrows }
+ \bool_if:nT \c_false_bool { ## }
+ \cr
+ }
+\cs_new_protected:Npn \endDispWithArrows
+ {
+ \\
+ \egroup
+ \unskip \unpenalty \unskip \unpenalty
+ \box_set_to_last:N \l_tmpa_box
+ \nointerlineskip
+ \box_use:N \l_tmpa_box
+ \dim_gzero_new:N \g__witharrows_alignment_dim
+ \dim_gset:Nn \g__witharrows_alignment_dim { \box_wd:N \l_tmpa_box }
+ \box_clear_new:N \l__witharrows_new_box
+ \hbox_set:Nn \l__witharrows_new_box { \hbox_unpack_drop:N \l_tmpa_box }
+ \dim_compare:nNnT
+ { \box_wd:N \l__witharrows_new_box } < \g__witharrows_alignment_dim
+ { \dim_gset:Nn \g__witharrows_alignment_dim { \box_wd:N \l__witharrows_new_box } }
+ \egroup
+ \tl_if_eq:NNTF \l__witharrows_left_brace_tl \c_novalue_tl
+ { \box_use_drop:N \l__witharrows_halign_box }
+ {
+ \hbox_to_wd:nn \l__witharrows_linewidth_dim
+ {
+ \bool_if:NTF \l__witharrows_fleqn_bool
+ { \skip_horizontal:N \l__witharrows_mathindent_skip }
+ \hfil
+ \hbox_to_wd:nn \g__witharrows_alignment_dim
+ {
+ \box_use_drop:N \l__witharrows_left_brace_box
+ \dim_set:Nn \l_tmpa_dim
+ {
+ \box_ht:N \l__witharrows_halign_box
+ + \box_dp:N \l__witharrows_halign_box
+ }
+ \group_begin:
+ \dim_zero:N \nulldelimiterspace
+ \c_math_toggle_token
+ \left \l__witharrows_replace_left_brace_by_tl
+ \vcenter to \l_tmpa_dim { \vfil }
+ \right.
+ \c_math_toggle_token
+ \group_end:
+ \hfil
+ }
+ \hfil
+ }
+ \skip_horizontal:N -\l__witharrows_linewidth_dim
+ \vcenter { \box_use_drop:N \l__witharrows_halign_box }
+ }
+ \dim_gzero_new:N \g__witharrows_right_x_dim
+ \dim_gset_eq:NN \g__witharrows_right_x_dim \c_max_dim
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \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_fatal:n { Inexistent~v-node } }
+ {
+ \pgfpointanchor
+ { wa - \l__witharrows_prefix_str - \l_tmpa_int - v }
+ { center }
+ \dim_compare:nNnT \pgf at x < \g__witharrows_right_x_dim
+ { \dim_gset_eq:NN \g__witharrows_right_x_dim \pgf at x }
+ }
+ }
+ \endpgfpicture
+ \__witharrows_post_halign:
+ \c_math_toggle_token \c_math_toggle_token
+ \group_end:
+ }
+\cs_new_protected:Npn \__witharrows_if_in_last_col_of_disp:Nn #1 #2
+ {
+ \bool_if:NTF \l__witharrows_in_WithArrows_bool
+ { \__witharrows_error:nn { Not~allowed~in~WithArrows } { #1 } }
+ {
+ \int_compare:nNnTF \g__witharrows_col_int < \l__witharrows_nb_cols_int
+ { \__witharrows_error:nn { Not~allowed~in~DispWithArrows } { #1 } }
+ { #2 }
+ }
+ }
+\cs_new_protected:Npn \__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:Npn \__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_seq
+ \seq_clear_new:N \l__witharrows_last_arrows_seq
+ \bool_set_true:N \l__witharrows_new_group_bool
+ \int_set:Nn \l__witharrows_arrow_int 1
+ \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
+ {
+ \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
+ { \__witharrows_error:n { Too~few~lines~for~an~arrow } }
+ }
+ \__witharrows_treat_an_arrow_in_scan:
+ \int_incr:N \l__witharrows_arrow_int
+ }
+ \bool_if:nT
+ {
+ ! \int_compare_p:nNn \l__witharrows_pos_arrow_int = 7
+ &&
+ \int_compare_p:nNn \l__witharrows_first_arrow_of_group_int > 0
+ }
+ { \__witharrows_draw_arrows:nn \l__witharrows_first_arrow_of_group_int \g__witharrows_arrow_int }
+ }
+\cs_new_protected:Npn \__witharrows_treat_an_arrow_in_scan:
+ {
+ \bool_lazy_and:nnT
+ { \int_compare_p:nNn \l__witharrows_arrow_int > 1 }
+ {
+ \bool_lazy_or_p:nn
+ {
+ \bool_lazy_and_p:nn
+ {
+ \int_compare_p:nNn
+ \l__witharrows_initial_int > \l__witharrows_last_line_of_group_int
+ }
+ { \bool_not_p:n { \int_compare_p:nNn \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 = \c_zero_int
+ {
+ \__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_seq
+ \seq_put_left:NV \l__witharrows_first_arrows_seq \l__witharrows_arrow_int
+ \seq_clear:N \l__witharrows_last_arrows_seq
+ \seq_put_left:NV \l__witharrows_last_arrows_seq \l__witharrows_arrow_int
+ \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
+ { \dim_set:Nn \l__witharrows_x_dim { - \c_max_dim } }
+ }
+ {
+ \str_if_eq:VnF \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_seq \l__witharrows_arrow_int }
+ \int_compare:nNnTF \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_seq
+ \seq_put_left:NV \l__witharrows_last_arrows_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_seq \l__witharrows_arrow_int }
+ }
+ }
+ }
+ \str_if_eq:VnF \l__witharrows_status_arrow_str { independent }
+ {
+ \int_compare:nNnF \l__witharrows_pos_arrow_int = 8
+ { \__witharrows_update_x:nn \l__witharrows_initial_int \l__witharrows_final_int }
+ }
+ }
+\cs_generate_variant:Nn \keys_set:nn { n o }
+\cs_new_protected:Npn \__witharrows_keys_set:
+ { \keys_set_known:no { WithArrows / Arrow / SecondPass } }
+\cs_new_protected:Npn \__witharrows_draw_arrows:nn #1 #2
+ {
+ \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
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+ { status } \l__witharrows_status_arrow_str
+ \int_compare:nNnF \l__witharrows_final_int > \g__witharrows_line_int
+ {
+ \str_if_eq:VnTF \l__witharrows_status_arrow_str { over }
+ { \seq_put_right:NV \l__witharrows_o_arrows_seq \l__witharrows_arrow_int }
+ \__witharrows_draw_arrow:
+ }
+ \int_incr:N \l__witharrows_arrow_int
+ }
+ \__witharrows_draw_o_arrows_of_the_group:
+ \group_end:
+ }
+\cs_new_protected:Npn \__witharrows_draw_arrow:
+ {
+ \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 }
+ \tl_set:Nx \l__witharrows_final_tl
+ { \int_use:N \l__witharrows_final_int - \bool_if:NTF \l__witharrows_final_r_bool rl }
+ \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_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_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
+ }
+ \dim_gzero_new:N \g__witharrows_x_initial_dim
+ \dim_gzero_new:N \g__witharrows_x_final_dim
+ \dim_gzero_new:N \g__witharrows_y_initial_dim
+ \dim_gzero_new:N \g__witharrows_y_final_dim
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - \l__witharrows_initial_tl } { south }
+ \dim_gset:Nn \g__witharrows_x_initial_dim \pgf at x
+ \dim_gset:Nn \g__witharrows_y_initial_dim \pgf at y
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - \l__witharrows_final_tl } { north }
+ \dim_gset:Nn \g__witharrows_x_final_dim \pgf at x
+ \dim_gset:Nn \g__witharrows_y_final_dim \pgf at y
+ \endpgfpicture
+ \bool_lazy_and:nnTF
+ {
+ \dim_compare_p:nNn { \g__witharrows_y_initial_dim - \g__witharrows_y_final_dim }
+ > \l__witharrows_max_length_of_arrow_dim
+ }
+ { \int_compare_p:nNn { \l__witharrows_final_int - \l__witharrows_initial_int } = 1 }
+ {
+ \tl_gset:Nx \g_tmpa_tl
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+ { \dim_use:N \g__witharrows_x_initial_dim }
+ { \dim_use:N \l__witharrows_x_dim } ,
+ \dim_eval:n
+ {
+ ( \g__witharrows_y_initial_dim + \g__witharrows_y_final_dim ) / 2
+ + 0.5 \l__witharrows_max_length_of_arrow_dim
+ }
+ }
+ \tl_gset:Nx \g_tmpb_tl
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+ { \dim_use:N \g__witharrows_x_final_dim }
+ { \dim_use:N \l__witharrows_x_dim } ,
+ \dim_eval:n
+ {
+ ( \g__witharrows_y_initial_dim + \g__witharrows_y_final_dim ) / 2
+ - 0.5 \l__witharrows_max_length_of_arrow_dim
+ }
+ }
+ }
+ {
+ \tl_gset:Nx \g_tmpa_tl
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+ { \dim_use:N \g__witharrows_x_initial_dim }
+ { \dim_use:N \l__witharrows_x_dim } ,
+ \bool_if:NTF \l_tmpa_bool
+ { \dim_eval:n { \g__witharrows_y_initial_dim + \l__witharrows_start_adjust_dim } }
+ { \dim_use:N \g__witharrows_y_initial_dim }
+ }
+ \tl_gset:Nx \g_tmpb_tl
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+ { \dim_use:N \g__witharrows_x_final_dim }
+ { \dim_use:N \l__witharrows_x_dim } ,
+ \bool_if:NTF \l_tmpb_bool
+ { \dim_eval:n { \g__witharrows_y_final_dim - \l__witharrows_end_adjust_dim } }
+ { \dim_use:N \g__witharrows_y_final_dim }
+ }
+ }
+ \bool_if:NF \l__witharrows_right_overlap_bool
+ {
+ \bool_if:NT \l__witharrows_in_WithArrows_bool
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - 1 - r } { south }
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int < 5
+ {
+ \dim_set:Nn \l__witharrows_delta_x_dim
+ {
+ \pgf at x -
+ ( \dim_min:nn \g__witharrows_x_initial_dim \g__witharrows_x_final_dim )
+ }
+ }
+ { \dim_set:Nn \l__witharrows_delta_x_dim { \pgf at x - \l__witharrows_x_dim } }
+ \endpgfpicture
+ }
+ }
+ \__witharrows_draw_arrow:nno \g_tmpa_tl \g_tmpb_tl \l_tmpa_tl
+ \group_end:
+ }
+\cs_new_protected:Npn \__witharrows_def_function_tmpa:n #1
+ {
+ \cs_set:Npn \__witharrows_tmpa:nnn ##1 ##2 ##3
+ {
+ \tikzpicture
+ [ __witharrows_standard_arrow ]
+ \pgf at relevantforpicturesizetrue
+ #1
+ \dim_compare:nNnTF \pgf at picminx = { 16000 pt }
+ { \dim_zero:N \l_tmpa_dim }
+ { \dim_set:Nn \l_tmpa_dim { \pgf at picmaxx - \pgf at picminx } }
+ \dim_add:Nn \l_tmpa_dim \l__witharrows_xoffset_dim
+ \prop_gput:cnV
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ \int_use:N \l__witharrows_arrow_int _ prop }
+ { width }
+ \l_tmpa_dim
+ \bool_if:NF \l__witharrows_right_overlap_bool
+ {
+ \bool_if:NT \l__witharrows_in_WithArrows_bool
+ {
+ \dim_gset:Nn \g__witharrows_overlap_x_dim
+ {
+ \dim_max:nn
+ \g__witharrows_overlap_x_dim
+ { \l_tmpa_dim - \l__witharrows_delta_x_dim }
+ }
+ }
+ }
+ \pgfresetboundingbox
+ \endtikzpicture
+ }
+ }
+\cs_new_protected:Npn \__witharrows_draw_arrow:nnn #1 #2 #3
+ {
+ \bool_lazy_and:nnT \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
+ {
+ \pgfset { inner~sep = 0pt}
+ \draw ( #1 ) to node ( __witharrows_label ) { } ( #2 ) ;
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - __witharrows_label } { west }
+ \dim_set:Nn \l_tmpa_dim { \g__witharrows_right_x_dim - \pgf at x - 0.3333 ex }
+ \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at 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:Npn \__witharrows_update_x:nn #1 #2
+ {
+ \dim_gset_eq:NN \g_tmpa_dim \l__witharrows_x_dim
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \int_step_inline:nnn { #1 } { #2 }
+ {
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - ##1 - l } { center }
+ \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \g_tmpa_dim \pgf at x }
+ }
+ \endpgfpicture
+ \dim_set_eq:NN \l__witharrows_x_dim \g_tmpa_dim
+ }
+\cs_new_protected:Npn \__witharrows_draw_o_arrows_of_the_group:
+ {
+ \seq_sort:Nn \l__witharrows_o_arrows_seq
+ {
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ prop }
+ { final } \l_tmpa_tl
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##2 _ prop }
+ { final } \l_tmpb_tl
+ \int_compare:nNnTF \l_tmpa_tl < \l_tmpb_tl
+ \sort_return_same:
+ {
+ \int_compare:nNnTF \l_tmpa_tl > \l_tmpb_tl
+ \sort_return_swapped:
+ {
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ prop }
+ { initial } \l_tmpa_tl
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##2 _ prop }
+ { initial } \l_tmpb_tl
+ \int_compare:nNnTF \l_tmpa_tl < \l_tmpb_tl
+ \sort_return_swapped:
+ \sort_return_same:
+ }
+ }
+ }
+ \seq_map_inline:Nn \l__witharrows_o_arrows_seq
+ {
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ##1 _ 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 _ ##1 _ 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 _ ##1 _ prop }
+ { input-line } \l__witharrows_input_line_str
+ \dim_gzero:N \g_tmpa_dim
+ \bool_set_false:N \g_tmpa_bool
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \int_step_inline:nnn \l__witharrows_first_arrow_int \l__witharrows_last_arrow_int
+ {
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
+ { initial } \l_tmpa_tl
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
+ { final } \l_tmpb_tl
+ \prop_get:cnN
+ { g__witharrows_arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
+ { status } \l__witharrows_status_arrow_str
+ \bool_if:nT
+ {
+ ! \int_compare_p:n { ##1 = ####1 }
+ && \int_compare_p:n { \l__witharrows_initial_int <= \l_tmpa_tl }
+ && \int_compare_p:n { \l_tmpb_tl <= \l__witharrows_final_int }
+ && ! \str_if_eq_p:Vn \l__witharrows_status_arrow_str { independent }
+ }
+ {
+ \bool_gset_true:N \g_tmpa_bool
+ \prop_get:cnN
+ { g__witharrows _ arrow _ \l__witharrows_prefix_str _ ####1 _ prop }
+ { width }
+ \l_tmpa_tl
+ \dim_gset:Nn \g_tmpa_dim { \dim_max:nn \g_tmpa_dim \l_tmpa_tl }
+ }
+ }
+ \endpgfpicture
+ \bool_if:NTF \g_tmpa_bool
+ {
+ \int_set:Nn \l__witharrows_arrow_int { ##1 }
+ \dim_set_eq:NN \l__witharrows_xoffset_dim \g_tmpa_dim
+ \dim_add:Nn \l__witharrows_xoffset_dim \l__witharrows_xoffset_for_o_arrows_dim
+ \__witharrows_draw_arrow:
+ }
+ { \__witharrows_error:n { o~arrow~with~no~arrow~under } }
+ }
+ }
+\cs_new:Npn \WithArrowsLastEnv { \int_use:N \g__witharrows_last_env_int }
+\keys_define:nn { WithArrows / Arrow / code-after }
+ {
+ tikz .code:n =
+ \tikzset { WithArrows / arrow / .append~style = { #1 } } ,
+ tikz .value_required:n = true ,
+ rr .value_forbidden:n = true ,
+ rr .code:n = \__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 ,
+ tikz-code .tl_set:N = \l__witharrows_tikz_code_tl ,
+ tikz-code .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_code_after_seq
+ \__witharrows_error:n { Unknown~option~Arrow~in~code-after }
+ }
+\seq_new:N \l__witharrows_options_Arrow_code_after_seq
+\__witharrows_set_seq_of_str_from_clist:Nn \l__witharrows_options_Arrow_code_after_seq
+ { ll, lr, rl, rr, tikz, tikz-code, v, x, offset }
+\cs_new_protected:Npn \__witharrows_Arrow_code_after
+ {
+ \peek_meaning:NTF [
+ { \__witharrows_Arrow_code_after_i }
+ { \__witharrows_Arrow_code_after_i [ ] }
+ }
+\cs_new_protected:Npn \__witharrows_Arrow_code_after_i [ #1 ] #2 #3 #4
+ {
+ \peek_meaning:NTF [
+ { \__witharrows_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } }
+ { \__witharrows_Arrow_code_after_ii [ #1 ] { #2 } { #3 } { #4 } [ ] }
+ }
+\cs_new_protected:Npn \__witharrows_Arrow_code_after_ii [ #1 ] #2 #3 #4 [ #5 ]
+ {
+ \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 / code-after }
+ { #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 at sh@ns at wa - \l__witharrows_prefix_str - #2 - l }
+ { \__witharrows_error:nx { Wrong~line~in~Arrow } { #2 } }
+ {
+ \cs_if_free:cTF { pgf at sh@ns at wa - \l__witharrows_prefix_str - #3 - l }
+ { \__witharrows_error:nx { Wrong~line~in~Arrow } { #3 } }
+ {
+ \int_compare:nNnTF \l__witharrows_pos_arrow_int = 4
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - #2 - l }
+ { south }
+ \dim_set_eq:NN \l_tmpa_dim \pgf at x
+ \dim_set_eq:NN \l_tmpb_dim \pgf at y
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - #3 - l }
+ { north }
+ \dim_set:Nn \l_tmpa_dim
+ { \dim_max:nn \l_tmpa_dim \pgf at 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 at y }
+ \endpgfpicture
+ }
+ {
+ \pgfpicture
+ \pgfrememberpicturepositiononpagetrue
+ \pgfpointanchor
+ {
+ wa - \l__witharrows_prefix_str -
+ #2 - \bool_if:NTF \l__witharrows_initial_r_bool r l
+ }
+ { south }
+ \tl_gset:Nx \g_tmpa_tl
+ { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+ \pgfpointanchor
+ {
+ wa - \l__witharrows_prefix_str -
+ #3 - \bool_if:NTF \l__witharrows_final_r_bool r l
+ }
+ { north }
+ \tl_gset:Nx \g_tmpb_tl
+ { \dim_use:N \pgf at x , \dim_use:N \pgf at y }
+ \endpgfpicture
+ }
+ \__witharrows_draw_arrow:nnn \g_tmpa_tl \g_tmpb_tl { #4 }
+ }
+ }
+ }
+ \group_end:
+ }
+\cs_new_protected:Npn \__witharrows_MultiArrow:nn #1 #2
+ {
+ \exp_args:Nnx
+ \regex_match:nnTF
+ { \A \d+ (\,\d+)* ( \, \.\.\. (\,\d+)+ )* \Z }
+ { #1 }
+ { \__witharrows_MultiArrow_i:nn { #1 } { #2 } }
+ { \__witharrows_error:nx { Invalid~specification~for~MultiArrow } { #1 } }
+ }
+\cs_new_protected:Npn \__witharrows_MultiArrow_i:nn #1 #2
+ {
+ \foreach \x in { #1 }
+ {
+ \cs_if_free:cTF { pgf at sh@ns at 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
+ \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) ;
+ \pgfpointanchor { wa - \l__witharrows_prefix_str - __witharrows_label } { west }
+ \dim_set:Nn \l_tmpa_dim { 20 cm }
+ \path \pgfextra { \tl_gset:Nx \g_tmpa_tl \tikz at text@width } ;
+ \tl_if_empty:NF \g_tmpa_tl { \dim_set:Nn \l_tmpa_dim \g_tmpa_tl }
+ \bool_lazy_and:nnT \l__witharrows_wrap_lines_bool \l__witharrows_in_DispWithArrows_bool
+ {
+ \dim_set:Nn \l_tmpb_dim
+ { \g__witharrows_right_x_dim - \pgf at 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 } ;
+ \endtikzpicture
+ }
+ }
+\cs_new_protected:Npn \__witharrows_MultiArrow_i:n #1
+ {
+ \tikzpicture
+ [
+ __witharrows_standard ,
+ every~path / .style = { WithArrows / arrow }
+ ]
+ \foreach \k in { #1 }
+ {
+ \draw [ <- ]
+ ( [xshift = \l__witharrows_xoffset_dim]\k-r.south ) -- ++(5mm,0) ;
+ } % ;
+ \endtikzpicture
+ }
+\bool_if:NTF \c__witharrows_messages_for_Overleaf_bool
+ { \str_const:Nn \c__witharrows_available_keys_str { } }
+ {
+ \str_const:Nn \c__witharrows_available_keys_str
+ { For~a~list~of~the~available~keys,~type~H~<return>. }
+ }
+\str_new:N \l_witharrows_body_str
+\cs_new:Npn \__witharrows_potential_body_i:
+ {
+ \str_if_empty:NF \l_witharrows_body_str
+ { \\ If~you~want~to~see~the~body~of~the~environment,~type~H~<return>. }
+ }
+\cs_new:Npn \__witharrows_potential_body_ii:
+ {
+ \str_if_empty:NTF \l_witharrows_body_str
+ { No~further~help~available }
+ {
+ The~body~of~your~environment~was:\\
+ \l_witharrows_body_str
+ }
+ }
+\str_const:Nn \c__witharrows_option_ignored_str
+ { If~you~go~on,~this~option~will~be~ignored. }
+\str_const:Nn \c__witharrows_command_ignored_str
+ { If~you~go~on,~this~command~will~be~ignored. }
+\__witharrows_msg_new:nn { Bad~value~for~replace~brace~by }
+ {
+ Incorrect~value.\\
+ Bad~value~for~the~option~'\l_keys_key_str'.~The~value~must~begin~
+ with~an~extensible~left~delimiter.~The~possible~values~are:~.,
+ \token_to_str:N \{,~(,~[,~\token_to_str:N \lbrace,~
+ \token_to_str:N \lbrack,~\token_to_str:N \lgroup,~
+ \token_to_str:N \langle,~\token_to_str:N \lmoustache,~
+ \token_to_str:N \lfloor\ and~\token_to_str:N \lceil\
+ (and~\token_to_str:N \lvert\ and~\token_to_str:N \lVert\
+ if~amsmath~or~unicode-math~is~loaded~in~LaTeX).\\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { option~of~cr~negative }
+ {
+ Bad~value.\\
+ The~argument~of~the~command~\token_to_str:N\\~
+ should~be~positive~in~the~row~\int_use:N \g__witharrows_line_int\
+ of~your~environment~\{\l__witharrows_type_env_str\}.\\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { omit~probably~used }
+ {
+ Strange~problem.\\
+ Maybe~you~have~used~a~command~
+ \token_to_str:N\omit\ in~the~line~\int_use:N \g__witharrows_line_int\
+ (or~another~line)~of~your~environment~\{\l__witharrows_type_env_str\}.\\
+ You~can~go~on~but~you~may~have~others~errors.
+ }
+\__witharrows_msg_new:nnn { Invalid~option~format }
+ {
+ Invalide~value.\\
+ The~key~'format'~should~contain~only~letters~r,~c~and~l~and~
+ must~not~be~empty.\\
+ \c__witharrows_option_ignored_str
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nnn { invalid~key~o }
+ {
+ Invalid~use~of~a~key.\\
+ The~key~'o'~for~individual~arrows~can~be~used~only~in~mode~
+ 'group'~or~in~mode~'groups'.\\
+ \c__witharrows_option_ignored_str
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nnn { Value~for~a~key }
+ {
+ Misuse~of~a~key.\\
+ The~key~'\l_keys_key_str'~should~be~used~without~value. \\
+ However,~you~can~go~on~for~this~time.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nnn { Unknown~option~in~Arrow }
+ {
+ Unknown~option.\\
+ The~key~'\l_keys_key_str'~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\}. \l_tmpa_str \\
+ \c__witharrows_option_ignored_str \\
+ \c__witharrows_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ \seq_use:Nnnn \l__witharrows_options_Arrow_seq {~and~} {,~} {~and~}.
+ }
+\__witharrows_msg_new:nnn { Unknown~option~WithArrows }
+ {
+ Unknown~option.\\
+ The~key~'\l_keys_key_str'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
+ \c__witharrows_option_ignored_str \\
+ \c__witharrows_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ \seq_use:Nnnn \l__witharrows_options_WithArrows_seq {~and~} {,~} {~and~}.
+ }
+\__witharrows_msg_new:nnn { Unknown~option~DispWithArrows }
+ {
+ Unknown~option.\\
+ The~key~'\l_keys_key_str'~is~unknown~in~\{\l__witharrows_type_env_str\}. \\
+ \c__witharrows_option_ignored_str \\
+ \c__witharrows_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ \seq_use:Nnnn \l__witharrows_options_DispWithArrows_seq {~and~} {,~} {~and~}.
+ }
+\__witharrows_msg_new:nnn { Unknown~option~WithArrowsOptions }
+ {
+ Unknown~option.\\
+ The~key~'\l_keys_key_str'~is~unknown~in~
+ \token_to_str:N \WithArrowsOptions. \\
+ \c__witharrows_option_ignored_str \\
+ \c__witharrows_available_keys_str
+ }
+ {
+ 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~code-after }
+ {
+ Unknown~option.\\
+ The~key~'\l_keys_key_str'~is~unknown~in~
+ \token_to_str:N \Arrow\ in~code-after. \\
+ \c__witharrows_option_ignored_str \\
+ \c__witharrows_available_keys_str
+ }
+ {
+ The~available~keys~are~(in~alphabetic~order):~
+ \seq_use:Nnnn \l__witharrows_options_Arrow_code_after_seq {~and~} {,~} {~and~}.
+ }
+\__witharrows_msg_new:nnn { Too~much~columns~in~WithArrows }
+ {
+ Too~much~columns.\\
+ Your~environment~\{\l__witharrows_type_env_str\}~has~\int_use:N
+ \l__witharrows_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+ Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str.~
+ If~you~really~want~to~use~more~columns~(after~the~arrows)~you~should~use~
+ the~option~'more-columns'~at~a~global~level~or~for~an~environment. \\
+ However,~you~can~go~one~for~this~time.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nnn { Too~much~columns~in~DispWithArrows }
+ {
+ Too~much~columns.\\
+ Your~environment~\{\l__witharrows_type_env_str\}~has~\int_use:N
+ \l__witharrows_nb_cols_int\ columns~and~you~try~to~use~one~more.~
+ Maybe~you~have~forgotten~a~\c_backslash_str\c_backslash_str\
+ at~the~end~of~row~\int_use:N \g__witharrows_line_int. \\
+ This~error~is~fatal.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nn { Negative~jump }
+ {
+ Incorrect~value.\\
+ 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 }
+ {
+ Misuse~of~a~key.\\
+ 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:nnn
+ { Too~few~lines~for~an~arrow }
+ {
+ Impossible~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_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nn { o~arrow~with~no~arrow~under }
+ {
+ Problem~with~the~key~'o'.\\
+ Line~\l__witharrows_input_line_str\
+ :~there~is~no~arrow~'under'~your~arrow~of~type~'o'.\\
+ If~you~go~on,~this~arrow~won't~be~drawn.
+ }
+\__witharrows_msg_new:nnn { WithArrows~outside~math~mode }
+ {
+ You~are~outside~math~mode.\\
+ The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~in~math~mode~
+ like~the~environment~\{aligned\}~of~amsmath. \\
+ Nevertheless,~you~can~go~on.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nnn { DispWithArrows~in~math~mode }
+ {
+ You~are~in~math~mode.\\
+ The~environment~\{\l__witharrows_type_env_str\}~should~be~used~only~outside~math~
+ mode~like~the~environments~\{align\}~and~\{align*\}~of~amsmath. \\
+ This~error~is~fatal.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nn { Incompatible~options~in~Arrow }
+ {
+ Incompatible~options.\\
+ You~try~to~use~the~option~'\l_keys_key_str'~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 a}
+ {
+ Incompatible~options.\\
+ You~try~to~use~the~option~'\l_keys_key_str'~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_code_after_bool
+ {
+ \l__witharrows_string_Arrow_for_msg_str\
+ in~the~code-after~of~your~environment~\{\l__witharrows_type_env_str\}
+ }. \\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nnn { Arrow~not~in~last~column }
+ {
+ Bad~use~of~\l__witharrows_string_Arrow_for_msg_str.\\
+ You~should~use~the~command~\l__witharrows_string_Arrow_for_msg_str\
+ only~in~the~last~column~(column~\int_use:N\l__witharrows_nb_cols_int)~
+ in~the~row~\int_use:N \g__witharrows_line_int\
+ of~your~environment~\{\l__witharrows_type_env_str\}.\\
+ However~you~can~go~on~for~this~time.
+ \__witharrows_potential_body_i:
+ }
+ { \__witharrows_potential_body_ii: }
+\__witharrows_msg_new:nn { Wrong~line~in~Arrow }
+ {
+ Wrong~line.\\
+ The~specification~of~line~'#1'~you~use~in~the~command~
+ \l__witharrows_string_Arrow_for_msg_str\
+ in~the~'code-after'~of~\{\l__witharrows_type_env_str\}~doesn't~exist. \\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { Both~lines~are~equal }
+ {
+ Both~lines~are~equal.\\
+ In~the~'code-after'~of~\{\l__witharrows_type_env_str\}~you~try~to~
+ draw~an~arrow~going~to~itself~from~the~line~'#1'.~This~is~not~possible. \\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { Wrong~line~specification~in~MultiArrow }
+ {
+ Wrong~line~specification.\\
+ 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 }
+ {
+ Too~small~specification.\\
+ The~specification~of~lines~you~gave~to~\token_to_str:N \MultiArrow\
+ is~too~small:~you~need~at~least~two~lines. \\
+ \c__witharrows_command_ignored_str
+ }
+\__witharrows_msg_new:nn { Not~allowed~in~DispWithArrows }
+ {
+ Forbidden~command.\\
+ The~command~\token_to_str:N #1
+ is~allowed~only~in~the~last~column~
+ (column~\int_use:N\l__witharrows_nb_cols_int)~of~\{\l__witharrows_type_env_str\}. \\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nn { Not~allowed~in~WithArrows }
+ {
+ Forbidden~command.\\
+ The~command~\token_to_str:N #1 is~not~allowed~in~\{\l__witharrows_type_env_str\}~
+ (it's~allowed~in~the~last~column~of~\{DispWithArrows\}). \\
+ \c__witharrows_option_ignored_str
+ }
+\__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~\l_tmpa_int\
+ of~your~environment~\{\l__witharrows_type_env_str\}. \\
+ This~error~is~fatal.
+ }
+\__witharrows_msg_new:nn { Option~xoffset~forbidden }
+ {
+ Incorrect~key.\\
+ You~can't~use~the~option~'xoffset'~in~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\}~
+ because~you~are~using~the~option~
+ ' \int_compare:nNnTF \l__witharrows_pos_arrow_int = 7
+ { group }
+ { groups } '.~It's~possible~for~an~independent~arrow~or~if~there~is~
+ only~one~arrow. \\
+ \c__witharrows_option_ignored_str
+ }
+\__witharrows_msg_new:nnn { Duplicate~name }
+ {
+ Duplicate~name.\\
+ The~name~'\l_keys_value_tl'~is~already~used~and~you~shouldn't~use~
+ the~same~environment~name~twice.~You~can~go~on,~but,~
+ maybe,~you~will~have~incorrect~results. \\
+ For~a~list~of~the~names~already~used,~type~H~<return>. \\
+ If~you~don't~want~to~see~this~message~again,~use~the~option~
+ 'allow-duplicate-names'.
+ }
+ {
+ The~names~already~defined~in~this~document~are:~
+ \seq_use:Nnnn \g__witharrows_names_seq { ,~ } { ,~ } { ~and~ }.
+ }
+\__witharrows_msg_new:nn { Invalid~specification~for~MultiArrow }
+ {
+ Invalid~specification.\\
+ The~specification~of~rows~for~\token_to_str:N\MultiArrow\
+ (i.e.~#1)~is~invalid. \\
+ \c__witharrows_command_ignored_str
+ }
+\cs_new_protected:Npn \WithArrowsNewStyle #1 #2
+ {
+ \keys_if_exist:nnTF { WithArrows / Global } { #1 }
+ { \__witharrows_error:nn { Key~already~defined } { #1 } }
+ {
+ \seq_clear:N \l_tmpa_seq
+ \keyval_parse:NNn \__witharrows_valid_key:n \__witharrows_valid_key:nn { #2 }
+ \seq_if_empty:NTF \l_tmpa_seq
+ {
+ \seq_put_right:Nx \l__witharrows_options_WithArrows_seq
+ { \tl_to_str:n { #1 } }
+ \seq_put_right:Nx \l__witharrows_options_DispWithArrows_seq
+ { \tl_to_str:n { #1 } }
+ \seq_put_right:Nx \l__witharrows_options_WithArrowsOptions_seq
+ { \tl_to_str:N { #1 } }
+ \cs_if_exist:NTF \keys_precompile:nnN
+ {
+ \keys_precompile:nnN
+ { WithArrows / WithArrowsOptions }
+ { #2 }
+ \l_tmpa_tl
+ \__witharrows_key_define:nV { #1 } \l_tmpa_tl
+ }
+ {
+ \keys_define:nn { WithArrows / Global }
+ {
+ #1 .code:n =
+ { \keys_set:nn { WithArrows / WithArrowsOptions } { #2 } }
+ }
+ }
+ }
+ { \__witharrows_error:nn { Impossible~style } { #1 } }
+ }
+ }
+\__witharrows_msg_new:nn { Impossible~style }
+ {
+ Impossible~style.\\
+ It's~impossible~to~define~the~style~'#1'~
+ because~it~contains~unknown~keys:~'
+ \seq_use:Nnnn \l_tmpa_seq { '~and~' } { ',~'} { ',~and~}'.
+ }
+\cs_new_protected:Npn \__witharrows_valid_key:n #1
+ {
+ \keys_if_exist:nnF { WithArrows / Global } { #1 }
+ { \seq_put_right:Nn \l_tmpa_seq { #1 } }
+ }
+\cs_new_protected:Npn \__witharrows_valid_key:nn #1 #2
+ {
+ \keys_if_exist:nnF { WithArrows / Global } { #1 }
+ { \seq_put_right:Nn \l_tmpa_seq { #1 } }
+ }
+\cs_new_protected:Npn \__witharrows_key_define:nn #1 #2
+ { \keys_define:nn { WithArrows / Global } { #1 .code:n = #2 } }
+\cs_generate_variant:Nn \__witharrows_key_define:nn { n V }
+\__witharrows_msg_new:nn { Key~already~defined }
+ {
+ Key~already~define.\\
+ The~key~'#1'~is~already~defined. \\
+ If~you~go~on,~your~instruction~\token_to_str:N\WithArrowsNewStyle\
+ will~be~ignored.
+ }
+\keys_define:nn { WithArrows / up-and-down }
+ {
+ radius .dim_set:N = \l__witharrows_up_and_down_radius_dim ,
+ radius .value_required:n = true ,
+ width .code:n =
+ \str_case:nnF { #1 }
+ {
+ { min } { \dim_zero:N \l__witharrows_arrow_width_dim }
+ { max } { \dim_set_eq:NN \l__witharrows_arrow_width_dim \c_max_dim }
+ }
+ { \dim_set:Nn \l__witharrows_arrow_width_dim { #1 } } ,
+ width .value_required:n = true ,
+ unknown .code:n = \__witharrows_error:n { Option~unknown~for~up-and-down }
+ }
+\__witharrows_msg_new:nn { Option~unknown~for~up-and-down }
+ {
+ Unknown~option.\\
+ The~option~'\l_keys_key_str'~is~unknown.~\c__witharrows_option_ignored_str
+ }
+\tl_const:Nn \c__witharrows_tikz_code_up_tl
+ {
+ \dim_case:nnF \l__witharrows_arrow_width_dim
+ {
+ \c_max_dim
+ {
+ \draw [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\p1) -- node { #3 } (\x2,\y1) -- (\p2) ;
+ }
+ \c_zero_dim
+ {
+ \path node
+ {
+ \hbox_gset:Nn \g_tmpa_box { #3 }
+ \dim_gset:Nn \g_tmpa_dim
+ { \box_wd:N \g_tmpa_box + \l__witharrows_up_and_down_radius_dim }
+ } ;
+ \draw
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\x2-\g_tmpa_dim,\y1)
+ -- node { \box_use:N \g_tmpa_box }
+ (\x2-\l__witharrows_up_and_down_radius_dim,\y1)
+ [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
+ -| (\p2) ;
+ }
+ }
+ {
+ \draw
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\x2 - \l__witharrows_arrow_width_dim - \l__witharrows_up_and_down_radius_dim,\y1)
+ -- node { #3 } (\x2-\l__witharrows_up_and_down_radius_dim,\y1)
+ [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
+ -| (\p2) ;
+ }
+ }
+\tl_const:Nn \c__witharrows_tikz_code_down_tl
+ {
+ \dim_case:nnF \l__witharrows_arrow_width_dim
+ {
+ \c_max_dim
+ {
+ \draw [ rounded~corners = \l__witharrows_up_and_down_radius_dim ]
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\p1) -- (\x1,\y2) -- node { #3 } (\p2) ;
+ }
+ \c_zero_dim
+ {
+ \path node
+ {
+ \hbox_gset:Nn \g_tmpa_box { #3 }
+ \dim_gset:Nn \g_tmpa_dim
+ { \box_wd:N \g_tmpa_box + \l__witharrows_up_and_down_radius_dim }
+ } ;
+ \draw
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\p1)
+ { [ rounded~corners = \l__witharrows_up_and_down_radius_dim ] -- (\x1,\y2) }
+ -- (\x1-\l__witharrows_up_and_down_radius_dim,\y2)
+ -- node { \box_use:N \g_tmpa_box } (\x1-\g_tmpa_dim,\y2)
+ -- ++ (-2mm,0) ;
+ }
+ }
+ {
+ \draw
+ let \p1 = ( #1 ) , \p2 = ( #2 )
+ in (\p1)
+ { [ rounded~corners = \l__witharrows_up_and_down_radius_dim ] -- (\x1,\y2) }
+ -- (\x1-\l__witharrows_up_and_down_radius_dim,\y2)
+ -- node { #3 }
+ (\x1 - \l__witharrows_arrow_width_dim - \l__witharrows_up_and_down_radius_dim,\y2)
+ -- ++ (-2mm,0) ;
+ }
+ }
+\keys_define:nn { WithArrows / Arrow / FirstPass }
+ {
+ up .code:n = \__witharrows_set_independent_bis: ,
+ down .code:n = \__witharrows_set_independent_bis: ,
+ 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 }
+ \cs_if_exist:cTF { tikz at library@calc at loaded }
+ {
+ \keys_set:nV { WithArrows / up-and-down } \l_keys_value_tl
+ \int_set:Nn \l__witharrows_pos_arrow_int 1
+ \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 } }
+ } ,
+ down .code:n =
+ \str_if_empty:NT \l__witharrows_previous_key_str
+ {
+ \str_set:Nn \l__witharrows_previous_key_str { down }
+ \cs_if_exist:cTF { tikz at library@calc at loaded }
+ {
+ \keys_set:nV { WithArrows / up-and-down } \l_keys_value_tl
+ \int_set:Nn \l__witharrows_pos_arrow_int 1
+ \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 } }
+ }
+ }
+\seq_put_right:Nn \l__witharrows_options_Arrow_seq { down }
+\seq_put_right:Nn \l__witharrows_options_Arrow_seq { up }
+\__witharrows_msg_new:nn { calc~not~loaded }
+ {
+ calc~not~loaded.\\
+ You~can't~use~the~option~'\l_keys_key_str'~because~you~don't~have~loaded~the~
+ Tikz~library~'calc'.You~should~add~'\token_to_str:N\usetikzlibrary{calc}'~
+ ~in~the~preamble~of~your~document. \\
+ \c__witharrows_option_ignored_str
+ }
+\catcode `\@ = 12
+\ExplSyntaxOff
+\endinput
+%%
+%% End of file `witharrows.tex'.
Property changes on: trunk/Master/texmf-dist/tex/generic/witharrows/witharrows.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds 2024-02-19 21:35:59 UTC (rev 69994)
+++ trunk/Master/tlpkg/libexec/ctan2tds 2024-02-19 21:38:09 UTC (rev 69995)
@@ -2590,6 +2590,7 @@
'vruler', '^..[^s].*\.sty', # not miscdoc.sty
'wallcalendar','i18n|\.lua$|' . $standardtex,
'wasy', 'wasyfont\.tex',
+ 'witharrows', 'witharrows\.tex|' . $standardtex,
'wordcount', '\.tex',
'worldflags', 'worldflag_.*tex$|' . $standardtex,
'xcharter', '(-subs\.tex|\.fd|\.def|\.fontspec|\.sty)$', # not .py
More information about the tex-live-commits
mailing list.