diff options
Diffstat (limited to 'macros/unicodetex/latex/unicode-math/um-code-fontparam.dtx')
-rw-r--r-- | macros/unicodetex/latex/unicode-math/um-code-fontparam.dtx | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/macros/unicodetex/latex/unicode-math/um-code-fontparam.dtx b/macros/unicodetex/latex/unicode-math/um-code-fontparam.dtx new file mode 100644 index 0000000000..b801b6c0b9 --- /dev/null +++ b/macros/unicodetex/latex/unicode-math/um-code-fontparam.dtx @@ -0,0 +1,345 @@ +%%^^A%% um-code-fontparam.dtx -- part of UNICODE-MATH <wspr.io/unicode-math> +%%^^A%% Cross-platform interface for font parameters + +% \section{Cross-platform interface for font parameters} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \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> { \tl_const:Nn #1 { \use_none: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} + 2~ + } +%</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} +% +% \subsection{Historical commands} +% +% \begin{macro}{\@@_fontdimen_to_percent:nN} +% \begin{macro}{\@@_fontdimen_pc_to_pt:nN} +% \darg{Font dimen number} +% \darg{Font `variable'} +% \cmd\fontdimen s |10|, |11|, and |65| aren't actually dimensions, they're percentage values given in units of |sp|. +% \cs{@@_fontdimen_to_percent:nn} takes a font dimension number and outputs the decimal value of the associated parameter. +% \cs{@@_fontdimen_pc_to_pt:nn} returns a dimension correspond to the current +% font size relative proportion based on that percentage. +% \begin{macrocode} +\cs_set:Nn \@@_fontdimen_to_percent:nN + { + \fp_eval:n { \dim_to_decimal_in_sp:n { \fontdimen #1 #2 } / 100 } + } +\cs_new:Nn \@@_fontdimen_pc_to_pt:nN + { + \fp_eval:n { \dim_to_decimal_in_sp:n { \fontdimen #1 #2 } / 100 * \f@size } + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@_mathstyle_scale:NnnN} +% \darg{A math style (\cs{scriptstyle}, say)} +% \darg{Macro that takes a non-delimited length argument (like \cmd\kern)} +% \darg{Length control sequence to be scaled according to the math style} +% \darg{Math font face to use for the lookups} +% This macro is used to scale the lengths reported by \cmd\fontdimen\ according to the scale factor for script- and scriptscript-size objects. +% \begin{macrocode} +\cs_new:Nn \@@_mathstyle_scale:NnnN + { + \ifx#1\scriptstyle + #2 \@@_fontdimen_to_percent:nN {10} #4 #3 + \else + \ifx#1\scriptscriptstyle + #2 \@@_fontdimen_to_percent:nN {11} #4 #3 + \else + #2 #3 + \fi + \fi + } +% \end{macrocode} +% \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 +% ------------------------------------------------ +% +% ©/ |