仅包含部分子方程和 cleveref 的方程块

仅包含部分子方程和 cleveref 的方程块

我最近问了一个问题关于在环境中对方程块进行编号,其中只有一些方程应该被编号为子方程;在我的例子中,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}

在此处输入图片描述

相关内容