Falscher Verweis auf die Gleichungsnummer im Algorithmus2e

Falscher Verweis auf die Gleichungsnummer im Algorithmus2e

Ich möchte eine Gleichungsnummer in einem Algorithmus mit Kapitelnummer. Hier ist mein Code.

\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}

Das Ergebnis ist wie folgt:

Ergebnis des Codes

Ich verstehe nicht, warum meine Referenzen falsch sind. Kann mir das bitte jemand erklären?

schreibeLatex-Code

Antwort1

Dies ist ein Konflikt zwischen amsmathund algorithm2e(Ihr Beispiel enthält eine Reihe von Paketen, die für das Problem nicht relevant sind) und gilt nur für die equationUmgebung. Die einfachste Problemumgehung besteht darin, gatherstattdessen einfach zu verwenden.

Um equationText vor die Gleichung zu setzen oder wenn dieser nicht vorhanden ist, \leavevmodefunktioniert auch Folgendes:

Beispielausgabe

\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}

Antwort2

Das Folgende bietet eine Problemumgehung sowie eine bessere vertikale Ausrichtung der Gleichungen:

Bildbeschreibung hier eingeben

\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}

Jede Gleichung wird in ein Feld mit der Breite gesetzt \linewidth(wobei die Einrückung des gut gepflegten Algorithmus außer Acht gelassen wird - vielleicht ist das noch verbesserungswürdig), wobei die Gleichung genau in der Mitte steht. Der Gleichungszähler wird manuell hochgezählt (und referenzierbar gemacht) und gesetzt.

Da Sie ladenamsmath, die Verwendung von \eqrefliefert das erforderliche Duplikat der Gleichungsnummer + Klammern.

verwandte Informationen