我最近问了一个问题关于在环境中对方程块进行编号,其中只有一些方程应该被编号为子方程;在我的例子中,align
我有三个方程想要被编号为(1a)
,,。(1b)
(2)
我被指出了一个已经提出的解决方案这里,我测试过,它确实有效,但我发现在包含cleveref
包时此解决方案会失败。您可以在这里看到 MWE:
\documentclass{article}
\usepackage{amsmath}
\usepackage{cleveref} % Comment/uncomment to see the difference
\makeatletter
\newcounter{manualsubequation}
\renewcommand{\themanualsubequation}{\alph{manualsubequation}}
\newcommand{\startsubequation}{%
\setcounter{manualsubequation}{0}%
\refstepcounter{equation}\ltx@label{manualsubeq\theequation}%
\xdef\labelfor@subeq{manualsubeq\theequation}%
}
\newcommand{\tagsubequation}{%
\stepcounter{manualsubequation}%
\tag{\ref{\labelfor@subeq}\themanualsubequation}%
}
\let\subequationlabel\ltx@label
\makeatother
\begin{document}
\begin{align}
% With 2 elements
\startsubequation\subequationlabel{eq:prefyk}
a &= \begin{bmatrix}
a_1 \\
\vdots \\
a_2
\end{bmatrix}
\tagsubequation\label{eq:prefyka} \\
&= \left[ a_1 \quad\!\! \ldots \quad\!\! a_2 \right]^\mathrm{T} \tagsubequation\label{eq:prefykb}\\
b &= \left[ b_1 \quad\!\! \ldots \quad\!\! b_2 \right]^\mathrm{T}, \label{eq:prefe}
\end{align}
\end{document}
如果包含该行\usepackage{cleveref}
,则结果如下。
有没有什么办法可以解决这个问题?
答案1
需要进行一些更改cleveref
,因为它修改了内部的几件事。
\documentclass{article}
\usepackage{amsmath}
\usepackage{cleveref}
\makeatletter
\newcounter{manualsubequation}
\renewcommand{\themanualsubequation}{\alph{manualsubequation}}
\newcommand{\startsubequation}{%
\setcounter{manualsubequation}{0}%
\refstepcounter{equation}\ltxcref@label{manualsubeq\theequation}%
\xdef\labelfor@subeq{manualsubeq\theequation}%
}
\newcommand{\tagsubequation}{%
\stepcounter{manualsubequation}%
\tag{\ref{\labelfor@subeq}\themanualsubequation}%
}
\newcommand\ltxcref@label[1]{%
\protected@write\@auxout{}
{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
% also do the cleveref label
\protected@write\@auxout{}
{\string\newlabel{#1@cref}{{\cref@currentlabel}{\thepage}}}%
}
\let\subequationlabel\ltxcref@label
\makeatother
\begin{document}
\begin{align}
% With 2 elements
\startsubequation\subequationlabel{eq:prefyk}
a &= \begin{bmatrix}
a_1 \\
\vdots \\
a_2
\end{bmatrix}
\tagsubequation\label{eq:prefyka}
\\
&= \left[ a_1 \quad\!\! \ldots \quad\!\! a_2 \right]^\mathrm{T}
\tagsubequation\label{eq:prefykb}
\\
b &= \left[ b_1 \quad\!\! \ldots \quad\!\! b_2 \right]^\mathrm{T},
\label{eq:prefe}
\end{align}
Let's see the next number
\begin{equation}
a=b
\end{equation}
Also references: \eqref{eq:prefe}, \eqref{eq:prefyka} and \eqref{eq:prefykb}
\cref{eq:prefykb}
\end{document}
答案2
问题是,cleveref
重新定义\label
为具有可选参数,可以给出该参数来覆盖标签的类型。在这种情况下,\ltx@label
除非给出类型(即子方程),否则必定会失败。
为了使用完整的cleveref
支持,请提供\crefname
以下名称:
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcounter{manualsubequation}
\renewcommand{\themanualsubequation}{\alph{manualsubequation}}
\newcommand{\startsubequation}{%
\setcounter{manualsubequation}{0}%
\refstepcounter{equation}\ltx@label[subequation]{manualsubeq\theequation}%
\xdef\labelfor@subeq{manualsubeq\theequation}%
}
\newcommand{\tagsubequation}{%
\refstepcounter{manualsubequation}%
\tag{\ref{\labelfor@subeq}\themanualsubequation}%
}
\let\subequationlabel\ltx@label
\makeatother
\usepackage{cleveref} % Comment/uncomment to see the difference
\crefname{subequation}{subequation}{subequations}
\Crefname{subequation}{Subequation}{Subequations}
\begin{document}
\begin{align}
% With 2 elements
\startsubequation\subequationlabel{eq:prefyk}
a &= \begin{bmatrix}
a_1 \\
\vdots \\
a_2
\end{bmatrix}
\tagsubequation\label{eq:prefyka} \\
&= \left[ a_1 \quad\!\! \ldots \quad\!\! a_2 \right]^\mathrm{T} \tagsubequation\label{eq:prefykb}\\
b &= \left[ b_1 \quad\!\! \ldots \quad\!\! b_2 \right]^\mathrm{T}, \label{eq:prefe}
\end{align}
In \cref{manualsubeq1} we saw that
\end{document}