% \section{\DTXCURR --- Common interface for font parameters}
%
% \begin{macrocode}
%<*package&(XE|LU)>
% \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
% { \quark_new:N #1 }
% {
% \cs_if_exist:NF #1
% { \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } }
% }
% \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
}
%
% \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 }
}
%
%<*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 }
}
%
% \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
% { }
% { \@@_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 }
%
%<*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 }
%
% \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}
%
% TODO: maybe no longer necessary?
%
% \begin{macro}{\@@_fontdimen_to_percent:nn}
% \begin{macro}{\@@_fontdimen_to_scale: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_to_scale:nn} returns a dimension correspond to the current
% font size relative proportion based on that percentage.
% \begin{macrocode}
\cs_new:Nn \@@_fontdimen_to_percent:nn
{
\fp_eval:n { \dim_to_decimal:n { \fontdimen #1 #2 } * 65536 / 100 }
}
\cs_new:Nn \@@_fontdimen_to_scale:nn
{
\fp_eval:n {\@@_fontdimen_to_percent:nn {#1} {#2} * \f@size } pt
}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@@_mathstyle_scale:Nnn}
% \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}
% 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:Nnn
{
\ifx#1\scriptstyle
#2 \@@_fontdimen_to_percent:nn {10} \l_@@_font #3
\else
\ifx#1\scriptscriptstyle
#2 \@@_fontdimen_to_percent:nn {11} \l_@@_font #3
\else
#2 #3
\fi
\fi
}
% \end{macrocode}
% \end{macro}
%
% \begin{macrocode}
%
% \end{macrocode}
%
\endinput