diff options
Diffstat (limited to 'macros/latex/contrib/unicode-math/um-code-compat.dtx')
-rw-r--r-- | macros/latex/contrib/unicode-math/um-code-compat.dtx | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/macros/latex/contrib/unicode-math/um-code-compat.dtx b/macros/latex/contrib/unicode-math/um-code-compat.dtx new file mode 100644 index 0000000000..a5f05c81b3 --- /dev/null +++ b/macros/latex/contrib/unicode-math/um-code-compat.dtx @@ -0,0 +1,251 @@ +%%^^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 +% ------------------------------------------------ +% +% ©/ |