
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:
Ich verstehe nicht, warum meine Referenzen falsch sind. Kann mir das bitte jemand erklären?
Antwort1
Dies ist ein Konflikt zwischen amsmath
und algorithm2e
(Ihr Beispiel enthält eine Reihe von Paketen, die für das Problem nicht relevant sind) und gilt nur für die equation
Umgebung. Die einfachste Problemumgehung besteht darin, gather
stattdessen einfach zu verwenden.
Um equation
Text vor die Gleichung zu setzen oder wenn dieser nicht vorhanden ist, \leavevmode
funktioniert auch Folgendes:
\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:
\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 \eqref
liefert das erforderliche Duplikat der Gleichungsnummer + Klammern.