如何修复有关重新定义 \vec 的 amsmath 警告

如何修复有关重新定义 \vec 的 amsmath 警告

我使用的是 pss(b) 模板,其开头为:

\documentclass[pss]{wiley2sp} % provides pss two-column style
\usepackage{amsmath}
%\usepackage{bm}              % uncomment these two packages if you
%\usepackage{w-greek}         % need extended greek-letter functionality in math mode

我总是收到这个警告:

包 amsmath 警告:无法重新定义数学重音\vec

有谁知道如何解决这个问题?

答案1

首先加载amsmath

\RequirePackage{amsmath}
\documentclass[pss]{wiley2sp} % provides pss two-column style
...

然后首先amsmath定义它并将重新定义它。\vecwiley2sp

答案2

这个“问题”是您正在使用的类所固有的。

事情是这样的:你加载wiley2sp,设置文档结构。它还(重新)定义了宏\vec

\if@mathematic
   \def\vec#1{\ensuremath{\mathchoice
                     {\mbox{\boldmath$\displaystyle\mathbf{#1}$}}
                     {\mbox{\boldmath$\textstyle\mathbf{#1}$}}
                     {\mbox{\boldmath$\scriptstyle\mathbf{#1}$}}
                     {\mbox{\boldmath$\scriptscriptstyle\mathbf{#1}$}}}}
\else
   \def\vec#1{\ensuremath{\mathchoice
                     {\mbox{\boldmath$\displaystyle#1$}}
                     {\mbox{\boldmath$\textstyle#1$}}
                     {\mbox{\boldmath$\scriptstyle#1$}}
                     {\mbox{\boldmath$\scriptscriptstyle#1$}}}}
\fi

这将\vec{<stuff>}打印大胆的数学字体。是的,它实际上将宏从前者重新定义\mathaccent为上述。

现在加载amsmath,它循环显示多个数学符号并重新配置它们。以下是实际代码的摘录:

\def\@tempa#1{\@xp\@tempb\meaning#1\@nil#1}
\def\@tempb#1>#2#3 #4\@nil#5{%
  \@xp\ifx\csname#3\endcsname\mathaccent
    \@tempc#4?"7777\@nil#5%
  \else
    \PackageWarningNoLine{amsmath}{%
      Unable to redefine math accent \string#5}%
  \fi
}
\def\@tempc#1"#2#3#4#5#6\@nil#7{%
  \chardef\@tempd="#3\relax\set@mathaccent\@tempd{#7}{#2}{#4#5}}
\@tempa{\hat}
\@tempa{\check}
\@tempa{\tilde}
\@tempa{\acute}
\@tempa{\grave}
\@tempa{\dot}
\@tempa{\ddot}
\@tempa{\breve}
\@tempa{\bar}
\@tempa{\vec}

上述代码以以下文档为前缀:

我们重新定义了标准数学重音命令调用\mathaccentV,使用其先前定义中嵌入的数学组/编码编号信息。如果重音命令的定义不具有预期的形式,我们将保留重音命令,但会发出警告。

您会注意到,重新定义集需要数学重音的先前定义作为开始(作为中的条件\mathaccent的一部分)。由于重新定义为完全不同的东西(不再是),因此报告警告。\ifx\@tempbwiley2sp\vec\mathaccentamsmath

解决这个问题的方法是捕捉\vec wiley2sp重新定义它,并在检查重新定义它之前恢复它amsmath。以下实现此目的:

\let\oldvec\vec% Store \vec in \oldvec
\documentclass{wiley2sp}
\let\vec\oldvec% Restore \vec from \oldvec

请注意,如果这是与出版商相关的样式或类别,他们很可能希望\vec以特定格式打印其 tors。因此,删除\vectors 的这种格式可能不建议。

相关内容