\NeedsTeXFormat{LaTeX2e} \ProvidesExplPackage{PrimeTeX/packages/CrossRef}{2025-09-16}{1.0}{ Custom label and reference commands. } \prop_const_from_keyval:Nn \c_section_names_prop { 0 = Part\nobreakspace, 1 = Chapter\nobreakspace, 2 = Section\nobreakspace, 3 = Subsection\nobreakspace, 4 = Sub-subsection\nobreakspace, 5 = Paragraph\nobreakspace, 6 = Subparagraph\nobreakspace, 9 = Appendix\nobreakspace, } \prop_const_from_keyval:Nn \c_section_levels_prop { part = 0, chapter = 1, section = 2, subsection = 3, subsubsection = 4, paragraph = 5, subparagraph = 6, } \str_const:Nn \c_label_delimiter_str {/} \str_const:Nn \c_label_parent_str {.} \str_const:Nn \c_appendices_label_str {appendices} \seq_new:N \l_label_seq \NewDocumentCommand{\Part}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {part} {#1} {#2} {#3} {#4} \RenewDocumentCommand{\parttitle}{}{#2} } \NewDocumentCommand{\Chapter}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {chapter} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Section}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {section} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Subsection}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {subsection} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Subsubsection}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {subsubsection} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Paragraph}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {paragraph} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Subparagraph}{s t^ m >{\TrimSpaces}m}{ \_heading:nnnnn {subparagaph} {#1} {#2} {#3} {#4} } \NewDocumentCommand{\Appendices}{}{ \_heading:nnnnn {part} {\c_true_bool} {\c_false_bool} {Appendices} {\c_appendices_label_str} } \NewDocumentCommand{\GetCurrentLabel}{}{ \seq_use:NV \l_label_seq \c_label_delimiter_str } \NewDocumentCommand{\SetCurrentLabel}{ % #1: Delimiter O{\c_label_delimiter_str} % #2: Label string. >{\TrimSpaces}m }{ \seq_set_split:Nee \l_label_seq {#1} {#2} } \int_new:N \l_level_index_int \seq_new:N \l_label_temp_seq \seq_new:N \l_ref_seq \str_new:N \l_ref_str \RenewDocumentCommand{\Ref}{ % #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 >{\TrimSpaces}m % #4: Parent label symbol (defaults to "."). O{\c_label_parent_str} }{ \str_set:Nn \l_ref_str {#3} \str_if_eq:nnTF {\str_head:N \l_ref_str} {#2} { \str_replace_all:Nnn \l_ref_str {#4} {#2} \seq_set_split:Nee \l_ref_seq {#2} {#3} \int_set:Nn \l_level_index_int {1} \int_do_until:nNnn {\l_level_index_int} > {\seq_count:N \l_ref_seq} { \str_if_empty:nTF {\seq_item:Nn \l_ref_seq {\l_level_index_int}} { \seq_set_item:Nnn \l_ref_seq { \l_level_index_int } { \seq_item:Nn \l_label_seq {\l_level_index_int} } } \int_incr:N \l_level_index_int } \str_set:Nn \l_ref_str {\seq_use:Nn \l_ref_seq {#1}} } { \str_set:Nn \l_ref_str {#3} } \bool_if:nF {#1} { % Section name \str_if_eq:nnTF {\seq_item:Nn \l_ref_seq {1}} {\c_appendices_label_str} { \prop_item:Nn \c_section_names_prop {9} }{ \prop_item:Nn \c_section_names_prop {\seq_count:N \l_ref_seq - 1} } } \str_put_left:Nn \l_ref_str {\c_label_delimiter_str} \ref{\l_ref_str} } \int_new:N \l_section_level_int \cs_new:Nn \_heading:nnnnn { % #1: Section name: part, chapter, section, etc. % #2: Star (passed to default sectioning command) % #3: ^ token: suppresses sectioning command. % #4: Section title % #5: Label \prop_get:NnN \c_section_levels_prop {#1} \l_section_level_int \bool_if:nF {#3} { \bool_if:nTF {#2} { \use:c {#1} * {#4} } { \use:c {#1} {#4} } } \int_set:Nn \l_level_index_int {\seq_count:N \l_label_seq} \int_do_while:nNnn {\l_level_index_int} > {\l_section_level_int} { \seq_pop_right:NN \l_label_seq \l_tmpa_tl \int_decr:N \l_level_index_int } \seq_put_right:Nn \l_label_seq {#5} \str_set:Nn \l_label_str {\seq_use:Nn \l_label_seq \c_label_delimiter_str} \str_put_left:Nn \l_label_str {\c_label_delimiter_str} \exp_args:Ne \label {\l_label_str} }