158 lines
4.0 KiB
TeX
158 lines
4.0 KiB
TeX
\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}
|
|
} |