tg85 noted two issues with the answer that he provided to his own question:
The solution is not perfect. You can see that all numbers in math mode are rendered upright, even in \mathit
. Also, the number in \mathbfit
is not bold. All fonts are correct though, and it's good enough for my purposes.
The unicode-math manual (Figure 7) states that the upright shape is actually chosen on purpose for numerals because they “should always be taken from the upright font even in the italic style.” In line with this statement, it seems that Unicode does not define slots for italic digits—while it does define slots for bold digits, sans-serif digits, etc. See https://en.wikipedia.org/wiki/Mathematical_operators_and_symbols_in_Unicode#Mathematical_Alphanumeric_Symbols_block.
I can understand, however, that one still wishes the typesetting produced by unicode-math to be consistent with the original LaTeX-based typesetting, where \mathit{1}
produces an italic digit one. Therefore, inspired by tg85’s code, I came up with a solution that fixes these two issues (also works with LuaLaTeX):
% !TEX program = xelatex
\documentclass{minimal}
\usepackage{ifthen}
\usepackage[svgnames]{xcolor}
\usepackage[
mathit = sym, mathup = sym, mathbf = sym,
math-style = ISO, bold-style = ISO
]{unicode-math}
\setmainfont{LinLibertine_R.otf}[
ItalicFont = LinLibertine_RI.otf,
BoldFont = LinLibertine_RB.otf,
BoldItalicFont = LinLibertine_RBI.otf
]
\setmonofont{FiraMono-Medium.otf}[
Scale = 0.81,
Color = DarkBlue
]
\setmathfont{XITSMath-Regular.otf}[
BoldFont = XITSMath-Bold.otf
]
\setmathfont{XITSMath-Regular.otf}[
version = mathitVersion
]
\setmathfont{XITSMath-Regular.otf}[
version = mathbfitVersion
]
\setmathfont{XITSMath-Bold.otf}[
version = boldmathVersion
]
\setmathfont{LinLibertine_R.otf}[
range = up/{num, latin, Latin, greek, Greek},
BoldFont = LinLibertine_RB.otf
]
\setmathfont{LinLibertine_RI.otf}[
range = it/{num, latin, Latin, greek, Greek},
BoldFont = LinLibertine_RBI.otf,
NFSSFamily = mathitalic
]
\setmathfont{LinLibertine_RBI.otf}[
range = bfit/{latin, Latin, greek, Greek},
NFSSFamily = mathbolditalic
]
\setmathfont{LinLibertine_RB.otf}[
range = bfup/{num, latin, Latin, greek, Greek}
]
\newif \ifBoldMath \BoldMathfalse
\let \mathversionorig \mathversion
\renewcommand{\mathversion}[1]{%
\ifthenelse{\equal{#1}{bold}}{%
\BoldMathtrue%
}{%
\BoldMathfalse%
}%
\mathversionorig{#1}%
}
\AtBeginDocument{%
\let \mathitorig \mathit%
\renewcommand{\mathit}[1]{%
\ifBoldMath%
\textbf{%
\SetSymbolFont{__um_fam1}{boldmathVersion}{TU}{mathbolditalic}{b}{it}%
\SetSymbolFont{__um_fam2}{boldmathVersion}{TU}{mathbolditalic}{b}{it}%
\mathversion{boldmathVersion}%
\(\mathitorig{#1}\)%
}
\else%
\textit{%
\SetSymbolFont{__um_fam1}{mathitVersion}{TU}{mathitalic}{m}{it}%
\mathversion{mathitVersion}%
\(\mathitorig{#1}\)%
}%
\fi%
}%
\let \mathbfitorig \mathbfit%
\renewcommand{\mathbfit}[1]{{%
\textbf{%
\SetSymbolFont{__um_fam1}{mathbfitVersion}{TU}{mathbolditalic}{b}{it}%
\mathversion{mathbfitVersion}%
\(\mathbfitorig{#1}\)%
}%
}}%
}
\newcommand{\testUnicodeMath}{%
\bigskip
\begin{tabular}{l @{\quad}l @{\quad} l @{\quad} l @{\quad} l}
Row
& Math version/alphabet
& Regular
& Upright
& Italic \\[\medskipamount]
1
& Text
& A = 1a
& \textup{B = 2b}
& \textit{C = 3c} \\
2 &
\texttt{\textbackslash textbf}
& \textbf{A = 1a}
& \textbf{\textup{B = 2b}}
& \textbf{\textit{C = 3c}} \\
3
& \texttt{\textbackslash mathversion\{normal\}} (default)
& $A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}$
& $\mathup{B = 2b + \beta \times \Gamma}$
& $\mathit{C = 3c + \beta \times \Gamma}$ \\
4
& \texttt{\textbackslash mathversion\{bold\}}/\texttt{\textbackslash boldmath}
& \boldmath $A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}$
& \boldmath $\mathup{B = 2b + \beta \times \Gamma}$
& \boldmath $\mathit{C = 3c + \beta \times \Gamma}$ \\
5
& \texttt{\textbackslash mathbf}/\texttt{\textbackslash mathbfup}/\texttt{\textbackslash mathbfit}
& $\mathbf{A = 1a + \beta \times \Gamma \int_{-\infty}^{\infty} \frac{\mathup{d}x}{2}}$
& $\mathbfup{B = 2b + \beta \times \Gamma}$
& $\mathbfit{C = 3c + \beta \times \Gamma}$ \\
\end{tabular}%
\bigskip
\bigskip
}
\begin{document}
\testUnicodeMath
\textit{Check that everything works properly by invoking it a~second time:}
\testUnicodeMath
\textit{Check that everything works properly by invoking it a~third time:}
\testUnicodeMath
\end{document}
This produces the following output—note that the “3” in table row 3 is now italic, and it is bold italic in table rows 4 and 5:

Also note the contrast between \mathversion{bold}
/\boldmath
and \mathbf
/\mathbfup
/\mathbfit
: the former also makes all operators, integrals, etc. bold, while the latter only affects letters and digits.
\boldmath
not to switch fonts but rather to switch characters into the bold math alphabet range starting at U+1d400 in the current math font, so the appearance depends on the glyphs in that range.\boldmath
is shorthand for\mathversion{bold}
unicode-math allows aversion=bold
key in its font setting option to specify fonts to use in that case.version=bold
. If I add lines like\setmathfont[range=\mathup,version=bold]{LinLibertine_RB.otf}
or\setmathfont[range=\mathit,version=bold]{LinLibertine_RBI.otf}
, all characters in math mode become bold/italic. I guess I'm doing it wrong.