Выделение каждого символа жирным шрифтом с исключениями/списком исключений

Выделение каждого символа жирным шрифтом с исключениями/списком исключений

Мне бы хотелось иметь команду, которая делает все жирным шрифтом (в математическом режиме), за исключением некоторого определенного списка исключений.

Например, команда \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}}. Если вы можете создавать свои собственные математические шрифты, вы также могли бы объявить обычные и жирные шрифты как отдельные шрифты математических символов.

Связанный контент