%%^^A%% um-code-compat.dtx -- part of UNICODE-MATH <wspr.io/unicode-math>
%%^^A%% Compatibility with 3rd party packages.

% \section{Compatibility}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% \begin{macro}{\@@_check_and_fix:NNnnn}
% \darg{command}
% \darg{factory command}
% \darg{parameter text}
% \darg{expected replacement text}
% \darg{new replacement text}
% Tries to patch \meta{command}.
% If \meta{command} is undefined, do nothing.
% Otherwise it must be a macro with the given \meta{parameter text} and \meta{expected replacement text}, created by the given \meta{factory command} or equivalent.
% In this case it will be overwritten using the \meta{parameter text} and the \meta{new replacement text for \LuaTeX} or the \meta{new replacement text for \XeTeX}, depending on the engine.
% Otherwise issue a warning and don’t overwrite.
%    \begin{macrocode}
\cs_new_protected_nopar:Nn \@@_check_and_fix:NNnnn
  {
    \cs_if_exist:NT #1
      {
        \token_if_macro:NTF #1
          {
            \group_begin:
            #2 \@@_tmpa:w #3 { #4 }
            \cs_if_eq:NNTF #1 \@@_tmpa:w
              {
                \msg_info:nnx { unicode-math } { patch-macro } { \token_to_str:N #1 }
                \group_end:
                #2 #1 #3 { #5 }
              }
              {
                \msg_warning:nnxxx { unicode-math } { wrong-meaning }
                  { \token_to_str:N #1 } { \token_to_meaning:N #1 }
                  { \token_to_meaning:N \@@_tmpa:w }
                \group_end:
              }
          }
          {
            \msg_warning:nnx { unicode-math } { macro-expected }
              { \token_to_str:N #1 }
          }
       }
  }
%    \end{macrocode}
% \end{macro}
%
% \section{Patching/augmenting 3rd-party packages}
%
% \subsection{\pkg{url}}
% Here we need to get \pkg{url} in a state such that
% when it switches to math mode and enters \ascii\ characters, the maths
% setup (i.e., \pkg{unicode-math}) doesn't remap the symbols into Plane 1.
% Which is what \cs{symliteral} is intended to do.
% This is the same as writing, e.g., |\def\UrlFont{\ttfamily\@@_switch_to:n{literal}}|
% but activates automatically so documents that might change the \cs{url}
% font through the standard interface still work correctly.
%    \begin{macrocode}
\AtEndOfPackageFile * {url}
  {
    \tl_put_left:Nn \Url@FormatString { \@@_switch_to:n {literal} }
    \tl_put_right:Nn \UrlSpecials
      {
        \do \` { \mathchar`\` }
        \do \' { \mathchar`\' }
        \do \$ { \mathchar`\$ }
        \do \& { \mathchar`\& }
      }
  }
%    \end{macrocode}
%
%
% \subsection{\pkg{mathtools}}
%
% \pkg{mathtools}’s |\cramped| command and others that make use of its internal version use an incorrect font dimension.
%
% The \XeTeX\ version is pretty similar to the legacy version, only using the correct font dimensions.
% Note we used `\verb|\XeTeXradical|' with the family 255 to be almost sure
% that the radical rule width is not set. Former use of `\verb|\newfam|' had an
% upsetting effect on legacy math alphabets.
%    \begin{macrocode}
%<*XE>
\AtEndOfPackageFile * { mathtools }
  {
    \@@_check_and_fix:NNnnn \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 }
     {
       \sbox \z@ { $ \m@th #1 \nulldelimiterspace = \z@ \radical \z@ { #2 } $ }
       \ifx #1 \displaystyle
         \dimen@ = \fontdimen 8 \textfont 3
         \advance \dimen@ .25 \fontdimen 5 \textfont 2
       \else
         \dimen@ = 1.25 \fontdimen 8
         \ifx #1 \textstyle
           \textfont
         \else
           \ifx #1 \scriptstyle
             \scriptfont
           \else
             \scriptscriptfont
           \fi
         \fi
         3
       \fi
       \advance \dimen@ -\ht\z@
       \ht\z@ = -\dimen@
       \box\z@
     }
     {
       \hbox_set:Nn \l_tmpa_box
         {
           \color@setgroup \c_math_toggle_token \m@th
             #1
             \dim_zero:N \nulldelimiterspace
             \XeTeXradical 255 ~ 0 ~ { #2 }
           \c_math_toggle_token \color@endgroup
         }
       \box_set_ht:Nn \l_tmpa_box
         {
           \box_ht:N \l_tmpa_box - \@@_radical_vgap:N #1
         }
       \box_use_drop:N \l_tmpa_box
     }
  }
%</XE>
%    \end{macrocode}
%
% \begin{macro}{\overbracket}
% \begin{macro}{\underbracket}
%   \pkg{mathtools}’s |\overbracket| and |\underbracket| take optional
%   arguments and are defined in terms of rules, so we keep them, and rename
%   ours to |\Uoverbracket| and |\Uunderbracket|.
%
%   Original definition used the height of |\braceld| which is not available
%   with Unicode fonts, so we are hard coding the $5/18$ex suggested by
%   \pkg{mathtools}’s documentation.
%    \begin{macrocode}
\AtEndOfPackageFile * { mathtools }
  {
    \cs_set_eq:NN \MToverbracket  \overbracket
    \cs_set_eq:NN \MTunderbracket \underbracket

    \AtBeginDocument
      {
        \msg_warning:nn { unicode-math } { mathtools-overbracket }

    	  \cs_set:Npn \downbracketfill #1 #2
	        {
            \tl_set:Nn \l_MT_bracketheight_fdim {.27ex}
            \downbracketend {#1} {#2}
            \leaders \vrule \@height #1 \@depth \z@ \hfill
            \downbracketend {#1} {#2}
          }

	      \cs_set:Npn \upbracketfill #1 #2
	        {
            \tl_set:Nn \l_MT_bracketheight_fdim {.27ex}
            \upbracketend {#1} {#2}
            \leaders \vrule \@height \z@ \@depth #1 \hfill
            \upbracketend {#1} {#2}
          }

	      \cs_set_eq:NN \Uoverbracket  \overbracket
	      \cs_set_eq:NN \Uunderbracket \underbracket
        \cs_set_eq:NN \overbracket   \MToverbracket
        \cs_set_eq:NN \underbracket  \MTunderbracket
     }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\dblcolon}
% \begin{macro}{\coloneqq}
% \begin{macro}{\Coloneqq}
% \begin{macro}{\eqqcolon}
%   \pkg{mathtools} defines several commands as combinations of colons and
%   other characters, but with meanings incompatible to \pkg{unicode-math}.
%   Thus we issue a warning.  Because \pkg{mathtools} uses
%   \cmd{\providecommand} \cmd{\AtBeginDocument}, we can just define the
%   offending commands here.
%    \begin{macrocode}
\AtEndOfPackageFile * { mathtools }
  {
    \msg_warning:nn { unicode-math } { mathtools-colon }
    \NewDocumentCommand \dblcolon { } { \Colon }
    \NewDocumentCommand \coloneqq { } { \coloneq }
    \NewDocumentCommand \Coloneqq { } { \Coloneq }
    \NewDocumentCommand \eqqcolon { } { \eqcolon }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \subsection{\pkg{colonequals}}
%
% \begin{macro}{\ratio}
% \begin{macro}{\coloncolon}
% \begin{macro}{\minuscolon}
% \begin{macro}{\colonequals}
% \begin{macro}{\equalscolon}
% \begin{macro}{\coloncolonequals}
%   Similarly to \pkg{mathtools}, the \pkg{colonequals} defines several colon
%   combinations.  Fortunately there are no name clashes, so we can just
%   overwrite their definitions.
%    \begin{macrocode}
\AtEndOfPackageFile * { colonequals }
  {
    \msg_warning:nn { unicode-math } { colonequals }
    \RenewDocumentCommand \ratio { } { \mathratio }
    \RenewDocumentCommand \coloncolon { } { \Colon }
    \RenewDocumentCommand \minuscolon { } { \dashcolon }
    \RenewDocumentCommand \colonequals { } { \coloneq }
    \RenewDocumentCommand \equalscolon { } { \eqcolon }
    \RenewDocumentCommand \coloncolonequals { } { \Coloneq }
  }
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}

\endinput

% /©
%
% ------------------------------------------------
% The UNICODE-MATH package  <wspr.io/unicode-math>
% ------------------------------------------------
% This package is free software and may be redistributed and/or modified under
% the conditions of the LaTeX Project Public License, version 1.3c or higher
% (your choice): <http://www.latex-project.org/lppl/>.
% ------------------------------------------------
% Copyright 2006-2019  Will Robertson, LPPL "maintainer"
% Copyright 2010-2017  Philipp Stephani
% Copyright 2011-2017  Joseph Wright
% Copyright 2012-2015  Khaled Hosny
% ------------------------------------------------
%
% ©/
