使用 cleveref 引用算法行号

使用 cleveref 引用算法行号

考虑以下示例:

\documentclass[a4paper,final]{report}

\usepackage{cleveref}
\usepackage{algorithmic}

\Crefname{ALC@unique}{Line}{Lines}

\begin{document}

Tests: 

\begin{algorithmic}[1]
\REQUIRE $x$ and $y$
\ENSURE $|x + y|$
\STATE $z = x + y$
\IF{$z<0$}
\RETURN $-z$\label{l1}
\ELSE
\RETURN $z$
\ENDIF
\end{algorithmic}

cref\{l1\}: \cref{l1}, ref\{l1\}: \ref{l1}

\begin{algorithmic}[1]
\REQUIRE $x$ and $y$
\ENSURE $|x - y|$
\STATE $z = x - y$
\IF{$z<0$}
\RETURN $-z$\label{l2}
\ELSE
\RETURN $z$
\ENDIF
\end{algorithmic}

cref\{l2\}: \cref{l2}, ref\{l2\}: \ref{l2}

\end{document}

这将输出(除了伪代码):

cref{l1}: line 3, ref{l1} 3

cref{l2}: line 9, ref{l2} 3

您会注意到,\cref{l2} 返回了错误的行号。有什么建议可以解决此问题吗?

答案1

cleveref仅声称支持有限数量的软件包,并且algorithmic不在该列表中。但是,\setcounter{ALC@unique}{0}在环境开始后添加algorithmic可以解决问题,即编写

\begin{algorithmic}[1]
\setcounter{ALC@unique}{0}
\REQUIRE $x$ and $y$

ETC。

我建议您在新的环境中完成这个操作,这样您就不必每次都写它。

如果你也想hyperref表现得好,那么我建议按如下方式打包

\documentclass[a4paper,final]{report}

\usepackage{algorithmic}
\usepackage{hyperref}
\usepackage{cleveref}

\Crefname{ALC@unique}{Line}{Lines}
\newcounter{myalg}
\AtBeginEnvironment{algorithmic}{\refstepcounter{myalg}}
\makeatletter
\@addtoreset{ALC@unique}{myalg}
\makeatother

\begin{document}

Test 1

\begin{algorithmic}[1]
\REQUIRE $x$ and $y$
\ENSURE $|x + y|$
\STATE $z = x + y$
\IF{$z<0$}
\RETURN $-z$\label{l1}
\ELSE
\RETURN $z$
\ENDIF
\end{algorithmic}

cref\{l1\}: \cref{l1}, ref\{l1\}: \ref{l1}

\vfill

Test 2

\begin{algorithmic}[1]
\REQUIRE $x$ and $y$
\ENSURE $|x - y|$
\STATE $z = x - y$
\IF{$z<0$}
\RETURN $-z$\label{l2}
\ELSE
\RETURN $z$
\ENDIF
\end{algorithmic}

cref\{l2\}: \cref{l2}, ref\{l2\}: \ref{l2}

\end{document}

相关内容