diff --git a/packages/CrossRef.sty b/packages/CrossRef.sty index 1276b4f..86cdd39 100644 --- a/packages/CrossRef.sty +++ b/packages/CrossRef.sty @@ -29,7 +29,7 @@ \str_const:Nn \c_@@_label_delimiter_str {/} \str_const:Nn \c_@@_label_parent_str {.} -\str_const:Nn \c_@@_label_wildcard_str {~} +\str_const:Nn \c_@@_label_wildcard_str {*} \str_const:Nn \c_@@_appendices_label_str {appendices} \seq_new:N \g_@@_label_seq @@ -81,54 +81,26 @@ \seq_set_split:Nnn \g_@@_label_seq {#1} {#2} } -\RenewDocumentCommand{\Ref}{ +% MATCH delimiter, parent, and wildcard symbols, but CAPTURE only +% parents and wildcards, NOT delimiters. +\regex_const:Nn \c_@@_ref_regex {\/|(\.|\*)} %{\\\c_@@_label_delimiter_str|(\\\c_@@_label_parent_str|\\\c_@@_label_wildcard_str)} +%\regex_show:N \c_@@_ref_regex + +\seq_new:N \l_@@_label_seq +\seq_new:N \l_@@_ref_seq + +\str_new:N \l_@@_ref_str + +\NewDocumentCommand{\HiRef}{ % #1: Star (No star = include section name in reference, star = do not include). s - % #2: Label string delimiter (defaults to "/"). - O{\c_@@_label_delimiter_str} - % #3: Label Reference + % #2: Label Reference >{\TrimSpaces}m - % #4: Parent label symbol (defaults to "."). - O{\c_@@_label_parent_str} - % #5: Label wildcard symbol (defaults to "~"). - O{\c_@@_label_wildcard_str} }{ \group_begin: - % Put the parameters in string variables so we can work with them. - \str_const:Nn \c_@@_label_delimiter_str {#2} - \str_const:Nn \c_@@_label_parent_str {#4} - \str_const:Nn \c_@@_label_wildcard_str {#5} - \str_const:Ne \c_@@_regex_str { - % MATCH delimiter, parent, and wildcard symbols, but CAPTURE only - % parents and wildcards, NOT delimiters. - /|(\c_@@_label_parent_str|\c_@@_label_wildcard_str) - } - \seq_new:N \l_@@_label_seq - \seq_new:N \l_@@_ref_seq + %\str_set:Ne \l_@@_ref_str {#2} - \str_new:N \l_@@_ref_str - \str_set:Nn \l_@@_ref_str {#3} - - % Split the string on the delimiters. - \seq_set_regex_split:NNn \l_@@_ref_seq \c_@@_regex_str {\l_@@_ref_str} - - % Copy the current label sequence to a local variable. - \seq_set_eq:NN \l_@@_label_seq \g_@@_label_seq - - % Iterate through the reference sequence, removing one element from the - % end of the temporary label sequence for each parent symbol. - \seq_map_indexed_function:NN \l_@@_ref_seq \_seq_map:nn - - % % Add the shortened temporary label sequence to the beginning of the - % % reference sequence. - \seq_concat:NNN \l_@@_ref_seq \l_@@_label_seq \l_@@_ref_seq - - % % Join the reference sequence back into a delimited string. - \str_set:Nn \l_@@_ref_str {\seq_use:Nn \l_@@_ref_seq {#1}} - - \str_if_eq:nnF {\str_head:N \l_@@_ref_str} {\c_@@_label_delimiter_str} { - \str_put_left:Nn \l_@@_ref_str {\c_@@_label_delimiter_str} - } + \@@_HiRef_process:Nn \l_@@_ref_str {#2} % Output the section name only if no star is passed. \bool_if:nF {#1} { @@ -141,28 +113,82 @@ } } % Create a reference with the string we just created. - \ref{\l_@@_ref_str} + \exp_args:Ne \ref {\l_@@_ref_str} +\group_end: } - \cs_new:Nn \_seq_map:nn { - \str_case:nn {#2} { - {\c_@@_label_parent_str} { - \seq_pop_right:NN \l_@@_label_seq \l_@@_tmpa_tl - \seq_pop_left:NN \l_@@_ref_seq \l_@@_tmpa_tl - } - {\c_@@_label_wildcard_str} { - \seq_pop_left:NN \l_@@_label_seq \l_@@_tmpa_tl - \l_@@_tmpa_tl - } +\NewDocumentCommand{\HiperRef}{ + % #1: Label reference. + >{\TrimSpaces}m + % #2: Display text. + m +}{ \group_begin: + + %\str_set:Ne \l_@@_ref_str {#1} + + \@@_HiRef_process:Nn \l_@@_ref_str {#1} + + \hyperref[\l_@@_ref_str]{#2} + +\group_end: } + +\cs_new:Nn \@@_HiRef_process:Nn { + % Split the string on the delimiters. + \exp_args:NNNe \seq_set_regex_split:NNn \l_@@_ref_seq \c_@@_ref_regex {#2} + + \seq_remove_all:Nn \l_@@_ref_seq {} + + \str_log:N \l_@@_ref_str + \seq_log:N \l_@@_ref_seq + + % Copy the current label sequence to a local variable. + \seq_set_eq:NN \l_@@_label_seq \g_@@_label_seq + + \seq_log:N \l_@@_label_seq + + % Iterate through the reference sequence, removing one element from the + % end of the temporary label sequence for each parent symbol. + \seq_map_indexed_function:NN \l_@@_ref_seq \@@_seq_map:nn + + % Add the shortened temporary label sequence to the beginning of the + % reference sequence. + \str_if_eq:eeT {\str_head:N \l_@@_ref_str} {\c_@@_label_parent_str} { + \seq_concat:NNN \l_@@_ref_seq \l_@@_label_seq \l_@@_ref_seq + } + + \seq_log:N \l_@@_ref_seq + + % Join the reference sequence back into a delimited string. + \str_set:Ne \l_@@_ref_str {\seq_use:Ne \l_@@_ref_seq {\c_@@_label_delimiter_str}} + + \str_if_eq:eeF {\str_head:N \l_@@_ref_str} {\c_@@_label_delimiter_str} { + \str_put_left:Ne \l_@@_ref_str {\c_@@_label_delimiter_str} + } + + \str_set_eq:NN #1 \l_@@_ref_str +} + +\tl_new:N \l_@@_trash_tl + +\cs_new:Nn \@@_seq_map:nn { + \str_case_e:nn {#2} { + {\c_@@_label_parent_str} { + \seq_pop_right:NN \l_@@_label_seq \l_@@_trash_tl + \seq_pop_left:NN \l_@@_ref_seq \l_@@_trash_tl + } + {\c_@@_label_wildcard_str} { + %\message{wildcard~map} + \seq_pop_left:NN \l_@@_label_seq \l_tmpa_tl + % \seq_pop_left:NN \l_@@_ref_seq \l_@@_trash_tl + % \seq_put_left:NN \l_@@_ref_seq \l_tmpa_tl + \exp_args:NNne \seq_set_item:Nnn \l_@@_ref_seq {#1} {\l_tmpa_tl} } } -\group_end: } +} \int_new:N \l_@@_current_level_int \int_new:N \l_@@_pop_count_int \int_new:N \l_@@_pop_index_int -\seq_new:N \l_@@_label_seq - \str_new:N \l_@@_label_str \cs_new:Nn \@@_heading:nnnnn { \group_begin: