%% %% Copyright (C) 2023-2024 by Jinwen XU %% ------------------------------------ %% %% This package is derived from the package ``cleveref-usedon''. %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3c 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 %% \NeedsTeXFormat{LaTeX2e}[2022-06-01] \ProvidesExplPackage{cleveref-forward} {2024/03/15} {} {Forward-referencing functionality for cleveref} \keys_define:nn { cleveref-forward } { , default .tl_set:N = \l__crfwd_default_package_option_tl , default .initial:n = { } , default .value_required:n = true , Used-On .meta:n = { default = used-on } , Used~On .meta:n = { default = used-on } , Used On .meta:n = { default = used-on } , used-on .meta:n = { default = used-on } , used~on .meta:n = { default = used-on } , used on .meta:n = { default = used-on } , uo .meta:n = { default = used-on } , Used-By .meta:n = { default = used-by } , Used~By .meta:n = { default = used-by } , Used By .meta:n = { default = used-by } , used-by .meta:n = { default = used-by } , used~by .meta:n = { default = used-by } , used by .meta:n = { default = used-by } , ub .meta:n = { default = used-by } , Used-By-And-On .meta:n = { default = used-by-and-on } , Used~By~And~On .meta:n = { default = used-by-and-on } , Used By And On .meta:n = { default = used-by-and-on } , used-by-and-on .meta:n = { default = used-by-and-on } , used~by~and~on .meta:n = { default = used-by-and-on } , used by and on .meta:n = { default = used-by-and-on } , ubao .meta:n = { default = used-by-and-on } , ubo .meta:n = { default = used-by-and-on } , crefthe .bool_set:N = \l__crfwd_crefthe_enabled_bool , crefthe .initial:n = { false } , unknown .code:n = { } } \ProcessKeyOptions [ cleveref-forward ] \RequirePackage { cleveref } \bool_if:NT \l__crfwd_crefthe_enabled_bool { \RequirePackage { crefthe } } % Fix for cleveref in order to work with long range of pages % See https://tex.stackexchange.com/a/620066 \providecommand*{\@setcpagerefrange}[3]{% \@@setcpagerefrange{#1}{#2}{cref}{#3}} \providecommand*{\@setCpagerefrange}[3]{% \@@setcpagerefrange{#1}{#2}{Cref}{#3}} \providecommand*{\@setlabelcpagerefrange}[3]{% \@@setcpagerefrange{#1}{#2}{labelcref}{#3}} % Fix for cleveref in order to work with xr-hyper % See https://tex.stackexchange.com/a/708445 \def\cref@getref#1#2{% \expandafter\let\expandafter#2\csname r@#1@cref\endcsname% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter\@firstoffive#2}}% <-------- five \def\cpageref@getref#1#2{% \expandafter\let\expandafter#2\csname r@#1@cref\endcsname% \expandafter\expandafter\expandafter\def% \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter\@secondoffive#2}}% <----------- five \AtBeginDocument{% \def\label@noarg#1{% \cref@old@label{#1}% \@bsphack% \edef\@tempa{{page}{\the\c@page}}% \setcounter{page}{1}% \edef\@tempb{\thepage}% \expandafter\setcounter\@tempa% \cref@constructprefix{page}{\cref@result}% \protected@write\@auxout{}% {\string\newlabel{#1@cref}{{\cref@currentlabel}% {[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <----- five \@esphack}% \def\label@optarg[#1]#2{% \cref@old@label{#2}% \@bsphack% \edef\@tempa{{page}{\the\c@page}}% \setcounter{page}{1}% \edef\@tempb{\thepage}% \expandafter\setcounter\@tempa% \cref@constructprefix{page}{\cref@result}% \protected@edef\cref@currentlabel{% \expandafter\cref@override@label@type% \cref@currentlabel\@nil{#1}}% \protected@write\@auxout{}% {\string\newlabel{#2@cref}{{\cref@currentlabel}% {[\@tempb][\arabic{page}][\cref@result]\thepage}{}{}{}}}% <------- five \@esphack}% } \prg_generate_conditional_variant:Nnn \str_case:nn { x } { T, TF } \cs_generate_variant:Nn \str_case:nn { x } \seq_new:N \g__crfwd_k_seq \prop_new:N \g__crfwd_kv_prop \clist_new:N \g__crfwd_options_clist \clist_set:Nn \g__crfwd_options_clist { UsedOn, UsedBy, UsedByAndOn } \cs_new:Nn \__crfwd_usedon_message_text:n { } \cs_new:Nn \__crfwd_usedby_message_text:n { } \cs_new:Nn \__crfwd_usedbyandon_message_text:nn { } \NewDocumentCommand \UsedOnMessageText { m } { \__crfwd_usedon_message_text:n { #1 } } \NewDocumentCommand \UsedByMessageText { m } { \__crfwd_usedby_message_text:n { #1 } } \NewDocumentCommand \UsedByAndOnMessageText { m m } { \__crfwd_usedbyandon_message_text:nn { #1 } { #2 } } % Alternative names \NewDocumentCommand \UsedOnMessageContent { m } { \__crfwd_usedon_message_text:n { #1 } } \NewDocumentCommand \UsedByMessageContent { m } { \__crfwd_usedby_message_text:n { #1 } } \NewDocumentCommand \UsedByAndOnMessageContent { m m } { \__crfwd_usedbyandon_message_text:nn { #1 } { #2 } } \NewDocumentCommand \SetUsedOnMessageText { m } { \cs_set:Nn \__crfwd_usedon_message_text:n { #1 } } \NewDocumentCommand \SetUsedByMessageText { m } { \cs_set:Nn \__crfwd_usedby_message_text:n { #1 } } \NewDocumentCommand \SetUsedByAndOnMessageText { m } { \cs_set:Nn \__crfwd_usedbyandon_message_text:nn { #1 } } % Alternative names \NewDocumentCommand \SetUsedOnMessageContent { m } { \cs_set:Nn \__crfwd_usedon_message_text:n { #1 } } \NewDocumentCommand \SetUsedByMessageContent { m } { \cs_set:Nn \__crfwd_usedby_message_text:n { #1 } } \NewDocumentCommand \SetUsedByAndOnMessageContent { m } { \cs_set:Nn \__crfwd_usedbyandon_message_text:nn { #1 } } \RequirePackage { iflang } % The default text \SetUsedOnMessageText { (Used~on~#1.) } \SetUsedByMessageText { (Used~by~#1.) } \SetUsedByAndOnMessageText { (Used~by~#1~on~#2.) } \cs_new:Nn \__crfwd_usedon_message:n { } \NewDocumentCommand \UsedOnMessage { m } { \__crfwd_usedon_message:n { #1 } } \cs_new:Nn \__crfwd_usedby_message:n { } \NewDocumentCommand \UsedByMessage { m } { \__crfwd_usedby_message:n { #1 } } \cs_new:Nn \__crfwd_usedbyandon_message:nn { } \NewDocumentCommand \UsedByAndOnMessage { m m } { \__crfwd_usedbyandon_message:nn { #1 } { #2 } } \cs_new:Nn \__crfwd_usedon_message_math:n { } \NewCommandCopy \UsedOnMessageMath \__crfwd_usedon_message_math:n \cs_new:Nn \__crfwd_usedby_message_math:n { } \NewCommandCopy \UsedByMessageMath \__crfwd_usedby_message_math:n \cs_new:Nn \__crfwd_usedbyandon_message_math:nn { } \NewCommandCopy \UsedByAndOnMessageMath \__crfwd_usedbyandon_message_math:nn \cs_new:Nn \__crfwd_usedon_message_inside_math:n { } \NewDocumentCommand \UsedOnMessageInsideMath { m } { \__crfwd_usedon_message_inside_math:n { #1 } } \cs_new:Nn \__crfwd_usedby_message_inside_math:n { } \NewDocumentCommand \UsedByMessageInsideMath { m } { \__crfwd_usedby_message_inside_math:n { #1 } } \cs_new:Nn \__crfwd_usedbyandon_message_inside_math:nn { } \NewDocumentCommand \UsedByAndOnMessageInsideMath { m m } { \__crfwd_usedbyandon_message_inside_math:nn { #1 } { #2 } } \cs_new:Nn \__crfwd_usedon_message_outside_math:n { } \NewDocumentCommand \UsedOnMessageOutsideMath { m } { \__crfwd_usedon_message_outside_math:n { #1 } } \cs_new:Nn \__crfwd_usedby_message_outside_math:n { } \NewDocumentCommand \UsedByMessageOutsideMath { m } { \__crfwd_usedby_message_outside_math:n { #1 } } \cs_new:Nn \__crfwd_usedbyandon_message_outside_math:nn { } \NewDocumentCommand \UsedByAndOnMessageOutsideMath { m m } { \__crfwd_usedbyandon_message_outside_math:nn { #1 } { #2 } } \tl_new:N \g__crfwd_tmpa_tl \NewDocumentCommand \SetUsedOnMessageStyle { m } { % \cs_set:Nn \__crfwd_usedon_message:n { #1 } \cs_set:Npn \__crfwd_usedon_message:n ##1 { \cs_set:Nn \__crfwd_usedon_message:n { #1 } } \__crfwd_usedon_message:n { \UsedOnMessageText{##1} } } \NewDocumentCommand \SetUsedByMessageStyle { m } { \cs_set:Npn \__crfwd_usedby_message:n ##1 { \cs_set:Nn \__crfwd_usedby_message:n { #1 } } \__crfwd_usedby_message:n { \UsedByMessageText{##1} } } \NewDocumentCommand \SetUsedByAndOnMessageStyle { m } { \cs_set:Npn \__crfwd_usedbyandon_message:nn ##1 { \cs_set:Nn \__crfwd_usedbyandon_message:nn { #1 } } \__crfwd_usedbyandon_message:nn { \UsedByAndOnMessageText{##1}{##2} } } \bool_new:N \g__crfwd_inside_math_bool \NewDocumentCommand \SetUsedOnMessageStyleInsideMath { m } { \bool_set_true:N \g__crfwd_inside_math_bool \cs_set:Npn \__crfwd_usedon_message_inside_math:n ##1 { \cs_set:Nn \__crfwd_usedon_message_inside_math:n { #1 } } \__crfwd_usedon_message_inside_math:n { \UsedOnMessageText{##1} } } \NewDocumentCommand \SetUsedByMessageStyleInsideMath { m } { \bool_set_true:N \g__crfwd_inside_math_bool \cs_set:Npn \__crfwd_usedby_message_inside_math:n ##1 { \cs_set:Nn \__crfwd_usedby_message_inside_math:n { #1 } } \__crfwd_usedby_message_inside_math:n { \UsedByMessageText{##1} } } \NewDocumentCommand \SetUsedByAndOnMessageStyleInsideMath { m } { \bool_set_true:N \g__crfwd_inside_math_bool \cs_set:Npn \__crfwd_usedbyandon_message_inside_math:nn ##1 { \cs_set:Nn \__crfwd_usedbyandon_message_inside_math:nn { #1 } } \__crfwd_usedbyandon_message_inside_math:nn { \UsedByAndOnMessageText{##1}{##2} } } \clist_new:N \l__crfwd_supported_equation_env_clist \clist_set:Nn \l__crfwd_supported_equation_env_clist { equation, align, flalign, alignat, gather, multline, dmath, } \cs_new:Nn \__crfwd_message_outsidemath_hook_gremove_code:nn { \clist_map_inline:Nn \l__crfwd_supported_equation_env_clist { \hook_gremove_code:nn { env/##1/#1 } { cleveref-forward- #2 -message-outsidemath } } } \cs_new:Nn \__crfwd_message_outsidemath_hook_gput_code:nnn { \clist_map_inline:Nn \l__crfwd_supported_equation_env_clist { \hook_gput_code:nnn { env/##1/#1 } { cleveref-forward- #2 -message-outsidemath } { #3 } } } \cs_new:Nn \__crfwd_message_outsidemath_hook_gset_rule:nnnn { \clist_map_inline:Nn \l__crfwd_supported_equation_env_clist { \hook_gset_rule:nnnn { env/##1/#1 } { cleveref-forward- #2 -message-outsidemath } { #3 } { cleveref-forward- #4 -message-outsidemath } } } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedOn } { } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedBy } { } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedByAndOn } { } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedOn } { } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedBy } { } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedByAndOn } { } \NewDocumentCommand \SetUsedOnMessageStyleOutsideMath { m } { \bool_set_false:N \g__crfwd_inside_math_bool \RenewDocumentCommand \UsedOnMessageOutsideMath { m } { \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedOn } { voids } { UsedBy } \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedOn } { voids } { UsedByAndOn } \tl_gset:Ne \g__crfwd_tmpa_tl { ##1 } } \cs_set:Npn \__crfwd_usedon_message_outside_math:n ##1 { \cs_set:Nn \__crfwd_usedon_message_outside_math:n { \bool_if:NF \g__crfwd_label_no_use_bool { \tl_if_empty:NF \g__crfwd_tmpa_tl { #1 } } } } \__crfwd_usedon_message_outside_math:n { \UsedOnMessageText{##1} } \__crfwd_message_outsidemath_hook_gremove_code:nn { before } { UsedOn } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedOn } { \tl_gclear:N \g__crfwd_tmpa_tl } \__crfwd_message_outsidemath_hook_gremove_code:nn { after } { UsedOn } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedOn } { \__crfwd_usedon_message_outside_math:n { \tl_use:N \g__crfwd_tmpa_tl } } } \NewDocumentCommand \SetUsedByMessageStyleOutsideMath { m } { \bool_set_false:N \g__crfwd_inside_math_bool \RenewDocumentCommand \UsedByMessageOutsideMath { m } { \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedBy } { voids } { UsedOn } \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedBy } { voids } { UsedByAndOn } \tl_gset:Ne \g__crfwd_tmpa_tl { ##1 } } \cs_set:Npn \__crfwd_usedby_message_outside_math:n ##1 { \cs_set:Nn \__crfwd_usedby_message_outside_math:n { \bool_if:NF \g__crfwd_label_no_use_bool { \tl_if_empty:NF \g__crfwd_tmpa_tl { #1 } } } } \__crfwd_usedby_message_outside_math:n { \UsedByMessageText{##1} } \__crfwd_message_outsidemath_hook_gremove_code:nn { before } { UsedBy } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedBy } { \tl_gclear:N \g__crfwd_tmpa_tl } \__crfwd_message_outsidemath_hook_gremove_code:nn { after } { UsedBy } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedBy } { \__crfwd_usedby_message_outside_math:n { \tl_use:N \g__crfwd_tmpa_tl } } } \NewDocumentCommand \SetUsedByAndOnMessageStyleOutsideMath { m } { \bool_set_false:N \g__crfwd_inside_math_bool \RenewDocumentCommand \UsedByAndOnMessageOutsideMath { m m } { \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedByAndOn } { voids } { UsedOn } \__crfwd_message_outsidemath_hook_gset_rule:nnnn { after } { UsedByAndOn } { voids } { UsedBy } \tl_gset:Ne \g__crfwd_tmpa_tl { ##1 } \tl_gset:Ne \g__crfwd_tmpb_tl { ##2 } } \cs_set:Npn \__crfwd_usedbyandon_message_outside_math:nn ##1 { \cs_set:Nn \__crfwd_usedbyandon_message_outside_math:nn { \bool_if:NF \g__crfwd_label_no_use_bool { \tl_if_empty:NF \g__crfwd_tmpa_tl { #1 } } } } \__crfwd_usedbyandon_message_outside_math:nn { \UsedByAndOnMessageText{##1}{##2} } \__crfwd_message_outsidemath_hook_gremove_code:nn { before } { UsedByAndOn } \__crfwd_message_outsidemath_hook_gput_code:nnn { before } { UsedByAndOn } { \tl_gclear:N \g__crfwd_tmpa_tl \tl_gclear:N \g__crfwd_tmpb_tl } \__crfwd_message_outsidemath_hook_gremove_code:nn { after } { UsedByAndOn } \__crfwd_message_outsidemath_hook_gput_code:nnn { after } { UsedByAndOn } { \__crfwd_usedbyandon_message_outside_math:nn { \tl_use:N \g__crfwd_tmpa_tl } { \tl_use:N \g__crfwd_tmpb_tl } } } \NewDocumentCommand \SetForwardReferenceStyle { m } { \SetUsedOnMessageStyle { #1 } \SetUsedByMessageStyle { #1 } \SetUsedByAndOnMessageStyle { #1 } } \NewDocumentCommand \SetForwardReferenceStyleInsideMath { m } { \SetUsedOnMessageStyleInsideMath { #1 } \SetUsedByMessageStyleInsideMath { #1 } \SetUsedByAndOnMessageStyleInsideMath { #1 } } \NewDocumentCommand \SetForwardReferenceStyleOutsideMath { m } { \SetUsedOnMessageStyleOutsideMath { #1 } \SetUsedByMessageStyleOutsideMath { #1 } \SetUsedByAndOnMessageStyleOutsideMath { #1 } } % The default style \SetForwardReferenceStyle { \emph{#1} \\[.3\baselineskip] } \SetForwardReferenceStyleOutsideMath { \begin{flushright} \emph{#1} \end{flushright} \vspace{.15\baselineskip} } \cs_new:Nn \__crfwd_cref_adjusted:n { \cref{#1} } \cs_new:Nn \__crfwd_cpageref_adjusted:n { \cpageref{#1} } \cs_new:Npn \__crfwd_adjust_cref_user: { } \cs_new:Npn \__crfwd_adjust_cpageref_user: { } \NewDocumentCommand \SetForwardReferenceRefForm { m } { % \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { #1{##1} } \cs_set:Npn \__crfwd_adjust_cref_user: { \cs_set:Npn \__crfwd_cref_adjusted:n ####1 { #1{####1} } } } \NewDocumentCommand \SetForwardReferencePagerefForm { m } { % \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { #1{##1} } \cs_set:Npn \__crfwd_adjust_cpageref_user: { \cs_set:Npn \__crfwd_cpageref_adjusted:n ####1 { #1{####1} } } } \bool_if:NTF \l__crfwd_crefthe_enabled_bool { \AtBeginDocument { \addto\extrasfrench{\crefthename{page}[le]{page}[les]{pages}} \addto\extrasspanish{\crefthename{page}[la]{página}[las]{páginas}} } \SetUsedOnMessageText { \IfLanguageName{english} { (Used~on~#1.) } {} \IfLanguageName{french} { (Apparaît~en~#1.) } {} \IfLanguageName{ngerman} { (Wird~auf~#1.) } {} \IfLanguageName{italian} { (Appare~a~#1.) } {} \IfLanguageName{spanish} { (Aparece~en~#1.) } {} } \SetUsedByMessageText { \IfLanguageName{english} { (Used~by~#1.) } {} \IfLanguageName{french} { (Apparaît~dans~#1.) } {} \IfLanguageName{ngerman} { (Wird~#1.) } {} \IfLanguageName{italian} { (Appare~#1.) } {} \IfLanguageName{spanish} { (Aparece~en~#1.) } {} } \SetUsedByAndOnMessageText { \IfLanguageName{english} { (Used~by~#1~on~#2.) } {} \IfLanguageName{french} { (Apparaît~dans~#1~en~#2.) } {} \IfLanguageName{ngerman} { (Wird~#1~auf~#2.) } {} \IfLanguageName{italian} { (Appare~#1~a~#2.) } {} \IfLanguageName{spanish} { (Aparece~en~#1~en~#2.) } {} } \cs_new:Nn \__crfwd_adjust_cref_commands: { \IfLanguageName{english} { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \cref{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpageref{##1} } } {} \IfLanguageName{french} { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \crefthe{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpagerefthe[noun]{##1} } } {} \IfLanguageName{ngerman} { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \crefthe[von,dat.]{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpagerefthe[noun]{##1} } } {} \IfLanguageName{italian} { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \crefthe[in]{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpagerefthe[noun]{##1} } } {} \IfLanguageName{spanish} { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \crefthe{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpagerefthe{##1} } } {} \__crfwd_adjust_cref_user: \__crfwd_adjust_cpageref_user: } } { \cs_new:Nn \__crfwd_adjust_cref_commands: { \cs_set:Npn \__crfwd_cref_adjusted:n ##1 { \cref{##1} } \cs_set:Npn \__crfwd_cpageref_adjusted:n ##1 { \cpageref{##1} } \__crfwd_adjust_cref_user: \__crfwd_adjust_cpageref_user: } } \cs_new:Nn \__crfwd_printer_generic:nnn { % Check if the reference #1@@1 exists % Here the @1 means that has been referenced % with option #1 at least once where #1 is % 'UsedOn', 'UsedBy' or 'UsedByAndOn' \cs_if_exist:cT {r@#1@#2@1} { % In a tmp clist we store all the references of the form % `