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