![算法标签交叉引用不起作用](https://linux22.com/image/406093/%E7%AE%97%E6%B3%95%E6%A0%87%E7%AD%BE%E4%BA%A4%E5%8F%89%E5%BC%95%E7%94%A8%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我正在使用 Latex 样式文件ICML 2020,可以发现这里。具体来说,它们提供algorithm.sty
和algorithmic.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}