我希望我对一组子方程的引用能够自动包含相关子方程的所有字母。请参阅下面的示例代码。我设想这将涉及一个宏\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
使用,请首先执行此操作,例如。\label
subequations
enumerate
延期作业适当设置\@currentlabel
并发布\label
。
hyperref
注意:这不会在环境开始时设置锚点subequations
。否则成本会更高。