算法标签交叉引用不起作用

算法标签交叉引用不起作用

我正在使用 Latex 样式文件ICML 2020,可以发现这里。具体来说,它们提供algorithm.styalgorithmic.sty。当我尝试引用算法中的一行时,我会得到对算法本身的交叉引用。更奇怪的是,当我删除这两个样式文件(并强制我的编译器使用更新的包)时,交叉引用就变得正确了。

有任何想法吗?

这是一个最小的工作示例(我保留了我认为必要的几行):

\documentclass{article}
\newcommand{\theHalgorithm}{\arabic{algorithm}}
\usepackage{icml2020}
\begin{document}
\section{Introduction}
\label{submission}
\begin{algorithm}
  \caption{This is an algorithm}
  \label{alg:the_alg}
  \begin{algorithmic}[1]
    \STATE line number one \label{op0}
    \STATE line number two \label{op1}
  \end{algorithmic}
\end{algorithm}
This is Line \ref{op0}, and this is Line \ref{op1}.
\end{document}

此代码产生以下内容:

在此处输入图片描述

答案1

这里的主要问题出现在第 106 行algorithmic.sty

106:  \newcommand{\ALC@it}{\addtocounter{ALC@line}{1}\addtocounter{ALC@rem}{1}\ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}\item}

行计数器数字使用以下方式增加

\addtocounter{ALC@line}{1}

代替

\refstepcounter{ALC@line}

所以它应该类似于

106:  \newcommand{\ALC@it}{\refstepcounter{ALC@line}\addtocounter{ALC@rem}{1}\ifthenelse{\equal{\arabic{ALC@rem}}{#1}}{\setcounter{ALC@rem}{0}}{}\item}

我的建议是联系 ICML并要求他们改变他们的版本algorithmic.sty发布的版本他们的会议风格以便进行正确的引用。

在此期间,您可以定义自己的\alglinelabel宏,正确设置\label可引用的宏:

在此处输入图片描述

\documentclass{article}

\newcommand{\theHalgorithm}{\arabic{algorithm}}

\newcommand{\alglinelabel}{%
  \addtocounter{ALC@line}{-1}% Reduce line counter by 1
  \refstepcounter{ALC@line}% Increment line counter with reference capability
  \label% Regular \label
}

\usepackage{icml2020}

\begin{document}

\section{Introduction}
\begin{algorithm}
  \caption{This is an algorithm}
  \label{alg:the_alg}
  \begin{algorithmic}[1]
    \STATE line number one \alglinelabel{op0}
    \STATE line number two \alglinelabel{op1}
  \end{algorithmic}
\end{algorithm}
This is Line \ref{op0}, and this is Line \ref{op1}.

\end{document}

相关内容