使用例外/排除列表将每个符号加粗

使用例外/排除列表将每个符号加粗

我想要一个命令,可以使所有内容变为粗体(在数学模式下),除了一些指定的例外列表。

例如,一个命令\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}}。如果您可以创建自己的数学字体,您还可以将普通字体和粗体字体声明为单独的数学符号字体​​。

相关内容