%%
%% 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@<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'.