Como posso definir a fonte \boldmath com unicode-math?

Como posso definir a fonte \boldmath com unicode-math?

Estou tentando compor um documento no Linux Libertine e também quero usar a fonte para caracteres alfanuméricos no modo matemático. Estou usando unicode-math, não mathspec, porque preciso especificar alfabetos como mathupexplicitamente para compatibilidade com pacotes como hepnames. Não encontrei uma maneira de fazer isso com mathspec. O motor que uso é o XeLaTeX. Inicialmente, especifico TeX Gyre Pagella Math como uma fonte matemática completa para símbolos, etc. Quero que as declarações subsequentes substituam a fonte dos caracteres de texto como Libertine.

Encontro vários problemas, ilustrados pelo MWE abaixo:

  1. O \boldmathswitch não faz nada.
  2. Os números não são renderizados corretamente em negrito e itálico, apenas letras.
  3. \mathbf(o último "A = 1" no MWE) é renderizado em Pagella, e não em Libertine.

Já tentei adicionar /{latin,Latin,num}nas rangedeclarações, sem sucesso. O que estou perdendo aqui?

\documentclass{minimal}

\usepackage{fontspec}
\usepackage{unicode-math}

\setmainfont[%
    Ligatures=TeX,
    BoldFont=LinLibertine_RB.otf,
    ItalicFont=LinLibertine_RI.otf,
    BoldItalicFont=LinLibertine_RBI.otf]
    {LinLibertine_R.otf}

\setmathfont{texgyrepagella-math.otf}

\setmathfont[range=\mathup]{LinLibertine_R.otf}
\setmathfont[range=\mathbf]{LinLibertine_RB.otf}
\setmathfont[range=\mathit]{LinLibertine_RI.otf}
\setmathfont[range=\mathbfit]{LinLibertine_RBI.otf}

\begin{document}
    \begin{tabular}{lll}
        Text     & A = 1               & \textit{B = 2}\\
        Textbf   & \textbf{A = 1}      & \textbf{\textit{B = 2}}\\
        Math     & $A = 1$             & $\mathit{B = 2}$\\
        Boldmath & {\boldmath $A = 1$} & {\boldmath $\mathit{B = 2}$}\\
        Mathbf   & $\mathbf{A = 1}$    & $\mathbfit{B = 2}$\\
    \end{tabular}
\end{document}

insira a descrição da imagem aqui

Sem alterações de fonte, tudo parece OK:

\documentclass{minimal}

\begin{document}
    \begin{tabular}{lll}
        Text     & A = 1               & \textit{B = 2}\\
        Textbf   & \textbf{A = 1}      & \textbf{\textit{B = 2}}\\
        Math     & $A = 1$             & $\mathit{B = 2}$\\
        Boldmath & {\boldmath $A = 1$} & {\boldmath $\mathit{B = 2}$}\\
    \end{tabular}
\end{document}

insira a descrição da imagem aqui

Responder1

Encontrei uma solução que funciona para mim. Comecei a brincar com version=bold, como David sugeriu, mas isso continuou mudandotodosmeu texto do modo matemático em negrito. No final, mudei dos nomes dos arquivos para os nomes das fontes do sistema. (Eu queria evitar isso inicialmente, já que estou trabalhando no mesmo documento em várias máquinas diferentes.) Com nomes de fontes do sistema, \boldmath funcionou de forma imediata e automática. Também descobri que \mathbfupdeve ser especificado em vez de \mathbf.

Outro problema com o uso de nomes de fontes do sistema é que, por algum motivo, o estilo Libertine semi-negrito é carregado por padrão como negrito. Essa é a razão da BoldFontespecificação no MWE abaixo.

A solução não é perfeita. Você pode ver que todos os números no modo matemático são renderizados na vertical, mesmo no formato \mathit. Além disso, o número \mathbfitnão está em negrito. Todas as fontes estão corretas e são boas o suficiente para meus propósitos.

\documentclass{minimal}

\usepackage{fontspec}
\usepackage{unicode-math}

\setmainfont[
    BoldFont=Linux Libertine Bold,
    BoldItalicFont=Linux Libertine Bold Italic]
    {Linux Libertine}

\setmathfont{TeX Gyre Pagella Math}

\setmathfont[range=\mathup,
    BoldFont=Linux Libertine Bold,
    BoldItalicFont=Linux Libertine Bold Italic]
    {Linux Libertine}
\setmathfont[range=\mathit,
    BoldFont=Linux Libertine Bold Italic]
    {Linux Libertine Italic}
\setmathfont[range=\mathbfup]{Linux Libertine Bold}
\setmathfont[range=\mathbfit]{Linux Libertine Bold Italic}

