
我想要一個命令,使所有內容都變成粗體(在數學模式下),除了某些指定的例外清單之外。
例如,一個命令\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 是一些具有多種粗細的字體系列。
不幸的是,截至 2020 年,range=
和 的version=
參數\setmathfont
彼此不相容\boldmath
。\boldsymbol
否則,實現此目的的一種方法是將粗體符號包裹在 中\boldsymbol{}
。也可以將\boldsymbol
程式碼從amsbsy.sty
改為 切換為 ,\mathversion{normal}
而不是\mathversion{bold}
。然後你可以做類似\let\oldast=\ast
和 的事情\renewcommand\ast{\normalsymbol{\oldast}}
。如果您可以創建自己的數學字體,則還可以將普通字體和粗體字體聲明為單獨的數學符號字體。