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

我有一個“hacky”解決方案:

mhchem負載amsmath,因此如果包含的話,省略amsmath無論如何都會導致錯誤的顏色設定。mhchem

\gdef\df@tag{\tagform@\theequation}\endmathdisplay@我看來,罪魁禍首是忽略了 所做的顏色變化\@eqnnum。我使用了另一個補丁並引入了一個 General \mathtagcolor,它被定義為SAEblue這裡的顏色。

\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}

在此輸入影像描述

相關內容