如何根据环境调整 \newcommand 数学表达式中的字体

如何根据环境调整 \newcommand 数学表达式中的字体

我正在写关于 NO2 气体的论文。正确的写法是$NO_2$。目前,我定义了一个宏来简化输入:

\newcommand{\notwo}[0]{\chem{NO_2}\xspace}

\chem是一个宏定义在哥白尼包裹:

\def\testbx{bx}
\DeclareRobustCommand*{\chem}[1]{\ensuremath{%
\mathcode`-="0200\mathcode`\=="003D% no space around "-" and "="
\ifx\testbx\f@series\mathbf{#1}\else\mathrm{#1}\fi}}

但是,我想进一步扩展这一点。特别是,当我使用无衬线字体时,我希望它\notwo是无衬线的;当我使用无衬线粗体字体时,我希望它\notwo是无衬线粗体。

我正在使用 xelatex,并且正在使用系统范围安装的Myraid 专业版字体(OTF)通过以下行

\setsansfont[Mapping=tex-text,ItalicFont={MyriadPro-It},BoldFont={MyriadPro-Bold}]{Myriad Pro}.

我怎样才能实现这个目标?

答案1

看着那(这mhchem用于化学公式通用方法的软件包。这允许使用简单的语法

\ce{NO2}

答案2

您需要扩展测试并定义新的数学字母表:

\makeatletter
\def\test@bx{bx}
\edef\test@sf{\sfdefault}
\DeclareRobustCommand*{\chem}[1]{\ensuremath{%
  \mathcode`-="0200 \mathcode`\=="003D % no space around "-" and "="
  \ifx\f@family\test@sf
    \ifx\test@bx\f@series
      \let\next\mathsfbf
    \else
      \let\next\mathsf
    \fi
  \else
    \ifx\test@bx\f@series
      \let\next\mathbf
    \else
      \let\next\mathrm
    \fi
  \fi
  \next{#1}}}

\DeclareMathAlphabet{\mathsfbf}{\encodingdefault}{\sfdefault}{bx}{n}
\makeatother

相关内容