\begin{document}
    \begin{tabular}{lll}
        ~        &\ Regular             &\ Italic\\
        Text     &\ A = 1               &\ \textit{A = 1}\\
        Textbf   &\ \textbf{A = 1}      &\ \textbf{\textit{A = 1}}\\
        Math     &\ $A = 1$             &\ $\mathit{A = 1}$\\
        Boldmath &\ {\boldmath $A = 1$} &\ {\boldmath $\mathit{A = 1}$}\\
        Mathbf   &\ $\mathbf{A = 1}$    &\ $\mathbfit{A = 1}$\\
    \end{tabular}
\end{document}

insira a descrição da imagem aqui

Responder2

tg85 anotadoduas questões com a resposta que ele forneceu à sua própria pergunta:

A solução não é perfeita. Você pode ver que todos os números no modo matemático são renderizados na vertical, mesmo no formato \mathit. Além disso, o número \mathbfitnão está em negrito. Todas as fontes estão corretas e são boas o suficiente para meus propósitos.

Omatemática unicodemanual(Figura 7) afirma que a forma vertical é, na verdade, escolhida propositalmente para os numerais, porque eles “devem sempre ser retirados da fonte vertical, mesmo no estilo itálico”. De acordo com esta afirmação, parece que o Unicode não define slots para dígitos em itálico - embora defina slots para dígitos em negrito, dígitos sem serifa, etc.https://en.wikipedia.org/wiki/Mathematical_operators_and_symbols_in_Unicode#Mathematical_Alphanumeric_Symbols_block.

Posso compreender, no entanto, que ainda se deseje a composição tipográfica produzida pormatemática unicodepara ser consistente com a composição tipográfica original baseada em LaTeX, onde \mathit{1}produz um dígito um em itálico. Portanto, inspiradocódigo do tg85, encontrei uma solução que corrige esses dois problemas (também funciona com 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}

Isso produz a seguinte saída – observe que o “3” na linha 3 da tabela agora está em itálico e em negrito itálico nas linhas 4 e 5 da tabela:

\mathit e \mathbfit corrigidos

Observe também o contraste entre \mathversion{bold}/ \boldmathe \mathbf/ \mathbfup/ \mathbfit: o primeiro também deixa todos os operadores, integrais, etc. em negrito, enquanto o último afeta apenas letras e dígitos.

Responder3

Usar o pacote amsbsy e \pmb parece obter o negrito.

\documentclass{minimal}

\usepackage{fontspec}
\usepackage{unicode-math}
\usepackage{amsbsy}

\setmainfont[%
Ligatures=TeX,
BoldFont=LinLibertine_RB.otf,
ItalicFont=LinLibertine_RI.otf,
BoldItalicFont=LinLibertine_RBI.otf]
{LinLibertine_R.otf}

\setmathfont{texgyrepagella-math.otf}

\setmathfont[range=\mathup]{LinLibertine_R.otf}
\setmathfont[range=\mathbf]{LinLibertine_RB.otf}
\setmathfont[range=\mathit]{LinLibertine_RI.otf}
\setmathfont[range=\mathbfit]{LinLibertine_RBI.otf}

\begin{document}
\begin{tabular}{lll}
    Text     & A = 1               & \textit{B = 2}\\
    Textbf   & \textbf{A = 1}      & \textbf{\textit{B = 2}}\\
    Math     & $A = 1$             & $\mathit{B = 2}$\\
    Boldmath & { $\pmb{A = 1}$} & {$\pmb{\mathit{B = 2}}$}\\
    Mathbf   & $\mathbf{A = 1}$    & $\mathbfit{B = 2}$\\
\end{tabular}
\end{document}

insira a descrição da imagem aqui

Responder4

Com xelatexoulualatex

\documentclass{standalone}
\usepackage{hepparticles}
\usepackage{hepnames}
\usepackage[math-style=ISO]{unicode-math}
\usepackage{libertinus}
\usepackage{array}
\begin{document}

\tabcolsep=10pt
    \begin{tabular}{>{\ttfamily\textbackslash}lll}
    normalfont & Regular           &\itshape Italic\\
    textnormal & A = 1             & \textit{A = 1}\\
    textbf     & \textbf{A = 1}    & \textbf{\textit{A = 1}}\\
    mathup     & $\mathup{A} = 1$  & $A = 1$\\
    symbf      & $\symbfup{A = 1}$ & $\symbfit{A = 1}$\\
    mathbf     & $\mathbf{A = 1}$  & $\mathbfit{A = 1}$\\
\end{tabular}

\end{document}

insira a descrição da imagem aqui

informação relacionada