
Мне нужен номер уравнения в алгоритме с включенным номером главы. Вот мой код.
\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}
Результат следующий:
Я не понимаю, почему мои ссылки неверны. Может кто-нибудь объяснить?
решение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
обеспечивает требуемый дубликат номера уравнения + скобки.