我用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
宏(用于显示计数器的宏)被(重新)定义为parentequation
和equation
计数器的组合。重要的是,宏的重新定义\theequation
是环境本地的:一旦环境结束,subequations
它将不再有效。subequations
完成所有这些之后,就进入了环境主体
subequations
。在此部分中,通常会发现诸如 、 等环境equation
。align
作为其工作的一部分,这些环境通常会踩踏柜台equation
。现在,这种设置的美妙之处(天才之处?!)
subequations
显而易见:从属的equation
、align
等环境根本不需要被告知它们嵌入在subequations
环境中。因此,从属环境可以继续做它们通常的事情,它们不必从步进计数器切换equation
到步进(不存在的)subequation
计数器。(而且,当环境结束时,它们不必被告知subequations
!)当
subequations
环境结束时,指令\setcounter{equation}{\value{parentequation}}
和\ignorespacesafterend
将运行。\setcounter{equation}{\value{parentequation}}
用于将equation
计数器的值重置为的值parentequation
。例如,如果的值为parentequation
“15”,则该值将传输(回)到计数器equation
。
总而言之,subequations
环境并不要求从属equation
型环境(equation
、align
等)做与它们不在环境中时所做的不同的事情subequations
。
我无法判断这种设置的简单性是否这选择它的原因。然而,我认为这是值得注意的。
就我个人而言,使用\patchcmd
修改环境内部subequations
似乎并不是为实现这种简单性而付出的高昂代价。当然,我不会同意有人认为操作存在一致性(或不一致性,视情况而定)问题。