子公式引用(包括所有字母)

子公式引用(包括所有字母)

我希望我对一组子方程的引用能够自动包含相关子方程的所有字母。请参阅下面的示例代码。我设想这将涉及一个宏\labelsubeqn来替换示例代码中的标签,并且可能采用第二个输入参数来指示存在的子方程的数量。

\documentclass{article}

\usepackage{amsmath}

\begin{document}

\begin{subequations} \label{eqn1}
    \begin{align}
        a&=b    \\
        c&=d
    \end{align}
\end{subequations}

\begin{subequations} \label{eqn2}
    \begin{align}
        a&=b    \\
        c&=d    \\
        e&=f
    \end{align}
\end{subequations}

The reference `\eqref{eqn1}' I would like to appear as `(1a,b)' 
and the reference `\eqref{eqn2}' I would like to appear as `(2a-c)'.
\end{document}

答案1

我觉得这不是很好,但是...

为什么不呢?因为顶层的目的\label是为了引用全局数字,而子方程是为了让读者看到的。

\documentclass{article}

\usepackage{amsmath}
%\usepackage{xparse} % not needed with LaTeX 2020-10-01 or later

\ExplSyntaxOn
\AddToHook{env/subequations/begin}
 {
  \cs_set_eq:NN \label \__eddy_subequations_label:n
 }
\AddToHook{env/subequations/end}
 {
  \bool_if:NT \l__eddy_subequations_label_defer_bool
   {
    \__eddy_subequations_label_do:V \l__eddy_subequations_label_tl
   }
 }

\bool_new:N \l__eddy_subequations_label_defer_bool
\tl_new:N \l__eddy_subequations_label_tl

\cs_new_protected:Nn \__eddy_subequations_label:n
 {
  \use:c { @bsphack }
  \bool_set_true:N \l__eddy_subequations_label_defer_bool
  \tl_set:Nn \l__eddy_subequations_label_tl { #1 }
  \cs_set_eq:Nc \label { ltx@label }
  \use:c { @esphack }
 }
\cs_new_protected:Nn \__eddy_subequations_label_do:n
 {
  \int_case:nnF { \value{equation} }
   {
    {1}{ \__eddy_subequations_label_aux:nn { #1 } { a } } % just in case
    {2}{ \__eddy_subequations_label_aux:nn { #1 } { a,b } }
   }
   { \__eddy_subequations_label_aux:nn { #1 } { a-\int_to_alph:n { \value{equation} } } }
 }
\cs_generate_variant:Nn \__eddy_subequations_label_do:n { V }
\cs_new_protected:Nn \__eddy_subequations_label_aux:nn
 {
  \tl_set:cx { @currentlabel } { \theparentequation #2 }
  \label{#1}
 }
\ExplSyntaxOff

\begin{document}

\begin{subequations} \label{eqn1}
    \begin{align}
        a&=b    \\
        c&=d
    \end{align}
\end{subequations}

\begin{subequations} \label{eqn2}
    \begin{align}
        a&=b    \\
        c&=d    \\
        e&=f
    \end{align}
\end{subequations}

The reference `\eqref{eqn1}' I would like to appear as `(1a,b)' 
and the reference `\eqref{eqn2}' I would like to appear as `(2a-c)'.

\end{document}

这个想法是,里面的第一个\label命令subequations用于设置全局引用。但是,当知道子方程的全部数量时,我们需要推迟设置。因此,\label重新定义它来完成这项工作,然后它返回到正常状态。

需要如果您计划在环境内部没有数学显示的环境中\label使用,请首先执行此操作,例如。\labelsubequationsenumerate

延期作业适当设置\@currentlabel并发布\label

hyperref注意:这不会在环境开始时设置锚点subequations。否则成本会更高。

在此处输入图片描述

相关内容