为什么当我自定义子方程编号时,它不能按预期工作?

为什么当我自定义子方程编号时,它不能按预期工作?

我用IEEEtran它来排版,似乎将子方程的编号保留为默认值时,子方程的引用是正确的。然而,当我自定义它时,所有子方程的方程编号都会重置为 1,但当我引用它们时,它们被正确引用。

在此处输入图片描述

这是我的源代码:

\documentclass[]{IEEEtran}

    \usepackage{amsmath}
    \usepackage{amssymb, amsfonts}
    \usepackage{adjustbox}
    \usepackage[]{mathtools}

        % Custom equation numbering for journals

            % Numbering style
            \newtagform{Eq}[\renewcommand{\theequation}{[\arabic{equation}]}]{}{}
            \usetagform{Eq}

            % Referencing style
            \renewcommand{\theequation}{\arabic{equation}}


    \usepackage{etoolbox}
    \patchcmd{\subequations}{\alph{equation}}{-\Roman{equation}}{}{}



\begin{document}



\begin{equation}
    P =
    \begin{dcases}
    %
    E = m c^2 & c \approx 3.00\times 10^{8}\,\mathrm{m}/\mathrm{s}
    \\
    \int x-3\, dx & \text{display style}
    %
    \end{dcases}
    %
    \label{eq:Eq1}
\end{equation}


\begin{subequations}


    \begin{align}
        I_{sc} & = I_{sc,ref} & \hspace{-15mm} \bigg[  1 + \frac{\alpha}{100} (T_{op}-T_{ref}) \biggl]
        \vspace{2 mm}
        \label{eq:SubEq1}
        \\
        %
        V_{oc} & = V_{oc,ref} & \hspace{-15mm} \bigg[  1 + \frac{\beta}{100} (T_{op}-T_{ref}) \biggl]
        \vspace{2 mm}
        \label{eq:SubEq2}
        \\
        %
        P_{mp} & = P_{mp,ref} & \hspace{-15mm} \bigg[  1 + \frac{\gamma}{100} (T_{op}-T_{ref}) \biggl]
        \label{eq:SubEq3}
    \end{align}


\end{subequations}

See SubEq. \ref{eq:SubEq1}


\begin{equation}
    P =
    \begin{dcases}
    %
    E = m c^2 & c \approx 3.00\times 10^{8}\,\mathrm{m}/\mathrm{s}
    \\
    \int x-3\, dx & \text{display style}
    %
    \end{dcases}
    %
    \label{eq:Eq4}
\end{equation}


\end{document}

顺便问一下,有没有办法不使用\patchcmd命令来自定义子方程编号?

答案1

您需要修改(并简化)该\newtagform指令。

在此处输入图片描述

\documentclass[]{IEEEtran}
\usepackage{mathtools, amssymb, amsfonts}
\usepackage{etoolbox, calc, siunitx}

% Custom equation numbering for journals
\newtagform{Eq}{[}{]}
\usetagform{Eq}
\patchcmd{\subequations}{\alph{equation}}{-\Roman{equation}}{}{}
%% or, possibly:
%% \patchcmd{\subequations}{\alph{equation}}{-\arabic{equation}}{}{}

