diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx | 2416 |
1 files changed, 82 insertions, 2334 deletions
diff --git a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx index 6ed3ad8bb1b..eae42605dc7 100644 --- a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx +++ b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx @@ -5,10 +5,9 @@ % ^^A %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %<*internal> \begingroup -\input l3docstrip.tex -\keepsilent -\let\MetaPrefix\DoubleperCent -\declarepreamble\texpreamble +\input l3docstrip.tex\relax\keepsilent +\declarepreamble\defaultpreamble + Copyright 2006-2017 Will Robertson <will.robertson@latex-project.org> Copyright 2010-2013 Philipp Stephani <st_philipp@yahoo.de> Copyright 2012-2015 Khaled Hosny <khaledhosny@eglug.org> @@ -21,52 +20,43 @@ This work is "maintained" by Will Robertson. \endpreamble \nopostamble \askforoverwritefalse -\let\MetaPrefix\DoubleperCent -\usepreamble\texpreamble -\ifx\UMDEBUG\undefined - \def\UMDEBUG{}% -\else - \def\UMDEBUG{,debug}% -\fi -\generate{\file{unicode-math.sty}{ - \from{unicode-math-preamble.dtx}{preamble\UMDEBUG} - \from{unicode-math-msg.dtx}{msg\UMDEBUG} - \from{unicode-math-usv.dtx}{usv\UMDEBUG} - \from{unicode-math.dtx}{load\UMDEBUG} - \from{unicode-math-alphabets.dtx}{alphabets\UMDEBUG} -}} -\generate{\file{unicode-math-xetex.sty}{ - \from{unicode-math.dtx}{package,XE\UMDEBUG} - \from{unicode-math-epilogue.dtx}{package,XE\UMDEBUG} - \from{unicode-math-compat.dtx}{compat,XE\UMDEBUG} -}} -\generate{\file{unicode-math-luatex.sty}{ - \from{unicode-math.dtx}{package,LU\UMDEBUG} - \from{unicode-math-epilogue.dtx}{package,XE\UMDEBUG} - \from{unicode-math-compat.dtx}{compat,LU\UMDEBUG} -}} -\def\tempa{plain} -\ifx\tempa\fmtname\endgroup\expandafter\bye\fi -\generate{\file{dtx-style.sty}{\from{\jobname.dtx}{dtx-style}}} +\ifx\UMDEBUG\undefined\def\UMDEBUG{}\else\def\UMDEBUG{,debug}\fi +\gdef\DTXFILES{% + \DTX{unicode-math.dtx}% + \DTX{unicode-math-preamble.dtx}% + \DTX{unicode-math-pkgopt.dtx}% + \DTX{unicode-math-msg.dtx}% + \DTX{unicode-math-usv.dtx}% + \DTX{unicode-math-setchar.dtx}% + \DTX{unicode-math-mathtext.dtx}% + \DTX{unicode-math-main.dtx}% + \DTX{unicode-math-fontopt.dtx}% + \DTX{unicode-math-fontparam.dtx}% + \DTX{unicode-math-mathmap.dtx}% + \DTX{unicode-math-mathtext.dtx}% + \DTX{unicode-math-epilogue.dtx}% + \DTX{unicode-math-primes.dtx}% + \DTX{unicode-math-sscript.dtx}% + \DTX{unicode-math-compat.dtx}% + \DTX{unicode-math-alphabets.dtx}% +} +\generate{\file{unicode-math.sty}{\from{unicode-math.dtx}{preamble,load}}} +\def\DTX#1{\from{#1}{package,XE\UMDEBUG}} +\generate{\file{unicode-math-xetex.sty}{\DTXFILES}} +\def\DTX#1{\from{#1}{package,LU\UMDEBUG}} +\generate{\file{unicode-math-luatex.sty}{\DTXFILES}} +\def\tempa{plain}\ifx\tempa\fmtname\endgroup\expandafter\bye\fi \endgroup \ProvidesFile{unicode-math.dtx} %</internal> -%<preamble&!XE&!LU>\ProvidesPackage{unicode-math} -%<preamble&XE>\ProvidesPackage{unicode-math-xetex} -%<preamble&LU>\ProvidesPackage{unicode-math-luatex} -%<*preamble> - [2017/10/02 v0.8g Unicode maths in XeLaTeX and LuaLaTeX] -%</preamble> +%<package&!XE&!LU>\ProvidesPackage{unicode-math} +%<package&XE>\ProvidesPackage{unicode-math-xetex} +%<package&LU>\ProvidesPackage{unicode-math-luatex} +%<*package> + [2017/10/09 v0.8h Unicode maths in XeLaTeX and LuaLaTeX] +%</package> %<*internal> -\def\DOCUMENTEND{F} \input{unicode-math-doc} -\DocInput{unicode-math.dtx} -\DocInput{unicode-math-preamble.dtx} -\DocInput{unicode-math-msg.dtx} -\DocInput{unicode-math-usv.dtx} -\DocInput{unicode-math-alphabets.dtx} -\DocInput{unicode-math-compat.dtx} -\end{document} %</internal> % \fi % @@ -74,2314 +64,72 @@ This work is "maintained" by Will Robertson. % \part{Package implementation} % \parttoc % +% \section{The \texttt{unicode-math.sty} loading file} +% % The prefix for \pkg{unicode-math} is \texttt{um}: % \begin{macrocode} %<@@=um> % \end{macrocode} % +% The plain sty file is a stub which loads necessary packages and then bifurcates into +% a XeTeX- or LuaTeX-specific version of the package. % -% We (later on) bifurcate the package based on the engine being used. -% These separate package files are indicated with the Docstrip flags \textsf{LU} and \textsf{XE}, respectively. -% Shared code executed before loading the engine-specific code is indicated with the flag \textsf{preamble}. % \begin{macrocode} %<*load> -\sys_if_engine_luatex:T { \RequirePackage{unicode-math-luatex} } -\sys_if_engine_xetex:T { \RequirePackage{unicode-math-xetex} } -%</load> -% \end{macrocode} -% -% \section{Bifurcation} -% -% And here the split begins. Most of the code is still shared, but -% code for \LuaTeX\ uses the `\textsf{LU}' flag and code for \XeTeX\ uses `\textsf{XE}'. -% -% \begin{macrocode} -%<*package&(XE|LU)> -\ExplSyntaxOn -% \end{macrocode} -% -% \subsection{Engine differences} -% -% \XeTeX\ before version 0.9999 did not support |\U| prefix for extended math -% primitives, and while \LuaTeX\ had it from the start, prior 0.75.0 the -% \LaTeX\ format did not provide them without the |\luatex| prefix. -% We assume that users of \pkg{unicode-math} are using up-to-date engines however. -% -% \begin{macrocode} -%<*LU> -\RequirePackage{luaotfload} [2014/05/18] -\RequirePackage{lualatex-math}[2011/08/07] -%</LU> -% \end{macrocode} -% -% -% -% \section{Fundamentals} -% -% \subsection{Setting math chars, math codes, etc.} -% -% \begin{macro}{\@@_set_mathsymbol:nNNn} -% \darg{A \LaTeX\ symbol font, e.g., \texttt{operators}} -% \darg{Symbol macro, \eg, \cmd\alpha} -% \darg{Type, \eg, \cmd\mathalpha} -% \darg{Slot, \eg, \texttt{"221E}} -% There are a bunch of tests to perform to process the various characters. -% The following assignments should all be fairly straightforward. -% -% The catcode setting is to work around (strange?) behaviour in LuaTeX in which catcode 11 characters don't have italic correction for maths. -% We don't adjust ascii chars, however, because certain punctuation should not have their catcodes changed. -% \begin{macrocode} -\cs_set:Nn \@@_set_mathsymbol:nNNn - { - \bool_lazy_and:nnT - { - \int_compare_p:nNn {#4} > {127} - } - { - \int_compare_p:nNn { \char_value_catcode:n {#4} } = {11} - } - { \char_set_catcode_other:n {#4} } - - \tl_case:Nn #3 - { - \mathord { \@@_set_mathcode:nnn {#4} {#3} {#1} } - \mathalpha { \@@_set_mathcode:nnn {#4} {#3} {#1} } - \mathbin { \@@_set_mathcode:nnn {#4} {#3} {#1} } - \mathrel { \@@_set_mathcode:nnn {#4} {#3} {#1} } - \mathpunct { \@@_set_mathcode:nnn {#4} {#3} {#1} } - \mathop { \@@_set_big_operator:nnn {#1} {#2} {#4} } - \mathopen { \@@_set_math_open:nnn {#1} {#2} {#4} } - \mathclose { \@@_set_math_close:nnn {#1} {#2} {#4} } - \mathfence { \@@_set_math_fence:nnnn {#1} {#2} {#3} {#4} } - \mathaccent - { \@@_set_math_accent:Nnnn #2 {fixed} {#1} {#4} } - \mathbotaccent - { \@@_set_math_accent:Nnnn #2 {bottom~ fixed} {#1} {#4} } - \mathaccentwide - { \@@_set_math_accent:Nnnn #2 {} {#1} {#4} } - \mathbotaccentwide - { \@@_set_math_accent:Nnnn #2 {bottom} {#1} {#4} } - \mathover - { \@@_set_math_overunder:Nnnn #2 {} {#1} {#4} } - \mathunder - { \@@_set_math_overunder:Nnnn #2 {bottom} {#1} {#4} } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\edef\mathfence{\string\mathfence} -\edef\mathover{\string\mathover} -\edef\mathunder{\string\mathunder} -\edef\mathbotaccent{\string\mathbotaccent} -\edef\mathaccentwide{\string\mathaccentwide} -\edef\mathbotaccentwide{\string\mathbotaccentwide} -% \end{macrocode} -% -% -% \begin{macro}{\@@_set_big_operator:nnn} -% \darg{Symbol font name} -% \darg{Macro to assign} -% \darg{Glyph slot} -% In the examples following, say we're defining for the symbol \cmd\sum\ ($\sum$). -% In order for literal Unicode characters to be used in the source and still -% have the correct limits behaviour, big operators are made math-active. -% This involves three steps: -% \begin{itemize} -% \item -% The active math char is defined to expand to the macro \cs{sum_sym}. -% (Later, the control sequence \cs{sum} will be assigned the math char.) -% \item -% Declare the plain old mathchardef for the control sequence \cmd\sumop. -% (This follows the convention of \LaTeX/\pkg{amsmath}.) -% \item -% Define \cs{sum_sym} as \cmd\sumop, followed by \cmd\nolimits\ if necessary. -% \end{itemize} -% Whether the \cmd\nolimits\ suffix is inserted is controlled by the -% token list \cs{l_@@_nolimits_tl}, which contains a list of such characters. -% This list is checked dynamically to allow it to be updated mid-document. -% -% Examples of expansion, by default, for two big operators: -% \begin{quote} -% (~\cs{sum} $\to$~) $\sum$ $\to$ \cs{sum_sym} $\to$ \cs{sumop}\cs{nolimits}\par -% (~\cs{int} $\to$~) $\int$ $\to$ \cs{int_sym} $\to$ \cs{intop} -% \end{quote} -% \begin{macrocode} -\cs_new:Nn \@@_set_big_operator:nnn - { - \@@_char_gmake_mathactive:n {#3} - \cs_set_protected_nopar:Npx \@@_tmpa: { \exp_not:c { \cs_to_str:N #2 _sym } } - \char_gset_active_eq:nN {#3} \@@_tmpa: - - \@@_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3} - - \cs_gset:cpx { \cs_to_str:N #2 _sym } - { - \exp_not:c { \cs_to_str:N #2 op } - \exp_not:n { \tl_if_in:NnT \l_@@_nolimits_tl {#2} \nolimits } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_math_open:nnn} -% \darg{Symbol font name} -% \darg{Macro to assign} -% \darg{Glyph slot} -% \begin{macrocode} -\cs_new:Nn \@@_set_math_open:nnn - { - \tl_if_in:NnTF \l_@@_radicals_tl {#2} - { - \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} - { \@@_radical:nn {#1} {#3} } - \tl_set:cn {l_@@_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #3} - } - { - \@@_set_delcode:nnn {#1} {#3} {#3} - \@@_set_mathcode:nnn {#3} \mathopen {#1} - \cs_gset_protected_nopar:Npx #2 - { \@@_delimiter:Nnn \mathopen {#1} {#3} } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_math_close:nnn} -% \darg{Symbol font name} -% \darg{Macro to assign} -% \darg{Glyph slot} -% \begin{macrocode} -\cs_new:Nn \@@_set_math_close:nnn - { - \@@_set_delcode:nnn {#1} {#3} {#3} - \@@_set_mathcode:nnn {#3} \mathclose {#1} - \cs_gset_protected_nopar:Npx #2 - { \@@_delimiter:Nnn \mathclose {#1} {#3} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_math_fence:nnnn} -% \darg{Symbol font name} -% \darg{Macro to assign} -% \darg{Type, \eg, \cmd\mathalpha} -% \darg{Glyph slot} -% \begin{macrocode} -\cs_new:Nn \@@_set_math_fence:nnnn - { - \@@_set_mathcode:nnn {#4} {#3} {#1} - \@@_set_delcode:nnn {#1} {#4} {#4} - \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} - { \@@_delimiter:Nnn \mathopen {#1} {#4} } - \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} - { \@@_delimiter:Nnn \mathclose {#1} {#4} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_math_accent:Nnnn} -% \darg{Accend command} -% \darg{Accent type (string)} -% \darg{Symbol font name} -% \darg{Glyph slot} -% \begin{macrocode} -\cs_new:Nn \@@_set_math_accent:Nnnn - { - \cs_gset_protected_nopar:Npx #1 - { \@@_accent:nnn {#2} {#3} {#4} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_math_overunder:Nnnn} -% \darg{Accend command} -% \darg{Accent type (string)} -% \darg{Symbol font name} -% \darg{Glyph slot} -% \begin{macrocode} -\cs_new:Nn \@@_set_math_overunder:Nnnn - { - \cs_gset_protected_nopar:Npx #1 ##1 - { - \mathop - { \@@_accent:nnn {#2} {#3} {#4} {##1} } - \limits - } - } -% \end{macrocode} -% \end{macro} -% -% \subsection{\cs{setmathalphabet}} -% -% \begin{macro}{\setmathalphabet} -% \begin{macrocode} -\keys_define:nn {@@_mathface} - { - version .code:n = - { \tl_set:Nn \l_@@_mversion_tl {#1} } - } - -\DeclareDocumentCommand \setmathfontface { m O{} m O{} } - { - \tl_clear:N \l_@@_mversion_tl - - \keys_set_known:nnN {@@_mathface} {#2,#4} \l_@@_keyval_clist - \exp_args:Nnx \fontspec_set_family:Nxn \l_@@_tmpa_tl - { ItalicFont={}, BoldFont={}, \exp_not:V \l_@@_keyval_clist } {#3} - - \tl_if_empty:NT \l_@@_mversion_tl - { - \tl_set:Nn \l_@@_mversion_tl {normal} - \DeclareMathAlphabet #1 {\g_fontspec_encoding_tl} {\l_@@_tmpa_tl} {\mddefault} {\updefault} - } - \SetMathAlphabet #1 {\l_@@_mversion_tl} {\g_fontspec_encoding_tl} {\l_@@_tmpa_tl} {\mddefault} {\updefault} - - % integrate with fontspec's \setmathrm etc: - \tl_case:Nn #1 - { - \mathrm { \cs_set_eq:NN \g__fontspec_mathrm_tl \l_@@_tmpa_tl } - \mathsf { \cs_set_eq:NN \g__fontspec_mathsf_tl \l_@@_tmpa_tl } - \mathtt { \cs_set_eq:NN \g__fontspec_mathtt_tl \l_@@_tmpa_tl } - } - } - -\@onlypreamble \setmathfontface -% \end{macrocode} -% Note that \LaTeX's SetMathAlphabet simply doesn't work to "reset" a maths alphabet font after \verb"\begin{document}", so unlike most of the other maths commands around we still restrict this one to the preamble. -% \end{macro} -% -% \begin{macro}{\setoperatorfont} -% TODO: add check? -% \begin{macrocode} -\DeclareDocumentCommand \setoperatorfont {m} - { \tl_set:Nn \g_@@_operator_mathfont_tl {#1} } -\setoperatorfont{\mathrm} % \end{macrocode} -% \end{macro} -% -% \subsection{Hooks into \pkg{fontspec}} -% -% Historically, \cs{mathrm} and so on were completely overwritten by \pkg{unicode-math}, and \pkg{fontspec}'s methods for setting these fonts in the classical manner were bypassed. -% -% While we could now re-activate the way that \pkg{fontspec} does the following, because we can now change maths fonts whenever it's better to define new commands in \pkg{unicode-math} to define the \cs{mathXYZ} fonts. -% -% \subsubsection{Text font} -% \begin{macrocode} -\cs_generate_variant:Nn \tl_if_eq:nnT {o} -\cs_set:Nn \__fontspec_setmainfont_hook:nn - { - \tl_if_eq:onT {\g__fontspec_mathrm_tl} {\rmdefault} - { -%<XE> \fontspec_set_family:Nnn \g__fontspec_mathrm_tl {#1} {#2} -%<LU> \fontspec_set_family:Nnn \g__fontspec_mathrm_tl {Renderer=Basic,#1} {#2} - \SetMathAlphabet\mathrm{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault - \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault - \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\updefault - } - } - -\cs_set:Nn \__fontspec_setsansfont_hook:nn - { - \tl_if_eq:onT {\g__fontspec_mathsf_tl} {\sfdefault} - { -%<XE> \fontspec_set_family:Nnn \g__fontspec_mathsf_tl {#1} {#2} -%<LU> \fontspec_set_family:Nnn \g__fontspec_mathsf_tl {Renderer=Basic,#1} {#2} - \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\updefault - \SetMathAlphabet\mathsf{bold} \g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\updefault - } - } - -\cs_set:Nn \__fontspec_setmonofont_hook:nn - { - \tl_if_eq:onT {\g__fontspec_mathtt_tl} {\ttdefault} - { -%<XE> \fontspec_set_family:Nnn \g__fontspec_mathtt_tl {#1} {#2} -%<LU> \fontspec_set_family:Nnn \g__fontspec_mathtt_tl {Renderer=Basic,#1} {#2} - \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\updefault - \SetMathAlphabet\mathtt{bold} \g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\updefault - } - } -% \end{macrocode} -% -% \subsubsection{Maths font} -% If the maths fonts are set explicitly, then the text commands above will not execute their branches to set the maths font alphabets. -% \begin{macrocode} -\cs_set:Nn \__fontspec_setmathrm_hook:nn - { - \SetMathAlphabet\mathrm{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\updefault - \SetMathAlphabet\mathit{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\mddefault\itdefault - \SetMathAlphabet\mathbf{normal}\g_fontspec_encoding_tl\g__fontspec_mathrm_tl\bfdefault\updefault - } -\cs_set:Nn \__fontspec_setboldmathrm_hook:nn - { - \SetMathAlphabet\mathrm{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\updefault - \SetMathAlphabet\mathbf{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\bfdefault\updefault - \SetMathAlphabet\mathit{bold}\g_fontspec_encoding_tl\g__fontspec_bfmathrm_tl\mddefault\itdefault - } -\cs_set:Nn \__fontspec_setmathsf_hook:nn - { - \SetMathAlphabet\mathsf{normal}\g_fontspec_encoding_tl\g__fontspec_mathsf_tl\mddefault\updefault - \SetMathAlphabet\mathsf{bold} \g_fontspec_encoding_tl\g__fontspec_mathsf_tl\bfdefault\updefault - } -\cs_set:Nn \__fontspec_setmathtt_hook:nn - { - \SetMathAlphabet\mathtt{normal}\g_fontspec_encoding_tl\g__fontspec_mathtt_tl\mddefault\updefault - \SetMathAlphabet\mathtt{bold} \g_fontspec_encoding_tl\g__fontspec_mathtt_tl\bfdefault\updefault - } -% \end{macrocode} -% -% -% \subsection{The main \cs{setmathfont} macro} -% -% Using a |range| including large character sets such as \cmd\mathrel, -% \cmd\mathalpha, \etc, is \emph{very slow}! -% I hope to improve the performance somehow. -% -% \begin{macro}{\setmathfont} -% \doarg{font features (first optional argument retained for backwards compatibility)} -% \darg{font name} -% \doarg{font features} -% \begin{macrocode} -\DeclareDocumentCommand \setmathfont { O{} m O{} } - { - \@@_setmathfont:nn {#1,#3} {#2} - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_set:Nn \@@_setmathfont:nn - { - \tl_set:Nn \l_@@_fontname_tl {#2} - \@@_init: -% \end{macrocode} -% Grab the current size information: -% (is this robust enough? Maybe it should be preceded by \cmd\normalsize). -% The macro \cmd\S@\meta{size} -% contains the definitions of the sizes used for maths letters, subscripts and subsubscripts in -% \cmd\tf@size, \cmd\sf@size, and \cmd\ssf@size, respectively. -% \begin{macrocode} - \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes } - \csname S@\f@size\endcsname -% \end{macrocode} -% Parse options and tell people what's going on: -% \begin{macrocode} - \keys_set_known:nnN {unicode-math} {#1} \l_@@_unknown_keys_clist - \bool_if:NT \l_@@_init_bool { \@@_log:n {default-math-font} } -% \end{macrocode} -% Use \pkg{fontspec} to select a font to use. -% After loading the font, we detect what sizes it recommends for scriptsize and scriptscriptsize, so after setting those values appropriately, we reload the font to take these into account. -% \begin{macrocode} - -%<debug> \csname TIC\endcsname - \@@_fontspec_select_font: -%<debug> \csname TOC\endcsname - \bool_if:nT { \l_@@_ot_math_bool && !\g_@@_mainfont_already_set_bool } - { - \@@_declare_math_sizes: - \@@_fontspec_select_font: - } -% \end{macrocode} -% Now define |\@@_symfont_tl| as the \LaTeX\ math font to access everything: -% \begin{macrocode} - \cs_if_exist:cF { sym \@@_symfont_tl } - { - \DeclareSymbolFont{\@@_symfont_tl} - {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault} - } - \SetSymbolFont{\@@_symfont_tl}{\l_@@_mversion_tl} - {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault} -% \end{macrocode} -% Set the bold math version. -% \begin{macrocode} - \tl_set:Nn \l_@@_tmpa_tl {normal} - \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl - { - \SetSymbolFont{\@@_symfont_tl}{bold} - {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault} - } -% \end{macrocode} -% Declare the math sizes (i.e., scaling of superscripts) for the specific -% values for this font, -% and set defaults for math fams two and three for legacy compatibility: -% \begin{macrocode} - \bool_if:nT { \l_@@_ot_math_bool && !\g_@@_mainfont_already_set_bool } - { - \bool_set_true:N \g_@@_mainfont_already_set_bool - \@@_setup_legacy_fam_two: - \@@_setup_legacy_fam_three: - } -% \end{macrocode} -% And now we input every single maths char. -% \begin{macrocode} -%<debug> \csname TIC\endcsname - \@@_input_math_symbol_table: -%<debug> \csname TOC\endcsname -% \end{macrocode} -% Finally, -% \begin{itemize} -% \item Remap symbols that don't take their natural mathcode -% \item Activate any symbols that need to be math-active -% \item Enable wide/narrow accents -% \item Assign delimiter codes for symbols that need to grow -% \item Setup the maths alphabets (\cs{mathbf} etc.) -% \end{itemize} -% \begin{macrocode} - \@@_remap_symbols: - \@@_setup_mathactives: - \@@_setup_delcodes: -%<debug> \csname TIC\endcsname - \@@_setup_alphabets: -%<debug> \csname TOC\endcsname - \@@_setup_negations: -% \end{macrocode} -% Prevent spaces, and that's it: -% \begin{macrocode} - \ignorespaces - } -% \end{macrocode} -% \end{macro} -% -% Backward compatibility alias. -% \begin{macrocode} -\cs_set_eq:NN \resetmathfont \setmathfont -% \end{macrocode} -% -% \begin{macro}{\@@_init:} -% \begin{macrocode} -\cs_new:Nn \@@_init: - { -% \end{macrocode} -% \begin{itemize} -% \item Initially assume we're using a proper OpenType font with unicode maths. -% \begin{macrocode} - \bool_set_true:N \l_@@_ot_math_bool -% \end{macrocode} -% \item Erase any conception \LaTeX\ has of previously defined math symbol fonts; -% this allows \cmd\DeclareSymbolFont\ at any point in the document. -% \begin{macrocode} - \cs_set_eq:NN \glb@currsize \scan_stop: -% \end{macrocode} -% \item To start with, assume we're defining the font for every math symbol character. -% \begin{macrocode} - \bool_set_true:N \l_@@_init_bool - \seq_clear:N \l_@@_char_range_seq - \clist_clear:N \l_@@_char_nrange_clist - \seq_clear:N \l_@@_mathalph_seq - \seq_clear:N \l_@@_missing_alph_seq -% \end{macrocode} -% \item By default use the `normal' math version. -% \begin{macrocode} - \tl_set:Nn \l_@@_mversion_tl {normal} -% \end{macrocode} -% \item Other range initialisations. -% \begin{macrocode} - \tl_set:Nn \@@_symfont_tl {operators} - \cs_set_eq:NN \_@@_sym:nnn \@@_process_symbol_noparse:nnn - \cs_set_eq:NN \@@_set_mathalphabet_char:nnn \@@_mathmap_noparse:nnn - \cs_set_eq:NN \@@_remap_symbol:nnn \@@_remap_symbol_noparse:nnn - \cs_set_eq:NN \@@_maybe_init_alphabet:n \@@_init_alphabet:n - \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_noparse:nn - \cs_set_eq:NN \@@_assign_delcode:nn \@@_assign_delcode_noparse:nn - \cs_set_eq:NN \@@_make_mathactive:nNN \@@_make_mathactive_noparse:nNN -% \end{macrocode} -% \item Define default font features for the script and scriptscript font. -% \begin{macrocode} - \tl_set:Nn \l_@@_script_features_tl {Style=MathScript} - \tl_set:Nn \l_@@_sscript_features_tl {Style=MathScriptScript} - \tl_set_eq:NN \l_@@_script_font_tl \l_@@_fontname_tl - \tl_set_eq:NN \l_@@_sscript_font_tl \l_@@_fontname_tl -% \end{macrocode} -% \end{itemize} -% \begin{macrocode} - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_declare_math_sizes:} -% Set the math sizes according to the recommended font parameters: -% \begin{macrocode} -\cs_new:Nn \@@_declare_math_sizes: - { -%<*LU> - \fp_compare:nF { \@@_script_style_size:n {ScriptPercentScaleDown} == 0 } - { - \DeclareMathSizes { \f@size } { \f@size } - { \@@_script_style_size:n {ScriptPercentScaleDown} } - { \@@_script_style_size:n {ScriptScriptPercentScaleDown} } - } -%</LU> -%<*XE> - \dim_compare:nF { \fontdimen 10 \l_@@_font == 0pt } - { - \DeclareMathSizes { \f@size } { \f@size } - { \@@_fontdimen_to_scale:nn {10} {\l_@@_font} } - { \@@_fontdimen_to_scale:nn {11} {\l_@@_font} } - } -%</XE> - } -% \end{macrocode} -% \end{macro} -% -%<*LU> -% \begin{macro}{\@@_script_style_size:n} -% Determine script- and scriptscriptstyle sizes using luaotfload: -% \begin{macrocode} -\cs_new:Nn \@@_script_style_size:n - { - \fp_eval:n {\directlua{tex.sprint(luaotfload.aux.get_math_dimension("l_@@_font","#1"))} * \f@size / 100 } - } -% \end{macrocode} -% \end{macro} -%</LU> -% -% -% \begin{macro}{\@@_setup_legacy_fam_two:} -% \TeX\ won't load the same font twice at the same scale, so we need to magnify this one by an imperceptable amount. -% \begin{macrocode} -\cs_new:Nn \@@_setup_legacy_fam_two: - { - \fontspec_set_family:Nxn \l_@@_family_tl - { - \l_@@_font_keyval_tl, - Scale=1.00001, - FontAdjustment = - { - \fontdimen8\font= \@@_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax - \fontdimen9\font= \@@_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax - \fontdimen10\font=\@@_get_fontparam:nn {32} {StackTopShiftUp}\relax - \fontdimen11\font=\@@_get_fontparam:nn {45} {FractionDenominatorDisplayStyleShiftDown}\relax - \fontdimen12\font=\@@_get_fontparam:nn {44} {FractionDenominatorShiftDown}\relax - \fontdimen13\font=\@@_get_fontparam:nn {21} {SuperscriptShiftUp}\relax - \fontdimen14\font=\@@_get_fontparam:nn {21} {SuperscriptShiftUp}\relax - \fontdimen15\font=\@@_get_fontparam:nn {22} {SuperscriptShiftUpCramped}\relax - \fontdimen16\font=\@@_get_fontparam:nn {18} {SubscriptShiftDown}\relax - \fontdimen17\font=\@@_get_fontparam:nn {18} {SubscriptShiftDownWithSuperscript}\relax - \fontdimen18\font=\@@_get_fontparam:nn {24} {SuperscriptBaselineDropMax}\relax - \fontdimen19\font=\@@_get_fontparam:nn {20} {SubscriptBaselineDropMin}\relax - \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize - \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize - \fontdimen22\font=\@@_get_fontparam:nn {15} {AxisHeight}\relax - } - } {\l_@@_fontname_tl} - \SetSymbolFont{symbols}{\l_@@_mversion_tl} - {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault} - - \tl_set:Nn \l_@@_tmpa_tl {normal} - \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl - { - \SetSymbolFont{symbols}{bold} - {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_setup_legacy_fam_three:} -% Similarly, this font is shrunk by an imperceptable amount for \TeX\ to load it again. -% \begin{macrocode} -\cs_new:Nn \@@_setup_legacy_fam_three: - { - \fontspec_set_family:Nxn \l_@@_family_tl - { - \l_@@_font_keyval_tl, - Scale=0.99999, - FontAdjustment={ - \fontdimen8\font= \@@_get_fontparam:nn {48} {FractionRuleThickness}\relax - \fontdimen9\font= \@@_get_fontparam:nn {28} {UpperLimitGapMin}\relax - \fontdimen10\font=\@@_get_fontparam:nn {30} {LowerLimitGapMin}\relax - \fontdimen11\font=\@@_get_fontparam:nn {29} {UpperLimitBaselineRiseMin}\relax - \fontdimen12\font=\@@_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax - \fontdimen13\font=0pt\relax - } - } {\l_@@_fontname_tl} - \SetSymbolFont{largesymbols}{\l_@@_mversion_tl} - {\encodingdefault}{\l_@@_family_tl}{\mddefault}{\updefault} - - \tl_set:Nn \l_@@_tmpa_tl {normal} - \tl_if_eq:NNT \l_@@_mversion_tl \l_@@_tmpa_tl - { - \SetSymbolFont{largesymbols}{bold} - {\encodingdefault}{\l_@@_family_tl}{\bfdefault}{\updefault} - } - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macrocode} -\cs_new:Nn \@@_get_fontparam:nn -%<XE> { \the\fontdimen#1\l_@@_font\relax } -%<LU> { \directlua{fontspec.mathfontdimen("l_@@_font","#2")} } -% \end{macrocode} -% -% -% -% \begin{macro}{\@@_fontspec_select_font:} -% Select the font with \cs{fontspec} and define \cs{l_@@_font} from it. -% \begin{macrocode} -\cs_new:Nn \@@_fontspec_select_font: - { - \tl_set:Nx \l_@@_font_keyval_tl { -%<LU> Renderer = Basic, - BoldItalicFont = {}, ItalicFont = {}, - Script = Math, - SizeFeatures = - { - { - Size = \tf@size- - } , - { - Size = \sf@size-\tf@size , - Font = \l_@@_script_font_tl , - \l_@@_script_features_tl - } , - { - Size = -\sf@size , - Font = \l_@@_sscript_font_tl , - \l_@@_sscript_features_tl - } - } , - \l_@@_unknown_keys_clist - } - \fontspec_set_fontface:NNxn \l_@@_font \l_@@_family_tl - {\l_@@_font_keyval_tl} {\l_@@_fontname_tl} -% \end{macrocode} -% Check whether we're using a real maths font: -% \begin{macrocode} - \group_begin: - \fontfamily{\l_@@_family_tl}\selectfont - \fontspec_if_script:nF {math} {\bool_gset_false:N \l_@@_ot_math_bool} - \group_end: - } -% \end{macrocode} -% \end{macro} -% -% -% \subsubsection{Functions for setting up symbols with mathcodes} -% \seclabel{mathsymbol} -% -% \begin{macro}{\@@_process_symbol_noparse:nnn} -% \begin{macro}{\@@_process_symbol_parse:nnn} -% If the \feat{range} font feature has been used, then only -% a subset of the Unicode glyphs are to be defined. -% See \secref{rangeproc} for the code that enables this. -% \begin{macrocode} -\cs_set:Nn \@@_process_symbol_noparse:nnn - { - \@@_set_mathsymbol:nNNn {\@@_symfont_tl} #2 #3 {#1} - } -% \end{macrocode} -% \begin{macrocode} -\cs_set:Nn \@@_process_symbol_parse:nnn - { - \@@_if_char_spec:nNNT {#1} {#2} {#3} - { - \@@_process_symbol_noparse:nnn {#1} {#2} {#3} - } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \begin{macro}{\@@_remap_symbols:} -% \begin{macro}{\@@_remap_symbol_noparse:nnn} -% \begin{macro}{\@@_remap_symbol_parse:nnn} -% This function is used to define the mathcodes for those chars which should -% be mapped to a different glyph than themselves. -% \begin{macrocode} -\cs_new:Npn \@@_remap_symbols: - { - \@@_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus - \@@_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk" - \bool_if:NF \g_@@_literal_colon_bool - { - \@@_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel) - } - } -% \end{macrocode} -% \end{macro} -% Where |\@@_remap_symbol:nnn| is defined to be one of these two, depending -% on the range setup: -% \begin{macrocode} -\cs_new:Nn \@@_remap_symbol_parse:nnn - { - \@@_if_char_spec:nNNT {#3} {\@nil} {#2} - { \@@_remap_symbol_noparse:nnn {#1} {#2} {#3} } - } -\cs_new:Nn \@@_remap_symbol_noparse:nnn - { - \clist_map_inline:nn {#1} - { \@@_set_mathcode:nnnn {##1} {#2} {\@@_symfont_tl} {#3} } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \subsubsection{Active math characters} -% -% There are more math active chars later in the subscript/superscript section. -% But they don't need to be able to be typeset directly. -% -% \begin{macro}{\@@_setup_mathactives:} -% \begin{macrocode} -\cs_new:Npn \@@_setup_mathactives: - { - \@@_make_mathactive:nNN {"2032} \@@_prime_single_mchar \mathord - \@@_make_mathactive:nNN {"2033} \@@_prime_double_mchar \mathord - \@@_make_mathactive:nNN {"2034} \@@_prime_triple_mchar \mathord - \@@_make_mathactive:nNN {"2057} \@@_prime_quad_mchar \mathord - \@@_make_mathactive:nNN {"2035} \@@_backprime_single_mchar \mathord - \@@_make_mathactive:nNN {"2036} \@@_backprime_double_mchar \mathord - \@@_make_mathactive:nNN {"2037} \@@_backprime_triple_mchar \mathord - \@@_make_mathactive:nNN {`\'} \mathstraightquote \mathord - \@@_make_mathactive:nNN {`\`} \mathbacktick \mathord - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_make_mathactive:nNN} -% Makes |#1| a mathactive char, and gives cs |#2| the meaning of mathchar |#1| -% with class |#3|. -% You are responsible for giving active |#1| a particular meaning! -% \begin{macrocode} -\cs_new:Nn \@@_make_mathactive_parse:nNN - { - \@@_if_char_spec:nNNT {#1} #2 #3 - { \@@_make_mathactive_noparse:nNN {#1} #2 #3 } - } -\cs_new:Nn \@@_make_mathactive_noparse:nNN - { - \@@_set_mathchar:NNnn #2 #3 {\@@_symfont_tl} {#1} - \@@_char_gmake_mathactive:n {#1} - } -% \end{macrocode} -% \end{macro} -% -% \subsubsection{Delimiter codes} -% -% -% \begin{macro}{\@@_assign_delcode:nn} -% \begin{macrocode} -\cs_new:Nn \@@_assign_delcode_noparse:nn - { - \@@_set_delcode:nnn \@@_symfont_tl {#1} {#2} - } -\cs_new:Nn \@@_assign_delcode_parse:nn - { - \@@_if_char_spec:nNNT {#2} {\@nil} {\@nil} - { - \@@_assign_delcode_noparse:nn {#1} {#2} - } - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_assign_delcode:n} -% Shorthand. -% \begin{macrocode} -\cs_new:Nn \@@_assign_delcode:n { \@@_assign_delcode:nn {#1} {#1} } -% \end{macrocode} -% \end{macro} -% -% -% -% \begin{macro}{\@@_setup_delcodes:} -% Some symbols that aren't mathopen/mathclose still need to have delimiter codes assigned. -% The list of vertical arrows may be incomplete. -% On the other hand, many fonts won't support them all being stretchy. -% And some of them are probably not meant to stretch, either. But adding them here doesn't hurt. -% \begin{macrocode} -\cs_new:Npn \@@_setup_delcodes: - { - % ensure \left. and \right. work: - \@@_set_delcode:nnn \@@_symfont_tl {`\.} {\c_zero} - % this is forcefully done to fix a bug -- indicates a larger problem! - - \@@_assign_delcode:nn {`\/} {\g_@@_slash_delimiter_usv} - \@@_assign_delcode:nn {"2044} {\g_@@_slash_delimiter_usv} % fracslash - \@@_assign_delcode:nn {"2215} {\g_@@_slash_delimiter_usv} % divslash - \@@_assign_delcode:n {"005C} % backslash - \@@_assign_delcode:nn {`\<} {"27E8} % angle brackets with ascii notation - \@@_assign_delcode:nn {`\>} {"27E9} % angle brackets with ascii notation - \@@_assign_delcode:n {"2191} % up arrow - \@@_assign_delcode:n {"2193} % down arrow - \@@_assign_delcode:n {"2195} % updown arrow - \@@_assign_delcode:n {"219F} % up arrow twohead - \@@_assign_delcode:n {"21A1} % down arrow twohead - \@@_assign_delcode:n {"21A5} % up arrow from bar - \@@_assign_delcode:n {"21A7} % down arrow from bar - \@@_assign_delcode:n {"21A8} % updown arrow from bar - \@@_assign_delcode:n {"21BE} % up harpoon right - \@@_assign_delcode:n {"21BF} % up harpoon left - \@@_assign_delcode:n {"21C2} % down harpoon right - \@@_assign_delcode:n {"21C3} % down harpoon left - \@@_assign_delcode:n {"21C5} % arrows up down - \@@_assign_delcode:n {"21F5} % arrows down up - \@@_assign_delcode:n {"21C8} % arrows up up - \@@_assign_delcode:n {"21CA} % arrows down down - \@@_assign_delcode:n {"21D1} % double up arrow - \@@_assign_delcode:n {"21D3} % double down arrow - \@@_assign_delcode:n {"21D5} % double updown arrow - \@@_assign_delcode:n {"21DE} % up arrow double stroke - \@@_assign_delcode:n {"21DF} % down arrow double stroke - \@@_assign_delcode:n {"21E1} % up arrow dashed - \@@_assign_delcode:n {"21E3} % down arrow dashed - \@@_assign_delcode:n {"21E7} % up white arrow - \@@_assign_delcode:n {"21E9} % down white arrow - \@@_assign_delcode:n {"21EA} % up white arrow from bar - \@@_assign_delcode:n {"21F3} % updown white arrow - } -% \end{macrocode} -% \end{macro} -% -% -% -% -% \subsection{(Big) operators} -% -% Turns out that \XeTeX\ is clever enough to deal with big operators for us -% automatically with \cmd\Umathchardef. Amazing! -% -% However, the limits aren't set automatically; that is, we want to define, -% a la Plain \TeX\ \etc, |\def\int{\intop\nolimits}|, so there needs to be a -% transformation from \cmd\int\ to \cmd\intop\ during the expansion of -% \cmd\_@@_sym:nnn\ in the appropriate contexts. -% -% \begin{macro}{\l_@@_nolimits_tl} -% This macro is a sequence containing those maths operators that require a -% \cmd\nolimits\ suffix. -% This list is used when processing |unicode-math-table.tex| to define such -% commands automatically (see the macro \cs{@@_set_mathsymbol:nNNn}). -% I've chosen essentially just the operators that look like integrals; -% hopefully a better mathematician can help me out here. -% I've a feeling that it's more useful \emph{not} to include the multiple -% integrals such as $\iiiint$, but that might be a matter of preference. -% \begin{macrocode} -\tl_new:N \l_@@_nolimits_tl -\tl_set:Nn \l_@@_nolimits_tl - { - \int\iint\iiint\iiiint\oint\oiint\oiiint - \intclockwise\varointclockwise\ointctrclockwise\sumint - \intbar\intBar\fint\cirfnint\awint\rppolint - \scpolint\npolint\pointint\sqint\intlarhk\intx - \intcap\intcup\upint\lowint - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\addnolimits} -% This macro appends material to the macro containing the list of operators -% that don't take limits. -% \begin{macrocode} -\DeclareDocumentCommand \addnolimits {m} - { - \tl_put_right:Nn \l_@@_nolimits_tl {#1} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\removenolimits} -% Can this macro be given a better name? -% It removes an item from the nolimits list. -% \begin{macrocode} -\DeclareDocumentCommand \removenolimits {m} - { - \tl_remove_all:Nn \l_@@_nolimits_tl {#1} - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Radicals} -% -% The radical for square root is organised in \cs{@@_set_mathsymbol:nNNn}. -% I think it's the only radical ever. -% (Actually, there is also \cs{cuberoot} and \cs{fourthroot}, but they don't -% seem to behave as proper radicals.) -% -% Also, what about right-to-left square roots? -% -% \begin{macro}{\l_@@_radicals_tl} -% We organise radicals in the same way as nolimits-operators. -% \begin{macrocode} -\tl_new:N \l_@@_radicals_tl -\tl_set:Nn \l_@@_radicals_tl {\sqrt \longdivision} -% \end{macrocode} -% \end{macro} -% -% \subsection{Maths accents} -% -% Maths accents should just work \emph{if they are available in the font}. -% -% \subsection{Common interface for font parameters} -% -% \XeTeX\ and \LuaTeX\ have different interfaces for math font parameters. -% We use \LuaTeX’s interface because it’s much better, but rename the primitives to be more \LaTeX3-like. -% There are getter and setter commands for each font parameter. -% The names of the parameters is derived from the \LuaTeX\ names, with underscores inserted between words. -% For every parameter \cs{Umath\meta{\LuaTeX\ name}}, we define an expandable getter command \cs{@@_\meta{\LaTeX3 name}:N} and a protected setter command \cs{@@_set_\meta{\LaTeX3 name}:Nn}. -% The getter command takes one of the style primitives (\cs{displaystyle} etc.)\ and expands to the font parameter, which is a \meta{dimension}. -% The setter command takes a style primitive and a dimension expression, which is parsed with \cs{dim_eval:n}. -% -% Often, the mapping between font dimensions and font parameters is bijective, but there are cases which require special attention: -% \begin{itemize} -% \item Some parameters map to different dimensions in display and non-display styles. -% \item Likewise, one parameter maps to different dimensions in non-cramped and cramped styles. -% \item There are a few parameters for which \XeTeX\ doesn’t seem to provide \cs{fontdimen}s; in this case the getter and setter commands are left undefined. -% \end{itemize} -% -% \paragraph{Cramped style tokens} -% \LuaTeX\ has \cs{crampeddisplaystyle} etc.,\ but they are loaded as \cs{luatexcrampeddisplaystyle} etc.\ by the \pkg{luatextra} package. -% \XeTeX, however, doesn’t have these primitives, and their syntax cannot really be emulated. -% Nevertheless, we define these commands as quarks, so they can be used as arguments to the font parameter commands (but nowhere else). -% Making these commands available is necessary because we need to make a distinction between cramped and non-cramped styles for one font parameter. -% -% \begin{macro}{\@@_new_cramped_style:N} -% \darg{command} -% Define \meta{command} as a new cramped style switch. -% For \LuaTeX, simply rename the correspronding primitive if it is not -% already defined. -% For \XeTeX, define \meta{command} as a new quark. -% \begin{macrocode} -\cs_new_protected_nopar:Nn \@@_new_cramped_style:N -%<XE> { \quark_new:N #1 } -%<LU> { -%<LU> \cs_if_exist:NF #1 -%<LU> { \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } } -%<LU> } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\crampeddisplaystyle} -% \begin{macro}{\crampedtextstyle} -% \begin{macro}{\crampedscriptstyle} -% \begin{macro}{\crampedscriptscriptstyle} -% The cramped style commands. -% \begin{macrocode} -\@@_new_cramped_style:N \crampeddisplaystyle -\@@_new_cramped_style:N \crampedtextstyle -\@@_new_cramped_style:N \crampedscriptstyle -\@@_new_cramped_style:N \crampedscriptscriptstyle -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \paragraph{Font dimension mapping} -% Font parameters may differ between the styles. -% \LuaTeX\ accounts for this by having the parameter primitives take a style token argument. -% To replicate this behavior in \XeTeX, we have to map style tokens to specific combinations of font dimension numbers and math fonts (\cs{textfont} etc.). -% -% \begin{macro}{\@@_font_dimen:Nnnnn} -% \darg{style token} -% \darg{font dimen for display style} -% \darg{font dimen for cramped display style} -% \darg{font dimen for non-display styles} -% \darg{font dimen for cramped non-display styles} -% Map math style to \XeTeX\ math font dimension. -% \meta{style token} must be one of the style switches (\cs{displaystyle}, \cs{crampeddisplaystyle}, \dots). -% The other parameters are integer constants referring to font dimension numbers. -% The macro expands to a dimension which contains the appropriate font dimension. -% \begin{macrocode} -%<*XE> - \cs_new_nopar:Npn \@@_font_dimen:Nnnnn #1 #2 #3 #4 #5 { - \fontdimen - \cs_if_eq:NNTF #1 \displaystyle { - #2 \textfont - } { - \cs_if_eq:NNTF #1 \crampeddisplaystyle { - #3 \textfont - } { - \cs_if_eq:NNTF #1 \textstyle { - #4 \textfont - } { - \cs_if_eq:NNTF #1 \crampedtextstyle { - #5 \textfont - } { - \cs_if_eq:NNTF #1 \scriptstyle { - #4 \scriptfont - } { - \cs_if_eq:NNTF #1 \crampedscriptstyle { - #5 \scriptfont - } { - \cs_if_eq:NNTF #1 \scriptscriptstyle { - #4 \scriptscriptfont - } { -% \end{macrocode} -% Should we check here if the style is invalid? -% \begin{macrocode} - #5 \scriptscriptfont - } - } - } - } - } - } - } -% \end{macrocode} -% Which family to use? -% \begin{macrocode} - \c_two - } -%</XE> -% \end{macrocode} -% \end{macro} -% -% \paragraph{Font parameters} -% This paragraph contains macros for defining the font parameter interface, as well as the definition for all font parameters known to \LuaTeX. -% -% \begin{macro}{\@@_font_param:nnnnn} -% \darg{name} -% \darg{font dimension for non-cramped display style} -% \darg{font dimension for cramped display style} -% \darg{font dimension for non-cramped non-display styles} -% \darg{font dimension for cramped non-display styles} -% This macro defines getter and setter functions for the font parameter \meta{name}. -% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|. -% The \XeTeX\ font dimension numbers must be integer constants. -% \begin{macrocode} -\cs_new_protected_nopar:Nn \@@_font_param:nnnnn -%<*XE> -{ - \@@_font_param_aux:ccnnnn { @@_ #1 :N } { @@_set_ #1 :Nn } - { #2 } { #3 } { #4 } { #5 } -} -%</XE> -%<*LU> -{ - \tl_set:Nn \l_@@_tmpa_tl { #1 } - \tl_remove_all:Nn \l_@@_tmpa_tl { _ } - \@@_font_param_aux:ccc { @@_ #1 :N } { @@_set_ #1 :Nn } - { Umath \l_@@_tmpa_tl } -} -%</LU> -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_font_param:nnn} -% \darg{name} -% \darg{font dimension for display style} -% \darg{font dimension for non-display styles} -% This macro defines getter and setter functions for the font parameter \meta{name}. -% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|. -% The \XeTeX\ font dimension numbers must be integer constants. -% \begin{macrocode} -\cs_new_protected_nopar:Nn \@@_font_param:nnn - { - \@@_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_font_param:nn} -% \darg{name} -% \darg{font dimension} -% This macro defines getter and setter functions for the font parameter \meta{name}. -% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|. -% The \XeTeX\ font dimension number must be an integer constant. -% \begin{macrocode} -\cs_new_protected_nopar:Nn \@@_font_param:nn - { - \@@_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_font_param:n} -% \darg{name} -% This macro defines getter and setter functions for the font parameter \meta{name}, which is considered unavailable in \XeTeX\@. -% The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |Umath|. -% \begin{macrocode} -\cs_new_protected_nopar:Nn \@@_font_param:n -%<XE> { } -%<LU> { \@@_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_font_param_aux:NNnnnn} -% \begin{macro}{\@@_font_param_aux:NNN} -% Auxiliary macros for generating font parameter accessor macros. -% \begin{macrocode} -%<*XE> -\cs_new_protected_nopar:Nn \@@_font_param_aux:NNnnnn - { - \cs_new_nopar:Npn #1 ##1 - { - \@@_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 } - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 - { - #1 ##1 \dim_eval:n { ##2 } - } - } -\cs_generate_variant:Nn \@@_font_param_aux:NNnnnn { cc } -%</XE> -%<*LU> -\cs_new_protected_nopar:Nn \@@_font_param_aux:NNN - { - \cs_new_nopar:Npn #1 ##1 - { - #3 ##1 - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 - { - #3 ##1 \dim_eval:n { ##2 } - } - } -\cs_generate_variant:Nn \@@_font_param_aux:NNN { ccc } -%</LU> -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% Now all font parameters that are listed in the \LuaTeX\ reference follow. -% \begin{macrocode} -\@@_font_param:nn { axis } { 15 } -\@@_font_param:nn { operator_size } { 13 } -\@@_font_param:n { fraction_del_size } -\@@_font_param:nnn { fraction_denom_down } { 45 } { 44 } -\@@_font_param:nnn { fraction_denom_vgap } { 50 } { 49 } -\@@_font_param:nnn { fraction_num_up } { 43 } { 42 } -\@@_font_param:nnn { fraction_num_vgap } { 47 } { 46 } -\@@_font_param:nn { fraction_rule } { 48 } -\@@_font_param:nn { limit_above_bgap } { 29 } -\@@_font_param:n { limit_above_kern } -\@@_font_param:nn { limit_above_vgap } { 28 } -\@@_font_param:nn { limit_below_bgap } { 31 } -\@@_font_param:n { limit_below_kern } -\@@_font_param:nn { limit_below_vgap } { 30 } -\@@_font_param:nn { over_delimiter_vgap } { 41 } -\@@_font_param:nn { over_delimiter_bgap } { 38 } -\@@_font_param:nn { under_delimiter_vgap } { 40 } -\@@_font_param:nn { under_delimiter_bgap } { 39 } -\@@_font_param:nn { overbar_kern } { 55 } -\@@_font_param:nn { overbar_rule } { 54 } -\@@_font_param:nn { overbar_vgap } { 53 } -\@@_font_param:n { quad } -\@@_font_param:nn { radical_kern } { 62 } -\@@_font_param:nn { radical_rule } { 61 } -\@@_font_param:nnn { radical_vgap } { 60 } { 59 } -\@@_font_param:nn { radical_degree_before } { 63 } -\@@_font_param:nn { radical_degree_after } { 64 } -\@@_font_param:nn { radical_degree_raise } { 65 } -\@@_font_param:nn { space_after_script } { 27 } -\@@_font_param:nnn { stack_denom_down } { 35 } { 34 } -\@@_font_param:nnn { stack_num_up } { 33 } { 32 } -\@@_font_param:nnn { stack_vgap } { 37 } { 36 } -\@@_font_param:nn { sub_shift_down } { 18 } -\@@_font_param:nn { sub_shift_drop } { 20 } -\@@_font_param:n { subsup_shift_down } -\@@_font_param:nn { sub_top_max } { 19 } -\@@_font_param:nn { subsup_vgap } { 25 } -\@@_font_param:nn { sup_bottom_min } { 23 } -\@@_font_param:nn { sup_shift_drop } { 24 } -\@@_font_param:nnnnn { sup_shift_up } { 21 } { 22 } { 21 } { 22 } -\@@_font_param:nn { supsub_bottom_max } { 26 } -\@@_font_param:nn { underbar_kern } { 58 } -\@@_font_param:nn { underbar_rule } { 57 } -\@@_font_param:nn { underbar_vgap } { 56 } -\@@_font_param:n { connector_overlap_min } -% \end{macrocode} -% -% \section{Font features} -% -% \subsection{Math version} -% \begin{macrocode} -\keys_define:nn {unicode-math} - { - version .code:n = - { - \tl_set:Nn \l_@@_mversion_tl {#1} - \DeclareMathVersion {\l_@@_mversion_tl} - } - } -% \end{macrocode} -% -% \subsection{Script and scriptscript font options} -% \begin{macrocode} -\keys_define:nn {unicode-math} - { - script-features .tl_set:N = \l_@@_script_features_tl , - sscript-features .tl_set:N = \l_@@_sscript_features_tl , - script-font .tl_set:N = \l_@@_script_font_tl , - sscript-font .tl_set:N = \l_@@_sscript_font_tl , - } -% \end{macrocode} -% -% \subsection{Range processing} -% \seclabel{rangeproc} -% -% \begin{macrocode} -\keys_define:nn {unicode-math} - { - range .code:n = - { - \bool_set_false:N \l_@@_init_bool -% \end{macrocode} -% Set processing functions if we're not defining the full Unicode math repetoire. -% Math symbols are defined with \cmd\_@@_sym:nnn; see \secref{mathsymbol} -% for the individual definitions -% \begin{macrocode} - \int_incr:N \g_@@_fam_int - \tl_set:Nx \@@_symfont_tl {@@_fam\int_use:N\g_@@_fam_int} - \cs_set_eq:NN \_@@_sym:nnn \@@_process_symbol_parse:nnn - \cs_set_eq:NN \@@_set_mathalphabet_char:Nnn \@@_mathmap_parse:Nnn - \cs_set_eq:NN \@@_remap_symbol:nnn \@@_remap_symbol_parse:nnn - \cs_set_eq:NN \@@_maybe_init_alphabet:n \use_none:n - \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_parse:nn - \cs_set_eq:NN \@@_assign_delcode:nn \@@_assign_delcode_parse:nn - \cs_set_eq:NN \@@_make_mathactive:nNN \@@_make_mathactive_parse:nNN -% \end{macrocode} -% Proceed by filling up the various `range' seqs according to the user options. -% \begin{macrocode} - \seq_clear:N \l_@@_char_range_seq - \seq_clear:N \l_@@_mclass_range_seq - \seq_clear:N \l_@@_cmd_range_seq - \seq_clear:N \l_@@_mathalph_seq - - \clist_map_inline:nn {#1} - { - \@@_if_mathalph_decl:nTF {##1} - { - \seq_put_right:Nx \l_@@_mathalph_seq - { - { \exp_not:V \l_@@_tmpa_tl } - { \exp_not:V \l_@@_tmpb_tl } - { \exp_not:V \l_@@_tmpc_tl } - } - } - { -% \end{macrocode} -% Four cases: -% math class matching the known list; -% single item that is a control sequence---command name; -% single item that isn't---edge case, must be 0--9; -% none of the above---char range. -% \begin{macrocode} - \seq_if_in:NnTF \g_@@_mathclasses_seq {##1} - { \seq_put_right:Nn \l_@@_mclass_range_seq {##1} } - { - \bool_lazy_and:nnTF { \tl_if_single_p:n {##1} } { \token_if_cs_p:N ##1 } - { \seq_put_right:Nn \l_@@_cmd_range_seq {##1} } - { \seq_put_right:Nn \l_@@_char_range_seq {##1} } - } - } - } - } - } -% \end{macrocode} -% -% -% \begin{macro}{\@@_if_mathalph_decl:nTF} -% Possible forms of input:\\ -% |\mathscr|\\ -% |\mathscr->\mathup|\\ -% |\mathscr/{Latin}|\\ -% |\mathscr/{Latin}->\mathup|\\ -% Outputs:\\ -% |tmpa|: math style (\eg, |\mathscr|)\\ -% |tmpb|: alphabets (\eg, |Latin|)\\ -% |tmpc|: remap style (\eg, |\mathup|). Defaults to |tmpa|. -% -% The remap style can also be |\mathcal->stixcal|, which I marginally prefer -% in the general case. -% \begin{macrocode} -\prg_new_conditional:Nnn \@@_if_mathalph_decl:n {TF} - { - \tl_set:Nn \l_@@_tmpa_tl {#1} - \tl_clear:N \l_@@_tmpb_tl - \tl_clear:N \l_@@_tmpc_tl - - \tl_if_in:NnT \l_@@_tmpa_tl {->} - { \exp_after:wN \@@_split_arrow:w \l_@@_tmpa_tl \q_nil } - - \tl_if_in:NnT \l_@@_tmpa_tl {/} - { \exp_after:wN \@@_split_slash:w \l_@@_tmpa_tl \q_nil } - - \tl_set:Nx \l_@@_tmpa_tl { \tl_to_str:N \l_@@_tmpa_tl } - \exp_args:NNx \tl_remove_all:Nn \l_@@_tmpa_tl { \token_to_str:N \math } - \exp_args:NNx \tl_remove_all:Nn \l_@@_tmpa_tl { \token_to_str:N \sym } - \tl_trim_spaces:N \l_@@_tmpa_tl - - \tl_if_empty:NT \l_@@_tmpc_tl - { \tl_set_eq:NN \l_@@_tmpc_tl \l_@@_tmpa_tl } - - \seq_if_in:NVTF \g_@@_named_ranges_seq \l_@@_tmpa_tl - { \prg_return_true: } { \prg_return_false: } - } -% \end{macrocode} -% \begin{macrocode} -\cs_set:Npn \@@_split_arrow:w #1->#2 \q_nil - { - \tl_set:Nx \l_@@_tmpa_tl { \tl_trim_spaces:n {#1} } - \tl_set:Nx \l_@@_tmpc_tl { \tl_trim_spaces:n {#2} } - } -% \end{macrocode} -% \begin{macrocode} -\cs_set:Npn \@@_split_slash:w #1/#2 \q_nil - { - \tl_set:Nx \l_@@_tmpa_tl { \tl_trim_spaces:n {#1} } - \tl_set:Nx \l_@@_tmpb_tl { \tl_trim_spaces:n {#2} } - } -% \end{macrocode} -% \end{macro} -% -% Pretty basic comma separated range processing. -% Donald Arseneau's \pkg{selectp} package has a cleverer technique. -% -% \begin{macro}{\@@_if_char_spec:nNNT} -% \darg{Unicode character slot} -% \darg{control sequence (character macro)} -% \darg{control sequence (math class)} -% \darg{code to execute} -% This macro expands to |#4| -% if any of its arguments are contained in \cmd\l_@@_char_range_seq. -% This list can contain either character ranges (for checking with |#1|) or control sequences. -% These latter can either be the command name of a specific character, \emph{or} the math -% type of one (\eg, \cmd\mathbin). -% -% Character ranges are passed to \cs{@@_if_char_spec:nNNT}, which accepts input in the form shown in \tabref{ranges}. -% -% \begin{table}[htbp] -% \centering -% \topcaption{Ranges accepted by \cs{@@_if_char_spec:nNNT}.} -% \label{tab:ranges} -% \begin{tabular}{>{\ttfamily}cc} -% \textrm{Input} & Range \\ -% \hline -% x & $r=x$ \\ -% x- & $r\geq x$ \\ -% -y & $r\leq y$ \\ -% x-y & $x \leq r \leq y$ \\ -% \end{tabular} -% \end{table} -% -% We have three tests, performed sequentially in order of execution time. -% Any test finding a match jumps directly to the end. -% \begin{macrocode} -\cs_new:Nn \@@_if_char_spec:nNNT - { - % math class: - \seq_if_in:NnT \l_@@_mclass_range_seq {#3} - { \use_none_delimit_by_q_nil:w } - - % command name: - \seq_if_in:NnT \l_@@_cmd_range_seq {#2} - { \use_none_delimit_by_q_nil:w } - - % character slot: - \seq_map_inline:Nn \l_@@_char_range_seq - { - \@@_int_if_slot_in_range:nnT {#1} {##1} - { \seq_map_break:n { \use_none_delimit_by_q_nil:w } } - } - - % the following expands to nil if no match was found: - \use_none:nnn - \q_nil - \use:n - { - \clist_put_right:Nx \l_@@_char_nrange_clist { \int_eval:n {#1} } - #4 - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_int_if_slot_in_range:nnT} -% A `numrange' is like |-2,5-8,12,17-| (can be unsorted). -% -% Four cases, four argument types: -% \begin{Verbatim} -% input #2 #3 #4 -% "1 " [ 1] - [qn] - [ ] qs -% "1- " [ 1] - [ ] - [qn-] qs -% " -3" [ ] - [ 3] - [qn-] qs -% "1-3" [ 1] - [ 3] - [qn-] qs -% \end{Verbatim} -% -% \begin{macrocode} -\cs_new:Nn \@@_int_if_slot_in_range:nnT - { \@@_numrange_parse:nwT {#1} #2 - \q_nil - \q_stop {#3} } -% \end{macrocode} -% -% \begin{macrocode} -\cs_set:Npn \@@_numrange_parse:nwT #1 #2 - #3 - #4 \q_stop #5 - { - \tl_if_empty:nTF {#4} { \int_compare:nT {#1=#2} {#5} } - { - \tl_if_empty:nTF {#3} { \int_compare:nT {#1>=#2} {#5} } - { - \tl_if_empty:nTF {#2} { \int_compare:nT {#1<=#3} {#5} } - { - \int_compare:nT {#1>=#2} { \int_compare:nT {#1<=#3} {#5} } - } } } - } -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Resolving Greek symbol name control sequences} -% -% \begin{macro}{\@@_resolve_greek:} -% This macro defines \cmd\Alpha\dots\cmd\omega\ as their corresponding -% Unicode (mathematical italic) character. Remember that the mapping -% to upright or italic happens with the mathcode definitions, whereas these macros -% just stand for the literal Unicode characters. -% \begin{macrocode} -\AtBeginDocument{\@@_resolve_greek:} -\cs_new:Npn \@@_resolve_greek: - { - \clist_map_inline:nn - { - Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda, - alpha,beta,gamma,delta,epsilon,zeta,eta,theta,iota,kappa,lambda, - Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega, - mu,nu,xi,omicron,pi,rho,sigma,tau,upsilon,phi,chi,psi,omega, - varTheta,varsigma,vartheta,varkappa,varrho,varpi,varepsilon,varphi - } - { - \tl_set:cx {##1} { \exp_not:c { mit ##1 } } - \tl_set:cx {up ##1} { \exp_not:N \symup \exp_not:c { ##1 } } - \tl_set:cx {it ##1} { \exp_not:N \symit \exp_not:c { ##1 } } - } - } -% \end{macrocode} -% \end{macro} -% -% -% -% -% -% -% -% \section{Maths alphabets} -% \label{part:mathmap} -% -% Defining commands like \cmd\mathrm\ is not as simple with Unicode fonts. -% In traditional \TeX{} maths font setups, you simply switch between different `families' (\cmd\fam), which is analogous to changing from one font to another---a symbol such as `a' will be upright in one font, bold in another, and so on. -% -% In pkg{unicode-math}, a different mechanism is used to switch between styles. For every letter (start with ascii a-zA-Z and numbers to keep things simple for now), they are assigned a `mathcode' with \cmd\Umathcode\ that maps from input letter to output font glyph slot. This is done with the equivalent of -% \begin{Verbatim} -% \Umathcode`\a = 7 1 "1D44E\relax -% \Umathcode`\b = 7 1 "1D44F\relax -% \Umathcode`\c = 7 1 "1D450\relax -% ... -% \end{Verbatim} -% When switching from regular letters to, say, \cmd\mathrm, we now need to execute a new mapping: -% \begin{Verbatim} -% \Umathcode`\a = 7 1 `\a\relax -% \Umathcode`\b = 7 1 `\b\relax -% \Umathcode`\c = 7 1 `\c\relax -% ... -% \end{Verbatim} -% This is fairly straightforward to perform when we're defining our own commands such as \cmd\symbf\ and so on. However, this means that `classical' \TeX\ font setups will break, because with the original mapping still in place, the engine will be attempting to insert unicode maths glyphs from a standard font. -% -% \subsection{Hooks into \LaTeXe} -% -% To overcome this, we patch \cs{use@mathgroup}. -% (An alternative is to patch \cs{extract@alph@from@version}, which constructs the \cs{mathXYZ} commands, but this method fails if the command has been defined using \cs{DeclareSymbolFontAlphabet}.) -% As far as I can tell, this is only used inside of commands such as \cs{mathXYZ}, so this shouldn't have any major side-effects. -% -% \begin{macrocode} -\cs_set:Npn \use@mathgroup #1 #2 - { - \mode_if_math:T % <- not sure if this is really necessary since we've just checked for mmode and raised an error if not! - { - \math@bgroup - \cs_if_eq:cNF {M@\f@encoding} #1 {#1} - \@@_switchto_literal: - \mathgroup #2 \relax - \math@egroup - } - } -% \end{macrocode} -% -% -% -% \subsection{Setting styles} -% -% Algorithm for setting alphabet fonts. -% By default, when |range| is empty, we are in \emph{implicit} mode. -% If |range| contains the name of the math alphabet, we are in \emph{explicit} -% mode and do things slightly differently. -% -% Implicit mode: -% \begin{itemize} -% \item Try and set all of the alphabet shapes. -% \item Check for the first glyph of each alphabet to detect if the font supports each -% alphabet shape. -% \item For alphabets that do exist, overwrite whatever's already there. -% \item For alphabets that are not supported, \emph{do nothing}. -% (This includes leaving the old alphabet definition in place.) -% \end{itemize} -% -% Explicit mode: -% \begin{itemize} -% \item Only set the alphabets specified. -% \item Check for the first glyph of the alphabet to detect if the font contains -% the alphabet shape in the Unicode math plane. -% \item For Unicode math alphabets, overwrite whatever's already there. -% \item Otherwise, use the \ascii\ glyph slots instead. -% \end{itemize} -% -% -% -% \subsection{Defining the math style macros} -% -% We call the different shapes that a math alphabet can be a `math style'. -% Note that different alphabets can exist within the same math style. E.g., -% we call `bold' the math style |bf| and within it there are upper and lower -% case Greek and Roman alphabets and Arabic numerals. -% -% \begin{macro}{\@@_prepare_mathstyle:n} -% \darg{math style name (e.g., \texttt{it} or \texttt{bb})} -% Define the high level math alphabet macros (\cs{mathit}, etc.) in terms of -% unicode-math definitions. Use \cs{bgroup}/\cs{egroup} so s'scripts scan the -% whole thing. -% -% The flag \cs{l_@@_mathstyle_tl} is for other applications to query the -% current math style. -% \begin{macrocode} -\cs_new:Nn \@@_prepare_mathstyle:n - { - \seq_put_right:Nn \g_@@_mathstyles_seq {#1} - \@@_init_alphabet:n {#1} - \cs_set:cpn {_@@_sym_#1_aux:n} - { \use:c {@@_switchto_#1:} \math@egroup } - \cs_set_protected:cpx {sym#1} - { - \exp_not:n - { - \math@bgroup - \mode_if_math:F - { - \egroup\expandafter - \non@alpherr\expandafter{\csname sym#1\endcsname\space} - } - \tl_set:Nn \l_@@_mathstyle_tl {#1} - } - \exp_not:c {_@@_sym_#1_aux:n} - } - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_init_alphabet:n} -% \darg{math alphabet name (e.g., \texttt{it} or \texttt{bb})} -% This macro initialises the macros used to set up a math alphabet. -% First used when the math alphabet macro is first defined, but then used -% later when redefining a particular maths alphabet. -% \begin{macrocode} -\cs_set:Nn \@@_init_alphabet:n - { - \@@_log:nx {alph-initialise} {#1} - \cs_set_eq:cN {@@_switchto_#1:} \prg_do_nothing: - } -% \end{macrocode} -% \end{macro} -% -% \subsection{Definition of alphabets and styles} -% -% First of all, we break up unicode into `named ranges', such as |up|, |bb|, |sfup|, and so on, which refer to specific blocks of unicode that contain various symbols (usually alphabetical symbols). -% -% \begin{macrocode} -\cs_new:Nn \@@_new_named_range:n - { - \prop_new:c {g_@@_named_range_#1_prop} - } -\clist_set:Nn \g_@@_named_ranges_clist - { - up, it, tt, bfup, bfit, bb , bbit, scr, bfscr, cal, bfcal, - frak, bffrak, sfup, sfit, bfsfup, bfsfit, bfsf - } -\clist_map_inline:Nn \g_@@_named_ranges_clist - { \@@_new_named_range:n {#1} } -% \end{macrocode} -% -% Each of these styles usually contains one or more `alphabets', which are currently |latin|, |Latin|, |greek|, |Greek|, |num|, and |misc|, although there's an implicit potential for more. -% |misc| is not included in the official list to avoid checking code. -% \begin{macrocode} -\clist_new:N \g_@@_alphabets_seq -\clist_set:Nn \g_@@_alphabets_seq { latin, Latin, greek, Greek, num } -% \end{macrocode} -% -% Each alphabet style needs to be configured. -% This happens in the |unicode-math-alphabets.dtx| file. -% \begin{macrocode} -\cs_new:Nn \@@_new_alphabet_config:nnn - { - \prop_if_exist:cF {g_@@_named_range_#1_prop} - { \@@_warning:nnn {no-named-range} {#1} {#2} } - - \prop_gput:cnn {g_@@_named_range_#1_prop} { alpha_tl } - { - \prop_item:cn {g_@@_named_range_#1_prop} { alpha_tl } - {#2} - } - % Q: do I need to bother removing duplicates? - - \cs_new:cn { @@_config_#1_#2:n } {#3} - } -% \end{macrocode} -% \begin{macrocode} -\cs_new:Nn \@@_alphabet_config:nnn - { - \use:c {@@_config_#1_#2:n} {#3} - } -% \end{macrocode} -% \begin{macrocode} -\prg_new_conditional:Nnn \@@_if_alphabet_exists:nn {T,TF} - { - \cs_if_exist:cTF {@@_config_#1_#2:n} - \prg_return_true: \prg_return_false: - } -% \end{macrocode} -% -% The linking between named ranges and symbol style commands happens here. -% It's currently not using all of the machinery we're in the process of setting up above. -% Baby steps. -% \begin{macrocode} -\cs_new:Nn \@@_default_mathalph:nnn - { - \seq_put_right:Nx \g_@@_named_ranges_seq { \tl_to_str:n {#1} } - \seq_put_right:Nn \g_@@_default_mathalph_seq {{#1}{#2}{#3}} - \prop_gput:cnn { g_@@_named_range_#1_prop } { default-alpha } {#2} - } -\@@_default_mathalph:nnn {up } {latin,Latin,greek,Greek,num,misc} {up } -\@@_default_mathalph:nnn {it } {latin,Latin,greek,Greek,misc} {it } -\@@_default_mathalph:nnn {bb } {latin,Latin,num,misc} {bb } -\@@_default_mathalph:nnn {bbit } {misc} {bbit } -\@@_default_mathalph:nnn {scr } {latin,Latin} {scr } -\@@_default_mathalph:nnn {cal } {Latin} {scr } -\@@_default_mathalph:nnn {bfcal } {Latin} {bfscr } -\@@_default_mathalph:nnn {frak } {latin,Latin} {frak } -\@@_default_mathalph:nnn {tt } {latin,Latin,num} {tt } -\@@_default_mathalph:nnn {sfup } {latin,Latin,num} {sfup } -\@@_default_mathalph:nnn {sfit } {latin,Latin} {sfit } -\@@_default_mathalph:nnn {bfup } {latin,Latin,greek,Greek,num,misc} {bfup } -\@@_default_mathalph:nnn {bfit } {latin,Latin,greek,Greek,misc} {bfit } -\@@_default_mathalph:nnn {bfscr } {latin,Latin} {bfscr } -\@@_default_mathalph:nnn {bffrak} {latin,Latin} {bffrak} -\@@_default_mathalph:nnn {bfsfup} {latin,Latin,greek,Greek,num,misc} {bfsfup} -\@@_default_mathalph:nnn {bfsfit} {latin,Latin,greek,Greek,misc} {bfsfit} -% \end{macrocode} -% -% \subsubsection{Define symbol style commands} -% Finally, all of the `symbol styles' commands are set up, which are the commands to access each of the named alphabet styles. There is not a one-to-one mapping between symbol style commands and named style ranges! -% \begin{macrocode} -\clist_map_inline:nn - { - up, it, bfup, bfit, sfup, sfit, bfsfup, bfsfit, bfsf, - tt, bb, bbit, scr, bfscr, cal, bfcal, frak, bffrak, - normal, literal, sf, bf, - } - { \@@_prepare_mathstyle:n {#1} } -% \end{macrocode} -% -% -% \subsubsection{New names for legacy textmath alphabet selection} -% In case a package option overwrites, say, \cs{mathbf} with \cs{symbf}. -% \begin{macrocode} -\clist_map_inline:nn - { rm, it, bf, sf, tt } - { \cs_set_eq:cc { mathtext #1 } { math #1 } } -% \end{macrocode} -% Perhaps these should actually be defined using a hypothetical unicode-math interface to creating new such styles. To come. -% -% -% \subsubsection{Replacing legacy pure-maths alphabets} -% The following are alphabets which do not have a math/text ambiguity. -% \begin{macrocode} -\clist_map_inline:nn - { - normal, bb , bbit, scr, bfscr, cal, bfcal, frak, bffrak, tt, - bfup, bfit, sfup, sfit, bfsfup, bfsfit, bfsf - } - { - \cs_set:cpx { math #1 } { \exp_not:c { sym #1 } } - } -% \end{macrocode} -% -% -% \subsubsection{New commands for ambiguous alphabets} -% \begin{macrocode} -\AtBeginDocument{ -\clist_map_inline:nn - { rm, it, bf, sf, tt } - { - \cs_set_protected:cpx { math #1 } - { - \exp_not:n { \bool_if:NTF } \exp_not:c { g_@@_ math #1 _text_bool} - { \exp_not:c { mathtext #1 } } - { \exp_not:c { sym #1 } } - } - }} -% \end{macrocode} -% -% \paragraph{Alias \cs{mathrm} as legacy name for \cs{mathup}} -% \begin{macrocode} -\cs_set_protected:Npn \mathup { \mathrm } -\cs_set_protected:Npn \symrm { \symup } -% \end{macrocode} -% -% -% \subsubsection{Fixing up \cs{operator@font}} -% -%In LaTeX maths, the command |\operator@font| is defined that switches to the |operator| mathgroup. The classic example is the |\sin| in |$\sin{x}$|; essentially we're using |\mathrm| to typeset the upright symbols, but the syntax is |{\operator@font sin}|. -% -%It turns out that hooking into |\operator@font| is hard because all other maths font selection in 2e uses |\mathrm{...}| style. -% -%Then reading source2e a little more I stumbled upon: (in the definition of |\select@group|) -%\begin{quote} -% We surround |\select@group| with braces so that functions using it can be used directly after |_| or |^|. However, if we use oldstyle syntax where the math alphabet doesn’t have arguments (ie if |\math@bgroup| is not |\bgroup|) we need to get rid of the extra group. -%\end{quote} -%So there's a trick we can use. -%Because it's late and I'm tired, I went for the first thing that jumped out at me: -%\begin{Verbatim} -% \documentclass{article} -% \DeclareMathAlphabet\mathfoo{OT1}{lmdh}{m}{n} -% \begin{document} -% \makeatletter -% ${\operator@font Mod}\, x$ -% -% \def\operator@font{% -% \let \math@bgroup \relax -% \def \math@egroup {\let \math@bgroup \@@math@bgroup -% \let \math@egroup \@@math@egroup}% -% \mathfoo} -% ${\operator@font Mod}\, x$ -% \end{document} -%\end{Verbatim} -% We define a new math alphabet |\mathfoo| to select the Latin Modern Dunhill font, and then locally redefine |\math@bgroup| to allow |\mathfoo| to be used without an argument temporarily. -% -% Now that I've written this whole thing out, another solution pops to mind: -%\begin{Verbatim} -% \documentclass{article} -% \DeclareSymbolFont{foo}{OT1}{lmdh}{m}{n} -% \DeclareSymbolFontAlphabet\mathfoo{foo} -% \begin{document} -% \makeatletter -% ${\operator@font Mod}\, x$ -% -% \def\operator@font{\mathgroup\symfoo} -% ${\operator@font Mod}\, x$ -% \end{document} -%\end{Verbatim} -%I guess that's the better approach!! -% -% Or perhaps I should just use |\@fontswitch| to do the first solution with a nicer wrapper. I really should read things more carefully: -% \begin{macro}{\operator@font} -% \begin{macrocode} -\cs_set:Npn \operator@font - { - \@@_switchto_literal: - \@fontswitch {} { \g_@@_operator_mathfont_tl } - } -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Defining the math alphabets per style} -% -% \begin{macro}{\@@_setup_alphabets:} -% This function is called within \cs{setmathfont} to configure the -% mapping between characters inside math styles. -% \begin{macrocode} -\cs_new:Npn \@@_setup_alphabets: - { -% \end{macrocode} -% If |range=| has been used to configure styles, those choices will be in -% |\l_@@_mathalph_seq|. If not, set up the styles implicitly: -% \begin{macrocode} - \seq_if_empty:NTF \l_@@_mathalph_seq - { - \@@_log:n {setup-implicit} - \seq_set_eq:NN \l_@@_mathalph_seq \g_@@_default_mathalph_seq - \bool_set_true:N \l_@@_implicit_alph_bool - \@@_maybe_init_alphabet:n {sf} - \@@_maybe_init_alphabet:n {bf} - \@@_maybe_init_alphabet:n {bfsf} - } -% \end{macrocode} -% If |range=| has been used then we're in explicit mode: -% \begin{macrocode} - { - \@@_log:n {setup-explicit} - \bool_set_false:N \l_@@_implicit_alph_bool - \cs_set_eq:NN \@@_set_mathalphabet_char:nnn \@@_mathmap_noparse:nnn - \cs_set_eq:NN \@@_map_char_single:nn \@@_map_char_noparse:nn - } - - % Now perform the mapping: - \seq_map_inline:Nn \l_@@_mathalph_seq - { - \tl_set:No \l_@@_style_tl { \use_i:nnn ##1 } - \clist_set:No \l_@@_alphabet_clist { \use_ii:nnn ##1 } - \tl_set:No \l_@@_remap_style_tl { \use_iii:nnn ##1 } - - % If no set of alphabets is defined: - \clist_if_empty:NT \l_@@_alphabet_clist - { - \cs_set_eq:NN \@@_maybe_init_alphabet:n \@@_init_alphabet:n - \prop_get:cnN { g_@@_named_range_ \l_@@_style_tl _prop } - { default-alpha } \l_@@_alphabet_clist - } - - \@@_setup_math_alphabet: - } - \seq_if_empty:NF \l_@@_missing_alph_seq { \@@_log:n { missing-alphabets } } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_setup_math_alphabet:} -% \begin{macrocode} -\cs_new:Nn \@@_setup_math_alphabet: - { -% \end{macrocode} -% First check that at least one of the alphabets for the font shape is defined -% (this process is fast) \dots -% \begin{macrocode} - \clist_map_inline:Nn \l_@@_alphabet_clist - { - \tl_set:Nn \l_@@_alphabet_tl {##1} - \@@_if_alphabet_exists:nnTF \l_@@_style_tl \l_@@_alphabet_tl - { - \str_if_eq_x:nnTF {\l_@@_alphabet_tl} {misc} - { - \@@_maybe_init_alphabet:n \l_@@_style_tl - \clist_map_break: - } - { - \@@_glyph_if_exist:nT { \@@_to_usv:nn {\l_@@_style_tl} {\l_@@_alphabet_tl} } - { - \@@_maybe_init_alphabet:n \l_@@_style_tl - \clist_map_break: - } - } - } - { \msg_warning:nnx {unicode-math} {no-alphabet} { \l_@@_style_tl / \l_@@_alphabet_tl } } - } -% \end{macrocode} -% \dots and then loop through them defining the individual ranges: -% (currently this process is slow) -% \begin{macrocode} -%<debug> \csname TIC\endcsname - \clist_map_inline:Nn \l_@@_alphabet_clist - { - \tl_set:Nx \l_@@_alphabet_tl { \tl_trim_spaces:n {##1} } - \cs_if_exist:cT {@@_config_ \l_@@_style_tl _ \l_@@_alphabet_tl :n} - { - \exp_args:No \tl_if_eq:nnTF \l_@@_alphabet_tl {misc} - { - \@@_log:nx {setup-alph} {sym \l_@@_style_tl~(\l_@@_alphabet_tl)} - \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {\l_@@_remap_style_tl} - } - { - \@@_glyph_if_exist:nTF { \@@_to_usv:nn {\l_@@_remap_style_tl} {\l_@@_alphabet_tl} } - { - \@@_log:nx {setup-alph} {sym \l_@@_style_tl~(\l_@@_alphabet_tl)} - \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {\l_@@_remap_style_tl} - } - { - \bool_if:NTF \l_@@_implicit_alph_bool - { - \seq_put_right:Nx \l_@@_missing_alph_seq - { - \@backslashchar sym \l_@@_style_tl \space - (\tl_use:c{c_@@_math_alphabet_name_ \l_@@_alphabet_tl _tl}) - } - } - { - \@@_alphabet_config:nnn {\l_@@_style_tl} {\l_@@_alphabet_tl} {up} - } - } - } - } - } -%<debug> \csname TOC\endcsname - } -% \end{macrocode} -% \end{macro} -% -% -% \subsection{Mapping `naked' math characters} -% -% Before we show the definitions of the alphabet mappings using the functions -% |\@@_alphabet_config:nnn \l_@@_style_tl {##1} {...}|, we first want to define some functions -% to be used inside them to actually perform the character mapping. -% -% \subsubsection{Functions} -% -% \begin{macro}{\@@_map_char_single:nn} -% Wrapper for |\@@_map_char_noparse:nn| or |\@@_map_char_parse:nn| -% depending on the context. -% -% \begin{macro}{\@@_map_char_noparse:nn} -% \begin{macro}{\@@_map_char_parse:nn} -% \begin{macrocode} -\cs_new:Nn \@@_map_char_noparse:nn - { \@@_set_mathcode:nnnn {#1}{\mathalpha}{\@@_symfont_tl}{#2} } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_map_char_parse:nn - { - \@@_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} - { \@@_map_char_noparse:nn {#1}{#2} } - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\@@_map_char_single:nnn} -% \darg{char name (`dotlessi')} -% \darg{from alphabet(s)} -% \darg{to alphabet} -% Logical interface to \cs{@@_map_char_single:nn}. -% \begin{macrocode} -\cs_new:Nn \@@_map_char_single:nnn - { - \@@_map_char_single:nn { \@@_to_usv:nn {#1}{#3} } - { \@@_to_usv:nn {#2}{#3} } - } -% \end{macrocode} -% \end{macro} -% -% -% \begin{macro}{\@@_map_chars_range:nnnn} -% \darg{Number of chars (26)} -% \darg{From style, one or more (it)} -% \darg{To style (up)} -% \darg{Alphabet name (Latin)} -% First the function with numbers: -% \begin{macrocode} -\cs_set:Nn \@@_map_chars_range:nnn - { - \int_step_inline:nnnn {0}{1}{#1-1} - { \@@_map_char_single:nn {#2+##1}{#3+##1} } - } -% \end{macrocode} -% And the wrapper with names: -% \begin{macrocode} -\cs_new:Nn \@@_map_chars_range:nnnn - { - \@@_map_chars_range:nnn {#1} { \@@_to_usv:nn {#2}{#4} } - { \@@_to_usv:nn {#3}{#4} } - } -% \end{macrocode} -% \end{macro} -% -% \subsubsection{Functions for `normal' alphabet symbols} -% -% \begin{macro}{\@@_set_normal_char:nnn} -% \begin{macrocode} -\cs_set:Nn \@@_set_normal_char:nnn - { - \@@_usv_if_exist:nnT {#3} {#1} - { - \clist_map_inline:nn {#2} - { - \@@_set_mathalphabet_pos:nnnn {normal} {#1} {##1} {#3} - \@@_map_char_single:nnn {##1} {#3} {#1} - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_normal_Latin:nn - { - \clist_map_inline:nn {#1} - { - \@@_set_mathalphabet_Latin:nnn {normal} {##1} {#2} - \@@_map_chars_range:nnnn {26} {##1} {#2} {Latin} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_normal_latin:nn - { - \clist_map_inline:nn {#1} - { - \@@_set_mathalphabet_latin:nnn {normal} {##1} {#2} - \@@_map_chars_range:nnnn {26} {##1} {#2} {latin} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_normal_greek:nn - { - \clist_map_inline:nn {#1} - { - \@@_set_mathalphabet_greek:nnn {normal} {##1} {#2} - \@@_map_chars_range:nnnn {25} {##1} {#2} {greek} - \@@_map_char_single:nnn {##1} {#2} {epsilon} - \@@_map_char_single:nnn {##1} {#2} {vartheta} - \@@_map_char_single:nnn {##1} {#2} {varkappa} - \@@_map_char_single:nnn {##1} {#2} {phi} - \@@_map_char_single:nnn {##1} {#2} {varrho} - \@@_map_char_single:nnn {##1} {#2} {varpi} - \@@_set_mathalphabet_pos:nnnn {normal} {epsilon} {##1} {#2} - \@@_set_mathalphabet_pos:nnnn {normal} {vartheta} {##1} {#2} - \@@_set_mathalphabet_pos:nnnn {normal} {varkappa} {##1} {#2} - \@@_set_mathalphabet_pos:nnnn {normal} {phi} {##1} {#2} - \@@_set_mathalphabet_pos:nnnn {normal} {varrho} {##1} {#2} - \@@_set_mathalphabet_pos:nnnn {normal} {varpi} {##1} {#2} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_normal_Greek:nn - { - \clist_map_inline:nn {#1} - { - \@@_set_mathalphabet_Greek:nnn {normal} {##1} {#2} - \@@_map_chars_range:nnnn {25} {##1} {#2} {Greek} - \@@_map_char_single:nnn {##1} {#2} {varTheta} - \@@_set_mathalphabet_pos:nnnn {normal} {varTheta} {##1} {#2} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_normal_numbers:nn - { - \@@_set_mathalphabet_numbers:nnn {normal} {#1} {#2} - \@@_map_chars_range:nnnn {10} {#1} {#2} {num} - } -% \end{macrocode} -% -% -% \subsection{Mapping chars inside a math style} -% -% \subsubsection{Functions for setting up the maths alphabets} -% -% \begin{macro}{\@@_set_mathalphabet_char:Nnn} -% This is a wrapper for either |\@@_mathmap_noparse:nnn| or -% |\@@_mathmap_parse:Nnn|, depending on the context. -% \end{macro} -% -% \begin{macro}{\@@_mathmap_noparse:nnn} -% \darg{Maths alphabet, \eg, `bb'} -% \darg{Input slot(s), \eg, the slot for `A' (comma separated)} -% \darg{Output slot, \eg, the slot for `$\mathbb{A}$'} -% Adds \cs{@@_set_mathcode:nnnn} declarations to the specified maths alphabet's definition. -% \begin{macrocode} -\cs_new:Nn \@@_mathmap_noparse:nnn - { - \clist_map_inline:nn {#2} - { - \tl_put_right:cx {@@_switchto_#1:} - { - \@@_set_mathcode:nnnn {##1} {\mathalpha} {\@@_symfont_tl} {#3} - } - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_mathmap_parse:nnn} -% \darg{Maths alphabet, \eg, `bb'} -% \darg{Input slot(s), \eg, the slot for `A' (comma separated)} -% \darg{Output slot, \eg, the slot for `$\mathbb{A}$'} -% When \cmd\@@_if_char_spec:nNNT\ is executed, it populates the \cmd\l_@@_char_nrange_clist\ -% macro with slot numbers corresponding to the specified range. This range is used to -% conditionally add \cs{@@_set_mathcode:nnnn} declaractions to the maths alphabet definition. -% \begin{macrocode} -\cs_new:Nn \@@_mathmap_parse:nnn - { - \clist_if_in:NnT \l_@@_char_nrange_clist {#3} - { - \@@_mathmap_noparse:nnn {#1}{#2}{#3} - } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_mathalphabet_char:nnnn} -% \darg{math style command} -% \darg{input math alphabet name} -% \darg{output math alphabet name} -% \darg{char name to map} -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_char:nnnn - { - \@@_set_mathalphabet_char:nnn {#1} { \@@_to_usv:nn {#2} {#4} } - { \@@_to_usv:nn {#3} {#4} } - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_set_mathalph_range:nnnn} -% \darg{Number of iterations} -% \darg{Maths alphabet} -% \darg{Starting input char (single)} -% \darg{Starting output char} -% Loops through character ranges setting \cmd\mathcode. -% First the version that uses numbers: -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalph_range:nnnn - { - \int_step_inline:nnnn {0} {1} {#1-1} - { \@@_set_mathalphabet_char:nnn {#2} { ##1 + #3 } { ##1 + #4 } } - } -% \end{macrocode} -% Then the wrapper version that uses names: -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalph_range:nnnnn - { - \@@_set_mathalph_range:nnnn {#1} {#2} { \@@_to_usv:nn {#3} {#5} } - { \@@_to_usv:nn {#4} {#5} } - } -% \end{macrocode} -% \end{macro} -% -% \subsubsection{Individual mapping functions for different alphabets} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_pos:nnnn - { - \@@_usv_if_exist:nnT {#4} {#2} - { - \clist_map_inline:nn {#3} - { \@@_set_mathalphabet_char:nnnn {#1} {##1} {#4} {#2} } - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_numbers:nnn - { - \clist_map_inline:nn {#2} - { \@@_set_mathalph_range:nnnnn {10} {#1} {##1} {#3} {num} } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_Latin:nnn - { - \clist_map_inline:nn {#2} - { \@@_set_mathalph_range:nnnnn {26} {#1} {##1} {#3} {Latin} } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_latin:nnn - { - \clist_map_inline:nn {#2} - { - \@@_set_mathalph_range:nnnnn {26} {#1} {##1} {#3} {latin} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {h} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_Greek:nnn - { - \clist_map_inline:nn {#2} - { - \@@_set_mathalph_range:nnnnn {25} {#1} {##1} {#3} {Greek} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varTheta} - } - } -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Nn \@@_set_mathalphabet_greek:nnn - { - \clist_map_inline:nn {#2} - { - \@@_set_mathalph_range:nnnnn {25} {#1} {##1} {#3} {greek} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {epsilon} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {vartheta} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varkappa} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {phi} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varrho} - \@@_set_mathalphabet_char:nnnn {#1} {##1} {#3} {varpi} - } - } -% \end{macrocode} -% -% -% -% \section{A token list to contain the data of the math table} -% -% Instead of \cmd\input-ing the unicode math table every time we -% want to re-read its data, we save it within a macro. This has two -% advantages: 1.~it should be slightly faster, at the expense of memory; -% 2.~we don't need to worry about catcodes later, since they're frozen -% at this point. -% -% In time, the case statement inside |set_mathsymbol| will be moved in here -% to avoid re-running it every time. -% \begin{macrocode} -\cs_new:Npn \@@_symbol_setup: - { - \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 - { - \exp_not:n { \_@@_sym:nnn {##1} {##2} {##3} } - } - } +% Bail early if necessary. +% \begin{macrocode} +\ifdefined\XeTeXversion + \ifdim\number\XeTeXversion\XeTeXrevision in<0.9998in% + \PackageError{unicode-math}{% + Cannot run with this version of XeTeX!\MessageBreak + You need XeTeX 0.9998 or newer.% + }\@ehd + \fi +\else\ifdefined\luatexversion + \ifnum\luatexversion<64% + \PackageError{unicode-math}{% + Cannot run with this version of LuaTeX!\MessageBreak + You need LuaTeX 0.64 or newer.% + }\@ehd + \fi +\else + \PackageError{unicode-math}{% + Cannot be run with pdfLaTeX!\MessageBreak + Use XeLaTeX or LuaLaTeX instead.% + }\@ehd +\fi\fi % \end{macrocode} % +% \paragraph{Packages} +% Assuming people are running up-to-date packages. % \begin{macrocode} -\tl_set_from_file_x:Nnn \g_@@_mathtable_tl {\@@_symbol_setup:} {unicode-math-table.tex} +\RequirePackage{expl3,xparse,l3keys2e} +\RequirePackage{fontspec} +\RequirePackage{ucharcat} +\RequirePackage{fix-cm} % avoid some warnings (still necessary? check...) +\RequirePackage{filehook} % \end{macrocode} -% -% -% \begin{macro}{\@@_input_math_symbol_table:} -% This function simply expands to the token list containing all the data. +% \paragraph{Bifurcate} % \begin{macrocode} -\cs_new:Nn \@@_input_math_symbol_table: {\g_@@_mathtable_tl} +\ExplSyntaxOn +\sys_if_engine_luatex:T { \RequirePackageWithOptions{unicode-math-luatex} } +\sys_if_engine_xetex:T { \RequirePackageWithOptions{unicode-math-xetex} } +\ExplSyntaxOff % \end{macrocode} -% \end{macro} % -% -% \section{Definitions of the active math characters} -% -% Now give \cmd\_@@_sym:nnn\ a definition in terms of \cmd\@@_cs_set_eq_active_char:Nw\ -% and we're good to go. -% -% Ensure catcodes are appropriate; -% make sure |#| is an `other' so that we don't get confused with \cs{mathoctothorpe}. % \begin{macrocode} -\AtBeginDocument{\@@_define_math_chars:} -\cs_new:Nn \@@_define_math_chars: - { - \group_begin: - \cs_set:Npn \_@@_sym:nnn ##1##2##3 - { - \tl_if_in:nnT - { \mathord \mathalpha \mathbin \mathrel \mathpunct \mathop \mathfence } - {##3} - { - \exp_last_unbraced:NNx \cs_gset_eq:NN ##2 { \Ucharcat ##1 ~ 12 ~ } - } - } - \@@_input_math_symbol_table: - \group_end: - } +%</load> % \end{macrocode} % -% -% \begin{macrocode} -%</package&(XE|LU)> -% \end{macrocode} +% That's the end of the base package. The subsequent packages are derived from +% the following ordered list of \texttt{dtx} files: +% \begin{multicols}{3} +% \begin{enumerate} +% \def\DTX#1{\item \texttt{#1}} +% \DTXFILES +% \end{enumerate} +% \end{multicols} % \endinput |