如何对主方程中的子方程单独进行编号?

如何对主方程中的子方程单独进行编号?

我想在报告类中生成以下样式的子方程编号:

  • 主要方程式均有编号,可供参考。

  • 每个子方程式都用小写字母标记。这些标签垂直对齐。

  • 当引用子方程时,会显示其完整路径(例如,“方程 (1b)...”)。

这是我在一篇论文中找到的一个例子(不需要花括号):

在此处输入图片描述

(出自:Hans-Georg Beyer、Bernhard Sendhoff,《稳健优化 - 综合调查》,《应用力学和工程中的计算机方法》,第 196 卷,第 33-34 期,2007 年 7 月 1 日,第 3190-3218 页)

此代码产生标准样式:

\documentclass{report}

\usepackage{amsmath}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}

\begin{document}
\ldots can be stated as:
\begin{subequations}
\label{main_eq}
\begin{align}
\label{sub_eq1}\text{optimize:}\quad &f(x),\\
\label{sub_eq2}\text{subject to:}\quad &g(x)\leq0,\\
\label{sub_eq3}&h(x)=0,
\end{align}
\end{subequations}
where~\eqref{sub_eq2} represents an inequality constraint and~\eqref{sub_eq3} an equality constraint.

\ldots the optimum of $f(x)$ in~\eqref{main_eq}, like NP-hardness in\ldots

\end{document}

答案1

这是一个尝试;请注意,约束之间用分号分隔。

\documentclass{report}

\usepackage{amsmath,array,xparse}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}

\newcounter{optproblemline}
\renewcommand{\theoptproblemline}{\alph{optproblemline}}
\makeatletter
\renewcommand{\p@optproblemline}{\theequation}
\makeatother


\ExplSyntaxOn
\NewDocumentCommand{\optproblem}{ m m }
 {
  \shaul_opt_problem:n { #2 }
  \setcounter{optproblemline}{0}%
  \left.
  \cs_set_eq:Nc \label { ltx@label } % in a group, reset \label
  \begin{array}{
    @{}
    l
    @{\quad}
    >{\refstepcounter{optproblemline}}l
    >{\textnormal{(\theoptproblemline)}}l
  }
  \textnormal{optimize:}&#1&\\
  \textnormal{subject~to:} \tl_use:N \l_shaul_constraints_tl
  \end{array}
  \right\rbrace
}

\tl_new:N \l_shaul_constraints_tl
\seq_new:N \l_shaul_constraints_seq

\cs_new_protected:Npn \shaul_opt_problem:n #1
 {
  \tl_clear:N \l_shaul_constraints_tl
  \seq_set_split:Nnn \l_shaul_constraints_seq { ; } { #1 }
  \seq_map_inline:Nn \l_shaul_constraints_seq
   {
    \tl_put_right:Nn \l_shaul_constraints_tl { & ##1 & \\ }
   }
 }
\ExplSyntaxOff

\begin{document}
\ldots can be stated as:
\begin{equation}\label{main_eq}
\optproblem{f(x)\label{sub_eq1}}
 {
  g(x)\leq0, \label{sub_eq2};
  h(x)=0, \label{sub_eq3}
 }
\end{equation}
where~\eqref{sub_eq2} represents an inequality constraint and~\eqref{sub_eq3} 
an equality constraint.

\ldots the optimum of $f(x)$ in~\eqref{main_eq}, like NP-hardness in\ldots

\end{document}

在此处输入图片描述

答案2

工作笔记

目前,我可以向您提供无需amsmath加载的解决方案。它具有保护功能\label,但我尚未弄清楚如何规避该保护。

\documentclass{report}
\pagestyle{empty}
%\usepackage{amsmath} % Not working for now...
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}
\usepackage{refcount}
\usepackage{alphalph}
%\let\oldlabel=\label
%\let\oldref=\ref
%\let\oldpageref=\pageref
%\let\label=\oldlabel
%\let\ref=\oldref
%\let\pageref=\oldpageref
\newcounter{malsubeqn}[equation]
\def\mallabel#1{%
  \refstepcounter{malsubeqn}%
  (\alph{malsubeqn})%
  \label{#1}%
  %\typeout{\meaning\label}
  }% End of \mallabel...
\def\malsubeqref#1{(\hyperref[#1]{%
  \theequation\alphalph{\getrefnumber{#1}}%
  })}% End of \maleqref...
\def\maleqref#1{(\ref{#1})}

\begin{document}
%\typeout{\meaning\oldlabel}
\ldots can be stated as:
\begin{equation}
\label{main_eq}
%\begin{subequations}
%\begin{aligned}%{rll}
\left.\begin{array}{rll}
\textrm{optimize:}\quad & f(x),            & \mallabel{sub_eq1}\\
\textrm{subject to:}\quad & g(x)\leq0,& \mallabel{sub_eq2}\\
   & h(x)=0,                                    & \mallabel{sub_eq3}\\
\end{array}\right\}
%\end{align}
%\end{subequations}
\end{equation}
where~\malsubeqref{sub_eq1} is a function to be optimized, \malsubeqref{sub_eq2} represents an inequality constraint and~\malsubeqref{sub_eq3} an equality constraint.\par
\ldots the optimum of $f(x)$ in~\maleqref{main_eq}, like NP-hardness in\ldots
\end{document}

姆韦

相关内容