我想要一个命令,可以使所有内容变为粗体(在数学模式下),除了一些指定的例外列表。
例如,一个命令\boldformula
使除括号外的每个符号都变为粗体,以便
\boldformula{ a \ast ( b \ast c) }
相当于
\bm{a \ast} ( \bm{b \ast c} )
有什么建议吗?
编辑:回应 egreg 的评论。我希望粗体公式能够与其余数学环境和平共处,保留对齐、成对分隔符等。
如果更简单的话,有选择地将某些符号加粗的命令也很好。例如,将标准数学字体、\ast、\subset、\cap 中的字母数字字符加粗,而其他所有字符保持不变的命令已经很有帮助了。
答案1
这是一个概念证明:
\documentclass{article}
\usepackage{amsmath,bm}
%\usepackage{xparse} % not needed for LaTeX 2020-10-01 or later
\ExplSyntaxOn
\cs_new_protected:Nn \vigolo_embolden_command:N
{
\cs_set_eq:cN { __vigolo_ \cs_to_str:N #1 : } #1
\cs_set_protected:Npn #1 { \bm { \use:c { __vigolo_ \cs_to_str:N #1 : } } }
}
\cs_new_protected:Nn \vigolo_embolden_char:n
{
\exp_args:Nc \mathchardef { __vigolo_#1: } = \mathcode`#1 \scan_stop:
\cs_set_protected:cn { __vigolo_#1_bold: } { \bm { \use:c { __vigolo_#1: } } }
\char_set_active_eq:nc { `#1 } { __vigolo_#1_bold: }
\mathcode`#1 = "8000 \scan_stop:
}
\cs_new_protected:Nn \vigolo_embolden:
{
\clist_map_function:nN
{% fill up
A,B,C,D,
a,b,c,d,
*,+,-,
}
\vigolo_embolden_char:n
\clist_map_function:nN
{% fill up
\ast,\langle,\rangle,\rightarrow,\to,\subset,
}
\vigolo_embolden_command:N
}
\NewDocumentCommand{\boldformula}{m}
{
\group_begin:
\vigolo_embolden:
#1
\group_end:
}
\ExplSyntaxOff
\begin{document}
$\boldformula{ a \ast ( b \ast c)\subset A }+abc$
$\bm{ a \ast ( b \ast c)\subset A }+abc$ (for comparison)
\end{document}
只有特定对象才被声明为在范围内加粗\boldformula
。我猜分隔符还需要做更多的工作。
答案2
在unicode-math
,您可以使用选项加载较轻的数学家族权重range=
,例如:
\documentclass{article}
\usepackage{unicode-math}
\setmathfont{XITS Math Bold}
\setmathfont{XITS Math}[range=\ast]
\begin{document}
\[ A \ast B \ast C \]
\end{document}
Minion Math 和 KP Math 是一些具有多种粗细的字体系列。
range=
不幸的是,version=
截至 2020 年,的\setmathfont
参数彼此不兼容。因此,如果这样做,您也不能使用\boldmath
或\boldsymbol
这会阻止我们将其定义为可以关闭和打开的数学样式。
否则,实现此目的的一种方法是将粗体符号包装在 中\boldsymbol{}
。也可以调整代码\boldsymbol
,从amsbsy.sty
切换到\mathversion{normal}
,而不是\mathversion{bold}
\let\oldast=\ast
。然后您可以执行类似和 的操作\renewcommand\ast{\normalsymbol{\oldast}}
。如果您可以创建自己的数学字体,您还可以将普通字体和粗体字体声明为单独的数学符号字体。