mhchem/amsmath 似乎改变了 @eqnnum 宏,所以我无法全局更改方程式编号颜色。我该如何解决这个问题?

mhchem/amsmath 似乎改变了 @eqnnum 宏,所以我无法全局更改方程式编号颜色。我该如何解决这个问题?

感谢 cfr我如何才能尽可能简单地获得自定义颜色的方程式数字?提供有关如何在未安装 mhchem/amsmath 包的情况下执行此操作的提示。要了解我的意思,这里有一个 MWE。如果我注释掉该行\usepackage[version=4]{mhchem},我就会得到所需的结果。似乎mhchem必须以某种方式重新定义\@eqnnum宏。

\documentclass{article}
\usepackage{xcolor,etoolbox}
\usepackage[version=4]{mhchem} 
\definecolor{SAEblue}{rgb}{0, .62, .91}
\makeatletter
\patchcmd{\@eqnnum}{\normalcolor}{\color{SAEblue}}{\typeout{eqnnum patch: OK!}}{\typeout{eqnnum patch: Oh, dear!}}
\begin{document}    
\begin{equation}
  1 + 2 = 3\label{eq:siml}
\end{equation}
\end{document}

我搜索了mhchem.stymhchem.texhpstatement.styrsphrase.sty。 这些都有点超出我的理解范围,但我没有发现任何明显会导致此问题的东西。 我的下一步是查看 需要哪些软件包mhchem,我得出了以下列表:

expl3, l3keys2e, l3regex, calc[1998/07/07], amsmath, chemgreek[2015/04/09], graphics, ifthen, textcomp, babel, twoopt

除了 之外,这些都不会导致问题amsmath。以下 MWE 工作正常,直到您取消注释该amsmath行:

\documentclass{article}
\usepackage{xcolor,etoolbox}
\usepackage{expl3}
\usepackage{l3keys2e}
\usepackage{l3regex}
\usepackage{calc}[1998/07/07]
%\usepackage{amsmath}
\usepackage{chemgreek}[2015/04/09]
\usepackage{graphics}
\usepackage{ifthen}
\usepackage{textcomp}
\usepackage[american]{babel}
\usepackage{twoopt}
%\usepackage[version=4]{mhchem} 
\definecolor{SAEblue}{rgb}{0, .62, .91}
\makeatletter
\patchcmd{\@eqnnum}{\normalcolor}{\color{SAEblue}}{\typeout{eqnnum patch: OK!}}{\typeout{eqnnum patch: Oh, dear!}}
\begin{document}
\begin{equation}
  1 + 2 = 3\label{eq:siml}
\end{equation}
\end{document}

取消注释amsmath将使颜色恢复为黑色(但没有错误)。

在 中amsmath.ins,我看到以下内容:

\iftagsleft@
  \def\@eqnnum{\hbox to1sp{}\rlap{\normalfont\normalcolor
    \hskip -\displaywidth\tagform@\theequation}}
\else
  \def\@eqnnum{{\normalfont\normalcolor \tagform@\theequation}}
\fi

我认为通过\@eqnnum补丁重新定义不会有什么区别,但老实说,我对所有这些东西的实际工作原理只有一小点了解。

此时,我正在寻求更多经验丰富的社区成员的指导,以使其与正在使用的amsmath/包一起工作。mhchem

答案1

你使用了错误的补丁,因为在amsmath加载时,方程编号的打印并没有委托给\@eqnnum任何人,或者至少以不同的方式委托。例如,使用 leqno 调整方程编号的对齐方式

\documentclass{article}
\usepackage{xcolor,etoolbox}
\usepackage[version=4]{mhchem}

\definecolor{SAEblue}{rgb}{0, .62, .91}

\makeatletter
% detach \eqref and \tag making
\renewcommand{\eqref}[1]{\textup{\eqreftagform@{\ref{#1}}}}
\let\eqreftagform@\tagform@
\def\tagform@#1{%
  \maketag@@@{\color{SAEblue}(\ignorespaces#1\unskip\@@italiccorr)}%
}
\makeatother

\begin{document}

In equation~\eqref{eq:siml} we state a truth.
\begin{equation}
  1 + 2 = 3\label{eq:siml}
\end{equation}

\end{document}

在此处输入图片描述

如果您希望也\eqref用蓝色打印方程式编号,请注释掉之前的两行\def\@tagform@

答案2

我有一个“黑客”解决方案:

mhchem加载amsmath,因此如果包含则省略amsmath将导致错误的颜色设置。mhchem

在我看来,罪魁祸首是\gdef\df@tag{\tagform@\theequation},忽略了 所做的颜色更改。我使用了另一个补丁并引入了一个通用,它被定义为这里的颜色。\endmathdisplay@\@eqnnum\mathtagcolorSAEblue

\documentclass{article}
\usepackage{xcolor}
\usepackage{xpatch}
\usepackage{expl3}
\usepackage{l3keys2e}
\usepackage{l3regex}
\usepackage{calc}[1998/07/07]

\usepackage{amsmath}
\usepackage{chemgreek}[2015/04/09]
\usepackage{graphicx}
\usepackage{ifthen}
\usepackage{textcomp}
\usepackage[american]{babel}
\usepackage{twoopt}

\newcommand{\mathtagcolor}{\normalcolor}

\definecolor{SAEblue}{rgb}{0, .62, .91}


\renewcommand{\mathtagcolor}{SAEblue}

\usepackage[version=4]{mhchem} 

\makeatletter
  \xpatchcmd{\@eqnnum}{\normalcolor}{\color{\mathtagcolor}}{\typeout{eqnnumpatch: OK!}}{\typeout{eqnnum patch: Oh, dear!}}
    \@ifpackageloaded{amsmath}{%
  \xpatchcmd{\endmathdisplay@a}{%
    \tagform@\theequation
  }{%
    \color{\mathtagcolor}\tagform@\theequation
  }{\typeout{patching \protect\endmathdisplay@a\ succeeded}}{\typeout{patching \protect\endmathdisplay@a\ failed}}
}{}
\makeatother

\begin{document}

\begin{equation}
  1 + 2 = 3\label{eq:siml}
\end{equation}
\end{document}

在此处输入图片描述

相关内容