diff options
Diffstat (limited to 'macros/latex/contrib/cleveref-forward/cleveref-forward.sty')
-rw-r--r-- | macros/latex/contrib/cleveref-forward/cleveref-forward.sty | 936 |
1 files changed, 936 insertions, 0 deletions
diff --git a/macros/latex/contrib/cleveref-forward/cleveref-forward.sty b/macros/latex/contrib/cleveref-forward/cleveref-forward.sty new file mode 100644 index 0000000000..b40f53fd44 --- /dev/null +++ b/macros/latex/contrib/cleveref-forward/cleveref-forward.sty @@ -0,0 +1,936 @@ +%% +%% 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/02/24} {} + {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 = UsedOn } + , Used~On .meta:n = { default = UsedOn } + , Used On .meta:n = { default = UsedOn } + , used-on .meta:n = { default = UsedOn } + , used~on .meta:n = { default = UsedOn } + , used on .meta:n = { default = UsedOn } + , uo .meta:n = { default = UsedOn } + , Used-By .meta:n = { default = UsedBy } + , Used~By .meta:n = { default = UsedBy } + , Used By .meta:n = { default = UsedBy } + , used-by .meta:n = { default = UsedBy } + , used~by .meta:n = { default = UsedBy } + , used by .meta:n = { default = UsedBy } + , ub .meta:n = { default = UsedBy } + , Used-By-And-On .meta:n = { default = UsedByAndOn } + , Used~By~And~On .meta:n = { default = UsedByAndOn } + , Used By And On .meta:n = { default = UsedByAndOn } + , used-by-and-on .meta:n = { default = UsedByAndOn } + , used~by~and~on .meta:n = { default = UsedByAndOn } + , used by and on .meta:n = { default = UsedByAndOn } + , ubao .meta:n = { default = UsedByAndOn } + , ubo .meta:n = { default = UsedByAndOn } + + , 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 } + } + +\newcommand*{\@setcpagerefrange}[3]{% + \@@setcpagerefrange{#1}{#2}{cref}{#3}} +\newcommand*{\@setCpagerefrange}[3]{% + \@@setcpagerefrange{#1}{#2}{Cref}{#3}} +\newcommand*{\@setlabelcpagerefrange}[3]{% + \@@setcpagerefrange{#1}{#2}{labelcref}{#3}} + +% Temporary 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@<LabelName>@1 exists + % Here the @1 means that <LabelName> 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 + % `<Option>@<LabelName>@<Number>` + % where Number between 1 and \value{LastRun@UsedOn@<LabelName>} + % if the latter exists, otherwise until 1 + % Should/will normally need two consecutive runs of pdflatex + \cs_if_free:cTF {c@LastRun@#1@#2} + { \int_set:Nn \l_tmpa_int { 1 } } + { \int_set:Nn \l_tmpa_int { \value{LastRun@#1@#2} } } + \int_set:Nn \l_tmpb_int { 1 } + \int_while_do:nn { \l_tmpb_int <= \l_tmpa_int } + { + \clist_put_right:Nx \l_tmpa_clist { #1@#2@\int_use:N \l_tmpb_int } + \int_incr:N \l_tmpb_int + } + #3 + } + } +\cs_new:Nn \__crfwd_printer:nn + { + \__crfwd_adjust_cref_commands: + \__crfwd_printer_generic:nnn { #1 } { #2 } + { + % Print `UsedOn` message by calling \cpageref with the parameter clist above + % Uncomment the next two lines for debugging to see the contents of \l_tmpa_clist + %% Arguments~of~cpageref/cref~are: + %% \par\clist_use:Nn \l_tmpa_clist {\par}\par + \str_case:xn { \str_foldcase:n { #1 } } + { + {used-on} { \UsedOnMessage { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used~on} { \UsedOnMessage { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used on} { \UsedOnMessage { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {uo} { \UsedOnMessage { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used-by} { \UsedByMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used~by} { \UsedByMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used by} { \UsedByMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {ub} { \UsedByMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used-by-and-on} { \UsedByAndOnMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used~by~and~on} { \UsedByAndOnMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used by and on} { \UsedByAndOnMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {ubao} { \UsedByAndOnMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {ubo} { \UsedByAndOnMessage { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + } + } + } +\cs_new:Nn \__crfwd_printer_math:nn + { + \__crfwd_adjust_cref_commands: + \__crfwd_printer_generic:nnn { #1 } { #2 } + { + % Print `UsedOn` message by calling \cpageref with the parameter clist above + % Uncomment the next two lines for debugging to see the contents of \l_tmpa_clist + %% Arguments~of~cpageref/cref~are: + %% \par\clist_use:Nn \l_tmpa_clist {\par}\par + \bool_if:NTF \g__crfwd_inside_math_bool + { + \RenewCommandCopy \UsedOnMessageMath \UsedOnMessageInsideMath + \RenewCommandCopy \UsedByMessageMath \UsedByMessageInsideMath + \RenewCommandCopy \UsedByAndOnMessageMath \UsedByAndOnMessageInsideMath + } + { + \RenewCommandCopy \UsedOnMessageMath \UsedOnMessageOutsideMath + \RenewCommandCopy \UsedByMessageMath \UsedByMessageOutsideMath + \RenewCommandCopy \UsedByAndOnMessageMath \UsedByAndOnMessageOutsideMath + } + \str_case:xn { \str_foldcase:n { #1 } } + { + {used-on} { \UsedOnMessageMath { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used~on} { \UsedOnMessageMath { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used on} { \UsedOnMessageMath { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {uo} { \UsedOnMessageMath { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used-by} { \UsedByMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used~by} { \UsedByMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used by} { \UsedByMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {ub} { \UsedByMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } } + {used-by-and-on} { \UsedByAndOnMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used~by~and~on} { \UsedByAndOnMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {used by and on} { \UsedByAndOnMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {ubao} { \UsedByAndOnMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + {ubo} { \UsedByAndOnMessageMath { \__crfwd_cref_adjusted:n { \l_tmpa_clist } } { \__crfwd_cpageref_adjusted:n { \l_tmpa_clist } } } + } + } + } + +\cs_new:Nn \__crfwd_print_message:n + { + \clist_map_inline:Nn \g__crfwd_options_clist + { + \__crfwd_printer:nn { ##1 } { #1 } + } + } +\cs_new:Nn \__crfwd_print_message_math:n + { + \clist_map_inline:Nn \g__crfwd_options_clist + { + \__crfwd_printer_math:nn { ##1 } { #1 } + } + } + +\str_new:N \l__crfwd_option_str +\msg_new:nnn {cleveref-forward} { unrecognised-option } + { + Unrecognised~option~`#1'. + } +\NewDocumentCommand \__crfwd_processor:w { o m } + { + \IfValueT { #1 } + { + \str_case:xnTF { \str_foldcase:n { #1 } } + { + % check if options 'UsedOn', 'UsedBy' or 'UsedByAndOn' + % (case-insensitive) were used in one of the following forms + {used-on} { \str_set:Nn \l__crfwd_option_str {UsedOn} } + {used~on} { \str_set:Nn \l__crfwd_option_str {UsedOn} } + {used on} { \str_set:Nn \l__crfwd_option_str {UsedOn} } + {uo} { \str_set:Nn \l__crfwd_option_str {UsedOn} } + {used-by} { \str_set:Nn \l__crfwd_option_str {UsedBy} } + {used~by} { \str_set:Nn \l__crfwd_option_str {UsedBy} } + {used by} { \str_set:Nn \l__crfwd_option_str {UsedBy} } + {ub} { \str_set:Nn \l__crfwd_option_str {UsedBy} } + {used-by-and-on} { \str_set:Nn \l__crfwd_option_str {UsedByAndOn} } + {used~by~and~on} { \str_set:Nn \l__crfwd_option_str {UsedByAndOn} } + {used by and on} { \str_set:Nn \l__crfwd_option_str {UsedByAndOn} } + {ubao} { \str_set:Nn \l__crfwd_option_str {UsedByAndOn} } + {ubo} { \str_set:Nn \l__crfwd_option_str {UsedByAndOn} } + } + { + { + % Loop through (potential) label list in arg of \cref (or \Cref) + \seq_set_from_clist:Nn \l_tmpa_seq { #2 } + \seq_map_inline:Nn \l_tmpa_seq + { + % if the label has not been referenced yet, + % create a counter for the current and last run and save the label in the + % global container \g_@@_k_seq + \seq_if_in:NxF \g__crfwd_k_seq { \l__crfwd_option_str @##1 } + { + \newcounter{ ThisRun@ \l__crfwd_option_str @##1 } + \cs_if_free:cT {c@LastRun@ \l__crfwd_option_str @##1} + { + \newcounter{LastRun@ \l__crfwd_option_str @##1} + } + \seq_gput_right:Nx \g__crfwd_k_seq + { \l__crfwd_option_str @##1} + } + % increase the counters and compare with max counter + \stepcounter{ThisRun@ \l__crfwd_option_str @##1} + \setcounter{LastRun@ \l__crfwd_option_str @##1} + { + \fp_eval:n + { + max( + \value{ThisRun@ \l__crfwd_option_str @##1} , + \value{LastRun@ \l__crfwd_option_str @##1} + ) + } + } + % store the value in global key-value property list + \prop_gput:Nxx \g__crfwd_kv_prop + { \l__crfwd_option_str @##1} + {\arabic{LastRun@ \l__crfwd_option_str @##1}} + % create a label for the UsedOn reference and number this label + \__crfwd_orig_label:w + { + \l__crfwd_option_str @##1@ + \arabic{ThisRun@ \l__crfwd_option_str @##1} + } + } + } + } + { + \msg_warning:nnn { cleveref-forward } { unrecognised-option } { #1 } + } + } + } +\bool_new:N \g__crfwd_ref_no_use_bool +\bool_new:N \l__crfwd_option_has_been_chosen_bool +\clist_new:N \l__crfwd_local_options_clist +\cs_new:Nn \__crfwd_define_from_orig_:NN + { + \NewDocumentCommand #1 { s o m } + { + \IfValueTF { ##2 } + { + \bool_set_false:N \l__crfwd_option_has_been_chosen_bool + \bool_set_false:N \g__crfwd_ref_no_use_bool + \clist_set:Nn \l__crfwd_local_options_clist { ##2 } + \clist_put_right:No \l__crfwd_local_options_clist { \l__crfwd_default_package_option_tl } + \clist_map_inline:Nn \l__crfwd_local_options_clist + { + \str_case:xnT { \str_foldcase:n { ####1 } } + { + {no-use} {} + {no~use} {} + {no use} {} + {not-use} {} + {not~use} {} + {not use} {} + } + { + \clist_remove_all:Nn \l__crfwd_local_options_clist { ####1 } + \bool_gset_true:N \g__crfwd_ref_no_use_bool + } + } + \clist_map_inline:Nn \l__crfwd_local_options_clist + { + \str_case:xnT { \str_foldcase:n { ####1 } } + { + {used-on} {} + {used~on} {} + {used on} {} + {uo} {} + {used-by} {} + {used~by} {} + {used by} {} + {ub} {} + {used-by-and-on} {} + {used~by~and~on} {} + {used by and on} {} + {ubao} {} + {ubo} {} + } + { + \clist_remove_all:Nn \l__crfwd_local_options_clist { ####1 } + \bool_if:NF \l__crfwd_option_has_been_chosen_bool + { + \bool_if:NF \g__crfwd_ref_no_use_bool + { + \__crfwd_processor:w [ ####1 ] { ##3 } + } + } + \bool_set_true:N \l__crfwd_option_has_been_chosen_bool + } + } + \clist_if_empty:NTF \l__crfwd_local_options_clist + { + \IfBooleanTF { ##1 } { #2*{##3} } { #2{##3} } + } + { + \IfBooleanTF { ##1 } { #2*[\l__crfwd_local_options_clist]{##3} } { #2[\l__crfwd_local_options_clist]{##3} } + } + } + { + \tl_if_blank:VF \l__crfwd_default_package_option_tl + { + \clist_clear:N \l__crfwd_local_options_clist + \clist_put_right:No \l__crfwd_local_options_clist { \l__crfwd_default_package_option_tl } + \clist_map_inline:Nn \l__crfwd_local_options_clist + { + \__crfwd_processor:w [ ####1 ] { ##3 } + } + } + \IfBooleanTF { ##1 } { #2*{##3} } { #2{##3} } + } + } + } +\__crfwd_define_from_orig_:NN \__crfwd_cref:w \__crfwd_orig_cref:w +\__crfwd_define_from_orig_:NN \__crfwd_Cref:w \__crfwd_orig_Cref:w +\__crfwd_define_from_orig_:NN \__crfwd_labelcref:w \__crfwd_orig_labelcref:w +\cs_new:Npn \__crfwd_read_from_aux: + { + \prop_map_inline:Nn \g__crfwd_kv_prop + { + \newcounter{LastRun@##1} + \setcounter{LastRun@##1}{##2} + } + } +\cs_new:Npn \__crfwd_write_to_aux: + { + % First, we clear the global key-value prop list \cs{g_@@_kv_prop} and + % then we rebuild it with the information from the current run. + \prop_clear:N \g__crfwd_kv_prop + \seq_map_inline:Nn \g__crfwd_k_seq + { \prop_gput:Nxx \g__crfwd_kv_prop {##1}{\arabic{ThisRun@##1}} } + % Turn on |expl3| functionality in .aux file. + \iow_now:cx { @auxout } + { \token_to_str:N \ExplSyntaxOn } + % Loop through the key-val |proplist| and write contents to .aux file. + \prop_map_inline:Nn \g__crfwd_kv_prop + { + \tl_set:Nn \l_tmpa_tl { ##1 } + \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \c_tilde_str } + \iow_now:cx { @auxout } + { + \prop_gput_from_keyval:Nn \token_to_str:N \g__crfwd_kv_prop + { {\l_tmpa_tl} = ##2 } + } + } + % Turn off |expl3| functionality in .aux file. + \iow_now:cx { @auxout } + { \token_to_str:N \ExplSyntaxOff } +}% + +\RequirePackage { regexpatch } +\@namedef{ver@xpatch.sty}{} + +\hook_gput_code:nnn { begindocument/end } { cleveref-forward } + { + \__crfwd_read_from_aux: + \cs_if_exist:NF \label@in@display { \NewCommandCopy \label@in@display \label } + \NewCommandCopy \__crfwd_orig_label_in_display:w \label@in@display + \NewCommandCopy \__crfwd_orig_label:w \label + \NewCommandCopy \__crfwd_orig_cref:w \cref + \NewCommandCopy \__crfwd_orig_Cref:w \Cref + \NewCommandCopy \__crfwd_orig_labelcref:w \labelcref + \bool_new:N \g__crfwd_label_no_use_bool + \prop_new:N \g__crfwd_label_prop + \cs_new:Nn \__crfwd_label_generic:nnn + % #1 = optional argument of \label + % #2 = mandatory argument of \label + % #3 = the varying part + { + \bool_gset_false:N \g__crfwd_label_no_use_bool + \prop_gput:Nno \g__crfwd_label_prop { #2 } { \cref@currentlabel } + \clist_clear:N \l__crfwd_local_options_clist + \IfValueT { #1 } + { + \clist_set:Nn \l__crfwd_local_options_clist { #1 } + } + \clist_map_inline:Nn \l__crfwd_local_options_clist + { + \str_case:xnT { \str_foldcase:n { ##1 } } + { + {no-use} {} + {no~use} {} + {no use} {} + {not-use} {} + {not~use} {} + {not use} {} + } + { + \clist_remove_all:Nn \l__crfwd_local_options_clist { ##1 } + \bool_gset_true:N \g__crfwd_label_no_use_bool + } + } + #3 + } + \RenewDocumentCommand \label { o m } + { + \__crfwd_label_generic:nnn { #1 } { #2 } + { + \if_mode_math: % this is for environments that do not use \label@in@display + \clist_if_empty:NTF \l__crfwd_local_options_clist + { + \__crfwd_orig_label_in_display:w { #2 } + } + { + \__crfwd_orig_label_in_display:w [ \l__crfwd_local_options_clist ] { #2 } + } + \bool_if:NF \g__crfwd_label_no_use_bool + { + \__crfwd_print_message:n { #2 } + } + \else: + \clist_if_empty:NTF \l__crfwd_local_options_clist + { + \__crfwd_orig_label:w { #2 } + } + { + \__crfwd_orig_label:w [ \l__crfwd_local_options_clist ] { #2 } + } + \bool_if:NF \g__crfwd_label_no_use_bool + { + \__crfwd_print_message:n { #2 } + } + \fi: + } + } + \RenewDocumentCommand \label@in@display { o m } + { + \__crfwd_label_generic:nnn { #1 } { #2 } + { + \clist_if_empty:NTF \l__crfwd_local_options_clist + { + \__crfwd_orig_label_in_display:w { #2 } + } + { + \__crfwd_orig_label_in_display:w [ \l__crfwd_local_options_clist ] { #2 } + } + \bool_if:NF \g__crfwd_label_no_use_bool + { + \__crfwd_print_message_math:n { #2 } + } + } + } + \NewDocumentCommand \label@gobble { o m } + { + \__crfwd_label_generic:nnn { #1 } { #2 } + { + \bool_if:NF \g__crfwd_label_no_use_bool + { + \__crfwd_print_message_math:n { #2 } + } + } + } + \makeatletter + \xpatchcmd{\multline@}{\let\label\cref@gobble@optarg}{\let\label\label@gobble}{}{} + \makeatother + \NewDocumentCommand \restorelabel { m } + { + \prop_if_in:NnTF \g__crfwd_label_prop { #1 } + { + \prop_get:NnN \g__crfwd_label_prop { #1 } \l_tmpa_tl + \RenewCommandCopy \cref@currentlabel \l_tmpa_tl + } + { + \msg_new:nnn {cleveref-forward} { label-not-exist } + { + The~label~`##1'~does~not~exist. + } + \msg_fatal:nnn { cleveref-forward } { label-not-exist } { #1 } + } + } + \RenewCommandCopy \cref \__crfwd_cref:w + \RenewCommandCopy \Cref \__crfwd_Cref:w + \RenewCommandCopy \labelcref \__crfwd_labelcref:w + } +\hook_gput_code:nnn { enddocument } { cleveref-forward } + { + \__crfwd_write_to_aux: + } +\endinput +%% +%% End of file `cleveref-forward.sty'. |