% utility macro
\newcommand\spbox[2]{\makebox[\widthof{$#1$}][r]{$#2$}}

\begin{document}

\begin{equation}
    P =
    \begin{dcases}
    %
    E = m c^2 & c \approx \SI{3.00e8}{\meter\per\second}
    \\
    \int x-3\, dx & \text{display style}
    %
    \end{dcases}
    %
    \label{eq:Eq1}
\end{equation}

\begin{subequations}
\begin{align}
    I_{\textrm{sc}} &= \spbox{P_{\textrm{mp,ref}}}{I_{\textrm{sc,ref}}}
    \Bigl[ 1 + \frac{\alpha}{100} (T_{\textrm{op}}-T_{\textrm{ref}}) \Bigr]
    \label{eq:SubEq1}
    \\[2mm]
    %
    V_{\textrm{oc}} &= \spbox{P_{\textrm{mp,ref}}}{V_{\textrm{oc,ref}}}
    \Bigl[ 1 + \frac{\beta}{100}  (T_{\textrm{op}}-T_{\textrm{ref}}) \Bigr]
    \label{eq:SubEq2}
    \\[2mm]
    %
    P_{\textrm{mp}} &= P_{\textrm{mp,ref}} 
    \Bigl[ 1 + \frac{\gamma}{100} (T_{\textrm{op}}-T_{\textrm{ref}}) \Bigr]
    \label{eq:SubEq3}
\end{align}
\end{subequations}
See subeq.~\eqref{eq:SubEq1}.

\begin{equation}
    P =
    \begin{dcases}
    %
    E = m c^2 & c \approx \SI{3.00e8}{\meter\per\second}
    \\
    \int x-3\, dx & \text{display style}
    %
    \end{dcases}
    %
    \label{eq:Eq4}
\end{equation}
\end{document}

附录为了解决 OP 的后续评论,关于为什么有必要使用\patchcmd为了达到 OP 的格式化目标,为什么没有称为subequation(或subequations)的计数器。

我无法谈论深刻的哲学问题为什么直接提问。(首先,我从未参与过amsmath!)但是,我可以解释一下什么环境subequations确实如此。希望这个解释能间接解答你的疑问。

我们首先来看一下文件中的相关代码amsmath.sty

\newcounter{parentequation}% Counter for ``parent equation''.
% ...
\newenvironment{subequations}{%
  \refstepcounter{equation}%
  \protected@edef\theparentequation{\theequation}%
  \setcounter{parentequation}{\value{equation}}%
  \setcounter{equation}{0}%
  \def\theequation{\theparentequation\alph{equation}}%
  \ignorespaces
}{%
  \setcounter{equation}{\value{parentequation}}%
  \ignorespacesafterend
}
  • 一个新的计数器定义,但它被称为parentequation而不是subequation

  • \subequations(相当于\begin{subequations})执行以 结尾的六行代码\ignorespaces

  • \subequations运行时,equation计数器会步进(通过\refstepcounter)。接下来,将的值equation分配给parentequation计数器。例如,如果equation计数器的值为步进后为“15”,则将的值parentequation设置为“15”。

    该说明\protected@edef\theparentequation{\theequation}考虑到了作者可能需要交叉引用整个(子)方程组的可能性。对“父方程”的引用将使用文档其他部分中“正常”方程所用的格式。

  • 接下来,equation计数器被重置为0,并且\theequation宏(用于显示计数器的宏)被(重新)定义为parentequationequation计数器的组合。重要的是,宏的重新定义\theequation是环境本地的:一旦环境结束,subequations它将不再有效。subequations

  • 完成所有这些之后,就进入了环境主体subequations。在此部分中,通常会发现诸如 、 等环境equationalign作为其工作的一部分,这些环境通常会踩踏柜台equation

    现在,这种设置的美妙之处(天才之处?!)subequations显而易见:从属的equationalign等环境根本不需要被告知它们嵌入在subequations环境中。因此,从属环境可以继续做它们通常的事情,它们不必从步进计数器切换equation到步进(不存在的)subequation计数器。(而且,当环境结束时,它们不必被告知subequations!)

  • subequations环境结束时,指令\setcounter{equation}{\value{parentequation}}\ignorespacesafterend将运行。 \setcounter{equation}{\value{parentequation}}用于将equation计数器的值重置为的值parentequation。例如,如果的值为parentequation“15”,则该值将传输(回)到计数器equation

总而言之,subequations环境并不要求从属equation型环境(equationalign等)做与它们不在环境中时所做的不同的事情subequations

我无法判断这种设置的简单性是否选择它的原因。然而,我认为这是值得注意的。

就我个人而言,使用\patchcmd修改环境内部subequations似乎并不是为实现这种简单性而付出的高昂代价。当然,我不会同意有人认为操作存在一致性(或不一致性,视情况而定)问题。

相关内容