Неправильная ссылка на номер уравнения в algorithm2e

Неправильная ссылка на номер уравнения в algorithm2e

Мне нужен номер уравнения в алгоритме с включенным номером главы. Вот мой код.

\documentclass{book}
\usepackage{amsmath,amssymb,amsthm, latexsym,float,epsfig,subfig}
\usepackage[mathscr]{euscript}
\usepackage{mathrsfs, breqn}
\usepackage[ruled,vlined,linesnumbered,algochapter]{algorithm2e}
\usepackage{multirow} 
\newtheorem{exmp}{Example}
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}{Lemma}
\newtheorem{proposition}{Proposition}
\newtheorem{corollary}{Corollary}

\numberwithin{figure}{chapter}
\numberwithin{theorem}{chapter}
\numberwithin{exmp}{chapter}
\numberwithin{lemma}{chapter}
\numberwithin{proposition}{chapter}
\numberwithin{corollary}{chapter}
\numberwithin{equation}{chapter}
\begin{document}
    \chapter{First}
    \label{chap_ch1}

    \begin{algorithm}[!h]
        \DontPrintSemicolon
        \SetAlgoLined

            \If{p} {
                \begin{equation}    \label{eq:sclrec1}
                    a = b
                \end{equation}
            }
            \Else {
                \If{t} {
                    \begin{equation} \label{eq:sclrec2}
                    x = y
                    \end{equation}
                }

            }

    \caption{\label{alg:algo} algorithm}
    \end{algorithm}
    Equation~\ref{eq:sclrec1} and Equation~\ref{eq:sclrec2}

\end{document}

Результат следующий:

Результат кода

Я не понимаю, почему мои ссылки неверны. Может кто-нибудь объяснить?

writeLatex Код

решение1

Это конфликт между amsmathи algorithm2e(ваш пример включает ряд пакетов, не имеющих отношения к проблеме) и касается только equationсреды. Самый простой способ обойти это — просто использовать gatherвместо этого.

Для equationразмещения текста перед уравнением или при его отсутствии \leavevmodeтакже подойдет:

Пример вывода

\documentclass{book}

\usepackage{amsmath}
\usepackage[ruled,vlined,linesnumbered,algochapter]{algorithm2e}

\begin{document}

\chapter{First}
\label{chap_ch1}

\begin{algorithm}[!h]
  \DontPrintSemicolon
  \SetAlgoLined

  \If{p} { Correct reference
      \begin{gather}    \label{eq:sclrec1}
          a = b
      \end{gather}
  }
  \Else {
      \If{t} { \leavevmode
          \begin{equation} \label{eq:sclrec2}
          x = y
          \end{equation}
      }
      \Else {
      \begin{equation}
        \label{eq:sclrec3}
        p = q
      \end{equation}
      }
  }

  \caption{\label{alg:algo} algorithm}
\end{algorithm}
Equation~\ref{eq:sclrec1} and Equation~\ref{eq:sclrec2} are correctly
referenced, equation~\ref{eq:sclrec3} (really 1.3) is not.

\end{document}

решение2

Следующий вариант обеспечивает обходной путь, а также лучшее вертикальное выравнивание уравнений:

введите описание изображения здесь

\documentclass{book}

\usepackage{amsmath}
\usepackage[ruled,vlined,linesnumbered,algochapter]{algorithm2e}

\begin{document}
\chapter{First}\label{chap_ch1}

\begin{algorithm}[!h]
  \DontPrintSemicolon
  \SetAlgoLined
  \If{p} {
    \hfill\llap{%
      \makebox[\linewidth]{\hfill $a = b$\hfill\refstepcounter{equation}\llap{(\theequation)}\label{eq:sclrec1}}}
  }
  \Else {
    \If{t} {
      \hfill\llap{%
        \makebox[\linewidth]{\hfill $x = y$\hfill\refstepcounter{equation}\llap{(\theequation)}\label{eq:sclrec2}}}
    }
}
  \caption{\label{alg:algo} algorithm}
\end{algorithm}

Equation~\eqref{eq:sclrec1} and Equation~\eqref{eq:sclrec2}

\end{document}

Каждое уравнение устанавливается в поле шириной \linewidth(тем самым игнорируя хорошо поддерживаемый алгоритм отступа - возможно, что-то, что можно улучшить) с уравнением точно посередине. Счетчик уравнений вручную шагается (и делается возможным ссылаться) и устанавливается.

Так как вы загружаетеamsmath, использование \eqrefобеспечивает требуемый дубликат номера уравнения + скобки.

Связанный контент