对于特定的数学字体,如何将字符变为斜体,但不将数字变为斜体?

对于特定的数学字体,如何将字符变为斜体,但不将数字变为斜体?

我创建了显示向量、矩阵和张量的命令。对于张量,我使用粗体斜体数学字体,它看起来完全符合我对字符的要求。但是,当用数字表示张量时,情况看起来不一致:

\documentclass{standalone}

\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\DeclareMathAlphabet{\mathsfit}{T1}{\sfdefault}{m}{sl}
\SetMathAlphabet{\mathsfit}{bold}{T1}{\sfdefault}{bx}{sl}

\renewcommand\vec[1] {\bm{\MakeLowercase{#1}}}
\newcommand\mat[1]   {\bm{\MakeUppercase{#1}}}
\newcommand\ten[1]   {\bm{\mathsfit{\MakeUppercase{#1}}}}

\begin{document}

\begin{tabular}{lcccc}
    & scalar & vector & matrix & tensor \\
    character & $a$ & $\vec{a}$ & $\mat{a}$ & $\ten{a}$ \\
    digit & $1$ & $\vec{1}$ & $\mat{1}$ & $\ten{1}$
\end{tabular}

\end{document}

在此处输入图片描述

如您所见,常规数学字体中的数字通常不是斜体。但是,当使用自定义数学字体表示张量时,它们会倾斜,从而导致外观不一致。我尝试使用\DeclareMathSymbol(如这个答案),但这会改变所有数字(包括标量、矢量和矩阵的数字)。

有什么方法可以避免此自定义张量字体的数字变成斜体?

答案1

您可以利用数学字母选择不是累积的事实。

\documentclass{article}
\usepackage{fix-cm}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\DeclareMathAlphabet{\mathsfit}{T1}{\sfdefault}{m}{sl}
\SetMathAlphabet{\mathsfit}{bold}{T1}{\sfdefault}{bx}{sl}

\ExplSyntaxOn
\RenewDocumentCommand\vec{m}
 { \bm { \text_lowercase:n { #1 } } }
\NewDocumentCommand\mat{m}
 { \bm { \text_uppercase:n { #1 } } }
\NewDocumentCommand\ten{m}
 {
  \tsjolder_tensor_check_number:n { #1 }
  \bm { \mathsfit { \l__tsjolder_tensor_tl } }
 }

\tl_new:N \l__tsjolder_tensor_tl

\cs_new_protected:Nn \tsjolder_tensor_check_number:n
 {
  \tl_set:Nx \l__tsjolder_tensor_tl { \text_uppercase:n { #1 } }
  \regex_replace_all:nnN { ([[:digit:]]) } { \c{mathsf}\cB\{\1\cE\} } \l__tsjolder_tensor_tl
 }

\ExplSyntaxOff 


\begin{document}

\begin{tabular}{lcccc}
    & scalar & vector & matrix & tensor \\
    character & $a$ & $\vec{a}$ & $\mat{a}$ & $\ten{a}$ \\
    digit & $1$ & $\vec{1}$ & $\mat{1}$ & $\ten{1}$
\end{tabular}

\end{document}

在 的情况下\ten,参数中的数字将被 替换\mathsf{<digit>}

在此处输入图片描述

另一方面,我不明白为什么要使用大写或小写:如果你意思是小写字母,你应该输入如此。有了这个条件,并且假设输入只是一个字符,那么有一个更简单的实现:

\documentclass{article}
\usepackage{fix-cm}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{bm}

\DeclareMathAlphabet{\mathsfit}{T1}{\sfdefault}{m}{sl}
\SetMathAlphabet{\mathsfit}{bold}{T1}{\sfdefault}{bx}{sl}

\ExplSyntaxOn
\RenewDocumentCommand\vec{m}
 {
  \bm { #1 }
 }

\NewDocumentCommand\mat{m}
 {
  \bm { #1 }
 }
\NewDocumentCommand\ten{m}
 {
  \regex_match:nnTF { [[:digit:]] } { #1 }
   {
    \bm { \mathsf { #1 } }
   }
   {
    \bm { \mathsfit { #1 } }
   }
 }

\ExplSyntaxOff 


\begin{document}

\begin{tabular}{lcccc}
    & scalar & vector & matrix & tensor \\
    character & $a$ & $\vec{a}$ & $\mat{A}$ & $\ten{A}$ \\
    digit & $1$ & $\vec{1}$ & $\mat{1}$ & $\ten{1}$
\end{tabular}

\end{document}

答案2

LuaLaTeX 或 XeLaTeX 的软件包unicode-math允许您使用正确的软件包选项执行所需的操作(自动更改大小写除外)。在这里,我选择了一种字体,其中

答案3

我最终将这个问题的答案中的信息整合在一起。

我使用了这个答案我用一段代码找到了isomath按照建议在这个答案中)。

具体来说,我创建了一个命令来区分数字和非数字,如下所示(我不太熟悉原始答案中的explsyntax):

\DeclareMathAlphabet{\mathsfit}{T1}{\sfdefault}{m}{sl}
\SetMathAlphabet{\mathsfit}{bold}{T1}{\sfdefault}{bx}{sl}

\newcommand\mathsans[1]  {%
    \ifnum9<1#1
        \mathsf{#1}%
    \else
        \mathsfit{#1}%
    \fi
}

然后使用以下张量定义

\newcommand\ten[1]   {\bm{\MakeUppercase{\mathsans{#1}}}}

得到了以下结果。我还添加了结果表isomath以供比较:

在此处输入图片描述

结果并不完全完美,但我认为与我得到的结果相比,不一致性不那么明显isomath

相关内容